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

Unified Diff: ui/android/resources/resource_manager_impl.cc

Issue 1337703002: [Contextual Search] Add support for crushed sprites and animate the search provider icon (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Very small changes from last pedrosimonneti@ review Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698