// 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 <utility>

#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::InterfaceHandle<mojo::gfx::composition::SceneListener> listener) {
  engine_->SetListener(state_, mojo::gfx::composition::SceneListenerPtr::Create(
                                   std::move(listener)));
}

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
