compositor_host.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "mojo/examples/compositor_app/compositor_host.h"
6
7#include "cc/layers/layer.h"
8#include "cc/layers/solid_color_layer.h"
9#include "cc/output/context_provider.h"
10#include "cc/output/output_surface.h"
11#include "cc/trees/layer_tree_host.h"
12#include "mojo/examples/compositor_app/mojo_context_provider.h"
13
14namespace mojo {
15namespace examples {
16
17CompositorHost::CompositorHost(ScopedMessagePipeHandle gl_pipe)
18    : gl_pipe_(gl_pipe.Pass()), compositor_thread_("compositor") {
19  DCHECK(gl_pipe_.is_valid());
20  bool started = compositor_thread_.Start();
21  DCHECK(started);
22
23  cc::LayerTreeSettings settings;
24  tree_ = cc::LayerTreeHost::CreateThreaded(
25      this, NULL, settings, compositor_thread_.message_loop_proxy());
26  SetupScene();
27}
28
29CompositorHost::~CompositorHost() {}
30
31void CompositorHost::SetSize(gfx::Size viewport_size) {
32  tree_->SetViewportSize(viewport_size);
33  tree_->SetLayerTreeHostClientReady();
34  tree_->InitializeOutputSurfaceIfNeeded();
35}
36
37void CompositorHost::SetupScene() {
38  scoped_refptr<cc::Layer> root_layer = cc::SolidColorLayer::Create();
39  root_layer->SetBounds(gfx::Size(500, 500));
40  root_layer->SetBackgroundColor(SK_ColorBLUE);
41  root_layer->SetIsDrawable(true);
42  tree_->SetRootLayer(root_layer);
43
44  child_layer_ = cc::SolidColorLayer::Create();
45  child_layer_->SetBounds(gfx::Size(100, 100));
46  child_layer_->SetBackgroundColor(SK_ColorGREEN);
47  child_layer_->SetIsDrawable(true);
48  gfx::Transform child_transform;
49  child_transform.Translate(200, 200);
50  child_layer_->SetTransform(child_transform);
51  root_layer->AddChild(child_layer_);
52}
53
54void CompositorHost::WillBeginMainFrame(int frame_id) {}
55void CompositorHost::DidBeginMainFrame() {}
56
57void CompositorHost::Animate(base::TimeTicks frame_begin_time) {
58  // TODO(jamesr): Should use cc's animation system.
59  static const double kDegreesPerSecond = 70.0;
60  double time_in_seconds = (frame_begin_time - base::TimeTicks()).InSecondsF();
61  double child_rotation_degrees = kDegreesPerSecond * time_in_seconds;
62  gfx::Transform child_transform;
63  child_transform.Translate(200, 200);
64  child_transform.Rotate(child_rotation_degrees);
65  child_layer_->SetTransform(child_transform);
66  tree_->SetNeedsAnimate();
67}
68
69void CompositorHost::Layout() {}
70void CompositorHost::ApplyScrollAndScale(const gfx::Vector2d& scroll_delta,
71                                         float page_scale) {}
72
73scoped_ptr<cc::OutputSurface> CompositorHost::CreateOutputSurface(
74    bool fallback) {
75  return make_scoped_ptr(
76      new cc::OutputSurface(new MojoContextProvider(gl_pipe_.Pass())));
77}
78
79void CompositorHost::DidInitializeOutputSurface() {
80}
81
82void CompositorHost::WillCommit() {}
83void CompositorHost::DidCommit() {}
84void CompositorHost::DidCommitAndDrawFrame() {}
85void CompositorHost::DidCompleteSwapBuffers() {}
86
87}  // namespace examples
88}  // namespace mojo
89