diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java index dfbabebbcc049..a283e0664bc68 100644 --- a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java +++ b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java @@ -47,8 +47,7 @@ public class RenderNodePerfTest { public void testCreateRenderNodeNoName() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { - RenderNode node = RenderNode.create(null, null); - node.destroy(); + RenderNode.create(null, null); } } @@ -56,8 +55,7 @@ public class RenderNodePerfTest { public void testCreateRenderNode() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { - RenderNode node = RenderNode.create("LinearLayout", null); - node.destroy(); + RenderNode.create("LinearLayout", null); } } diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index 671532c90bc84..df4d5c415b989 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -180,13 +180,12 @@ public final class DisplayListCanvas extends RecordingCanvas { /////////////////////////////////////////////////////////////////////////// /** - * Draws the specified display list onto this canvas. The display list can only - * be drawn if {@link android.view.RenderNode#isValid()} returns true. + * Draws the specified display list onto this canvas. * * @param renderNode The RenderNode to draw. */ public void drawRenderNode(RenderNode renderNode) { - nDrawRenderNode(mNativeCanvasWrapper, renderNode.getNativeDisplayList()); + nDrawRenderNode(mNativeCanvasWrapper, renderNode.mNativeRenderNode); } /////////////////////////////////////////////////////////////////////////// diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index 7c25fac3974ed..e10eeb0457be2 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -139,7 +139,9 @@ public class RenderNode { RenderNode.class.getClassLoader(), nGetNativeFinalizer(), 1024); } - // Do not access directly unless you are ThreadedRenderer + /** Not for general use; use only if you are ThreadedRenderer or DisplayListCanvas. + * @hide + */ final long mNativeRenderNode; private final View mOwningView; @@ -158,15 +160,6 @@ public class RenderNode { mOwningView = null; } - /** - * Immediately destroys the RenderNode - * Only suitable for testing/benchmarking where waiting for the GC/finalizer - * is not feasible. - */ - public void destroy() { - // TODO: Removed temporarily - } - /** * Creates a new RenderNode that can be used to record batches of * drawing operations, and store / apply render properties when drawn. @@ -218,6 +211,14 @@ public class RenderNode { return DisplayListCanvas.obtain(this, width, height); } + /** + * Same as {@link #start(int, int)} but with the RenderNode's width & height + */ + public DisplayListCanvas start() { + return DisplayListCanvas.obtain(this, + nGetWidth(mNativeRenderNode), nGetHeight(mNativeRenderNode)); + } + /** * Ends the recording for this display list. A display list cannot be * replayed if recording is not finished. Calling this method marks @@ -251,13 +252,6 @@ public class RenderNode { return nIsValid(mNativeRenderNode); } - long getNativeDisplayList() { - if (!isValid()) { - throw new IllegalStateException("The display list is not valid."); - } - return mNativeRenderNode; - } - /////////////////////////////////////////////////////////////////////////// // Matrix manipulation /////////////////////////////////////////////////////////////////////////// @@ -463,7 +457,6 @@ public class RenderNode { * @see #setHasOverlappingRendering(boolean) */ public boolean hasOverlappingRendering() { - //noinspection SimplifiableIfStatement return nHasOverlappingRendering(mNativeRenderNode); } @@ -1009,4 +1002,8 @@ public class RenderNode { private static native float nGetPivotX(long renderNode); @CriticalNative private static native float nGetPivotY(long renderNode); + @CriticalNative + private static native int nGetWidth(long renderNode); + @CriticalNative + private static native int nGetHeight(long renderNode); } diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index aa1e4079f91ff..2f975b68b9857 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -850,7 +850,9 @@ public final class ThreadedRenderer { void buildLayer(RenderNode node) { - nBuildLayer(mNativeProxy, node.getNativeDisplayList()); + if (node.isValid()) { + nBuildLayer(mNativeProxy, node.mNativeRenderNode); + } } @@ -928,7 +930,7 @@ public final class ThreadedRenderer { * not the RenderNode from a View. **/ public static Bitmap createHardwareBitmap(RenderNode node, int width, int height) { - return nCreateHardwareBitmap(node.getNativeDisplayList(), width, height); + return nCreateHardwareBitmap(node.mNativeRenderNode, width, height); } /** diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java index 276f50a51e668..e4c595b4f53b5 100644 --- a/core/java/android/view/ViewDebug.java +++ b/core/java/android/view/ViewDebug.java @@ -531,7 +531,6 @@ public class ViewDebug { throws IOException { RenderNode node = RenderNode.create("ViewDebug", null); profileViewAndChildren(view, node, out, true); - node.destroy(); } private static void profileViewAndChildren(View view, RenderNode node, BufferedWriter out, diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index 929496f2d2373..11054c81f342a 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -611,7 +611,6 @@ public final class Magnifier { mRenderer.destroy(); mSurfaceControl.destroy(); mSurfaceSession.kill(); - mBitmapRenderNode.destroy(); mHandler.removeCallbacks(mMagnifierUpdater); if (mBitmap != null) { mBitmap.recycle(); diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index 37ea8106ecd6a..22bbc3c481198 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -431,6 +431,14 @@ static jfloat android_view_RenderNode_getPivotY(jlong renderNodePtr) { return renderNode->stagingProperties().getPivotY(); } +static jint android_view_RenderNode_getWidth(jlong renderNodePtr) { + return reinterpret_cast(renderNodePtr)->stagingProperties().getWidth(); +} + +static jint android_view_RenderNode_getHeight(jlong renderNodePtr) { + return reinterpret_cast(renderNodePtr)->stagingProperties().getHeight(); +} + // ---------------------------------------------------------------------------- // RenderProperties - Animations // ---------------------------------------------------------------------------- @@ -648,6 +656,8 @@ static const JNINativeMethod gMethods[] = { { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX }, { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY }, + { "nGetWidth", "(J)I", (void*) android_view_RenderNode_getWidth }, + { "nGetHeight", "(J)I", (void*) android_view_RenderNode_getHeight }, }; int register_android_view_RenderNode(JNIEnv* env) {