Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/android/synchronous_compositor_proxy.h" | 5 #include "content/renderer/android/synchronous_compositor_proxy.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/memory/shared_memory.h" | |
| 9 #include "base/numerics/safe_math.h" | |
| 8 #include "content/common/android/sync_compositor_messages.h" | 10 #include "content/common/android/sync_compositor_messages.h" |
| 9 #include "content/common/cc_messages.h" | 11 #include "content/common/cc_messages.h" |
| 10 #include "ipc/ipc_message.h" | 12 #include "ipc/ipc_message.h" |
| 11 #include "ipc/ipc_sender.h" | 13 #include "ipc/ipc_sender.h" |
| 14 #include "third_party/skia/include/core/SkBitmap.h" | |
| 15 #include "third_party/skia/include/core/SkCanvas.h" | |
| 16 #include "third_party/skia/include/core/SkImageInfo.h" | |
| 17 #include "third_party/skia/include/core/SkRegion.h" | |
| 12 #include "ui/events/latency_info.h" | 18 #include "ui/events/latency_info.h" |
| 19 #include "ui/gfx/skia_util.h" | |
| 13 | 20 |
| 14 namespace content { | 21 namespace content { |
| 15 | 22 |
| 16 SynchronousCompositorProxy::SynchronousCompositorProxy( | 23 SynchronousCompositorProxy::SynchronousCompositorProxy( |
| 17 int routing_id, | 24 int routing_id, |
| 18 IPC::Sender* sender, | 25 IPC::Sender* sender, |
| 19 SynchronousCompositorOutputSurface* output_surface, | 26 SynchronousCompositorOutputSurface* output_surface, |
| 20 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, | 27 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, |
| 21 SynchronousInputHandlerProxy* input_handler_proxy, | 28 SynchronousInputHandlerProxy* input_handler_proxy, |
| 22 InputHandlerManagerClient::Handler* handler) | 29 InputHandlerManagerClient::Handler* handler) |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 140 | 147 |
| 141 void SynchronousCompositorProxy::OnMessageReceived( | 148 void SynchronousCompositorProxy::OnMessageReceived( |
| 142 const IPC::Message& message) { | 149 const IPC::Message& message) { |
| 143 DCHECK(!inside_receive_); | 150 DCHECK(!inside_receive_); |
| 144 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); | 151 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
| 145 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) | 152 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) |
| 146 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) | 153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) |
| 147 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) | 154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
| 148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) | 155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
| 149 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) | 156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
| 157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) | |
| 150 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) | 158 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) |
| 151 IPC_END_MESSAGE_MAP() | 159 IPC_END_MESSAGE_MAP() |
| 152 } | 160 } |
| 153 | 161 |
| 154 bool SynchronousCompositorProxy::Send(IPC::Message* message) { | 162 bool SynchronousCompositorProxy::Send(IPC::Message* message) { |
| 155 return sender_->Send(message); | 163 return sender_->Send(message); |
| 156 } | 164 } |
| 157 | 165 |
| 158 void SynchronousCompositorProxy::HandleInputEvent( | 166 void SynchronousCompositorProxy::HandleInputEvent( |
| 159 const SyncCompositorCommonBrowserParams& common_params, | 167 const SyncCompositorCommonBrowserParams& common_params, |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 189 params.surface_size, params.transform, params.viewport, params.clip, | 197 params.surface_size, params.transform, params.viewport, params.clip, |
| 190 params.viewport_rect_for_tile_priority, | 198 params.viewport_rect_for_tile_priority, |
| 191 params.transform_for_tile_priority); | 199 params.transform_for_tile_priority); |
| 192 if (frame_ptr) { | 200 if (frame_ptr) { |
| 193 frame_ptr->AssignTo(frame); | 201 frame_ptr->AssignTo(frame); |
| 194 DeliverMessages(); | 202 DeliverMessages(); |
| 195 } | 203 } |
| 196 PopulateCommonParams(common_renderer_params); | 204 PopulateCommonParams(common_renderer_params); |
| 197 } | 205 } |
| 198 | 206 |
| 207 void SynchronousCompositorProxy::DemandDrawSw( | |
| 208 const SyncCompositorCommonBrowserParams& common_params, | |
| 209 const SyncCompositorDemandDrawSwParams& params, | |
| 210 bool* result, | |
| 211 SyncCompositorCommonRendererParams* common_renderer_params, | |
| 212 cc::CompositorFrame* frame) { | |
| 213 DCHECK(frame); | |
| 214 ProcessCommonParams(common_params); | |
| 215 *result = false; // Early out ok. | |
| 216 if (!base::SharedMemory::IsHandleValid(params.shm_handle)) | |
| 217 return; | |
| 218 | |
| 219 base::CheckedNumeric<size_t> stride = 4; | |
| 220 stride *= params.size.width(); | |
| 221 if (!stride.IsValid()) | |
|
no sievers
2015/11/24 23:38:40
you don't trust the browser :)
| |
| 222 return; | |
| 223 base::CheckedNumeric<size_t> bytes(stride); | |
| 224 bytes *= params.size.height(); | |
| 225 if (!bytes.IsValid()) | |
| 226 return; | |
| 227 | |
| 228 base::SharedMemory shm(params.shm_handle, false); | |
| 229 if (!shm.Map(bytes.ValueOrDie())) | |
| 230 return; | |
| 231 DCHECK(shm.memory()); | |
| 232 | |
| 233 SkImageInfo info = | |
| 234 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); | |
| 235 SkBitmap bitmap; | |
| 236 if (!bitmap.installPixels(info, shm.memory(), stride.ValueOrDie())) | |
| 237 return; | |
| 238 SkCanvas canvas(bitmap); | |
| 239 canvas.setMatrix(params.transform.matrix()); | |
| 240 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); | |
| 241 | |
| 242 scoped_ptr<cc::CompositorFrame> frame_ptr = | |
| 243 output_surface_->DemandDrawSw(&canvas); | |
| 244 if (frame_ptr) { | |
| 245 *result = true; | |
| 246 frame_ptr->AssignTo(frame); | |
| 247 DeliverMessages(); | |
| 248 } | |
| 249 PopulateCommonParams(common_renderer_params); | |
| 250 } | |
| 251 | |
| 199 void SynchronousCompositorProxy::OnComputeScroll( | 252 void SynchronousCompositorProxy::OnComputeScroll( |
| 200 const SyncCompositorCommonBrowserParams& common_params, | 253 const SyncCompositorCommonBrowserParams& common_params, |
| 201 base::TimeTicks animation_time, | 254 base::TimeTicks animation_time, |
| 202 SyncCompositorCommonRendererParams* common_renderer_params) { | 255 SyncCompositorCommonRendererParams* common_renderer_params) { |
| 203 ProcessCommonParams(common_params); | 256 ProcessCommonParams(common_params); |
| 204 if (need_animate_scroll_) { | 257 if (need_animate_scroll_) { |
| 205 need_animate_scroll_ = false; | 258 need_animate_scroll_ = false; |
| 206 input_handler_proxy_->SynchronouslyAnimate(animation_time); | 259 input_handler_proxy_->SynchronouslyAnimate(animation_time); |
| 207 } | 260 } |
| 208 PopulateCommonParams(common_renderer_params); | 261 PopulateCommonParams(common_renderer_params); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 226 total_scroll_offset_ = common_params.root_scroll_offset; | 279 total_scroll_offset_ = common_params.root_scroll_offset; |
| 227 input_handler_proxy_->SynchronouslySetRootScrollOffset( | 280 input_handler_proxy_->SynchronouslySetRootScrollOffset( |
| 228 total_scroll_offset_); | 281 total_scroll_offset_); |
| 229 } | 282 } |
| 230 if (!common_params.ack.resources.empty()) { | 283 if (!common_params.ack.resources.empty()) { |
| 231 output_surface_->ReturnResources(common_params.ack); | 284 output_surface_->ReturnResources(common_params.ack); |
| 232 } | 285 } |
| 233 } | 286 } |
| 234 | 287 |
| 235 } // namespace content | 288 } // namespace content |
| OLD | NEW |