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