RenderNode.java revision 49e6c73913e9bee58ea5e3984be151ee8e033163
1f666ad7046c0b1b255835f75aeb7d1391067df93John Reck/*
2f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * Copyright (C) 2010 The Android Open Source Project
3f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
4f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * you may not use this file except in compliance with the License.
6f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * You may obtain a copy of the License at
7f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
8f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
10f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * Unless required by applicable law or agreed to in writing, software
11f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * See the License for the specific language governing permissions and
14f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * limitations under the License.
15f666ad7046c0b1b255835f75aeb7d1391067df93John Reck */
16f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
17f666ad7046c0b1b255835f75aeb7d1391067df93John Reckpackage android.view;
18f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
1949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craikimport android.annotation.NonNull;
20f666ad7046c0b1b255835f75aeb7d1391067df93John Reckimport android.graphics.Matrix;
21b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikimport android.graphics.Outline;
22f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
23f666ad7046c0b1b255835f75aeb7d1391067df93John Reck/**
24f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>A display list records a series of graphics related operations and can replay
25f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * them later. Display lists are usually built by recording operations on a
26f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link HardwareCanvas}. Replaying the operations from a display list avoids
27f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * executing application code on every frame, and is thus much more efficient.</p>
28f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
29f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>Display lists are used internally for all views by default, and are not
30f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * typically used directly. One reason to consider using a display is a custom
31f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link View} implementation that needs to issue a large number of drawing commands.
32f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * When the view invalidates, all the drawing commands must be reissued, even if
33f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * large portions of the drawing command stream stay the same frame to frame, which
34f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * can become a performance bottleneck. To solve this issue, a custom View might split
35f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * its content into several display lists. A display list is updated only when its
36f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * content, and only its content, needs to be updated.</p>
37f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
38f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>A text editor might for instance store each paragraph into its own display list.
39f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * Thus when the user inserts or removes characters, only the display list of the
40f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * affected paragraph needs to be recorded again.</p>
41f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
42f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Hardware acceleration</h3>
43f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>Display lists can only be replayed using a {@link HardwareCanvas}. They are not
44f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * supported in software. Always make sure that the {@link android.graphics.Canvas}
45f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * you are using to render a display list is hardware accelerated using
46f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link android.graphics.Canvas#isHardwareAccelerated()}.</p>
47f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
48f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Creating a display list</h3>
49f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
50f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     HardwareRenderer renderer = myView.getHardwareRenderer();
51f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     if (renderer != null) {
52f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         DisplayList displayList = renderer.createDisplayList();
53f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         HardwareCanvas canvas = displayList.start(width, height);
54f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         try {
55f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             // Draw onto the canvas
56f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             // For instance: canvas.drawBitmap(...);
57f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         } finally {
58f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             displayList.end();
59f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
60f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
61f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
62f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
63f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Rendering a display list on a View</h3>
64f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
65f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     protected void onDraw(Canvas canvas) {
66f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         if (canvas.isHardwareAccelerated()) {
67f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             HardwareCanvas hardwareCanvas = (HardwareCanvas) canvas;
68f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             hardwareCanvas.drawDisplayList(mDisplayList);
69f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
70f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
71f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
72f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
73f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Releasing resources</h3>
74f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>This step is not mandatory but recommended if you want to release resources
75f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * held by a display list as soon as possible.</p>
76f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
77f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     // Mark this display list invalid, it cannot be used for drawing anymore,
78f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     // and release resources held by this display list
79f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     displayList.clear();
80f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
81f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
82f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Properties</h3>
83f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>In addition, a display list offers several properties, such as
84f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link #setScaleX(float)} or {@link #setLeft(int)}, that can be used to affect all
85f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * the drawing commands recorded within. For instance, these properties can be used
86f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * to move around a large number of images without re-issuing all the individual
87f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <code>drawBitmap()</code> calls.</p>
88f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
89f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
90f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     private void createDisplayList() {
91f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         mDisplayList = DisplayList.create("MyDisplayList");
92f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         HardwareCanvas canvas = mDisplayList.start(width, height);
93f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         try {
94f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             for (Bitmap b : mBitmaps) {
95f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *                 canvas.drawBitmap(b, 0.0f, 0.0f, null);
96f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *                 canvas.translate(0.0f, b.getHeight());
97f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             }
98f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         } finally {
99f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             displayList.end();
100f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
101f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
102f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
103f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     protected void onDraw(Canvas canvas) {
104f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         if (canvas.isHardwareAccelerated()) {
105f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             HardwareCanvas hardwareCanvas = (HardwareCanvas) canvas;
106f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             hardwareCanvas.drawDisplayList(mDisplayList);
107f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
108f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
109f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
110f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     private void moveContentBy(int x) {
111f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // This will move all the bitmaps recorded inside the display list
112f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // by x pixels to the right and redraw this view. All the commands
113f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // recorded in createDisplayList() won't be re-issued, only onDraw()
114f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // will be invoked and will execute very quickly
115f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          mDisplayList.offsetLeftAndRight(x);
116f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          invalidate();
117f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
118f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
119f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
120f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Threading</h3>
121f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>Display lists must be created on and manipulated from the UI thread only.</p>
122f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
123f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * @hide
124f666ad7046c0b1b255835f75aeb7d1391067df93John Reck */
125f666ad7046c0b1b255835f75aeb7d1391067df93John Reckpublic class RenderNode {
126f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
127f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Flag used when calling
128f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * {@link HardwareCanvas#drawDisplayList(RenderNode, android.graphics.Rect, int)}
129f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * When this flag is set, draw operations lying outside of the bounds of the
130f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * display list will be culled early. It is recommeneded to always set this
131f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * flag.
132f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
133f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
134f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
135f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public static final int FLAG_CLIP_CHILDREN = 0x1;
136f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
137f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // NOTE: The STATUS_* values *must* match the enum in DrawGlInfo.h
138f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
139f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
140f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Indicates that the display list is done drawing.
141f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
142f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see HardwareCanvas#drawDisplayList(RenderNode, android.graphics.Rect, int)
143f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
144f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
145f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
146f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public static final int STATUS_DONE = 0x0;
147f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
148f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
149f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Indicates that the display list needs another drawing pass.
150f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
151f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see HardwareCanvas#drawDisplayList(RenderNode, android.graphics.Rect, int)
152f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
153f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
154f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
155f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public static final int STATUS_DRAW = 0x1;
156f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
157f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
158f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Indicates that the display list needs to re-execute its GL functors.
159f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
160f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see HardwareCanvas#drawDisplayList(RenderNode, android.graphics.Rect, int)
161f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see HardwareCanvas#callDrawGLFunction(long)
162f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
163f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
164f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
165f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public static final int STATUS_INVOKE = 0x2;
166f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
167f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
168f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Indicates that the display list performed GL drawing operations.
169f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
170f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see HardwareCanvas#drawDisplayList(RenderNode, android.graphics.Rect, int)
171f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
172f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
173f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
174f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public static final int STATUS_DREW = 0x4;
175f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
176f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private boolean mValid;
177f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private final long mNativeDisplayList;
178f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private HardwareRenderer mRenderer;
179f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
180f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private RenderNode(String name) {
181f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mNativeDisplayList = nCreate();
182f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetDisplayListName(mNativeDisplayList, name);
183f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
184f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
185f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
186f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Creates a new display list that can be used to record batches of
187f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * drawing operations.
188f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
189f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param name The name of the display list, used for debugging purpose. May be null.
190f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
191f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return A new display list.
192f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
193f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
194f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
195f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public static RenderNode create(String name) {
196f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return new RenderNode(name);
197f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
198f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
199f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
20049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Starts recording a display list for the render node. All
20149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * operations performed on the returned canvas are recorded and
20249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * stored in this display list.
203f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
20449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Calling this method will mark the render node invalid until
20549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * {@link #end(HardwareRenderer, HardwareCanvas)} is called.
20649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Only valid render nodes can be replayed.
207f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
20849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * @param width The width of the recording viewport
20949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * @param height The height of the recording viewport
210f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
211f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return A canvas to record drawing operations.
212f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
21349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * @see #end(HardwareRenderer, HardwareCanvas)
214f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #isValid()
215f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
216f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public HardwareCanvas start(int width, int height) {
217f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        HardwareCanvas canvas = GLES20RecordingCanvas.obtain();
218f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        canvas.setViewport(width, height);
219f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        // The dirty rect should always be null for a display list
220f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        canvas.onPreDraw(null);
221f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return canvas;
222f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
223f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
224f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
225f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Ends the recording for this display list. A display list cannot be
226f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * replayed if recording is not finished. Calling this method marks
227f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * the display list valid and {@link #isValid()} will return true.
228f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
229f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #start(int, int)
230f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #isValid()
231f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
232f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void end(HardwareRenderer renderer, HardwareCanvas endCanvas) {
233f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (!(endCanvas instanceof GLES20RecordingCanvas)) {
234f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            throw new IllegalArgumentException("Passed an invalid canvas to end!");
235f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
236f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
237f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        GLES20RecordingCanvas canvas = (GLES20RecordingCanvas) endCanvas;
238f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        canvas.onPostDraw();
239f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        long displayListData = canvas.finishRecording();
240f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (renderer != mRenderer) {
241f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            // If we are changing renderers first destroy with the old
242f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            // renderer, then set with the new one
243f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            destroyDisplayListData();
244f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
245f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mRenderer = renderer;
246f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        setDisplayListData(displayListData);
247f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        canvas.recycle();
248f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mValid = true;
249f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
250f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
251f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
252f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Reset native resources. This is called when cleaning up the state of display lists
253f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * during destruction of hardware resources, to ensure that we do not hold onto
254f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * obsolete resources after related resources are gone.
255f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
256f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
257f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
258f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void destroyDisplayListData() {
259f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (!mValid) return;
260f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
261f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        setDisplayListData(0);
262f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mRenderer = null;
263f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mValid = false;
264f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
265f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
266f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private void setDisplayListData(long newData) {
267f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (mRenderer != null) {
268f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            mRenderer.setDisplayListData(mNativeDisplayList, newData);
269f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        } else {
270f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            throw new IllegalStateException("Trying to set data without a renderer! data=" + newData);
271f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
272f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
273f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
274f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
275df0c431e6cc23c0348d2e71fd834d74379afa33dChris Craik     * Returns whether the RenderNode's display list content is currently usable.
276df0c431e6cc23c0348d2e71fd834d74379afa33dChris Craik     * If this returns false, the display list should be re-recorded prior to replaying it.
277f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
278f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return boolean true if the display list is able to be replayed, false otherwise.
279f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
280f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public boolean isValid() { return mValid; }
281f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
282f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    long getNativeDisplayList() {
283f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (!mValid) {
284f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            throw new IllegalStateException("The display list is not valid.");
285f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
286f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return mNativeDisplayList;
287f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
288f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
289f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
29049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // Matrix manipulation
29149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    ///////////////////////////////////////////////////////////////////////////
29249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
29349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public boolean hasIdentityMatrix() {
29449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return nHasIdentityMatrix(mNativeDisplayList);
29549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
29649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
29749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public void getMatrix(@NonNull Matrix outMatrix) {
29849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        nGetTransformMatrix(mNativeDisplayList, outMatrix.native_instance);
29949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
30049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
30149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public void getInverseMatrix(@NonNull Matrix outMatrix) {
30249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        nGetInverseTransformMatrix(mNativeDisplayList, outMatrix.native_instance);
30349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
30449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
30549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    ///////////////////////////////////////////////////////////////////////////
30649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // RenderProperty Setters
307f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
308f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
309f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
310f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Set the caching property on the display list, which indicates whether the display list
311f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * holds a layer. Layer display lists should avoid creating an alpha layer, since alpha is
312f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * handled in the drawLayer operation directly (and more efficiently).
313f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
314f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param caching true if the display list represents a hardware layer, false otherwise.
315f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
316f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
317f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
318f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setCaching(boolean caching) {
319f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetCaching(mNativeDisplayList, caching);
320f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
321f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
322f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
32349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Set whether the Render node should clip itself to its bounds. This property is controlled by
324f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * the view's parent.
325f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
326f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param clipToBounds true if the display list should clip to its bounds
327f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
328f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setClipToBounds(boolean clipToBounds) {
329f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetClipToBounds(mNativeDisplayList, clipToBounds);
330f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
331f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
332f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
333f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets whether the display list should be drawn immediately after the
33449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * closest ancestor display list containing a projection receiver.
335f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
336f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param shouldProject true if the display list should be projected onto a
337f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *            containing volume.
338f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
339f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setProjectBackwards(boolean shouldProject) {
340f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetProjectBackwards(mNativeDisplayList, shouldProject);
341f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
342f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
343f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
344f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets whether the display list is a projection receiver - that its parent
345f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * DisplayList should draw any descendent DisplayLists with
346f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * ProjectBackwards=true directly on top of it. Default value is false.
347f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
348f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setProjectionReceiver(boolean shouldRecieve) {
349f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetProjectionReceiver(mNativeDisplayList, shouldRecieve);
350f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
351f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
352f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
353f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the outline, defining the shape that casts a shadow, and the path to
354f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * be clipped if setClipToOutline is set.
355f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
356b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     * Deep copies the data into native to simplify reference ownership.
357b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     */
358b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    public void setOutline(Outline outline) {
359b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        if (outline == null) {
360b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            nSetOutlineEmpty(mNativeDisplayList);
361b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        } else if (!outline.isValid()) {
362b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            throw new IllegalArgumentException("Outline must be valid");
363b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        } else if (outline.mRect != null) {
364b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            nSetOutlineRoundRect(mNativeDisplayList, outline.mRect.left, outline.mRect.top,
365b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik                    outline.mRect.right, outline.mRect.bottom, outline.mRadius);
366b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        } else if (outline.mPath != null) {
367b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            nSetOutlineConvexPath(mNativeDisplayList, outline.mPath.mNativePath);
368b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        }
369f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
370f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
371f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
372f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Enables or disables clipping to the outline.
373f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
374f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param clipToOutline true if clipping to the outline.
375f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
376f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setClipToOutline(boolean clipToOutline) {
377f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetClipToOutline(mNativeDisplayList, clipToOutline);
378f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
379f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
380f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
3818c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik     * Controls the RenderNode's circular reveal clip.
3828c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik     */
3838c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    public void setRevealClip(boolean shouldClip, boolean inverseClip,
3848c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik            float x, float y, float radius) {
3858c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        nSetRevealClip(mNativeDisplayList, shouldClip, inverseClip, x, y, radius);
3868c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
3878c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
3888c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    /**
389f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Set the static matrix on the display list. The specified matrix is combined with other
390f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * transforms (such as {@link #setScaleX(float)}, {@link #setRotation(float)}, etc.)
391f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
392f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param matrix A transform matrix to apply to this display list
393f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
394f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setStaticMatrix(Matrix matrix) {
395f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetStaticMatrix(mNativeDisplayList, matrix.native_instance);
396f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
397f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
398f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
399f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Set the Animation matrix on the display list. This matrix exists if an Animation is
400f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * currently playing on a View, and is set on the display list during at draw() time. When
401f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * the Animation finishes, the matrix should be cleared by sending <code>null</code>
402f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * for the matrix parameter.
403f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
404f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param matrix The matrix, null indicates that the matrix should be cleared.
405f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
406f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
407f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
408f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setAnimationMatrix(Matrix matrix) {
409f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetAnimationMatrix(mNativeDisplayList,
410f666ad7046c0b1b255835f75aeb7d1391067df93John Reck                (matrix != null) ? matrix.native_instance : 0);
411f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
412f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
413f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
414f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translucency level for the display list.
415f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
416f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param alpha The translucency of the display list, must be a value between 0.0f and 1.0f
417f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
418f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setAlpha(float)
419f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getAlpha()
420f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
421f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setAlpha(float alpha) {
422f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetAlpha(mNativeDisplayList, alpha);
423f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
424f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
425f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
426f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translucency level of this display list.
427f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
428f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return A value between 0.0f and 1.0f
429f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
430f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setAlpha(float)
431f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
432f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getAlpha() {
433f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetAlpha(mNativeDisplayList);
434f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
435f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
436f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
437f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets whether the display list renders content which overlaps. Non-overlapping rendering
438f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * can use a fast path for alpha that avoids rendering to an offscreen buffer. By default
439f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * display lists consider they do not have overlapping content.
440f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
441f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param hasOverlappingRendering False if the content is guaranteed to be non-overlapping,
442f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *                                true otherwise.
443f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
444f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see android.view.View#hasOverlappingRendering()
445f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #hasOverlappingRendering()
446f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
447f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setHasOverlappingRendering(boolean hasOverlappingRendering) {
448f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetHasOverlappingRendering(mNativeDisplayList, hasOverlappingRendering);
449f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
450f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
451f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
452f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Indicates whether the content of this display list overlaps.
453f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
454f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return True if this display list renders content which overlaps, false otherwise.
455f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
456f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setHasOverlappingRendering(boolean)
457f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
458f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public boolean hasOverlappingRendering() {
459f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        //noinspection SimplifiableIfStatement
460f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nHasOverlappingRendering(mNativeDisplayList);
461f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
462f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
463f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
464f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translation value for the display list on the X axis.
465f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
466f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param translationX The X axis translation value of the display list, in pixels
467f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
468f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTranslationX(float)
469f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTranslationX()
470f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
471f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setTranslationX(float translationX) {
472f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetTranslationX(mNativeDisplayList, translationX);
473f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
474f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
475f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
476f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translation value for this display list on the X axis, in pixels.
477f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
478f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTranslationX(float)
479f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
480f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTranslationX() {
481f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetTranslationX(mNativeDisplayList);
482f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
483f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
484f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
485f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translation value for the display list on the Y axis.
486f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
487f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param translationY The Y axis translation value of the display list, in pixels
488f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
489f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTranslationY(float)
490f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTranslationY()
491f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
492f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setTranslationY(float translationY) {
493f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetTranslationY(mNativeDisplayList, translationY);
494f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
495f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
496f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
497f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translation value for this display list on the Y axis, in pixels.
498f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
499f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTranslationY(float)
500f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
501f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTranslationY() {
502f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetTranslationY(mNativeDisplayList);
503f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
504f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
505f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
506f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translation value for the display list on the Z axis.
507f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
508f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTranslationZ(float)
509f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTranslationZ()
510f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
511f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setTranslationZ(float translationZ) {
512f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetTranslationZ(mNativeDisplayList, translationZ);
513f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
514f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
515f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
516f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translation value for this display list on the Z axis.
517f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
518f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTranslationZ(float)
519f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
520f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTranslationZ() {
521f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetTranslationZ(mNativeDisplayList);
522f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
523f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
524f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
525f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the rotation value for the display list around the Z axis.
526f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
527f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param rotation The rotation value of the display list, in degrees
528f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
529f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRotation(float)
530f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRotation()
531f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
532f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setRotation(float rotation) {
533f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetRotation(mNativeDisplayList, rotation);
534f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
535f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
536f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
537f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the rotation value for this display list around the Z axis, in degrees.
538f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
539f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRotation(float)
540f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
541f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRotation() {
542f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetRotation(mNativeDisplayList);
543f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
544f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
545f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
546f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the rotation value for the display list around the X axis.
547f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
548f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param rotationX The rotation value of the display list, in degrees
549f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
550f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRotationX(float)
551f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRotationX()
552f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
553f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setRotationX(float rotationX) {
554f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetRotationX(mNativeDisplayList, rotationX);
555f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
556f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
557f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
558f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the rotation value for this display list around the X axis, in degrees.
559f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
560f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRotationX(float)
561f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
562f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRotationX() {
563f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetRotationX(mNativeDisplayList);
564f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
565f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
566f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
567f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the rotation value for the display list around the Y axis.
568f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
569f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param rotationY The rotation value of the display list, in degrees
570f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
571f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRotationY(float)
572f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRotationY()
573f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
574f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setRotationY(float rotationY) {
575f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetRotationY(mNativeDisplayList, rotationY);
576f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
577f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
578f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
579f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the rotation value for this display list around the Y axis, in degrees.
580f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
581f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRotationY(float)
582f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
583f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRotationY() {
584f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetRotationY(mNativeDisplayList);
585f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
586f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
587f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
588f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the scale value for the display list on the X axis.
589f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
590f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param scaleX The scale value of the display list
591f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
592f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setScaleX(float)
593f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getScaleX()
594f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
595f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setScaleX(float scaleX) {
596f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetScaleX(mNativeDisplayList, scaleX);
597f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
598f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
599f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
600f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the scale value for this display list on the X axis.
601f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
602f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setScaleX(float)
603f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
604f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getScaleX() {
605f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetScaleX(mNativeDisplayList);
606f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
607f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
608f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
609f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the scale value for the display list on the Y axis.
610f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
611f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param scaleY The scale value of the display list
612f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
613f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setScaleY(float)
614f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getScaleY()
615f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
616f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setScaleY(float scaleY) {
617f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetScaleY(mNativeDisplayList, scaleY);
618f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
619f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
620f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
621f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the scale value for this display list on the Y axis.
622f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
623f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setScaleY(float)
624f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
625f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getScaleY() {
626f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetScaleY(mNativeDisplayList);
627f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
628f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
629f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
630f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the pivot value for the display list on the X axis
631f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
632f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param pivotX The pivot value of the display list on the X axis, in pixels
633f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
634f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setPivotX(float)
635f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getPivotX()
636f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
637f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setPivotX(float pivotX) {
638f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetPivotX(mNativeDisplayList, pivotX);
639f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
640f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
641f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
642f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the pivot value for this display list on the X axis, in pixels.
643f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
644f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setPivotX(float)
645f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
646f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getPivotX() {
647f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetPivotX(mNativeDisplayList);
648f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
649f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
650f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
651f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the pivot value for the display list on the Y axis
652f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
653f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param pivotY The pivot value of the display list on the Y axis, in pixels
654f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
655f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setPivotY(float)
656f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getPivotY()
657f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
658f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setPivotY(float pivotY) {
659f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetPivotY(mNativeDisplayList, pivotY);
660f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
661f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
662f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
663f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the pivot value for this display list on the Y axis, in pixels.
664f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
665f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setPivotY(float)
666f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
667f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getPivotY() {
668f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetPivotY(mNativeDisplayList);
669f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
670f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
67149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public boolean isPivotExplicitlySet() {
67249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return nIsPivotExplicitlySet(mNativeDisplayList);
67349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
67449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
675f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
676f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the camera distance for the display list. Refer to
677f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * {@link View#setCameraDistance(float)} for more information on how to
678f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * use this property.
679f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
680f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param distance The distance in Z of the camera of the display list
681f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
682f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setCameraDistance(float)
683f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getCameraDistance()
684f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
685f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setCameraDistance(float distance) {
686f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetCameraDistance(mNativeDisplayList, distance);
687f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
688f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
689f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
690f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the distance in Z of the camera of the display list.
691f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
692f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setCameraDistance(float)
693f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
694f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getCameraDistance() {
695f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetCameraDistance(mNativeDisplayList);
696f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
697f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
698f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
699f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the left position for the display list.
700f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
701f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param left The left position, in pixels, of the display list
702f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
703f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setLeft(int)
704f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getLeft()
705f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
706f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setLeft(int left) {
707f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetLeft(mNativeDisplayList, left);
708f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
709f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
710f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
711f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the left position for the display list in pixels.
712f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
713f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setLeft(int)
714f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
715f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getLeft() {
716f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetLeft(mNativeDisplayList);
717f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
718f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
719f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
720f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the top position for the display list.
721f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
722f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param top The top position, in pixels, of the display list
723f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
724f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTop(int)
725f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTop()
726f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
727f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setTop(int top) {
728f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetTop(mNativeDisplayList, top);
729f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
730f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
731f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
732f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the top position for the display list in pixels.
733f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
734f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTop(int)
735f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
736f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTop() {
737f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetTop(mNativeDisplayList);
738f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
739f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
740f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
741f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the right position for the display list.
742f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
743f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param right The right position, in pixels, of the display list
744f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
745f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRight(int)
746f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRight()
747f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
748f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setRight(int right) {
749f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetRight(mNativeDisplayList, right);
750f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
751f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
752f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
753f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the right position for the display list in pixels.
754f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
755f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRight(int)
756f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
757f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRight() {
758f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetRight(mNativeDisplayList);
759f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
760f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
761f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
762f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the bottom position for the display list.
763f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
764f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param bottom The bottom position, in pixels, of the display list
765f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
766f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setBottom(int)
767f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getBottom()
768f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
769f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setBottom(int bottom) {
770f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetBottom(mNativeDisplayList, bottom);
771f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
772f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
773f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
774f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the bottom position for the display list in pixels.
775f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
776f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setBottom(int)
777f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
778f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getBottom() {
779f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        return nGetBottom(mNativeDisplayList);
780f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
781f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
782f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
783f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the left and top positions for the display list
784f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
785f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param left The left position of the display list, in pixels
786f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param top The top position of the display list, in pixels
787f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param right The right position of the display list, in pixels
788f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param bottom The bottom position of the display list, in pixels
789f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
790f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setLeft(int)
791f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTop(int)
792f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRight(int)
793f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setBottom(int)
794f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
795f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void setLeftTopRightBottom(int left, int top, int right, int bottom) {
796f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nSetLeftTopRightBottom(mNativeDisplayList, left, top, right, bottom);
797f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
798f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
799f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
800f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Offsets the left and right positions for the display list
801f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
802f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param offset The amount that the left and right positions of the display
803f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *               list are offset, in pixels
804f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
805f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#offsetLeftAndRight(int)
806f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
807f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void offsetLeftAndRight(float offset) {
808f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nOffsetLeftAndRight(mNativeDisplayList, offset);
809f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
810f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
811f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
812f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Offsets the top and bottom values for the display list
813f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
814f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param offset The amount that the top and bottom positions of the display
815f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *               list are offset, in pixels
816f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
817f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#offsetTopAndBottom(int)
818f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
819f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void offsetTopAndBottom(float offset) {
820f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nOffsetTopAndBottom(mNativeDisplayList, offset);
821f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
822f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
823f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
824f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Outputs the display list to the log. This method exists for use by
825f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * tools to output display lists for selected nodes to the log.
826f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
827f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @hide
828f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
829f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void output() {
830f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        nOutput(mNativeDisplayList);
831f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
832f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
833f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
834f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // Native methods
835f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
836f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
837f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native long nCreate();
838f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nDestroyDisplayList(long displayList);
839f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetDisplayListName(long displayList, String name);
840f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
84149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // Matrix
84249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
84349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    private static native void nGetTransformMatrix(long displayList, long nativeMatrix);
84449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    private static native void nGetInverseTransformMatrix(long displayList, long nativeMatrix);
84549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    private static native boolean nHasIdentityMatrix(long displayList);
84649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
847f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // Properties
848f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
849f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nOffsetTopAndBottom(long displayList, float offset);
850f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nOffsetLeftAndRight(long displayList, float offset);
851f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetLeftTopRightBottom(long displayList, int left, int top,
852f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            int right, int bottom);
853f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetBottom(long displayList, int bottom);
854f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetRight(long displayList, int right);
855f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetTop(long displayList, int top);
856f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetLeft(long displayList, int left);
857f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetCameraDistance(long displayList, float distance);
858f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetPivotY(long displayList, float pivotY);
859f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetPivotX(long displayList, float pivotX);
860f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetCaching(long displayList, boolean caching);
861f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetClipToBounds(long displayList, boolean clipToBounds);
862f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetProjectBackwards(long displayList, boolean shouldProject);
863f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetProjectionReceiver(long displayList, boolean shouldRecieve);
864b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    private static native void nSetOutlineRoundRect(long displayList, int left, int top,
865b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            int right, int bottom, float radius);
866b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    private static native void nSetOutlineConvexPath(long displayList, long nativePath);
867b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    private static native void nSetOutlineEmpty(long displayList);
868f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetClipToOutline(long displayList, boolean clipToOutline);
8698c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    private static native void nSetRevealClip(long displayList,
8708c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik            boolean shouldClip, boolean inverseClip, float x, float y, float radius);
871f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetAlpha(long displayList, float alpha);
872f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetHasOverlappingRendering(long displayList,
873f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            boolean hasOverlappingRendering);
874f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetTranslationX(long displayList, float translationX);
875f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetTranslationY(long displayList, float translationY);
876f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetTranslationZ(long displayList, float translationZ);
877f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetRotation(long displayList, float rotation);
878f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetRotationX(long displayList, float rotationX);
879f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetRotationY(long displayList, float rotationY);
880f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetScaleX(long displayList, float scaleX);
881f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetScaleY(long displayList, float scaleY);
882f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetStaticMatrix(long displayList, long nativeMatrix);
883f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nSetAnimationMatrix(long displayList, long animationMatrix);
884f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
885f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native boolean nHasOverlappingRendering(long displayList);
886f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetAlpha(long displayList);
887f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetLeft(long displayList);
888f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetTop(long displayList);
889f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetRight(long displayList);
890f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetBottom(long displayList);
891f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetCameraDistance(long displayList);
892f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetScaleX(long displayList);
893f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetScaleY(long displayList);
894f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetTranslationX(long displayList);
895f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetTranslationY(long displayList);
896f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetTranslationZ(long displayList);
897f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetRotation(long displayList);
898f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetRotationX(long displayList);
899f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetRotationY(long displayList);
90049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    private static native boolean nIsPivotExplicitlySet(long displayList);
901f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetPivotX(long displayList);
902f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native float nGetPivotY(long displayList);
903f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private static native void nOutput(long displayList);
904f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
905f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
906f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // Finalization
907f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
908f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
909f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    @Override
910f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    protected void finalize() throws Throwable {
911f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        try {
912f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            destroyDisplayListData();
913f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            nDestroyDisplayList(mNativeDisplayList);
914f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        } finally {
915f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            super.finalize();
916f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
917f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
918f666ad7046c0b1b255835f75aeb7d1391067df93John Reck}
919