Bitmap.cpp revision 57ee620ced8caed1eb8651717f6a6d2d5f1f9a5b
132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkBitmap.h" 232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkPixelRef.h" 332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkImageEncoder.h" 457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III#include "SkImageInfo.h" 532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkColorPriv.h" 632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "GraphicsJNI.h" 732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkDither.h" 832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkUnPreMultiply.h" 932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkStream.h" 1032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 1132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include <binder/Parcel.h> 1232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "android_os_Parcel.h" 1332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "android_util_Binder.h" 1432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "android_nio_utils.h" 1532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "CreateJavaOutputStreamAdaptor.h" 1632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 1732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include <jni.h> 1832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 1932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include <Caches.h> 2032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 2132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#if 0 2232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik #define TRACE_BITMAP(code) code 2332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#else 2432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik #define TRACE_BITMAP(code) 2532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#endif 2632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 2732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 2832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// Conversions to/from SkColor, for get/setPixels, and the create method, which 2932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// is basically like setPixels 3032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 3132054b0b3edb350a5444c47753b2982312dd7ffdChris Craiktypedef void (*FromColorProc)(void* dst, const SkColor src[], int width, 3232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y); 3332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 3432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D32(void* dst, const SkColor src[], int width, 3532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int, int) { 3632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor* d = (SkPMColor*)dst; 3732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 3832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int i = 0; i < width; i++) { 3932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkPreMultiplyColor(*src++); 4032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 4132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 4232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 4332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D32_Raw(void* dst, const SkColor src[], int width, 4432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int, int) { 4532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // SkColor's ordering may be different from SkPMColor 4632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (SK_COLOR_MATCHES_PMCOLOR_BYTE_ORDER) { 4732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(dst, src, width * sizeof(SkColor)); 4832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 4932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 5032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 5132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // order isn't same, repack each pixel manually 5232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor* d = (SkPMColor*)dst; 5332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int i = 0; i < width; i++) { 5432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor c = *src++; 5532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkPackARGB32NoCheck(SkColorGetA(c), SkColorGetR(c), 5632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorGetG(c), SkColorGetB(c)); 5732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 5832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 5932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 6032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D565(void* dst, const SkColor src[], int width, 6132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y) { 6232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik uint16_t* d = (uint16_t*)dst; 6332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 6432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_565_SCAN(y); 6532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int stop = x + width; x < stop; x++) { 6632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor c = *src++; 6732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkDitherRGBTo565(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), 6832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_VALUE(x)); 6932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 7032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 7132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 7232054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D4444(void* dst, const SkColor src[], int width, 7332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y) { 7432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor16* d = (SkPMColor16*)dst; 7532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 7632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_4444_SCAN(y); 7732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int stop = x + width; x < stop; x++) { 7832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor pmc = SkPreMultiplyColor(*src++); 7932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkDitherARGB32To4444(pmc, DITHER_VALUE(x)); 8032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// *d++ = SkPixel32ToPixel4444(pmc); 8132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 8232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 8332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 8432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D4444_Raw(void* dst, const SkColor src[], int width, 8532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y) { 8632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor16* d = (SkPMColor16*)dst; 8732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 8832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_4444_SCAN(y); 8932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int stop = x + width; x < stop; x++) { 9032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor c = *src++; 9132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 9232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // SkPMColor is used because the ordering is ARGB32, even though the target actually premultiplied 9332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor pmc = SkPackARGB32NoCheck(SkColorGetA(c), SkColorGetR(c), 9432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorGetG(c), SkColorGetB(c)); 9532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkDitherARGB32To4444(pmc, DITHER_VALUE(x)); 9632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// *d++ = SkPixel32ToPixel4444(pmc); 9732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 9832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 9932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 10032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// can return NULL 10157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) { 10257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (bitmap.colorType()) { 10357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kN32_SkColorType: 10457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D32 : FromColor_D32_Raw; 10557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kARGB_4444_SkColorType: 10657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D4444 : 10757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III FromColor_D4444_Raw; 10857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kRGB_565_SkColorType: 10932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return FromColor_D565; 11032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik default: 11132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 11232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 11332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 11432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 11532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 11632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikbool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int srcStride, 11757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III int x, int y, int width, int height, const SkBitmap& dstBitmap) { 11832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(dstBitmap); 11932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik void* dst = dstBitmap.getPixels(); 12057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III FromColorProc proc = ChooseFromColorProc(dstBitmap); 12132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 12232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == dst || NULL == proc) { 12332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return false; 12432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 12532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 12632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const jint* array = env->GetIntArrayElements(srcColors, NULL); 12732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkColor* src = (const SkColor*)array + srcOffset; 12832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 12932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // reset to to actual choice from caller 13032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik dst = dstBitmap.getAddr(x, y); 13132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // now copy/convert each scanline 13232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int y = 0; y < height; y++) { 13332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(dst, src, width, x, y); 13432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik src += srcStride; 13532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik dst = (char*)dst + dstBitmap.rowBytes(); 13632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 13732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 13832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik dstBitmap.notifyPixelsChanged(); 13932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 14032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik env->ReleaseIntArrayElements(srcColors, const_cast<jint*>(array), 14132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik JNI_ABORT); 14232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return true; 14332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 14432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 14532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik//////////////////// ToColor procs 14632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 14732054b0b3edb350a5444c47753b2982312dd7ffdChris Craiktypedef void (*ToColorProc)(SkColor dst[], const void* src, int width, 14832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*); 14932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 15032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S32_Alpha(SkColor dst[], const void* src, int width, 15132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 15232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 15332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* s = (const SkPMColor*)src; 15432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 15532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkUnPreMultiply::PMColorToColor(*s++); 15632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 15732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 15832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 15932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S32_Raw(SkColor dst[], const void* src, int width, 16032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 16132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 16232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* s = (const SkPMColor*)src; 16332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 16432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = *s++; 16532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c), 16632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedG32(c), SkGetPackedB32(c)); 16732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 16832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 16932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 17032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S32_Opaque(SkColor dst[], const void* src, int width, 17132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 17232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 17332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* s = (const SkPMColor*)src; 17432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 17532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = *s++; 17632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 17732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedB32(c)); 17832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 17932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 18032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 18132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width, 18232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 18332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 18432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor16* s = (const SkPMColor16*)src; 18532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 18632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkUnPreMultiply::PMColorToColor(SkPixel4444ToPixel32(*s++)); 18732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 18832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 18932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 19032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S4444_Raw(SkColor dst[], const void* src, int width, 19132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 19232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 19332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor16* s = (const SkPMColor16*)src; 19432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 19532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = SkPixel4444ToPixel32(*s++); 19632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c), 19732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedG32(c), SkGetPackedB32(c)); 19832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 19932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 20032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 20132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width, 20232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 20332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 20432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor16* s = (const SkPMColor16*)src; 20532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 20632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = SkPixel4444ToPixel32(*s++); 20732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 20832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedB32(c)); 20932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 21032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 21132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 21232054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S565(SkColor dst[], const void* src, int width, 21332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 21432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 21532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint16_t* s = (const uint16_t*)src; 21632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 21732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik uint16_t c = *s++; 21832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkPacked16ToR32(c), SkPacked16ToG32(c), 21932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPacked16ToB32(c)); 22032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 22132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 22232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 22332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width, 22432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable) { 22532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 22632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint8_t* s = (const uint8_t*)src; 22732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* colors = ctable->lockColors(); 22832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 22932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkUnPreMultiply::PMColorToColor(colors[*s++]); 23032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 23132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable->unlockColors(); 23232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 23332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 23432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_SI8_Raw(SkColor dst[], const void* src, int width, 23532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable) { 23632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 23732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint8_t* s = (const uint8_t*)src; 23832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* colors = ctable->lockColors(); 23932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 24032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = colors[*s++]; 24132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c), 24232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedG32(c), SkGetPackedB32(c)); 24332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 24432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable->unlockColors(); 24532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 24632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 24732054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width, 24832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable) { 24932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 25032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint8_t* s = (const uint8_t*)src; 25132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* colors = ctable->lockColors(); 25232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 25332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = colors[*s++]; 25432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 25532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedB32(c)); 25632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 25732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable->unlockColors(); 25832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 25932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 26032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// can return NULL 26157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic ToColorProc ChooseToColorProc(const SkBitmap& src) { 262b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed switch (src.colorType()) { 263b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kN32_SkColorType: 26457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (src.alphaType()) { 26557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kOpaque_SkAlphaType: 26657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S32_Opaque; 26757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kPremul_SkAlphaType: 26857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S32_Alpha; 26957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kUnpremul_SkAlphaType: 27057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S32_Raw; 27157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III default: 27257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return NULL; 27357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 274b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kARGB_4444_SkColorType: 27557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (src.alphaType()) { 27657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kOpaque_SkAlphaType: 27757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S4444_Opaque; 27857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kPremul_SkAlphaType: 27957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S4444_Alpha; 28057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kUnpremul_SkAlphaType: 28157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S4444_Raw; 28257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III default: 28357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return NULL; 28457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 285b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kRGB_565_SkColorType: 28632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return ToColor_S565; 287b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kIndex_8_SkColorType: 28832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (src.getColorTable() == NULL) { 28932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 29032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 29157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (src.alphaType()) { 29257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kOpaque_SkAlphaType: 29357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_SI8_Opaque; 29457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kPremul_SkAlphaType: 29557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_SI8_Alpha; 29657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kUnpremul_SkAlphaType: 29757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_SI8_Raw; 29857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III default: 29957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return NULL; 30057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 30132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik default: 30232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 30332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 30432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 30532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 30632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 30732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 30832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 30932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 31032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic int getPremulBitmapCreateFlags(bool isMutable) { 31132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int flags = GraphicsJNI::kBitmapCreateFlag_Premultiplied; 31232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (isMutable) flags |= GraphicsJNI::kBitmapCreateFlag_Mutable; 31332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return flags; 31432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 31532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 31632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, 31732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint offset, jint stride, jint width, jint height, 31832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint configHandle, jboolean isMutable) { 319b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed SkColorType colorType = SkBitmapConfigToColorType(static_cast<SkBitmap::Config>(configHandle)); 32032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != jColors) { 32132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t n = env->GetArrayLength(jColors); 32232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (n < SkAbs32(stride) * (size_t)height) { 32332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowAIOOBE(env); 32432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 32532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 32632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 32732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 32832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // ARGB_4444 is a deprecated format, convert automatically to 8888 329b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (colorType == kARGB_4444_SkColorType) { 330b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed colorType = kN32_SkColorType; 33132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 33232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 33332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap bitmap; 334b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed bitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType)); 33532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 33632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jbyteArray buff = GraphicsJNI::allocateJavaPixelRef(env, &bitmap, NULL); 33732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == buff) { 33832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 33932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 34032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 34132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (jColors != NULL) { 34232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik GraphicsJNI::SetPixels(env, jColors, offset, stride, 34357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III 0, 0, width, height, bitmap); 34432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 34532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 34632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), buff, 34732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik getPremulBitmapCreateFlags(isMutable), NULL, NULL); 34832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 34932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 35032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle, 35132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint dstConfigHandle, jboolean isMutable) { 35232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* src = reinterpret_cast<SkBitmap*>(srcHandle); 35332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap::Config dstConfig = static_cast<SkBitmap::Config>(dstConfigHandle); 35432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap result; 35532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik JavaPixelAllocator allocator(env); 35632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 357cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins if (!src->copyTo(&result, SkBitmapConfigToColorType(dstConfig), &allocator)) { 35832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 35932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 36032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, new SkBitmap(result), allocator.getStorageObj(), 36132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik getPremulBitmapCreateFlags(isMutable), NULL, NULL); 36232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 36332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 36432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_destructor(JNIEnv* env, jobject, jlong bitmapHandle) { 36532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 36632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#ifdef USE_OPENGL_RENDERER 36732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (android::uirenderer::Caches::hasInstance()) { 36832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::uirenderer::Caches::getInstance().resourceCache.destructor(bitmap); 36932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 37032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 37132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#endif // USE_OPENGL_RENDERER 37232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete bitmap; 37332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 37432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 37532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) { 37632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 37732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#ifdef USE_OPENGL_RENDERER 37832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (android::uirenderer::Caches::hasInstance()) { 37932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bool result; 38032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik result = android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); 38132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return result ? JNI_TRUE : JNI_FALSE; 38232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 38332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#endif // USE_OPENGL_RENDERER 38432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->setPixels(NULL, NULL); 38532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_TRUE; 38632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 38732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 38832054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_reconfigure(JNIEnv* env, jobject clazz, jlong bitmapHandle, 38917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III jint width, jint height, jint configHandle, jint allocSize, 39017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III jboolean requestPremul) { 39132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 39232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap::Config config = static_cast<SkBitmap::Config>(configHandle); 39317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III SkColorType colorType = SkBitmapConfigToColorType(config); 39417a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III 39517a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // ARGB_4444 is a deprecated format, convert automatically to 8888 39617a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III if (colorType == kARGB_4444_SkColorType) { 39717a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III colorType = kN32_SkColorType; 39817a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III } 39917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III 40017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III if (width * height * SkColorTypeBytesPerPixel(colorType) > allocSize) { 40132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // done in native as there's no way to get BytesPerPixel in Java 40232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowIAE(env, "Bitmap not large enough to support new configuration"); 40332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 40432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 40532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPixelRef* ref = bitmap->pixelRef(); 40617a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III ref->ref(); 40717a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III SkAlphaType alphaType; 40817a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III if (bitmap->colorType() != kRGB_565_SkColorType 40917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III && bitmap->alphaType() == kOpaque_SkAlphaType) { 41017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // If the original bitmap was set to opaque, keep that setting, unless it 41117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // was 565, which is required to be opaque. 41217a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III alphaType = kOpaque_SkAlphaType; 41317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III } else { 41417a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // Otherwise respect the premultiplied request. 41517a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III alphaType = requestPremul ? kPremul_SkAlphaType : kUnpremul_SkAlphaType; 41617a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III } 41717a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType)); 41817a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // FIXME: Skia thinks of an SkPixelRef as having a constant SkImageInfo (except for 41917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // its alphatype), so it would make more sense from Skia's perspective to create a 42017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // new SkPixelRef. That said, libhwui uses the pointer to the SkPixelRef as a key 42117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // for its cache, so it won't realize this is the same Java Bitmap. 42217a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III SkImageInfo& info = const_cast<SkImageInfo&>(ref->info()); 42317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // Use the updated from the SkBitmap, which may have corrected an invalid alphatype. 42417a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // (e.g. 565 non-opaque) 42517a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III info = bitmap->info(); 42632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->setPixelRef(ref); 42732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 42832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // notifyPixelsChanged will increment the generation ID even though the actual pixel data 42932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // hasn't been touched. This signals the renderer that the bitmap (including width, height, 43017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // colortype and alphatype) has changed. 43132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ref->notifyPixelsChanged(); 43217a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III ref->unref(); 43332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 43432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 43532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// These must match the int values in Bitmap.java 43632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikenum JavaEncodeFormat { 43732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik kJPEG_JavaEncodeFormat = 0, 43832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik kPNG_JavaEncodeFormat = 1, 43932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik kWEBP_JavaEncodeFormat = 2 44032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik}; 44132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 44232054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle, 44332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint format, jint quality, 44432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jobject jstream, jbyteArray jstorage) { 44532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 44632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkImageEncoder::Type fm; 44732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 44832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik switch (format) { 44932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik case kJPEG_JavaEncodeFormat: 45032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik fm = SkImageEncoder::kJPEG_Type; 45132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 45232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik case kPNG_JavaEncodeFormat: 45332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik fm = SkImageEncoder::kPNG_Type; 45432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 45532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik case kWEBP_JavaEncodeFormat: 45632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik fm = SkImageEncoder::kWEBP_Type; 45732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 45832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik default: 45932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 46032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 46132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 46232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bool success = false; 46332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != bitmap) { 46432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 46532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 46632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == bitmap->getPixels()) { 46732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 46832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 46932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 47032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); 47132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == strm) { 47232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 47332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 47432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 47532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkImageEncoder* encoder = SkImageEncoder::Create(fm); 47632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != encoder) { 47732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik success = encoder->encodeStream(strm, *bitmap, quality); 47832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete encoder; 47932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 48032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete strm; 48132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 48232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return success ? JNI_TRUE : JNI_FALSE; 48332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 48432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 48532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_erase(JNIEnv* env, jobject, jlong bitmapHandle, jint color) { 48632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 48732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->eraseColor(color); 48832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 48932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 49032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_rowBytes(JNIEnv* env, jobject, jlong bitmapHandle) { 49132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 49232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(bitmap->rowBytes()); 49332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 49432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 49532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_config(JNIEnv* env, jobject, jlong bitmapHandle) { 49632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 49732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(bitmap->config()); 49832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 49932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 50032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_getGenerationId(JNIEnv* env, jobject, jlong bitmapHandle) { 50132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 50232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(bitmap->getGenerationID()); 50332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 50432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 50557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic jboolean Bitmap_isPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle) { 50657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 50757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (bitmap->alphaType() == kPremul_SkAlphaType) { 50857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return JNI_TRUE; 50957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 51057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return JNI_FALSE; 51157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III} 51257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III 51332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_hasAlpha(JNIEnv* env, jobject, jlong bitmapHandle) { 51432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 51532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return !bitmap->isOpaque() ? JNI_TRUE : JNI_FALSE; 51632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 51732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 51857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic void Bitmap_setHasAlpha(JNIEnv* env, jobject, jlong bitmapHandle, 51957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jboolean hasAlpha, jboolean requestPremul) { 52032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 52157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (hasAlpha) { 52257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(requestPremul ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); 52332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } else { 52457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(kOpaque_SkAlphaType); 52557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 52657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III} 52757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III 52857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic void Bitmap_setPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle, 52957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jboolean isPremul) { 53057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 53157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (!bitmap->isOpaque()) { 53257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (isPremul) { 53357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(kPremul_SkAlphaType); 53457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } else { 53557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(kUnpremul_SkAlphaType); 53657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 53732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 53832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 53932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 54032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_hasMipMap(JNIEnv* env, jobject, jlong bitmapHandle) { 54132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 54232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return bitmap->hasHardwareMipMap() ? JNI_TRUE : JNI_FALSE; 54332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 54432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 54532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_setHasMipMap(JNIEnv* env, jobject, jlong bitmapHandle, 54632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jboolean hasMipMap) { 54732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 54832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->setHasHardwareMipMap(hasMipMap); 54932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 55032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 55132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 55232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 55332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { 55432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (parcel == NULL) { 55532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkDebugf("-------- unparcel parcel is NULL\n"); 55632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 55732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 55832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 55932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel* p = android::parcelForJavaObject(env, parcel); 56032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 561b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const bool isMutable = p->readInt32() != 0; 562b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const SkColorType colorType = (SkColorType)p->readInt32(); 563b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const SkAlphaType alphaType = (SkAlphaType)p->readInt32(); 564b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int width = p->readInt32(); 565b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int height = p->readInt32(); 566b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int rowBytes = p->readInt32(); 567b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int density = p->readInt32(); 568b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed 569b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (kN32_SkColorType != colorType && 570b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kRGB_565_SkColorType != colorType && 571b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kARGB_4444_SkColorType != colorType && 572b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kIndex_8_SkColorType != colorType && 573b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kAlpha_8_SkColorType != colorType) { 574b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed SkDebugf("Bitmap_createFromParcel unknown colortype: %d\n", colorType); 57532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 57632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 57732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 57832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = new SkBitmap; 57932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 580b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType), rowBytes); 58132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 58232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable = NULL; 583b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (colorType == kIndex_8_SkColorType) { 58432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int count = p->readInt32(); 58532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (count > 0) { 58632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t size = count * sizeof(SkPMColor); 58732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* src = (const SkPMColor*)p->readInplace(size); 58832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable = new SkColorTable(src, count); 58932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 59032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 59132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 59232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jbyteArray buffer = GraphicsJNI::allocateJavaPixelRef(env, bitmap, ctable); 59332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == buffer) { 59432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkSafeUnref(ctable); 59532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete bitmap; 59632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 59732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 59832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 59932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkSafeUnref(ctable); 60032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 60132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t size = bitmap->getSize(); 60232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 60332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel::ReadableBlob blob; 60432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::status_t status = p->readBlob(size, &blob); 60532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (status) { 60632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowRE(env, "Could not read bitmap from parcel blob."); 60732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete bitmap; 60832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 60932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 61032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 61132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->lockPixels(); 61232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(bitmap->getPixels(), blob.data(), size); 61332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->unlockPixels(); 61432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 61532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik blob.release(); 61632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 61732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, bitmap, buffer, getPremulBitmapCreateFlags(isMutable), 61832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik NULL, NULL, density); 61932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 62032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 62132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, 62232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bitmapHandle, 62332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jboolean isMutable, jint density, 62432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jobject parcel) { 62532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 62632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (parcel == NULL) { 62732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkDebugf("------- writeToParcel null parcel\n"); 62832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 62932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 63032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 63132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel* p = android::parcelForJavaObject(env, parcel); 63232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 63332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(isMutable); 634b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed p->writeInt32(bitmap->colorType()); 635b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed p->writeInt32(bitmap->alphaType()); 63632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(bitmap->width()); 63732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(bitmap->height()); 63832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(bitmap->rowBytes()); 63932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(density); 64032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 641b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (bitmap->colorType() == kIndex_8_SkColorType) { 64232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable = bitmap->getColorTable(); 64332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (ctable != NULL) { 64432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int count = ctable->count(); 64532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(count); 64632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(p->writeInplace(count * sizeof(SkPMColor)), 64732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable->lockColors(), count * sizeof(SkPMColor)); 64832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable->unlockColors(); 64932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } else { 65032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(0); // indicate no ctable 65132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 65232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 65332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 65432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t size = bitmap->getSize(); 65532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 65632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel::WritableBlob blob; 65732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::status_t status = p->writeBlob(size, &blob); 65832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (status) { 65932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowRE(env, "Could not write bitmap to parcel blob."); 66032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 66132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 66232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 66332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->lockPixels(); 66432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* pSrc = bitmap->getPixels(); 66532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (pSrc == NULL) { 66632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memset(blob.data(), 0, size); 66732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } else { 66832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(blob.data(), pSrc, size); 66932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 67032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->unlockPixels(); 67132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 67232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik blob.release(); 67332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_TRUE; 67432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 67532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 67632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_extractAlpha(JNIEnv* env, jobject clazz, 67732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong srcHandle, jlong paintHandle, 67832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jintArray offsetXY) { 67932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* src = reinterpret_cast<SkBitmap*>(srcHandle); 68032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle); 68132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkIPoint offset; 68232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* dst = new SkBitmap; 68332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik JavaPixelAllocator allocator(env); 68432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 68532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik src->extractAlpha(dst, paint, &allocator, &offset); 68632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // If Skia can't allocate pixels for destination bitmap, it resets 68732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // it, that is set its pixels buffer to NULL, and zero width and height. 68832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (dst->getPixels() == NULL && src->getPixels() != NULL) { 68932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete dst; 69032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowOOME(env, "failed to allocate pixels for alpha"); 69132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 69232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 69332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (offsetXY != 0 && env->GetArrayLength(offsetXY) >= 2) { 69432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int* array = env->GetIntArrayElements(offsetXY, NULL); 69532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik array[0] = offset.fX; 69632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik array[1] = offset.fY; 69732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik env->ReleaseIntArrayElements(offsetXY, array, 0); 69832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 69932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 70032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, dst, allocator.getStorageObj(), 70132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik getPremulBitmapCreateFlags(true), NULL, NULL); 70232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 70332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 70432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 70532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 70632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_getPixel(JNIEnv* env, jobject, jlong bitmapHandle, 70757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y) { 70832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 70932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 71032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 71157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III ToColorProc proc = ChooseToColorProc(*bitmap); 71232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == proc) { 71332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return 0; 71432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 71532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* src = bitmap->getAddr(x, y); 71632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == src) { 71732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return 0; 71832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 71932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 72032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor dst[1]; 72132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(dst, src, 1, bitmap->getColorTable()); 72232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(dst[0]); 72332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 72432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 72532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_getPixels(JNIEnv* env, jobject, jlong bitmapHandle, 72632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jintArray pixelArray, jint offset, jint stride, 72757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y, jint width, jint height) { 72832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 72932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 73032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 73157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III ToColorProc proc = ChooseToColorProc(*bitmap); 73232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == proc) { 73332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 73432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 73532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* src = bitmap->getAddr(x, y); 73632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == src) { 73732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 73832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 73932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 74032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable = bitmap->getColorTable(); 74132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint* dst = env->GetIntArrayElements(pixelArray, NULL); 74232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor* d = (SkColor*)dst + offset; 74332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik while (--height >= 0) { 74432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(d, src, width, ctable); 74532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik d += stride; 74632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik src = (void*)((const char*)src + bitmap->rowBytes()); 74732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 74832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik env->ReleaseIntArrayElements(pixelArray, dst, 0); 74932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 75032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 75132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 75232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 75332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_setPixel(JNIEnv* env, jobject, jlong bitmapHandle, 75457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y, jint colorHandle) { 75532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 75632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor color = static_cast<SkColor>(colorHandle); 75732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 75832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == bitmap->getPixels()) { 75932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 76032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 76132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 76257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III FromColorProc proc = ChooseFromColorProc(*bitmap); 76332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == proc) { 76432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 76532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 76632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 76732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(bitmap->getAddr(x, y), &color, 1, x, y); 76832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->notifyPixelsChanged(); 76932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 77032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 77132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_setPixels(JNIEnv* env, jobject, jlong bitmapHandle, 77232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jintArray pixelArray, jint offset, jint stride, 77357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y, jint width, jint height) { 77432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 77532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik GraphicsJNI::SetPixels(env, pixelArray, offset, stride, 77657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III x, y, width, height, *bitmap); 77732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 77832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 77932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_copyPixelsToBuffer(JNIEnv* env, jobject, 78032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bitmapHandle, jobject jbuffer) { 78132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 78232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 78332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* src = bitmap->getPixels(); 78432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 78532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != src) { 78632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::AutoBufferPointer abp(env, jbuffer, JNI_TRUE); 78732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 78832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // the java side has already checked that buffer is large enough 78932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(abp.pointer(), src, bitmap->getSize()); 79032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 79132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 79232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 79332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_copyPixelsFromBuffer(JNIEnv* env, jobject, 79432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bitmapHandle, jobject jbuffer) { 79532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 79632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 79732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik void* dst = bitmap->getPixels(); 79832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 79932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != dst) { 80032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::AutoBufferPointer abp(env, jbuffer, JNI_FALSE); 80132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // the java side has already checked that buffer is large enough 80232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(dst, abp.pointer(), bitmap->getSize()); 80332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->notifyPixelsChanged(); 80432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 80532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 80632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 80732054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_sameAs(JNIEnv* env, jobject, jlong bm0Handle, 80832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bm1Handle) { 80932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bm0 = reinterpret_cast<SkBitmap*>(bm0Handle); 81032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bm1 = reinterpret_cast<SkBitmap*>(bm1Handle); 81132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (bm0->width() != bm1->width() || 81232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bm0->height() != bm1->height() || 81332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bm0->config() != bm1->config()) { 81432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 81532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 81632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 81732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp0(*bm0); 81832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp1(*bm1); 81932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 82032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // if we can't load the pixels, return false 82132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == bm0->getPixels() || NULL == bm1->getPixels()) { 82232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 82332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 82432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 82532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (bm0->config() == SkBitmap::kIndex8_Config) { 82632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ct0 = bm0->getColorTable(); 82732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ct1 = bm1->getColorTable(); 82832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == ct0 || NULL == ct1) { 82932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 83032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 83132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (ct0->count() != ct1->count()) { 83232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 83332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 83432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 83532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockColors alc0(ct0); 83632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockColors alc1(ct1); 83732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const size_t size = ct0->count() * sizeof(SkPMColor); 83832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (memcmp(alc0.colors(), alc1.colors(), size) != 0) { 83932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 84032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 84132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 84232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 84332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // now compare each scanline. We can't do the entire buffer at once, 84432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // since we don't care about the pixel values that might extend beyond 84532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // the width (since the scanline might be larger than the logical width) 84632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const int h = bm0->height(); 84732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const size_t size = bm0->width() * bm0->bytesPerPixel(); 84832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int y = 0; y < h; y++) { 84932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (memcmp(bm0->getAddr(0, y), bm1->getAddr(0, y), size) != 0) { 85032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 85132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 85232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 85332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_TRUE; 85432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 85532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 85632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_prepareToDraw(JNIEnv* env, jobject, jlong bitmapHandle) { 85732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 85832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->lockPixels(); 85932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->unlockPixels(); 86032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 86132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 86232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 86332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 86432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include <android_runtime/AndroidRuntime.h> 86532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 86632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic JNINativeMethod gBitmapMethods[] = { 86732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCreate", "([IIIIIIZ)Landroid/graphics/Bitmap;", 86832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_creator }, 86932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCopy", "(JIZ)Landroid/graphics/Bitmap;", 87032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_copy }, 87132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeDestructor", "(J)V", (void*)Bitmap_destructor }, 87232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeRecycle", "(J)Z", (void*)Bitmap_recycle }, 87317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III { "nativeReconfigure", "(JIIIIZ)V", (void*)Bitmap_reconfigure }, 87432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCompress", "(JIILjava/io/OutputStream;[B)Z", 87532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_compress }, 87632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeErase", "(JI)V", (void*)Bitmap_erase }, 87732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeRowBytes", "(J)I", (void*)Bitmap_rowBytes }, 87832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeConfig", "(J)I", (void*)Bitmap_config }, 87932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeHasAlpha", "(J)Z", (void*)Bitmap_hasAlpha }, 88057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeIsPremultiplied", "(J)Z", (void*)Bitmap_isPremultiplied}, 88157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetHasAlpha", "(JZZ)V", (void*)Bitmap_setHasAlpha}, 88257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetPremultiplied", "(JZ)V", (void*)Bitmap_setPremultiplied}, 88332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeHasMipMap", "(J)Z", (void*)Bitmap_hasMipMap }, 88432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeSetHasMipMap", "(JZ)V", (void*)Bitmap_setHasMipMap }, 88532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCreateFromParcel", 88632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik "(Landroid/os/Parcel;)Landroid/graphics/Bitmap;", 88732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_createFromParcel }, 88832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeWriteToParcel", "(JZILandroid/os/Parcel;)Z", 88932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_writeToParcel }, 89032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeExtractAlpha", "(JJ[I)Landroid/graphics/Bitmap;", 89132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_extractAlpha }, 89232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeGenerationId", "(J)I", (void*)Bitmap_getGenerationId }, 89357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeGetPixel", "(JII)I", (void*)Bitmap_getPixel }, 89457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeGetPixels", "(J[IIIIIII)V", (void*)Bitmap_getPixels }, 89557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetPixel", "(JIII)V", (void*)Bitmap_setPixel }, 89657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetPixels", "(J[IIIIIII)V", (void*)Bitmap_setPixels }, 89732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCopyPixelsToBuffer", "(JLjava/nio/Buffer;)V", 89832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_copyPixelsToBuffer }, 89932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCopyPixelsFromBuffer", "(JLjava/nio/Buffer;)V", 90032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_copyPixelsFromBuffer }, 90132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeSameAs", "(JJ)Z", (void*)Bitmap_sameAs }, 90232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativePrepareToDraw", "(J)V", (void*)Bitmap_prepareToDraw }, 90332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik}; 90432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 90532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#define kClassPathName "android/graphics/Bitmap" 90632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 90732054b0b3edb350a5444c47753b2982312dd7ffdChris Craikint register_android_graphics_Bitmap(JNIEnv* env) 90832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik{ 90932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return android::AndroidRuntime::registerNativeMethods(env, kClassPathName, 91032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik gBitmapMethods, SK_ARRAY_COUNT(gBitmapMethods)); 91132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 912