Bitmap.cpp revision c9e22e9affec97a8c68f838de29dc7f685d9247b
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "SkBitmap.h" 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "SkImageEncoder.h" 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "SkColorPriv.h" 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "GraphicsJNI.h" 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "SkDither.h" 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "SkUnPreMultiply.h" 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <binder/Parcel.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "android_util_Binder.h" 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "android_nio_utils.h" 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "CreateJavaOutputStreamAdaptor.h" 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <jni.h> 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project #define TRACE_BITMAP(code) code 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project #define TRACE_BITMAP(code) 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Conversions to/from SkColor, for get/setPixels, and the create method, which 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// is basically like setPixels 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void (*FromColorProc)(void* dst, const SkColor src[], int width, 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y); 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void FromColor_D32(void* dst, const SkColor src[], int width, 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int, int) { 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPMColor* d = (SkPMColor*)dst; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i = 0; i < width; i++) { 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *d++ = SkPreMultiplyColor(*src++); 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void FromColor_D565(void* dst, const SkColor src[], int width, 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y) { 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t* d = (uint16_t*)dst; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DITHER_565_SCAN(y); 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int stop = x + width; x < stop; x++) { 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColor c = *src++; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *d++ = SkDitherRGBTo565(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DITHER_VALUE(x)); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void FromColor_D4444(void* dst, const SkColor src[], int width, 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y) { 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPMColor16* d = (SkPMColor16*)dst; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DITHER_4444_SCAN(y); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int stop = x + width; x < stop; x++) { 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPMColor c = SkPreMultiplyColor(*src++); 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *d++ = SkDitherARGB32To4444(c, DITHER_VALUE(x)); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// *d++ = SkPixel32ToPixel4444(c); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// can return NULL 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic FromColorProc ChooseFromColorProc(SkBitmap::Config config) { 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (config) { 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kARGB_8888_Config: 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return FromColor_D32; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kARGB_4444_Config: 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return FromColor_D4444; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kRGB_565_Config: 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return FromColor_D565; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectbool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int srcOffset, int srcStride, 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y, int width, int height, 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap& dstBitmap) { 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp(dstBitmap); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void* dst = dstBitmap.getPixels(); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FromColorProc proc = ChooseFromColorProc(dstBitmap.config()); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == dst || NULL == proc) { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const jint* array = env->GetIntArrayElements(srcColors, NULL); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkColor* src = (const SkColor*)array + srcOffset; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // reset to to actual choice from caller 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst = dstBitmap.getAddr(x, y); 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // now copy/convert each scanline 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int y = 0; y < height; y++) { 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project proc(dst, src, width, x, y); 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src += srcStride; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst = (char*)dst + dstBitmap.rowBytes(); 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project env->ReleaseIntArrayElements(srcColors, const_cast<jint*>(array), 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project JNI_ABORT); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return true; 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//////////////////// ToColor procs 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void (*ToColorProc)(SkColor dst[], const void* src, int width, 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable*); 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_S32_Alpha(SkColor dst[], const void* src, int width, 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable*) { 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor* s = (const SkPMColor*)src; 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkUnPreMultiply::PMColorToColor(*s++); 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_S32_Opaque(SkColor dst[], const void* src, int width, 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable*) { 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor* s = (const SkPMColor*)src; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPMColor c = *s++; 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkGetPackedB32(c)); 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width, 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable*) { 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor16* s = (const SkPMColor16*)src; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkUnPreMultiply::PMColorToColor(SkPixel4444ToPixel32(*s++)); 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width, 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable*) { 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor* s = (const SkPMColor*)src; 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPMColor c = SkPixel4444ToPixel32(*s++); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkGetPackedB32(c)); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_S565(SkColor dst[], const void* src, int width, 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable*) { 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint16_t* s = (const uint16_t*)src; 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t c = *s++; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkColorSetRGB(SkPacked16ToR32(c), SkPacked16ToG32(c), 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPacked16ToB32(c)); 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width, 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ctable) { 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint8_t* s = (const uint8_t*)src; 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor* colors = ctable->lockColors(); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkUnPreMultiply::PMColorToColor(colors[*s++]); 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ctable->unlockColors(false); 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width, 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ctable) { 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkASSERT(width > 0); 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint8_t* s = (const uint8_t*)src; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor* colors = ctable->lockColors(); 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkPMColor c = colors[*s++]; 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c), 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkGetPackedB32(c)); 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--width != 0); 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ctable->unlockColors(false); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// can return NULL 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic ToColorProc ChooseToColorProc(const SkBitmap& src) { 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (src.config()) { 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kARGB_8888_Config: 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return src.isOpaque() ? ToColor_S32_Opaque : ToColor_S32_Alpha; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kARGB_4444_Config: 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return src.isOpaque() ? ToColor_S4444_Opaque : ToColor_S4444_Alpha; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kRGB_565_Config: 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ToColor_S565; 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SkBitmap::kIndex8_Config: 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (src.getColorTable() == NULL) { 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return src.isOpaque() ? ToColor_SI8_Opaque : ToColor_SI8_Alpha; 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int offset, int stride, int width, int height, 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap::Config config, jboolean isMutable) { 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (width <= 0 || height <= 0) { 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project doThrowIAE(env, "width and height must be > 0"); 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL != jColors) { 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t n = env->GetArrayLength(jColors); 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (n < SkAbs32(stride) * (size_t)height) { 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project doThrowAIOOBE(env); 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap bitmap; 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap.setConfig(config, width, height); 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!GraphicsJNI::setJavaPixelRef(env, &bitmap, NULL, true)) { 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (jColors != NULL) { 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GraphicsJNI::SetPixels(env, jColors, offset, stride, 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 0, 0, width, height, bitmap); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), isMutable, 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL); 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic jobject Bitmap_copy(JNIEnv* env, jobject, const SkBitmap* src, 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap::Config dstConfig, jboolean isMutable) { 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap result; 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project JavaPixelAllocator allocator(env, true); 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!src->copyTo(&result, dstConfig, &allocator)) { 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return GraphicsJNI::createBitmap(env, new SkBitmap(result), isMutable, 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project NULL); 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) { 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delete bitmap; 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->setPixels(NULL, NULL); 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// These must match the int values in Bitmap.java 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectenum JavaEncodeFormat { 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project kJPEG_JavaEncodeFormat = 0, 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project kPNG_JavaEncodeFormat = 1 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic bool Bitmap_compress(JNIEnv* env, jobject clazz, SkBitmap* bitmap, 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int format, int quality, 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jobject jstream, jbyteArray jstorage) { 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkImageEncoder::Type fm; 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (format) { 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case kJPEG_JavaEncodeFormat: 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fm = SkImageEncoder::kJPEG_Type; 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case kPNG_JavaEncodeFormat: 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fm = SkImageEncoder::kPNG_Type; 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bool success = false; 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL != strm) { 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkImageEncoder* encoder = SkImageEncoder::Create(fm); 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL != encoder) { 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project success = encoder->encodeStream(strm, *bitmap, quality); 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delete encoder; 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delete strm; 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return success; 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_erase(JNIEnv* env, jobject, SkBitmap* bitmap, jint color) { 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->eraseColor(color); 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int Bitmap_width(JNIEnv* env, jobject, SkBitmap* bitmap) { 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return bitmap->width(); 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int Bitmap_height(JNIEnv* env, jobject, SkBitmap* bitmap) { 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return bitmap->height(); 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int Bitmap_rowBytes(JNIEnv* env, jobject, SkBitmap* bitmap) { 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return bitmap->rowBytes(); 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int Bitmap_config(JNIEnv* env, jobject, SkBitmap* bitmap) { 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return bitmap->config(); 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic jboolean Bitmap_hasAlpha(JNIEnv* env, jobject, SkBitmap* bitmap) { 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return !bitmap->isOpaque(); 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_setHasAlpha(JNIEnv* env, jobject, SkBitmap* bitmap, 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jboolean hasAlpha) { 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->setIsOpaque(!hasAlpha); 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (parcel == NULL) { 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkDebugf("-------- unparcel parcel is NULL\n"); 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android::Parcel* p = android::parcelForJavaObject(env, parcel); 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const bool isMutable = p->readInt32() != 0; 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap::Config config = (SkBitmap::Config)p->readInt32(); 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int width = p->readInt32(); 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int height = p->readInt32(); 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int rowBytes = p->readInt32(); 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int density = p->readInt32(); 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (SkBitmap::kARGB_8888_Config != config && 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap::kRGB_565_Config != config && 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap::kARGB_4444_Config != config && 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap::kIndex8_Config != config && 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap::kA8_Config != config) { 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkDebugf("Bitmap_createFromParcel unknown config: %d\n", config); 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap* bitmap = new SkBitmap; 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->setConfig(config, width, height, rowBytes); 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ctable = NULL; 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (config == SkBitmap::kIndex8_Config) { 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int count = p->readInt32(); 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (count > 0) { 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t size = count * sizeof(SkPMColor); 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkPMColor* src = (const SkPMColor*)p->readInplace(size); 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ctable = new SkColorTable(src, count); 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!GraphicsJNI::setJavaPixelRef(env, bitmap, ctable, true)) { 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkSafeUnref(ctable); 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delete bitmap; 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkSafeUnref(ctable); 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t size = bitmap->getSize(); 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->lockPixels(); 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(bitmap->getPixels(), p->readInplace(size), size); 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->unlockPixels(); 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return GraphicsJNI::createBitmap(env, bitmap, isMutable, NULL, density); 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap* bitmap, 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jboolean isMutable, jint density, 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jobject parcel) { 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (parcel == NULL) { 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkDebugf("------- writeToParcel null parcel\n"); 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android::Parcel* p = android::parcelForJavaObject(env, parcel); 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(isMutable); 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(bitmap->config()); 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(bitmap->width()); 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(bitmap->height()); 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(bitmap->rowBytes()); 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(density); 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (bitmap->getConfig() == SkBitmap::kIndex8_Config) { 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ctable = bitmap->getColorTable(); 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ctable != NULL) { 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int count = ctable->count(); 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(count); 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(p->writeInplace(count * sizeof(SkPMColor)), 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ctable->lockColors(), count * sizeof(SkPMColor)); 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ctable->unlockColors(false); 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->writeInt32(0); // indicate no ctable 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t size = bitmap->getSize(); 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->lockPixels(); 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(p->writeInplace(size), bitmap->getPixels(), size); 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->unlockPixels(); 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return true; 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic jobject Bitmap_extractAlpha(JNIEnv* env, jobject clazz, 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap* src, const SkPaint* paint, 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jintArray offsetXY) { 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkIPoint offset; 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkBitmap* dst = new SkBitmap; 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src->extractAlpha(dst, paint, &offset); 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (offsetXY != 0 && env->GetArrayLength(offsetXY) >= 2) { 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int* array = env->GetIntArrayElements(offsetXY, NULL); 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project array[0] = offset.fX; 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project array[1] = offset.fY; 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project env->ReleaseIntArrayElements(offsetXY, array, 0); 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return GraphicsJNI::createBitmap(env, dst, true, NULL); 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int Bitmap_getPixel(JNIEnv* env, jobject, const SkBitmap* bitmap, 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y) { 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp(*bitmap); 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ToColorProc proc = ChooseToColorProc(*bitmap); 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == proc) { 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const void* src = bitmap->getAddr(x, y); 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == src) { 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColor dst[1]; 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project proc(dst, src, 1, bitmap->getColorTable()); 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return dst[0]; 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_getPixels(JNIEnv* env, jobject, const SkBitmap* bitmap, 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jintArray pixelArray, int offset, int stride, 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y, int width, int height) { 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp(*bitmap); 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ToColorProc proc = ChooseToColorProc(*bitmap); 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == proc) { 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const void* src = bitmap->getAddr(x, y); 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == src) { 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ctable = bitmap->getColorTable(); 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jint* dst = env->GetIntArrayElements(pixelArray, NULL); 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColor* d = (SkColor*)dst + offset; 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (--height >= 0) { 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project proc(d, src, width, ctable); 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d += stride; 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src = (void*)((const char*)src + bitmap->rowBytes()); 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project env->ReleaseIntArrayElements(pixelArray, dst, 0); 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_setPixel(JNIEnv* env, jobject, const SkBitmap* bitmap, 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y, SkColor color) { 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp(*bitmap); 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == bitmap->getPixels()) { 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FromColorProc proc = ChooseFromColorProc(bitmap->config()); 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == proc) { 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project proc(bitmap->getAddr(x, y), &color, 1, x, y); 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_setPixels(JNIEnv* env, jobject, const SkBitmap* bitmap, 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project jintArray pixelArray, int offset, int stride, 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int x, int y, int width, int height) { 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GraphicsJNI::SetPixels(env, pixelArray, offset, stride, 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x, y, width, height, *bitmap); 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_copyPixelsToBuffer(JNIEnv* env, jobject, 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap* bitmap, jobject jbuffer) { 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp(*bitmap); 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const void* src = bitmap->getPixels(); 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL != src) { 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android::AutoBufferPointer abp(env, jbuffer, JNI_TRUE); 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // the java side has already checked that buffer is large enough 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(abp.pointer(), src, bitmap->getSize()); 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_copyPixelsFromBuffer(JNIEnv* env, jobject, 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap* bitmap, jobject jbuffer) { 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp(*bitmap); 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void* dst = bitmap->getPixels(); 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL != dst) { 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android::AutoBufferPointer abp(env, jbuffer, JNI_FALSE); 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // the java side has already checked that buffer is large enough 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(dst, abp.pointer(), bitmap->getSize()); 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic bool Bitmap_sameAs(JNIEnv* env, jobject, const SkBitmap* bm0, 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const SkBitmap* bm1) { 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (bm0->width() != bm1->width() || 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bm0->height() != bm1->height() || 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bm0->config() != bm1->config()) { 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp0(*bm0); 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockPixels alp1(*bm1); 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // if we can't load the pixels, return false 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == bm0->getPixels() || NULL == bm1->getPixels()) { 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (bm0->config() == SkBitmap::kIndex8_Config) { 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ct0 = bm0->getColorTable(); 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkColorTable* ct1 = bm1->getColorTable(); 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (NULL == ct0 || NULL == ct1) { 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ct0->count() != ct1->count()) { 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockColors alc0(ct0); 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SkAutoLockColors alc1(ct1); 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t size = ct0->count() * sizeof(SkPMColor); 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (memcmp(alc0.colors(), alc1.colors(), size) != 0) { 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // now compare each scanline. We can't do the entire buffer at once, 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // since we don't care about the pixel values that might extend beyond 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // the width (since the scanline might be larger than the logical width) 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int h = bm0->height(); 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t size = bm0->width() * bm0->bytesPerPixel(); 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int y = 0; y < h; y++) { 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (memcmp(bm0->getAddr(0, y), bm1->getAddr(0, y), size) != 0) { 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return false; 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return true; 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void Bitmap_prepareToDraw(JNIEnv* env, jobject, SkBitmap* bitmap) { 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->lockPixels(); 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bitmap->unlockPixels(); 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic JNINativeMethod gBitmapMethods[] = { 5870927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeCreate", "([IIIIIIZ)Landroid/graphics/Bitmap;", 5880927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_creator }, 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nativeCopy", "(IIZ)Landroid/graphics/Bitmap;", 5900927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_copy }, 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nativeDestructor", "(I)V", (void*)Bitmap_destructor }, 5920927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeRecycle", "(I)V", (void*)Bitmap_recycle }, 5930927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeCompress", "(IIILjava/io/OutputStream;[B)Z", 5940927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_compress }, 5950927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeErase", "(II)V", (void*)Bitmap_erase }, 5960927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeWidth", "(I)I", (void*)Bitmap_width }, 5970927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeHeight", "(I)I", (void*)Bitmap_height }, 5980927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeRowBytes", "(I)I", (void*)Bitmap_rowBytes }, 5990927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeConfig", "(I)I", (void*)Bitmap_config }, 600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nativeHasAlpha", "(I)Z", (void*)Bitmap_hasAlpha }, 6010927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeSetHasAlpha", "(IZ)V", (void*)Bitmap_setHasAlpha }, 6020927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeCreateFromParcel", 6030927bf9690127bc45cf8837a1467759e9720399aMike Lockwood "(Landroid/os/Parcel;)Landroid/graphics/Bitmap;", 6040927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_createFromParcel }, 6050927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeWriteToParcel", "(IZILandroid/os/Parcel;)Z", 6060927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_writeToParcel }, 6070927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeExtractAlpha", "(II[I)Landroid/graphics/Bitmap;", 6080927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_extractAlpha }, 6090927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeGetPixel", "(III)I", (void*)Bitmap_getPixel }, 6100927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeGetPixels", "(I[IIIIIII)V", (void*)Bitmap_getPixels }, 6110927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeSetPixel", "(IIII)V", (void*)Bitmap_setPixel }, 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nativeSetPixels", "(I[IIIIIII)V", (void*)Bitmap_setPixels }, 6130927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeCopyPixelsToBuffer", "(ILjava/nio/Buffer;)V", 6140927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_copyPixelsToBuffer }, 6150927bf9690127bc45cf8837a1467759e9720399aMike Lockwood { "nativeCopyPixelsFromBuffer", "(ILjava/nio/Buffer;)V", 6160927bf9690127bc45cf8837a1467759e9720399aMike Lockwood (void*)Bitmap_copyPixelsFromBuffer }, 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nativeSameAs", "(II)Z", (void*)Bitmap_sameAs }, 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "nativePrepareToDraw", "(I)V", (void*)Bitmap_prepareToDraw }, 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define kClassPathName "android/graphics/Bitmap" 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint register_android_graphics_Bitmap(JNIEnv* env); 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint register_android_graphics_Bitmap(JNIEnv* env) 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return android::AndroidRuntime::registerNativeMethods(env, kClassPathName, 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gBitmapMethods, SK_ARRAY_COUNT(gBitmapMethods)); 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project