Bitmap.cpp revision ec419e0b731d2aa32f7f570e4021fe18b8be228d
16ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod#include "Paint.h" 232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkBitmap.h" 332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkPixelRef.h" 432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkImageEncoder.h" 557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III#include "SkImageInfo.h" 632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkColorPriv.h" 732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "GraphicsJNI.h" 832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkDither.h" 932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkUnPreMultiply.h" 1032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "SkStream.h" 1132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 1232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include <binder/Parcel.h> 1332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "android_os_Parcel.h" 1432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "android_util_Binder.h" 1532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "android_nio_utils.h" 1632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include "CreateJavaOutputStreamAdaptor.h" 1732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 18ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 19ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 2032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik#include <jni.h> 2132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 2232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 2332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// Conversions to/from SkColor, for get/setPixels, and the create method, which 2432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// is basically like setPixels 2532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 2632054b0b3edb350a5444c47753b2982312dd7ffdChris Craiktypedef void (*FromColorProc)(void* dst, const SkColor src[], int width, 2732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y); 2832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 2932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D32(void* dst, const SkColor src[], int width, 3032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int, int) { 3132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor* d = (SkPMColor*)dst; 3232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 3332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int i = 0; i < width; i++) { 3432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkPreMultiplyColor(*src++); 3532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 3632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 3732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 3832054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D32_Raw(void* dst, const SkColor src[], int width, 3932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int, int) { 4046d8444631b4b1253a76bfcc78a29d26014d022fDan Albert // Needed to thwart the unreachable code detection from clang. 4146d8444631b4b1253a76bfcc78a29d26014d022fDan Albert static const bool sk_color_ne_zero = SK_COLOR_MATCHES_PMCOLOR_BYTE_ORDER; 4246d8444631b4b1253a76bfcc78a29d26014d022fDan Albert 4332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // SkColor's ordering may be different from SkPMColor 4446d8444631b4b1253a76bfcc78a29d26014d022fDan Albert if (sk_color_ne_zero) { 4532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(dst, src, width * sizeof(SkColor)); 4632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 4732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 4832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 4932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // order isn't same, repack each pixel manually 5032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor* d = (SkPMColor*)dst; 5132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int i = 0; i < width; i++) { 5232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor c = *src++; 5332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkPackARGB32NoCheck(SkColorGetA(c), SkColorGetR(c), 5432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorGetG(c), SkColorGetB(c)); 5532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 5632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 5732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 5832054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D565(void* dst, const SkColor src[], int width, 5932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y) { 6032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik uint16_t* d = (uint16_t*)dst; 6132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 6232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_565_SCAN(y); 6332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int stop = x + width; x < stop; x++) { 6432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor c = *src++; 6532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkDitherRGBTo565(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), 6632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_VALUE(x)); 6732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 6832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 6932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 7032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D4444(void* dst, const SkColor src[], int width, 7132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y) { 7232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor16* d = (SkPMColor16*)dst; 7332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 7432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_4444_SCAN(y); 7532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int stop = x + width; x < stop; x++) { 7632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor pmc = SkPreMultiplyColor(*src++); 7732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkDitherARGB32To4444(pmc, DITHER_VALUE(x)); 7832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// *d++ = SkPixel32ToPixel4444(pmc); 7932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 8032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 8132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 8232054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void FromColor_D4444_Raw(void* dst, const SkColor src[], int width, 8332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int x, int y) { 8432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor16* d = (SkPMColor16*)dst; 8532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 8632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik DITHER_4444_SCAN(y); 8732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int stop = x + width; x < stop; x++) { 8832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor c = *src++; 8932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 9032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // SkPMColor is used because the ordering is ARGB32, even though the target actually premultiplied 9132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor pmc = SkPackARGB32NoCheck(SkColorGetA(c), SkColorGetR(c), 9232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorGetG(c), SkColorGetB(c)); 9332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *d++ = SkDitherARGB32To4444(pmc, DITHER_VALUE(x)); 9432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// *d++ = SkPixel32ToPixel4444(pmc); 9532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 9632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 9732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 9832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// can return NULL 9957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) { 10057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (bitmap.colorType()) { 10157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kN32_SkColorType: 10257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D32 : FromColor_D32_Raw; 10357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kARGB_4444_SkColorType: 10457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D4444 : 10557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III FromColor_D4444_Raw; 10657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kRGB_565_SkColorType: 10732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return FromColor_D565; 10832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik default: 10932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 11032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 11132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 11232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 11332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 11432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikbool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int srcStride, 11557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III int x, int y, int width, int height, const SkBitmap& dstBitmap) { 11632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(dstBitmap); 11732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik void* dst = dstBitmap.getPixels(); 11857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III FromColorProc proc = ChooseFromColorProc(dstBitmap); 11932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 12032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == dst || NULL == proc) { 12132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return false; 12232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 12332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 12432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const jint* array = env->GetIntArrayElements(srcColors, NULL); 12532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkColor* src = (const SkColor*)array + srcOffset; 12632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 12732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // reset to to actual choice from caller 12832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik dst = dstBitmap.getAddr(x, y); 12932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // now copy/convert each scanline 13032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int y = 0; y < height; y++) { 13132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(dst, src, width, x, y); 13232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik src += srcStride; 13332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik dst = (char*)dst + dstBitmap.rowBytes(); 13432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 13532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 13632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik dstBitmap.notifyPixelsChanged(); 13732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 13832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik env->ReleaseIntArrayElements(srcColors, const_cast<jint*>(array), 13932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik JNI_ABORT); 14032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return true; 14132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 14232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 14332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik//////////////////// ToColor procs 14432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 14532054b0b3edb350a5444c47753b2982312dd7ffdChris Craiktypedef void (*ToColorProc)(SkColor dst[], const void* src, int width, 14632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*); 14732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 14832054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S32_Alpha(SkColor dst[], const void* src, int width, 14932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 15032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 15132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* s = (const SkPMColor*)src; 15232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 15332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkUnPreMultiply::PMColorToColor(*s++); 15432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 15532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 15632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 15732054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S32_Raw(SkColor dst[], const void* src, int width, 15832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 15932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 16032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* s = (const SkPMColor*)src; 16132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 16232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = *s++; 16332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c), 16432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedG32(c), SkGetPackedB32(c)); 16532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 16632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 16732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 16832054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S32_Opaque(SkColor dst[], const void* src, int width, 16932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 17032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 17132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* s = (const SkPMColor*)src; 17232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 17332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = *s++; 17432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 17532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedB32(c)); 17632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 17732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 17832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 17932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width, 18032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 18132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 18232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor16* s = (const SkPMColor16*)src; 18332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 18432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkUnPreMultiply::PMColorToColor(SkPixel4444ToPixel32(*s++)); 18532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 18632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 18732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 18832054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S4444_Raw(SkColor dst[], const void* src, int width, 18932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 19032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 19132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor16* s = (const SkPMColor16*)src; 19232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 19332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = SkPixel4444ToPixel32(*s++); 19432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c), 19532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedG32(c), SkGetPackedB32(c)); 19632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 19732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 19832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 19932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width, 20032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 20132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 20232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor16* s = (const SkPMColor16*)src; 20332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 20432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = SkPixel4444ToPixel32(*s++); 20532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 20632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedB32(c)); 20732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 20832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 20932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 21032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_S565(SkColor dst[], const void* src, int width, 21132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable*) { 21232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 21332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint16_t* s = (const uint16_t*)src; 21432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 21532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik uint16_t c = *s++; 21632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkPacked16ToR32(c), SkPacked16ToG32(c), 21732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPacked16ToB32(c)); 21832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 21932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 22032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 22132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width, 22232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable) { 22332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 22432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint8_t* s = (const uint8_t*)src; 22571487eb0ceb2b7dea02649e78d99bb5952f5eaefMike Reed const SkPMColor* colors = ctable->readColors(); 22632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 22732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkUnPreMultiply::PMColorToColor(colors[*s++]); 22832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 22932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 23032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 23132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_SI8_Raw(SkColor dst[], const void* src, int width, 23232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable) { 23332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 23432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint8_t* s = (const uint8_t*)src; 23571487eb0ceb2b7dea02649e78d99bb5952f5eaefMike Reed const SkPMColor* colors = ctable->readColors(); 23632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 23732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = colors[*s++]; 23832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c), 23932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedG32(c), SkGetPackedB32(c)); 24032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 24132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 24232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 24332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width, 24432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable) { 24532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkASSERT(width > 0); 24632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const uint8_t* s = (const uint8_t*)src; 24771487eb0ceb2b7dea02649e78d99bb5952f5eaefMike Reed const SkPMColor* colors = ctable->readColors(); 24832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik do { 24932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPMColor c = colors[*s++]; 25032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 25132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkGetPackedB32(c)); 25232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } while (--width != 0); 25332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 25432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 25532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// can return NULL 25657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic ToColorProc ChooseToColorProc(const SkBitmap& src) { 257b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed switch (src.colorType()) { 258b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kN32_SkColorType: 25957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (src.alphaType()) { 26057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kOpaque_SkAlphaType: 26157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S32_Opaque; 26257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kPremul_SkAlphaType: 26357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S32_Alpha; 26457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kUnpremul_SkAlphaType: 26557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S32_Raw; 26657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III default: 26757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return NULL; 26857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 269b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kARGB_4444_SkColorType: 27057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (src.alphaType()) { 27157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kOpaque_SkAlphaType: 27257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S4444_Opaque; 27357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kPremul_SkAlphaType: 27457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S4444_Alpha; 27557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kUnpremul_SkAlphaType: 27657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_S4444_Raw; 27757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III default: 27857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return NULL; 27957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 280b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kRGB_565_SkColorType: 28132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return ToColor_S565; 282b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed case kIndex_8_SkColorType: 28332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (src.getColorTable() == NULL) { 28432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 28532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 28657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III switch (src.alphaType()) { 28757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kOpaque_SkAlphaType: 28857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_SI8_Opaque; 28957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kPremul_SkAlphaType: 29057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_SI8_Alpha; 29157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III case kUnpremul_SkAlphaType: 29257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return ToColor_SI8_Raw; 29357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III default: 29457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return NULL; 29557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 29632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik default: 29732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 29832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 29932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 30032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 30132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 30232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 30332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 30432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 30532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic int getPremulBitmapCreateFlags(bool isMutable) { 30632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int flags = GraphicsJNI::kBitmapCreateFlag_Premultiplied; 30732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (isMutable) flags |= GraphicsJNI::kBitmapCreateFlag_Mutable; 30832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return flags; 30932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 31032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 31132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, 31232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint offset, jint stride, jint width, jint height, 31332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint configHandle, jboolean isMutable) { 3141103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed SkColorType colorType = GraphicsJNI::legacyBitmapConfigToColorType(configHandle); 31532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != jColors) { 31632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t n = env->GetArrayLength(jColors); 31732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (n < SkAbs32(stride) * (size_t)height) { 31832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowAIOOBE(env); 31932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 32032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 32132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 32232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 32332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // ARGB_4444 is a deprecated format, convert automatically to 8888 324b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (colorType == kARGB_4444_SkColorType) { 325b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed colorType = kN32_SkColorType; 32632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 32732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 32832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap bitmap; 329b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed bitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType)); 33032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 33132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jbyteArray buff = GraphicsJNI::allocateJavaPixelRef(env, &bitmap, NULL); 33232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == buff) { 33332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 33432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 33532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 33632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (jColors != NULL) { 33732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik GraphicsJNI::SetPixels(env, jColors, offset, stride, 33857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III 0, 0, width, height, bitmap); 33932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 34032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 34132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), buff, 34232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik getPremulBitmapCreateFlags(isMutable), NULL, NULL); 34332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 34432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 34532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle, 34632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint dstConfigHandle, jboolean isMutable) { 34732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* src = reinterpret_cast<SkBitmap*>(srcHandle); 3481103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed SkColorType dstCT = GraphicsJNI::legacyBitmapConfigToColorType(dstConfigHandle); 34932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap result; 35032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik JavaPixelAllocator allocator(env); 35132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 3521103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed if (!src->copyTo(&result, dstCT, &allocator)) { 35332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 35432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 35532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, new SkBitmap(result), allocator.getStorageObj(), 35632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik getPremulBitmapCreateFlags(isMutable), NULL, NULL); 35732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 35832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 35932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_destructor(JNIEnv* env, jobject, jlong bitmapHandle) { 36032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 3613d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger delete bitmap; 36232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 36332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 36432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) { 36532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 36632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->setPixels(NULL, NULL); 36732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_TRUE; 36832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 36932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 37032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_reconfigure(JNIEnv* env, jobject clazz, jlong bitmapHandle, 37117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III jint width, jint height, jint configHandle, jint allocSize, 37217a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III jboolean requestPremul) { 37332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 3741103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed SkColorType colorType = GraphicsJNI::legacyBitmapConfigToColorType(configHandle); 37517a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III 37617a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // ARGB_4444 is a deprecated format, convert automatically to 8888 37717a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III if (colorType == kARGB_4444_SkColorType) { 37817a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III colorType = kN32_SkColorType; 37917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III } 38017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III 38117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III if (width * height * SkColorTypeBytesPerPixel(colorType) > allocSize) { 38232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // done in native as there's no way to get BytesPerPixel in Java 38332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowIAE(env, "Bitmap not large enough to support new configuration"); 38432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 38532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 38632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkPixelRef* ref = bitmap->pixelRef(); 38717a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III ref->ref(); 38817a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III SkAlphaType alphaType; 38917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III if (bitmap->colorType() != kRGB_565_SkColorType 39017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III && bitmap->alphaType() == kOpaque_SkAlphaType) { 39117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // If the original bitmap was set to opaque, keep that setting, unless it 39217a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // was 565, which is required to be opaque. 39317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III alphaType = kOpaque_SkAlphaType; 39417a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III } else { 39517a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // Otherwise respect the premultiplied request. 39617a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III alphaType = requestPremul ? kPremul_SkAlphaType : kUnpremul_SkAlphaType; 39717a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III } 39817a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType)); 39917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // FIXME: Skia thinks of an SkPixelRef as having a constant SkImageInfo (except for 40017a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // its alphatype), so it would make more sense from Skia's perspective to create a 40117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // new SkPixelRef. That said, libhwui uses the pointer to the SkPixelRef as a key 40217a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // for its cache, so it won't realize this is the same Java Bitmap. 40317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III SkImageInfo& info = const_cast<SkImageInfo&>(ref->info()); 40417a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // Use the updated from the SkBitmap, which may have corrected an invalid alphatype. 40517a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // (e.g. 565 non-opaque) 40617a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III info = bitmap->info(); 40732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->setPixelRef(ref); 40832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 40932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // notifyPixelsChanged will increment the generation ID even though the actual pixel data 41032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // hasn't been touched. This signals the renderer that the bitmap (including width, height, 41117a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III // colortype and alphatype) has changed. 41232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ref->notifyPixelsChanged(); 41317a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III ref->unref(); 41432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 41532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 41632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik// These must match the int values in Bitmap.java 41732054b0b3edb350a5444c47753b2982312dd7ffdChris Craikenum JavaEncodeFormat { 41832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik kJPEG_JavaEncodeFormat = 0, 41932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik kPNG_JavaEncodeFormat = 1, 42032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik kWEBP_JavaEncodeFormat = 2 42132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik}; 42232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 42332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle, 42432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint format, jint quality, 42532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jobject jstream, jbyteArray jstorage) { 42632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 42732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkImageEncoder::Type fm; 42832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 42932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik switch (format) { 43032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik case kJPEG_JavaEncodeFormat: 43132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik fm = SkImageEncoder::kJPEG_Type; 43232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 43332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik case kPNG_JavaEncodeFormat: 43432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik fm = SkImageEncoder::kPNG_Type; 43532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 43632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik case kWEBP_JavaEncodeFormat: 43732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik fm = SkImageEncoder::kWEBP_Type; 43832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik break; 43932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik default: 44032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 44132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 44232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 44332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bool success = false; 44432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != bitmap) { 44532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 44632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 44732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == bitmap->getPixels()) { 44832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 44932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 45032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 45132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); 45232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == strm) { 45332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 45432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 45532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 45632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkImageEncoder* encoder = SkImageEncoder::Create(fm); 45732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != encoder) { 45832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik success = encoder->encodeStream(strm, *bitmap, quality); 45932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete encoder; 46032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 46132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete strm; 46232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 46332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return success ? JNI_TRUE : JNI_FALSE; 46432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 46532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 46632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_erase(JNIEnv* env, jobject, jlong bitmapHandle, jint color) { 46732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 46832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->eraseColor(color); 46932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 47032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 47132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_rowBytes(JNIEnv* env, jobject, jlong bitmapHandle) { 47232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 47332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(bitmap->rowBytes()); 47432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 47532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 47632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_config(JNIEnv* env, jobject, jlong bitmapHandle) { 47732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 4781103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed return GraphicsJNI::colorTypeToLegacyBitmapConfig(bitmap->colorType()); 47932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 48032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 48132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_getGenerationId(JNIEnv* env, jobject, jlong bitmapHandle) { 48232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 48332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(bitmap->getGenerationID()); 48432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 48532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 48657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic jboolean Bitmap_isPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle) { 48757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 48857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (bitmap->alphaType() == kPremul_SkAlphaType) { 48957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return JNI_TRUE; 49057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 49157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III return JNI_FALSE; 49257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III} 49357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III 49432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_hasAlpha(JNIEnv* env, jobject, jlong bitmapHandle) { 49532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 49632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return !bitmap->isOpaque() ? JNI_TRUE : JNI_FALSE; 49732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 49832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 49957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic void Bitmap_setHasAlpha(JNIEnv* env, jobject, jlong bitmapHandle, 50057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jboolean hasAlpha, jboolean requestPremul) { 50132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 50257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (hasAlpha) { 50357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(requestPremul ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); 50432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } else { 50557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(kOpaque_SkAlphaType); 50657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 50757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III} 50857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III 50957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins IIIstatic void Bitmap_setPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle, 51057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jboolean isPremul) { 51157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 51257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (!bitmap->isOpaque()) { 51357ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III if (isPremul) { 51457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(kPremul_SkAlphaType); 51557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } else { 51657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III bitmap->setAlphaType(kUnpremul_SkAlphaType); 51757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III } 51832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 51932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 52032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 52132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_hasMipMap(JNIEnv* env, jobject, jlong bitmapHandle) { 52232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 52332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return bitmap->hasHardwareMipMap() ? JNI_TRUE : JNI_FALSE; 52432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 52532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 52632054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_setHasMipMap(JNIEnv* env, jobject, jlong bitmapHandle, 52732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jboolean hasMipMap) { 52832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 52932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->setHasHardwareMipMap(hasMipMap); 53032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 53132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 53232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 53332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 53432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { 53532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (parcel == NULL) { 53632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkDebugf("-------- unparcel parcel is NULL\n"); 53732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 53832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 53932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 54032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel* p = android::parcelForJavaObject(env, parcel); 54132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 542b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const bool isMutable = p->readInt32() != 0; 543b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const SkColorType colorType = (SkColorType)p->readInt32(); 544b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const SkAlphaType alphaType = (SkAlphaType)p->readInt32(); 545b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int width = p->readInt32(); 546b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int height = p->readInt32(); 547b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int rowBytes = p->readInt32(); 548b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed const int density = p->readInt32(); 549b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed 550b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (kN32_SkColorType != colorType && 551b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kRGB_565_SkColorType != colorType && 552b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kARGB_4444_SkColorType != colorType && 553b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kIndex_8_SkColorType != colorType && 554b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed kAlpha_8_SkColorType != colorType) { 555b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed SkDebugf("Bitmap_createFromParcel unknown colortype: %d\n", colorType); 55632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 55732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 55832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 559ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III std::unique_ptr<SkBitmap> bitmap(new SkBitmap); 56032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 561ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III if (!bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType), rowBytes)) { 562ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III return NULL; 563ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III } 56432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 56532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable = NULL; 566b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (colorType == kIndex_8_SkColorType) { 56732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int count = p->readInt32(); 568ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III if (count < 0 || count > 256) { 569ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III // The data is corrupt, since SkColorTable enforces a value between 0 and 256, 570ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III // inclusive. 571ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III return NULL; 572ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III } 57332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (count > 0) { 57432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t size = count * sizeof(SkPMColor); 57532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkPMColor* src = (const SkPMColor*)p->readInplace(size); 576ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III if (src == NULL) { 577ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III return NULL; 578ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III } 57932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik ctable = new SkColorTable(src, count); 58032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 58132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 58232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 583ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III jbyteArray buffer = GraphicsJNI::allocateJavaPixelRef(env, bitmap.get(), ctable); 58432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == buffer) { 58532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkSafeUnref(ctable); 58632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 58732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 58832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 58932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkSafeUnref(ctable); 59032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 59132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t size = bitmap->getSize(); 59232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 59332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel::ReadableBlob blob; 59432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::status_t status = p->readBlob(size, &blob); 59532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (status) { 59632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowRE(env, "Could not read bitmap from parcel blob."); 59732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 59832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 59932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 60032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->lockPixels(); 60132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(bitmap->getPixels(), blob.data(), size); 60232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->unlockPixels(); 60332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 60432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik blob.release(); 60532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 606ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III return GraphicsJNI::createBitmap(env, bitmap.release(), buffer, 607ec419e0b731d2aa32f7f570e4021fe18b8be228dLeon Scroggins III getPremulBitmapCreateFlags(isMutable), NULL, NULL, density); 60832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 60932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 61032054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, 61132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bitmapHandle, 61232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jboolean isMutable, jint density, 61332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jobject parcel) { 61432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 61532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (parcel == NULL) { 61632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkDebugf("------- writeToParcel null parcel\n"); 61732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 61832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 61932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 62032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel* p = android::parcelForJavaObject(env, parcel); 62132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 62232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(isMutable); 623b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed p->writeInt32(bitmap->colorType()); 624b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed p->writeInt32(bitmap->alphaType()); 62532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(bitmap->width()); 62632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(bitmap->height()); 62732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(bitmap->rowBytes()); 62832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(density); 62932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 630b933055cf3f7f8ea89bfd3bc9c37a3891ff7310aMike Reed if (bitmap->colorType() == kIndex_8_SkColorType) { 63132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable = bitmap->getColorTable(); 63232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (ctable != NULL) { 63332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int count = ctable->count(); 63432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(count); 63532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(p->writeInplace(count * sizeof(SkPMColor)), 63671487eb0ceb2b7dea02649e78d99bb5952f5eaefMike Reed ctable->readColors(), count * sizeof(SkPMColor)); 63732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } else { 63832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik p->writeInt32(0); // indicate no ctable 63932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 64032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 64132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 64232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik size_t size = bitmap->getSize(); 64332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 64432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::Parcel::WritableBlob blob; 64532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::status_t status = p->writeBlob(size, &blob); 64632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (status) { 64732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowRE(env, "Could not write bitmap to parcel blob."); 64832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 64932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 65032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 65132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->lockPixels(); 65232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* pSrc = bitmap->getPixels(); 65332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (pSrc == NULL) { 65432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memset(blob.data(), 0, size); 65532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } else { 65632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(blob.data(), pSrc, size); 65732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 65832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->unlockPixels(); 65932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 66032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik blob.release(); 66132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_TRUE; 66232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 66332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 66432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jobject Bitmap_extractAlpha(JNIEnv* env, jobject clazz, 66532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong srcHandle, jlong paintHandle, 66632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jintArray offsetXY) { 66732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* src = reinterpret_cast<SkBitmap*>(srcHandle); 6686ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbod const android::Paint* paint = reinterpret_cast<android::Paint*>(paintHandle); 66932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkIPoint offset; 67032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* dst = new SkBitmap; 67132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik JavaPixelAllocator allocator(env); 67232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 67332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik src->extractAlpha(dst, paint, &allocator, &offset); 67432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // If Skia can't allocate pixels for destination bitmap, it resets 67532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // it, that is set its pixels buffer to NULL, and zero width and height. 67632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (dst->getPixels() == NULL && src->getPixels() != NULL) { 67732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik delete dst; 67832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik doThrowOOME(env, "failed to allocate pixels for alpha"); 67932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return NULL; 68032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 68132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (offsetXY != 0 && env->GetArrayLength(offsetXY) >= 2) { 68232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik int* array = env->GetIntArrayElements(offsetXY, NULL); 68332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik array[0] = offset.fX; 68432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik array[1] = offset.fY; 68532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik env->ReleaseIntArrayElements(offsetXY, array, 0); 68632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 68732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 68832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return GraphicsJNI::createBitmap(env, dst, allocator.getStorageObj(), 68932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik getPremulBitmapCreateFlags(true), NULL, NULL); 69032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 69132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 69232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 69332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 69432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jint Bitmap_getPixel(JNIEnv* env, jobject, jlong bitmapHandle, 69557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y) { 69632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 69732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 69832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 69957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III ToColorProc proc = ChooseToColorProc(*bitmap); 70032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == proc) { 70132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return 0; 70232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 70332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* src = bitmap->getAddr(x, y); 70432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == src) { 70532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return 0; 70632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 70732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 70832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor dst[1]; 70932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(dst, src, 1, bitmap->getColorTable()); 71032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return static_cast<jint>(dst[0]); 71132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 71232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 71332054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_getPixels(JNIEnv* env, jobject, jlong bitmapHandle, 71432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jintArray pixelArray, jint offset, jint stride, 71557ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y, jint width, jint height) { 71632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 71732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 71832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 71957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III ToColorProc proc = ChooseToColorProc(*bitmap); 72032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == proc) { 72132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 72232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 72332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* src = bitmap->getAddr(x, y); 72432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == src) { 72532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 72632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 72732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 72832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ctable = bitmap->getColorTable(); 72932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jint* dst = env->GetIntArrayElements(pixelArray, NULL); 73032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor* d = (SkColor*)dst + offset; 73132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik while (--height >= 0) { 73232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(d, src, width, ctable); 73332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik d += stride; 73432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik src = (void*)((const char*)src + bitmap->rowBytes()); 73532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 73632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik env->ReleaseIntArrayElements(pixelArray, dst, 0); 73732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 73832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 73932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 74032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 74132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_setPixel(JNIEnv* env, jobject, jlong bitmapHandle, 74257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y, jint colorHandle) { 74332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 74432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColor color = static_cast<SkColor>(colorHandle); 74532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 74632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == bitmap->getPixels()) { 74732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 74832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 74932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 75057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III FromColorProc proc = ChooseFromColorProc(*bitmap); 75132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == proc) { 75232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return; 75332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 75432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 75532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik proc(bitmap->getAddr(x, y), &color, 1, x, y); 75632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->notifyPixelsChanged(); 75732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 75832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 75932054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_setPixels(JNIEnv* env, jobject, jlong bitmapHandle, 76032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jintArray pixelArray, jint offset, jint stride, 76157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III jint x, jint y, jint width, jint height) { 76232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 76332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik GraphicsJNI::SetPixels(env, pixelArray, offset, stride, 76457ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III x, y, width, height, *bitmap); 76532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 76632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 76732054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_copyPixelsToBuffer(JNIEnv* env, jobject, 76832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bitmapHandle, jobject jbuffer) { 76932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 77032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 77132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const void* src = bitmap->getPixels(); 77232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 77332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != src) { 77432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::AutoBufferPointer abp(env, jbuffer, JNI_TRUE); 77532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 77632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // the java side has already checked that buffer is large enough 77732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(abp.pointer(), src, bitmap->getSize()); 77832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 77932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 78032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 78132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_copyPixelsFromBuffer(JNIEnv* env, jobject, 78232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bitmapHandle, jobject jbuffer) { 78332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 78432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp(*bitmap); 78532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik void* dst = bitmap->getPixels(); 78632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 78732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL != dst) { 78832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik android::AutoBufferPointer abp(env, jbuffer, JNI_FALSE); 78932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // the java side has already checked that buffer is large enough 79032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik memcpy(dst, abp.pointer(), bitmap->getSize()); 79132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->notifyPixelsChanged(); 79232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 79332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 79432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 79532054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic jboolean Bitmap_sameAs(JNIEnv* env, jobject, jlong bm0Handle, 79632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik jlong bm1Handle) { 79732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bm0 = reinterpret_cast<SkBitmap*>(bm0Handle); 79832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const SkBitmap* bm1 = reinterpret_cast<SkBitmap*>(bm1Handle); 79932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (bm0->width() != bm1->width() || 80032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bm0->height() != bm1->height() || 8011103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed bm0->colorType() != bm1->colorType()) { 80232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 80332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 80432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 80532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp0(*bm0); 80632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkAutoLockPixels alp1(*bm1); 80732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 80832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // if we can't load the pixels, return false 80932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == bm0->getPixels() || NULL == bm1->getPixels()) { 81032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 81132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 81232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 8131103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed if (bm0->colorType() == kIndex_8_SkColorType) { 81432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ct0 = bm0->getColorTable(); 81532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkColorTable* ct1 = bm1->getColorTable(); 81632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (NULL == ct0 || NULL == ct1) { 81732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 81832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 81932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik if (ct0->count() != ct1->count()) { 82032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 82132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 82232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 82332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const size_t size = ct0->count() * sizeof(SkPMColor); 82471487eb0ceb2b7dea02649e78d99bb5952f5eaefMike Reed if (memcmp(ct0->readColors(), ct1->readColors(), size) != 0) { 82532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 82632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 82732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 82832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 82932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // now compare each scanline. We can't do the entire buffer at once, 83032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // since we don't care about the pixel values that might extend beyond 83132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik // the width (since the scanline might be larger than the logical width) 83232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const int h = bm0->height(); 83332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik const size_t size = bm0->width() * bm0->bytesPerPixel(); 83432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik for (int y = 0; y < h; y++) { 83553001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen // SkBitmap::getAddr(int, int) may return NULL due to unrecognized config 83653001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen // (ex: kRLE_Index8_Config). This will cause memcmp method to crash. Since bm0 83753001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen // and bm1 both have pixel data() (have passed NULL == getPixels() check), 83853001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen // those 2 bitmaps should be valid (only unrecognized), we return JNI_FALSE 83953001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen // to warn user those 2 unrecognized config bitmaps may be different. 84053001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen void *bm0Addr = bm0->getAddr(0, y); 84153001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen void *bm1Addr = bm1->getAddr(0, y); 84253001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen 84353001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen if(bm0Addr == NULL || bm1Addr == NULL) { 84453001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen return JNI_FALSE; 84553001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen } 84653001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen 84753001ca3a629c0069f4fdac44f7711ad4a0c395ahenry.uh_chen if (memcmp(bm0Addr, bm1Addr, size) != 0) { 84832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_FALSE; 84932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 85032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik } 85132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik return JNI_TRUE; 85232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 85332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 85432054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic void Bitmap_prepareToDraw(JNIEnv* env, jobject, jlong bitmapHandle) { 85532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 85632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->lockPixels(); 85732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik bitmap->unlockPixels(); 85832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 85932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 86032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik/////////////////////////////////////////////////////////////////////////////// 86132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 86232054b0b3edb350a5444c47753b2982312dd7ffdChris Craikstatic JNINativeMethod gBitmapMethods[] = { 86332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCreate", "([IIIIIIZ)Landroid/graphics/Bitmap;", 86432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_creator }, 86532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCopy", "(JIZ)Landroid/graphics/Bitmap;", 86632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_copy }, 86732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeDestructor", "(J)V", (void*)Bitmap_destructor }, 86832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeRecycle", "(J)Z", (void*)Bitmap_recycle }, 86917a8bfc38a565ae96f43d36b223779be840bb50cLeon Scroggins III { "nativeReconfigure", "(JIIIIZ)V", (void*)Bitmap_reconfigure }, 87032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCompress", "(JIILjava/io/OutputStream;[B)Z", 87132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_compress }, 87232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeErase", "(JI)V", (void*)Bitmap_erase }, 87332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeRowBytes", "(J)I", (void*)Bitmap_rowBytes }, 87432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeConfig", "(J)I", (void*)Bitmap_config }, 87532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeHasAlpha", "(J)Z", (void*)Bitmap_hasAlpha }, 87657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeIsPremultiplied", "(J)Z", (void*)Bitmap_isPremultiplied}, 87757ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetHasAlpha", "(JZZ)V", (void*)Bitmap_setHasAlpha}, 87857ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetPremultiplied", "(JZ)V", (void*)Bitmap_setPremultiplied}, 87932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeHasMipMap", "(J)Z", (void*)Bitmap_hasMipMap }, 88032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeSetHasMipMap", "(JZ)V", (void*)Bitmap_setHasMipMap }, 88132054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCreateFromParcel", 88232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik "(Landroid/os/Parcel;)Landroid/graphics/Bitmap;", 88332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_createFromParcel }, 88432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeWriteToParcel", "(JZILandroid/os/Parcel;)Z", 88532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_writeToParcel }, 88632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeExtractAlpha", "(JJ[I)Landroid/graphics/Bitmap;", 88732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_extractAlpha }, 88832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeGenerationId", "(J)I", (void*)Bitmap_getGenerationId }, 88957ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeGetPixel", "(JII)I", (void*)Bitmap_getPixel }, 89057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeGetPixels", "(J[IIIIIII)V", (void*)Bitmap_getPixels }, 89157ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetPixel", "(JIII)V", (void*)Bitmap_setPixel }, 89257ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III { "nativeSetPixels", "(J[IIIIIII)V", (void*)Bitmap_setPixels }, 89332054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCopyPixelsToBuffer", "(JLjava/nio/Buffer;)V", 89432054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_copyPixelsToBuffer }, 89532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeCopyPixelsFromBuffer", "(JLjava/nio/Buffer;)V", 89632054b0b3edb350a5444c47753b2982312dd7ffdChris Craik (void*)Bitmap_copyPixelsFromBuffer }, 89732054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativeSameAs", "(JJ)Z", (void*)Bitmap_sameAs }, 89832054b0b3edb350a5444c47753b2982312dd7ffdChris Craik { "nativePrepareToDraw", "(J)V", (void*)Bitmap_prepareToDraw }, 89932054b0b3edb350a5444c47753b2982312dd7ffdChris Craik}; 90032054b0b3edb350a5444c47753b2982312dd7ffdChris Craik 90132054b0b3edb350a5444c47753b2982312dd7ffdChris Craikint register_android_graphics_Bitmap(JNIEnv* env) 90232054b0b3edb350a5444c47753b2982312dd7ffdChris Craik{ 903ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods, 904ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe NELEM(gBitmapMethods)); 90532054b0b3edb350a5444c47753b2982312dd7ffdChris Craik} 906