1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "mojo/aura/context_factory_mojo.h"
6
7 #include "base/bind.h"
8 #include "cc/output/output_surface.h"
9 #include "cc/output/software_output_device.h"
10 #include "cc/resources/shared_bitmap_manager.h"
11 #include "mojo/aura/window_tree_host_mojo.h"
12 #include "skia/ext/platform_canvas.h"
13 #include "ui/compositor/reflector.h"
14
15 namespace mojo {
16 namespace {
17
FreeSharedBitmap(cc::SharedBitmap * shared_bitmap)18 void FreeSharedBitmap(cc::SharedBitmap* shared_bitmap) {
19 delete shared_bitmap->memory();
20 }
21
IgnoreSharedBitmap(cc::SharedBitmap * shared_bitmap)22 void IgnoreSharedBitmap(cc::SharedBitmap* shared_bitmap) {}
23
24 class SoftwareOutputDeviceViewManager : public cc::SoftwareOutputDevice {
25 public:
SoftwareOutputDeviceViewManager(ui::Compositor * compositor)26 explicit SoftwareOutputDeviceViewManager(ui::Compositor* compositor)
27 : compositor_(compositor) {
28 }
~SoftwareOutputDeviceViewManager()29 virtual ~SoftwareOutputDeviceViewManager() {}
30
31 // cc::SoftwareOutputDevice:
EndPaint(cc::SoftwareFrameData * frame_data)32 virtual void EndPaint(cc::SoftwareFrameData* frame_data) OVERRIDE {
33 WindowTreeHostMojo* window_tree_host =
34 WindowTreeHostMojo::ForCompositor(compositor_);
35 DCHECK(window_tree_host);
36 window_tree_host->SetContents(
37 skia::GetTopDevice(*canvas_)->accessBitmap(true));
38
39 SoftwareOutputDevice::EndPaint(frame_data);
40 }
41
42 private:
43 ui::Compositor* compositor_;
44
45 DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceViewManager);
46 };
47
48 // TODO(sky): this is a copy from cc/test. Copy to a common place.
49 class TestSharedBitmapManager : public cc::SharedBitmapManager {
50 public:
TestSharedBitmapManager()51 TestSharedBitmapManager() {}
~TestSharedBitmapManager()52 virtual ~TestSharedBitmapManager() {}
53
AllocateSharedBitmap(const gfx::Size & size)54 virtual scoped_ptr<cc::SharedBitmap> AllocateSharedBitmap(
55 const gfx::Size& size) OVERRIDE {
56 base::AutoLock lock(lock_);
57 scoped_ptr<base::SharedMemory> memory(new base::SharedMemory);
58 memory->CreateAndMapAnonymous(size.GetArea() * 4);
59 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
60 bitmap_map_[id] = memory.get();
61 return scoped_ptr<cc::SharedBitmap>(
62 new cc::SharedBitmap(memory.release(), id,
63 base::Bind(&FreeSharedBitmap)));
64 }
65
GetSharedBitmapFromId(const gfx::Size &,const cc::SharedBitmapId & id)66 virtual scoped_ptr<cc::SharedBitmap> GetSharedBitmapFromId(
67 const gfx::Size&,
68 const cc::SharedBitmapId& id) OVERRIDE {
69 base::AutoLock lock(lock_);
70 if (bitmap_map_.find(id) == bitmap_map_.end())
71 return scoped_ptr<cc::SharedBitmap>();
72 return scoped_ptr<cc::SharedBitmap>(
73 new cc::SharedBitmap(bitmap_map_[id], id,
74 base::Bind(&IgnoreSharedBitmap)));
75 }
76
GetBitmapForSharedMemory(base::SharedMemory * memory)77 virtual scoped_ptr<cc::SharedBitmap> GetBitmapForSharedMemory(
78 base::SharedMemory* memory) OVERRIDE {
79 base::AutoLock lock(lock_);
80 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
81 bitmap_map_[id] = memory;
82 return scoped_ptr<cc::SharedBitmap>(
83 new cc::SharedBitmap(memory, id, base::Bind(&IgnoreSharedBitmap)));
84 }
85
86 private:
87 base::Lock lock_;
88 std::map<cc::SharedBitmapId, base::SharedMemory*> bitmap_map_;
89
90 DISALLOW_COPY_AND_ASSIGN(TestSharedBitmapManager);
91 };
92
93 } // namespace
94
ContextFactoryMojo()95 ContextFactoryMojo::ContextFactoryMojo()
96 : shared_bitmap_manager_(new TestSharedBitmapManager()) {
97 }
98
~ContextFactoryMojo()99 ContextFactoryMojo::~ContextFactoryMojo() {}
100
CreateOutputSurface(ui::Compositor * compositor,bool software_fallback)101 scoped_ptr<cc::OutputSurface> ContextFactoryMojo::CreateOutputSurface(
102 ui::Compositor* compositor,
103 bool software_fallback) {
104 scoped_ptr<cc::SoftwareOutputDevice> output_device(
105 new SoftwareOutputDeviceViewManager(compositor));
106 return make_scoped_ptr(new cc::OutputSurface(output_device.Pass()));
107 }
108
CreateReflector(ui::Compositor * mirroed_compositor,ui::Layer * mirroring_layer)109 scoped_refptr<ui::Reflector> ContextFactoryMojo::CreateReflector(
110 ui::Compositor* mirroed_compositor,
111 ui::Layer* mirroring_layer) {
112 return new ui::Reflector();
113 }
114
RemoveReflector(scoped_refptr<ui::Reflector> reflector)115 void ContextFactoryMojo::RemoveReflector(
116 scoped_refptr<ui::Reflector> reflector) {
117 }
118
119 scoped_refptr<cc::ContextProvider>
SharedMainThreadContextProvider()120 ContextFactoryMojo::SharedMainThreadContextProvider() {
121 return scoped_refptr<cc::ContextProvider>(NULL);
122 }
123
RemoveCompositor(ui::Compositor * compositor)124 void ContextFactoryMojo::RemoveCompositor(ui::Compositor* compositor) {}
125
DoesCreateTestContexts()126 bool ContextFactoryMojo::DoesCreateTestContexts() { return false; }
127
GetSharedBitmapManager()128 cc::SharedBitmapManager* ContextFactoryMojo::GetSharedBitmapManager() {
129 return shared_bitmap_manager_.get();
130 }
131
GetCompositorMessageLoop()132 base::MessageLoopProxy* ContextFactoryMojo::GetCompositorMessageLoop() {
133 return NULL;
134 }
135
136 } // namespace mojo
137