Index: ui/android/resources/resource_manager_impl.cc |
diff --git a/ui/android/resources/resource_manager_impl.cc b/ui/android/resources/resource_manager_impl.cc |
index 37f9aeaedb87a1fddb484ccbb20169d576d81d8b..3c1f1a8a58cd448903f18b3e3b8ba84d5aa7e074 100644 |
--- a/ui/android/resources/resource_manager_impl.cc |
+++ b/ui/android/resources/resource_manager_impl.cc |
@@ -4,12 +4,19 @@ |
#include "ui/android/resources/resource_manager_impl.h" |
+#include <utility> |
+#include <vector> |
+ |
+#include "base/android/jni_array.h" |
#include "base/android/jni_string.h" |
#include "base/trace_event/trace_event.h" |
#include "cc/resources/scoped_ui_resource.h" |
#include "jni/ResourceManager_jni.h" |
#include "ui/android/resources/ui_resource_provider.h" |
#include "ui/gfx/android/java_bitmap.h" |
+#include "ui/gfx/geometry/rect.h" |
+ |
+using base::android::JavaArrayOfIntArrayToIntVector; |
namespace ui { |
@@ -113,6 +120,96 @@ void ResourceManagerImpl::OnResourceReady(JNIEnv* env, |
cc::ScopedUIResource::Create(host_, cc::UIResourceBitmap(skbitmap)); |
} |
+CrushedSpriteResource* ResourceManagerImpl::GetCrushedSpriteResource( |
+ int bitmap_res_id, int metadata_res_id) { |
+ CrushedSpriteResource* resource = |
+ crushed_sprite_resources_.Lookup(bitmap_res_id); |
+ if (!resource) { |
+ RequestCrushedSpriteResourceFromJava(bitmap_res_id, metadata_res_id, false); |
+ resource = crushed_sprite_resources_.Lookup(bitmap_res_id); |
+ } else if (resource->BitmapHasBeenEvictedFromMemory()) { |
+ RequestCrushedSpriteResourceFromJava(bitmap_res_id, metadata_res_id, true); |
+ } |
+ |
+ return resource; |
+} |
+ |
+void ResourceManagerImpl::OnCrushedSpriteResourceReady( |
+ JNIEnv* env, |
+ jobject jobj, |
+ jint bitmap_res_id, |
+ jobject bitmap, |
+ jobjectArray frame_rects, |
+ jint sprite_width, |
+ jint sprite_height) { |
+ |
+ // Construct source and destination rectangles for each frame from |
+ // |frame_rects|. |
+ std::vector<std::vector<int>> all_frame_rects_vector; |
+ JavaArrayOfIntArrayToIntVector(env, frame_rects, &all_frame_rects_vector); |
+ CrushedSpriteResource::SrcDstRects src_dst_rects = |
+ ProcessCrushedSpriteFrameRects(all_frame_rects_vector); |
+ |
+ SkBitmap skbitmap = |
+ gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(bitmap)); |
+ |
+ CrushedSpriteResource* resource = new CrushedSpriteResource( |
+ skbitmap, |
+ src_dst_rects, |
+ gfx::Size(sprite_width, sprite_height)); |
+ |
+ if (crushed_sprite_resources_.Lookup(bitmap_res_id)) { |
+ crushed_sprite_resources_.Replace(bitmap_res_id, resource); |
+ } else { |
+ crushed_sprite_resources_.AddWithID(resource, bitmap_res_id); |
+ } |
+} |
+ |
+CrushedSpriteResource::SrcDstRects |
+ResourceManagerImpl::ProcessCrushedSpriteFrameRects( |
+ std::vector<std::vector<int>> frame_rects_vector) { |
+ CrushedSpriteResource::SrcDstRects src_dst_rects; |
+ for (size_t i = 0; i < frame_rects_vector.size(); ++i) { |
+ std::vector<int> frame_ints = frame_rects_vector[i]; |
+ CrushedSpriteResource::FrameSrcDstRects frame_src_dst_rects; |
+ |
+ // Create source and destination gfx::Rect's for each rectangle in |
+ // |frame_ints|. Each rectangle consists of 6 values: |
+ // i: destination x i+1: destination y i+2: source x i+3: source y |
+ // i+4: width i+5: height |
+ for (size_t j = 0; j < frame_ints.size(); j += 6) { |
+ gfx::Rect sprite_rect_destination(frame_ints[j], |
+ frame_ints[j+1], |
+ frame_ints[j+4], |
+ frame_ints[j+5]); |
+ gfx::Rect sprite_rect_source(frame_ints[j+2], |
+ frame_ints[j+3], |
+ frame_ints[j+4], |
+ frame_ints[j+5]); |
+ frame_src_dst_rects.push_back(std::pair<gfx::Rect, gfx::Rect>( |
+ sprite_rect_source, sprite_rect_destination)); |
+ } |
+ src_dst_rects.push_back(frame_src_dst_rects); |
+ } |
+ return src_dst_rects; |
+} |
+ |
+void ResourceManagerImpl::OnCrushedSpriteResourceReloaded( |
+ JNIEnv* env, |
+ jobject jobj, |
+ jint bitmap_res_id, |
+ jobject bitmap) { |
+ CrushedSpriteResource* resource = |
+ crushed_sprite_resources_.Lookup(bitmap_res_id); |
+ if (!resource) { |
+ // Cannot reload a resource that has not been previously loaded. |
+ return; |
+ } |
+ SkBitmap skbitmap = |
+ gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(bitmap)); |
+ resource->SetBitmap(skbitmap); |
+} |
+ |
// static |
bool ResourceManagerImpl::RegisterResourceManager(JNIEnv* env) { |
return RegisterNativesImpl(env); |
@@ -136,4 +233,15 @@ void ResourceManagerImpl::RequestResourceFromJava(AndroidResourceType res_type, |
java_obj_.obj(), res_type, res_id); |
} |
+void ResourceManagerImpl::RequestCrushedSpriteResourceFromJava( |
+ int bitmap_res_id, int metadata_res_id, bool reloading) { |
+ TRACE_EVENT2("ui", |
+ "ResourceManagerImpl::RequestCrushedSpriteResourceFromJava", |
+ "bitmap_res_id", bitmap_res_id, |
+ "metadata_res_id", metadata_res_id); |
+ Java_ResourceManager_crushedSpriteResourceRequested( |
+ base::android::AttachCurrentThread(), java_obj_.obj(), |
+ bitmap_res_id, metadata_res_id, reloading); |
+} |
+ |
} // namespace ui |