| Index: mojo/examples/aura_demo/context_factory_view_manager.cc
|
| diff --git a/mojo/examples/aura_demo/context_factory_view_manager.cc b/mojo/examples/aura_demo/context_factory_view_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..46596c333450f0658392a5b407526524c6b592d8
|
| --- /dev/null
|
| +++ b/mojo/examples/aura_demo/context_factory_view_manager.cc
|
| @@ -0,0 +1,194 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "mojo/examples/aura_demo/context_factory_view_manager.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "cc/output/output_surface.h"
|
| +#include "cc/output/software_output_device.h"
|
| +#include "cc/resources/shared_bitmap_manager.h"
|
| +#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
|
| +#include "skia/ext/platform_canvas.h"
|
| +#include "ui/compositor/reflector.h"
|
| +#include "ui/gfx/codec/png_codec.h"
|
| +
|
| +namespace mojo {
|
| +namespace examples {
|
| +namespace {
|
| +
|
| +void FreeSharedBitmap(cc::SharedBitmap* shared_bitmap) {
|
| + delete shared_bitmap->memory();
|
| +}
|
| +
|
| +void IgnoreSharedBitmap(cc::SharedBitmap* shared_bitmap) {}
|
| +
|
| +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;
|
| +}
|
| +
|
| +class SoftwareOutputDeviceViewManager : public cc::SoftwareOutputDevice {
|
| + public:
|
| + explicit SoftwareOutputDeviceViewManager(
|
| + view_manager::IViewManager* view_manager,
|
| + uint32_t view_id)
|
| + : view_manager_(view_manager),
|
| + view_id_(view_id) {
|
| + }
|
| + virtual ~SoftwareOutputDeviceViewManager() {}
|
| +
|
| + // cc::SoftwareOutputDevice:
|
| + virtual void EndPaint(cc::SoftwareFrameData* frame_data) OVERRIDE {
|
| + SetViewContents();
|
| +
|
| + SoftwareOutputDevice::EndPaint(frame_data);
|
| + }
|
| +
|
| + private:
|
| + void OnSetViewContentsDone(bool value) {
|
| + VLOG(1) << "SoftwareOutputDeviceManager::OnSetViewContentsDone " << value;
|
| + DCHECK(value);
|
| + }
|
| +
|
| + void SetViewContents() {
|
| + std::vector<unsigned char> data;
|
| + gfx::PNGCodec::EncodeBGRASkBitmap(
|
| + skia::GetTopDevice(*canvas_)->accessBitmap(true), 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());
|
| +
|
| + view_manager_->SetViewContents(
|
| + view_id_, duped.Pass(), static_cast<uint32_t>(data.size()),
|
| + base::Bind(&SoftwareOutputDeviceViewManager::OnSetViewContentsDone,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + view_manager::IViewManager* view_manager_;
|
| + const uint32_t view_id_;
|
| + ScopedSharedBufferHandle shared_state_handle_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceViewManager);
|
| +};
|
| +
|
| +// TODO(sky): this is a copy from cc/test. Copy to a common place.
|
| +class TestSharedBitmapManager : public cc::SharedBitmapManager {
|
| + public:
|
| + TestSharedBitmapManager() {}
|
| + virtual ~TestSharedBitmapManager() {}
|
| +
|
| + virtual scoped_ptr<cc::SharedBitmap> AllocateSharedBitmap(
|
| + const gfx::Size& size) OVERRIDE {
|
| + base::AutoLock lock(lock_);
|
| + scoped_ptr<base::SharedMemory> memory(new base::SharedMemory);
|
| + memory->CreateAndMapAnonymous(size.GetArea() * 4);
|
| + cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
|
| + bitmap_map_[id] = memory.get();
|
| + return scoped_ptr<cc::SharedBitmap>(
|
| + new cc::SharedBitmap(memory.release(), id,
|
| + base::Bind(&FreeSharedBitmap)));
|
| + }
|
| +
|
| + virtual scoped_ptr<cc::SharedBitmap> GetSharedBitmapFromId(
|
| + const gfx::Size&,
|
| + const cc::SharedBitmapId& id) OVERRIDE {
|
| + base::AutoLock lock(lock_);
|
| + if (bitmap_map_.find(id) == bitmap_map_.end())
|
| + return scoped_ptr<cc::SharedBitmap>();
|
| + return scoped_ptr<cc::SharedBitmap>(
|
| + new cc::SharedBitmap(bitmap_map_[id], id,
|
| + base::Bind(&IgnoreSharedBitmap)));
|
| + }
|
| +
|
| + virtual scoped_ptr<cc::SharedBitmap> GetBitmapForSharedMemory(
|
| + base::SharedMemory* memory) OVERRIDE {
|
| + base::AutoLock lock(lock_);
|
| + cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
|
| + bitmap_map_[id] = memory;
|
| + return scoped_ptr<cc::SharedBitmap>(
|
| + new cc::SharedBitmap(memory, id, base::Bind(&IgnoreSharedBitmap)));
|
| + }
|
| +
|
| + private:
|
| + base::Lock lock_;
|
| + std::map<cc::SharedBitmapId, base::SharedMemory*> bitmap_map_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestSharedBitmapManager);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +ContextFactoryViewManager::ContextFactoryViewManager(
|
| + view_manager::IViewManager* view_manager,
|
| + uint32_t view_id)
|
| + : view_manager_(view_manager),
|
| + view_id_(view_id),
|
| + shared_bitmap_manager_(new TestSharedBitmapManager()) {
|
| +}
|
| +
|
| +ContextFactoryViewManager::~ContextFactoryViewManager() {}
|
| +
|
| +scoped_ptr<cc::OutputSurface> ContextFactoryViewManager::CreateOutputSurface(
|
| + ui::Compositor* compositor,
|
| + bool software_fallback) {
|
| + scoped_ptr<cc::SoftwareOutputDevice> output_device(
|
| + new SoftwareOutputDeviceViewManager(view_manager_, view_id_));
|
| + return make_scoped_ptr(new cc::OutputSurface(output_device.Pass()));
|
| +}
|
| +
|
| +scoped_refptr<ui::Reflector> ContextFactoryViewManager::CreateReflector(
|
| + ui::Compositor* mirroed_compositor,
|
| + ui::Layer* mirroring_layer) {
|
| + return new ui::Reflector();
|
| +}
|
| +
|
| +void ContextFactoryViewManager::RemoveReflector(
|
| + scoped_refptr<ui::Reflector> reflector) {
|
| +}
|
| +
|
| +scoped_refptr<cc::ContextProvider>
|
| +ContextFactoryViewManager::SharedMainThreadContextProvider() {
|
| + return scoped_refptr<cc::ContextProvider>(NULL);
|
| +}
|
| +
|
| +void ContextFactoryViewManager::RemoveCompositor(ui::Compositor* compositor) {}
|
| +
|
| +bool ContextFactoryViewManager::DoesCreateTestContexts() { return false; }
|
| +
|
| +cc::SharedBitmapManager* ContextFactoryViewManager::GetSharedBitmapManager() {
|
| + return shared_bitmap_manager_.get();
|
| +}
|
| +
|
| +base::MessageLoopProxy* ContextFactoryViewManager::GetCompositorMessageLoop() {
|
| + return NULL;
|
| +}
|
| +
|
| +} // namespace examples
|
| +} // namespace mojo
|
|
|