Add bitmap utils for Chrome on Android

BUG=115372


Review URL: https://chromiumcodereview.appspot.com/10823094

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@150231 0039d316-1c4b-4281-b951-d872f2087c98
parent 7e6606d9
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "media/base/android/media_jni_registrar.h" #include "media/base/android/media_jni_registrar.h"
#include "net/android/net_jni_registrar.h" #include "net/android/net_jni_registrar.h"
#include "jni/LibraryLoader_jni.h" #include "jni/LibraryLoader_jni.h"
#include "ui/gfx/android/gfx_jni_registrar.h"
namespace { namespace {
base::AtExitManager* g_at_exit_manager = NULL; base::AtExitManager* g_at_exit_manager = NULL;
...@@ -77,6 +78,9 @@ static jboolean LibraryLoadedOnMainThread(JNIEnv* env, jclass clazz, ...@@ -77,6 +78,9 @@ static jboolean LibraryLoadedOnMainThread(JNIEnv* env, jclass clazz,
if (!media::RegisterJni(env)) if (!media::RegisterJni(env))
return JNI_FALSE; return JNI_FALSE;
if (!gfx::RegisterJni(env))
return JNI_FALSE;
return JNI_TRUE; return JNI_TRUE;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/android/gfx_jni_registrar.h"
namespace gfx {
void RegisterBitmapAndroid(JNIEnv* env);
bool RegisterJni(JNIEnv* env) {
RegisterBitmapAndroid(env);
return true;
}
} // namespace gfx
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GFX_ANDROID_GFX_JNI_REGISTRAR_H_
#define UI_GFX_ANDROID_GFX_JNI_REGISTRAR_H_
#include <jni.h>
namespace gfx {
// Register all JNI bindings necessary for gfx.
bool RegisterJni(JNIEnv* env);
} // namespace gfx
#endif // UI_GFX_ANDROID_GFX_JNI_REGISTRAR_H_
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/android/java_bitmap.h"
#include <android/bitmap.h>
#include "base/android/jni_android.h"
#include "base/logging.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 {
JavaBitmap::JavaBitmap(jobject bitmap)
: bitmap_(bitmap),
pixels_(NULL) {
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);
DCHECK(!err);
return gfx::Size(info.width, info.height);
}
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);
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)));
}
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);
}
ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap) {
DCHECK(skbitmap);
DCHECK_EQ(skbitmap->bytesPerPixel(), 4);
ScopedJavaLocalRef<jobject> jbitmap =
CreateJavaBitmap(gfx::Size(skbitmap->width(), skbitmap->height()));
SkAutoLockPixels src_lock(*skbitmap);
JavaBitmap dst_lock(jbitmap.obj());
void* src_pixels = skbitmap->getPixels();
void* dst_pixels = dst_lock.pixels();
memcpy(dst_pixels, src_pixels, skbitmap->getSize());
return jbitmap;
}
} // namespace gfx
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GFX_ANDROID_JAVA_BITMAP_H_
#define UI_GFX_ANDROID_JAVA_BITMAP_H_
#include "base/android/scoped_java_ref.h"
#include "ui/gfx/size.h"
class SkBitmap;
namespace gfx {
// This class wraps a JNI AndroidBitmap object to make it easier to use. It
// handles locking and unlocking of the underlying pixels, along with wrapping
// various JNI methods.
UI_EXPORT class JavaBitmap {
public:
explicit JavaBitmap(jobject bitmap);
~JavaBitmap();
void* pixels() { return pixels_; }
gfx::Size Size() const;
// Formats are in android/bitmap.h; e.g. ANDROID_BITMAP_FORMAT_RGBA_8888
int Format() const;
uint32_t Stride() const;
private:
jobject bitmap_;
void* pixels_;
DISALLOW_COPY_AND_ASSIGN(JavaBitmap);
};
base::android::ScopedJavaLocalRef<jobject> CreateJavaBitmap(
const gfx::Size& size);
base::android::ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(
const SkBitmap* skbitmap);
} // namespace gfx
#endif // UI_GFX_ANDROID_JAVA_BITMAP_H_
...@@ -330,6 +330,10 @@ ...@@ -330,6 +330,10 @@
'base/x/x11_util.cc', 'base/x/x11_util.cc',
'base/x/x11_util.h', 'base/x/x11_util.h',
'base/x/x11_util_internal.h', 'base/x/x11_util_internal.h',
'gfx/android/gfx_jni_registrar.cc',
'gfx/android/gfx_jni_registrar.h',
'gfx/android/java_bitmap.cc',
'gfx/android/java_bitmap.h',
'gfx/blit.cc', 'gfx/blit.cc',
'gfx/blit.h', 'gfx/blit.h',
'gfx/canvas.cc', 'gfx/canvas.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment