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