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