diff options
author | John Reck <jreck@google.com> | 2015-03-04 08:36:12 -0800 |
---|---|---|
committer | John Reck <jreck@google.com> | 2015-03-05 09:55:02 -0800 |
commit | b2915245b74b3b5541b123e38403f8e26426b4b7 (patch) | |
tree | 295bee60e89bba1ae2221bf40833a80e6d2c41ef | |
parent | f855b0d2d0c0c157d657668fcb98097e2aca097e (diff) | |
download | frameworks_base-b2915245b74b3b5541b123e38403f8e26426b4b7.zip frameworks_base-b2915245b74b3b5541b123e38403f8e26426b4b7.tar.gz frameworks_base-b2915245b74b3b5541b123e38403f8e26426b4b7.tar.bz2 |
Cleanup Bitmap JNI
Fix a bunch of places where mNativeBitmap was being
poked at directly, switch them either to the NDK API
or to GraphicsJNI where it made sense
Change-Id: I6b3df3712d6497cba828c2d3012e725cb4ebb64d
21 files changed, 113 insertions, 161 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 0d36949..06e196d 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -204,7 +204,7 @@ class GLES20Canvas extends HardwareCanvas { Bitmap bitmap = patch.getBitmap(); throwIfCannotDraw(bitmap); final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); - nDrawPatch(mNativeCanvasWrapper, bitmap.mNativeBitmap, patch.mNativeChunk, + nDrawPatch(mNativeCanvasWrapper, bitmap.getSkBitmap(), patch.mNativeChunk, dst.left, dst.top, dst.right, dst.bottom, nativePaint); } @@ -214,7 +214,7 @@ class GLES20Canvas extends HardwareCanvas { Bitmap bitmap = patch.getBitmap(); throwIfCannotDraw(bitmap); final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); - nDrawPatch(mNativeCanvasWrapper, bitmap.mNativeBitmap, patch.mNativeChunk, + nDrawPatch(mNativeCanvasWrapper, bitmap.getSkBitmap(), patch.mNativeChunk, dst.left, dst.top, dst.right, dst.bottom, nativePaint); } diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index df0838f..69b4c47 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -364,7 +364,7 @@ public class ThreadedRenderer extends HardwareRenderer { @Override boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) { return nCopyLayerInto(mNativeProxy, - layer.getDeferredLayerUpdater(), bitmap.mNativeBitmap); + layer.getDeferredLayerUpdater(), bitmap.getSkBitmap()); } @Override @@ -465,7 +465,7 @@ public class ThreadedRenderer extends HardwareRenderer { for (int i = 0; i < count; i++) { drawables.valueAt(i).addAtlasableBitmaps(tmpList); for (int j = 0; j < tmpList.size(); j++) { - preloadedPointers.add(tmpList.get(j).mNativeBitmap); + preloadedPointers.add(tmpList.get(j).getSkBitmap()); } tmpList.clear(); } diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 28f1a3a..97744ea 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -147,7 +147,7 @@ LOCAL_SRC_FILES:= \ android_hardware_location_ActivityRecognitionHardware.cpp \ android_util_FileObserver.cpp \ android/opengl/poly_clip.cpp.arm \ - android/opengl/util.cpp.arm \ + android/opengl/util.cpp \ android_server_FingerprintManager.cpp \ android_server_NetworkManagementSocketTagger.cpp \ android_server_Watchdog.cpp \ diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 672008d..6a50b52 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -41,7 +41,6 @@ jfieldID gOptions_mimeFieldID; jfieldID gOptions_mCancelID; jfieldID gOptions_bitmapFieldID; -jfieldID gBitmap_nativeBitmapFieldID; jfieldID gBitmap_ninePatchInsetsFieldID; jclass gInsetStruct_class; @@ -262,7 +261,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding SkBitmap* outputBitmap = NULL; unsigned int existingBufferSize = 0; if (javaBitmap != NULL) { - outputBitmap = (SkBitmap*) env->GetLongField(javaBitmap, gBitmap_nativeBitmapFieldID); + outputBitmap = GraphicsJNI::getSkBitmap(env, javaBitmap); if (outputBitmap->isImmutable()) { ALOGW("Unable to reuse an immutable bitmap as an image decoder target."); javaBitmap = NULL; @@ -601,7 +600,6 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { gOptions_mCancelID = GetFieldIDOrDie(env, options_class, "mCancel", "Z"); jclass bitmap_class = FindClassOrDie(env, "android/graphics/Bitmap"); - gBitmap_nativeBitmapFieldID = GetFieldIDOrDie(env, bitmap_class, "mNativeBitmap", "J"); gBitmap_ninePatchInsetsFieldID = GetFieldIDOrDie(env, bitmap_class, "mNinePatchInsets", "Landroid/graphics/NinePatch$InsetStruct;"); diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index 90a7f69..04afe3e 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -213,7 +213,7 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, if (tileBitmap != NULL) { // Re-use bitmap. - bitmap = GraphicsJNI::getNativeBitmap(env, tileBitmap); + bitmap = GraphicsJNI::getSkBitmap(env, tileBitmap); } if (bitmap == NULL) { bitmap = new SkBitmap; diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index dde1393..0747969 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -154,7 +154,7 @@ static jfieldID gPointF_xFieldID; static jfieldID gPointF_yFieldID; static jclass gBitmap_class; -static jfieldID gBitmap_nativeInstanceID; +static jfieldID gBitmap_skBitmapPtr; static jmethodID gBitmap_constructorMethodID; static jmethodID gBitmap_reinitMethodID; static jmethodID gBitmap_getAllocationByteCountMethodID; @@ -338,11 +338,11 @@ SkColorType GraphicsJNI::legacyBitmapConfigToColorType(jint legacyConfig) { return static_cast<SkColorType>(gConfig2ColorType[legacyConfig]); } -SkBitmap* GraphicsJNI::getNativeBitmap(JNIEnv* env, jobject bitmap) { +SkBitmap* GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap) { SkASSERT(env); SkASSERT(bitmap); SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class)); - jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_nativeInstanceID); + jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_skBitmapPtr); SkBitmap* b = reinterpret_cast<SkBitmap*>(bitmapHandle); SkASSERT(b); return b; @@ -676,7 +676,7 @@ int register_android_graphics_Graphics(JNIEnv* env) gPointF_yFieldID = getFieldIDCheck(env, gPointF_class, "y", "F"); gBitmap_class = make_globalref(env, "android/graphics/Bitmap"); - gBitmap_nativeInstanceID = getFieldIDCheck(env, gBitmap_class, "mNativeBitmap", "J"); + gBitmap_skBitmapPtr = getFieldIDCheck(env, gBitmap_class, "mSkBitmapPtr", "J"); gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>", "(J[BIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V"); gBitmap_reinitMethodID = env->GetMethodID(gBitmap_class, "reinit", "(IIZ)V"); gBitmap_getAllocationByteCountMethodID = env->GetMethodID(gBitmap_class, "getAllocationByteCount", "()I"); diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index a202c38..422d3f1 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -48,7 +48,7 @@ public: static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf); static SkCanvas* getNativeCanvas(JNIEnv*, jobject canvas); - static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap); + static SkBitmap* getSkBitmap(JNIEnv*, jobject bitmap); static SkRegion* getNativeRegion(JNIEnv*, jobject region); // Given the 'native' long held by the Rasterizer.java object, return a diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp index 461507f..5c2d0d0 100644 --- a/core/jni/android/opengl/util.cpp +++ b/core/jni/android/opengl/util.cpp @@ -16,6 +16,7 @@ #include "jni.h" #include "JNIHelp.h" +#include "GraphicsJNI.h" #include <math.h> #include <stdio.h> @@ -149,10 +150,6 @@ int visibilityTest(float* pWS, float* pPositions, int positionsLength, return result; } -static void doThrowIAE(JNIEnv* env, const char* msg) { - jniThrowException(env, "java/lang/IllegalArgumentException", msg); -} - template<class JArray, class T> class ArrayHelper { public: @@ -548,14 +545,6 @@ void util_multiplyMV(JNIEnv *env, jclass clazz, // --------------------------------------------------------------------------- -static jfieldID nativeBitmapID = 0; - -void nativeUtilsClassInit(JNIEnv *env, jclass clazz) -{ - jclass bitmapClass = env->FindClass("android/graphics/Bitmap"); - nativeBitmapID = env->GetFieldID(bitmapClass, "mNativeBitmap", "J"); -} - extern void setGLDebugLevel(int level); void setTracingLevel(JNIEnv *env, jclass clazz, jint level) { @@ -629,16 +618,14 @@ static int getType(SkColorType colorType) static jint util_getInternalFormat(JNIEnv *env, jclass clazz, jobject jbitmap) { - SkBitmap const * nativeBitmap = - (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID); + SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); return getInternalFormat(nativeBitmap->colorType()); } static jint util_getType(JNIEnv *env, jclass clazz, jobject jbitmap) { - SkBitmap const * nativeBitmap = - (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID); + SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); return getType(nativeBitmap->colorType()); } @@ -646,8 +633,7 @@ static jint util_texImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jobject jbitmap, jint type, jint border) { - SkBitmap const * nativeBitmap = - (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID); + SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); SkColorType colorType = bitmap.colorType(); if (internalformat < 0) { @@ -694,8 +680,7 @@ static jint util_texSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jobject jbitmap, jint format, jint type) { - SkBitmap const * nativeBitmap = - (SkBitmap const *)env->GetLongField(jbitmap, nativeBitmapID); + SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); SkColorType colorType = bitmap.colorType(); if (format < 0) { @@ -1014,7 +999,6 @@ static JNINativeMethod gVisibilityMethods[] = { }; static JNINativeMethod gUtilsMethods[] = { - {"nativeClassInit", "()V", (void*)nativeUtilsClassInit }, { "native_getInternalFormat", "(Landroid/graphics/Bitmap;)I", (void*) util_getInternalFormat }, { "native_getType", "(Landroid/graphics/Bitmap;)I", (void*) util_getType }, { "native_texImage2D", "(IIILandroid/graphics/Bitmap;II)I", (void*)util_texImage2D }, diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index bbd031e..f6d9a1a 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -80,7 +80,7 @@ status_t android_view_PointerIcon_load(JNIEnv* env, jobject pointerIconObj, jobj jobject bitmapObj = env->GetObjectField(loadedPointerIconObj, gPointerIconClassInfo.mBitmap); if (bitmapObj) { - SkBitmap* bitmap = GraphicsJNI::getNativeBitmap(env, bitmapObj); + SkBitmap* bitmap = GraphicsJNI::getSkBitmap(env, bitmapObj); if (bitmap) { outPointerIcon->bitmap = *bitmap; // use a shared pixel ref } diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp index 6c21bab..7080e2a 100644 --- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp +++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp @@ -30,6 +30,7 @@ #include <gui/GLConsumer.h> #include <gui/Surface.h> +#include <GraphicsJNI.h> #include <SkBitmap.h> #include <SkPixelRef.h> @@ -46,7 +47,6 @@ static jfieldID gContext_EGLContextFieldID; static jfieldID gSurface_EGLSurfaceFieldID; static jfieldID gSurface_NativePixelRefFieldID; static jfieldID gConfig_EGLConfigFieldID; -static jfieldID gBitmap_NativeBitmapFieldID; static inline EGLDisplay getDisplay(JNIEnv* env, jobject o) { if (!o) return EGL_NO_DISPLAY; @@ -85,9 +85,6 @@ static void nativeClassInit(JNIEnv *_env, jclass eglImplClass) jclass surface_class = _env->FindClass("com/google/android/gles_jni/EGLSurfaceImpl"); gSurface_EGLSurfaceFieldID = _env->GetFieldID(surface_class, "mEGLSurface", "J"); gSurface_NativePixelRefFieldID = _env->GetFieldID(surface_class, "mNativePixelRef", "J"); - - jclass bitmap_class = _env->FindClass("android/graphics/Bitmap"); - gBitmap_NativeBitmapFieldID = _env->GetFieldID(bitmap_class, "mNativeBitmap", "J"); } static const jint gNull_attrib_base[] = {EGL_NONE}; @@ -280,9 +277,7 @@ static void jni_eglCreatePixmapSurface(JNIEnv *_env, jobject _this, jobject out_ EGLConfig cnf = getConfig(_env, config); jint* base = 0; - SkBitmap const * nativeBitmap = - (SkBitmap const *)_env->GetLongField(native_pixmap, - gBitmap_NativeBitmapFieldID); + SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(_env, native_pixmap); SkPixelRef* ref = nativeBitmap ? nativeBitmap->pixelRef() : 0; if (ref == NULL) { jniThrowException(_env, "java/lang/IllegalArgumentException", "Bitmap has no PixelRef"); diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 132c6ef..5b20d48 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -21,6 +21,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Trace; import android.util.DisplayMetrics; + import dalvik.system.VMRuntime; import java.io.OutputStream; @@ -37,21 +38,14 @@ public final class Bitmap implements Parcelable { * @see Bitmap#setDensity(int) */ public static final int DENSITY_NONE = 0; - - /** - * Note: mNativeBitmap is used by FaceDetector_jni.cpp - * Don't change/rename without updating FaceDetector_jni.cpp - * - * @hide - */ - public final long mNativeBitmap; + + private final long mSkBitmapPtr; /** * Backing buffer for the Bitmap. */ private byte[] mBuffer; - @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // Keep to finalize native resources private final BitmapFinalizer mFinalizer; private final boolean mIsMutable; @@ -92,11 +86,11 @@ public final class Bitmap implements Parcelable { sDefaultDensity = density; } + @SuppressWarnings("deprecation") static int getDefaultDensity() { if (sDefaultDensity >= 0) { return sDefaultDensity; } - //noinspection deprecation sDefaultDensity = DisplayMetrics.DENSITY_DEVICE; return sDefaultDensity; } @@ -105,7 +99,7 @@ public final class Bitmap implements Parcelable { * Private constructor that must received an already allocated native bitmap * int (pointer). */ - @SuppressWarnings({"UnusedDeclaration"}) // called from JNI + // called from JNI Bitmap(long nativeBitmap, byte[] buffer, int width, int height, int density, boolean isMutable, boolean requestPremultiplied, byte[] ninePatchChunk, NinePatch.InsetStruct ninePatchInsets) { @@ -120,7 +114,7 @@ public final class Bitmap implements Parcelable { mBuffer = buffer; // we delete this in our finalizer - mNativeBitmap = nativeBitmap; + mSkBitmapPtr = nativeBitmap; mNinePatchChunk = ninePatchChunk; mNinePatchInsets = ninePatchInsets; @@ -136,7 +130,7 @@ public final class Bitmap implements Parcelable { * Native bitmap has been reconfigured, so set premult and cached * width/height values */ - @SuppressWarnings({"UnusedDeclaration"}) // called from JNI + // called from JNI void reinit(int width, int height, boolean requestPremultiplied) { mWidth = width; mHeight = height; @@ -227,7 +221,7 @@ public final class Bitmap implements Parcelable { throw new IllegalStateException("native-backed bitmaps may not be reconfigured"); } - nativeReconfigure(mNativeBitmap, width, height, config.nativeInt, mBuffer.length, + nativeReconfigure(mSkBitmapPtr, width, height, config.nativeInt, mBuffer.length, mRequestPremultiplied); mWidth = width; mHeight = height; @@ -305,7 +299,7 @@ public final class Bitmap implements Parcelable { */ public void recycle() { if (!mRecycled && mFinalizer.mNativeBitmap != 0) { - if (nativeRecycle(mNativeBitmap)) { + if (nativeRecycle(mSkBitmapPtr)) { // return value indicates whether native pixel object was actually recycled. // false indicates that it is still in use at the native level and these // objects should not be collected now. They will be collected later when the @@ -331,13 +325,13 @@ public final class Bitmap implements Parcelable { * Returns the generation ID of this bitmap. The generation ID changes * whenever the bitmap is modified. This can be used as an efficient way to * check if a bitmap has changed. - * + * * @return The current generation ID for this bitmap. */ public int getGenerationId() { - return nativeGenerationId(mNativeBitmap); + return nativeGenerationId(mSkBitmapPtr); } - + /** * This is called by methods that want to throw an exception if the bitmap * has already been recycled. @@ -399,12 +393,12 @@ public final class Bitmap implements Parcelable { * encoded: red is stored with 5 bits of precision (32 possible * values), green is stored with 6 bits of precision (64 possible * values) and blue is stored with 5 bits of precision. - * + * * This configuration can produce slight visual artifacts depending * on the configuration of the source. For instance, without * dithering, the result might show a greenish tint. To get better * results dithering should be applied. - * + * * This configuration may be useful when using opaque bitmaps * that do not require high color fidelity. */ @@ -414,18 +408,18 @@ public final class Bitmap implements Parcelable { * Each pixel is stored on 2 bytes. The three RGB color channels * and the alpha channel (translucency) are stored with a 4 bits * precision (16 possible values.) - * + * * This configuration is mostly useful if the application needs * to store translucency information but also needs to save * memory. - * + * * It is recommended to use {@link #ARGB_8888} instead of this * configuration. * * Note: as of {@link android.os.Build.VERSION_CODES#KITKAT}, * any bitmap created with this configuration will be created * using {@link #ARGB_8888} instead. - * + * * @deprecated Because of the poor quality of this configuration, * it is advised to use {@link #ARGB_8888} instead. */ @@ -436,7 +430,7 @@ public final class Bitmap implements Parcelable { * Each pixel is stored on 4 bytes. Each channel (RGB and alpha * for translucency) is stored with 8 bits of precision (256 * possible values.) - * + * * This configuration is very flexible and offers the best * quality. It should be used whenever possible. */ @@ -444,11 +438,10 @@ public final class Bitmap implements Parcelable { final int nativeInt; - @SuppressWarnings({"deprecation"}) private static Config sConfigs[] = { null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888 }; - + Config(int ni) { this.nativeInt = ni; } @@ -492,7 +485,7 @@ public final class Bitmap implements Parcelable { throw new RuntimeException("Buffer not large enough for pixels"); } - nativeCopyPixelsToBuffer(mNativeBitmap, dst); + nativeCopyPixelsToBuffer(mSkBitmapPtr, dst); // now update the buffer's position int position = dst.position(); @@ -532,7 +525,7 @@ public final class Bitmap implements Parcelable { throw new RuntimeException("Buffer not large enough for pixels"); } - nativeCopyPixelsFromBuffer(mNativeBitmap, src); + nativeCopyPixelsFromBuffer(mSkBitmapPtr, src); // now update the buffer's position int position = src.position(); @@ -554,7 +547,7 @@ public final class Bitmap implements Parcelable { */ public Bitmap copy(Config config, boolean isMutable) { checkRecycled("Can't copy a recycled bitmap"); - Bitmap b = nativeCopy(mNativeBitmap, config.nativeInt, isMutable); + Bitmap b = nativeCopy(mSkBitmapPtr, config.nativeInt, isMutable); if (b != null) { b.setPremultiplied(mRequestPremultiplied); b.mDensity = mDensity; @@ -564,7 +557,7 @@ public final class Bitmap implements Parcelable { /** * Creates a new bitmap, scaled from an existing bitmap, when possible. If the - * specified width and height are the same as the current width and height of + * specified width and height are the same as the current width and height of * the source bitmap, the source bitmap is returned and no new bitmap is * created. * @@ -639,7 +632,7 @@ public final class Bitmap implements Parcelable { * transformed by the optional matrix. The new bitmap may be the * same object as source, or a copy may have been made. It is * initialized with the same density as the original bitmap. - * + * * If the source bitmap is immutable and the requested subset is the * same as the source bitmap itself, then the source bitmap is * returned and no new bitmap is created. @@ -781,8 +774,8 @@ public final class Bitmap implements Parcelable { * @param config The bitmap config to create. * @param hasAlpha If the bitmap is ARGB_8888 this flag can be used to mark the * bitmap as opaque. Doing so will clear the bitmap in black - * instead of transparent. - * + * instead of transparent. + * * @throws IllegalArgumentException if the width or height are <= 0 */ private static Bitmap createBitmap(int width, int height, Config config, boolean hasAlpha) { @@ -800,8 +793,8 @@ public final class Bitmap implements Parcelable { * @param config The bitmap config to create. * @param hasAlpha If the bitmap is ARGB_8888 this flag can be used to mark the * bitmap as opaque. Doing so will clear the bitmap in black - * instead of transparent. - * + * instead of transparent. + * * @throws IllegalArgumentException if the width or height are <= 0 */ private static Bitmap createBitmap(DisplayMetrics display, int width, int height, @@ -815,7 +808,7 @@ public final class Bitmap implements Parcelable { } bm.setHasAlpha(hasAlpha); if (config == Config.ARGB_8888 && !hasAlpha) { - nativeErase(bm.mNativeBitmap, 0xff000000); + nativeErase(bm.mSkBitmapPtr, 0xff000000); } // No need to initialize the bitmap to zeroes with other configs; // it is backed by a VM byte array which is by definition preinitialized @@ -1005,7 +998,7 @@ public final class Bitmap implements Parcelable { throw new IllegalArgumentException("quality must be 0..100"); } Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress"); - boolean result = nativeCompress(mNativeBitmap, format.nativeInt, quality, + boolean result = nativeCompress(mSkBitmapPtr, format.nativeInt, quality, stream, new byte[WORKING_COMPRESS_STORAGE]); Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); return result; @@ -1022,12 +1015,12 @@ public final class Bitmap implements Parcelable { * <p>Indicates whether pixels stored in this bitmaps are stored pre-multiplied. * When a pixel is pre-multiplied, the RGB components have been multiplied by * the alpha component. For instance, if the original color is a 50% - * translucent red <code>(128, 255, 0, 0)</code>, the pre-multiplied form is + * translucent red <code>(128, 255, 0, 0)</code>, the pre-multiplied form is * <code>(128, 128, 0, 0)</code>.</p> - * + * * <p>This method always returns false if {@link #getConfig()} is * {@link Bitmap.Config#RGB_565}.</p> - * + * * <p>The return value is undefined if {@link #getConfig()} is * {@link Bitmap.Config#ALPHA_8}.</p> * @@ -1046,7 +1039,7 @@ public final class Bitmap implements Parcelable { * @see BitmapFactory.Options#inPremultiplied */ public final boolean isPremultiplied() { - return nativeIsPremultiplied(mNativeBitmap); + return nativeIsPremultiplied(mSkBitmapPtr); } /** @@ -1071,7 +1064,7 @@ public final class Bitmap implements Parcelable { */ public final void setPremultiplied(boolean premultiplied) { mRequestPremultiplied = premultiplied; - nativeSetPremultiplied(mNativeBitmap, premultiplied); + nativeSetPremultiplied(mSkBitmapPtr, premultiplied); } /** Returns the bitmap's width */ @@ -1137,7 +1130,7 @@ public final class Bitmap implements Parcelable { public int getScaledHeight(int targetDensity) { return scaleFromDensity(getHeight(), mDensity, targetDensity); } - + /** * @hide */ @@ -1145,11 +1138,11 @@ public final class Bitmap implements Parcelable { if (sdensity == DENSITY_NONE || tdensity == DENSITY_NONE || sdensity == tdensity) { return size; } - + // Scale by tdensity / sdensity, rounding up. return ((size * tdensity) + (sdensity >> 1)) / sdensity; } - + /** * Return the number of bytes between rows in the bitmap's pixels. Note that * this refers to the pixels as stored natively by the bitmap. If you call @@ -1163,7 +1156,7 @@ public final class Bitmap implements Parcelable { * @return number of bytes between rows of the native bitmap pixels. */ public final int getRowBytes() { - return nativeRowBytes(mNativeBitmap); + return nativeRowBytes(mSkBitmapPtr); } /** @@ -1206,7 +1199,7 @@ public final class Bitmap implements Parcelable { * that config, otherwise return null. */ public final Config getConfig() { - return Config.nativeToConfig(nativeConfig(mNativeBitmap)); + return Config.nativeToConfig(nativeConfig(mSkBitmapPtr)); } /** Returns true if the bitmap's config supports per-pixel alpha, and @@ -1218,7 +1211,7 @@ public final class Bitmap implements Parcelable { * it will return true by default. */ public final boolean hasAlpha() { - return nativeHasAlpha(mNativeBitmap); + return nativeHasAlpha(mSkBitmapPtr); } /** @@ -1232,28 +1225,28 @@ public final class Bitmap implements Parcelable { * non-opaque per-pixel alpha values. */ public void setHasAlpha(boolean hasAlpha) { - nativeSetHasAlpha(mNativeBitmap, hasAlpha, mRequestPremultiplied); + nativeSetHasAlpha(mSkBitmapPtr, hasAlpha, mRequestPremultiplied); } /** * Indicates whether the renderer responsible for drawing this * bitmap should attempt to use mipmaps when this bitmap is drawn * scaled down. - * + * * If you know that you are going to draw this bitmap at less than * 50% of its original size, you may be able to obtain a higher * quality - * + * * This property is only a suggestion that can be ignored by the * renderer. It is not guaranteed to have any effect. - * + * * @return true if the renderer should attempt to use mipmaps, * false otherwise - * + * * @see #setHasMipMap(boolean) */ public final boolean hasMipMap() { - return nativeHasMipMap(mNativeBitmap); + return nativeHasMipMap(mSkBitmapPtr); } /** @@ -1264,7 +1257,7 @@ public final class Bitmap implements Parcelable { * If you know that you are going to draw this bitmap at less than * 50% of its original size, you may be able to obtain a higher * quality by turning this property on. - * + * * Note that if the renderer respects this hint it might have to * allocate extra memory to hold the mipmap levels for this bitmap. * @@ -1277,7 +1270,7 @@ public final class Bitmap implements Parcelable { * @see #hasMipMap() */ public final void setHasMipMap(boolean hasMipMap) { - nativeSetHasMipMap(mNativeBitmap, hasMipMap); + nativeSetHasMipMap(mSkBitmapPtr, hasMipMap); } /** @@ -1290,7 +1283,7 @@ public final class Bitmap implements Parcelable { if (!isMutable()) { throw new IllegalStateException("cannot erase immutable bitmaps"); } - nativeErase(mNativeBitmap, c); + nativeErase(mSkBitmapPtr, c); } /** @@ -1306,7 +1299,7 @@ public final class Bitmap implements Parcelable { public int getPixel(int x, int y) { checkRecycled("Can't call getPixel() on a recycled bitmap"); checkPixelAccess(x, y); - return nativeGetPixel(mNativeBitmap, x, y); + return nativeGetPixel(mSkBitmapPtr, x, y); } /** @@ -1339,14 +1332,14 @@ public final class Bitmap implements Parcelable { return; // nothing to do } checkPixelsAccess(x, y, width, height, offset, stride, pixels); - nativeGetPixels(mNativeBitmap, pixels, offset, stride, + nativeGetPixels(mSkBitmapPtr, pixels, offset, stride, x, y, width, height); } /** * Shared code to check for illegal arguments passed to getPixel() * or setPixel() - * + * * @param x x coordinate of the pixel * @param y y coordinate of the pixel */ @@ -1420,7 +1413,7 @@ public final class Bitmap implements Parcelable { throw new IllegalStateException(); } checkPixelAccess(x, y); - nativeSetPixel(mNativeBitmap, x, y, color); + nativeSetPixel(mSkBitmapPtr, x, y, color); } /** @@ -1456,7 +1449,7 @@ public final class Bitmap implements Parcelable { return; // nothing to do } checkPixelsAccess(x, y, width, height, offset, stride, pixels); - nativeSetPixels(mNativeBitmap, pixels, offset, stride, + nativeSetPixels(mSkBitmapPtr, pixels, offset, stride, x, y, width, height); } @@ -1494,7 +1487,7 @@ public final class Bitmap implements Parcelable { */ public void writeToParcel(Parcel p, int flags) { checkRecycled("Can't parcel a recycled bitmap"); - if (!nativeWriteToParcel(mNativeBitmap, mIsMutable, mDensity, p)) { + if (!nativeWriteToParcel(mSkBitmapPtr, mIsMutable, mDensity, p)) { throw new RuntimeException("native writeToParcel failed"); } } @@ -1522,9 +1515,9 @@ public final class Bitmap implements Parcelable { * -2, -2, so that drawing the alpha bitmap offset by (-2, -2) and then * drawing the original would result in the blur visually aligning with * the original. - * + * * <p>The initial density of the returned bitmap is the same as the original's. - * + * * @param paint Optional paint used to modify the alpha values in the * resulting bitmap. Pass null for default behavior. * @param offsetXY Optional array that returns the X (index 0) and Y @@ -1538,7 +1531,7 @@ public final class Bitmap implements Parcelable { public Bitmap extractAlpha(Paint paint, int[] offsetXY) { checkRecycled("Can't extractAlpha on a recycled bitmap"); long nativePaint = paint != null ? paint.getNativeInstance() : 0; - Bitmap bm = nativeExtractAlpha(mNativeBitmap, nativePaint, offsetXY); + Bitmap bm = nativeExtractAlpha(mSkBitmapPtr, nativePaint, offsetXY); if (bm == null) { throw new RuntimeException("Failed to extractAlpha on Bitmap"); } @@ -1552,7 +1545,7 @@ public final class Bitmap implements Parcelable { * If other is null, return false. */ public boolean sameAs(Bitmap other) { - return this == other || (other != null && nativeSameAs(mNativeBitmap, other.mNativeBitmap)); + return this == other || (other != null && nativeSameAs(mSkBitmapPtr, other.mSkBitmapPtr)); } /** @@ -1567,7 +1560,12 @@ public final class Bitmap implements Parcelable { * and therefore is harmless. */ public void prepareToDraw() { - nativePrepareToDraw(mNativeBitmap); + nativePrepareToDraw(mSkBitmapPtr); + } + + /** @hide */ + public final long getSkBitmap() { + return mSkBitmapPtr; } private static class BitmapFinalizer { @@ -1658,8 +1656,4 @@ public final class Bitmap implements Parcelable { private static native boolean nativeHasMipMap(long nativeBitmap); private static native void nativeSetHasMipMap(long nativeBitmap, boolean hasMipMap); private static native boolean nativeSameAs(long nativeBitmap0, long nativeBitmap1); - - /* package */ final long ni() { - return mNativeBitmap; - } } diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java index 5e004a3..f2f890e 100644 --- a/graphics/java/android/graphics/BitmapShader.java +++ b/graphics/java/android/graphics/BitmapShader.java @@ -42,7 +42,7 @@ public class BitmapShader extends Shader { mBitmap = bitmap; mTileX = tileX; mTileY = tileY; - final long b = bitmap.ni(); + final long b = bitmap.getSkBitmap(); init(nativeCreate(b, tileX.nativeInt, tileY.nativeInt)); } diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index e4c2f0e..85fa3cb 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -154,7 +154,7 @@ public class Canvas { throw new IllegalStateException("Immutable bitmap passed to Canvas constructor"); } throwIfCannotDraw(bitmap); - mNativeCanvasWrapper = initRaster(bitmap.ni()); + mNativeCanvasWrapper = initRaster(bitmap.getSkBitmap()); mFinalizer = new CanvasFinalizer(mNativeCanvasWrapper); mBitmap = bitmap; mDensity = bitmap.mDensity; @@ -219,7 +219,7 @@ public class Canvas { } throwIfCannotDraw(bitmap); - native_setBitmap(mNativeCanvasWrapper, bitmap.ni(), true); + native_setBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), true); mDensity = bitmap.mDensity; } @@ -1339,7 +1339,7 @@ public class Canvas { */ public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { throwIfCannotDraw(bitmap); - native_drawBitmap(mNativeCanvasWrapper, bitmap.ni(), left, top, + native_drawBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), left, top, paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity); } @@ -1385,7 +1385,7 @@ public class Canvas { bottom = src.bottom; } - native_drawBitmap(mNativeCanvasWrapper, bitmap.ni(), left, top, right, bottom, + native_drawBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), left, top, right, bottom, dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, bitmap.mDensity); } @@ -1432,7 +1432,7 @@ public class Canvas { bottom = src.bottom; } - native_drawBitmap(mNativeCanvasWrapper, bitmap.ni(), left, top, right, bottom, + native_drawBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), left, top, right, bottom, dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, bitmap.mDensity); } @@ -1513,7 +1513,7 @@ public class Canvas { * @param paint May be null. The paint used to draw the bitmap */ public void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) { - nativeDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.ni(), matrix.ni(), + nativeDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.getSkBitmap(), matrix.ni(), paint != null ? paint.getNativeInstance() : 0); } @@ -1568,7 +1568,7 @@ public class Canvas { // no mul by 2, since we need only 1 color per vertex checkRange(colors.length, colorOffset, count); } - nativeDrawBitmapMesh(mNativeCanvasWrapper, bitmap.ni(), meshWidth, meshHeight, + nativeDrawBitmapMesh(mNativeCanvasWrapper, bitmap.getSkBitmap(), meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, paint != null ? paint.getNativeInstance() : 0); } diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java index ebc86aa..9c4299a 100644 --- a/graphics/java/android/graphics/NinePatch.java +++ b/graphics/java/android/graphics/NinePatch.java @@ -98,7 +98,7 @@ public class NinePatch { public NinePatch(Bitmap bitmap, byte[] chunk, String srcName) { mBitmap = bitmap; mSrcName = srcName; - mNativeChunk = validateNinePatchChunk(mBitmap.ni(), chunk); + mNativeChunk = validateNinePatchChunk(mBitmap.getSkBitmap(), chunk); } /** @@ -199,12 +199,12 @@ public class NinePatch { } void drawSoftware(Canvas canvas, RectF location, Paint paint) { - nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.ni(), mNativeChunk, + nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.getSkBitmap(), mNativeChunk, paint != null ? paint.getNativeInstance() : 0, canvas.mDensity, mBitmap.mDensity); } void drawSoftware(Canvas canvas, Rect location, Paint paint) { - nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.ni(), mNativeChunk, + nativeDraw(canvas.getNativeCanvasWrapper(), location, mBitmap.getSkBitmap(), mNativeChunk, paint != null ? paint.getNativeInstance() : 0, canvas.mDensity, mBitmap.mDensity); } @@ -252,7 +252,7 @@ public class NinePatch { * that are transparent. */ public final Region getTransparentRegion(Rect bounds) { - long r = nativeGetTransparentRegion(mBitmap.ni(), mNativeChunk, bounds); + long r = nativeGetTransparentRegion(mBitmap.getSkBitmap(), mNativeChunk, bounds); return r != 0 ? new Region(r) : null; } diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 79934da..b32dcc6 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -380,7 +380,7 @@ public final class PdfRenderer implements AutoCloseable { final long transformPtr = (transform != null) ? transform.native_instance : 0; - nativeRenderPage(mNativeDocument, mNativePage, destination.mNativeBitmap, contentLeft, + nativeRenderPage(mNativeDocument, mNativePage, destination.getSkBitmap(), contentLeft, contentTop, contentRight, contentBottom, transformPtr, renderMode); } diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index 93138fa..2f6bbf4 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -40,7 +40,6 @@ using namespace android; struct fields_t { jfieldID context; jclass bitmapClazz; // Must be a global ref - jfieldID nativeBitmap; jmethodID createBitmapMethod; jmethodID createScaledBitmapMethod; jclass configClazz; // Must be a global ref @@ -282,8 +281,7 @@ static jobject android_media_MediaMetadataRetriever_getFrameAtTime(JNIEnv *env, return NULL; } - SkBitmap *bitmap = - (SkBitmap *) env->GetLongField(jBitmap, fields.nativeBitmap); + SkBitmap *bitmap = GraphicsJNI::getSkBitmap(env, jBitmap); bitmap->lockPixels(); rotate((uint16_t*)bitmap->getPixels(), @@ -421,10 +419,6 @@ static void android_media_MediaMetadataRetriever_native_init(JNIEnv *env) if (fields.createScaledBitmapMethod == NULL) { return; } - fields.nativeBitmap = env->GetFieldID(fields.bitmapClazz, "mNativeBitmap", "J"); - if (fields.nativeBitmap == NULL) { - return; - } jclass configClazz = env->FindClass("android/graphics/Bitmap$Config"); if (configClazz == NULL) { diff --git a/native/graphics/jni/bitmap.cpp b/native/graphics/jni/bitmap.cpp index ea32edc..ddb01a0 100644 --- a/native/graphics/jni/bitmap.cpp +++ b/native/graphics/jni/bitmap.cpp @@ -27,7 +27,7 @@ int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap, return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } - SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); + SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap); if (NULL == bm) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } @@ -64,7 +64,7 @@ int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) { return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } - SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); + SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap); if (NULL == bm) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } @@ -87,7 +87,7 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } - SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); + SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap); if (NULL == bm) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } diff --git a/opengl/java/android/opengl/GLUtils.java b/opengl/java/android/opengl/GLUtils.java index a9d33dd..4d890c9 100644 --- a/opengl/java/android/opengl/GLUtils.java +++ b/opengl/java/android/opengl/GLUtils.java @@ -29,14 +29,6 @@ import javax.microedition.khronos.egl.EGL11; public final class GLUtils { - /* - * We use a class initializer to allow the native code to cache some - * field offsets. - */ - static { - nativeClassInit(); - } - private GLUtils() { } @@ -275,8 +267,6 @@ public final class GLUtils { */ native public static void setTracingLevel(int level); - native private static void nativeClassInit(); - native private static int native_getInternalFormat(Bitmap bitmap); native private static int native_getType(Bitmap bitmap); native private static int native_texImage2D(int target, int level, int internalformat, diff --git a/rs/jni/Android.mk b/rs/jni/Android.mk index f1f0bfc..94f0859 100644 --- a/rs/jni/Android.mk +++ b/rs/jni/Android.mk @@ -14,7 +14,8 @@ LOCAL_SHARED_LIBRARIES := \ libskia \ libutils \ libui \ - libgui + libgui \ + libjnigraphics LOCAL_STATIC_LIBRARIES := @@ -23,6 +24,7 @@ rs_generated_include_dir := $(call intermediates-dir-for,SHARED_LIBRARIES,libRS, LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ frameworks/rs \ + frameworks/base/core/jni \ $(rs_generated_include_dir) LOCAL_CFLAGS += -Wno-unused-parameter -std=c++11 diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index a145166..d8e1464 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -24,8 +24,6 @@ #include <utils/misc.h> #include <inttypes.h> -#include <SkBitmap.h> - #include <androidfw/Asset.h> #include <androidfw/AssetManager.h> #include <androidfw/ResourceTypes.h> @@ -35,6 +33,7 @@ #include "android_runtime/AndroidRuntime.h" #include "android_runtime/android_view_Surface.h" #include "android_runtime/android_util_AssetManager.h" +#include "android/graphics/GraphicsJNI.h" #include <rs.h> #include <rsEnv.h> @@ -172,14 +171,10 @@ private: // --------------------------------------------------------------------------- static jfieldID gContextId = 0; -static jfieldID gNativeBitmapID = 0; static void _nInit(JNIEnv *_env, jclass _this) { gContextId = _env->GetFieldID(_this, "mContext", "J"); - - jclass bitmapClass = _env->FindClass("android/graphics/Bitmap"); - gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "J"); } // --------------------------------------------------------------------------- @@ -934,7 +929,7 @@ nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jobject jbitmap, jint usage) { SkBitmap const * nativeBitmap = - (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); + GraphicsJNI::getSkBitmap(_env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); bitmap.lockPixels(); @@ -951,7 +946,7 @@ nAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jint mip, jobject jbitmap, jint usage) { SkBitmap const * nativeBitmap = - (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); + GraphicsJNI::getSkBitmap(_env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); bitmap.lockPixels(); @@ -968,7 +963,7 @@ nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong ty jobject jbitmap, jint usage) { SkBitmap const * nativeBitmap = - (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); + GraphicsJNI::getSkBitmap(_env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); bitmap.lockPixels(); @@ -984,7 +979,7 @@ static void nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap) { SkBitmap const * nativeBitmap = - (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); + GraphicsJNI::getSkBitmap(_env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); int w = bitmap.width(); int h = bitmap.height(); @@ -1001,7 +996,7 @@ static void nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap) { SkBitmap const * nativeBitmap = - (SkBitmap const *)_env->GetLongField(jbitmap, gNativeBitmapID); + GraphicsJNI::getSkBitmap(_env, jbitmap); const SkBitmap& bitmap(*nativeBitmap); bitmap.lockPixels(); diff --git a/services/core/java/com/android/server/AssetAtlasService.java b/services/core/java/com/android/server/AssetAtlasService.java index a2c87b9..e6dc1c7 100644 --- a/services/core/java/com/android/server/AssetAtlasService.java +++ b/services/core/java/com/android/server/AssetAtlasService.java @@ -291,7 +291,7 @@ public class AssetAtlasService extends IAssetAtlas.Stub { } canvas.drawBitmap(bitmap, 0.0f, 0.0f, null); canvas.restore(); - atlasMap[mapIndex++] = bitmap.mNativeBitmap; + atlasMap[mapIndex++] = bitmap.getSkBitmap(); atlasMap[mapIndex++] = entry.x; atlasMap[mapIndex++] = entry.y; atlasMap[mapIndex++] = entry.rotated ? 1 : 0; |