| Index: mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| index 76a6b52f9f190419c6438144f3372b0afd399cc5..495a036dacab5bc74100c1a2febe9ed57f5d0c93 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| @@ -12,6 +12,8 @@
|
| #include "mojo/services/public/cpp/view_manager/lib/view_private.h"
|
| #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
|
| #include "mojo/services/public/cpp/view_manager/util.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "ui/gfx/codec/png_codec.h"
|
|
|
| namespace mojo {
|
| namespace view_manager {
|
| @@ -101,7 +103,9 @@ class ViewManagerTransaction {
|
| // View replacement.
|
| TYPE_SET_ACTIVE_VIEW,
|
| // Node bounds.
|
| - TYPE_SET_BOUNDS
|
| + TYPE_SET_BOUNDS,
|
| + // View contents
|
| + TYPE_SET_VIEW_CONTENTS
|
| };
|
|
|
| ViewManagerTransaction(TransactionType transaction_type,
|
| @@ -333,6 +337,71 @@ class SetBoundsTransaction : public ViewManagerTransaction {
|
| DISALLOW_COPY_AND_ASSIGN(SetBoundsTransaction);
|
| };
|
|
|
| +class SetViewContentsTransaction : public ViewManagerTransaction {
|
| + public:
|
| + SetViewContentsTransaction(TransportViewId view_id,
|
| + const SkBitmap& contents,
|
| + ViewManagerSynchronizer* synchronizer)
|
| + : ViewManagerTransaction(TYPE_SET_VIEW_CONTENTS, synchronizer),
|
| + view_id_(view_id),
|
| + contents_(contents) {}
|
| + virtual ~SetViewContentsTransaction() {}
|
| +
|
| + private:
|
| + // Overridden from ViewManagerTransaction:
|
| + virtual void DoCommit() OVERRIDE {
|
| + std::vector<unsigned char> data;
|
| + gfx::PNGCodec::EncodeBGRASkBitmap(contents_, false, &data);
|
| +
|
| + void* memory = NULL;
|
| + ScopedSharedBufferHandle duped;
|
| + bool result = CreateMapAndDupSharedBuffer(data.size(),
|
| + &memory,
|
| + &shared_state_handle_,
|
| + &duped);
|
| + if (!result)
|
| + return;
|
| +
|
| + memcpy(memory, &data[0], data.size());
|
| +
|
| + AllocationScope scope;
|
| + service()->SetViewContents(view_id_, duped.Pass(), data.size(),
|
| + ActionCompletedCallback());
|
| + }
|
| + virtual void DoActionCompleted(bool success) OVERRIDE {
|
| + // TODO(beng): recovery?
|
| + }
|
| +
|
| + bool CreateMapAndDupSharedBuffer(size_t size,
|
| + void** memory,
|
| + ScopedSharedBufferHandle* handle,
|
| + ScopedSharedBufferHandle* duped) {
|
| + MojoResult result = CreateSharedBuffer(NULL, size, handle);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + DCHECK(handle->is_valid());
|
| +
|
| + result = DuplicateBuffer(handle->get(), NULL, duped);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + DCHECK(duped->is_valid());
|
| +
|
| + result = MapBuffer(
|
| + handle->get(), 0, size, memory, MOJO_MAP_BUFFER_FLAG_NONE);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + DCHECK(*memory);
|
| +
|
| + return true;
|
| + }
|
| +
|
| + const TransportViewId view_id_;
|
| + const SkBitmap contents_;
|
| + ScopedSharedBufferHandle shared_state_handle_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SetViewContentsTransaction);
|
| +};
|
| +
|
| ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager)
|
| : view_manager_(view_manager),
|
| connected_(false),
|
| @@ -435,6 +504,14 @@ void ViewManagerSynchronizer::SetBounds(TransportNodeId node_id,
|
| Sync();
|
| }
|
|
|
| +void ViewManagerSynchronizer::SetViewContents(TransportViewId view_id,
|
| + const SkBitmap& contents) {
|
| + DCHECK(connected_);
|
| + pending_transactions_.push_back(
|
| + new SetViewContentsTransaction(view_id, contents, this));
|
| + Sync();
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // ViewManagerSynchronizer, IViewManagerClient implementation:
|
|
|
|
|