diff options
Diffstat (limited to 'core/java/android/view')
-rw-r--r-- | core/java/android/view/DisplayListCanvas.java (renamed from core/java/android/view/GLES20Canvas.java) | 48 | ||||
-rw-r--r-- | core/java/android/view/GLES20RecordingCanvas.java | 65 | ||||
-rw-r--r-- | core/java/android/view/HardwareCanvas.java | 2 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 4 | ||||
-rw-r--r-- | core/java/android/view/RenderNode.java | 6 | ||||
-rw-r--r-- | core/java/android/view/RenderNodeAnimator.java | 4 |
6 files changed, 48 insertions, 81 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/DisplayListCanvas.java index 06e196d..90e1f86 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.NonNull; import android.graphics.Bitmap; import android.graphics.CanvasProperty; import android.graphics.NinePatch; @@ -24,19 +25,50 @@ import android.graphics.Path; import android.graphics.Picture; import android.graphics.Rect; import android.graphics.RectF; +import android.util.Pools.SynchronizedPool; /** - * An implementation of Canvas on top of OpenGL ES 2.0. + * An implementation of a GL canvas that records drawing operations. + * This is intended for use with a DisplayList. This class keeps a list of all the Paint and + * Bitmap objects that it draws, preventing the backing memory of Bitmaps from being freed while + * the DisplayList is still holding a native reference to the memory. */ -class GLES20Canvas extends HardwareCanvas { +class DisplayListCanvas extends HardwareCanvas { + // The recording canvas pool should be large enough to handle a deeply nested + // view hierarchy because display lists are generated recursively. + private static final int POOL_LIMIT = 25; + + private static final SynchronizedPool<DisplayListCanvas> sPool = + new SynchronizedPool<DisplayListCanvas>(POOL_LIMIT); + + RenderNode mNode; private int mWidth; private int mHeight; - private float[] mPoint; - private float[] mLine; - private Rect mClipBounds; - private RectF mPathBounds; + static DisplayListCanvas obtain(@NonNull RenderNode node) { + if (node == null) throw new IllegalArgumentException("node cannot be null"); + DisplayListCanvas canvas = sPool.acquire(); + if (canvas == null) { + canvas = new DisplayListCanvas(); + } + canvas.mNode = node; + return canvas; + } + + void recycle() { + mNode = null; + sPool.release(this); + } + + long finishRecording() { + return nFinishRecording(mNativeCanvasWrapper); + } + + @Override + public boolean isRecordingFor(Object o) { + return o == mNode; + } /////////////////////////////////////////////////////////////////////////// // JNI @@ -53,8 +85,8 @@ class GLES20Canvas extends HardwareCanvas { // Constructors /////////////////////////////////////////////////////////////////////////// - // TODO: Merge with GLES20RecordingCanvas - protected GLES20Canvas() { + + private DisplayListCanvas() { super(nCreateDisplayListRenderer()); } diff --git a/core/java/android/view/GLES20RecordingCanvas.java b/core/java/android/view/GLES20RecordingCanvas.java deleted file mode 100644 index 6c780c9..0000000 --- a/core/java/android/view/GLES20RecordingCanvas.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.view; - -import android.annotation.NonNull; -import android.util.Pools.SynchronizedPool; - -/** - * An implementation of a GL canvas that records drawing operations. - * This is intended for use with a DisplayList. This class keeps a list of all the Paint and - * Bitmap objects that it draws, preventing the backing memory of Bitmaps from being freed while - * the DisplayList is still holding a native reference to the memory. - */ -class GLES20RecordingCanvas extends GLES20Canvas { - // The recording canvas pool should be large enough to handle a deeply nested - // view hierarchy because display lists are generated recursively. - private static final int POOL_LIMIT = 25; - - private static final SynchronizedPool<GLES20RecordingCanvas> sPool = - new SynchronizedPool<GLES20RecordingCanvas>(POOL_LIMIT); - - RenderNode mNode; - - private GLES20RecordingCanvas() { - super(); - } - - static GLES20RecordingCanvas obtain(@NonNull RenderNode node) { - if (node == null) throw new IllegalArgumentException("node cannot be null"); - GLES20RecordingCanvas canvas = sPool.acquire(); - if (canvas == null) { - canvas = new GLES20RecordingCanvas(); - } - canvas.mNode = node; - return canvas; - } - - void recycle() { - mNode = null; - sPool.release(this); - } - - long finishRecording() { - return nFinishRecording(mNativeCanvasWrapper); - } - - @Override - public boolean isRecordingFor(Object o) { - return o == mNode; - } -} diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index cdb350f..fc2b55b 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -119,6 +119,6 @@ public abstract class HardwareCanvas extends Canvas { CanvasProperty<Paint> paint); public static void setProperty(String name, String value) { - GLES20Canvas.setProperty(name, value); + DisplayListCanvas.setProperty(name, value); } } diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 9921be2..afa7f51 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -205,7 +205,7 @@ public abstract class HardwareRenderer { * false otherwise */ public static boolean isAvailable() { - return GLES20Canvas.isAvailable(); + return DisplayListCanvas.isAvailable(); } /** @@ -423,7 +423,7 @@ public abstract class HardwareRenderer { */ static HardwareRenderer create(Context context, boolean translucent) { HardwareRenderer renderer = null; - if (GLES20Canvas.isAvailable()) { + if (DisplayListCanvas.isAvailable()) { renderer = new ThreadedRenderer(context, translucent); } return renderer; diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index 09eb486..38867a8 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -225,7 +225,7 @@ public class RenderNode { * @see #isValid() */ public HardwareCanvas start(int width, int height) { - HardwareCanvas canvas = GLES20RecordingCanvas.obtain(this); + HardwareCanvas canvas = DisplayListCanvas.obtain(this); canvas.setViewport(width, height); // The dirty rect should always be null for a display list canvas.onPreDraw(null); @@ -241,11 +241,11 @@ public class RenderNode { * @see #isValid() */ public void end(HardwareCanvas endCanvas) { - if (!(endCanvas instanceof GLES20RecordingCanvas)) { + if (!(endCanvas instanceof DisplayListCanvas)) { throw new IllegalArgumentException("Passed an invalid canvas to end!"); } - GLES20RecordingCanvas canvas = (GLES20RecordingCanvas) endCanvas; + DisplayListCanvas canvas = (DisplayListCanvas) endCanvas; canvas.onPostDraw(); long renderNodeData = canvas.finishRecording(); nSetDisplayListData(mNativeRenderNode, renderNodeData); diff --git a/core/java/android/view/RenderNodeAnimator.java b/core/java/android/view/RenderNodeAnimator.java index 7b35a3b..379796d 100644 --- a/core/java/android/view/RenderNodeAnimator.java +++ b/core/java/android/view/RenderNodeAnimator.java @@ -283,10 +283,10 @@ public class RenderNodeAnimator extends Animator { } public void setTarget(Canvas canvas) { - if (!(canvas instanceof GLES20RecordingCanvas)) { + if (!(canvas instanceof DisplayListCanvas)) { throw new IllegalArgumentException("Not a GLES20RecordingCanvas"); } - final GLES20RecordingCanvas recordingCanvas = (GLES20RecordingCanvas) canvas; + final DisplayListCanvas recordingCanvas = (DisplayListCanvas) canvas; setTarget(recordingCanvas.mNode); } |