diff options
| author | 2019-03-26 16:28:41 -0400 | |
|---|---|---|
| committer | 2019-03-27 13:39:23 -0400 | |
| commit | 71fae62f5fe03e9f8453ac3880587567ffcf9be6 (patch) | |
| tree | 2d6c009c2e34eaebd050506048406dd1876a9f02 /graphics/java | |
| parent | ca8aef63766b3193464b8f9b4cde45324a83789a (diff) | |
Pass Bitmap's native instance to JNI where feasible
Test: CtsGraphicsTestCases, CtsUiRenderingTestCases,
CtsRenderscriptTestCases
This is significantly faster than passing the Java object down and then
calling a JNI method to retrieve the pointer. See
https://buganizer.corp.google.com/issues/16656908#comment19
In some cases this changes what used to be native crashes (due to
android::BitmapWrapper:assertValid's LOG_ALWAYS_FATAL_IF) into
NullPointerExceptions (if a caller used a null Bitmap).
In addition:
- Remove unnecessary JNIEnv param from toBitmap(jlong)
- Change instances of toBitmap(JNIEnv*, jobject) to the above
- Replace calls to GraphicsJNI::getSkBitmap() to inline calls to
toBitmap/getSkBitmap
- make Canvas#nInitRaster @FastNative (FIXME: Could these be
@CriticalNative?)
Change-Id: I6194097be1b6e6952eba70e1e7052a5a250eed93
Diffstat (limited to 'graphics/java')
| -rw-r--r-- | graphics/java/android/graphics/BaseCanvas.java | 21 | ||||
| -rw-r--r-- | graphics/java/android/graphics/BaseRecordingCanvas.java | 21 | ||||
| -rw-r--r-- | graphics/java/android/graphics/BitmapFactory.java | 25 | ||||
| -rw-r--r-- | graphics/java/android/graphics/BitmapRegionDecoder.java | 4 | ||||
| -rw-r--r-- | graphics/java/android/graphics/BitmapShader.java | 4 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Canvas.java | 14 | ||||
| -rw-r--r-- | graphics/java/android/graphics/HardwareRenderer.java | 12 | ||||
| -rw-r--r-- | graphics/java/android/graphics/NinePatch.java | 6 | ||||
| -rw-r--r-- | graphics/java/android/graphics/pdf/PdfRenderer.java | 7 |
9 files changed, 69 insertions, 45 deletions
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index fd3773588299..8ce649782924 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -112,14 +112,14 @@ public abstract class BaseCanvas { public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { throwIfCannotDraw(bitmap); throwIfHasHwBitmapInSwMode(paint); - nDrawBitmap(mNativeCanvasWrapper, bitmap, left, top, + nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity); } public void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) { throwIfHasHwBitmapInSwMode(paint); - nDrawBitmapMatrix(mNativeCanvasWrapper, bitmap, matrix.ni(), + nDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.getNativeInstance(), matrix.ni(), paint != null ? paint.getNativeInstance() : 0); } @@ -144,7 +144,7 @@ public abstract class BaseCanvas { bottom = src.bottom; } - nDrawBitmap(mNativeCanvasWrapper, bitmap, left, top, right, bottom, + nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, right, bottom, dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, bitmap.mDensity); } @@ -170,7 +170,7 @@ public abstract class BaseCanvas { bottom = src.bottom; } - nDrawBitmap(mNativeCanvasWrapper, bitmap, left, top, right, bottom, + nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, right, bottom, dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, bitmap.mDensity); } @@ -229,7 +229,7 @@ public abstract class BaseCanvas { // no mul by 2, since we need only 1 color per vertex checkRange(colors.length, colorOffset, count); } - nDrawBitmapMesh(mNativeCanvasWrapper, bitmap, meshWidth, meshHeight, + nDrawBitmapMesh(mNativeCanvasWrapper, bitmap.getNativeInstance(), meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, paint != null ? paint.getNativeInstance() : 0); } @@ -664,10 +664,11 @@ public abstract class BaseCanvas { } } - private static native void nDrawBitmap(long nativeCanvas, Bitmap bitmap, float left, float top, - long nativePaintOrZero, int canvasDensity, int screenDensity, int bitmapDensity); + private static native void nDrawBitmap(long nativeCanvas, long bitmapHandle, float left, + float top, long nativePaintOrZero, int canvasDensity, int screenDensity, + int bitmapDensity); - private static native void nDrawBitmap(long nativeCanvas, Bitmap bitmap, float srcLeft, + private static native void nDrawBitmap(long nativeCanvas, long bitmapHandle, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, long nativePaintOrZero, int screenDensity, int bitmapDensity); @@ -726,10 +727,10 @@ public abstract class BaseCanvas { float dstLeft, float dstTop, float dstRight, float dstBottom, long nativePaintOrZero, int screenDensity, int bitmapDensity); - private static native void nDrawBitmapMatrix(long nativeCanvas, Bitmap bitmap, + private static native void nDrawBitmapMatrix(long nativeCanvas, long bitmapHandle, long nativeMatrix, long nativePaint); - private static native void nDrawBitmapMesh(long nativeCanvas, Bitmap bitmap, int meshWidth, + private static native void nDrawBitmapMesh(long nativeCanvas, long bitmapHandle, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, long nativePaint); diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java index 3e117411db01..1da10fb5b680 100644 --- a/graphics/java/android/graphics/BaseRecordingCanvas.java +++ b/graphics/java/android/graphics/BaseRecordingCanvas.java @@ -67,7 +67,7 @@ public class BaseRecordingCanvas extends Canvas { public final void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { throwIfCannotDraw(bitmap); - nDrawBitmap(mNativeCanvasWrapper, bitmap, left, top, + nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity); } @@ -75,7 +75,7 @@ public class BaseRecordingCanvas extends Canvas { @Override public final void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) { - nDrawBitmapMatrix(mNativeCanvasWrapper, bitmap, matrix.ni(), + nDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.getNativeInstance(), matrix.ni(), paint != null ? paint.getNativeInstance() : 0); } @@ -100,7 +100,7 @@ public class BaseRecordingCanvas extends Canvas { bottom = src.bottom; } - nDrawBitmap(mNativeCanvasWrapper, bitmap, left, top, right, bottom, + nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, right, bottom, dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, bitmap.mDensity); } @@ -126,7 +126,7 @@ public class BaseRecordingCanvas extends Canvas { bottom = src.bottom; } - nDrawBitmap(mNativeCanvasWrapper, bitmap, left, top, right, bottom, + nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, right, bottom, dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, bitmap.mDensity); } @@ -188,7 +188,7 @@ public class BaseRecordingCanvas extends Canvas { // no mul by 2, since we need only 1 color per vertex checkRange(colors.length, colorOffset, count); } - nDrawBitmapMesh(mNativeCanvasWrapper, bitmap, meshWidth, meshHeight, + nDrawBitmapMesh(mNativeCanvasWrapper, bitmap.getNativeInstance(), meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, paint != null ? paint.getNativeInstance() : 0); } @@ -581,11 +581,12 @@ public class BaseRecordingCanvas extends Canvas { } @FastNative - private static native void nDrawBitmap(long nativeCanvas, Bitmap bitmap, float left, float top, - long nativePaintOrZero, int canvasDensity, int screenDensity, int bitmapDensity); + private static native void nDrawBitmap(long nativeCanvas, long bitmapHandle, float left, + float top, long nativePaintOrZero, int canvasDensity, int screenDensity, + int bitmapDensity); @FastNative - private static native void nDrawBitmap(long nativeCanvas, Bitmap bitmap, + private static native void nDrawBitmap(long nativeCanvas, long bitmapHandle, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, long nativePaintOrZero, int screenDensity, int bitmapDensity); @@ -663,11 +664,11 @@ public class BaseRecordingCanvas extends Canvas { int screenDensity, int bitmapDensity); @FastNative - private static native void nDrawBitmapMatrix(long nativeCanvas, Bitmap bitmap, + private static native void nDrawBitmapMatrix(long nativeCanvas, long bitmapHandle, long nativeMatrix, long nativePaint); @FastNative - private static native void nDrawBitmapMesh(long nativeCanvas, Bitmap bitmap, int meshWidth, + private static native void nDrawBitmapMesh(long nativeCanvas, long bitmapHandle, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, long nativePaint); diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index d8a864015202..5623a8a49b35 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -465,6 +465,17 @@ public class BitmapFactory { } /** + * Helper for passing inBitmap's native pointer to native. + */ + static long nativeInBitmap(Options opts) { + if (opts == null || opts.inBitmap == null) { + return 0; + } + + return opts.inBitmap.getNativeInstance(); + } + + /** * Helper for passing SkColorSpace pointer to native. * * @throws IllegalArgumentException if the ColorSpace is not Rgb or does @@ -652,6 +663,7 @@ public class BitmapFactory { Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap"); try { bm = nativeDecodeByteArray(data, offset, length, opts, + Options.nativeInBitmap(opts), Options.nativeColorSpace(opts)); if (bm == null && opts != null && opts.inBitmap != null) { @@ -747,7 +759,8 @@ public class BitmapFactory { try { if (is instanceof AssetManager.AssetInputStream) { final long asset = ((AssetManager.AssetInputStream) is).getNativeAsset(); - bm = nativeDecodeAsset(asset, outPadding, opts, Options.nativeColorSpace(opts)); + bm = nativeDecodeAsset(asset, outPadding, opts, Options.nativeInBitmap(opts), + Options.nativeColorSpace(opts)); } else { bm = decodeStreamInternal(is, outPadding, opts); } @@ -775,6 +788,7 @@ public class BitmapFactory { if (opts != null) tempStorage = opts.inTempStorage; if (tempStorage == null) tempStorage = new byte[DECODE_BUFFER_SIZE]; return nativeDecodeStream(is, tempStorage, outPadding, opts, + Options.nativeInBitmap(opts), Options.nativeColorSpace(opts)); } @@ -819,6 +833,7 @@ public class BitmapFactory { try { if (nativeIsSeekable(fd)) { bm = nativeDecodeFileDescriptor(fd, outPadding, opts, + Options.nativeInBitmap(opts), Options.nativeColorSpace(opts)); } else { FileInputStream fis = new FileInputStream(fd); @@ -856,15 +871,15 @@ public class BitmapFactory { @UnsupportedAppUsage private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage, - Rect padding, Options opts, long colorSpaceHandle); + Rect padding, Options opts, long inBitmapHandle, long colorSpaceHandle); @UnsupportedAppUsage private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, - Rect padding, Options opts, long colorSpaceHandle); + Rect padding, Options opts, long inBitmapHandle, long colorSpaceHandle); @UnsupportedAppUsage private static native Bitmap nativeDecodeAsset(long nativeAsset, Rect padding, Options opts, - long colorSpaceHandle); + long inBitmapHandle, long colorSpaceHandle); @UnsupportedAppUsage private static native Bitmap nativeDecodeByteArray(byte[] data, int offset, - int length, Options opts, long colorSpaceHandle); + int length, Options opts, long inBitmapHandle, long colorSpaceHandle); private static native boolean nativeIsSeekable(FileDescriptor fd); } diff --git a/graphics/java/android/graphics/BitmapRegionDecoder.java b/graphics/java/android/graphics/BitmapRegionDecoder.java index 1410423eafac..629d8c131b68 100644 --- a/graphics/java/android/graphics/BitmapRegionDecoder.java +++ b/graphics/java/android/graphics/BitmapRegionDecoder.java @@ -196,6 +196,7 @@ public final class BitmapRegionDecoder { throw new IllegalArgumentException("rectangle is outside the image"); return nativeDecodeRegion(mNativeBitmapRegionDecoder, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, options, + BitmapFactory.Options.nativeInBitmap(options), BitmapFactory.Options.nativeColorSpace(options)); } } @@ -266,7 +267,8 @@ public final class BitmapRegionDecoder { private static native Bitmap nativeDecodeRegion(long lbm, int start_x, int start_y, int width, int height, - BitmapFactory.Options options, long colorSpaceHandle); + BitmapFactory.Options options, long inBitmapHandle, + long colorSpaceHandle); private static native int nativeGetWidth(long lbm); private static native int nativeGetHeight(long lbm); private static native void nativeClean(long lbm); diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java index eb0f2e1e18f2..198d1e7bc956 100644 --- a/graphics/java/android/graphics/BitmapShader.java +++ b/graphics/java/android/graphics/BitmapShader.java @@ -62,9 +62,9 @@ public class BitmapShader extends Shader { @Override long createNativeInstance(long nativeMatrix) { - return nativeCreate(nativeMatrix, mBitmap, mTileX, mTileY); + return nativeCreate(nativeMatrix, mBitmap.getNativeInstance(), mTileX, mTileY); } - private static native long nativeCreate(long nativeMatrix, Bitmap bitmap, + private static native long nativeCreate(long nativeMatrix, long bitmapHandle, int shaderTileModeX, int shaderTileModeY); } diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 7b3f3da111d5..5b00d11b36f3 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -95,7 +95,7 @@ public class Canvas extends BaseCanvas { public Canvas() { if (!isHardwareAccelerated()) { // 0 means no native bitmap - mNativeCanvasWrapper = nInitRaster(null); + mNativeCanvasWrapper = nInitRaster(0); mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( this, mNativeCanvasWrapper); } else { @@ -117,7 +117,7 @@ public class Canvas extends BaseCanvas { throw new IllegalStateException("Immutable bitmap passed to Canvas constructor"); } throwIfCannotDraw(bitmap); - mNativeCanvasWrapper = nInitRaster(bitmap); + mNativeCanvasWrapper = nInitRaster(bitmap.getNativeInstance()); mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( this, mNativeCanvasWrapper); mBitmap = bitmap; @@ -185,7 +185,7 @@ public class Canvas extends BaseCanvas { } if (bitmap == null) { - nSetBitmap(mNativeCanvasWrapper, null); + nSetBitmap(mNativeCanvasWrapper, 0); mDensity = Bitmap.DENSITY_NONE; } else { if (!bitmap.isMutable()) { @@ -193,7 +193,7 @@ public class Canvas extends BaseCanvas { } throwIfCannotDraw(bitmap); - nSetBitmap(mNativeCanvasWrapper, bitmap); + nSetBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance()); mDensity = bitmap.mDensity; } @@ -1364,14 +1364,16 @@ public class Canvas extends BaseCanvas { private static native void nFreeCaches(); private static native void nFreeTextLayoutCaches(); - private static native long nInitRaster(Bitmap bitmap); private static native long nGetNativeFinalizer(); private static native void nSetCompatibilityVersion(int apiLevel); // ---------------- @FastNative ------------------- @FastNative - private static native void nSetBitmap(long canvasHandle, Bitmap bitmap); + private static native long nInitRaster(long bitmapHandle); + + @FastNative + private static native void nSetBitmap(long canvasHandle, long bitmapHandle); @FastNative private static native boolean nGetClipBounds(long nativeCanvas, Rect bounds); diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java index bc744cc7af3d..b6b2d4e1c46a 100644 --- a/graphics/java/android/graphics/HardwareRenderer.java +++ b/graphics/java/android/graphics/HardwareRenderer.java @@ -682,8 +682,8 @@ public class HardwareRenderer { /** @hide */ public boolean copyLayerInto(final TextureLayer layer, final Bitmap bitmap) { - return nCopyLayerInto(mNativeProxy, - layer.getDeferredLayerUpdater(), bitmap); + return nCopyLayerInto(mNativeProxy, layer.getDeferredLayerUpdater(), + bitmap.getNativeInstance()); } /** @@ -910,10 +910,10 @@ public class HardwareRenderer { public static int copySurfaceInto(Surface surface, Rect srcRect, Bitmap bitmap) { if (srcRect == null) { // Empty rect means entire surface - return nCopySurfaceInto(surface, 0, 0, 0, 0, bitmap); + return nCopySurfaceInto(surface, 0, 0, 0, 0, bitmap.getNativeInstance()); } else { return nCopySurfaceInto(surface, srcRect.left, srcRect.top, - srcRect.right, srcRect.bottom, bitmap); + srcRect.right, srcRect.bottom, bitmap.getNativeInstance()); } } @@ -1115,7 +1115,7 @@ public class HardwareRenderer { private static native void nBuildLayer(long nativeProxy, long node); - private static native boolean nCopyLayerInto(long nativeProxy, long layer, Bitmap bitmap); + private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmapHandle); private static native void nPushLayerUpdate(long nativeProxy, long layer); @@ -1162,7 +1162,7 @@ public class HardwareRenderer { private static native void nRemoveFrameMetricsObserver(long nativeProxy, long nativeObserver); private static native int nCopySurfaceInto(Surface surface, - int srcLeft, int srcTop, int srcRight, int srcBottom, Bitmap bitmap); + int srcLeft, int srcTop, int srcRight, int srcBottom, long bitmapHandle); private static native Bitmap nCreateHardwareBitmap(long renderNode, int width, int height); diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java index 800247af4927..c4c1eaceb4fc 100644 --- a/graphics/java/android/graphics/NinePatch.java +++ b/graphics/java/android/graphics/NinePatch.java @@ -261,7 +261,8 @@ public class NinePatch { * that are transparent. */ public final Region getTransparentRegion(Rect bounds) { - long r = nativeGetTransparentRegion(mBitmap, mNativeChunk, bounds); + long r = nativeGetTransparentRegion(mBitmap.getNativeInstance(), + mNativeChunk, bounds); return r != 0 ? new Region(r) : null; } @@ -282,5 +283,6 @@ public class NinePatch { */ private static native long validateNinePatchChunk(byte[] chunk); private static native void nativeFinalize(long chunk); - private static native long nativeGetTransparentRegion(Bitmap bitmap, long chunk, Rect location); + private static native long nativeGetTransparentRegion(long bitmapHandle, long chunk, + Rect location); } diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 1836f009f86b..bd1a49205fd5 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -435,8 +435,9 @@ public final class PdfRenderer implements AutoCloseable { final long transformPtr = transform.native_instance; synchronized (sPdfiumLock) { - nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft, - contentTop, contentRight, contentBottom, transformPtr, renderMode); + nativeRenderPage(mNativeDocument, mNativePage, destination.getNativeInstance(), + contentLeft, contentTop, contentRight, contentBottom, transformPtr, + renderMode); } } @@ -487,7 +488,7 @@ public final class PdfRenderer implements AutoCloseable { private static native void nativeClose(long documentPtr); private static native int nativeGetPageCount(long documentPtr); private static native boolean nativeScaleForPrinting(long documentPtr); - private static native void nativeRenderPage(long documentPtr, long pagePtr, Bitmap dest, + private static native void nativeRenderPage(long documentPtr, long pagePtr, long bitmapHandle, int clipLeft, int clipTop, int clipRight, int clipBottom, long transformPtr, int renderMode); private static native long nativeOpenPageAndGetSize(long documentPtr, int pageIndex, |