summaryrefslogtreecommitdiffstats
path: root/chromium/ui/gfx/android/java_bitmap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/gfx/android/java_bitmap.cc')
-rw-r--r--chromium/ui/gfx/android/java_bitmap.cc99
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