| Index: ui/gfx/android/java_bitmap.cc
|
| diff --git a/ui/gfx/android/java_bitmap.cc b/ui/gfx/android/java_bitmap.cc
|
| index 0cfcf8bb531e378946822b6e80c88f1e380bc4a1..a0aff14f6fcabc80d0447f6e50dbe5dc5d884783 100644
|
| --- a/ui/gfx/android/java_bitmap.cc
|
| +++ b/ui/gfx/android/java_bitmap.cc
|
| @@ -6,23 +6,12 @@
|
|
|
| #include <android/bitmap.h>
|
|
|
| -#include "base/android/jni_android.h"
|
| #include "base/logging.h"
|
| +#include "jni/BitmapHelper_jni.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| #include "ui/gfx/size.h"
|
|
|
| using base::android::AttachCurrentThread;
|
| -using base::android::GetClass;
|
| -using base::android::GetMethodID;
|
| -using base::android::GetStaticFieldID;
|
| -using base::android::GetStaticMethodID;
|
| -using base::android::ScopedJavaLocalRef;
|
| -
|
| -namespace {
|
| -static jclass g_AndroidBitmap_clazz = NULL;
|
| -static jmethodID g_AndroidBitmap_createBitmap_method = NULL;
|
| -static jobject g_BitmapConfig_ARGB8888 = NULL;
|
| -} // anonymous namespace
|
|
|
| namespace gfx {
|
|
|
| @@ -32,55 +21,27 @@ JavaBitmap::JavaBitmap(jobject bitmap)
|
| int err = AndroidBitmap_lockPixels(AttachCurrentThread(), bitmap_, &pixels_);
|
| DCHECK(!err);
|
| DCHECK(pixels_);
|
| -}
|
|
|
| -JavaBitmap::~JavaBitmap() {
|
| - int err = AndroidBitmap_unlockPixels(AttachCurrentThread(), bitmap_);
|
| - DCHECK(!err);
|
| -}
|
| -
|
| -gfx::Size JavaBitmap::Size() const {
|
| AndroidBitmapInfo info;
|
| - int err = AndroidBitmap_getInfo(AttachCurrentThread(), bitmap_, &info);
|
| + err = AndroidBitmap_getInfo(AttachCurrentThread(), bitmap_, &info);
|
| DCHECK(!err);
|
| - return gfx::Size(info.width, info.height);
|
| + size_ = gfx::Size(info.width, info.height);
|
| + format_ = info.format;
|
| + stride_ = info.stride;
|
| }
|
|
|
| -int JavaBitmap::Format() const {
|
| - AndroidBitmapInfo info;
|
| - int err = AndroidBitmap_getInfo(AttachCurrentThread(), bitmap_, &info);
|
| - DCHECK(!err);
|
| - return info.format;
|
| -}
|
| -
|
| -uint32_t JavaBitmap::Stride() const {
|
| - AndroidBitmapInfo info;
|
| - int err = AndroidBitmap_getInfo(AttachCurrentThread(), bitmap_, &info);
|
| +JavaBitmap::~JavaBitmap() {
|
| + int err = AndroidBitmap_unlockPixels(AttachCurrentThread(), bitmap_);
|
| DCHECK(!err);
|
| - return info.stride;
|
| }
|
|
|
| void RegisterBitmapAndroid(JNIEnv* env) {
|
| - g_AndroidBitmap_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
|
| - base::android::GetUnscopedClass(env, "android/graphics/Bitmap")));
|
| - ScopedJavaLocalRef<jclass> bitmapConfig_clazz = base::android::GetClass(
|
| - env, "android/graphics/Bitmap$Config");
|
| - g_AndroidBitmap_createBitmap_method = GetStaticMethodID(env,
|
| - g_AndroidBitmap_clazz, "createBitmap",
|
| - "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
|
| - jfieldID argb_8888_id = GetStaticFieldID(env, bitmapConfig_clazz, "ARGB_8888",
|
| - "Landroid/graphics/Bitmap$Config;");
|
| - g_BitmapConfig_ARGB8888 = reinterpret_cast<jobject>(env->NewGlobalRef(
|
| - env->GetStaticObjectField(bitmapConfig_clazz.obj(), argb_8888_id)));
|
| + ui::RegisterNativesImpl(env);
|
| }
|
|
|
| ScopedJavaLocalRef<jobject> CreateJavaBitmap(const gfx::Size& size) {
|
| - DCHECK(g_AndroidBitmap_clazz);
|
| - JNIEnv* env = AttachCurrentThread();
|
| - jobject bitmap_object = env->CallStaticObjectMethod(g_AndroidBitmap_clazz,
|
| - g_AndroidBitmap_createBitmap_method, size.width(), size.height(),
|
| - g_BitmapConfig_ARGB8888);
|
| - return ScopedJavaLocalRef<jobject>(env, bitmap_object);
|
| + return ui::Java_BitmapHelper_createBitmap(AttachCurrentThread(),
|
| + size.width(), size.height());
|
| }
|
|
|
| ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap) {
|
| @@ -98,4 +59,35 @@ ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap) {
|
| return jbitmap;
|
| }
|
|
|
| +static ScopedJavaLocalRef<jobject> CreateJavaBitmapFromResource(
|
| + const char* name) {
|
| + JNIEnv* env = AttachCurrentThread();
|
| + ScopedJavaLocalRef<jstring> jname(env, env->NewStringUTF(name));
|
| + return ui::Java_BitmapHelper_decodeDrawableResource(env, jname.obj());
|
| +}
|
| +
|
| +static SkBitmap ConvertToSkBitmap(ScopedJavaLocalRef<jobject> jbitmap) {
|
| + JavaBitmap src_lock(jbitmap.obj());
|
| + DCHECK_EQ(src_lock.format(), ANDROID_BITMAP_FORMAT_RGBA_8888);
|
| +
|
| + gfx::Size src_size = src_lock.size();
|
| +
|
| + SkBitmap skbitmap;
|
| + skbitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| + src_size.width(), src_size.height(), src_lock.stride());
|
| + skbitmap.allocPixels();
|
| + SkAutoLockPixels dst_lock(skbitmap);
|
| +
|
| + void* src_pixels = src_lock.pixels();
|
| + void* dst_pixels = skbitmap.getPixels();
|
| +
|
| + memcpy(dst_pixels, src_pixels, skbitmap.getSize());
|
| +
|
| + return skbitmap;
|
| +}
|
| +
|
| +SkBitmap CreateSkBitmapFromResource(const char* name) {
|
| + return ConvertToSkBitmap(CreateJavaBitmapFromResource(name));
|
| +}
|
| +
|
| } // namespace gfx
|
|
|