1b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/*
2b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *
4b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * you may not use this file except in compliance with the License.
6b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * You may obtain a copy of the License at
7b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *
8b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy *
10b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Unless required by applicable law or agreed to in writing, software
11b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * See the License for the specific language governing permissions and
14b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * limitations under the License.
15b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
16b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
17b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypackage android.view;
18b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
19162a0217563f4665da6eb183dfce0fef740f641fJeff Brownimport android.graphics.Bitmap;
209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haaseimport android.graphics.Matrix;
21162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
22162a0217563f4665da6eb183dfce0fef740f641fJeff Brownimport java.util.ArrayList;
23daf98e941e140e8739458126640183b9f296a2abChet Haase
24b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
25b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * An implementation of display list for OpenGL ES 2.0.
26b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
27b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass GLES20DisplayList extends DisplayList {
28162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    // These lists ensure that any Bitmaps recorded by a DisplayList are kept alive as long
29162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    // as the DisplayList is alive.  The Bitmaps are populated by the GLES20RecordingCanvas.
30162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    final ArrayList<Bitmap> mBitmaps = new ArrayList<Bitmap>(5);
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
32162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    private GLES20RecordingCanvas mCanvas;
33162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    private boolean mValid;
34b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    // Used for debugging
3613631f3da855f200a151e7837ed9f6b079622b58Romain Guy    private final String mName;
3713631f3da855f200a151e7837ed9f6b079622b58Romain Guy
38f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy    // The native display list will be destroyed when this object dies.
39f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy    // DO NOT overwrite this reference once it is set.
40f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy    private DisplayListFinalizer mFinalizer;
41f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy
4213631f3da855f200a151e7837ed9f6b079622b58Romain Guy    GLES20DisplayList(String name) {
4313631f3da855f200a151e7837ed9f6b079622b58Romain Guy        mName = name;
4413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    }
4513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
460d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy    boolean hasNativeDisplayList() {
470d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        return mValid && mFinalizer != null;
480d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy    }
490d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy
50162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    int getNativeDisplayList() {
51162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        if (!mValid || mFinalizer == null) {
52162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            throw new IllegalStateException("The display list is not valid.");
53162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        }
54162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        return mFinalizer.mNativeDisplayList;
55daf98e941e140e8739458126640183b9f296a2abChet Haase    }
56daf98e941e140e8739458126640183b9f296a2abChet Haase
57b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    @Override
58b35ab7b72967adcfd01cec483a705dafe8b951d1Gilles Debunne    public HardwareCanvas start() {
599e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase        if (mCanvas != null) {
60162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            throw new IllegalStateException("Recording has already started");
619e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase        }
62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
63162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        mValid = false;
64162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        mCanvas = GLES20RecordingCanvas.obtain(this);
65162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        mCanvas.start();
66b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mCanvas;
67b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
68b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
69b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    @Override
70b35ab7b72967adcfd01cec483a705dafe8b951d1Gilles Debunne    public void invalidate() {
71162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        if (mCanvas != null) {
72162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            mCanvas.recycle();
73162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            mCanvas = null;
74162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        }
759e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase        mValid = false;
769e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase    }
779e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase
789e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase    @Override
7938c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy    public void clear() {
8038c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy        if (!mValid) {
8138c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy            mBitmaps.clear();
8238c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy        }
8338c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy    }
8438c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy
8538c2ece5ce4c59f30e5832779bf1d86d68b1c442Romain Guy    @Override
86b35ab7b72967adcfd01cec483a705dafe8b951d1Gilles Debunne    public boolean isValid() {
879e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase        return mValid;
889e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase    }
899e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase
909e90a9953b65ae575ec8db3989857e0c145724b1Chet Haase    @Override
91b35ab7b72967adcfd01cec483a705dafe8b951d1Gilles Debunne    public void end() {
92b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        if (mCanvas != null) {
93162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            if (mFinalizer != null) {
94162a0217563f4665da6eb183dfce0fef740f641fJeff Brown                mCanvas.end(mFinalizer.mNativeDisplayList);
95162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            } else {
96162a0217563f4665da6eb183dfce0fef740f641fJeff Brown                mFinalizer = new DisplayListFinalizer(mCanvas.end(0));
9713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                GLES20Canvas.setDisplayListName(mFinalizer.mNativeDisplayList, mName);
98162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            }
99162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            mCanvas.recycle();
100162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            mCanvas = null;
101162a0217563f4665da6eb183dfce0fef740f641fJeff Brown            mValid = true;
102b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    @Override
106b35ab7b72967adcfd01cec483a705dafe8b951d1Gilles Debunne    public int getSize() {
10765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mFinalizer == null) return 0;
10865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        return GLES20Canvas.getDisplayListSize(mFinalizer.mNativeDisplayList);
10965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
11065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ///////////////////////////////////////////////////////////////////////////
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    // Native View Properties
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ///////////////////////////////////////////////////////////////////////////
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setCaching(boolean caching) {
1170d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1180d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetCaching(mFinalizer.mNativeDisplayList, caching);
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setClipChildren(boolean clipChildren) {
1240d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1250d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetClipChildren(mFinalizer.mNativeDisplayList, clipChildren);
126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
1309420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    public void setStaticMatrix(Matrix matrix) {
1310d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1320d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetStaticMatrix(mFinalizer.mNativeDisplayList, matrix.native_instance);
1339420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1349420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1359420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1369420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    @Override
1379420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    public void setAnimationMatrix(Matrix matrix) {
1380d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1390d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetAnimationMatrix(mFinalizer.mNativeDisplayList,
140afd5c3ee60c45ebb5d63d2d0d14f08130075883bChet Haase                    (matrix != null) ? matrix.native_instance : 0);
141a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
142a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
143a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
144a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
145a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setAlpha(float alpha) {
1460d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1470d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetAlpha(mFinalizer.mNativeDisplayList, alpha);
148a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
149a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
150a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
151a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
152db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    public void setHasOverlappingRendering(boolean hasOverlappingRendering) {
1530d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1540d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetHasOverlappingRendering(mFinalizer.mNativeDisplayList, hasOverlappingRendering);
155db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        }
156db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
157db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
158db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    @Override
159a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setTranslationX(float translationX) {
1600d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1610d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetTranslationX(mFinalizer.mNativeDisplayList, translationX);
162a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
163a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
164a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
165a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
166a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setTranslationY(float translationY) {
1670d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1680d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetTranslationY(mFinalizer.mNativeDisplayList, translationY);
169a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
170a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
171a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
172a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
173a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setRotation(float rotation) {
1740d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1750d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetRotation(mFinalizer.mNativeDisplayList, rotation);
176a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
178a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
179a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
180a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setRotationX(float rotationX) {
1810d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1820d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetRotationX(mFinalizer.mNativeDisplayList, rotationX);
183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
184a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
185a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
186a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
187a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setRotationY(float rotationY) {
1880d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1890d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetRotationY(mFinalizer.mNativeDisplayList, rotationY);
190a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
191a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
192a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
193a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
194a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setScaleX(float scaleX) {
1950d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
1960d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetScaleX(mFinalizer.mNativeDisplayList, scaleX);
197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
200a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
201a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setScaleY(float scaleY) {
2020d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2030d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetScaleY(mFinalizer.mNativeDisplayList, scaleY);
204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setTransformationInfo(float alpha, float translationX, float translationY,
209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            float rotation, float rotationX, float rotationY, float scaleX, float scaleY) {
2100d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2110d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetTransformationInfo(mFinalizer.mNativeDisplayList, alpha, translationX, translationY,
212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    rotation, rotationX, rotationY, scaleX, scaleY);
213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setPivotX(float pivotX) {
2180d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2190d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetPivotX(mFinalizer.mNativeDisplayList, pivotX);
220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
221a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setPivotY(float pivotY) {
2250d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2260d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetPivotY(mFinalizer.mNativeDisplayList, pivotY);
227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setCameraDistance(float distance) {
2320d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2330d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetCameraDistance(mFinalizer.mNativeDisplayList, distance);
234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
237a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
238a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setLeft(int left) {
2390d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2400d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetLeft(mFinalizer.mNativeDisplayList, left);
241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setTop(int top) {
2460d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2470d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetTop(mFinalizer.mNativeDisplayList, top);
248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setRight(int right) {
2530d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2540d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetRight(mFinalizer.mNativeDisplayList, right);
255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
257a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
258a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setBottom(int bottom) {
2600d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2610d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetBottom(mFinalizer.mNativeDisplayList, bottom);
262a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setLeftTop(int left, int top) {
2670d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2680d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetLeftTop(mFinalizer.mNativeDisplayList, left, top);
269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
271a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
272a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
273a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void setLeftTopRightBottom(int left, int top, int right, int bottom) {
2740d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2750d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nSetLeftTopRightBottom(mFinalizer.mNativeDisplayList, left, top, right, bottom);
276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void offsetLeftRight(int offset) {
2810d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2820d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nOffsetLeftRight(mFinalizer.mNativeDisplayList, offset);
283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    @Override
287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    public void offsetTopBottom(int offset) {
2880d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy        if (hasNativeDisplayList()) {
2890d6f4c06df0b0e35125f088ca028c7226b274dc4Romain Guy            nOffsetTopBottom(mFinalizer.mNativeDisplayList, offset);
290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
292a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nOffsetTopBottom(int displayList, int offset);
294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nOffsetLeftRight(int displayList, int offset);
295a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetLeftTopRightBottom(int displayList, int left, int top,
296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            int right, int bottom);
297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetLeftTop(int displayList, int left, int top);
298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetBottom(int displayList, int bottom);
299a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetRight(int displayList, int right);
300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetTop(int displayList, int top);
301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetLeft(int displayList, int left);
302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetCameraDistance(int displayList, float distance);
303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetPivotY(int displayList, float pivotY);
304a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetPivotX(int displayList, float pivotX);
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetCaching(int displayList, boolean caching);
306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetClipChildren(int displayList, boolean clipChildren);
307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetAlpha(int displayList, float alpha);
308db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    private static native void nSetHasOverlappingRendering(int displayList,
309db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            boolean hasOverlappingRendering);
310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetTranslationX(int displayList, float translationX);
311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetTranslationY(int displayList, float translationY);
312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetRotation(int displayList, float rotation);
313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetRotationX(int displayList, float rotationX);
314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetRotationY(int displayList, float rotationY);
315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetScaleX(int displayList, float scaleX);
316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetScaleY(int displayList, float scaleY);
317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    private static native void nSetTransformationInfo(int displayList, float alpha,
318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            float translationX, float translationY, float rotation, float rotationX,
319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            float rotationY, float scaleX, float scaleY);
3209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    private static native void nSetStaticMatrix(int displayList, int nativeMatrix);
3219420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    private static native void nSetAnimationMatrix(int displayList, int animationMatrix);
322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
323a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
324a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ///////////////////////////////////////////////////////////////////////////
325a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    // Finalization
326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ///////////////////////////////////////////////////////////////////////////
327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
328f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy    private static class DisplayListFinalizer {
329162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        final int mNativeDisplayList;
3305977baa1fa24125c148a72699b53e62abaf08960Chet Haase
331162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        public DisplayListFinalizer(int nativeDisplayList) {
332f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy            mNativeDisplayList = nativeDisplayList;
3335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        }
3345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        @Override
336f890fab5a6715548e520a6f010a3bfe7607ce56ePatrick Dubroy        protected void finalize() throws Throwable {
3376c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            try {
338162a0217563f4665da6eb183dfce0fef740f641fJeff Brown                GLES20Canvas.destroyDisplayList(mNativeDisplayList);
3396c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            } finally {
3406c319ca1275c8db892c39b48fc54864c949f9171Romain Guy                super.finalize();
3416c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
3425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        }
3435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
345