OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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/services/html_viewer/weblayertreeview_impl.h" |
| 6 |
| 7 #include "base/message_loop/message_loop_proxy.h" |
| 8 #include "cc/blink/web_layer_impl.h" |
| 9 #include "cc/layers/layer.h" |
| 10 #include "cc/output/begin_frame_args.h" |
| 11 #include "cc/trees/layer_tree_host.h" |
| 12 #include "mojo/cc/context_provider_mojo.h" |
| 13 #include "mojo/cc/output_surface_mojo.h" |
| 14 #include "mojo/services/public/cpp/surfaces/surfaces_type_converters.h" |
| 15 #include "mojo/services/public/cpp/view_manager/view.h" |
| 16 #include "third_party/WebKit/public/web/WebWidget.h" |
| 17 |
| 18 namespace mojo { |
| 19 |
| 20 WebLayerTreeViewImpl::WebLayerTreeViewImpl( |
| 21 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy, |
| 22 SurfacesServicePtr surfaces_service, |
| 23 GpuPtr gpu_service) |
| 24 : widget_(NULL), |
| 25 view_(NULL), |
| 26 surfaces_service_(surfaces_service.Pass()), |
| 27 gpu_service_(gpu_service.Pass()), |
| 28 main_thread_compositor_task_runner_(base::MessageLoopProxy::current()), |
| 29 weak_factory_(this) { |
| 30 main_thread_bound_weak_ptr_ = weak_factory_.GetWeakPtr(); |
| 31 surfaces_service_->CreateSurfaceConnection( |
| 32 base::Bind(&WebLayerTreeViewImpl::OnSurfaceConnectionCreated, |
| 33 main_thread_bound_weak_ptr_)); |
| 34 |
| 35 cc::LayerTreeSettings settings; |
| 36 |
| 37 // For web contents, layer transforms should scale up the contents of layers |
| 38 // to keep content always crisp when possible. |
| 39 settings.layer_transforms_should_scale_layer_contents = true; |
| 40 |
| 41 cc::SharedBitmapManager* shared_bitmap_manager = NULL; |
| 42 |
| 43 layer_tree_host_ = |
| 44 cc::LayerTreeHost::CreateThreaded(this, |
| 45 shared_bitmap_manager, |
| 46 settings, |
| 47 base::MessageLoopProxy::current(), |
| 48 compositor_message_loop_proxy); |
| 49 DCHECK(layer_tree_host_); |
| 50 } |
| 51 |
| 52 WebLayerTreeViewImpl::~WebLayerTreeViewImpl() { |
| 53 } |
| 54 |
| 55 void WebLayerTreeViewImpl::WillBeginMainFrame(int frame_id) { |
| 56 } |
| 57 |
| 58 void WebLayerTreeViewImpl::DidBeginMainFrame() { |
| 59 } |
| 60 |
| 61 void WebLayerTreeViewImpl::BeginMainFrame(const cc::BeginFrameArgs& args) { |
| 62 VLOG(2) << "WebLayerTreeViewImpl::BeginMainFrame"; |
| 63 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); |
| 64 double deadline_sec = (args.deadline - base::TimeTicks()).InSecondsF(); |
| 65 double interval_sec = args.interval.InSecondsF(); |
| 66 blink::WebBeginFrameArgs web_begin_frame_args( |
| 67 frame_time_sec, deadline_sec, interval_sec); |
| 68 widget_->beginFrame(web_begin_frame_args); |
| 69 } |
| 70 |
| 71 void WebLayerTreeViewImpl::Layout() { |
| 72 widget_->layout(); |
| 73 } |
| 74 |
| 75 void WebLayerTreeViewImpl::ApplyViewportDeltas( |
| 76 const gfx::Vector2d& scroll_delta, |
| 77 float page_scale, |
| 78 float top_controls_delta) { |
| 79 widget_->applyViewportDeltas(scroll_delta, page_scale, top_controls_delta); |
| 80 } |
| 81 |
| 82 scoped_ptr<cc::OutputSurface> WebLayerTreeViewImpl::CreateOutputSurface( |
| 83 bool fallback) { |
| 84 return output_surface_.Pass(); |
| 85 } |
| 86 |
| 87 void WebLayerTreeViewImpl::DidInitializeOutputSurface() { |
| 88 } |
| 89 |
| 90 void WebLayerTreeViewImpl::WillCommit() { |
| 91 } |
| 92 |
| 93 void WebLayerTreeViewImpl::DidCommit() { |
| 94 widget_->didCommitFrameToCompositor(); |
| 95 } |
| 96 |
| 97 void WebLayerTreeViewImpl::DidCommitAndDrawFrame() { |
| 98 } |
| 99 |
| 100 void WebLayerTreeViewImpl::DidCompleteSwapBuffers() { |
| 101 } |
| 102 |
| 103 void WebLayerTreeViewImpl::setSurfaceReady() { |
| 104 } |
| 105 |
| 106 void WebLayerTreeViewImpl::setRootLayer(const blink::WebLayer& layer) { |
| 107 layer_tree_host_->SetRootLayer( |
| 108 static_cast<const cc_blink::WebLayerImpl*>(&layer)->layer()); |
| 109 } |
| 110 |
| 111 void WebLayerTreeViewImpl::clearRootLayer() { |
| 112 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>()); |
| 113 } |
| 114 |
| 115 void WebLayerTreeViewImpl::setViewportSize( |
| 116 const blink::WebSize& device_viewport_size) { |
| 117 layer_tree_host_->SetViewportSize(device_viewport_size); |
| 118 } |
| 119 |
| 120 blink::WebSize WebLayerTreeViewImpl::deviceViewportSize() const { |
| 121 return layer_tree_host_->device_viewport_size(); |
| 122 } |
| 123 |
| 124 void WebLayerTreeViewImpl::setDeviceScaleFactor(float device_scale_factor) { |
| 125 layer_tree_host_->SetDeviceScaleFactor(device_scale_factor); |
| 126 } |
| 127 |
| 128 float WebLayerTreeViewImpl::deviceScaleFactor() const { |
| 129 return layer_tree_host_->device_scale_factor(); |
| 130 } |
| 131 |
| 132 void WebLayerTreeViewImpl::setBackgroundColor(blink::WebColor color) { |
| 133 layer_tree_host_->set_background_color(color); |
| 134 } |
| 135 |
| 136 void WebLayerTreeViewImpl::setHasTransparentBackground( |
| 137 bool has_transparent_background) { |
| 138 layer_tree_host_->set_has_transparent_background(has_transparent_background); |
| 139 } |
| 140 |
| 141 void WebLayerTreeViewImpl::setOverhangBitmap(const SkBitmap& bitmap) { |
| 142 layer_tree_host_->SetOverhangBitmap(bitmap); |
| 143 } |
| 144 |
| 145 void WebLayerTreeViewImpl::setVisible(bool visible) { |
| 146 layer_tree_host_->SetVisible(visible); |
| 147 } |
| 148 |
| 149 void WebLayerTreeViewImpl::setPageScaleFactorAndLimits(float page_scale_factor, |
| 150 float minimum, |
| 151 float maximum) { |
| 152 layer_tree_host_->SetPageScaleFactorAndLimits( |
| 153 page_scale_factor, minimum, maximum); |
| 154 } |
| 155 |
| 156 void WebLayerTreeViewImpl::registerForAnimations(blink::WebLayer* layer) { |
| 157 cc::Layer* cc_layer = static_cast<cc_blink::WebLayerImpl*>(layer)->layer(); |
| 158 cc_layer->layer_animation_controller()->SetAnimationRegistrar( |
| 159 layer_tree_host_->animation_registrar()); |
| 160 } |
| 161 |
| 162 void WebLayerTreeViewImpl::registerViewportLayers( |
| 163 const blink::WebLayer* pageScaleLayer, |
| 164 const blink::WebLayer* innerViewportScrollLayer, |
| 165 const blink::WebLayer* outerViewportScrollLayer) { |
| 166 layer_tree_host_->RegisterViewportLayers( |
| 167 static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(), |
| 168 static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer) |
| 169 ->layer(), |
| 170 // The outer viewport layer will only exist when using pinch virtual |
| 171 // viewports. |
| 172 outerViewportScrollLayer ? static_cast<const cc_blink::WebLayerImpl*>( |
| 173 outerViewportScrollLayer)->layer() |
| 174 : NULL); |
| 175 } |
| 176 |
| 177 void WebLayerTreeViewImpl::clearViewportLayers() { |
| 178 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(), |
| 179 scoped_refptr<cc::Layer>(), |
| 180 scoped_refptr<cc::Layer>()); |
| 181 } |
| 182 |
| 183 void WebLayerTreeViewImpl::startPageScaleAnimation( |
| 184 const blink::WebPoint& destination, |
| 185 bool use_anchor, |
| 186 float new_page_scale, |
| 187 double duration_sec) { |
| 188 base::TimeDelta duration = base::TimeDelta::FromMicroseconds( |
| 189 duration_sec * base::Time::kMicrosecondsPerSecond); |
| 190 layer_tree_host_->StartPageScaleAnimation( |
| 191 gfx::Vector2d(destination.x, destination.y), |
| 192 use_anchor, |
| 193 new_page_scale, |
| 194 duration); |
| 195 } |
| 196 |
| 197 void WebLayerTreeViewImpl::setNeedsAnimate() { |
| 198 layer_tree_host_->SetNeedsAnimate(); |
| 199 } |
| 200 |
| 201 bool WebLayerTreeViewImpl::commitRequested() const { |
| 202 return layer_tree_host_->CommitRequested(); |
| 203 } |
| 204 |
| 205 void WebLayerTreeViewImpl::finishAllRendering() { |
| 206 layer_tree_host_->FinishAllRendering(); |
| 207 } |
| 208 |
| 209 void WebLayerTreeViewImpl::OnSurfaceConnectionCreated(SurfacePtr surface, |
| 210 uint32_t id_namespace) { |
| 211 CommandBufferPtr cb; |
| 212 gpu_service_->CreateOffscreenGLES2Context(Get(&cb)); |
| 213 scoped_refptr<cc::ContextProvider> context_provider( |
| 214 new ContextProviderMojo(cb.PassMessagePipe())); |
| 215 output_surface_.reset(new OutputSurfaceMojo( |
| 216 this, context_provider, surface.Pass(), id_namespace)); |
| 217 layer_tree_host_->SetLayerTreeHostClientReady(); |
| 218 } |
| 219 |
| 220 void WebLayerTreeViewImpl::DidCreateSurface(cc::SurfaceId id) { |
| 221 main_thread_compositor_task_runner_->PostTask( |
| 222 FROM_HERE, |
| 223 base::Bind(&WebLayerTreeViewImpl::DidCreateSurfaceOnMainThread, |
| 224 main_thread_bound_weak_ptr_, |
| 225 id)); |
| 226 } |
| 227 |
| 228 void WebLayerTreeViewImpl::DidCreateSurfaceOnMainThread(cc::SurfaceId id) { |
| 229 view_->SetSurfaceId(SurfaceId::From(id)); |
| 230 } |
| 231 |
| 232 } // namespace mojo |
OLD | NEW |