1ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#ifndef _ANDROID_GRAPHICS_GRAPHICS_JNI_H_ 2ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#define _ANDROID_GRAPHICS_GRAPHICS_JNI_H_ 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4f29ed28c7b878ef28058bc730715d0d32445bc57John Reck#include "Bitmap.h" 5e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkBitmap.h" 61f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett#include "SkBRDAllocator.h" 71f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett#include "SkCodec.h" 8e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkDevice.h" 9e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkPixelRef.h" 10e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkMallocPixelRef.h" 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPoint.h" 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkRect.h" 135827cb5059ed0eec4c73adf1acbd7ee47b2c5c8fDerek Sollenberger#include "SkImageDecoder.h" 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 15dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <hwui/Canvas.h> 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarettclass SkBitmapRegionDecoder; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkCanvas; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 203d528c403c8945cc326bb656ff0c2e11373401daRaph Leviennamespace android { 216ba30b85ddfbe37c338ee8dde3dd33322eb38d47Behdad Esfahbodclass Paint; 22bad99183916ba2bac6659efc8a28273e344ba511sergeyvstruct Typeface; 233d528c403c8945cc326bb656ff0c2e11373401daRaph Levien} 243d528c403c8945cc326bb656ff0c2e11373401daRaph Levien 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GraphicsJNI { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 271abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik enum BitmapCreateFlags { 281abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik kBitmapCreateFlag_None = 0x0, 291abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik kBitmapCreateFlag_Mutable = 0x1, 301abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik kBitmapCreateFlag_Premultiplied = 0x2, 311abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik }; 321abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // returns true if an exception is set (and dumps it out to the Log) 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static bool hasException(JNIEnv*); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void get_jrect(JNIEnv*, jobject jrect, int* L, int* T, int* R, int* B); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void set_jrect(JNIEnv*, jobject jrect, int L, int T, int R, int B); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkIRect* jrect_to_irect(JNIEnv*, jobject jrect, SkIRect*); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void irect_to_jrect(const SkIRect&, JNIEnv*, jobject jrect); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRect* jrectf_to_rect(JNIEnv*, jobject jrectf, SkRect*); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRect* jrect_to_rect(JNIEnv*, jobject jrect, SkRect*); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void rect_to_jrectf(const SkRect&, JNIEnv*, jobject jrectf); 458451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void set_jpoint(JNIEnv*, jobject jrect, int x, int y); 478451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkIPoint* jpoint_to_ipoint(JNIEnv*, jobject jpoint, SkIPoint* point); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void ipoint_to_jpoint(const SkIPoint& point, JNIEnv*, jobject jpoint); 508451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPoint* jpointf_to_point(JNIEnv*, jobject jpointf, SkPoint* point); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf); 538451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 54c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas); 55f29ed28c7b878ef28058bc730715d0d32445bc57John Reck static android::Bitmap* getBitmap(JNIEnv*, jobject bitmap); 56ed207b92747234eac88dd3664ecfb535e45d8ed1John Reck static void getSkBitmap(JNIEnv*, jobject bitmap, SkBitmap* outBitmap); 57ae2e8b4891491e8e89bed5f2c9626415adee09cbJohn Reck static SkPixelRef* refSkPixelRef(JNIEnv*, jobject bitmap); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRegion* getNativeRegion(JNIEnv*, jobject region); 598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 604c9355c35a0f62805739823a62ad41ca1cbc6502Mike Reed // Given the 'native' long held by the Rasterizer.java object, return a 614c9355c35a0f62805739823a62ad41ca1cbc6502Mike Reed // ref to its SkRasterizer* (or NULL). 624c9355c35a0f62805739823a62ad41ca1cbc6502Mike Reed static SkRasterizer* refNativeRasterizer(jlong rasterizerHandle); 634c9355c35a0f62805739823a62ad41ca1cbc6502Mike Reed 641103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed /* 651103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed * LegacyBitmapConfig is the old enum in Skia that matched the enum int values 661103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed * in Bitmap.Config. Skia no longer supports this config, but has replaced it 671103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed * with SkColorType. These routines convert between the two. 681103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed */ 691103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed static SkColorType legacyBitmapConfigToColorType(jint legacyConfig); 701103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed static jint colorTypeToLegacyBitmapConfig(SkColorType colorType); 711103b3255945d2eb2fa9c191e84e2270b343cca9Mike Reed 7242a1d08df7d417fd4e67eabc91ff05ee77fd9995Mike Reed /** Return the corresponding native colorType from the java Config enum, 7342a1d08df7d417fd4e67eabc91ff05ee77fd9995Mike Reed or kUnknown_SkColorType if the java object is null. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7542a1d08df7d417fd4e67eabc91ff05ee77fd9995Mike Reed static SkColorType getNativeBitmapColorType(JNIEnv*, jobject jconfig); 768451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 77f29ed28c7b878ef28058bc730715d0d32445bc57John Reck /* 78f29ed28c7b878ef28058bc730715d0d32445bc57John Reck * Create a java Bitmap object given the native bitmap 79f29ed28c7b878ef28058bc730715d0d32445bc57John Reck * bitmap's SkAlphaType must already be in sync with bitmapCreateFlags. 80e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy */ 81f29ed28c7b878ef28058bc730715d0d32445bc57John Reck static jobject createBitmap(JNIEnv* env, android::Bitmap* bitmap, 82f29ed28c7b878ef28058bc730715d0d32445bc57John Reck int bitmapCreateFlags, jbyteArray ninePatchChunk = NULL, 83f29ed28c7b878ef28058bc730715d0d32445bc57John Reck jobject ninePatchInsets = NULL, int density = -1); 848451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 858790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III /** Reinitialize a bitmap. bitmap must already have its SkAlphaType set in 868790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III sync with isPremultiplied 878790be6de3644e332ec6a17c855da89ffc13a9bfLeon Scroggins III */ 88f29ed28c7b878ef28058bc730715d0d32445bc57John Reck static void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info, 891abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik bool isPremultiplied); 909f58361e98be7386a4eadd3aa254e9b7d09d0a3bChris Craik 919f58361e98be7386a4eadd3aa254e9b7d09d0a3bChris Craik static int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap); 929f58361e98be7386a4eadd3aa254e9b7d09d0a3bChris Craik 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jobject createRegion(JNIEnv* env, SkRegion* region); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 951f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett static jobject createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecoder* bitmap); 96f1f48bc7f200f54c76b22d845d8ba8419879b375Joseph Wen 97f29ed28c7b878ef28058bc730715d0d32445bc57John Reck static android::Bitmap* allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap, 981abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik SkColorTable* ctable); 99e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 10039d7f30ebe490c1d6aee76b0b61e3e67dec13e34Riley Andrews static android::Bitmap* allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap, 10139d7f30ebe490c1d6aee76b0b61e3e67dec13e34Riley Andrews SkColorTable* ctable); 10239d7f30ebe490c1d6aee76b0b61e3e67dec13e34Riley Andrews 10339d7f30ebe490c1d6aee76b0b61e3e67dec13e34Riley Andrews static android::Bitmap* mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap, 104a316c5dfbc6355f536d765959cacb06bbfed76adJeff Brown SkColorTable* ctable, int fd, void* addr, bool readOnly); 10539d7f30ebe490c1d6aee76b0b61e3e67dec13e34Riley Andrews 1063d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger /** 1073d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger * Given a bitmap we natively allocate a memory block to store the contents 1083d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger * of that bitmap. The memory is then attached to the bitmap via an 1093d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger * SkPixelRef, which ensures that upon deletion the appropriate caches 1103d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger * are notified. 1113d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger */ 1123d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger static bool allocatePixels(JNIEnv* env, SkBitmap* bitmap, SkColorTable* ctable); 1133d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Copy the colors in colors[] to the bitmap, convert to the correct 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format along the way. 11657ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III Whether to use premultiplied pixels is determined by dstBitmap's alphaType. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static bool SetPixels(JNIEnv* env, jintArray colors, int srcOffset, 1191abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik int srcStride, int x, int y, int width, int height, 12057ee620ced8caed1eb8651717f6a6d2d5f1f9a5bLeon Scroggins III const SkBitmap& dstBitmap); 121e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy}; 122e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 123e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy/** Allocator which allocates the backing buffer in the Java heap. 124e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * Instances can only be used to perform a single allocation, which helps 125e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * ensure that the allocated buffer is properly accounted for with a 126e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * reference in the heap (or a JNI global reference). 127e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy */ 1281f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarettclass JavaPixelAllocator : public SkBRDAllocator { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 13012d81c49a015ed8d5ef7af2d854eee1e80472219Carl Shapiro JavaPixelAllocator(JNIEnv* env); 131f29ed28c7b878ef28058bc730715d0d32445bc57John Reck ~JavaPixelAllocator(); 1328451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 133f29ed28c7b878ef28058bc730715d0d32445bc57John Reck virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) override; 134afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy 135f29ed28c7b878ef28058bc730715d0d32445bc57John Reck /** 136f29ed28c7b878ef28058bc730715d0d32445bc57John Reck * Fetches the backing allocation object. Must be called! 137afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy */ 138f29ed28c7b878ef28058bc730715d0d32445bc57John Reck android::Bitmap* getStorageObjAndReset() { 139f29ed28c7b878ef28058bc730715d0d32445bc57John Reck android::Bitmap* result = mStorage; 140f29ed28c7b878ef28058bc730715d0d32445bc57John Reck mStorage = NULL; 141afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy return result; 142afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy }; 143e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 1441f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett /** 1451f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * Indicates that this allocator allocates zero initialized 1461f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * memory. 1471f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett */ 1481f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett SkCodec::ZeroInitialized zeroInit() const override { return SkCodec::kYes_ZeroInitialized; } 1491f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 151f29ed28c7b878ef28058bc730715d0d32445bc57John Reck JavaVM* mJavaVM; 152f29ed28c7b878ef28058bc730715d0d32445bc57John Reck android::Bitmap* mStorage = nullptr; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1551f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett/** 1561f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * Allocator to handle reusing bitmaps for BitmapRegionDecoder. 1571f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * 1581f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * The BitmapRegionDecoder documentation states that, if it is 1591f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * provided, the recycled bitmap will always be reused, clipping 1601f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * the decoded output to fit in the recycled bitmap if necessary. 1611f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * This allocator implements that behavior. 1621f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * 1631f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * Skia's SkBitmapRegionDecoder expects the memory that 1641f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * is allocated to be large enough to decode the entire region 1651f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * that is requested. It will decode directly into the memory 1661f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * that is provided. 1671f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * 1681f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * FIXME: BUG:25465958 1691f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * If the recycled bitmap is not large enough for the decode 1701f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * requested, meaning that a clip is required, we will allocate 1711f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * enough memory for Skia to perform the decode, and then copy 1721f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * from the decoded output into the recycled bitmap. 1731f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * 1741f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * If the recycled bitmap is large enough for the decode requested, 1751f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * we will provide that memory for Skia to decode directly into. 1761f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * 1771f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * This allocator should only be used for a single allocation. 1781f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * After we reuse the recycledBitmap once, it is dangerous to 1791f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * reuse it again, given that it still may be in use from our 1801f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * first allocation. 1811f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett */ 1821f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarettclass RecyclingClippingPixelAllocator : public SkBRDAllocator { 1831f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarettpublic: 1841f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 1851f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett RecyclingClippingPixelAllocator(android::Bitmap* recycledBitmap, 1861f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett size_t recycledBytes); 1871f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 1881f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett ~RecyclingClippingPixelAllocator(); 1891f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 1901f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) override; 1911f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 1921f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett /** 1931f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * Must be called! 1941f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * 1951f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * In the event that the recycled bitmap is not large enough for 1961f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * the allocation requested, we will allocate memory on the heap 1971f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * instead. As a final step, once we are done using this memory, 1981f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * we will copy the contents of the heap memory into the recycled 1991f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * bitmap's memory, clipping as necessary. 2001f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett */ 2011f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett void copyIfNecessary(); 2021f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 2031f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett /** 2041f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * Indicates that this allocator does not allocate zero initialized 2051f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett * memory. 2061f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett */ 2071f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett SkCodec::ZeroInitialized zeroInit() const override { return SkCodec::kNo_ZeroInitialized; } 2081f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 2091f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarettprivate: 2101f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett android::Bitmap* mRecycledBitmap; 2111f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett const size_t mRecycledBytes; 2121f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett SkBitmap* mSkiaBitmap; 2131f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett bool mNeedsCopy; 2141f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett}; 2151f979639c168ebdf77ad8d7771786fc321ce8234Matt Sarett 216721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrewsclass AshmemPixelAllocator : public SkBitmap::Allocator { 217721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrewspublic: 218721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews AshmemPixelAllocator(JNIEnv* env); 219721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews ~AshmemPixelAllocator(); 220721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable); 221721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews android::Bitmap* getStorageObjAndReset() { 222721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews android::Bitmap* result = mStorage; 223721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews mStorage = NULL; 224721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews return result; 225721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews }; 226721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews 227721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrewsprivate: 228721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews JavaVM* mJavaVM; 229721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews android::Bitmap* mStorage = nullptr; 230721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews}; 231721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews 232721ae5fec5f1fd4f93aa2a361a0ac298e15ce353Riley Andrews 233c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reedenum JNIAccess { 234c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed kRO_JNIAccess, 235c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed kRW_JNIAccess 236c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed}; 237c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaFloatArray { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 240c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed AutoJavaFloatArray(JNIEnv* env, jfloatArray array, 241c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int minLength = 0, JNIAccess = kRW_JNIAccess); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaFloatArray(); 2438451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float* ptr() const { return fPtr; } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 2468451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloatArray fArray; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float* fPtr; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 252c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int fReleaseMode; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaIntArray { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaIntArray(JNIEnv* env, jintArray array, int minLength = 0); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaIntArray(); 2598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* ptr() const { return fPtr; } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 2628451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray fArray; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* fPtr; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaShortArray { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 272c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed AutoJavaShortArray(JNIEnv* env, jshortArray array, 273c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int minLength = 0, JNIAccess = kRW_JNIAccess); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaShortArray(); 2758451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshort* ptr() const { return fPtr; } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 2788451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshortArray fArray; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshort* fPtr; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 284c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int fReleaseMode; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaByteArray { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaByteArray(JNIEnv* env, jbyteArray array, int minLength = 0); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaByteArray(); 2918451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* ptr() const { return fPtr; } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 2948451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray fArray; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* fPtr; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowNPE(JNIEnv* env); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowAIOOBE(JNIEnv* env); // Array Index Out Of Bounds Exception 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowIAE(JNIEnv* env, const char* msg = NULL); // Illegal Argument 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowRE(JNIEnv* env, const char* msg = NULL); // Runtime 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowISE(JNIEnv* env, const char* msg = NULL); // Illegal State 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowOOME(JNIEnv* env, const char* msg = NULL); // Out of memory 308f1f48bc7f200f54c76b22d845d8ba8419879b375Joseph Wenvoid doThrowIOE(JNIEnv* env, const char* msg = NULL); // IO Exception 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NPE_CHECK_RETURN_ZERO(env, object) \ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { if (NULL == (object)) { doThrowNPE(env); return 0; } } while (0) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NPE_CHECK_RETURN_VOID(env, object) \ 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { if (NULL == (object)) { doThrowNPE(env); return; } } while (0) 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 316ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#endif // _ANDROID_GRAPHICS_GRAPHICS_JNI_H_ 317