diff options
Diffstat (limited to 'chromium/ui/gfx/android/java_bitmap.cc')
-rw-r--r-- | chromium/ui/gfx/android/java_bitmap.cc | 99 |
1 files changed, 71 insertions, 28 deletions
diff --git a/chromium/ui/gfx/android/java_bitmap.cc b/chromium/ui/gfx/android/java_bitmap.cc index 2a1be65d215..a5b891a4af7 100644 --- a/chromium/ui/gfx/android/java_bitmap.cc +++ b/chromium/ui/gfx/android/java_bitmap.cc @@ -9,11 +9,10 @@ #include "base/android/jni_string.h" #include "base/logging.h" #include "jni/BitmapHelper_jni.h" -#include "skia/ext/image_operations.h" -#include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/size.h" using base::android::AttachCurrentThread; +using base::android::ConvertUTF8ToJavaString; namespace gfx { @@ -42,17 +41,52 @@ bool JavaBitmap::RegisterJavaBitmap(JNIEnv* env) { return RegisterNativesImpl(env); } -static ScopedJavaLocalRef<jobject> CreateJavaBitmap(const gfx::Size& size) { - return Java_BitmapHelper_createBitmap(AttachCurrentThread(), - size.width(), size.height()); +static int SkBitmapConfigToBitmapFormat(SkBitmap::Config bitmap_config) { + switch (bitmap_config) { + case SkBitmap::kA8_Config: + return BITMAP_FORMAT_ALPHA_8; + case SkBitmap::kARGB_4444_Config: + return BITMAP_FORMAT_ARGB_4444; + case SkBitmap::kARGB_8888_Config: + return BITMAP_FORMAT_ARGB_8888; + case SkBitmap::kRGB_565_Config: + return BITMAP_FORMAT_RGB_565; + case SkBitmap::kNo_Config: + default: + NOTREACHED(); + return BITMAP_FORMAT_NO_CONFIG; + } +} + +ScopedJavaLocalRef<jobject> CreateJavaBitmap(int width, + int height, + SkBitmap::Config bitmap_config) { + DCHECK_GT(width, 0); + DCHECK_GT(height, 0); + int java_bitmap_config = SkBitmapConfigToBitmapFormat(bitmap_config); + return Java_BitmapHelper_createBitmap( + AttachCurrentThread(), width, height, java_bitmap_config); +} + +ScopedJavaLocalRef<jobject> CreateJavaBitmapFromAndroidResource( + const char* name, + gfx::Size size) { + DCHECK(name); + DCHECK(!size.IsEmpty()); + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jstring> jname(ConvertUTF8ToJavaString(env, name)); + return Java_BitmapHelper_decodeDrawableResource( + env, jname.obj(), size.width(), size.height()); } ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap) { DCHECK(skbitmap); - DCHECK_EQ(skbitmap->bytesPerPixel(), 4); - - ScopedJavaLocalRef<jobject> jbitmap = - CreateJavaBitmap(gfx::Size(skbitmap->width(), skbitmap->height())); + DCHECK(!skbitmap->isNull()); + SkBitmap::Config bitmap_config = skbitmap->config(); + DCHECK((bitmap_config == SkBitmap::kRGB_565_Config) || + (bitmap_config == SkBitmap::kARGB_8888_Config)); + ScopedJavaLocalRef<jobject> jbitmap = CreateJavaBitmap( + skbitmap->width(), skbitmap->height(), bitmap_config); SkAutoLockPixels src_lock(*skbitmap); JavaBitmap dst_lock(jbitmap.obj()); void* src_pixels = skbitmap->getPixels(); @@ -62,8 +96,13 @@ ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap) { return jbitmap; } -SkBitmap CreateSkBitmapFromJavaBitmap(JavaBitmap& jbitmap) { - DCHECK_EQ(jbitmap.format(), ANDROID_BITMAP_FORMAT_RGBA_8888); +SkBitmap CreateSkBitmapFromJavaBitmap(const JavaBitmap& jbitmap) { + // TODO(jdduke): Convert to DCHECK's when sufficient data has been capture for + // crbug.com/341406. + CHECK_EQ(jbitmap.format(), ANDROID_BITMAP_FORMAT_RGBA_8888); + CHECK(!jbitmap.size().IsEmpty()); + CHECK_GT(jbitmap.stride(), 0U); + CHECK(jbitmap.pixels()); gfx::Size src_size = jbitmap.size(); @@ -72,30 +111,34 @@ SkBitmap CreateSkBitmapFromJavaBitmap(JavaBitmap& jbitmap) { src_size.width(), src_size.height(), jbitmap.stride()); - skbitmap.allocPixels(); + if (!skbitmap.allocPixels()) { + LOG(FATAL) << " Failed to allocate bitmap of size " << src_size.width() + << "x" << src_size.height() << " stride=" << jbitmap.stride(); + } SkAutoLockPixels dst_lock(skbitmap); - - void* src_pixels = jbitmap.pixels(); + const void* src_pixels = jbitmap.pixels(); void* dst_pixels = skbitmap.getPixels(); - memcpy(dst_pixels, src_pixels, skbitmap.getSize()); return skbitmap; } -SkBitmap CreateSkBitmapFromResource(const char* name, gfx::Size size) { - DCHECK(!size.IsEmpty()); - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jstring> jname(env, env->NewStringUTF(name)); - ScopedJavaLocalRef<jobject> jobj(Java_BitmapHelper_decodeDrawableResource( - env, jname.obj(), size.width(), size.height())); - if (jobj.is_null()) - return SkBitmap(); - - JavaBitmap jbitmap(jobj.obj()); - SkBitmap bitmap = CreateSkBitmapFromJavaBitmap(jbitmap); - return skia::ImageOperations::Resize( - bitmap, skia::ImageOperations::RESIZE_BOX, size.width(), size.height()); +SkBitmap::Config ConvertToSkiaConfig(jobject bitmap_config) { + int jbitmap_config = Java_BitmapHelper_getBitmapFormatForConfig( + AttachCurrentThread(), bitmap_config); + switch (jbitmap_config) { + case BITMAP_FORMAT_ALPHA_8: + return SkBitmap::kA8_Config; + case BITMAP_FORMAT_ARGB_4444: + return SkBitmap::kARGB_4444_Config; + case BITMAP_FORMAT_ARGB_8888: + return SkBitmap::kARGB_8888_Config; + case BITMAP_FORMAT_RGB_565: + return SkBitmap::kRGB_565_Config; + case BITMAP_FORMAT_NO_CONFIG: + default: + return SkBitmap::kNo_Config; + } } } // namespace gfx |