fba158ec7b320ca7fdcbcf2539a677e2c8fcd07f
[platform/framework/web/crosswalk.git] / src / ui / gfx / android / java_bitmap.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/gfx/android/java_bitmap.h"
6
7 #include <android/bitmap.h>
8
9 #include "base/android/jni_string.h"
10 #include "base/logging.h"
11 #include "jni/BitmapHelper_jni.h"
12 #include "skia/ext/image_operations.h"
13 #include "third_party/skia/include/core/SkBitmap.h"
14 #include "ui/gfx/size.h"
15
16 using base::android::AttachCurrentThread;
17
18 namespace gfx {
19
20 JavaBitmap::JavaBitmap(jobject bitmap)
21     : bitmap_(bitmap),
22       pixels_(NULL) {
23   int err = AndroidBitmap_lockPixels(AttachCurrentThread(), bitmap_, &pixels_);
24   DCHECK(!err);
25   DCHECK(pixels_);
26
27   AndroidBitmapInfo info;
28   err = AndroidBitmap_getInfo(AttachCurrentThread(), bitmap_, &info);
29   DCHECK(!err);
30   size_ = gfx::Size(info.width, info.height);
31   format_ = info.format;
32   stride_ = info.stride;
33 }
34
35 JavaBitmap::~JavaBitmap() {
36   int err = AndroidBitmap_unlockPixels(AttachCurrentThread(), bitmap_);
37   DCHECK(!err);
38 }
39
40 // static
41 bool JavaBitmap::RegisterJavaBitmap(JNIEnv* env) {
42   return RegisterNativesImpl(env);
43 }
44
45 static ScopedJavaLocalRef<jobject> CreateJavaBitmap(int width, int height,
46                                                     bool is565_config) {
47   return Java_BitmapHelper_createBitmap(AttachCurrentThread(),
48       width, height, is565_config);
49 }
50
51 ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap) {
52   DCHECK(skbitmap);
53   SkBitmap::Config config = skbitmap->getConfig();
54   DCHECK((config == SkBitmap::kRGB_565_Config) ||
55          (config == SkBitmap::kARGB_8888_Config));
56   // If the Config is not RGB565 it is default i.e ARGB8888
57   ScopedJavaLocalRef<jobject> jbitmap =
58       CreateJavaBitmap(skbitmap->width(), skbitmap->height(),
59                        (config == SkBitmap::kRGB_565_Config));
60   SkAutoLockPixels src_lock(*skbitmap);
61   JavaBitmap dst_lock(jbitmap.obj());
62   void* src_pixels = skbitmap->getPixels();
63   void* dst_pixels = dst_lock.pixels();
64   memcpy(dst_pixels, src_pixels, skbitmap->getSize());
65
66   return jbitmap;
67 }
68
69 SkBitmap CreateSkBitmapFromJavaBitmap(JavaBitmap& jbitmap) {
70   DCHECK_EQ(jbitmap.format(), ANDROID_BITMAP_FORMAT_RGBA_8888);
71
72   gfx::Size src_size = jbitmap.size();
73
74   SkBitmap skbitmap;
75   skbitmap.setConfig(SkBitmap::kARGB_8888_Config,
76                      src_size.width(),
77                      src_size.height(),
78                      jbitmap.stride());
79   skbitmap.allocPixels();
80   SkAutoLockPixels dst_lock(skbitmap);
81
82   void* src_pixels = jbitmap.pixels();
83   void* dst_pixels = skbitmap.getPixels();
84
85   memcpy(dst_pixels, src_pixels, skbitmap.getSize());
86
87   return skbitmap;
88 }
89
90 SkBitmap CreateSkBitmapFromResource(const char* name, gfx::Size size) {
91   DCHECK(!size.IsEmpty());
92   JNIEnv* env = AttachCurrentThread();
93   ScopedJavaLocalRef<jstring> jname(env, env->NewStringUTF(name));
94   ScopedJavaLocalRef<jobject> jobj(Java_BitmapHelper_decodeDrawableResource(
95       env, jname.obj(), size.width(), size.height()));
96   if (jobj.is_null())
97     return SkBitmap();
98
99   JavaBitmap jbitmap(jobj.obj());
100   SkBitmap bitmap = CreateSkBitmapFromJavaBitmap(jbitmap);
101   return skia::ImageOperations::Resize(
102       bitmap, skia::ImageOperations::RESIZE_BOX, size.width(), size.height());
103 }
104
105 }  //  namespace gfx