GLES20Canvas.java revision 6926c72e25b8dec3dd4b84af0819fa1937ae7296
1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License.
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License.
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
17e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guypackage android.view;
18e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Bitmap;
20e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Canvas;
21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.DrawFilter;
22e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Matrix;
23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Paint;
24e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Path;
25e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Picture;
26e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.PorterDuff;
27e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Rect;
28e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.RectF;
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Region;
30e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport javax.microedition.khronos.opengles.GL;
32e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
33e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/**
34e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * An implementation of Canvas on top of OpenGL ES 2.0.
35e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
36e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy@SuppressWarnings({"deprecation"})
37e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyclass GLES20Canvas extends Canvas {
38e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
39e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private final GL mGl;
40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private final boolean mOpaque;
41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private final int mRenderer;
42e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
43e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private int mWidth;
44e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private int mHeight;
45ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
46ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    private final float[] mPoint = new float[2];
47ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    private final float[] mLine = new float[4];
486926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy
496926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    private final Rect mClipBounds = new Rect();
506926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy
516926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    private DrawFilter mFilter;
52e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Constructors
55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    GLES20Canvas(GL gl, boolean translucent) {
58e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        mGl = gl;
59e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        mOpaque = !translucent;
60e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
61e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        mRenderer = nCreateRenderer();
62e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
63e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
64e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private native int nCreateRenderer();
65e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
66e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
67e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    protected void finalize() throws Throwable {
68e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        try {
69e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            super.finalize();
70e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        } finally {
71e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            nDestroyRenderer(mRenderer);
72e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
73e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
74ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
75e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private native void nDestroyRenderer(int renderer);
76e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
77e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
78e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Canvas management
79e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
80e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
81e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
82e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean isHardwareAccelerated() {
83e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return true;
84e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
85e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
86e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
87e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public GL getGL() {
88e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
89e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setBitmap(Bitmap bitmap) {
93e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
94e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
95e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
96e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
97e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean isOpaque() {
98e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mOpaque;
99e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
100e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
101e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
102e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getWidth() {
103e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mWidth;
104e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
105e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
106e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
107e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getHeight() {
108e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mHeight;
109e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
110e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
111e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
112e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Setup
113e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
114e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
115e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
116e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setViewport(int width, int height) {
117e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        mWidth = width;
118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        mHeight = height;
119e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
120e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        nSetViewport(mRenderer, width, height);
121e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
122e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
123e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private native void nSetViewport(int renderer, int width, int height);
124e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
125e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    void onPreDraw() {
126e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        nPrepare(mRenderer);
127e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
128e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
129e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private native void nPrepare(int renderer);
130e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
131e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
132e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Clipping
133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
134e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
135e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipPath(Path path) {
137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
138e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
139e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
140e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
141e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipPath(Path path, Region.Op op) {
142e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
143e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
144e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
145e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
146e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(float left, float top, float right, float bottom) {
147bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return nClipRect(mRenderer, left, top, right, bottom);
148e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
149bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
150bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    private native boolean nClipRect(int renderer, float left, float top, float right, float bottom);
151e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
152e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
153e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(float left, float top, float right, float bottom, Region.Op op) {
154e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
155e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
156e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
157e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
158e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(int left, int top, int right, int bottom) {
159bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return nClipRect(mRenderer, left, top, right, bottom);
160e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
161bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
162bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    private native boolean nClipRect(int renderer, int left, int top, int right, int bottom);
163e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
164e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
165e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(Rect rect) {
166bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return clipRect(rect.left, rect.top, rect.right, rect.bottom);
167e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
168e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
169e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
170e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(Rect rect, Region.Op op) {
1716926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        // TODO: Implement
172e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
173e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
174e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
175e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
176e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(RectF rect) {
177bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return clipRect(rect.left, rect.top, rect.right, rect.bottom);
178e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
179e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
180e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
181e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRect(RectF rect, Region.Op op) {
1826926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        // TODO: Implement
183e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
184e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
185e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
186e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
187e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRegion(Region region) {
188e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
189e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
190e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
191e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
192e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean clipRegion(Region region, Region.Op op) {
193e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
194e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
195e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
196e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
197e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean getClipBounds(Rect bounds) {
1989d5316e3f56d138504565ff311145ac01621dff4Romain Guy        return nGetClipBounds(mRenderer, bounds);
199e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
200e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2019d5316e3f56d138504565ff311145ac01621dff4Romain Guy    private native boolean nGetClipBounds(int renderer, Rect bounds);
2029d5316e3f56d138504565ff311145ac01621dff4Romain Guy
203e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
204e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean quickReject(float left, float top, float right, float bottom, EdgeType type) {
205c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        return nQuickReject(mRenderer, left, top, right, bottom, type.nativeInt);
206e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
207c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
208c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    private native boolean nQuickReject(int renderer, float left, float top,
209c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy            float right, float bottom, int edge);
210e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
211e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
212e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean quickReject(Path path, EdgeType type) {
213bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        throw new UnsupportedOperationException();
214e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
215e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
216e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
217e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean quickReject(RectF rect, EdgeType type) {
218bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return quickReject(rect.left, rect.top, rect.right, rect.bottom, type);
219e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
220e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
221e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
222e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Transformations
223e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
224e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
225e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
226e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void translate(float dx, float dy) {
227f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        nTranslate(mRenderer, dx, dy);
228e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
229f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
230f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    private native void nTranslate(int renderer, float dx, float dy);
231e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
232e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
233e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void skew(float sx, float sy) {
234e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
235e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
236e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
237e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
238e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void rotate(float degrees) {
239f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        nRotate(mRenderer, degrees);
240e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
241f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
242f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    private native void nRotate(int renderer, float degrees);
243e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
244e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
245e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void scale(float sx, float sy) {
246f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        nScale(mRenderer, sx, sy);
247e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
248e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
249f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    private native void nScale(int renderer, float sx, float sy);
250f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
251e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
252e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setMatrix(Matrix matrix) {
253f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        nSetMatrix(mRenderer, matrix.native_instance);
254e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
255f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
256f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    private native void nSetMatrix(int renderer, int matrix);
257e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
258e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
259f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    public void getMatrix(Matrix matrix) {
260f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        nGetMatrix(mRenderer, matrix.native_instance);
261e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
262f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
263f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    private native void nGetMatrix(int renderer, int matrix);
264e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
265e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
266e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void concat(Matrix matrix) {
267f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy        nConcatMatrix(mRenderer, matrix.native_instance);
268e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
269e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
270f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    private native void nConcatMatrix(int renderer, int matrix);
271f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
272e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
273e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // State management
274e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
275e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
276e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
277e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int save() {
278bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return nSave(mRenderer, 0);
279e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
280bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
281e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
282e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int save(int saveFlags) {
283bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return nSave(mRenderer, saveFlags);
284e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
285e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
286bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    private native int nSave(int renderer, int flags);
287bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
288e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
289e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int saveLayer(RectF bounds, Paint paint, int saveFlags) {
290bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint, saveFlags);
291e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
292e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
293e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
294e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int saveLayer(float left, float top, float right, float bottom, Paint paint,
295e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            int saveFlags) {
296bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        int nativePaint = paint == null ? 0 : paint.mNativePaint;
297bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        return nSaveLayer(mRenderer, left, top, right, bottom, nativePaint, saveFlags);
298e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
299e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
300bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    private native int nSaveLayer(int renderer, float left, float top, float right, float bottom,
301bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy            int paint, int saveFlags);
302bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
303e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
304e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags) {
305bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        return saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom,
306bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy                alpha, saveFlags);
307e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
308e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
309e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
310e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
311e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            int saveFlags) {
312bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        return nSaveLayerAlpha(mRenderer, left, top, right, bottom, alpha, saveFlags);
313e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
314e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
315bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    private native int nSaveLayerAlpha(int renderer, float left, float top, float right,
316bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy            float bottom, int alpha, int saveFlags);
317bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
318e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
319e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void restore() {
320bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        nRestore(mRenderer);
321e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
322bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
323bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    private native void nRestore(int renderer);
324e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
325e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
326e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void restoreToCount(int saveCount) {
327bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        nRestoreToCount(mRenderer, saveCount);
328e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
329e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
330bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    private native void nRestoreToCount(int renderer, int saveCount);
331bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
332e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
333e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getSaveCount() {
334bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        return nGetSaveCount(mRenderer);
335e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
336bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
337bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    private native int nGetSaveCount(int renderer);
338e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
339e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
340e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Filtering
341e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
342e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
343e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
344e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setDrawFilter(DrawFilter filter) {
3456926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        // Don't crash, but ignore the draw filter
3466926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        // TODO: Implement PaintDrawFilter
3476926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        mFilter = filter;
348e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
349e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
350e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
351e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public DrawFilter getDrawFilter() {
3526926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        return mFilter;
353e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
354e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
355e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
356e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Drawing
357e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
358e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
359e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
360e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,
361e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            Paint paint) {
362e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
363e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
364e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
365e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
366e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawARGB(int a, int r, int g, int b) {
36785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        drawColor((a & 0xFF) << 24 | (r & 0xFF) << 16 | (g & 0xFF) << 8 | (b & 0xFF));
368e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
369e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
370e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
371deba785f122a47915756ffd991f5540d952cf937Romain Guy    public void drawPatch(Bitmap bitmap, byte[] chunks, RectF dst, Paint paint) {
372deba785f122a47915756ffd991f5540d952cf937Romain Guy        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
373dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy        nDrawPatch(mRenderer, bitmap.mNativeBitmap, chunks, dst.left, dst.top,
374dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy                dst.right, dst.bottom, nativePaint);
375deba785f122a47915756ffd991f5540d952cf937Romain Guy    }
376deba785f122a47915756ffd991f5540d952cf937Romain Guy
377deba785f122a47915756ffd991f5540d952cf937Romain Guy    private native void nDrawPatch(int renderer, int bitmap, byte[] chunks, float left, float top,
378dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            float right, float bottom, int paint);
379deba785f122a47915756ffd991f5540d952cf937Romain Guy
380deba785f122a47915756ffd991f5540d952cf937Romain Guy    @Override
381e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
382ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
383dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy        nDrawBitmap(mRenderer, bitmap.mNativeBitmap, left, top, nativePaint);
384e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
385e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
386dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    private native void nDrawBitmap(int renderer, int bitmap, float left, float top, int paint);
387dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy
388e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
389e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {
390ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
391dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy        nDrawBitmap(mRenderer, bitmap.mNativeBitmap, matrix.native_instance, nativePaint);
392e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
393e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
394dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy    private native void nDrawBitmap(int renderer, int bitmap, int matrix, int paint);
395f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy
396e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
397e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {
398ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
399ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        nDrawBitmap(mRenderer, bitmap.mNativeBitmap, src.left, src.top, src.right, src.bottom,
400dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy                dst.left, dst.top, dst.right, dst.bottom, nativePaint
401dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy        );
402e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
403e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
404e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
405e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
406ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
407ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        nDrawBitmap(mRenderer, bitmap.mNativeBitmap, src.left, src.top, src.right, src.bottom,
408dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy                dst.left, dst.top, dst.right, dst.bottom, nativePaint
409dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy        );
410e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
411e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
412ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    private native void nDrawBitmap(int renderer, int bitmap,
413ce0537b80087a6225273040a987414b1dd081aa0Romain Guy            float srcLeft, float srcTop, float srcRight, float srcBottom,
414dbd77cd444f89d94ec5333223c1bc17dbe0c90cdRomain Guy            float left, float top, float right, float bottom, int paint);
415ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
416e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
417e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmap(int[] colors, int offset, int stride, float x, float y,
418e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            int width, int height, boolean hasAlpha, Paint paint) {
4196926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        final Bitmap.Config config = hasAlpha ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
4206926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        final Bitmap b = Bitmap.createBitmap(colors, offset, stride, width, height, config);
4216926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
4226926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        nDrawBitmap(mRenderer, b.mNativeBitmap, x, y, nativePaint);
4236926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        b.recycle();
424e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
425e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
426e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
427e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmap(int[] colors, int offset, int stride, int x, int y,
428e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            int width, int height, boolean hasAlpha, Paint paint) {
429ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        drawBitmap(colors, offset, stride, (float) x, (float) y, width, height, hasAlpha, paint);
430e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
431e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
432e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
433e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts,
434e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            int vertOffset, int[] colors, int colorOffset, Paint paint) {
4356926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        // TODO: Implement
436e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
437e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
438e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
439e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawCircle(float cx, float cy, float radius, Paint paint) {
440e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
441e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
442e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
443e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
444e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawColor(int color) {
44585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        drawColor(color, PorterDuff.Mode.SRC_OVER);
446e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
447e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
448e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
449e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawColor(int color, PorterDuff.Mode mode) {
45085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        nDrawColor(mRenderer, color, mode.nativeInt);
451e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
45285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
45385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    private native void nDrawColor(int renderer, int color, int mode);
454e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
455e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
456e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
457ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        mLine[0] = startX;
458ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        mLine[1] = startY;
459ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        mLine[2] = stopX;
460ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        mLine[3] = stopY;
461ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        drawLines(mLine, 0, 1, paint);
462e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
463e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
464e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
465e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawLines(float[] pts, int offset, int count, Paint paint) {
466e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        // TODO: Implement
467e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
468e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
469e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
470e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawLines(float[] pts, Paint paint) {
471ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        drawLines(pts, 0, pts.length / 4, paint);
472e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
473e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
474e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
475e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawOval(RectF oval, Paint paint) {
476e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
477e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
478e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
479e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
480e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPaint(Paint paint) {
4816926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        final Rect r = mClipBounds;
4826926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        nGetClipBounds(mRenderer, r);
4836926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        drawRect(r.left, r.top, r.right, r.bottom, paint);
484e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
485e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
486e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
487e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPath(Path path, Paint paint) {
488e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
489e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
490e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
491e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
492e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPicture(Picture picture) {
493e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
494e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
495e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
496e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
497e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPicture(Picture picture, Rect dst) {
498e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
499e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
500e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
501e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
502e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPicture(Picture picture, RectF dst) {
503e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
504e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
505e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
506e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
507e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPoint(float x, float y, Paint paint) {
508ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        mPoint[0] = x;
509ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        mPoint[1] = y;
510ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        drawPoints(mPoint, 0, 1, paint);
511e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
512e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
513e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
514e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPoints(float[] pts, int offset, int count, Paint paint) {
515e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        // TODO: Implement
516e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
517e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
518e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
519e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPoints(float[] pts, Paint paint) {
520ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        drawPoints(pts, 0, pts.length / 2, paint);
521e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
522e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
523e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
524e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) {
525e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
526e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
527e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
528e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
529e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawPosText(String text, float[] pos, Paint paint) {
530e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
531e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
532e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
533e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
534e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawRect(float left, float top, float right, float bottom, Paint paint) {
535c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        nDrawRect(mRenderer, left, top, right, bottom, paint.mNativePaint);
536e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
537e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
538c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    private native void nDrawRect(int renderer, float left, float top, float right, float bottom,
539c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy            int paint);
540c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
541e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
542e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawRect(Rect r, Paint paint) {
543c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        drawRect(r.left, r.top, r.right, r.bottom, paint);
544e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
545e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
546e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
547c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    public void drawRect(RectF r, Paint paint) {
548c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy        drawRect(r.left, r.top, r.right, r.bottom, paint);
549e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
550e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
551e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
552e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawRGB(int r, int g, int b) {
55385bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        drawColor(0xFF000000 | (r & 0xFF) << 16 | (g & 0xFF) << 8 | (b & 0xFF));
554e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
555e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
556e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
557e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {
558e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
559e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
560e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
561e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
562e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {
563e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        // TODO: Implement
564e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
565e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
566e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
567e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) {
568e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        // TODO: Implement
569e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
570e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
571e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
572e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawText(String text, int start, int end, float x, float y, Paint paint) {
573e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        // TODO: Implement
574e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
575e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
576e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
577e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawText(String text, float x, float y, Paint paint) {
578ce0537b80087a6225273040a987414b1dd081aa0Romain Guy        drawText(text, 0, text.length(), x, y, paint);
579e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
580e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
581e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
582e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset,
583e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            float vOffset, Paint paint) {
584e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
585e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
586e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
587e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
588e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {
589e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
590e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
591e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
592e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
593e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount,
594e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            float x, float y, int dir, Paint paint) {
595e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
596e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
597e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
598e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
599e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawTextRun(CharSequence text, int start, int end, int contextStart, int contextEnd,
600e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            float x, float y, int dir, Paint paint) {
601e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        throw new UnsupportedOperationException();
602e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
603e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
604e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
605e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void drawVertices(VertexMode mode, int vertexCount, float[] verts, int vertOffset,
606e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            float[] texs, int texOffset, int[] colors, int colorOffset, short[] indices,
607e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            int indexOffset, int indexCount, Paint paint) {
6086926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy        // TODO: Implement
609e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
610e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
611