Chromium Code Reviews| Index: content/renderer/android/synchronous_compositor_proxy.cc |
| diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc |
| index bd9fb3556757a1ea00670908f781d2932d87cdac..daeeb2a95cc4570d2706139afc310a96a4a7b427 100644 |
| --- a/content/renderer/android/synchronous_compositor_proxy.cc |
| +++ b/content/renderer/android/synchronous_compositor_proxy.cc |
| @@ -5,11 +5,17 @@ |
| #include "content/renderer/android/synchronous_compositor_proxy.h" |
| #include "base/auto_reset.h" |
| +#include "base/memory/shared_memory.h" |
| #include "content/common/android/sync_compositor_messages.h" |
| #include "content/common/cc_messages.h" |
| #include "ipc/ipc_message.h" |
| #include "ipc/ipc_sender.h" |
| +#include "third_party/skia/include/core/SkBitmap.h" |
| +#include "third_party/skia/include/core/SkCanvas.h" |
| +#include "third_party/skia/include/core/SkImageInfo.h" |
| +#include "third_party/skia/include/core/SkRegion.h" |
| #include "ui/events/latency_info.h" |
| +#include "ui/gfx/skia_util.h" |
| namespace content { |
| @@ -147,6 +153,7 @@ void SynchronousCompositorProxy::OnMessageReceived( |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
| + IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) |
| IPC_END_MESSAGE_MAP() |
| } |
| @@ -196,6 +203,42 @@ void SynchronousCompositorProxy::DemandDrawHw( |
| PopulateCommonParams(common_renderer_params); |
| } |
| +void SynchronousCompositorProxy::DemandDrawSw( |
| + const SyncCompositorCommonBrowserParams& common_params, |
| + const SyncCompositorDemandDrawSwParams& params, |
| + bool* result, |
| + SyncCompositorCommonRendererParams* common_renderer_params, |
| + cc::CompositorFrame* frame) { |
| + DCHECK(frame); |
| + ProcessCommonParams(common_params); |
| + *result = false; // Early out ok. |
| + if (!base::SharedMemory::IsHandleValid(params.shm_handle)) |
| + return; |
| + |
| + base::SharedMemory shm(params.shm_handle, false); |
| + if (!shm.Map(params.size.width() * params.size.height() * 4)) |
|
dcheng
2015/11/23 23:26:35
This should probably check for overflow.
boliu
2015/11/24 00:16:33
Done.
|
| + return; |
| + DCHECK(shm.memory()); |
| + |
| + SkImageInfo info = |
| + SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
| + SkBitmap bitmap; |
| + if (!bitmap.installPixels(info, shm.memory(), params.size.width() * 4)) |
|
dcheng
2015/11/23 23:26:35
As should this.
boliu
2015/11/24 00:16:33
Done.
|
| + return; |
| + SkCanvas canvas(bitmap); |
| + canvas.setMatrix(params.transform.matrix()); |
| + canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); |
| + |
| + scoped_ptr<cc::CompositorFrame> frame_ptr = |
| + output_surface_->DemandDrawSw(&canvas); |
| + if (frame_ptr) { |
| + *result = true; |
| + frame_ptr->AssignTo(frame); |
| + DeliverMessages(); |
| + } |
| + PopulateCommonParams(common_renderer_params); |
| +} |
| + |
| void SynchronousCompositorProxy::OnComputeScroll( |
| const SyncCompositorCommonBrowserParams& common_params, |
| base::TimeTicks animation_time, |