1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*38e8c45fSAndroid Build Coastguard Worker * 4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*38e8c45fSAndroid Build Coastguard Worker * 8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*38e8c45fSAndroid Build Coastguard Worker * 10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License. 15*38e8c45fSAndroid Build Coastguard Worker */ 16*38e8c45fSAndroid Build Coastguard Worker 17*38e8c45fSAndroid Build Coastguard Worker /** 18*38e8c45fSAndroid Build Coastguard Worker * @addtogroup Bitmap 19*38e8c45fSAndroid Build Coastguard Worker * @{ 20*38e8c45fSAndroid Build Coastguard Worker */ 21*38e8c45fSAndroid Build Coastguard Worker 22*38e8c45fSAndroid Build Coastguard Worker /** 23*38e8c45fSAndroid Build Coastguard Worker * @file bitmap.h 24*38e8c45fSAndroid Build Coastguard Worker */ 25*38e8c45fSAndroid Build Coastguard Worker 26*38e8c45fSAndroid Build Coastguard Worker #ifndef ANDROID_BITMAP_H 27*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_BITMAP_H 28*38e8c45fSAndroid Build Coastguard Worker 29*38e8c45fSAndroid Build Coastguard Worker #include <stdbool.h> 30*38e8c45fSAndroid Build Coastguard Worker #include <stdint.h> 31*38e8c45fSAndroid Build Coastguard Worker #include <stddef.h> 32*38e8c45fSAndroid Build Coastguard Worker #include <jni.h> 33*38e8c45fSAndroid Build Coastguard Worker 34*38e8c45fSAndroid Build Coastguard Worker #if !defined(__INTRODUCED_IN) 35*38e8c45fSAndroid Build Coastguard Worker #define __INTRODUCED_IN(__api_level) /* nothing */ 36*38e8c45fSAndroid Build Coastguard Worker #endif 37*38e8c45fSAndroid Build Coastguard Worker 38*38e8c45fSAndroid Build Coastguard Worker #ifdef __cplusplus 39*38e8c45fSAndroid Build Coastguard Worker extern "C" { 40*38e8c45fSAndroid Build Coastguard Worker #endif 41*38e8c45fSAndroid Build Coastguard Worker 42*38e8c45fSAndroid Build Coastguard Worker /** AndroidBitmap functions result code. */ 43*38e8c45fSAndroid Build Coastguard Worker enum { 44*38e8c45fSAndroid Build Coastguard Worker /** Operation was successful. */ 45*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_RESULT_SUCCESS = 0, 46*38e8c45fSAndroid Build Coastguard Worker /** Bad parameter. */ 47*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_RESULT_BAD_PARAMETER = -1, 48*38e8c45fSAndroid Build Coastguard Worker /** JNI exception occured. */ 49*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_RESULT_JNI_EXCEPTION = -2, 50*38e8c45fSAndroid Build Coastguard Worker /** Allocation failed. */ 51*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_RESULT_ALLOCATION_FAILED = -3, 52*38e8c45fSAndroid Build Coastguard Worker }; 53*38e8c45fSAndroid Build Coastguard Worker 54*38e8c45fSAndroid Build Coastguard Worker /** Backward compatibility: this macro used to be misspelled. */ 55*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_BITMAP_RESUT_SUCCESS ANDROID_BITMAP_RESULT_SUCCESS 56*38e8c45fSAndroid Build Coastguard Worker 57*38e8c45fSAndroid Build Coastguard Worker /** Bitmap pixel format. */ 58*38e8c45fSAndroid Build Coastguard Worker enum AndroidBitmapFormat { 59*38e8c45fSAndroid Build Coastguard Worker /** No format. */ 60*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_NONE = 0, 61*38e8c45fSAndroid Build Coastguard Worker /** Red: 8 bits, Green: 8 bits, Blue: 8 bits, Alpha: 8 bits. **/ 62*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_RGBA_8888 = 1, 63*38e8c45fSAndroid Build Coastguard Worker /** Red: 5 bits, Green: 6 bits, Blue: 5 bits. **/ 64*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_RGB_565 = 4, 65*38e8c45fSAndroid Build Coastguard Worker /** Deprecated in API level 13. Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead. **/ 66*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_RGBA_4444 = 7, 67*38e8c45fSAndroid Build Coastguard Worker /** Alpha: 8 bits. */ 68*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_A_8 = 8, 69*38e8c45fSAndroid Build Coastguard Worker /** Each component is stored as a half float. **/ 70*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_RGBA_F16 = 9, 71*38e8c45fSAndroid Build Coastguard Worker /** Red: 10 bits, Green: 10 bits, Blue: 10 bits, Alpha: 2 bits. **/ 72*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FORMAT_RGBA_1010102 = 10, 73*38e8c45fSAndroid Build Coastguard Worker }; 74*38e8c45fSAndroid Build Coastguard Worker 75*38e8c45fSAndroid Build Coastguard Worker /** Bitmap alpha format */ 76*38e8c45fSAndroid Build Coastguard Worker enum { 77*38e8c45fSAndroid Build Coastguard Worker /** Pixel components are premultiplied by alpha. */ 78*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FLAGS_ALPHA_PREMUL = 0, 79*38e8c45fSAndroid Build Coastguard Worker /** Pixels are opaque. */ 80*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FLAGS_ALPHA_OPAQUE = 1, 81*38e8c45fSAndroid Build Coastguard Worker /** Pixel components are independent of alpha. */ 82*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FLAGS_ALPHA_UNPREMUL = 2, 83*38e8c45fSAndroid Build Coastguard Worker /** Bit mask for AndroidBitmapFormat.flags to isolate the alpha. */ 84*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FLAGS_ALPHA_MASK = 0x3, 85*38e8c45fSAndroid Build Coastguard Worker /** Shift for AndroidBitmapFormat.flags to isolate the alpha. */ 86*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FLAGS_ALPHA_SHIFT = 0, 87*38e8c45fSAndroid Build Coastguard Worker }; 88*38e8c45fSAndroid Build Coastguard Worker 89*38e8c45fSAndroid Build Coastguard Worker enum { 90*38e8c45fSAndroid Build Coastguard Worker /** If this bit is set in AndroidBitmapInfo.flags, the Bitmap uses the 91*38e8c45fSAndroid Build Coastguard Worker * HARDWARE Config, and its {@link AHardwareBuffer} can be retrieved via 92*38e8c45fSAndroid Build Coastguard Worker * {@link AndroidBitmap_getHardwareBuffer}. 93*38e8c45fSAndroid Build Coastguard Worker */ 94*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_FLAGS_IS_HARDWARE = 1 << 31, 95*38e8c45fSAndroid Build Coastguard Worker }; 96*38e8c45fSAndroid Build Coastguard Worker 97*38e8c45fSAndroid Build Coastguard Worker /** Bitmap info, see AndroidBitmap_getInfo(). */ 98*38e8c45fSAndroid Build Coastguard Worker typedef struct { 99*38e8c45fSAndroid Build Coastguard Worker /** The bitmap width in pixels. */ 100*38e8c45fSAndroid Build Coastguard Worker uint32_t width; 101*38e8c45fSAndroid Build Coastguard Worker /** The bitmap height in pixels. */ 102*38e8c45fSAndroid Build Coastguard Worker uint32_t height; 103*38e8c45fSAndroid Build Coastguard Worker /** The number of byte per row. */ 104*38e8c45fSAndroid Build Coastguard Worker uint32_t stride; 105*38e8c45fSAndroid Build Coastguard Worker /** The bitmap pixel format. See {@link AndroidBitmapFormat} */ 106*38e8c45fSAndroid Build Coastguard Worker int32_t format; 107*38e8c45fSAndroid Build Coastguard Worker /** Bitfield containing information about the bitmap. 108*38e8c45fSAndroid Build Coastguard Worker * 109*38e8c45fSAndroid Build Coastguard Worker * <p>Two bits are used to encode alpha. Use {@link ANDROID_BITMAP_FLAGS_ALPHA_MASK} 110*38e8c45fSAndroid Build Coastguard Worker * and {@link ANDROID_BITMAP_FLAGS_ALPHA_SHIFT} to retrieve them.</p> 111*38e8c45fSAndroid Build Coastguard Worker * 112*38e8c45fSAndroid Build Coastguard Worker * <p>One bit is used to encode whether the Bitmap uses the HARDWARE Config. Use 113*38e8c45fSAndroid Build Coastguard Worker * {@link ANDROID_BITMAP_FLAGS_IS_HARDWARE} to know.</p> 114*38e8c45fSAndroid Build Coastguard Worker * 115*38e8c45fSAndroid Build Coastguard Worker * <p>These flags were introduced in API level 30.</p> 116*38e8c45fSAndroid Build Coastguard Worker */ 117*38e8c45fSAndroid Build Coastguard Worker uint32_t flags; 118*38e8c45fSAndroid Build Coastguard Worker } AndroidBitmapInfo; 119*38e8c45fSAndroid Build Coastguard Worker 120*38e8c45fSAndroid Build Coastguard Worker /** 121*38e8c45fSAndroid Build Coastguard Worker * Given a java bitmap object, fill out the {@link AndroidBitmapInfo} struct for it. 122*38e8c45fSAndroid Build Coastguard Worker * If the call fails, the info parameter will be ignored. 123*38e8c45fSAndroid Build Coastguard Worker */ 124*38e8c45fSAndroid Build Coastguard Worker int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap, 125*38e8c45fSAndroid Build Coastguard Worker AndroidBitmapInfo* info); 126*38e8c45fSAndroid Build Coastguard Worker 127*38e8c45fSAndroid Build Coastguard Worker /** 128*38e8c45fSAndroid Build Coastguard Worker * Given a java bitmap object, return its {@link ADataSpace}. 129*38e8c45fSAndroid Build Coastguard Worker * 130*38e8c45fSAndroid Build Coastguard Worker * Note that {@link ADataSpace} only exposes a few values. This may return 131*38e8c45fSAndroid Build Coastguard Worker * {@link ADATASPACE_UNKNOWN}, even for Named ColorSpaces, if they have no 132*38e8c45fSAndroid Build Coastguard Worker * corresponding ADataSpace. 133*38e8c45fSAndroid Build Coastguard Worker * 134*38e8c45fSAndroid Build Coastguard Worker * Available since API level 30. 135*38e8c45fSAndroid Build Coastguard Worker */ 136*38e8c45fSAndroid Build Coastguard Worker int32_t AndroidBitmap_getDataSpace(JNIEnv* env, jobject jbitmap) __INTRODUCED_IN(30); 137*38e8c45fSAndroid Build Coastguard Worker 138*38e8c45fSAndroid Build Coastguard Worker /** 139*38e8c45fSAndroid Build Coastguard Worker * Given a java bitmap object, attempt to lock the pixel address. 140*38e8c45fSAndroid Build Coastguard Worker * Locking will ensure that the memory for the pixels will not move 141*38e8c45fSAndroid Build Coastguard Worker * until the unlockPixels call, and ensure that, if the pixels had been 142*38e8c45fSAndroid Build Coastguard Worker * previously purged, they will have been restored. 143*38e8c45fSAndroid Build Coastguard Worker * 144*38e8c45fSAndroid Build Coastguard Worker * If this call succeeds, it must be balanced by a call to 145*38e8c45fSAndroid Build Coastguard Worker * AndroidBitmap_unlockPixels, after which time the address of the pixels should 146*38e8c45fSAndroid Build Coastguard Worker * no longer be used. 147*38e8c45fSAndroid Build Coastguard Worker * 148*38e8c45fSAndroid Build Coastguard Worker * If this succeeds, *addrPtr will be set to the pixel address. If the call 149*38e8c45fSAndroid Build Coastguard Worker * fails, addrPtr will be ignored. 150*38e8c45fSAndroid Build Coastguard Worker */ 151*38e8c45fSAndroid Build Coastguard Worker int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr); 152*38e8c45fSAndroid Build Coastguard Worker 153*38e8c45fSAndroid Build Coastguard Worker /** 154*38e8c45fSAndroid Build Coastguard Worker * Call this to balance a successful call to AndroidBitmap_lockPixels. 155*38e8c45fSAndroid Build Coastguard Worker */ 156*38e8c45fSAndroid Build Coastguard Worker int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap); 157*38e8c45fSAndroid Build Coastguard Worker 158*38e8c45fSAndroid Build Coastguard Worker // Note: these values match android.graphics.Bitmap#compressFormat. 159*38e8c45fSAndroid Build Coastguard Worker 160*38e8c45fSAndroid Build Coastguard Worker /** 161*38e8c45fSAndroid Build Coastguard Worker * Specifies the formats that can be compressed to with 162*38e8c45fSAndroid Build Coastguard Worker * {@link AndroidBitmap_compress}. 163*38e8c45fSAndroid Build Coastguard Worker */ 164*38e8c45fSAndroid Build Coastguard Worker enum AndroidBitmapCompressFormat { 165*38e8c45fSAndroid Build Coastguard Worker /** 166*38e8c45fSAndroid Build Coastguard Worker * Compress to the JPEG format. quality of 0 means 167*38e8c45fSAndroid Build Coastguard Worker * compress for the smallest size. 100 means compress for max 168*38e8c45fSAndroid Build Coastguard Worker * visual quality. 169*38e8c45fSAndroid Build Coastguard Worker */ 170*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_COMPRESS_FORMAT_JPEG = 0, 171*38e8c45fSAndroid Build Coastguard Worker /** 172*38e8c45fSAndroid Build Coastguard Worker * Compress to the PNG format. PNG is lossless, so quality is 173*38e8c45fSAndroid Build Coastguard Worker * ignored. 174*38e8c45fSAndroid Build Coastguard Worker */ 175*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_COMPRESS_FORMAT_PNG = 1, 176*38e8c45fSAndroid Build Coastguard Worker /** 177*38e8c45fSAndroid Build Coastguard Worker * Compress to the WEBP lossy format. quality of 0 means 178*38e8c45fSAndroid Build Coastguard Worker * compress for the smallest size. 100 means compress for max 179*38e8c45fSAndroid Build Coastguard Worker * visual quality. 180*38e8c45fSAndroid Build Coastguard Worker */ 181*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_COMPRESS_FORMAT_WEBP_LOSSY = 3, 182*38e8c45fSAndroid Build Coastguard Worker /** 183*38e8c45fSAndroid Build Coastguard Worker * Compress to the WEBP lossless format. quality refers to how 184*38e8c45fSAndroid Build Coastguard Worker * much effort to put into compression. A value of 0 means to 185*38e8c45fSAndroid Build Coastguard Worker * compress quickly, resulting in a relatively large file size. 186*38e8c45fSAndroid Build Coastguard Worker * 100 means to spend more time compressing, resulting in a 187*38e8c45fSAndroid Build Coastguard Worker * smaller file. 188*38e8c45fSAndroid Build Coastguard Worker */ 189*38e8c45fSAndroid Build Coastguard Worker ANDROID_BITMAP_COMPRESS_FORMAT_WEBP_LOSSLESS = 4, 190*38e8c45fSAndroid Build Coastguard Worker }; 191*38e8c45fSAndroid Build Coastguard Worker 192*38e8c45fSAndroid Build Coastguard Worker /** 193*38e8c45fSAndroid Build Coastguard Worker * User-defined function for writing the output of compression. 194*38e8c45fSAndroid Build Coastguard Worker * 195*38e8c45fSAndroid Build Coastguard Worker * Available since API level 30. 196*38e8c45fSAndroid Build Coastguard Worker * 197*38e8c45fSAndroid Build Coastguard Worker * @param userContext Pointer to user-defined data passed to 198*38e8c45fSAndroid Build Coastguard Worker * {@link AndroidBitmap_compress}. 199*38e8c45fSAndroid Build Coastguard Worker * @param data Compressed data of `size` bytes to write. 200*38e8c45fSAndroid Build Coastguard Worker * @param size Length in bytes of data to write. 201*38e8c45fSAndroid Build Coastguard Worker * @return Whether the operation succeeded. 202*38e8c45fSAndroid Build Coastguard Worker */ 203*38e8c45fSAndroid Build Coastguard Worker typedef bool (*AndroidBitmap_CompressWriteFunc)(void* userContext, 204*38e8c45fSAndroid Build Coastguard Worker const void* data, 205*38e8c45fSAndroid Build Coastguard Worker size_t size) __INTRODUCED_IN(30); 206*38e8c45fSAndroid Build Coastguard Worker 207*38e8c45fSAndroid Build Coastguard Worker /** 208*38e8c45fSAndroid Build Coastguard Worker * Compress `pixels` as described by `info`. 209*38e8c45fSAndroid Build Coastguard Worker * 210*38e8c45fSAndroid Build Coastguard Worker * Available since API level 30. 211*38e8c45fSAndroid Build Coastguard Worker * 212*38e8c45fSAndroid Build Coastguard Worker * @param info Description of the pixels to compress. 213*38e8c45fSAndroid Build Coastguard Worker * @param dataspace {@link ADataSpace} describing the color space of the 214*38e8c45fSAndroid Build Coastguard Worker * pixels. 215*38e8c45fSAndroid Build Coastguard Worker * @param pixels Pointer to pixels to compress. 216*38e8c45fSAndroid Build Coastguard Worker * @param format {@link AndroidBitmapCompressFormat} to compress to. 217*38e8c45fSAndroid Build Coastguard Worker * @param quality Hint to the compressor, 0-100. The value is interpreted 218*38e8c45fSAndroid Build Coastguard Worker * differently depending on the 219*38e8c45fSAndroid Build Coastguard Worker * {@link AndroidBitmapCompressFormat}. 220*38e8c45fSAndroid Build Coastguard Worker * @param userContext User-defined data which will be passed to the supplied 221*38e8c45fSAndroid Build Coastguard Worker * {@link AndroidBitmap_CompressWriteFunc} each time it is 222*38e8c45fSAndroid Build Coastguard Worker * called. May be null. 223*38e8c45fSAndroid Build Coastguard Worker * @param fn Function that writes the compressed data. Will be called each time 224*38e8c45fSAndroid Build Coastguard Worker * the compressor has compressed more data that is ready to be 225*38e8c45fSAndroid Build Coastguard Worker * written. May be called more than once for each call to this method. 226*38e8c45fSAndroid Build Coastguard Worker * May not be null. 227*38e8c45fSAndroid Build Coastguard Worker * @return AndroidBitmap functions result code. 228*38e8c45fSAndroid Build Coastguard Worker */ 229*38e8c45fSAndroid Build Coastguard Worker int AndroidBitmap_compress(const AndroidBitmapInfo* info, 230*38e8c45fSAndroid Build Coastguard Worker int32_t dataspace, 231*38e8c45fSAndroid Build Coastguard Worker const void* pixels, 232*38e8c45fSAndroid Build Coastguard Worker int32_t format, int32_t quality, 233*38e8c45fSAndroid Build Coastguard Worker void* userContext, 234*38e8c45fSAndroid Build Coastguard Worker AndroidBitmap_CompressWriteFunc fn) __INTRODUCED_IN(30); 235*38e8c45fSAndroid Build Coastguard Worker 236*38e8c45fSAndroid Build Coastguard Worker struct AHardwareBuffer; 237*38e8c45fSAndroid Build Coastguard Worker typedef struct AHardwareBuffer AHardwareBuffer; 238*38e8c45fSAndroid Build Coastguard Worker 239*38e8c45fSAndroid Build Coastguard Worker /** 240*38e8c45fSAndroid Build Coastguard Worker * Retrieve the native object associated with a HARDWARE Bitmap. 241*38e8c45fSAndroid Build Coastguard Worker * 242*38e8c45fSAndroid Build Coastguard Worker * Client must not modify it while a Bitmap is wrapping it. 243*38e8c45fSAndroid Build Coastguard Worker * 244*38e8c45fSAndroid Build Coastguard Worker * Available since API level 30. 245*38e8c45fSAndroid Build Coastguard Worker * 246*38e8c45fSAndroid Build Coastguard Worker * @param env Handle to the JNI environment pointer. 247*38e8c45fSAndroid Build Coastguard Worker * @param bitmap Handle to an android.graphics.Bitmap. 248*38e8c45fSAndroid Build Coastguard Worker * @param outBuffer On success, is set to a pointer to the 249*38e8c45fSAndroid Build Coastguard Worker * {@link AHardwareBuffer} associated with bitmap. This acquires 250*38e8c45fSAndroid Build Coastguard Worker * a reference on the buffer, and the client must call 251*38e8c45fSAndroid Build Coastguard Worker * {@link AHardwareBuffer_release} when finished with it. 252*38e8c45fSAndroid Build Coastguard Worker * @return AndroidBitmap functions result code. 253*38e8c45fSAndroid Build Coastguard Worker * {@link ANDROID_BITMAP_RESULT_BAD_PARAMETER} if bitmap is not a 254*38e8c45fSAndroid Build Coastguard Worker * HARDWARE Bitmap. 255*38e8c45fSAndroid Build Coastguard Worker */ 256*38e8c45fSAndroid Build Coastguard Worker int AndroidBitmap_getHardwareBuffer(JNIEnv* env, jobject bitmap, 257*38e8c45fSAndroid Build Coastguard Worker AHardwareBuffer** outBuffer) __INTRODUCED_IN(30); 258*38e8c45fSAndroid Build Coastguard Worker 259*38e8c45fSAndroid Build Coastguard Worker #ifdef __cplusplus 260*38e8c45fSAndroid Build Coastguard Worker } 261*38e8c45fSAndroid Build Coastguard Worker #endif 262*38e8c45fSAndroid Build Coastguard Worker 263*38e8c45fSAndroid Build Coastguard Worker #endif 264*38e8c45fSAndroid Build Coastguard Worker 265*38e8c45fSAndroid Build Coastguard Worker /** @} */ 266