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