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
26fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikimport dalvik.annotation.optimization.CriticalNative;
275cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reckimport dalvik.annotation.optimization.FastNative;
285cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/**
30f64c34e73f00bf61b5f98fa0f37f60b5798cc709Derek Sollenberger * A Canvas implementation that records view system drawing operations for deferred rendering.
31c9070ebd13263a341511cf779087a46750021196Chris Craik * This is intended for use with a DisplayList. This class keeps a list of all the Paint and
32c9070ebd13263a341511cf779087a46750021196Chris Craik * Bitmap objects that it draws, preventing the backing memory of Bitmaps from being freed while
33c9070ebd13263a341511cf779087a46750021196Chris Craik * the DisplayList is still holding a native reference to the memory.
34f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik *
35f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik * @hide
36e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
37caa08ff5e9ee004634a95776fc72bb769f1286deJohn Reckpublic final class DisplayListCanvas extends RecordingCanvas {
38c9070ebd13263a341511cf779087a46750021196Chris Craik    // The recording canvas pool should be large enough to handle a deeply nested
39c9070ebd13263a341511cf779087a46750021196Chris Craik    // view hierarchy because display lists are generated recursively.
40c9070ebd13263a341511cf779087a46750021196Chris Craik    private static final int POOL_LIMIT = 25;
41c9070ebd13263a341511cf779087a46750021196Chris Craik
423d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB
433d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv
44c9070ebd13263a341511cf779087a46750021196Chris Craik    private static final SynchronizedPool<DisplayListCanvas> sPool =
45caa08ff5e9ee004634a95776fc72bb769f1286deJohn Reck            new SynchronizedPool<>(POOL_LIMIT);
46c9070ebd13263a341511cf779087a46750021196Chris Craik
47c9070ebd13263a341511cf779087a46750021196Chris Craik    RenderNode mNode;
48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private int mWidth;
49e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    private int mHeight;
50051910b9f998030dacb8a0722588cc715813fde1Raph Levien
51cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger    static DisplayListCanvas obtain(@NonNull RenderNode node, int width, int height) {
52c9070ebd13263a341511cf779087a46750021196Chris Craik        if (node == null) throw new IllegalArgumentException("node cannot be null");
53c9070ebd13263a341511cf779087a46750021196Chris Craik        DisplayListCanvas canvas = sPool.acquire();
54c9070ebd13263a341511cf779087a46750021196Chris Craik        if (canvas == null) {
55c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev            canvas = new DisplayListCanvas(node, width, height);
56cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        } else {
57c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev            nResetDisplayListCanvas(canvas.mNativeCanvasWrapper, node.mNativeRenderNode,
58c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev                    width, height);
59c9070ebd13263a341511cf779087a46750021196Chris Craik        }
60c9070ebd13263a341511cf779087a46750021196Chris Craik        canvas.mNode = node;
61cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        canvas.mWidth = width;
62cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        canvas.mHeight = height;
63c9070ebd13263a341511cf779087a46750021196Chris Craik        return canvas;
64c9070ebd13263a341511cf779087a46750021196Chris Craik    }
65c9070ebd13263a341511cf779087a46750021196Chris Craik
66c9070ebd13263a341511cf779087a46750021196Chris Craik    void recycle() {
67c9070ebd13263a341511cf779087a46750021196Chris Craik        mNode = null;
68c9070ebd13263a341511cf779087a46750021196Chris Craik        sPool.release(this);
69c9070ebd13263a341511cf779087a46750021196Chris Craik    }
70c9070ebd13263a341511cf779087a46750021196Chris Craik
71c9070ebd13263a341511cf779087a46750021196Chris Craik    long finishRecording() {
72c9070ebd13263a341511cf779087a46750021196Chris Craik        return nFinishRecording(mNativeCanvasWrapper);
73c9070ebd13263a341511cf779087a46750021196Chris Craik    }
74c9070ebd13263a341511cf779087a46750021196Chris Craik
75c9070ebd13263a341511cf779087a46750021196Chris Craik    @Override
76c9070ebd13263a341511cf779087a46750021196Chris Craik    public boolean isRecordingFor(Object o) {
77c9070ebd13263a341511cf779087a46750021196Chris Craik        return o == mNode;
78c9070ebd13263a341511cf779087a46750021196Chris Craik    }
796926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy
80163935113919a184122b8b3bd672ef08c8df65dcRomain Guy    ///////////////////////////////////////////////////////////////////////////
81e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Constructors
82e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
83b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
84c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev    private DisplayListCanvas(@NonNull RenderNode node, int width, int height) {
85c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev        super(nCreateDisplayListCanvas(node.mNativeRenderNode, width, height));
869c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik        mDensity = 0; // disable bitmap density scaling
87e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
88b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
89e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Canvas management
91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
939c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik
949c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik    @Override
959c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik    public void setDensity(int density) {
969c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik        // drop silently, since DisplayListCanvas doesn't perform density scaling
979c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik    }
989c08ee0f6cbfce4696acb166fcfbf424d8efcb31Chris Craik
99e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
100f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public boolean isHardwareAccelerated() {
101f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik        return true;
102f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    }
103f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik
104f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    @Override
105f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public void setBitmap(Bitmap bitmap) {
106f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik        throw new UnsupportedOperationException();
107f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    }
108f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik
109f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    @Override
110e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public boolean isOpaque() {
1118dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        return false;
112e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
113e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
114e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
115e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getWidth() {
116e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mWidth;
117e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
119e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
120e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public int getHeight() {
121e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        return mHeight;
122e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
123e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
124f61970fc79e9c5cf340fa942597628242361864aRomain Guy    @Override
125f61970fc79e9c5cf340fa942597628242361864aRomain Guy    public int getMaximumBitmapWidth() {
126f61970fc79e9c5cf340fa942597628242361864aRomain Guy        return nGetMaximumTextureWidth();
127f61970fc79e9c5cf340fa942597628242361864aRomain Guy    }
128f61970fc79e9c5cf340fa942597628242361864aRomain Guy
129f61970fc79e9c5cf340fa942597628242361864aRomain Guy    @Override
130f61970fc79e9c5cf340fa942597628242361864aRomain Guy    public int getMaximumBitmapHeight() {
131f61970fc79e9c5cf340fa942597628242361864aRomain Guy        return nGetMaximumTextureHeight();
132f61970fc79e9c5cf340fa942597628242361864aRomain Guy    }
133f61970fc79e9c5cf340fa942597628242361864aRomain Guy
134e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
135e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Setup
136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
138e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    @Override
1398afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    public void insertReorderBarrier() {
1408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nInsertReorderBarrier(mNativeCanvasWrapper, true);
1418afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    }
1428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
1438afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    @Override
1448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    public void insertInorderBarrier() {
1458dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nInsertReorderBarrier(mNativeCanvasWrapper, false);
1468afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    }
1478afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
148530041d3191ce817832a0108514617768e43cda6Romain Guy    ///////////////////////////////////////////////////////////////////////////
149530041d3191ce817832a0108514617768e43cda6Romain Guy    // Functor
150530041d3191ce817832a0108514617768e43cda6Romain Guy    ///////////////////////////////////////////////////////////////////////////
151530041d3191ce817832a0108514617768e43cda6Romain Guy
152f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    /**
153cd1c3eba69d044b551cededad75474038f919890John Reck     * Records the functor specified with the drawGLFunction function pointer. This is
154cd1c3eba69d044b551cededad75474038f919890John Reck     * functionality used by webview for calling into their renderer from our display lists.
155f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     *
156f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * @param drawGLFunction A native function pointer
157f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     */
15857616d3e55ffd3a4dbfd3a721b078a09fbe6d05cNarayan Kamath    public void callDrawGLFunction2(long drawGLFunction) {
159cd1c3eba69d044b551cededad75474038f919890John Reck        nCallDrawGLFunction(mNativeCanvasWrapper, drawGLFunction, null);
160daf98e941e140e8739458126640183b9f296a2abChet Haase    }
161daf98e941e140e8739458126640183b9f296a2abChet Haase
162cd1c3eba69d044b551cededad75474038f919890John Reck    /**
163cd1c3eba69d044b551cededad75474038f919890John Reck     * Records the functor specified with the drawGLFunction function pointer. This is
164cd1c3eba69d044b551cededad75474038f919890John Reck     * functionality used by webview for calling into their renderer from our display lists.
165cd1c3eba69d044b551cededad75474038f919890John Reck     *
166cd1c3eba69d044b551cededad75474038f919890John Reck     * @param drawGLFunction A native function pointer
167cd1c3eba69d044b551cededad75474038f919890John Reck     * @param releasedCallback Called when the display list is destroyed, and thus
168cd1c3eba69d044b551cededad75474038f919890John Reck     * the functor is no longer referenced by this canvas's display list.
169cd1c3eba69d044b551cededad75474038f919890John Reck     *
170cd1c3eba69d044b551cededad75474038f919890John Reck     * NOTE: The callback does *not* necessarily mean that there are no longer
171cd1c3eba69d044b551cededad75474038f919890John Reck     * any references to the functor, just that the reference from this specific
172cd1c3eba69d044b551cededad75474038f919890John Reck     * canvas's display list has been released.
173cd1c3eba69d044b551cededad75474038f919890John Reck     */
1744afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    public void drawGLFunctor2(long drawGLFunctor, @Nullable Runnable releasedCallback) {
175cd1c3eba69d044b551cededad75474038f919890John Reck        nCallDrawGLFunction(mNativeCanvasWrapper, drawGLFunctor, releasedCallback);
176cd1c3eba69d044b551cededad75474038f919890John Reck    }
177cd1c3eba69d044b551cededad75474038f919890John Reck
178bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    ///////////////////////////////////////////////////////////////////////////
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    // Display list
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ///////////////////////////////////////////////////////////////////////////
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
182f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    /**
183f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * Draws the specified display list onto this canvas. The display list can only
184f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * be drawn if {@link android.view.RenderNode#isValid()} returns true.
185f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     *
186956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik     * @param renderNode The RenderNode to draw.
187f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     */
188f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    public void drawRenderNode(RenderNode renderNode) {
189956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik        nDrawRenderNode(mNativeCanvasWrapper, renderNode.getNativeDisplayList());
190f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    }
191f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik
192e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
1936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    // Hardware layer
1946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    ///////////////////////////////////////////////////////////////////////////
195051910b9f998030dacb8a0722588cc715813fde1Raph Levien
196f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik    /**
197f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * Draws the specified layer onto this canvas.
198f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     *
199f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     * @param layer The layer to composite on this canvas
200f6829a0a618b4523619ec53c996b04d67e3186b9Chris Craik     */
2013aadd60521960be063ee06208562ccb63dc414e3Chris Craik    void drawHardwareLayer(HardwareLayer layer) {
2023aadd60521960be063ee06208562ccb63dc414e3Chris Craik        nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle());
2036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
2046c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
2056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    ///////////////////////////////////////////////////////////////////////////
206e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    // Drawing
207e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    ///////////////////////////////////////////////////////////////////////////
208e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
20952244fff29042926e21fa897ef5ab11148e35299John Reck    public void drawCircle(CanvasProperty<Float> cx, CanvasProperty<Float> cy,
21052244fff29042926e21fa897ef5ab11148e35299John Reck            CanvasProperty<Float> radius, CanvasProperty<Paint> paint) {
2118dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nDrawCircle(mNativeCanvasWrapper, cx.getNativeContainer(), cy.getNativeContainer(),
21252244fff29042926e21fa897ef5ab11148e35299John Reck                radius.getNativeContainer(), paint.getNativeContainer());
21352244fff29042926e21fa897ef5ab11148e35299John Reck    }
21452244fff29042926e21fa897ef5ab11148e35299John Reck
215072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    public void drawRoundRect(CanvasProperty<Float> left, CanvasProperty<Float> top,
216072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi            CanvasProperty<Float> right, CanvasProperty<Float> bottom, CanvasProperty<Float> rx,
217072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi            CanvasProperty<Float> ry, CanvasProperty<Paint> paint) {
2188dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        nDrawRoundRect(mNativeCanvasWrapper, left.getNativeContainer(), top.getNativeContainer(),
219072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                right.getNativeContainer(), bottom.getNativeContainer(),
220072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                rx.getNativeContainer(), ry.getNativeContainer(),
221072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                paint.getNativeContainer());
222072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    }
223072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi
2243d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    @Override
2253d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    protected void throwIfCannotDraw(Bitmap bitmap) {
2263d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        super.throwIfCannotDraw(bitmap);
2273d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        int bitmapSize = bitmap.getByteCount();
2283d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        if (bitmapSize > MAX_BITMAP_SIZE) {
2293d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv            throw new RuntimeException(
2303d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv                    "Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap.");
2313d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv        }
2323d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv    }
2335cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck
234fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
235fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    // ------------------ Fast JNI ------------------------
236fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
2375cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    @FastNative
238fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    private static native void nCallDrawGLFunction(long renderer,
239fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik            long drawGLFunction, Runnable releasedCallback);
240fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
241fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
242fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    // ------------------ Critical JNI ------------------------
243fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
244fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
245c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev    private static native long nCreateDisplayListCanvas(long node, int width, int height);
246fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
247c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev    private static native void nResetDisplayListCanvas(long canvas, long node,
248c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev            int width, int height);
249fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2505cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native int nGetMaximumTextureWidth();
251fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2525cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native int nGetMaximumTextureHeight();
253fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2545cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nInsertReorderBarrier(long renderer, boolean enableReorder);
255fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2565cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native long nFinishRecording(long renderer);
257fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2585cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawRenderNode(long renderer, long renderNode);
259fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2605cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawLayer(long renderer, long layer);
261fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2625cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawCircle(long renderer, long propCx,
2635cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck            long propCy, long propRadius, long propPaint);
264fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    @CriticalNative
2655cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    private static native void nDrawRoundRect(long renderer, long propLeft, long propTop,
2665cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck            long propRight, long propBottom, long propRx, long propRy, long propPaint);
267e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
268