Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Side by Side Diff: content/browser/android/ui_resource_provider_impl.cc

Issue 287593002: android: content::UIResourceProvider and content::UIResourceClientAndroid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: user->listener Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2013 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 "content/browser/android/ui_resource_provider_impl.h"
6
7 #include "cc/resources/scoped_ui_resource.h"
8 #include "cc/resources/ui_resource_bitmap.h"
9 #include "cc/resources/ui_resource_client.h"
10 #include "content/public/browser/android/ui_resource_listener.h"
11 #include "skia/ext/refptr.h"
12 #include "third_party/skia/include/core/SkBitmap.h"
13 #include "third_party/skia/include/core/SkCanvas.h"
14 #include "third_party/skia/include/core/SkMallocPixelRef.h"
15
16 namespace {
17
18 class TransientUIResource : public cc::ScopedUIResource {
19 public:
20 static scoped_ptr<TransientUIResource> Create(
21 cc::LayerTreeHost* host,
22 const cc::UIResourceBitmap& bitmap) {
23 return make_scoped_ptr(new TransientUIResource(host, bitmap));
24 }
25
26 virtual cc::UIResourceBitmap GetBitmap(cc::UIResourceId uid,
27 bool resource_lost) OVERRIDE {
28 if (!retrieved_) {
David Trainor- moved to gerrit 2014/05/13 20:38:00 This feels a bit fragile. So we're returning the
powei 2014/05/13 23:38:03 GetBitmap is called (again) only when the context
David Trainor- moved to gerrit 2014/05/16 18:18:35 I guess I just think that's a scary assumption unl
29 cc::UIResourceBitmap old_bitmap(bitmap_);
30
31 // Return a place holder for all following calls to GetBitmap.
32 SkBitmap tiny_bitmap;
33 SkCanvas canvas(tiny_bitmap);
34 tiny_bitmap.setConfig(
35 SkBitmap::kARGB_8888_Config, 1, 1, 0, kOpaque_SkAlphaType);
36 tiny_bitmap.allocPixels();
37 canvas.drawColor(SK_ColorWHITE);
38 tiny_bitmap.setImmutable();
39
40 // Release our reference of the true bitmap.
41 bitmap_ = cc::UIResourceBitmap(tiny_bitmap);
42
43 retrieved_ = true;
44 return old_bitmap;
45 }
46 return bitmap_;
David Trainor- moved to gerrit 2014/05/13 20:38:00 return ScopedUIResource::GetBitmap(...)?
powei 2014/05/13 23:38:03 Done.
47 }
48
49 protected:
50 TransientUIResource(cc::LayerTreeHost* host,
51 const cc::UIResourceBitmap& bitmap)
52 : cc::ScopedUIResource(host, bitmap), retrieved_(false) {}
53
54 private:
55 bool retrieved_;
David Trainor- moved to gerrit 2014/05/13 20:38:00 Do we need DISALLOW_COPY_AND_ASSIGN?
powei 2014/05/13 23:38:03 Done.
56 };
57
58 } // anonymous namespace
59
60 namespace content {
61
62 UIResourceProviderImpl::UIResourceProviderImpl() : host_(NULL) {
63 }
64
65 UIResourceProviderImpl::~UIResourceProviderImpl() {
66 // The lifetime of the UI resource provider should be greater than all of the
67 // listeners.
68 DCHECK_EQ(listeners_.size(), 0u);
69 }
70
71 void UIResourceProviderImpl::SetLayerTreeHost(cc::LayerTreeHost* host) {
72 if (host_ == host)
73 return;
74
75 ui_resource_map_.clear();
76
77 UIResourcesAreInvalid();
78 host_ = host;
79
80 if (host_)
81 RecreateUIResources();
82 }
83
84 void UIResourceProviderImpl::AddListener(UIResourceListener* listener) {
85 UIResourceListenerList::iterator iter =
86 std::find(listeners_.begin(), listeners_.end(), listener);
87 if (iter == listeners_.end())
88 listeners_.push_back(listener);
89 }
90
91 void UIResourceProviderImpl::RemoveListener(UIResourceListener* listener) {
92 UIResourceListenerList::iterator iter =
93 std::find(listeners_.begin(), listeners_.end(), listener);
94 if (iter != listeners_.end())
95 listeners_.erase(iter);
96 }
97
98 void UIResourceProviderImpl::UIResourcesAreInvalid() {
99 for (UIResourceListenerList::iterator iter = listeners_.begin();
100 iter != listeners_.end();
101 iter++) {
102 (*iter)->OnUIResourcesAreInvalid();
103 }
104 }
105
106 void UIResourceProviderImpl::RecreateUIResources() {
107 for (UIResourceListenerList::iterator iter = listeners_.begin();
108 iter != listeners_.end();
109 iter++) {
110 (*iter)->OnRecreateUIResources();
111 }
112 }
113
114 cc::UIResourceId UIResourceProviderImpl::GenerateUIResourceFromUIResourceBitmap(
115 const cc::UIResourceBitmap& bitmap,
116 bool is_transient) {
117 if (!host_)
118 return 0;
119
120 cc::UIResourceId id = 0;
121 scoped_ptr<cc::UIResourceClient> resource;
122 if (is_transient) {
123 scoped_ptr<TransientUIResource> transient_resource =
124 TransientUIResource::Create(host_, bitmap);
125 id = transient_resource->id();
126 resource = transient_resource.Pass();
127 } else {
128 scoped_ptr<cc::ScopedUIResource> scoped_resource =
129 cc::ScopedUIResource::Create(host_, bitmap);
130 id = scoped_resource->id();
131 resource = scoped_resource.Pass();
132 }
133
134 ui_resource_map_.set(id, resource.Pass());
135
136 return id;
137 }
138
139 cc::UIResourceId UIResourceProviderImpl::GenerateUIResource(
140 const SkBitmap& bitmap,
141 bool is_transient) {
142 return GenerateUIResourceFromUIResourceBitmap(cc::UIResourceBitmap(bitmap),
143 is_transient);
144 }
145
146 cc::UIResourceId UIResourceProviderImpl::GenerateCompressedUIResource(
147 const gfx::Size& size,
148 void* pixels,
149 bool is_transient) {
150 DCHECK_LT(0, size.width());
151 DCHECK_LT(0, size.height());
152 DCHECK_EQ(0, size.width() % 4);
153 DCHECK_EQ(0, size.height() % 4);
154
155 size_t data_size = size.width() * size.height() / 2;
156 SkImageInfo info = {size.width(),
157 size.height() / 2,
158 kAlpha_8_SkColorType,
159 kPremul_SkAlphaType};
160 skia::RefPtr<SkMallocPixelRef> etc1_pixel_ref =
161 skia::AdoptRef(SkMallocPixelRef::NewAllocate(info, 0, 0));
162 memcpy(etc1_pixel_ref->getAddr(), pixels, data_size);
163 etc1_pixel_ref->setImmutable();
164 return GenerateUIResourceFromUIResourceBitmap(
165 cc::UIResourceBitmap(etc1_pixel_ref, size), is_transient);
166 }
167
168 cc::UIResourceId UIResourceProviderImpl::GenerateCompressedUIResource(
169 const skia::RefPtr<SkPixelRef>& pixel_ref,
170 bool is_transient) {
171 gfx::Size size(pixel_ref->info().width(), pixel_ref->info().height());
172 DCHECK_LT(0, size.width());
173 DCHECK_LT(0, size.height());
174 DCHECK_EQ(0, size.width() % 4);
175 DCHECK_EQ(0, size.height() % 4);
176
177 return GenerateUIResourceFromUIResourceBitmap(
178 cc::UIResourceBitmap(pixel_ref, size), is_transient);
179 }
180
181 void UIResourceProviderImpl::DeleteUIResource(cc::UIResourceId resource_id) {
182 UIResourceMap::iterator iter = ui_resource_map_.find(resource_id);
183 if (iter != ui_resource_map_.end())
184 ui_resource_map_.erase(iter);
185 }
186
187 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698