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

Side by Side Diff: ui/android/resources/resource_manager_impl.cc

Issue 2325623003: Replace IDMap with std::unordered_map in ResourceManager (Closed)
Patch Set: address comments Created 4 years, 3 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
« no previous file with comments | « ui/android/resources/resource_manager_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/android/resources/resource_manager_impl.h" 5 #include "ui/android/resources/resource_manager_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 ResourceManagerImpl::GetJavaObject() { 59 ResourceManagerImpl::GetJavaObject() {
60 return base::android::ScopedJavaLocalRef<jobject>(java_obj_); 60 return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
61 } 61 }
62 62
63 ResourceManager::Resource* ResourceManagerImpl::GetResource( 63 ResourceManager::Resource* ResourceManagerImpl::GetResource(
64 AndroidResourceType res_type, 64 AndroidResourceType res_type,
65 int res_id) { 65 int res_id) {
66 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST); 66 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
67 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST); 67 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
68 68
69 Resource* resource = resources_[res_type].Lookup(res_id); 69 Resource* resource = nullptr;
70 if (resources_[res_type].find(res_id) != resources_[res_type].end())
71 resource = resources_[res_type][res_id].get();
70 72
71 if (!resource || res_type == ANDROID_RESOURCE_TYPE_DYNAMIC || 73 if (!resource || res_type == ANDROID_RESOURCE_TYPE_DYNAMIC ||
72 res_type == ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP) { 74 res_type == ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP) {
73 RequestResourceFromJava(res_type, res_id); 75 RequestResourceFromJava(res_type, res_id);
74 resource = resources_[res_type].Lookup(res_id); 76 resource = resources_[res_type][res_id].get();
75 } 77 }
76 78
77 return resource; 79 return resource;
78 } 80 }
79 81
80 void ResourceManagerImpl::RemoveUnusedTints( 82 void ResourceManagerImpl::RemoveUnusedTints(
81 const std::unordered_set<int>& used_tints) { 83 const std::unordered_set<int>& used_tints) {
82 // Iterate over the currently cached tints and remove ones that were not 84 // Iterate over the currently cached tints and remove ones that were not
83 // used as defined in |used_tints|. 85 // used as defined in |used_tints|.
84 for (auto it = tinted_resources_.cbegin(); it != tinted_resources_.cend();) { 86 for (auto it = tinted_resources_.cbegin(); it != tinted_resources_.cend();) {
85 if (used_tints.find(it->first) == used_tints.end()) { 87 if (used_tints.find(it->first) == used_tints.end()) {
86 it = tinted_resources_.erase(it); 88 it = tinted_resources_.erase(it);
87 } else { 89 } else {
88 ++it; 90 ++it;
89 } 91 }
90 } 92 }
91 } 93 }
92 94
93 ResourceManager::Resource* ResourceManagerImpl::GetStaticResourceWithTint( 95 ResourceManager::Resource* ResourceManagerImpl::GetStaticResourceWithTint(
94 int res_id, 96 int res_id,
95 int tint_color) { 97 SkColor tint_color) {
96 if (tinted_resources_.find(tint_color) == tinted_resources_.end()) { 98 if (tinted_resources_.find(tint_color) == tinted_resources_.end()) {
97 tinted_resources_[tint_color] = base::MakeUnique<ResourceMap>(); 99 tinted_resources_[tint_color] = base::MakeUnique<ResourceMap>();
98 } 100 }
99 ResourceMap* resource_map = tinted_resources_[tint_color].get(); 101 ResourceMap* resource_map = tinted_resources_[tint_color].get();
100 102
101 Resource* tinted_resource = resource_map->Lookup(res_id); 103 // If the resource is already cached, use it.
104 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item =
105 resource_map->find(res_id);
106 if (item != resource_map->end())
107 return item->second.get();
102 108
103 // If the resource is already cached, use it. 109 std::unique_ptr<Resource> tinted_resource = base::MakeUnique<Resource>();
104 if (tinted_resource)
105 return tinted_resource;
106
107 tinted_resource = new Resource();
108 110
109 ResourceManager::Resource* base_image = 111 ResourceManager::Resource* base_image =
110 GetResource(ANDROID_RESOURCE_TYPE_STATIC, res_id); 112 GetResource(ANDROID_RESOURCE_TYPE_STATIC, res_id);
111 DCHECK(base_image); 113 DCHECK(base_image);
112 114
113 TRACE_EVENT0("browser", "ResourceManagerImpl::GetStaticResourceWithTint"); 115 TRACE_EVENT0("browser", "ResourceManagerImpl::GetStaticResourceWithTint");
114 SkBitmap tinted_bitmap; 116 SkBitmap tinted_bitmap;
115 tinted_bitmap.allocPixels(SkImageInfo::MakeN32Premul(base_image->size.width(), 117 tinted_bitmap.allocPixels(SkImageInfo::MakeN32Premul(base_image->size.width(),
116 base_image->size.height())); 118 base_image->size.height()));
117 119
118 SkCanvas canvas(tinted_bitmap); 120 SkCanvas canvas(tinted_bitmap);
119 canvas.clear(SK_ColorTRANSPARENT); 121 canvas.clear(SK_ColorTRANSPARENT);
120 122
121 // Build a color filter to use on the base resource. This filter multiplies 123 // Build a color filter to use on the base resource. This filter multiplies
122 // the RGB components by the components of the new color but retains the 124 // the RGB components by the components of the new color but retains the
123 // alpha of the original image. 125 // alpha of the original image.
124 SkPaint color_filter; 126 SkPaint color_filter;
125 color_filter.setColorFilter( 127 color_filter.setColorFilter(
126 SkColorFilter::MakeModeFilter(tint_color, SkXfermode::kModulate_Mode)); 128 SkColorFilter::MakeModeFilter(tint_color, SkXfermode::kModulate_Mode));
127 129
128 // Draw the resource and make it immutable. 130 // Draw the resource and make it immutable.
129 base_image->ui_resource->GetBitmap(base_image->ui_resource->id(), false) 131 base_image->ui_resource->GetBitmap(base_image->ui_resource->id(), false)
130 .DrawToCanvas(&canvas, &color_filter); 132 .DrawToCanvas(&canvas, &color_filter);
131 tinted_bitmap.setImmutable(); 133 tinted_bitmap.setImmutable();
132 134
133 // Create a UI resource from the new bitmap. 135 // Create a UI resource from the new bitmap.
134 tinted_resource = new Resource();
135 tinted_resource->size = gfx::Size(base_image->size); 136 tinted_resource->size = gfx::Size(base_image->size);
136 tinted_resource->padding = gfx::Rect(base_image->padding); 137 tinted_resource->padding = gfx::Rect(base_image->padding);
137 tinted_resource->aperture = gfx::Rect(base_image->aperture); 138 tinted_resource->aperture = gfx::Rect(base_image->aperture);
138 tinted_resource->ui_resource = cc::ScopedUIResource::Create(host_, 139 tinted_resource->ui_resource = cc::ScopedUIResource::Create(host_,
139 cc::UIResourceBitmap(tinted_bitmap)); 140 cc::UIResourceBitmap(tinted_bitmap));
140 141
141 resource_map->AddWithID(tinted_resource, res_id); 142 (*resource_map)[res_id].swap(tinted_resource);
142 143
143 return tinted_resource; 144 return (*resource_map)[res_id].get();
144 } 145 }
145 146
146 void ResourceManagerImpl::ClearTintedResourceCache(JNIEnv* env, 147 void ResourceManagerImpl::ClearTintedResourceCache(JNIEnv* env,
147 const JavaRef<jobject>& jobj) { 148 const JavaRef<jobject>& jobj) {
148 tinted_resources_.clear(); 149 tinted_resources_.clear();
149 } 150 }
150 151
151 void ResourceManagerImpl::PreloadResource(AndroidResourceType res_type, 152 void ResourceManagerImpl::PreloadResource(AndroidResourceType res_type,
152 int res_id) { 153 int res_id) {
153 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST); 154 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
154 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST); 155 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
155 156
156 // Don't send out a query if the resource is already loaded. 157 // Don't send out a query if the resource is already loaded.
157 if (resources_[res_type].Lookup(res_id)) 158 if (resources_[res_type].find(res_id) != resources_[res_type].end())
158 return; 159 return;
159 160
160 PreloadResourceFromJava(res_type, res_id); 161 PreloadResourceFromJava(res_type, res_id);
161 } 162 }
162 163
163 void ResourceManagerImpl::OnResourceReady(JNIEnv* env, 164 void ResourceManagerImpl::OnResourceReady(JNIEnv* env,
164 const JavaRef<jobject>& jobj, 165 const JavaRef<jobject>& jobj,
165 jint res_type, 166 jint res_type,
166 jint res_id, 167 jint res_id,
167 const JavaRef<jobject>& bitmap, 168 const JavaRef<jobject>& bitmap,
168 jint padding_left, 169 jint padding_left,
169 jint padding_top, 170 jint padding_top,
170 jint padding_right, 171 jint padding_right,
171 jint padding_bottom, 172 jint padding_bottom,
172 jint aperture_left, 173 jint aperture_left,
173 jint aperture_top, 174 jint aperture_top,
174 jint aperture_right, 175 jint aperture_right,
175 jint aperture_bottom) { 176 jint aperture_bottom) {
176 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST); 177 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
177 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST); 178 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
178 TRACE_EVENT2("ui", "ResourceManagerImpl::OnResourceReady", 179 TRACE_EVENT2("ui", "ResourceManagerImpl::OnResourceReady",
179 "resource_type", res_type, 180 "resource_type", res_type,
180 "resource_id", res_id); 181 "resource_id", res_id);
181 182
182 Resource* resource = resources_[res_type].Lookup(res_id); 183 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item =
183 if (!resource) { 184 resources_[res_type].find(res_id);
184 resource = new Resource(); 185 if (item == resources_[res_type].end()) {
185 resources_[res_type].AddWithID(resource, res_id); 186 resources_[res_type][res_id] = base::MakeUnique<Resource>();
mdjones 2016/09/12 16:55:09 I think you wanted my to use "item" here to reset
186 } 187 }
187 188
189 Resource* resource = resources_[res_type][res_id].get();
190
188 gfx::JavaBitmap jbitmap(bitmap.obj()); 191 gfx::JavaBitmap jbitmap(bitmap.obj());
189 resource->size = jbitmap.size(); 192 resource->size = jbitmap.size();
190 resource->padding.SetRect(padding_left, padding_top, 193 resource->padding.SetRect(padding_left, padding_top,
191 padding_right - padding_left, 194 padding_right - padding_left,
192 padding_bottom - padding_top); 195 padding_bottom - padding_top);
193 resource->aperture.SetRect(aperture_left, aperture_top, 196 resource->aperture.SetRect(aperture_left, aperture_top,
194 aperture_right - aperture_left, 197 aperture_right - aperture_left,
195 aperture_bottom - aperture_top); 198 aperture_bottom - aperture_top);
196 199
197 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(jbitmap); 200 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(jbitmap);
198 skbitmap.setImmutable(); 201 skbitmap.setImmutable();
199 resource->ui_resource = 202 resource->ui_resource =
200 cc::ScopedUIResource::Create(host_, cc::UIResourceBitmap(skbitmap)); 203 cc::ScopedUIResource::Create(host_, cc::UIResourceBitmap(skbitmap));
201 } 204 }
202 205
203 CrushedSpriteResource* ResourceManagerImpl::GetCrushedSpriteResource( 206 CrushedSpriteResource* ResourceManagerImpl::GetCrushedSpriteResource(
204 int bitmap_res_id, int metadata_res_id) { 207 int bitmap_res_id, int metadata_res_id) {
205 CrushedSpriteResource* resource = 208
206 crushed_sprite_resources_.Lookup(bitmap_res_id); 209 CrushedSpriteResource* resource = nullptr;
210 if (crushed_sprite_resources_.find(bitmap_res_id)
211 != crushed_sprite_resources_.end()) {
212 resource = crushed_sprite_resources_[bitmap_res_id].get();
213 }
214
207 if (!resource) { 215 if (!resource) {
208 RequestCrushedSpriteResourceFromJava(bitmap_res_id, metadata_res_id, false); 216 RequestCrushedSpriteResourceFromJava(bitmap_res_id, metadata_res_id, false);
209 resource = crushed_sprite_resources_.Lookup(bitmap_res_id); 217 resource = crushed_sprite_resources_[bitmap_res_id].get();
210 } else if (resource->BitmapHasBeenEvictedFromMemory()) { 218 } else if (resource->BitmapHasBeenEvictedFromMemory()) {
211 RequestCrushedSpriteResourceFromJava(bitmap_res_id, metadata_res_id, true); 219 RequestCrushedSpriteResourceFromJava(bitmap_res_id, metadata_res_id, true);
212 } 220 }
213 221
214 return resource; 222 return resource;
215 } 223 }
216 224
217 void ResourceManagerImpl::OnCrushedSpriteResourceReady( 225 void ResourceManagerImpl::OnCrushedSpriteResourceReady(
218 JNIEnv* env, 226 JNIEnv* env,
219 const JavaRef<jobject>& jobj, 227 const JavaRef<jobject>& jobj,
220 jint bitmap_res_id, 228 jint bitmap_res_id,
221 const JavaRef<jobject>& bitmap, 229 const JavaRef<jobject>& bitmap,
222 const JavaRef<jobjectArray>& frame_rects, 230 const JavaRef<jobjectArray>& frame_rects,
223 jint unscaled_sprite_width, 231 jint unscaled_sprite_width,
224 jint unscaled_sprite_height, 232 jint unscaled_sprite_height,
225 jfloat scaled_sprite_width, 233 jfloat scaled_sprite_width,
226 jfloat scaled_sprite_height) { 234 jfloat scaled_sprite_height) {
227 // Construct source and destination rectangles for each frame from 235 // Construct source and destination rectangles for each frame from
228 // |frame_rects|. 236 // |frame_rects|.
229 std::vector<std::vector<int>> all_frame_rects_vector; 237 std::vector<std::vector<int>> all_frame_rects_vector;
230 JavaArrayOfIntArrayToIntVector(env, frame_rects.obj(), 238 JavaArrayOfIntArrayToIntVector(env, frame_rects.obj(),
231 &all_frame_rects_vector); 239 &all_frame_rects_vector);
232 CrushedSpriteResource::SrcDstRects src_dst_rects = 240 CrushedSpriteResource::SrcDstRects src_dst_rects =
233 ProcessCrushedSpriteFrameRects(all_frame_rects_vector); 241 ProcessCrushedSpriteFrameRects(all_frame_rects_vector);
234 242
235 SkBitmap skbitmap = 243 SkBitmap skbitmap =
236 gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(bitmap.obj())); 244 gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(bitmap.obj()));
237 245
238 CrushedSpriteResource* resource = new CrushedSpriteResource( 246 std::unique_ptr<CrushedSpriteResource> resource =
239 skbitmap, 247 base::MakeUnique<CrushedSpriteResource>(
240 src_dst_rects, 248 skbitmap,
241 gfx::Size(unscaled_sprite_width, unscaled_sprite_height), 249 src_dst_rects,
242 gfx::Size(scaled_sprite_width, scaled_sprite_height)); 250 gfx::Size(unscaled_sprite_width, unscaled_sprite_height),
251 gfx::Size(scaled_sprite_width, scaled_sprite_height));
243 252
244 if (crushed_sprite_resources_.Lookup(bitmap_res_id)) { 253 crushed_sprite_resources_[bitmap_res_id].swap(resource);
245 crushed_sprite_resources_.Replace(bitmap_res_id, resource);
246 } else {
247 crushed_sprite_resources_.AddWithID(resource, bitmap_res_id);
248 }
249 } 254 }
250 255
251 CrushedSpriteResource::SrcDstRects 256 CrushedSpriteResource::SrcDstRects
252 ResourceManagerImpl::ProcessCrushedSpriteFrameRects( 257 ResourceManagerImpl::ProcessCrushedSpriteFrameRects(
253 std::vector<std::vector<int>> frame_rects_vector) { 258 std::vector<std::vector<int>> frame_rects_vector) {
254 CrushedSpriteResource::SrcDstRects src_dst_rects; 259 CrushedSpriteResource::SrcDstRects src_dst_rects;
255 for (size_t i = 0; i < frame_rects_vector.size(); ++i) { 260 for (size_t i = 0; i < frame_rects_vector.size(); ++i) {
256 std::vector<int> frame_ints = frame_rects_vector[i]; 261 std::vector<int> frame_ints = frame_rects_vector[i];
257 CrushedSpriteResource::FrameSrcDstRects frame_src_dst_rects; 262 CrushedSpriteResource::FrameSrcDstRects frame_src_dst_rects;
258 263
(...skipping 16 matching lines...) Expand all
275 src_dst_rects.push_back(frame_src_dst_rects); 280 src_dst_rects.push_back(frame_src_dst_rects);
276 } 281 }
277 return src_dst_rects; 282 return src_dst_rects;
278 } 283 }
279 284
280 void ResourceManagerImpl::OnCrushedSpriteResourceReloaded( 285 void ResourceManagerImpl::OnCrushedSpriteResourceReloaded(
281 JNIEnv* env, 286 JNIEnv* env,
282 const JavaRef<jobject>& jobj, 287 const JavaRef<jobject>& jobj,
283 jint bitmap_res_id, 288 jint bitmap_res_id,
284 const JavaRef<jobject>& bitmap) { 289 const JavaRef<jobject>& bitmap) {
285 CrushedSpriteResource* resource = 290 std::unordered_map<int, std::unique_ptr<CrushedSpriteResource>>::iterator
286 crushed_sprite_resources_.Lookup(bitmap_res_id); 291 item = crushed_sprite_resources_.find(bitmap_res_id);
287 if (!resource) { 292 if (item == crushed_sprite_resources_.end()) {
288 // Cannot reload a resource that has not been previously loaded. 293 // Cannot reload a resource that has not been previously loaded.
289 return; 294 return;
290 } 295 }
291 SkBitmap skbitmap = 296 SkBitmap skbitmap =
292 gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(bitmap.obj())); 297 gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(bitmap.obj()));
293 resource->SetBitmap(skbitmap); 298 item->second->SetBitmap(skbitmap);
294 } 299 }
295 300
296 // static 301 // static
297 bool ResourceManagerImpl::RegisterResourceManager(JNIEnv* env) { 302 bool ResourceManagerImpl::RegisterResourceManager(JNIEnv* env) {
298 return RegisterNativesImpl(env); 303 return RegisterNativesImpl(env);
299 } 304 }
300 305
301 void ResourceManagerImpl::PreloadResourceFromJava(AndroidResourceType res_type, 306 void ResourceManagerImpl::PreloadResourceFromJava(AndroidResourceType res_type,
302 int res_id) { 307 int res_id) {
303 TRACE_EVENT2("ui", "ResourceManagerImpl::PreloadResourceFromJava", 308 TRACE_EVENT2("ui", "ResourceManagerImpl::PreloadResourceFromJava",
(...skipping 17 matching lines...) Expand all
321 TRACE_EVENT2("ui", 326 TRACE_EVENT2("ui",
322 "ResourceManagerImpl::RequestCrushedSpriteResourceFromJava", 327 "ResourceManagerImpl::RequestCrushedSpriteResourceFromJava",
323 "bitmap_res_id", bitmap_res_id, 328 "bitmap_res_id", bitmap_res_id,
324 "metadata_res_id", metadata_res_id); 329 "metadata_res_id", metadata_res_id);
325 Java_ResourceManager_crushedSpriteResourceRequested( 330 Java_ResourceManager_crushedSpriteResourceRequested(
326 base::android::AttachCurrentThread(), java_obj_, bitmap_res_id, 331 base::android::AttachCurrentThread(), java_obj_, bitmap_res_id,
327 metadata_res_id, reloading); 332 metadata_res_id, reloading);
328 } 333 }
329 334
330 } // namespace ui 335 } // namespace ui
OLDNEW
« no previous file with comments | « ui/android/resources/resource_manager_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698