Home | History | Annotate | Download | only in compositor_app
      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/begin_frame_args.h"
     10 #include "cc/output/context_provider.h"
     11 #include "cc/output/output_surface.h"
     12 #include "cc/trees/layer_tree_host.h"
     13 #include "mojo/cc/context_provider_mojo.h"
     14 
     15 namespace mojo {
     16 namespace examples {
     17 
     18 CompositorHost::CompositorHost(ScopedMessagePipeHandle command_buffer_handle)
     19     : command_buffer_handle_(command_buffer_handle.Pass()),
     20       compositor_thread_("compositor") {
     21   DCHECK(command_buffer_handle_.is_valid());
     22   bool started = compositor_thread_.Start();
     23   DCHECK(started);
     24 
     25   cc::LayerTreeSettings settings;
     26   tree_ = cc::LayerTreeHost::CreateThreaded(
     27       this,
     28       NULL,
     29       settings,
     30       base::MessageLoopProxy::current(),
     31       compositor_thread_.message_loop_proxy());
     32   SetupScene();
     33 }
     34 
     35 CompositorHost::~CompositorHost() {}
     36 
     37 void CompositorHost::SetSize(const gfx::Size& viewport_size) {
     38   tree_->SetViewportSize(viewport_size);
     39   tree_->SetLayerTreeHostClientReady();
     40 }
     41 
     42 void CompositorHost::SetupScene() {
     43   scoped_refptr<cc::Layer> root_layer = cc::SolidColorLayer::Create();
     44   root_layer->SetBounds(gfx::Size(500, 500));
     45   root_layer->SetBackgroundColor(SK_ColorBLUE);
     46   root_layer->SetIsDrawable(true);
     47   tree_->SetRootLayer(root_layer);
     48 
     49   child_layer_ = cc::SolidColorLayer::Create();
     50   child_layer_->SetBounds(gfx::Size(100, 100));
     51   child_layer_->SetBackgroundColor(SK_ColorGREEN);
     52   child_layer_->SetIsDrawable(true);
     53   gfx::Transform child_transform;
     54   child_transform.Translate(200, 200);
     55   child_layer_->SetTransform(child_transform);
     56   root_layer->AddChild(child_layer_);
     57 }
     58 
     59 void CompositorHost::WillBeginMainFrame(int frame_id) {}
     60 void CompositorHost::DidBeginMainFrame() {}
     61 
     62 void CompositorHost::BeginMainFrame(const cc::BeginFrameArgs& args) {
     63   // TODO(jamesr): Should use cc's animation system.
     64   static const double kDegreesPerSecond = 70.0;
     65   double time_in_seconds = (args.frame_time - base::TimeTicks()).InSecondsF();
     66   double child_rotation_degrees = kDegreesPerSecond * time_in_seconds;
     67   gfx::Transform child_transform;
     68   child_transform.Translate(200, 200);
     69   child_transform.Rotate(child_rotation_degrees);
     70   child_layer_->SetTransform(child_transform);
     71   tree_->SetNeedsAnimate();
     72 }
     73 
     74 void CompositorHost::Layout() {}
     75 void CompositorHost::ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
     76                                          float page_scale,
     77                                          float top_controls_delta) {}
     78 
     79 void CompositorHost::RequestNewOutputSurface(bool fallback) {
     80   tree_->SetOutputSurface(make_scoped_ptr(new cc::OutputSurface(
     81       new ContextProviderMojo(command_buffer_handle_.Pass()))));
     82 }
     83 
     84 void CompositorHost::DidInitializeOutputSurface() {
     85 }
     86 
     87 void CompositorHost::WillCommit() {}
     88 void CompositorHost::DidCommit() {}
     89 void CompositorHost::DidCommitAndDrawFrame() {}
     90 void CompositorHost::DidCompleteSwapBuffers() {}
     91 
     92 }  // namespace examples
     93 }  // namespace mojo
     94