DisplayListCanvas.java revision caa08ff5e9ee004634a95776fc72bb769f1286de
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
19c9070ebd13263a341511cf779087a46750021196Chris Craikimport android.annotation.NonNull;
204afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reckimport android.annotation.Nullable;
21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Bitmap;
2252244fff29042926e21fa897ef5ab11148e35299John Reckimport android.graphics.CanvasProperty;
23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.graphics.Paint;
24c9070ebd13263a341511cf779087a46750021196Chris Craikimport android.util.Pools.SynchronizedPool;
25e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
265cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reckimport dalvik.annotation.optimization.FastNative;
275cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck
28e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/**
29f64c34e73f00bf61b5f98fa0f37f60b5798cc709Derek Sollenberger * A Canvas implementation that records view system drawing operations for deferred rendering.
30c9070ebd13263a341511cf779087a46750021196Chris Craik * This is intended for use with a DisplayList. This class keeps a list of all the Paint and
31c9070ebd13263a341511cf779087a46750021196Chris Craik * Bitmap objects that it draws, preventing the backing memory of Bitmaps from being freed while
32c9070ebd13263a341511cf779087a46750021196Chris Craik * the DisplayList is still holding a native reference to the memory.
33f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *
34f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik * @hide
35e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
36caa08ff5e9ee004634a95776fc72bb769f1286deJohn Reckpublic final class DisplayListCanvas extends RecordingCanvas {
37c9070ebd13263a341511cf779087a46750021196Chris Craik    // The recording canvas pool should be large enough to handle a deeply nested
38c9070ebd13263a341511cf779087a46750021196Chris Craik    // view hierarchy because display lists are generated recursively.
39c9070ebd13263a341511cf779087a46750021196Chris Craik    private static final int POOL_LIMIT = 25;
40c9070ebd13263a341511cf779087a46750021196Chris Craik
413d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB
423d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv
43c9070ebd13263a341511cf779087a46750021196Chris Craik    private static final SynchronizedPool<DisplayListCanvas> sPool =
44caa08ff5e9ee004634a95776fc72bb769f1286deJohn Reck            new SynchronizedPool<>(POOL_LIMIT);
45c9070ebd13263a341511cf779087a46750021196Chris Craik
46c9070ebd13263a341511cf779087a46750021196Chris Craik    RenderNode mNode;
47e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private int mWidth;
48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private int mHeight;
49051910b9f998030dacb8a0722588cc715813fde1Raph Levien
50cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger    static DisplayListCanvas obtain(@NonNull RenderNode node, int width, int height) {
51c9070ebd13263a341511cf779087a46750021196Chris Craik        if (node == null) throw new IllegalArgumentException("node cannot be null");
52c9070ebd13263a341511cf779087a46750021196Chris Craik        DisplayListCanvas canvas = sPool.acquire();
53c9070ebd13263a341511cf779087a46750021196Chris Craik        if (canvas == null) {
54cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger            canvas = new DisplayListCanvas(width, height);
55cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        } else {
56cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger            nResetDisplayListCanvas(canvas.mNativeCanvasWrapper, width, height);
57c9070ebd13263a341511cf779087a46750021196Chris Craik        }
58c9070ebd13263a341511cf779087a46750021196Chris Craik        canvas.mNode = node;
59cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        canvas.mWidth = width;
60cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        canvas.mHeight = height;
61c9070ebd13263a341511cf779087a46750021196Chris Craik        return canvas;
62c9070ebd13263a341511cf779087a46750021196Chris Craik    }
63c9070ebd13263a341511cf779087a46750021196Chris Craik
64c9070ebd13263a341511cf779087a46750021196Chris Craik    void recycle() {
65c9070ebd13263a341511cf779087a46750021196Chris Craik        mNode = null;
66c9070ebd13263a341511cf779087a46750021196Chris Craik        sPool.release(this);
67c9070ebd13263a341511cf779087a46750021196Chris Craik    }
68c9070ebd13263a341511cf779087a46750021196Chris Craik
69c9070ebd13263a341511cf779087a46750021196Chris Craik    long finishRecording() {
70c9070ebd13263a341511cf779087a46750021196Chris Craik        return nFinishRecording(mNativeCanvasWrapper);
71c9070ebd13263a341511cf779087a46750021196Chris Craik    }
72c9070ebd13263a341511cf779087a46750021196Chris Craik
73c9070ebd13263a341511cf779087a46750021196Chris Craik    @Override
74c9070ebd13263a341511cf779087a46750021196Chris Craik    public boolean isRecordingFor(Object o) {
75c9070ebd13263a341511cf779087a46750021196Chris Craik        return o == mNode;
76c9070ebd13263a341511cf779087a46750021196Chris Craik    }
776926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy
78163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    ///////////////////////////////////////////////////////////////////////////
79e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Constructors
80e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
81b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
82cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger    private DisplayListCanvas(int width, int height) {
83cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        super(nCreateDisplayListCanvas(width, height));
849c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik        mDensity = 0; // disable bitmap density scaling
85e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
86b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
87e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
88e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Canvas management
89e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
919c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik
929c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik    @Override
939c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik    public void setDensity(int density) {
949c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik        // drop silently, since DisplayListCanvas doesn't perform density scaling
959c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik    }
969c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik
97e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
98f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public boolean isHardwareAccelerated() {
99f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik        return true;
100f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    }
101f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik
102f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    @Override
103f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public void setBitmap(Bitmap bitmap) {
104f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik        throw new UnsupportedOperationException();
105f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    }
106f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik
107f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    @Override
108e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean isOpaque() {
1098dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        return false;
110e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
111e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
112e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
113e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getWidth() {
114e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mWidth;
115e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
116e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
117e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getHeight() {
119e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mHeight;
120e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
121e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
122f61970fc79e9c5cf340fa942597628242361864aRomain Guy    @Override
123f61970fc79e9c5cf340fa942597628242361864aRomain Guy    public int getMaximumBitmapWidth() {
124f61970fc79e9c5cf340fa942597628242361864aRomain Guy        return nGetMaximumTextureWidth();
125f61970fc79e9c5cf340fa942597628242361864aRomain Guy    }
126f61970fc79e9c5cf340fa942597628242361864aRomain Guy
127f61970fc79e9c5cf340fa942597628242361864aRomain Guy    @Override
128f61970fc79e9c5cf340fa942597628242361864aRomain Guy    public int getMaximumBitmapHeight() {
129f61970fc79e9c5cf340fa942597628242361864aRomain Guy        return nGetMaximumTextureHeight();
130f61970fc79e9c5cf340fa942597628242361864aRomain Guy    }
131f61970fc79e9c5cf340fa942597628242361864aRomain Guy
132e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Setup
134e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
135e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
1378afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    public void insertReorderBarrier() {
1388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nInsertReorderBarrier(mNativeCanvasWrapper, true);
1398afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    }
1408afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
1418afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    @Override
1428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    public void insertInorderBarrier() {
1438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nInsertReorderBarrier(mNativeCanvasWrapper, false);
1448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    }
1458afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
146530041d3191ce817832a0108514617768e43cda6Romain Guy    ///////////////////////////////////////////////////////////////////////////
147530041d3191ce817832a0108514617768e43cda6Romain Guy    // Functor
148530041d3191ce817832a0108514617768e43cda6Romain Guy    ///////////////////////////////////////////////////////////////////////////
149530041d3191ce817832a0108514617768e43cda6Romain Guy
150f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    /**
151cd1c3eba69d044b551cededad75474038f919890John Reck     * Records the functor specified with the drawGLFunction function pointer. This is
152cd1c3eba69d044b551cededad75474038f919890John Reck     * functionality used by webview for calling into their renderer from our display lists.
153f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     *
154f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * @param drawGLFunction A native function pointer
155f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     */
15657616d3e55ffd3a4dbfd3a721b078a09fbe6d05cNarayan Kamath    public void callDrawGLFunction2(long drawGLFunction) {
157cd1c3eba69d044b551cededad75474038f919890John Reck        nCallDrawGLFunction(mNativeCanvasWrapper, drawGLFunction, null);
158daf98e941e140e8739458126640183b9f296a2abChet Haase    }
159daf98e941e140e8739458126640183b9f296a2abChet Haase
160cd1c3eba69d044b551cededad75474038f919890John Reck    /**
161cd1c3eba69d044b551cededad75474038f919890John Reck     * Records the functor specified with the drawGLFunction function pointer. This is
162cd1c3eba69d044b551cededad75474038f919890John Reck     * functionality used by webview for calling into their renderer from our display lists.
163cd1c3eba69d044b551cededad75474038f919890John Reck     *
164cd1c3eba69d044b551cededad75474038f919890John Reck     * @param drawGLFunction A native function pointer
165cd1c3eba69d044b551cededad75474038f919890John Reck     * @param releasedCallback Called when the display list is destroyed, and thus
166cd1c3eba69d044b551cededad75474038f919890John Reck     * the functor is no longer referenced by this canvas's display list.
167cd1c3eba69d044b551cededad75474038f919890John Reck     *
168cd1c3eba69d044b551cededad75474038f919890John Reck     * NOTE: The callback does *not* necessarily mean that there are no longer
169cd1c3eba69d044b551cededad75474038f919890John Reck     * any references to the functor, just that the reference from this specific
170cd1c3eba69d044b551cededad75474038f919890John Reck     * canvas's display list has been released.
171cd1c3eba69d044b551cededad75474038f919890John Reck     */
1724afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    public void drawGLFunctor2(long drawGLFunctor, @Nullable Runnable releasedCallback) {
173cd1c3eba69d044b551cededad75474038f919890John Reck        nCallDrawGLFunction(mNativeCanvasWrapper, drawGLFunctor, releasedCallback);
174cd1c3eba69d044b551cededad75474038f919890John Reck    }
175cd1c3eba69d044b551cededad75474038f919890John Reck
176bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    ///////////////////////////////////////////////////////////////////////////
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    // Display list
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ///////////////////////////////////////////////////////////////////////////
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
180f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    /**
181f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * Draws the specified display list onto this canvas. The display list can only
182f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * be drawn if {@link android.view.RenderNode#isValid()} returns true.
183f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     *
184956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik     * @param renderNode The RenderNode to draw.
185f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     */
186f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public void drawRenderNode(RenderNode renderNode) {
187956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik        nDrawRenderNode(mNativeCanvasWrapper, renderNode.getNativeDisplayList());
188f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    }
189f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik
190e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
1916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    // Hardware layer
1926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    ///////////////////////////////////////////////////////////////////////////
193051910b9f998030dacb8a0722588cc715813fde1Raph Levien
194f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    /**
195f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * Draws the specified layer onto this canvas.
196f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     *
197f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * @param layer The layer to composite on this canvas
198f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     */
1993aadd60521960be063ee06208562ccb63dc414e3Chris Craik    void drawHardwareLayer(HardwareLayer layer) {
2003aadd60521960be063ee06208562ccb63dc414e3Chris Craik        nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle());
2016c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
2026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
2036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    ///////////////////////////////////////////////////////////////////////////
204e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Drawing
205e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
206e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
20752244fff29042926e21fa897ef5ab11148e35299John Reck    public void drawCircle(CanvasProperty<Float> cx, CanvasProperty<Float> cy,
20852244fff29042926e21fa897ef5ab11148e35299John Reck            CanvasProperty<Float> radius, CanvasProperty<Paint> paint) {
2098dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nDrawCircle(mNativeCanvasWrapper, cx.getNativeContainer(), cy.getNativeContainer(),
21052244fff29042926e21fa897ef5ab11148e35299John Reck                radius.getNativeContainer(), paint.getNativeContainer());
21152244fff29042926e21fa897ef5ab11148e35299John Reck    }
21252244fff29042926e21fa897ef5ab11148e35299John Reck
213072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    public void drawRoundRect(CanvasProperty<Float> left, CanvasProperty<Float> top,
214072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi            CanvasProperty<Float> right, CanvasProperty<Float> bottom, CanvasProperty<Float> rx,
215072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi            CanvasProperty<Float> ry, CanvasProperty<Paint> paint) {
2168dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nDrawRoundRect(mNativeCanvasWrapper, left.getNativeContainer(), top.getNativeContainer(),
217072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                right.getNativeContainer(), bottom.getNativeContainer(),
218072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                rx.getNativeContainer(), ry.getNativeContainer(),
219072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                paint.getNativeContainer());
220072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    }
221072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi
2223d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    @Override
2233d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    protected void throwIfCannotDraw(Bitmap bitmap) {
2243d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        super.throwIfCannotDraw(bitmap);
2253d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        int bitmapSize = bitmap.getByteCount();
2263d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        if (bitmapSize > MAX_BITMAP_SIZE) {
2273d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv            throw new RuntimeException(
2283d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv                    "Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap.");
2293d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        }
2303d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    }
2315cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck
2325cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2335cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native long nCreateDisplayListCanvas(int width, int height);
2345cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2355cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nResetDisplayListCanvas(long canvas, int width, int height);
2365cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2375cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native int nGetMaximumTextureWidth();
2385cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2395cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native int nGetMaximumTextureHeight();
2405cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2415cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nInsertReorderBarrier(long renderer, boolean enableReorder);
2425cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2435cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nCallDrawGLFunction(long renderer,
2445cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck            long drawGLFunction, Runnable releasedCallback);
2455cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2465cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native long nFinishRecording(long renderer);
2475cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2485cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawRenderNode(long renderer, long renderNode);
2495cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2505cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawLayer(long renderer, long layer);
2515cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2525cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawCircle(long renderer, long propCx,
2535cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck            long propCy, long propRadius, long propPaint);
2545cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
2555cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawRoundRect(long renderer, long propLeft, long propTop,
2565cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck            long propRight, long propBottom, long propRx, long propRy, long propPaint);
257e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
258