RenderNode.java revision 44b49f070aafe8ad44efae87341121cce49ff11c
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;
20a753f4c6cb8558795e673df1896532cd148781e2Chris Craikimport android.annotation.Nullable;
21f666ad7046c0b1b255835f75aeb7d1391067df93John Reckimport android.graphics.Matrix;
22b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikimport android.graphics.Outline;
2325fbb3fa1138675379102a44405852555cefccbdJohn Reckimport android.graphics.Paint;
24a753f4c6cb8558795e673df1896532cd148781e2Chris Craikimport android.graphics.Rect;
25766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuimport android.graphics.drawable.AnimatedVectorDrawable;
26f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
27f666ad7046c0b1b255835f75aeb7d1391067df93John Reck/**
28f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>A display list records a series of graphics related operations and can replay
29f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * them later. Display lists are usually built by recording operations on a
30f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik * {@link DisplayListCanvas}. Replaying the operations from a display list avoids
31f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * executing application code on every frame, and is thus much more efficient.</p>
32f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
33f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>Display lists are used internally for all views by default, and are not
34f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * typically used directly. One reason to consider using a display is a custom
35f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link View} implementation that needs to issue a large number of drawing commands.
36f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * When the view invalidates, all the drawing commands must be reissued, even if
37f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * large portions of the drawing command stream stay the same frame to frame, which
38f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * can become a performance bottleneck. To solve this issue, a custom View might split
39f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * its content into several display lists. A display list is updated only when its
40f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * content, and only its content, needs to be updated.</p>
41f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
42f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>A text editor might for instance store each paragraph into its own display list.
43f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * Thus when the user inserts or removes characters, only the display list of the
44f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * affected paragraph needs to be recorded again.</p>
45f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
46f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Hardware acceleration</h3>
47f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik * <p>Display lists can only be replayed using a {@link DisplayListCanvas}. They are not
48f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * supported in software. Always make sure that the {@link android.graphics.Canvas}
49f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * you are using to render a display list is hardware accelerated using
50f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link android.graphics.Canvas#isHardwareAccelerated()}.</p>
51f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
52f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Creating a display list</h3>
53f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
54f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     HardwareRenderer renderer = myView.getHardwareRenderer();
55f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     if (renderer != null) {
56f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         DisplayList displayList = renderer.createDisplayList();
57f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *         DisplayListCanvas canvas = displayList.start(width, height);
58f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         try {
59f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             // Draw onto the canvas
60f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             // For instance: canvas.drawBitmap(...);
61f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         } finally {
62f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             displayList.end();
63f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
64f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
65f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
66f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
67f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Rendering a display list on a View</h3>
68f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
69f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     protected void onDraw(Canvas canvas) {
70f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         if (canvas.isHardwareAccelerated()) {
71f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *             DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas;
72f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *             displayListCanvas.drawDisplayList(mDisplayList);
73f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
74f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
75f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
76f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
77f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Releasing resources</h3>
78f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>This step is not mandatory but recommended if you want to release resources
79f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * held by a display list as soon as possible.</p>
80f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
81f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     // Mark this display list invalid, it cannot be used for drawing anymore,
82f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     // and release resources held by this display list
83f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     displayList.clear();
84f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
85f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
86f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Properties</h3>
87f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>In addition, a display list offers several properties, such as
88f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * {@link #setScaleX(float)} or {@link #setLeft(int)}, that can be used to affect all
89f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * the drawing commands recorded within. For instance, these properties can be used
90f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * to move around a large number of images without re-issuing all the individual
91f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <code>drawBitmap()</code> calls.</p>
92f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
93f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <pre class="prettyprint">
94f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     private void createDisplayList() {
95f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         mDisplayList = DisplayList.create("MyDisplayList");
96f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *         DisplayListCanvas canvas = mDisplayList.start(width, height);
97f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         try {
98f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             for (Bitmap b : mBitmaps) {
99f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *                 canvas.drawBitmap(b, 0.0f, 0.0f, null);
100f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *                 canvas.translate(0.0f, b.getHeight());
101f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             }
102f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         } finally {
103f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *             displayList.end();
104f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
105f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
106f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
107f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     protected void onDraw(Canvas canvas) {
108f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         if (canvas.isHardwareAccelerated()) {
109f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *             DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas;
110f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *             displayListCanvas.drawDisplayList(mDisplayList);
111f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *         }
112f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
113f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
114f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     private void moveContentBy(int x) {
115f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // This will move all the bitmaps recorded inside the display list
116f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // by x pixels to the right and redraw this view. All the commands
117f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // recorded in createDisplayList() won't be re-issued, only onDraw()
118f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          // will be invoked and will execute very quickly
119f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          mDisplayList.offsetLeftAndRight(x);
120f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *          invalidate();
121f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *     }
122f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * </pre>
123f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
124f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <h3>Threading</h3>
125f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * <p>Display lists must be created on and manipulated from the UI thread only.</p>
126f666ad7046c0b1b255835f75aeb7d1391067df93John Reck *
127f666ad7046c0b1b255835f75aeb7d1391067df93John Reck * @hide
128f666ad7046c0b1b255835f75aeb7d1391067df93John Reck */
129f666ad7046c0b1b255835f75aeb7d1391067df93John Reckpublic class RenderNode {
130f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
131f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    private boolean mValid;
132119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // Do not access directly unless you are ThreadedRenderer
133119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    final long mNativeRenderNode;
134119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    private final View mOwningView;
135f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
136119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    private RenderNode(String name, View owningView) {
1378de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        mNativeRenderNode = nCreate(name);
138119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mOwningView = owningView;
139f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        if (mOwningView instanceof SurfaceView) {
140f648108f83d4e74811919e9811efb8fcc184b8a3John Reck            nRequestPositionUpdates(mNativeRenderNode, (SurfaceView) mOwningView);
141f648108f83d4e74811919e9811efb8fcc184b8a3John Reck        }
142f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
143f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
144f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
145e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     * @see RenderNode#adopt(long)
146e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     */
147e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    private RenderNode(long nativePtr) {
148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mNativeRenderNode = nativePtr;
149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mOwningView = null;
150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    /**
1539a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * Creates a new RenderNode that can be used to record batches of
1549a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * drawing operations, and store / apply render properties when drawn.
155f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
1569a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * @param name The name of the RenderNode, used for debugging purpose. May be null.
157f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
1589a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * @return A new RenderNode.
159f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
160119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    public static RenderNode create(String name, @Nullable View owningView) {
161119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        return new RenderNode(name, owningView);
162f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
163f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
164f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
165e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     * Adopts an existing native render node.
166e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     *
167e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     * Note: This will *NOT* incRef() on the native object, however it will
168e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     * decRef() when it is destroyed. The caller should have already incRef'd it
169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck     */
170e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    public static RenderNode adopt(long nativePtr) {
171e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return new RenderNode(nativePtr);
172e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
175e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    /**
17649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Starts recording a display list for the render node. All
17749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * operations performed on the returned canvas are recorded and
17849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * stored in this display list.
179f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
18049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Calling this method will mark the render node invalid until
181f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * {@link #end(DisplayListCanvas)} is called.
18249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Only valid render nodes can be replayed.
183f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
18449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * @param width The width of the recording viewport
18549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * @param height The height of the recording viewport
186f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
187f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return A canvas to record drawing operations.
188f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
189f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * @see #end(DisplayListCanvas)
190f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #isValid()
191f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
192f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public DisplayListCanvas start(int width, int height) {
193cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        return DisplayListCanvas.obtain(this, width, height);
194f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
195f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
196f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
197f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Ends the recording for this display list. A display list cannot be
198f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * replayed if recording is not finished. Calling this method marks
199f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * the display list valid and {@link #isValid()} will return true.
200f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
201f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #start(int, int)
202f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #isValid()
203f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
2043891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik    public void end(DisplayListCanvas canvas) {
205003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        long displayList = canvas.finishRecording();
206003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        nSetDisplayList(mNativeRenderNode, displayList);
207f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        canvas.recycle();
208f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mValid = true;
209f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
210f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
211f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
212f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Reset native resources. This is called when cleaning up the state of display lists
213f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * during destruction of hardware resources, to ensure that we do not hold onto
214f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * obsolete resources after related resources are gone.
215f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
216003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    public void discardDisplayList() {
217f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (!mValid) return;
218f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
219003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        nSetDisplayList(mNativeRenderNode, 0);
220f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        mValid = false;
221f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
222f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
223f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
224df0c431e6cc23c0348d2e71fd834d74379afa33dChris Craik     * Returns whether the RenderNode's display list content is currently usable.
225df0c431e6cc23c0348d2e71fd834d74379afa33dChris Craik     * If this returns false, the display list should be re-recorded prior to replaying it.
226f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
227f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return boolean true if the display list is able to be replayed, false otherwise.
228f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
229f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public boolean isValid() { return mValid; }
230f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
231f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    long getNativeDisplayList() {
232f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        if (!mValid) {
233f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            throw new IllegalStateException("The display list is not valid.");
234f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
2358de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return mNativeRenderNode;
236f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
237f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
238f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
23949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // Matrix manipulation
24049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    ///////////////////////////////////////////////////////////////////////////
24149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
24249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public boolean hasIdentityMatrix() {
2438de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nHasIdentityMatrix(mNativeRenderNode);
24449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
24549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
24649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public void getMatrix(@NonNull Matrix outMatrix) {
2478de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        nGetTransformMatrix(mNativeRenderNode, outMatrix.native_instance);
24849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
24949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
25049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public void getInverseMatrix(@NonNull Matrix outMatrix) {
2518de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        nGetInverseTransformMatrix(mNativeRenderNode, outMatrix.native_instance);
25249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
25349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
25449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    ///////////////////////////////////////////////////////////////////////////
25549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // RenderProperty Setters
256f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
257f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
25825fbb3fa1138675379102a44405852555cefccbdJohn Reck    public boolean setLayerType(int layerType) {
25925fbb3fa1138675379102a44405852555cefccbdJohn Reck        return nSetLayerType(mNativeRenderNode, layerType);
26025fbb3fa1138675379102a44405852555cefccbdJohn Reck    }
26125fbb3fa1138675379102a44405852555cefccbdJohn Reck
262342a7e6a7cdf0f3ddf9302c0fd9d8a73ba98bb7fsergeyv    public boolean setLayerPaint(@Nullable Paint paint) {
263dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger        return nSetLayerPaint(mNativeRenderNode, paint != null ? paint.getNativeInstance() : 0);
264f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
265f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
266a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    public boolean setClipBounds(@Nullable Rect rect) {
267a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        if (rect == null) {
268a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            return nSetClipBoundsEmpty(mNativeRenderNode);
269a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        } else {
270a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            return nSetClipBounds(mNativeRenderNode, rect.left, rect.top, rect.right, rect.bottom);
271a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        }
272a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    }
273a753f4c6cb8558795e673df1896532cd148781e2Chris Craik
274f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
27549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * Set whether the Render node should clip itself to its bounds. This property is controlled by
276f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * the view's parent.
277f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
278f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param clipToBounds true if the display list should clip to its bounds
279f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
28079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setClipToBounds(boolean clipToBounds) {
28179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetClipToBounds(mNativeRenderNode, clipToBounds);
282f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
283f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
284f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
285f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets whether the display list should be drawn immediately after the
28649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik     * closest ancestor display list containing a projection receiver.
287f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
288f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param shouldProject true if the display list should be projected onto a
289f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *            containing volume.
290f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
29179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setProjectBackwards(boolean shouldProject) {
29279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetProjectBackwards(mNativeRenderNode, shouldProject);
293f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
294f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
295f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
296f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets whether the display list is a projection receiver - that its parent
297f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * DisplayList should draw any descendent DisplayLists with
298f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * ProjectBackwards=true directly on top of it. Default value is false.
299f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
30079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setProjectionReceiver(boolean shouldRecieve) {
30179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetProjectionReceiver(mNativeRenderNode, shouldRecieve);
302f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
303f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
304f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
305f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the outline, defining the shape that casts a shadow, and the path to
306f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * be clipped if setClipToOutline is set.
307f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
308b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     * Deep copies the data into native to simplify reference ownership.
309b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     */
31079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setOutline(Outline outline) {
3110645128b80621edee70f8cab4afb208fe0c26becChris Craik        if (outline == null) {
3120645128b80621edee70f8cab4afb208fe0c26becChris Craik            return nSetOutlineNone(mNativeRenderNode);
3130645128b80621edee70f8cab4afb208fe0c26becChris Craik        } else if (outline.isEmpty()) {
31479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return nSetOutlineEmpty(mNativeRenderNode);
315b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        } else if (outline.mRect != null) {
31679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return nSetOutlineRoundRect(mNativeRenderNode, outline.mRect.left, outline.mRect.top,
31777b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik                    outline.mRect.right, outline.mRect.bottom, outline.mRadius, outline.mAlpha);
318b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        } else if (outline.mPath != null) {
31977b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik            return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath,
32077b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik                    outline.mAlpha);
321b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        }
32279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        throw new IllegalArgumentException("Unrecognized outline?");
323f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
324f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
3255c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik    public boolean hasShadow() {
3265c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik        return nHasShadow(mNativeRenderNode);
3275c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik    }
3285c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik
329f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
330f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Enables or disables clipping to the outline.
331f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
332f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param clipToOutline true if clipping to the outline.
333f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
33479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setClipToOutline(boolean clipToOutline) {
33579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetClipToOutline(mNativeRenderNode, clipToOutline);
336f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
337f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
338deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    public boolean getClipToOutline() {
339deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        return nGetClipToOutline(mNativeRenderNode);
340deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    }
341deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
342f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
3438c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik     * Controls the RenderNode's circular reveal clip.
3448c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik     */
345af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    public boolean setRevealClip(boolean shouldClip,
3468c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik            float x, float y, float radius) {
347af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik        return nSetRevealClip(mNativeRenderNode, shouldClip, x, y, radius);
3488c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
3498c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
3508c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    /**
351f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Set the static matrix on the display list. The specified matrix is combined with other
352f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * transforms (such as {@link #setScaleX(float)}, {@link #setRotation(float)}, etc.)
353f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
354f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param matrix A transform matrix to apply to this display list
355f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
35679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setStaticMatrix(Matrix matrix) {
35779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetStaticMatrix(mNativeRenderNode, matrix.native_instance);
358f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
359f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
360f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
361f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Set the Animation matrix on the display list. This matrix exists if an Animation is
362f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * currently playing on a View, and is set on the display list during at draw() time. When
363f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * the Animation finishes, the matrix should be cleared by sending <code>null</code>
364f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * for the matrix parameter.
365f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
366f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param matrix The matrix, null indicates that the matrix should be cleared.
367f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
36879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setAnimationMatrix(Matrix matrix) {
36979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetAnimationMatrix(mNativeRenderNode,
370f666ad7046c0b1b255835f75aeb7d1391067df93John Reck                (matrix != null) ? matrix.native_instance : 0);
371f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
372f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
373f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
374f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translucency level for the display list.
375f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
376f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param alpha The translucency of the display list, must be a value between 0.0f and 1.0f
377f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
378f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setAlpha(float)
379f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getAlpha()
380f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
38179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setAlpha(float alpha) {
38279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetAlpha(mNativeRenderNode, alpha);
383f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
384f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
385f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
386f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translucency level of this display list.
387f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
388f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return A value between 0.0f and 1.0f
389f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
390f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setAlpha(float)
391f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
392f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getAlpha() {
3938de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetAlpha(mNativeRenderNode);
394f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
395f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
396f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
397f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets whether the display list renders content which overlaps. Non-overlapping rendering
398f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * can use a fast path for alpha that avoids rendering to an offscreen buffer. By default
399f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * display lists consider they do not have overlapping content.
400f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
401f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param hasOverlappingRendering False if the content is guaranteed to be non-overlapping,
402f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *                                true otherwise.
403f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
404f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see android.view.View#hasOverlappingRendering()
405f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #hasOverlappingRendering()
406f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
40779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setHasOverlappingRendering(boolean hasOverlappingRendering) {
40879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetHasOverlappingRendering(mNativeRenderNode, hasOverlappingRendering);
409f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
410f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
411f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
412f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Indicates whether the content of this display list overlaps.
413f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
414f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @return True if this display list renders content which overlaps, false otherwise.
415f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
416f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setHasOverlappingRendering(boolean)
417f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
418f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public boolean hasOverlappingRendering() {
419f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        //noinspection SimplifiableIfStatement
4208de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nHasOverlappingRendering(mNativeRenderNode);
421f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
422f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
42379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setElevation(float lift) {
42479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetElevation(mNativeRenderNode, lift);
425cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
426cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
427cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    public float getElevation() {
428cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        return nGetElevation(mNativeRenderNode);
429cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
430cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
431f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
432f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translation value for the display list on the X axis.
433f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
434f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param translationX The X axis translation value of the display list, in pixels
435f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
436f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTranslationX(float)
437f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTranslationX()
438f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
43979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setTranslationX(float translationX) {
44079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetTranslationX(mNativeRenderNode, translationX);
441f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
442f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
443f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
444f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translation value for this display list on the X axis, in pixels.
445f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
446f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTranslationX(float)
447f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
448f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTranslationX() {
4498de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetTranslationX(mNativeRenderNode);
450f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
451f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
452f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
453f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translation value for the display list on the Y axis.
454f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
455f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param translationY The Y axis translation value of the display list, in pixels
456f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
457f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTranslationY(float)
458f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTranslationY()
459f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
46079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setTranslationY(float translationY) {
46179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetTranslationY(mNativeRenderNode, translationY);
462f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
463f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
464f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
465f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translation value for this display list on the Y axis, in pixels.
466f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
467f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTranslationY(float)
468f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
469f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTranslationY() {
4708de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetTranslationY(mNativeRenderNode);
471f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
472f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
473f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
474f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the translation value for the display list on the Z axis.
475f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
476f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTranslationZ(float)
477f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getTranslationZ()
478f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
47979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setTranslationZ(float translationZ) {
48079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetTranslationZ(mNativeRenderNode, translationZ);
481f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
482f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
483f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
484f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the translation value for this display list on the Z axis.
485f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
486f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setTranslationZ(float)
487f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
488f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getTranslationZ() {
4898de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetTranslationZ(mNativeRenderNode);
490f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
491f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
492f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
493f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the rotation value for the display list around the Z axis.
494f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
495f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param rotation The rotation value of the display list, in degrees
496f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
497f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRotation(float)
498f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRotation()
499f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
50079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setRotation(float rotation) {
50179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetRotation(mNativeRenderNode, rotation);
502f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
503f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
504f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
505f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the rotation value for this display list around the Z axis, in degrees.
506f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
507f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRotation(float)
508f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
509f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRotation() {
5108de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetRotation(mNativeRenderNode);
511f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
512f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
513f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
514f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the rotation value for the display list around the X axis.
515f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
516f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param rotationX The rotation value of the display list, in degrees
517f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
518f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRotationX(float)
519f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRotationX()
520f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
52179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setRotationX(float rotationX) {
52279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetRotationX(mNativeRenderNode, rotationX);
523f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
524f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
525f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
526f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the rotation value for this display list around the X axis, in degrees.
527f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
528f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRotationX(float)
529f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
530f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRotationX() {
5318de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetRotationX(mNativeRenderNode);
532f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
533f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
534f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
535f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the rotation value for the display list around the Y axis.
536f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
537f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param rotationY The rotation value of the display list, in degrees
538f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
539f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRotationY(float)
540f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getRotationY()
541f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
54279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setRotationY(float rotationY) {
54379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetRotationY(mNativeRenderNode, rotationY);
544f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
545f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
546f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
547f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the rotation value for this display list around the Y axis, in degrees.
548f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
549f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setRotationY(float)
550f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
551f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getRotationY() {
5528de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetRotationY(mNativeRenderNode);
553f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
554f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
555f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
556f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the scale value for the display list on the X axis.
557f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
558f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param scaleX The scale value of the display list
559f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
560f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setScaleX(float)
561f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getScaleX()
562f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
56379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setScaleX(float scaleX) {
56479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetScaleX(mNativeRenderNode, scaleX);
565f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
566f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
567f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
568f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the scale value for this display list on the X axis.
569f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
570f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setScaleX(float)
571f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
572f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getScaleX() {
5738de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetScaleX(mNativeRenderNode);
574f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
575f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
576f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
577f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the scale value for the display list on the Y axis.
578f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
579f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param scaleY The scale value of the display list
580f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
581f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setScaleY(float)
582f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getScaleY()
583f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
58479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setScaleY(float scaleY) {
58579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetScaleY(mNativeRenderNode, scaleY);
586f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
587f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
588f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
589f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the scale value for this display list on the Y axis.
590f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
591f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setScaleY(float)
592f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
593f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getScaleY() {
5948de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetScaleY(mNativeRenderNode);
595f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
596f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
597f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
598f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the pivot value for the display list on the X axis
599f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
600f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param pivotX The pivot value of the display list on the X axis, in pixels
601f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
602f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setPivotX(float)
603f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getPivotX()
604f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
60579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setPivotX(float pivotX) {
60679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetPivotX(mNativeRenderNode, pivotX);
607f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
608f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
609f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
610f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the pivot value for this display list on the X axis, in pixels.
611f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
612f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setPivotX(float)
613f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
614f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getPivotX() {
6158de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetPivotX(mNativeRenderNode);
616f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
617f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
618f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
619f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the pivot value for the display list on the Y axis
620f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
621f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param pivotY The pivot value of the display list on the Y axis, in pixels
622f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
623f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setPivotY(float)
624f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getPivotY()
625f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
62679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setPivotY(float pivotY) {
62779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetPivotY(mNativeRenderNode, pivotY);
628f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
629f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
630f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
631f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the pivot value for this display list on the Y axis, in pixels.
632f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
633f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setPivotY(float)
634f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
635f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getPivotY() {
6368de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetPivotY(mNativeRenderNode);
637f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
638f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
63949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    public boolean isPivotExplicitlySet() {
6408de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nIsPivotExplicitlySet(mNativeRenderNode);
64149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
64249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
643f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
644f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the camera distance for the display list. Refer to
645f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * {@link View#setCameraDistance(float)} for more information on how to
646f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * use this property.
647f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
648f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param distance The distance in Z of the camera of the display list
649f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
650f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setCameraDistance(float)
651f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #getCameraDistance()
652f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
65379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setCameraDistance(float distance) {
65479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetCameraDistance(mNativeRenderNode, distance);
655f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
656f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
657f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
658f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Returns the distance in Z of the camera of the display list.
659f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
660f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see #setCameraDistance(float)
661f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
662f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public float getCameraDistance() {
6638de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        return nGetCameraDistance(mNativeRenderNode);
664f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
665f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
666f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
667f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the left position for the display list.
668f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
669f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param left The left position, in pixels, of the display list
670f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
671f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setLeft(int)
672f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
67379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setLeft(int left) {
67479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetLeft(mNativeRenderNode, left);
675f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
676f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
677f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
678f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the top position for the display list.
679f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
680f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param top The top position, in pixels, of the display list
681f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
682f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTop(int)
683f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
68479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setTop(int top) {
68579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetTop(mNativeRenderNode, top);
686f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
687f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
688f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
689f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the right position for the display list.
690f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
691f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param right The right position, in pixels, of the display list
692f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
693f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRight(int)
694f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
69579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setRight(int right) {
69679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetRight(mNativeRenderNode, right);
697f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
698f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
699f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
700f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the bottom position for the display list.
701f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
702f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param bottom The bottom position, in pixels, of the display list
703f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
704f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setBottom(int)
705f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
70679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setBottom(int bottom) {
70779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetBottom(mNativeRenderNode, bottom);
708f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
709f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
710f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
711f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Sets the left and top positions for the display list
712f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
713f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param left The left position of the display list, in pixels
714f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param top The top position of the display list, in pixels
715f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param right The right position of the display list, in pixels
716f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param bottom The bottom position of the display list, in pixels
717f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
718f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setLeft(int)
719f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setTop(int)
720f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setRight(int)
721f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#setBottom(int)
722f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
72379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    public boolean setLeftTopRightBottom(int left, int top, int right, int bottom) {
72479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nSetLeftTopRightBottom(mNativeRenderNode, left, top, right, bottom);
725f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
726f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
727f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
728f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Offsets the left and right positions for the display list
729f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
730f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param offset The amount that the left and right positions of the display
731f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *               list are offset, in pixels
732f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
733f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#offsetLeftAndRight(int)
734f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
735a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    public boolean offsetLeftAndRight(int offset) {
73679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nOffsetLeftAndRight(mNativeRenderNode, offset);
737f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
738f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
739f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
740f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Offsets the top and bottom values for the display list
741f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
742f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @param offset The amount that the top and bottom positions of the display
743f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *               list are offset, in pixels
744f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     *
745f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * @see View#offsetTopAndBottom(int)
746f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
747a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    public boolean offsetTopAndBottom(int offset) {
74879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return nOffsetTopAndBottom(mNativeRenderNode, offset);
749f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
750f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
751f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    /**
752f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * Outputs the display list to the log. This method exists for use by
753f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     * tools to output display lists for selected nodes to the log.
754f666ad7046c0b1b255835f75aeb7d1391067df93John Reck     */
755f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    public void output() {
7568de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck        nOutput(mNativeRenderNode);
757f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
758f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
759fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    /**
760fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck     * Gets the size of the DisplayList for debug purposes.
761fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck     */
762fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    public int getDebugSize() {
763fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck        return nGetDebugSize(mNativeRenderNode);
764fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    }
765fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck
76644b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    /**
76744b49f070aafe8ad44efae87341121cce49ff11cJohn Reck     * Called by native when the passed displaylist is removed from the draw tree
76844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck     */
76944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    void onRenderNodeDetached() {
77044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck        discardDisplayList();
77144b49f070aafe8ad44efae87341121cce49ff11cJohn Reck        if (mOwningView != null) {
77244b49f070aafe8ad44efae87341121cce49ff11cJohn Reck            mOwningView.onRenderNodeDetached(this);
77344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck        }
77444b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    }
77544b49f070aafe8ad44efae87341121cce49ff11cJohn Reck
776f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
777e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animations
778e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ///////////////////////////////////////////////////////////////////////////
779e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
780e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    public void addAnimator(RenderNodeAnimator animator) {
781119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        if (mOwningView == null || mOwningView.mAttachInfo == null) {
782119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            throw new IllegalStateException("Cannot start this animator on a detached view!");
783119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        }
784e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        nAddAnimator(mNativeRenderNode, animator.getNativeAnimator());
785119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mOwningView.mAttachInfo.mViewRootImpl.registerAnimatingRenderNode(this);
786119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
787119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
7888b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu    public boolean isAttached() {
7898b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu        return mOwningView != null && mOwningView.mAttachInfo != null;
7908b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu    }
7918b083206aef627b6445a8c6be8bf5bb1d778a7f8Doris Liu
79228cfd20f024a56a927014351c8bdf9d8552603e3Doris Liu    public void addAnimator(AnimatedVectorDrawable.VectorDrawableAnimatorRT animatorSet) {
793766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        if (mOwningView == null || mOwningView.mAttachInfo == null) {
794766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            throw new IllegalStateException("Cannot start this animator on a detached view!");
795766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        }
796766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        nAddAnimator(mNativeRenderNode, animatorSet.getAnimatorNativePtr());
797766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mOwningView.mAttachInfo.mViewRootImpl.registerAnimatingRenderNode(this);
798766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    }
799766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
800119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    public void endAllAnimators() {
801119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        nEndAllAnimators(mNativeRenderNode);
802e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
803e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
804e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ///////////////////////////////////////////////////////////////////////////
805f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // Native methods
806f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
807f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
80844b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    // Intentionally not static because it acquires a reference to 'this'
80944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck    private native long nCreate(String name);
81044b49f070aafe8ad44efae87341121cce49ff11cJohn Reck
8118de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native void nDestroyRenderNode(long renderNode);
812003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    private static native void nSetDisplayList(long renderNode, long newData);
813f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
81449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    // Matrix
81549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
8168de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native void nGetTransformMatrix(long renderNode, long nativeMatrix);
8178de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native void nGetInverseTransformMatrix(long renderNode, long nativeMatrix);
8188de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native boolean nHasIdentityMatrix(long renderNode);
81949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
820f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // Properties
821f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
822a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    private static native boolean nOffsetTopAndBottom(long renderNode, int offset);
823a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    private static native boolean nOffsetLeftAndRight(long renderNode, int offset);
82479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetLeftTopRightBottom(long renderNode, int left, int top,
825f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            int right, int bottom);
82679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetBottom(long renderNode, int bottom);
82779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetRight(long renderNode, int right);
82879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetTop(long renderNode, int top);
82979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetLeft(long renderNode, int left);
83079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetCameraDistance(long renderNode, float distance);
83179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetPivotY(long renderNode, float pivotY);
83279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetPivotX(long renderNode, float pivotX);
83325fbb3fa1138675379102a44405852555cefccbdJohn Reck    private static native boolean nSetLayerType(long renderNode, int layerType);
83425fbb3fa1138675379102a44405852555cefccbdJohn Reck    private static native boolean nSetLayerPaint(long renderNode, long paint);
83579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetClipToBounds(long renderNode, boolean clipToBounds);
836a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    private static native boolean nSetClipBounds(long renderNode, int left, int top,
837a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            int right, int bottom);
838a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    private static native boolean nSetClipBoundsEmpty(long renderNode);
83979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetProjectBackwards(long renderNode, boolean shouldProject);
84079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetProjectionReceiver(long renderNode, boolean shouldRecieve);
84179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetOutlineRoundRect(long renderNode, int left, int top,
84277b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik            int right, int bottom, float radius, float alpha);
84377b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik    private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath,
84477b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik            float alpha);
84579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetOutlineEmpty(long renderNode);
8460645128b80621edee70f8cab4afb208fe0c26becChris Craik    private static native boolean nSetOutlineNone(long renderNode);
8475c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik    private static native boolean nHasShadow(long renderNode);
84879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline);
84979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetRevealClip(long renderNode,
850af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik            boolean shouldClip, float x, float y, float radius);
85179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetAlpha(long renderNode, float alpha);
85279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetHasOverlappingRendering(long renderNode,
853f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            boolean hasOverlappingRendering);
85479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetElevation(long renderNode, float lift);
85579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetTranslationX(long renderNode, float translationX);
85679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetTranslationY(long renderNode, float translationY);
85779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetTranslationZ(long renderNode, float translationZ);
85879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetRotation(long renderNode, float rotation);
85979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetRotationX(long renderNode, float rotationX);
86079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetRotationY(long renderNode, float rotationY);
86179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetScaleX(long renderNode, float scaleX);
86279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetScaleY(long renderNode, float scaleY);
86379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetStaticMatrix(long renderNode, long nativeMatrix);
86479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    private static native boolean nSetAnimationMatrix(long renderNode, long animationMatrix);
8658de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck
8668de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native boolean nHasOverlappingRendering(long renderNode);
867deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    private static native boolean nGetClipToOutline(long renderNode);
8688de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetAlpha(long renderNode);
8698de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetCameraDistance(long renderNode);
8708de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetScaleX(long renderNode);
8718de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetScaleY(long renderNode);
872cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    private static native float nGetElevation(long renderNode);
8738de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetTranslationX(long renderNode);
8748de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetTranslationY(long renderNode);
8758de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetTranslationZ(long renderNode);
8768de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetRotation(long renderNode);
8778de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetRotationX(long renderNode);
8788de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetRotationY(long renderNode);
8798de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native boolean nIsPivotExplicitlySet(long renderNode);
8808de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetPivotX(long renderNode);
8818de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native float nGetPivotY(long renderNode);
8828de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    private static native void nOutput(long renderNode);
883fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    private static native int nGetDebugSize(long renderNode);
884f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
885f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    private static native void nRequestPositionUpdates(long renderNode, SurfaceView callback);
886f648108f83d4e74811919e9811efb8fcc184b8a3John Reck
887f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
888e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animations
889e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ///////////////////////////////////////////////////////////////////////////
890e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
891e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    private static native void nAddAnimator(long renderNode, long animatorPtr);
892119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    private static native void nEndAllAnimators(long renderNode);
893e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
894e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ///////////////////////////////////////////////////////////////////////////
895f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    // Finalization
896f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    ///////////////////////////////////////////////////////////////////////////
897f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
898f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    @Override
899f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    protected void finalize() throws Throwable {
900f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        try {
9018de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck            nDestroyRenderNode(mNativeRenderNode);
902f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        } finally {
903f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            super.finalize();
904f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        }
905f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
906f666ad7046c0b1b255835f75aeb7d1391067df93John Reck}
907