// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/gfx/compositor/scene_impl.h"

#include "base/bind.h"
#include "base/bind_helpers.h"

namespace compositor {
namespace {
void RunScheduleFrameCallback(const SceneImpl::ScheduleFrameCallback& callback,
                              mojo::gfx::composition::FrameInfoPtr info) {
  callback.Run(info.Pass());
}
}  // namespace

SceneImpl::SceneImpl(
    CompositorEngine* engine,
    SceneState* state,
    mojo::InterfaceRequest<mojo::gfx::composition::Scene> scene_request)
    : engine_(engine),
      state_(state),
      scene_binding_(this, scene_request.Pass()) {}

SceneImpl::~SceneImpl() {}

void SceneImpl::SetListener(mojo::gfx::composition::SceneListenerPtr listener) {
  engine_->SetListener(state_, listener.Pass());
}

void SceneImpl::Update(mojo::gfx::composition::SceneUpdatePtr update) {
  engine_->Update(state_, update.Pass());
}

void SceneImpl::Publish(mojo::gfx::composition::SceneMetadataPtr metadata) {
  engine_->Publish(state_, metadata.Pass());
}

void SceneImpl::GetScheduler(
    mojo::InterfaceRequest<mojo::gfx::composition::SceneScheduler>
        scheduler_request) {
  scheduler_bindings_.AddBinding(this, scheduler_request.Pass());
}

void SceneImpl::ScheduleFrame(const ScheduleFrameCallback& callback) {
  engine_->ScheduleFrame(state_,
                         base::Bind(&RunScheduleFrameCallback, callback));
}

}  // namespace compositor
