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

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

Issue 2746483003: ui/android: Fix Resource meta-data sharing with ResourceManager. (Closed)
Patch Set: jni Created 3 years, 9 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
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 <inttypes.h> 7 #include <inttypes.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <utility> 10 #include <utility>
(...skipping 13 matching lines...) Expand all
24 #include "jni/ResourceManager_jni.h" 24 #include "jni/ResourceManager_jni.h"
25 #include "third_party/skia/include/core/SkBitmap.h" 25 #include "third_party/skia/include/core/SkBitmap.h"
26 #include "third_party/skia/include/core/SkCanvas.h" 26 #include "third_party/skia/include/core/SkCanvas.h"
27 #include "third_party/skia/include/core/SkColorFilter.h" 27 #include "third_party/skia/include/core/SkColorFilter.h"
28 #include "ui/android/resources/ui_resource_provider.h" 28 #include "ui/android/resources/ui_resource_provider.h"
29 #include "ui/android/window_android.h" 29 #include "ui/android/window_android.h"
30 #include "ui/gfx/android/java_bitmap.h" 30 #include "ui/gfx/android/java_bitmap.h"
31 #include "ui/gfx/geometry/rect.h" 31 #include "ui/gfx/geometry/rect.h"
32 32
33 using base::android::JavaArrayOfIntArrayToIntVector; 33 using base::android::JavaArrayOfIntArrayToIntVector;
34 using base::android::JavaParamRef;
34 using base::android::JavaRef; 35 using base::android::JavaRef;
35 36
36 namespace ui { 37 namespace ui {
37 38
38 // static 39 // static
39 ResourceManagerImpl* ResourceManagerImpl::FromJavaObject( 40 ResourceManagerImpl* ResourceManagerImpl::FromJavaObject(
40 const JavaRef<jobject>& jobj) { 41 const JavaRef<jobject>& jobj) {
41 return reinterpret_cast<ResourceManagerImpl*>( 42 return reinterpret_cast<ResourceManagerImpl*>(
42 Java_ResourceManager_getNativePtr(base::android::AttachCurrentThread(), 43 Java_ResourceManager_getNativePtr(base::android::AttachCurrentThread(),
43 jobj)); 44 jobj));
(...skipping 22 matching lines...) Expand all
66 DCHECK(!ui_resource_manager_); 67 DCHECK(!ui_resource_manager_);
67 DCHECK(ui_resource_manager); 68 DCHECK(ui_resource_manager);
68 ui_resource_manager_ = ui_resource_manager; 69 ui_resource_manager_ = ui_resource_manager;
69 } 70 }
70 71
71 base::android::ScopedJavaLocalRef<jobject> 72 base::android::ScopedJavaLocalRef<jobject>
72 ResourceManagerImpl::GetJavaObject() { 73 ResourceManagerImpl::GetJavaObject() {
73 return base::android::ScopedJavaLocalRef<jobject>(java_obj_); 74 return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
74 } 75 }
75 76
76 ResourceManager::Resource* ResourceManagerImpl::GetResource( 77 Resource* ResourceManagerImpl::GetResource(AndroidResourceType res_type,
77 AndroidResourceType res_type, 78 int res_id) {
78 int res_id) {
79 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST); 79 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
80 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST); 80 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
81 81
82 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item = 82 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item =
83 resources_[res_type].find(res_id); 83 resources_[res_type].find(res_id);
84 84
85 if (item == resources_[res_type].end() || 85 if (item == resources_[res_type].end() ||
86 res_type == ANDROID_RESOURCE_TYPE_DYNAMIC || 86 res_type == ANDROID_RESOURCE_TYPE_DYNAMIC ||
87 res_type == ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP) { 87 res_type == ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP) {
88 RequestResourceFromJava(res_type, res_id); 88 RequestResourceFromJava(res_type, res_id);
(...skipping 13 matching lines...) Expand all
102 // used as defined in |used_tints|. 102 // used as defined in |used_tints|.
103 for (auto it = tinted_resources_.cbegin(); it != tinted_resources_.cend();) { 103 for (auto it = tinted_resources_.cbegin(); it != tinted_resources_.cend();) {
104 if (used_tints.find(it->first) == used_tints.end()) { 104 if (used_tints.find(it->first) == used_tints.end()) {
105 it = tinted_resources_.erase(it); 105 it = tinted_resources_.erase(it);
106 } else { 106 } else {
107 ++it; 107 ++it;
108 } 108 }
109 } 109 }
110 } 110 }
111 111
112 ResourceManager::Resource* ResourceManagerImpl::GetStaticResourceWithTint( 112 Resource* ResourceManagerImpl::GetStaticResourceWithTint(int res_id,
113 int res_id, 113 SkColor tint_color) {
114 SkColor tint_color) {
115 if (tinted_resources_.find(tint_color) == tinted_resources_.end()) { 114 if (tinted_resources_.find(tint_color) == tinted_resources_.end()) {
116 tinted_resources_[tint_color] = base::MakeUnique<ResourceMap>(); 115 tinted_resources_[tint_color] = base::MakeUnique<ResourceMap>();
117 } 116 }
118 ResourceMap* resource_map = tinted_resources_[tint_color].get(); 117 ResourceMap* resource_map = tinted_resources_[tint_color].get();
119 118
120 // If the resource is already cached, use it. 119 // If the resource is already cached, use it.
121 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item = 120 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item =
122 resource_map->find(res_id); 121 resource_map->find(res_id);
123 if (item != resource_map->end()) 122 if (item != resource_map->end())
124 return item->second.get(); 123 return item->second.get();
125 124
126 std::unique_ptr<Resource> tinted_resource = base::MakeUnique<Resource>(); 125 Resource* base_image = GetResource(ANDROID_RESOURCE_TYPE_STATIC, res_id);
126 DCHECK(base_image);
127 127
128 ResourceManager::Resource* base_image = 128 std::unique_ptr<Resource> tinted_resource = base_image->CreateForCopy();
129 GetResource(ANDROID_RESOURCE_TYPE_STATIC, res_id);
130 DCHECK(base_image);
131 129
132 TRACE_EVENT0("browser", "ResourceManagerImpl::GetStaticResourceWithTint"); 130 TRACE_EVENT0("browser", "ResourceManagerImpl::GetStaticResourceWithTint");
133 SkBitmap tinted_bitmap; 131 SkBitmap tinted_bitmap;
134 tinted_bitmap.allocPixels(SkImageInfo::MakeN32Premul(base_image->size.width(), 132 tinted_bitmap.allocPixels(SkImageInfo::MakeN32Premul(
135 base_image->size.height())); 133 base_image->size().width(), base_image->size().height()));
136 134
137 SkCanvas canvas(tinted_bitmap); 135 SkCanvas canvas(tinted_bitmap);
138 canvas.clear(SK_ColorTRANSPARENT); 136 canvas.clear(SK_ColorTRANSPARENT);
139 137
140 // Build a color filter to use on the base resource. This filter multiplies 138 // Build a color filter to use on the base resource. This filter multiplies
141 // the RGB components by the components of the new color but retains the 139 // the RGB components by the components of the new color but retains the
142 // alpha of the original image. 140 // alpha of the original image.
143 SkPaint color_filter; 141 SkPaint color_filter;
144 color_filter.setColorFilter( 142 color_filter.setColorFilter(
145 SkColorFilter::MakeModeFilter(tint_color, SkBlendMode::kModulate)); 143 SkColorFilter::MakeModeFilter(tint_color, SkBlendMode::kModulate));
146 144
147 // Draw the resource and make it immutable. 145 // Draw the resource and make it immutable.
148 base_image->ui_resource->GetBitmap(base_image->ui_resource->id(), false) 146 base_image->ui_resource()
147 ->GetBitmap(base_image->ui_resource()->id(), false)
149 .DrawToCanvas(&canvas, &color_filter); 148 .DrawToCanvas(&canvas, &color_filter);
150 tinted_bitmap.setImmutable(); 149 tinted_bitmap.setImmutable();
151 150
152 // Create a UI resource from the new bitmap. 151 // Create a UI resource from the new bitmap.
153 tinted_resource->size = gfx::Size(base_image->size); 152 tinted_resource->SetUIResource(
154 tinted_resource->padding = gfx::Rect(base_image->padding); 153 cc::ScopedUIResource::Create(ui_resource_manager_,
155 tinted_resource->aperture = gfx::Rect(base_image->aperture); 154 cc::UIResourceBitmap(tinted_bitmap)),
156 tinted_resource->ui_resource = cc::ScopedUIResource::Create( 155 base_image->size());
157 ui_resource_manager_, cc::UIResourceBitmap(tinted_bitmap));
158 156
159 (*resource_map)[res_id].swap(tinted_resource); 157 (*resource_map)[res_id].swap(tinted_resource);
160 158
161 return (*resource_map)[res_id].get(); 159 return (*resource_map)[res_id].get();
162 } 160 }
163 161
164 void ResourceManagerImpl::ClearTintedResourceCache(JNIEnv* env, 162 void ResourceManagerImpl::ClearTintedResourceCache(JNIEnv* env,
165 const JavaRef<jobject>& jobj) { 163 const JavaRef<jobject>& jobj) {
166 tinted_resources_.clear(); 164 tinted_resources_.clear();
167 } 165 }
168 166
169 void ResourceManagerImpl::PreloadResource(AndroidResourceType res_type, 167 void ResourceManagerImpl::PreloadResource(AndroidResourceType res_type,
170 int res_id) { 168 int res_id) {
171 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST); 169 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
172 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST); 170 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
173 171
174 // Don't send out a query if the resource is already loaded. 172 // Don't send out a query if the resource is already loaded.
175 if (resources_[res_type].find(res_id) != resources_[res_type].end()) 173 if (resources_[res_type].find(res_id) != resources_[res_type].end())
176 return; 174 return;
177 175
178 PreloadResourceFromJava(res_type, res_id); 176 PreloadResourceFromJava(res_type, res_id);
179 } 177 }
180 178
181 void ResourceManagerImpl::OnResourceReady(JNIEnv* env, 179 void ResourceManagerImpl::OnResourceReady(JNIEnv* env,
182 const JavaRef<jobject>& jobj, 180 const JavaRef<jobject>& jobj,
183 jint res_type, 181 jint res_type,
184 jint res_id, 182 jint res_id,
185 const JavaRef<jobject>& bitmap, 183 const JavaRef<jobject>& bitmap,
186 jint padding_left, 184 jlong native_resource) {
187 jint padding_top,
188 jint padding_right,
189 jint padding_bottom,
190 jint aperture_left,
191 jint aperture_top,
192 jint aperture_right,
193 jint aperture_bottom) {
194 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST); 185 DCHECK_GE(res_type, ANDROID_RESOURCE_TYPE_FIRST);
195 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST); 186 DCHECK_LE(res_type, ANDROID_RESOURCE_TYPE_LAST);
196 TRACE_EVENT2("ui", "ResourceManagerImpl::OnResourceReady", 187 TRACE_EVENT2("ui", "ResourceManagerImpl::OnResourceReady",
197 "resource_type", res_type, 188 "resource_type", res_type,
198 "resource_id", res_id); 189 "resource_id", res_id);
199 190
200 std::unordered_map<int, std::unique_ptr<Resource>>::iterator item = 191 resources_[res_type][res_id] =
201 resources_[res_type].find(res_id); 192 base::WrapUnique(reinterpret_cast<Resource*>(native_resource));
202 if (item == resources_[res_type].end()) {
203 resources_[res_type][res_id] = base::MakeUnique<Resource>();
204 }
205
206 Resource* resource = resources_[res_type][res_id].get(); 193 Resource* resource = resources_[res_type][res_id].get();
207 194
208 gfx::JavaBitmap jbitmap(bitmap); 195 gfx::JavaBitmap jbitmap(bitmap);
209 resource->size = jbitmap.size();
210 resource->padding.SetRect(padding_left, padding_top,
211 padding_right - padding_left,
212 padding_bottom - padding_top);
213 resource->aperture.SetRect(aperture_left, aperture_top,
214 aperture_right - aperture_left,
215 aperture_bottom - aperture_top);
216
217 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(jbitmap); 196 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(jbitmap);
218 skbitmap.setImmutable(); 197 skbitmap.setImmutable();
219 resource->ui_resource = cc::ScopedUIResource::Create( 198 resource->SetUIResource(
220 ui_resource_manager_, cc::UIResourceBitmap(skbitmap)); 199 cc::ScopedUIResource::Create(ui_resource_manager_,
200 cc::UIResourceBitmap(skbitmap)),
201 jbitmap.size());
221 } 202 }
222 203
223 void ResourceManagerImpl::RemoveResource( 204 void ResourceManagerImpl::RemoveResource(
224 JNIEnv* env, 205 JNIEnv* env,
225 const base::android::JavaRef<jobject>& jobj, 206 const base::android::JavaRef<jobject>& jobj,
226 jint res_type, 207 jint res_type,
227 jint res_id) { 208 jint res_id) {
228 resources_[res_type].erase(res_id); 209 resources_[res_type].erase(res_id);
229 } 210 }
230 211
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 TRACE_EVENT2("ui", 357 TRACE_EVENT2("ui",
377 "ResourceManagerImpl::RequestCrushedSpriteResourceFromJava", 358 "ResourceManagerImpl::RequestCrushedSpriteResourceFromJava",
378 "bitmap_res_id", bitmap_res_id, 359 "bitmap_res_id", bitmap_res_id,
379 "metadata_res_id", metadata_res_id); 360 "metadata_res_id", metadata_res_id);
380 Java_ResourceManager_crushedSpriteResourceRequested( 361 Java_ResourceManager_crushedSpriteResourceRequested(
381 base::android::AttachCurrentThread(), java_obj_, bitmap_res_id, 362 base::android::AttachCurrentThread(), java_obj_, bitmap_res_id,
382 metadata_res_id, reloading); 363 metadata_res_id, reloading);
383 } 364 }
384 365
385 } // namespace ui 366 } // namespace ui
OLDNEW
« no previous file with comments | « ui/android/resources/resource_manager_impl.h ('k') | ui/android/resources/resource_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698