// 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/aura/context_factory_mojo.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/aura/window_tree_host_mojo.h" #include "skia/ext/platform_canvas.h" #include "ui/compositor/reflector.h" namespace mojo { namespace { void FreeSharedBitmap(cc::SharedBitmap* shared_bitmap) { delete shared_bitmap->memory(); } void IgnoreSharedBitmap(cc::SharedBitmap* shared_bitmap) {} class SoftwareOutputDeviceViewManager : public cc::SoftwareOutputDevice { public: explicit SoftwareOutputDeviceViewManager(ui::Compositor* compositor) : compositor_(compositor) { } virtual ~SoftwareOutputDeviceViewManager() {} // cc::SoftwareOutputDevice: virtual void EndPaint(cc::SoftwareFrameData* frame_data) OVERRIDE { WindowTreeHostMojo* window_tree_host = WindowTreeHostMojo::ForCompositor(compositor_); DCHECK(window_tree_host); window_tree_host->SetContents( skia::GetTopDevice(*canvas_)->accessBitmap(true)); SoftwareOutputDevice::EndPaint(frame_data); } private: ui::Compositor* compositor_; 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 AllocateSharedBitmap( const gfx::Size& size) OVERRIDE { base::AutoLock lock(lock_); scoped_ptr memory(new base::SharedMemory); memory->CreateAndMapAnonymous(size.GetArea() * 4); cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); bitmap_map_[id] = memory.get(); return scoped_ptr( new cc::SharedBitmap(memory.release(), id, base::Bind(&FreeSharedBitmap))); } virtual scoped_ptr GetSharedBitmapFromId( const gfx::Size&, const cc::SharedBitmapId& id) OVERRIDE { base::AutoLock lock(lock_); if (bitmap_map_.find(id) == bitmap_map_.end()) return scoped_ptr(); return scoped_ptr( new cc::SharedBitmap(bitmap_map_[id], id, base::Bind(&IgnoreSharedBitmap))); } virtual scoped_ptr GetBitmapForSharedMemory( base::SharedMemory* memory) OVERRIDE { base::AutoLock lock(lock_); cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); bitmap_map_[id] = memory; return scoped_ptr( new cc::SharedBitmap(memory, id, base::Bind(&IgnoreSharedBitmap))); } private: base::Lock lock_; std::map bitmap_map_; DISALLOW_COPY_AND_ASSIGN(TestSharedBitmapManager); }; } // namespace ContextFactoryMojo::ContextFactoryMojo() : shared_bitmap_manager_(new TestSharedBitmapManager()) { } ContextFactoryMojo::~ContextFactoryMojo() {} scoped_ptr ContextFactoryMojo::CreateOutputSurface( ui::Compositor* compositor, bool software_fallback) { scoped_ptr output_device( new SoftwareOutputDeviceViewManager(compositor)); return make_scoped_ptr(new cc::OutputSurface(output_device.Pass())); } scoped_refptr ContextFactoryMojo::CreateReflector( ui::Compositor* mirroed_compositor, ui::Layer* mirroring_layer) { return new ui::Reflector(); } void ContextFactoryMojo::RemoveReflector( scoped_refptr reflector) { } scoped_refptr ContextFactoryMojo::SharedMainThreadContextProvider() { return scoped_refptr(NULL); } void ContextFactoryMojo::RemoveCompositor(ui::Compositor* compositor) {} bool ContextFactoryMojo::DoesCreateTestContexts() { return false; } cc::SharedBitmapManager* ContextFactoryMojo::GetSharedBitmapManager() { return shared_bitmap_manager_.get(); } base::MessageLoopProxy* ContextFactoryMojo::GetCompositorMessageLoop() { return NULL; } } // namespace mojo