| Index: mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
|
| index 7df75a87c69f3d1b7a40b7b3968f4f0d0fb904e4..aaadf8aabf3e10ecf9352e277f6240da5de30db5 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
|
| @@ -12,11 +12,14 @@
|
| #include "mojo/public/cpp/application/service_provider_impl.h"
|
| #include "mojo/public/interfaces/application/service_provider.mojom.h"
|
| #include "mojo/public/interfaces/application/shell.mojom.h"
|
| +#include "mojo/services/public/cpp/view_manager/lib/bitmap_uploader.h"
|
| #include "mojo/services/public/cpp/view_manager/lib/view_private.h"
|
| #include "mojo/services/public/cpp/view_manager/util.h"
|
| #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
|
| #include "mojo/services/public/cpp/view_manager/view_observer.h"
|
| #include "mojo/services/public/cpp/view_manager/window_manager_delegate.h"
|
| +#include "mojo/services/public/interfaces/gpu/gpu.mojom.h"
|
| +#include "mojo/services/public/interfaces/surfaces/surfaces_service.mojom.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
|
|
| @@ -123,7 +126,8 @@ ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate,
|
| connection_id_(0),
|
| next_id_(1),
|
| delegate_(delegate),
|
| - window_manager_delegate_(NULL) {
|
| + window_manager_delegate_(NULL),
|
| + shell_(shell) {
|
| // TODO(beng): Come up with a better way of establishing a configuration for
|
| // what the active window manager is.
|
| std::string window_manager_url = "mojo:mojo_window_manager";
|
| @@ -199,26 +203,38 @@ void ViewManagerClientImpl::SetBounds(Id view_id, const gfx::Rect& bounds) {
|
| ActionCompletedCallback());
|
| }
|
|
|
| -void ViewManagerClientImpl::SetViewContents(Id view_id,
|
| - const SkBitmap& contents) {
|
| +void ViewManagerClientImpl::SetSurfaceId(Id view_id, SurfaceIdPtr surface_id) {
|
| DCHECK(connected_);
|
| - std::vector<unsigned char> data;
|
| - gfx::PNGCodec::EncodeBGRASkBitmap(contents, false, &data);
|
| -
|
| - void* memory = NULL;
|
| - ScopedSharedBufferHandle duped, shared_state_handle;
|
| - bool result = CreateMapAndDupSharedBuffer(data.size(),
|
| - &memory,
|
| - &shared_state_handle,
|
| - &duped);
|
| - if (!result)
|
| + if (surface_id.is_null())
|
| return;
|
| + service_->SetViewSurfaceId(
|
| + view_id, surface_id.Pass(), ActionCompletedCallback());
|
| +}
|
|
|
| - memcpy(memory, &data[0], data.size());
|
| -
|
| - service_->SetViewContents(view_id, duped.Pass(),
|
| - static_cast<uint32_t>(data.size()),
|
| - ActionCompletedCallback());
|
| +void ViewManagerClientImpl::SetViewContents(Id view_id,
|
| + const SkBitmap& contents) {
|
| + DCHECK(connected_);
|
| + if (!bitmap_uploader_) {
|
| + SurfacesServicePtr surfaces_service;
|
| + InterfacePtr<ServiceProvider> surfaces_service_provider;
|
| + shell_->ConnectToApplication("mojo:mojo_surfaces_service",
|
| + Get(&surfaces_service_provider));
|
| + ConnectToService(surfaces_service_provider.get(), &surfaces_service);
|
| + GpuPtr gpu_service;
|
| + InterfacePtr<ServiceProvider> gpu_service_provider;
|
| + shell_->ConnectToApplication("mojo:mojo_native_viewport_service",
|
| + Get(&gpu_service_provider));
|
| + ConnectToService(gpu_service_provider.get(), &gpu_service);
|
| + bitmap_uploader_.reset(
|
| + new BitmapUploader(surfaces_service.Pass(), gpu_service.Pass()));
|
| + }
|
| + bitmap_uploader_->Upload(
|
| + contents,
|
| + base::Bind(&ViewManagerClientImpl::SetSurfaceId,
|
| + // We'll destroy the bitmap_uploader before we are destroyed,
|
| + // so we can use an unretained pointer here.
|
| + base::Unretained(this),
|
| + view_id));
|
| }
|
|
|
| void ViewManagerClientImpl::SetFocus(Id view_id) {
|
|
|