19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1980756e38882720860db52f1fcc21fa1505a02abfTor Norbyeimport android.annotation.ColorInt; 20ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabreseimport android.annotation.IntDef; 21ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabreseimport android.annotation.NonNull; 22ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabreseimport android.annotation.Nullable; 23b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbyeimport android.annotation.Size; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.GraphicsOperations; 25f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Feltimport android.text.SpannableString; 26f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Feltimport android.text.SpannedString; 27f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Feltimport android.text.TextUtils; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabreseimport java.lang.annotation.Retention; 30ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabreseimport java.lang.annotation.RetentionPolicy; 31ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese 32091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craikimport javax.microedition.khronos.opengles.GL; 33091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik 34775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhlerimport libcore.util.NativeAllocationRegistry; 35775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Canvas class holds the "draw" calls. To draw something, you need 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4 basic components: A Bitmap to hold the pixels, a Canvas to host 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Path, text, Bitmap), and a paint (to describe the colors and styles for the 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing). 4261fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * 4361fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <div class="special reference"> 4461fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <h3>Developer Guides</h3> 4561fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>For more information about how to use Canvas, read the 4661fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html"> 4761fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * Canvas and Drawables</a> developer guide.</p></div> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Canvas { 503891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik /** @hide */ 513891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik public static boolean sCompatibilityRestore = false; 52ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 538dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson /** 548dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson * Should only be assigned in constructors (or setBitmap if software canvas), 55775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler * freed by NativeAllocation. 568dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson * @hide 578dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson */ 588dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson protected long mNativeCanvasWrapper; 59c677675e9c465dc1de21ecf2e0421835c7eb55b4Florin Malita 60ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov /** @hide */ 615c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita public long getNativeCanvasWrapper() { 625c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return mNativeCanvasWrapper; 63c677675e9c465dc1de21ecf2e0421835c7eb55b4Florin Malita } 64ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 65a753f4c6cb8558795e673df1896532cd148781e2Chris Craik /** @hide */ 66a753f4c6cb8558795e673df1896532cd148781e2Chris Craik public boolean isRecordingFor(Object o) { return false; } 67a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 68e0aa84b7dc087e999e20055dcc04cb6a48d5bd62Romain Guy // may be null 69e0aa84b7dc087e999e20055dcc04cb6a48d5bd62Romain Guy private Bitmap mBitmap; 70ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // optional field set by the caller 72ce0537b80087a6225273040a987414b1dd081aa0Romain Guy private DrawFilter mDrawFilter; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74ce0537b80087a6225273040a987414b1dd081aa0Romain Guy /** 75ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * @hide 76ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */ 77ce0537b80087a6225273040a987414b1dd081aa0Romain Guy protected int mDensity = Bitmap.DENSITY_NONE; 780d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn 79ce0537b80087a6225273040a987414b1dd081aa0Romain Guy /** 80ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Used to determine when compatibility scaling is in effect. 81051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 82ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * @hide 83ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */ 84ce0537b80087a6225273040a987414b1dd081aa0Romain Guy protected int mScreenDensity = Bitmap.DENSITY_NONE; 85051910b9f998030dacb8a0722588cc715813fde1Raph Levien 86f61970fc79e9c5cf340fa942597628242361864aRomain Guy // Maximum bitmap size as defined in Skia's native code 87f61970fc79e9c5cf340fa942597628242361864aRomain Guy // (see SkCanvas.cpp, SkDraw.cpp) 88f61970fc79e9c5cf340fa942597628242361864aRomain Guy private static final int MAXMIMUM_BITMAP_SIZE = 32766; 89f61970fc79e9c5cf340fa942597628242361864aRomain Guy 90775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler // The approximate size of the native allocation associated with 91775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler // a Canvas object. 92775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler private static final long NATIVE_ALLOCATION_SIZE = 525; 93e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 94f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe // Use a Holder to allow static initialization of Canvas in the boot image. 95f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe private static class NoImagePreloadHolder { 96f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( 970ebdbb4a8470bb77f38c33a42c220ecb8a7adcc6Richard Uhler Canvas.class.getClassLoader(), getNativeFinalizer(), NATIVE_ALLOCATION_SIZE); 98f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe } 99ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 100775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler // This field is used to finalize the native Canvas properly 101775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler private Runnable mFinalizer; 102e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 103f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct an empty raster canvas. Use setBitmap() to specify a bitmap to 10596e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * draw into. The initial target density is {@link Bitmap#DENSITY_NONE}; 10696e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * this will typically be replaced when a target bitmap is set for the 10796e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * canvas. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Canvas() { 110003123004f7b23b3dc472d5c40b8c1a16df37a54Romain Guy if (!isHardwareAccelerated()) { 111003123004f7b23b3dc472d5c40b8c1a16df37a54Romain Guy // 0 means no native bitmap 112c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck mNativeCanvasWrapper = initRaster(null); 113f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( 114f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe this, mNativeCanvasWrapper); 115003123004f7b23b3dc472d5c40b8c1a16df37a54Romain Guy } else { 116003123004f7b23b3dc472d5c40b8c1a16df37a54Romain Guy mFinalizer = null; 117003123004f7b23b3dc472d5c40b8c1a16df37a54Romain Guy } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a canvas with the specified bitmap to draw into. The bitmap 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be mutable. 123051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 12496e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * <p>The initial target density of the canvas is the same as the given 12596e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * bitmap's density. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap Specifies a mutable bitmap for the canvas to draw into. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 129ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public Canvas(@NonNull Bitmap bitmap) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!bitmap.isMutable()) { 131f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy throw new IllegalStateException("Immutable bitmap passed to Canvas constructor"); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1331abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik throwIfCannotDraw(bitmap); 134c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck mNativeCanvasWrapper = initRaster(bitmap); 135f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( 136f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe this, mNativeCanvasWrapper); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBitmap = bitmap; 13896e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn mDensity = bitmap.mDensity; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 140ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 141ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov /** @hide */ 14236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat public Canvas(long nativeCanvas) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nativeCanvas == 0) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1468872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger mNativeCanvasWrapper = nativeCanvas; 147f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( 148f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe this, mNativeCanvasWrapper); 14996e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn mDensity = Bitmap.getDefaultDensity(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 151163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 153091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik * Returns null. 154c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik * 155091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik * @deprecated This method is not supported and should not be invoked. 156c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik * 157091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik * @hide 158091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik */ 159091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik @Deprecated 160091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik protected GL getGL() { 161091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik return null; 162091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik } 163091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik 164091ddb1374e3bcdac129c1df5ef2555cf5c2183eChris Craik /** 1652d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy * Indicates whether this Canvas uses hardware acceleration. 166051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 1672d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy * Note that this method does not define what type of hardware acceleration 1682d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy * may or may not be used. 169051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 1702d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy * @return True if drawing operations are hardware accelerated, 1712d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy * false otherwise. 1722d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy */ 1732d6145993e19d2bb664766dbaf3c1e9ad3d12cdcRomain Guy public boolean isHardwareAccelerated() { 174163935113919a184122b8b3bd672ef08c8df65dcRomain Guy return false; 175caf0df1b7f99736aed1a0b923ef278fc4fd0fccaMike Reed } 176163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 178051910b9f998030dacb8a0722588cc715813fde1Raph Levien * Specify a bitmap for the canvas to draw into. All canvas state such as 1793bd9a6dc6b30ed0ce40ca9087ca0f4b1ca789100Derek Sollenberger * layers, filters, and the save/restore stack are reset with the exception 1803bd9a6dc6b30ed0ce40ca9087ca0f4b1ca789100Derek Sollenberger * of the current matrix and clip stack. Additionally, as a side-effect 1813bd9a6dc6b30ed0ce40ca9087ca0f4b1ca789100Derek Sollenberger * the canvas' target density is updated to match that of the bitmap. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap Specifies a mutable bitmap for the canvas to draw into. 18496e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * @see #setDensity(int) 18596e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * @see #getDensity() 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 187ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void setBitmap(@Nullable Bitmap bitmap) { 188163935113919a184122b8b3bd672ef08c8df65dcRomain Guy if (isHardwareAccelerated()) { 18996890564bdbd2f2a41dfc323fc8b3938fb335639Chris Craik throw new RuntimeException("Can't set a bitmap device on a HW accelerated canvas"); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 192fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger if (bitmap == null) { 193c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck native_setBitmap(mNativeCanvasWrapper, null); 194fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger mDensity = Bitmap.DENSITY_NONE; 195fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger } else { 1960965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy if (!bitmap.isMutable()) { 1970965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy throw new IllegalStateException(); 1980965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy } 1991abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik throwIfCannotDraw(bitmap); 200fc615a0f643408956fc0dc1b997871e2b27cee7eDerek Sollenberger 201c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck native_setBitmap(mNativeCanvasWrapper, bitmap); 2020965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy mDensity = bitmap.mDensity; 2030965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy } 2040965a3244b4c3009d08db2e084cdcb681ef66d26Romain Guy 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBitmap = bitmap; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 207c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 208cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik /** @hide */ 2096578a989566e585eee053095dc80e2552e125db2Derek Sollenberger public void setHighContrastText(boolean highContrastText) { 2106578a989566e585eee053095dc80e2552e125db2Derek Sollenberger native_setHighContrastText(mNativeCanvasWrapper, highContrastText); 2116578a989566e585eee053095dc80e2552e125db2Derek Sollenberger } 212cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 2138afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik /** @hide */ 2148afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik public void insertReorderBarrier() {} 2158afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 2168afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik /** @hide */ 2178afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik public void insertInorderBarrier() {} 2188afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 219797b95b26bbb7557678af78b9a2a61830158920fChris Craik /** 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the device that the current layer draws into is opaque 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (i.e. does not support per-pixel alpha). 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the device that the current layer draws into is opaque 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public boolean isOpaque() { 22695d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_isOpaque(mNativeCanvasWrapper); 22795d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the width of the current drawing layer 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the width of the current drawing layer 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public int getWidth() { 23595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_getWidth(mNativeCanvasWrapper); 23695d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the height of the current drawing layer 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the height of the current drawing layer 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public int getHeight() { 24495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_getHeight(mNativeCanvasWrapper); 24595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24896e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * <p>Returns the target density of the canvas. The default density is 24996e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * derived from the density of its backing bitmap, or 25096e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * {@link Bitmap#DENSITY_NONE} if there is not one.</p> 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 25296e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * @return Returns the current target density of the canvas, which is used 25396e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * to determine the scaling factor when drawing a bitmap into it. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 25511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #setDensity(int) 256051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @see Bitmap#getDensity() 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public int getDensity() { 25911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return mDensity; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26396e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * <p>Specifies the density for this Canvas' backing bitmap. This modifies 26496e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * the target density of the canvas itself, as well as the density of its 26596e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * backing bitmap via {@link Bitmap#setDensity(int) Bitmap.setDensity(int)}. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 26796e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * @param density The new target density of the canvas, which is used 26896e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * to determine the scaling factor when drawing a bitmap into it. Use 26996e240f25a97c10bba863df328ed73a82c34ff61Dianne Hackborn * {@link Bitmap#DENSITY_NONE} to disable bitmap scaling. 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #getDensity() 272051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @see Bitmap#setDensity(int) 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public void setDensity(int density) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBitmap != null) { 27611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn mBitmap.setDensity(density); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn mDensity = density; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2810d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn /** @hide */ 2820d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn public void setScreenDensity(int density) { 2830d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn mScreenDensity = density; 2840d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn } 285f61970fc79e9c5cf340fa942597628242361864aRomain Guy 286f61970fc79e9c5cf340fa942597628242361864aRomain Guy /** 287f61970fc79e9c5cf340fa942597628242361864aRomain Guy * Returns the maximum allowed width for bitmaps drawn with this canvas. 288f61970fc79e9c5cf340fa942597628242361864aRomain Guy * Attempting to draw with a bitmap wider than this value will result 289f61970fc79e9c5cf340fa942597628242361864aRomain Guy * in an error. 290051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 291051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @see #getMaximumBitmapHeight() 292f61970fc79e9c5cf340fa942597628242361864aRomain Guy */ 293f61970fc79e9c5cf340fa942597628242361864aRomain Guy public int getMaximumBitmapWidth() { 294f61970fc79e9c5cf340fa942597628242361864aRomain Guy return MAXMIMUM_BITMAP_SIZE; 295f61970fc79e9c5cf340fa942597628242361864aRomain Guy } 296051910b9f998030dacb8a0722588cc715813fde1Raph Levien 297f61970fc79e9c5cf340fa942597628242361864aRomain Guy /** 298f61970fc79e9c5cf340fa942597628242361864aRomain Guy * Returns the maximum allowed height for bitmaps drawn with this canvas. 299f61970fc79e9c5cf340fa942597628242361864aRomain Guy * Attempting to draw with a bitmap taller than this value will result 300f61970fc79e9c5cf340fa942597628242361864aRomain Guy * in an error. 301051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 302051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @see #getMaximumBitmapWidth() 303f61970fc79e9c5cf340fa942597628242361864aRomain Guy */ 304f61970fc79e9c5cf340fa942597628242361864aRomain Guy public int getMaximumBitmapHeight() { 305f61970fc79e9c5cf340fa942597628242361864aRomain Guy return MAXMIMUM_BITMAP_SIZE; 306f61970fc79e9c5cf340fa942597628242361864aRomain Guy } 307f61970fc79e9c5cf340fa942597628242361864aRomain Guy 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the SAVE_FLAG constants must match their native equivalents 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 310ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese /** @hide */ 311ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @IntDef(flag = true, 312ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese value = { 313ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese MATRIX_SAVE_FLAG, 314ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese CLIP_SAVE_FLAG, 315ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese HAS_ALPHA_LAYER_SAVE_FLAG, 316ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese FULL_COLOR_LAYER_SAVE_FLAG, 317ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese CLIP_TO_LAYER_SAVE_FLAG, 318ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese ALL_SAVE_FLAG 319ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese }) 320ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @Retention(RetentionPolicy.SOURCE) 321ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public @interface Saveflags {} 322ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese 323f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik /** 324f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Restore the current matrix when restore() is called. 325f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MATRIX_SAVE_FLAG = 0x01; 327f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik 328f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik /** 329f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Restore the current clip when restore() is called. 330f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CLIP_SAVE_FLAG = 0x02; 332f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik 333f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik /** 334f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * The layer requires a per-pixel alpha channel. 335f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04; 337f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik 338f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik /** 339f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * The layer requires full 8-bit precision for each color channel. 340f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik */ 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08; 342f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik 343f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik /** 344f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Clip drawing to the bounds of the offscreen layer, omit at your own peril. 345f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p class="note"><strong>Note:</strong> it is strongly recommended to not 346f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * omit this flag for any call to <code>saveLayer()</code> and 347f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <code>saveLayerAlpha()</code> variants. Not passing this flag generally 348f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * triggers extremely poor performance with hardware accelerated rendering. 349f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik */ 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10; 351f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik 352f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik /** 353f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Restore everything when restore() is called (standard save flags). 354f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p class="note"><strong>Note:</strong> for performance reasons, it is 355f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * strongly recommended to pass this - the complete set of flags - to any 356f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * call to <code>saveLayer()</code> and <code>saveLayerAlpha()</code> 357f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * variants. 358f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik */ 359051910b9f998030dacb8a0722588cc715813fde1Raph Levien public static final int ALL_SAVE_FLAG = 0x1F; 360051910b9f998030dacb8a0722588cc715813fde1Raph Levien 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 362f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Saves the current matrix and clip onto a private stack. 363f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p> 364f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Subsequent calls to translate,scale,rotate,skew,concat or clipRect, 365f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * clipPath will all operate as usual, but when the balancing call to 366f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * restore() is made, those calls will be forgotten, and the settings that 367f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * existed before the save() will be reinstated. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The value to pass to restoreToCount() to balance this save() 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public int save() { 37295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_save(mNativeCanvasWrapper, MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG); 37395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 374051910b9f998030dacb8a0722588cc715813fde1Raph Levien 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Based on saveFlags, can save the current matrix and clip onto a private 377f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * stack. 378f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p class="note"><strong>Note:</strong> if possible, use the 379f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * parameter-less save(). It is simpler and faster than individually 380f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * disabling the saving of matrix or clip with this method. 381f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p> 382f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Subsequent calls to translate,scale,rotate,skew,concat or clipRect, 383f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * clipPath will all operate as usual, but when the balancing call to 384f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * restore() is made, those calls will be forgotten, and the settings that 385f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * existed before the save() will be reinstated. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param saveFlags flag bits that specify which parts of the Canvas state 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to save/restore 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The value to pass to restoreToCount() to balance this save() 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 391ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public int save(@Saveflags int saveFlags) { 39295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_save(mNativeCanvasWrapper, saveFlags); 39395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 396f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * This behaves the same as save(), but in addition it allocates and 397f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * redirects drawing to an offscreen bitmap. 398f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p class="note"><strong>Note:</strong> this method is very expensive, 399f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * incurring more than double rendering cost for contained content. Avoid 400f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * using this method, especially if the bounds provided are large, or if 401f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * the {@link #CLIP_TO_LAYER_SAVE_FLAG} is omitted from the 402f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * {@code saveFlags} parameter. It is recommended to use a 403f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View 404f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * to apply an xfermode, color filter, or alpha, as it will perform much 405f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * better than this method. 406f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p> 407f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * All drawing calls are directed to a newly allocated offscreen bitmap. 408f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Only when the balancing call to restore() is made, is that offscreen 409f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * buffer drawn back to the current target of the Canvas (either the 410f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * screen, it's target Bitmap, or the previous layer). 411f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p> 412f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Attributes of the Paint - {@link Paint#getAlpha() alpha}, 413f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * {@link Paint#getXfermode() Xfermode}, and 414f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * {@link Paint#getColorFilter() ColorFilter} are applied when the 415f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * offscreen bitmap is drawn back when restore() is called. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bounds May be null. The maximum size the offscreen bitmap 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * needs to be (in local coordinates) 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint This is copied, and is applied to the offscreen when 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * restore() is called. 421f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * @param saveFlags see _SAVE_FLAG constants, generally {@link #ALL_SAVE_FLAG} is recommended 422f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * for performance reasons. 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return value to pass to restoreToCount() to balance this save() 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 425ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public int saveLayer(@Nullable RectF bounds, @Nullable Paint paint, @Saveflags int saveFlags) { 4269bc13a353fa8fac323839268789ef661b219530cChris Craik if (bounds == null) { 4279bc13a353fa8fac323839268789ef661b219530cChris Craik bounds = new RectF(getClipBounds()); 4289bc13a353fa8fac323839268789ef661b219530cChris Craik } 4299bc13a353fa8fac323839268789ef661b219530cChris Craik return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint, saveFlags); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 431c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 432c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik /** 433c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik * Convenience for saveLayer(bounds, paint, {@link #ALL_SAVE_FLAG}) 434c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik */ 435ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public int saveLayer(@Nullable RectF bounds, @Nullable Paint paint) { 436c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik return saveLayer(bounds, paint, ALL_SAVE_FLAG); 437c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik } 438c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper version of saveLayer() that takes 4 values rather than a RectF. 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 442ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint, 443ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @Saveflags int saveFlags) { 4445c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_saveLayer(mNativeCanvasWrapper, left, top, right, bottom, 445dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint != null ? paint.getNativeInstance() : 0, 446f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy saveFlags); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 450c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik * Convenience for saveLayer(left, top, right, bottom, paint, {@link #ALL_SAVE_FLAG}) 451c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik */ 452ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint) { 453c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik return saveLayer(left, top, right, bottom, paint, ALL_SAVE_FLAG); 454c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik } 455c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 456c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik /** 457f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * This behaves the same as save(), but in addition it allocates and 458f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * redirects drawing to an offscreen bitmap. 459f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p class="note"><strong>Note:</strong> this method is very expensive, 460f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * incurring more than double rendering cost for contained content. Avoid 461f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * using this method, especially if the bounds provided are large, or if 462f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * the {@link #CLIP_TO_LAYER_SAVE_FLAG} is omitted from the 463f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * {@code saveFlags} parameter. It is recommended to use a 464f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View 465f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * to apply an xfermode, color filter, or alpha, as it will perform much 466f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * better than this method. 467f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p> 468f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * All drawing calls are directed to a newly allocated offscreen bitmap. 469f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * Only when the balancing call to restore() is made, is that offscreen 470f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * buffer drawn back to the current target of the Canvas (either the 471f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * screen, it's target Bitmap, or the previous layer). 472f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * <p> 473f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * The {@code alpha} parameter is applied when the offscreen bitmap is 474f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * drawn back when restore() is called. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bounds The maximum size the offscreen bitmap needs to be 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (in local coordinates) 4780d3d1f825f399c62f2ba236b53bef17581e03a16Sungsoo Lim * @param alpha The alpha to apply to the offscreen when it is 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawn during restore() 480f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * @param saveFlags see _SAVE_FLAG constants, generally {@link #ALL_SAVE_FLAG} is recommended 481f37a364a530c5c055cf4634f0b0463454a252b0fChris Craik * for performance reasons. 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return value to pass to restoreToCount() to balance this call 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4849bc13a353fa8fac323839268789ef661b219530cChris Craik public int saveLayerAlpha(@Nullable RectF bounds, int alpha, @Saveflags int saveFlags) { 4859bc13a353fa8fac323839268789ef661b219530cChris Craik if (bounds == null) { 4869bc13a353fa8fac323839268789ef661b219530cChris Craik bounds = new RectF(getClipBounds()); 4879bc13a353fa8fac323839268789ef661b219530cChris Craik } 4889bc13a353fa8fac323839268789ef661b219530cChris Craik return saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha, saveFlags); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 490c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 491c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik /** 492c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik * Convenience for saveLayerAlpha(bounds, alpha, {@link #ALL_SAVE_FLAG}) 493c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik */ 4949bc13a353fa8fac323839268789ef661b219530cChris Craik public int saveLayerAlpha(@Nullable RectF bounds, int alpha) { 495c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik return saveLayerAlpha(bounds, alpha, ALL_SAVE_FLAG); 496c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik } 497c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for saveLayerAlpha() that takes 4 values instead of a RectF. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 501f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, 502ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @Saveflags int saveFlags) { 5039bc13a353fa8fac323839268789ef661b219530cChris Craik alpha = Math.min(255, Math.max(0, alpha)); 5045c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_saveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom, 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha, saveFlags); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 509c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik * Helper for saveLayerAlpha(left, top, right, bottom, alpha, {@link #ALL_SAVE_FLAG}) 510c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik */ 511c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) { 512c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik return saveLayerAlpha(left, top, right, bottom, alpha, ALL_SAVE_FLAG); 513c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik } 514c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik 515c306ad61a791bae34ed83b339f27cb67a1d91b53Chris Craik /** 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This call balances a previous call to save(), and is used to remove all 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * modifications to the matrix/clip state since the last save call. It is 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an error to call restore() more times than save() was called. 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public void restore() { 5213891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik boolean throwOnUnderflow = !sCompatibilityRestore || !isHardwareAccelerated(); 5223891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik native_restore(mNativeCanvasWrapper, throwOnUnderflow); 52395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of matrix/clip states on the Canvas' private stack. 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will equal # save() calls - # restore() calls. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public int getSaveCount() { 53095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_getSaveCount(mNativeCanvasWrapper); 53195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Efficient way to pop any calls to save() that happened after the save 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * count reached saveCount. It is an error for saveCount to be less than 1. 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Example: 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * int count = canvas.save(); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ... // more calls potentially to save() 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * canvas.restoreToCount(count); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // now the canvas is back in the same state it was before the initial 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // call to save(). 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param saveCount The save level to restore to. 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54695d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public void restoreToCount(int saveCount) { 5473891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik boolean throwOnUnderflow = !sCompatibilityRestore || !isHardwareAccelerated(); 5483891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik native_restoreToCount(mNativeCanvasWrapper, saveCount, throwOnUnderflow); 54995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Preconcat the current matrix with the specified translation 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The distance to translate in X 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The distance to translate in Y 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55795d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public void translate(float dx, float dy) { 55895d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita native_translate(mNativeCanvasWrapper, dx, dy); 55995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Preconcat the current matrix with the specified scale. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sx The amount to scale in X 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sy The amount to scale in Y 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 56795d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public void scale(float sx, float sy) { 56895d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita native_scale(mNativeCanvasWrapper, sx, sy); 56995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Preconcat the current matrix with the specified scale. 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sx The amount to scale in X 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sy The amount to scale in Y 576cc3ec6cdb2b892eb29513e72d8b205acbe997b25Gilles Debunne * @param px The x-coord for the pivot point (unchanged by the scale) 577cc3ec6cdb2b892eb29513e72d8b205acbe997b25Gilles Debunne * @param py The y-coord for the pivot point (unchanged by the scale) 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void scale(float sx, float sy, float px, float py) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(px, py); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scale(sx, sy); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(-px, -py); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Preconcat the current matrix with the specified rotation. 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param degrees The amount to rotate, in degrees 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 59095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public void rotate(float degrees) { 59195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita native_rotate(mNativeCanvasWrapper, degrees); 59295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Preconcat the current matrix with the specified rotation. 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param degrees The amount to rotate, in degrees 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param px The x-coord for the pivot point (unchanged by the rotation) 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param py The y-coord for the pivot point (unchanged by the rotation) 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void rotate(float degrees, float px, float py) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(px, py); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rotate(degrees); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(-px, -py); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Preconcat the current matrix with the specified skew. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sx The amount to skew in X 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sy The amount to skew in Y 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 61395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public void skew(float sx, float sy) { 61495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita native_skew(mNativeCanvasWrapper, sx, sy); 61595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6184e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy * Preconcat the current matrix with the specified matrix. If the specified 6194e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy * matrix is null, this method does nothing. 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix to preconcatenate with the current matrix 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 623ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void concat(@Nullable Matrix matrix) { 6245c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita if (matrix != null) native_concat(mNativeCanvasWrapper, matrix.native_instance); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 626051910b9f998030dacb8a0722588cc715813fde1Raph Levien 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Completely replace the current matrix with the specified matrix. If the 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * matrix parameter is null, then the current matrix is reset to identity. 630051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 631f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy * <strong>Note:</strong> it is recommended to use {@link #concat(Matrix)}, 632f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy * {@link #scale(float, float)}, {@link #translate(float, float)} and 633f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy * {@link #rotate(float)} instead of this method. 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix to replace the current matrix with. If it is 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null, set the current matrix to identity. 637051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 638051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @see #concat(Matrix) 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 640ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void setMatrix(@Nullable Matrix matrix) { 6415c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_setMatrix(mNativeCanvasWrapper, 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project matrix == null ? 0 : matrix.native_instance); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 644051910b9f998030dacb8a0722588cc715813fde1Raph Levien 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return, in ctm, the current transformation matrix. This does not alter 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the matrix in the canvas, but just returns a copy of it. 648eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * 649eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * @deprecated {@link #isHardwareAccelerated() Hardware accelerated} canvases may have any 650eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * matrix when passed to a View or Drawable, as it is implementation defined where in the 651eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * hierarchy such canvases are created. It is recommended in such cases to either draw contents 652eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * irrespective of the current matrix, or to track relevant transform state outside of the 653eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * canvas. 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 655f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy @Deprecated 656ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void getMatrix(@NonNull Matrix ctm) { 6575c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_getCTM(mNativeCanvasWrapper, ctm.native_instance); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65941030da16856c8869e1e51d4a0405432fa96614eRomain Guy 66041030da16856c8869e1e51d4a0405432fa96614eRomain Guy /** 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a new matrix with a copy of the canvas' current transformation 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * matrix. 663eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * 664eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * @deprecated {@link #isHardwareAccelerated() Hardware accelerated} canvases may have any 665eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * matrix when passed to a View or Drawable, as it is implementation defined where in the 666eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * hierarchy such canvases are created. It is recommended in such cases to either draw contents 667eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * irrespective of the current matrix, or to track relevant transform state outside of the 668eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * canvas. 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 67065447287cb4112cf74483c87be70bcd00b622e2dRomain Guy @Deprecated 671ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public final @NonNull Matrix getMatrix() { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Matrix m = new Matrix(); 673f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy //noinspection deprecation 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getMatrix(m); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 677051910b9f998030dacb8a0722588cc715813fde1Raph Levien 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Modify the current clip with the specified rectangle. 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rect to intersect with the current clip 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op How the clip is modified 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 685ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRect(@NonNull RectF rect, @NonNull Region.Op op) { 6865c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_clipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, 687f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy op.nativeInt); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Modify the current clip with the specified rectangle, which is 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed in local coordinates. 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rectangle to intersect with the current clip. 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op How the clip is modified 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 698ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRect(@NonNull Rect rect, @NonNull Region.Op op) { 6995c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_clipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, 700f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy op.nativeInt); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intersect the current clip with the specified rectangle, which is 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed in local coordinates. 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rectangle to intersect with the current clip. 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 710ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRect(@NonNull RectF rect) { 71195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_clipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, 71295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita Region.Op.INTERSECT.nativeInt); 71395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 71495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intersect the current clip with the specified rectangle, which is 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed in local coordinates. 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rectangle to intersect with the current clip. 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 722ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRect(@NonNull Rect rect) { 72395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_clipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, 72495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita Region.Op.INTERSECT.nativeInt); 72595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 726051910b9f998030dacb8a0722588cc715813fde1Raph Levien 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Modify the current clip with the specified rectangle, which is 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed in local coordinates. 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle to intersect with the 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle to intersect with the current 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clip 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle to intersect with the 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle to intersect with the current 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clip 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op How the clip is modified 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 742ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRect(float left, float top, float right, float bottom, 743ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Region.Op op) { 7445c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_clipRect(mNativeCanvasWrapper, left, top, right, bottom, op.nativeInt); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intersect the current clip with the specified rectangle, which is 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed in local coordinates. 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle to intersect with the 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle to intersect with the current clip 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle to intersect with the 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle to intersect with the current 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clip 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 76095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public boolean clipRect(float left, float top, float right, float bottom) { 76195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_clipRect(mNativeCanvasWrapper, left, top, right, bottom, 76295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita Region.Op.INTERSECT.nativeInt); 76395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 764f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intersect the current clip with the specified rectangle, which is 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed in local coordinates. 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle to intersect with the 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle to intersect with the current clip 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle to intersect with the 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle to intersect with the current 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clip 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting clip is non-empty 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 77895d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita public boolean clipRect(int left, int top, int right, int bottom) { 77995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_clipRect(mNativeCanvasWrapper, left, top, right, bottom, 78095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita Region.Op.INTERSECT.nativeInt); 78195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 782f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Modify the current clip with the specified path. 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path The path to operate on the current clip 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op How the clip is modified 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting is non-empty 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 790ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipPath(@NonNull Path path, @NonNull Region.Op op) { 791a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv return native_clipPath(mNativeCanvasWrapper, path.readOnlyNI(), op.nativeInt); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 793051910b9f998030dacb8a0722588cc715813fde1Raph Levien 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intersect the current clip with the specified path. 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path The path to intersect with the current clip 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting is non-empty 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 800ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipPath(@NonNull Path path) { 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clipPath(path, Region.Op.INTERSECT); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 803051910b9f998030dacb8a0722588cc715813fde1Raph Levien 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Modify the current clip with the specified region. Note that unlike 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clipRect() and clipPath() which transform their arguments by the 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current matrix, clipRegion() assumes its argument is already in the 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * coordinate system of the current layer's bitmap, and so not 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transformation is performed. 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param region The region to operate on the current clip, based on op 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op How the clip is modified 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting is non-empty 8140d181540e0c96da454f45e65987f690b27b929d9Derek Sollenberger * 8150d181540e0c96da454f45e65987f690b27b929d9Derek Sollenberger * @deprecated Unlike all other clip calls this API does not respect the 8160d181540e0c96da454f45e65987f690b27b929d9Derek Sollenberger * current matrix. Use {@link #clipRect(Rect)} as an alternative. 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 818eda57925cafdf1dab451e70052dea27846f368b4Chris Craik @Deprecated 819ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRegion(@NonNull Region region, @NonNull Region.Op op) { 8205c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_clipRegion(mNativeCanvasWrapper, region.ni(), op.nativeInt); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intersect the current clip with the specified region. Note that unlike 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clipRect() and clipPath() which transform their arguments by the 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current matrix, clipRegion() assumes its argument is already in the 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * coordinate system of the current layer's bitmap, and so not 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transformation is performed. 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param region The region to operate on the current clip, based on op 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting is non-empty 8320d181540e0c96da454f45e65987f690b27b929d9Derek Sollenberger * 8330d181540e0c96da454f45e65987f690b27b929d9Derek Sollenberger * @deprecated Unlike all other clip calls this API does not respect the 8340d181540e0c96da454f45e65987f690b27b929d9Derek Sollenberger * current matrix. Use {@link #clipRect(Rect)} as an alternative. 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 836eda57925cafdf1dab451e70052dea27846f368b4Chris Craik @Deprecated 837ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean clipRegion(@NonNull Region region) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clipRegion(region, Region.Op.INTERSECT); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 840051910b9f998030dacb8a0722588cc715813fde1Raph Levien 841ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public @Nullable DrawFilter getDrawFilter() { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawFilter; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 844051910b9f998030dacb8a0722588cc715813fde1Raph Levien 845ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void setDrawFilter(@Nullable DrawFilter filter) { 84636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeFilter = 0; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filter != null) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeFilter = filter.mNativeInt; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawFilter = filter; 8515c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita nativeSetDrawFilter(mNativeCanvasWrapper, nativeFilter); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum EdgeType { 855d320001807168f5565bab9807ef13c111096bbb3Chet Haase 856d320001807168f5565bab9807ef13c111096bbb3Chet Haase /** 857d320001807168f5565bab9807ef13c111096bbb3Chet Haase * Black-and-White: Treat edges by just rounding to nearest pixel boundary 858d320001807168f5565bab9807ef13c111096bbb3Chet Haase */ 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BW(0), //!< treat edges by just rounding to nearest pixel boundary 860d320001807168f5565bab9807ef13c111096bbb3Chet Haase 861d320001807168f5565bab9807ef13c111096bbb3Chet Haase /** 862d320001807168f5565bab9807ef13c111096bbb3Chet Haase * Antialiased: Treat edges by rounding-out, since they may be antialiased 863d320001807168f5565bab9807ef13c111096bbb3Chet Haase */ 864d320001807168f5565bab9807ef13c111096bbb3Chet Haase AA(1); 865051910b9f998030dacb8a0722588cc715813fde1Raph Levien 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EdgeType(int nativeInt) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 870c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy /** 871c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy * @hide 872c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy */ 873c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy public final int nativeInt; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the specified rectangle, after being transformed by the 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current matrix, would lie completely outside of the current clip. Call 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to check if an area you intend to draw into is clipped out (and 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * therefore you can skip making the draw calls). 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect the rect to compare with the current clip 883d320001807168f5565bab9807ef13c111096bbb3Chet Haase * @param type {@link Canvas.EdgeType#AA} if the path should be considered antialiased, 884d320001807168f5565bab9807ef13c111096bbb3Chet Haase * since that means it may affect a larger area (more pixels) than 885d320001807168f5565bab9807ef13c111096bbb3Chet Haase * non-antialiased ({@link Canvas.EdgeType#BW}). 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the rect (transformed by the canvas' matrix) 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not intersect with the canvas' clip 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean quickReject(@NonNull RectF rect, @NonNull EdgeType type) { 89095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita return native_quickReject(mNativeCanvasWrapper, 89195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita rect.left, rect.top, rect.right, rect.bottom); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the specified path, after being transformed by the 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current matrix, would lie completely outside of the current clip. Call 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to check if an area you intend to draw into is clipped out (and 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * therefore you can skip making the draw calls). Note: for speed it may 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return false even if the path itself might not intersect the clip 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (i.e. the bounds of the path intersects, but the path does not). 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path The path to compare with the current clip 903d320001807168f5565bab9807ef13c111096bbb3Chet Haase * @param type {@link Canvas.EdgeType#AA} if the path should be considered antialiased, 904d320001807168f5565bab9807ef13c111096bbb3Chet Haase * since that means it may affect a larger area (more pixels) than 905d320001807168f5565bab9807ef13c111096bbb3Chet Haase * non-antialiased ({@link Canvas.EdgeType#BW}). 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the path (transformed by the canvas' matrix) 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not intersect with the canvas' clip 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean quickReject(@NonNull Path path, @NonNull EdgeType type) { 910a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv return native_quickReject(mNativeCanvasWrapper, path.readOnlyNI()); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the specified rectangle, after being transformed by the 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current matrix, would lie completely outside of the current clip. Call 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to check if an area you intend to draw into is clipped out (and 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * therefore you can skip making the draw calls). 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle to compare with the 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle to compare with the current 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clip 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle to compare with the 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle to compare with the 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current clip 927d320001807168f5565bab9807ef13c111096bbb3Chet Haase * @param type {@link Canvas.EdgeType#AA} if the path should be considered antialiased, 928d320001807168f5565bab9807ef13c111096bbb3Chet Haase * since that means it may affect a larger area (more pixels) than 929d320001807168f5565bab9807ef13c111096bbb3Chet Haase * non-antialiased ({@link Canvas.EdgeType#BW}). 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the rect (transformed by the canvas' matrix) 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not intersect with the canvas' clip 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 933ca79cf69d09efa0c327e9b1237d86a119aea5da7Derek Sollenberger public boolean quickReject(float left, float top, float right, float bottom, 934ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull EdgeType type) { 9355c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_quickReject(mNativeCanvasWrapper, left, top, right, bottom); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 939708144e828b1a549567ce50cd8ed3cda62930501Derek Sollenberger * Return the bounds of the current clip (in local coordinates) in the 940708144e828b1a549567ce50cd8ed3cda62930501Derek Sollenberger * bounds parameter, and return true if it is non-empty. This can be useful 941708144e828b1a549567ce50cd8ed3cda62930501Derek Sollenberger * in a way similar to quickReject, in that it tells you that drawing 942708144e828b1a549567ce50cd8ed3cda62930501Derek Sollenberger * outside of these bounds will be clipped out. 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bounds Return the clip bounds here. If it is null, ignore it but 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * still return true if the current clip is non-empty. 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the current clip is non-empty. 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 948ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public boolean getClipBounds(@Nullable Rect bounds) { 9495c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita return native_getClipBounds(mNativeCanvasWrapper, bounds); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 951051910b9f998030dacb8a0722588cc715813fde1Raph Levien 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 953708144e828b1a549567ce50cd8ed3cda62930501Derek Sollenberger * Retrieve the bounds of the current clip (in local coordinates). 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the clip bounds, or [0, 0, 0, 0] if the clip is empty. 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 957ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public final @NonNull Rect getClipBounds() { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect r = new Rect(); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getClipBounds(r); 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 962051910b9f998030dacb8a0722588cc715813fde1Raph Levien 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Fill the entire canvas' bitmap (restricted to the current clip) with the 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified RGB color, using srcover porterduff mode. 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r red component (0..255) of the color to draw onto the canvas 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param g green component (0..255) of the color to draw onto the canvas 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b blue component (0..255) of the color to draw onto the canvas 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void drawRGB(int r, int g, int b) { 9728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger drawColor(Color.rgb(r, g, b)); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Fill the entire canvas' bitmap (restricted to the current clip) with the 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified ARGB color, using srcover porterduff mode. 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a alpha component (0..255) of the color to draw onto the canvas 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r red component (0..255) of the color to draw onto the canvas 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param g green component (0..255) of the color to draw onto the canvas 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b blue component (0..255) of the color to draw onto the canvas 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void drawARGB(int a, int r, int g, int b) { 9858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger drawColor(Color.argb(a, r, g, b)); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Fill the entire canvas' bitmap (restricted to the current clip) with the 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified color, using srcover porterduff mode. 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color the color to draw onto the canvas 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 99480756e38882720860db52f1fcc21fa1505a02abfTor Norbye public void drawColor(@ColorInt int color) { 9958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger native_drawColor(mNativeCanvasWrapper, color, PorterDuff.Mode.SRC_OVER.nativeInt); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Fill the entire canvas' bitmap (restricted to the current clip) with the 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified color and porter-duff xfermode. 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color the color to draw with 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode the porter-duff mode to apply to the color 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 100580756e38882720860db52f1fcc21fa1505a02abfTor Norbye public void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) { 10065c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawColor(mNativeCanvasWrapper, color, mode.nativeInt); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Fill the entire canvas' bitmap (restricted to the current clip) with 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specified paint. This is equivalent (but faster) to drawing an 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * infinitely large rectangle with the specified paint. 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw onto the canvas 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1016ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPaint(@NonNull Paint paint) { 1017dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawPaint(mNativeCanvasWrapper, paint.getNativeInstance()); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019051910b9f998030dacb8a0722588cc715813fde1Raph Levien 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw a series of points. Each point is centered at the coordinate 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified by pts[], and its diameter is specified by the paint's stroke 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * width (as transformed by the canvas' CTM), with special treatment for 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a stroke width of 0, which always draws exactly 1 pixel (or at most 4 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if antialiasing is enabled). The shape of the point is controlled by 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the paint's Cap type. The shape is a square, unless the cap type is 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Round, in which case the shape is a circle. 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pts Array of points to draw [x0 y0 x1 y1 x2 y2 ...] 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset Number of values to skip before starting to draw. 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count The number of values to process, after skipping offset 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of them. Since one point uses two values, the number of 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "points" that are drawn is really (count >> 1). 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the points 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1036b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye public void drawPoints(@Size(multiple=2) float[] pts, int offset, int count, 1037b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye @NonNull Paint paint) { 1038dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawPoints(mNativeCanvasWrapper, pts, offset, count, paint.getNativeInstance()); 103995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for drawPoints() that assumes you want to draw the entire array 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1044b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye public void drawPoints(@Size(multiple=2) @NonNull float[] pts, @NonNull Paint paint) { 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawPoints(pts, 0, pts.length, paint); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for drawPoints() for drawing a single point. 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1051ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPoint(float x, float y, @NonNull Paint paint) { 1052dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawPoint(mNativeCanvasWrapper, x, y, paint.getNativeInstance()); 105395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw a line segment with the specified start and stop x,y coordinates, 1057a5ef27da958acb84014b9f6ca4622c02be02fe22Chris Craik * using the specified paint. 1058a5ef27da958acb84014b9f6ca4622c02be02fe22Chris Craik * 1059a5ef27da958acb84014b9f6ca4622c02be02fe22Chris Craik * <p>Note that since a line is always "framed", the Style is ignored in the paint.</p> 1060a5ef27da958acb84014b9f6ca4622c02be02fe22Chris Craik * 1061a5ef27da958acb84014b9f6ca4622c02be02fe22Chris Craik * <p>Degenerate lines (length is 0) will not be drawn.</p> 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startX The x-coordinate of the start point of the line 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startY The y-coordinate of the start point of the line 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the line 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1067ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawLine(float startX, float startY, float stopX, float stopY, 1068ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 1069dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawLine(mNativeCanvasWrapper, startX, startY, stopX, stopY, paint.getNativeInstance()); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw a series of lines. Each line is taken from 4 consecutive values 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the pts array. Thus to draw 1 line, the array must contain at least 4 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. This is logically the same as drawing the array as follows: 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawLine(pts[0], pts[1], pts[2], pts[3]) followed by 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawLine(pts[4], pts[5], pts[6], pts[7]) and so on. 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pts Array of points to draw [x0 y0 x1 y1 x2 y2 ...] 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset Number of values in the array to skip before drawing. 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count The number of values in the array to process, after 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * skipping "offset" of them. Since each line uses 4 values, 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the number of "lines" that are drawn is really 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (count >> 2). 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the points 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 108792c11864c7b4901db90f88ec025d9a773454e7f6Chris Craik public void drawLines(@Size(multiple=4) @NonNull float[] pts, int offset, int count, 108892c11864c7b4901db90f88ec025d9a773454e7f6Chris Craik @NonNull Paint paint) { 1089dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawLines(mNativeCanvasWrapper, pts, offset, count, paint.getNativeInstance()); 109095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109292c11864c7b4901db90f88ec025d9a773454e7f6Chris Craik public void drawLines(@Size(multiple=4) @NonNull float[] pts, @NonNull Paint paint) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawLines(pts, 0, pts.length, paint); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified Rect using the specified paint. The rectangle will 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be filled or framed based on the Style in the paint. 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rect to be drawn 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the rect 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1103ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawRect(@NonNull RectF rect, @NonNull Paint paint) { 110495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita native_drawRect(mNativeCanvasWrapper, 1105dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger rect.left, rect.top, rect.right, rect.bottom, paint.getNativeInstance()); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified Rect using the specified Paint. The rectangle 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be filled or framed based on the Style in the paint. 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The rectangle to be drawn. 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the rectangle 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1115ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawRect(@NonNull Rect r, @NonNull Paint paint) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawRect(r.left, r.top, r.right, r.bottom, paint); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1118051910b9f998030dacb8a0722588cc715813fde1Raph Levien 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified Rect using the specified paint. The rectangle will 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be filled or framed based on the Style in the paint. 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle to be drawn 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top side of the rectangle to be drawn 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle to be drawn 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom side of the rectangle to be drawn 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the rect 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1130ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) { 1131dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawRect(mNativeCanvasWrapper, left, top, right, bottom, paint.getNativeInstance()); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified oval using the specified paint. The oval will be 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filled or framed based on the Style in the paint. 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The rectangle bounds of the oval to be drawn 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1140ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawOval(@NonNull RectF oval, @NonNull Paint paint) { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oval == null) { 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 114424609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese drawOval(oval.left, oval.top, oval.right, oval.bottom, paint); 114524609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese } 114624609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese 114724609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese /** 114824609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * Draw the specified oval using the specified paint. The oval will be 114924609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * filled or framed based on the Style in the paint. 115024609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese */ 115124609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint) { 1152dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawOval(mNativeCanvasWrapper, left, top, right, bottom, paint.getNativeInstance()); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified circle using the specified paint. If radius is <= 0, 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then nothing will be drawn. The circle will be filled or framed based 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the Style in the paint. 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cx The x-coordinate of the center of the cirle to be drawn 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cy The y-coordinate of the center of the cirle to be drawn 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param radius The radius of the cirle to be drawn 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the circle 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1165ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint) { 1166dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawCircle(mNativeCanvasWrapper, cx, cy, radius, paint.getNativeInstance()); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11704a317db43d2bbc992284dd1f651751f13734d017Romain Guy * <p>Draw the specified arc, which will be scaled to fit inside the 11714a317db43d2bbc992284dd1f651751f13734d017Romain Guy * specified oval.</p> 1172051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 11734a317db43d2bbc992284dd1f651751f13734d017Romain Guy * <p>If the start angle is negative or >= 360, the start angle is treated 11744a317db43d2bbc992284dd1f651751f13734d017Romain Guy * as start angle modulo 360.</p> 1175051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 11764a317db43d2bbc992284dd1f651751f13734d017Romain Guy * <p>If the sweep angle is >= 360, then the oval is drawn 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * completely. Note that this differs slightly from SkPath::arcTo, which 11784a317db43d2bbc992284dd1f651751f13734d017Romain Guy * treats the sweep angle modulo 360. If the sweep angle is negative, 11794a317db43d2bbc992284dd1f651751f13734d017Romain Guy * the sweep angle is treated as sweep angle modulo 360</p> 1180051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 11814a317db43d2bbc992284dd1f651751f13734d017Romain Guy * <p>The arc is drawn clockwise. An angle of 0 degrees correspond to the 11824a317db43d2bbc992284dd1f651751f13734d017Romain Guy * geometric angle of 0 degrees (3 o'clock on a watch.)</p> 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval used to define the shape and size 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the arc 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param useCenter If true, include the center of the oval in the arc, and 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close it if it is being stroked. This will draw a wedge 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the arc 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1192ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, 1193ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 119424609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese drawArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, useCenter, 119524609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese paint); 119624609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese } 119724609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese 119824609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese /** 119924609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * <p>Draw the specified arc, which will be scaled to fit inside the 120024609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * specified oval.</p> 120124609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * 120224609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * <p>If the start angle is negative or >= 360, the start angle is treated 120324609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * as start angle modulo 360.</p> 120424609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * 120524609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * <p>If the sweep angle is >= 360, then the oval is drawn 120624609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * completely. Note that this differs slightly from SkPath::arcTo, which 120724609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * treats the sweep angle modulo 360. If the sweep angle is negative, 120824609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * the sweep angle is treated as sweep angle modulo 360</p> 120924609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * 121024609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * <p>The arc is drawn clockwise. An angle of 0 degrees correspond to the 121124609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * geometric angle of 0 degrees (3 o'clock on a watch.)</p> 121224609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * 121324609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * @param startAngle Starting angle (in degrees) where the arc begins 121424609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * @param sweepAngle Sweep angle (in degrees) measured clockwise 121524609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * @param useCenter If true, include the center of the oval in the arc, and 121624609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese close it if it is being stroked. This will draw a wedge 121724609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese * @param paint The paint used to draw the arc 121824609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese */ 121924609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese public void drawArc(float left, float top, float right, float bottom, float startAngle, 122024609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese float sweepAngle, boolean useCenter, @NonNull Paint paint) { 122124609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese native_drawArc(mNativeCanvasWrapper, left, top, right, bottom, startAngle, sweepAngle, 1222dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger useCenter, paint.getNativeInstance()); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified round-rect using the specified paint. The roundrect 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be filled or framed based on the Style in the paint. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rectangular bounds of the roundRect to be drawn 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rx The x-radius of the oval used to round the corners 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ry The y-radius of the oval used to round the corners 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the roundRect 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1234ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint) { 12354d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik drawRoundRect(rect.left, rect.top, rect.right, rect.bottom, rx, ry, paint); 12364d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik } 12374d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik 12384d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik /** 12394d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik * Draw the specified round-rect using the specified paint. The roundrect 12404d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik * will be filled or framed based on the Style in the paint. 12414d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik * 12424d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik * @param rx The x-radius of the oval used to round the corners 12434d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik * @param ry The y-radius of the oval used to round the corners 12444d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik * @param paint The paint used to draw the roundRect 12454d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik */ 12464d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, 1247ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 1248dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger native_drawRoundRect(mNativeCanvasWrapper, left, top, right, bottom, rx, ry, paint.getNativeInstance()); 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified path using the specified paint. The path will be 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filled or framed based on the Style in the paint. 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path The path to be drawn 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the path 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1258ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPath(@NonNull Path path, @NonNull Paint paint) { 125994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger if (path.isSimplePath && path.rects != null) { 126094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger native_drawRegion(mNativeCanvasWrapper, path.rects.mNativeRegion, paint.getNativeInstance()); 126194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } else { 1262a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv native_drawPath(mNativeCanvasWrapper, path.readOnlyNI(), paint.getNativeInstance()); 126394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12651abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik 12661abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik /** 12671abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik * @hide 12681abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik */ 12693d8298e1a8b35dadb0a383aadb9a545ecab463e2sergeyv protected void throwIfCannotDraw(Bitmap bitmap) { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap.isRecycled()) { 1271f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy throw new RuntimeException("Canvas: trying to use a recycled bitmap " + bitmap); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12731abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik if (!bitmap.isPremultiplied() && bitmap.getConfig() == Bitmap.Config.ARGB_8888 && 12741abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik bitmap.hasAlpha()) { 12751abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik throw new RuntimeException("Canvas: trying to use a non-premultiplied bitmap " 12761abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik + bitmap); 12771abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1281deba785f122a47915756ffd991f5540d952cf937Romain Guy * Draws the specified bitmap as an N-patch (most often, a 9-patches.) 1282deba785f122a47915756ffd991f5540d952cf937Romain Guy * 12833b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * @param patch The ninepatch object to render 1284deba785f122a47915756ffd991f5540d952cf937Romain Guy * @param dst The destination rectangle. 1285deba785f122a47915756ffd991f5540d952cf937Romain Guy * @param paint The paint to draw the bitmap with. may be null 1286051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 1287deba785f122a47915756ffd991f5540d952cf937Romain Guy * @hide 1288deba785f122a47915756ffd991f5540d952cf937Romain Guy */ 1289ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPatch(@NonNull NinePatch patch, @NonNull Rect dst, @Nullable Paint paint) { 12904c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger Bitmap bitmap = patch.getBitmap(); 12914c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger throwIfCannotDraw(bitmap); 12924c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); 12934c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger native_drawNinePatch(mNativeCanvasWrapper, bitmap.getNativeInstance(), patch.mNativeChunk, 12944c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger dst.left, dst.top, dst.right, dst.bottom, nativePaint, 12954c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger mDensity, patch.getDensity()); 1296f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy } 1297f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy 1298f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy /** 1299f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * Draws the specified bitmap as an N-patch (most often, a 9-patches.) 1300f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * 1301f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * @param patch The ninepatch object to render 1302f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * @param dst The destination rectangle. 1303f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * @param paint The paint to draw the bitmap with. may be null 1304f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * 1305f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy * @hide 1306f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy */ 1307ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPatch(@NonNull NinePatch patch, @NonNull RectF dst, @Nullable Paint paint) { 13084c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger Bitmap bitmap = patch.getBitmap(); 13094c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger throwIfCannotDraw(bitmap); 13104c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); 13114c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger native_drawNinePatch(mNativeCanvasWrapper, bitmap.getNativeInstance(), patch.mNativeChunk, 13124c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger dst.left, dst.top, dst.right, dst.bottom, nativePaint, 13134c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger mDensity, patch.getDensity()); 1314f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy } 1315f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy 1316deba785f122a47915756ffd991f5540d952cf937Romain Guy /** 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified bitmap, with its top/left corner at (x,y), using 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specified paint, transformed by the current matrix. 1319051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 132011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>Note: if the paint contains a maskfilter that generates a mask which 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extends beyond the bitmap's original width/height (e.g. BlurMaskFilter), 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then the bitmap will be drawn as if it were in a Shader with CLAMP mode. 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Thus the color outside of the original width/height will be the edge 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * color replicated. 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 132611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>If the bitmap and canvas have different densities, this function 132711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * will take care of automatically scaling the bitmap to draw at the 132811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * same density as the canvas. 1329051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The bitmap to be drawn 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The position of the left side of the bitmap being drawn 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The position of the top side of the bitmap being drawn 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used to draw the bitmap (may be null) 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1335ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { 13361abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik throwIfCannotDraw(bitmap); 13377c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck native_drawBitmap(mNativeCanvasWrapper, bitmap, left, top, 1338dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity); 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified bitmap, scaling/translating automatically to fill 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the destination rectangle. If the source rectangle is not null, it 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifies the subset of the bitmap to draw. 1345051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 134611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>Note: if the paint contains a maskfilter that generates a mask which 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extends beyond the bitmap's original width/height (e.g. BlurMaskFilter), 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then the bitmap will be drawn as if it were in a Shader with CLAMP mode. 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Thus the color outside of the original width/height will be the edge 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * color replicated. 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 135211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>This function <em>ignores the density associated with the bitmap</em>. 135311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * This is because the source and destination rectangle coordinate 135411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * spaces are in their respective densities, so must already have the 135511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * appropriate scaling factor applied. 1356051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The bitmap to be drawn 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src May be null. The subset of the bitmap to be drawn 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst The rectangle that the bitmap will be scaled/translated 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to fit into 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint May be null. The paint used to draw the bitmap 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1363ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, 1364ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @Nullable Paint paint) { 13658872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (dst == null) { 13668872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throw new NullPointerException(); 13678872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 13688872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger throwIfCannotDraw(bitmap); 1369dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); 13708872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 13718872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger float left, top, right, bottom; 13728872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (src == null) { 13738872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger left = top = 0; 13748872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger right = bitmap.getWidth(); 13758872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger bottom = bitmap.getHeight(); 13768872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } else { 13778872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger left = src.left; 13788872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger right = src.right; 13798872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger top = src.top; 13808872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger bottom = src.bottom; 13818872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 13828872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 13837c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck native_drawBitmap(mNativeCanvasWrapper, bitmap, left, top, right, bottom, 13848872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, 13858872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger bitmap.mDensity); 13868872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified bitmap, scaling/translating automatically to fill 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the destination rectangle. If the source rectangle is not null, it 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifies the subset of the bitmap to draw. 1392051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 139311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>Note: if the paint contains a maskfilter that generates a mask which 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extends beyond the bitmap's original width/height (e.g. BlurMaskFilter), 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then the bitmap will be drawn as if it were in a Shader with CLAMP mode. 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Thus the color outside of the original width/height will be the edge 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * color replicated. 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 139911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>This function <em>ignores the density associated with the bitmap</em>. 140011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * This is because the source and destination rectangle coordinate 140111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * spaces are in their respective densities, so must already have the 140211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * appropriate scaling factor applied. 1403051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The bitmap to be drawn 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src May be null. The subset of the bitmap to be drawn 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst The rectangle that the bitmap will be scaled/translated 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to fit into 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint May be null. The paint used to draw the bitmap 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1410ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst, 1411ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @Nullable Paint paint) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst == null) { 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(); 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14151abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik throwIfCannotDraw(bitmap); 1416dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); 14178872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 14188872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger int left, top, right, bottom; 14198872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger if (src == null) { 14208872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger left = top = 0; 14218872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger right = bitmap.getWidth(); 14228872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger bottom = bitmap.getHeight(); 14238872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } else { 14248872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger left = src.left; 14258872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger right = src.right; 14268872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger top = src.top; 14278872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger bottom = src.bottom; 14288872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger } 14298872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger 14307c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck native_drawBitmap(mNativeCanvasWrapper, bitmap, left, top, right, bottom, 14318872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger dst.left, dst.top, dst.right, dst.bottom, nativePaint, mScreenDensity, 14328872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger bitmap.mDensity); 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1434051910b9f998030dacb8a0722588cc715813fde1Raph Levien 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Treat the specified array of colors as a bitmap, and draw it. This gives 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same result as first creating a bitmap from the array, and then 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing it, but this method avoids explicitly creating a bitmap object 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be more efficient if the colors are changing often. 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colors Array of colors representing the pixels of the bitmap 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset Offset into the array of colors for the first pixel 144383d522290e56f614d0d9373d47c2b54b9e207795Brad Fitzpatrick * @param stride The number of colors in the array between rows (must be 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * >= width or <= -width). 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The X coordinate for where to draw the bitmap 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The Y coordinate for where to draw the bitmap 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width The width of the bitmap 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height The height of the bitmap 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hasAlpha True if the alpha channel of the colors contains valid 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. If false, the alpha byte is ignored (assumed to 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be 0xFF for every pixel). 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint May be null. The paint used to draw the bitmap 1453cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * 1454cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * @deprecated Usage with a {@link #isHardwareAccelerated() hardware accelerated} canvas 1455cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * requires an internal copy of color buffer contents every time this method is called. Using a 1456cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * Bitmap avoids this copy, and allows the application to more explicitly control the lifetime 1457cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * and copies of pixel data. 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik @Deprecated 1460ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmap(@NonNull int[] colors, int offset, int stride, float x, float y, 1461ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese int width, int height, boolean hasAlpha, @Nullable Paint paint) { 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check for valid input 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width < 0) { 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("width must be >= 0"); 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (height < 0) { 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("height must be >= 0"); 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Math.abs(stride) < width) { 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("abs(stride) must be >= width"); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lastScanline = offset + (height - 1) * stride; 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = colors.length; 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offset < 0 || (offset + width > length) || lastScanline < 0 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (lastScanline + width > length)) { 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // quick escape if there's nothing to draw 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width == 0 || height == 0) { 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // punch down to native for the actual draw 14835c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawBitmap(mNativeCanvasWrapper, colors, offset, stride, x, y, width, height, hasAlpha, 1484dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint != null ? paint.getNativeInstance() : 0); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1486cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik 1487cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik /** 1488cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * Legacy version of drawBitmap(int[] colors, ...) that took ints for x,y 1489cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * 1490cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * @deprecated Usage with a {@link #isHardwareAccelerated() hardware accelerated} canvas 1491cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * requires an internal copy of color buffer contents every time this method is called. Using a 1492cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * Bitmap avoids this copy, and allows the application to more explicitly control the lifetime 1493cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik * and copies of pixel data. 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1495cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik @Deprecated 1496ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmap(@NonNull int[] colors, int offset, int stride, int x, int y, 1497ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese int width, int height, boolean hasAlpha, @Nullable Paint paint) { 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // call through to the common float version 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawBitmap(colors, offset, stride, (float)x, (float)y, width, height, 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasAlpha, paint); 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1502cd23df6a08cf7a9bdee11e703f40bca5904d779dChris Craik 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the bitmap using the specified matrix. 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The bitmap to draw 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix used to transform the bitmap when it is drawn 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint May be null. The paint used to draw the bitmap 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1510ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) { 15117c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck nativeDrawBitmapMatrix(mNativeCanvasWrapper, bitmap, matrix.ni(), 1512dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint != null ? paint.getNativeInstance() : 0); 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 15155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy /** 15165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy * @hide 15175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy */ 15185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy protected static void checkRange(int length, int offset, int count) { 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((offset | count) < 0 || offset + count > length) { 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1523051910b9f998030dacb8a0722588cc715813fde1Raph Levien 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the bitmap through the mesh, where mesh vertices are evenly 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed across the bitmap. There are meshWidth+1 vertices across, and 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * meshHeight+1 vertices down. The verts array is accessed in row-major 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * order, so that the first meshWidth+1 vertices are distributed across the 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * top of the bitmap from left to right. A more general version of this 15305d11676414b3606792e23c269cf75b44faa1a2afChris Craik * method is drawVertices(). 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The bitmap to draw using the mesh 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param meshWidth The number of columns in the mesh. Nothing is drawn if 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is 0 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param meshHeight The number of rows in the mesh. Nothing is drawn if 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is 0 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param verts Array of x,y pairs, specifying where the mesh should be 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawn. There must be at least 15395d11676414b3606792e23c269cf75b44faa1a2afChris Craik * (meshWidth+1) * (meshHeight+1) * 2 + vertOffset values 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the array 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vertOffset Number of verts elements to skip before drawing 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colors May be null. Specifies a color at each vertex, which is 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interpolated across the cell, and whose values are 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiplied by the corresponding bitmap colors. If not null, 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there must be at least (meshWidth+1) * (meshHeight+1) + 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * colorOffset values in the array. 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorOffset Number of color elements to skip before drawing 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint May be null. The paint used to draw the bitmap 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1550ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawBitmapMesh(@NonNull Bitmap bitmap, int meshWidth, int meshHeight, 1551ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull float[] verts, int vertOffset, @Nullable int[] colors, int colorOffset, 1552ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @Nullable Paint paint) { 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((meshWidth | meshHeight | vertOffset | colorOffset) < 0) { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (meshWidth == 0 || meshHeight == 0) { 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (meshWidth + 1) * (meshHeight + 1); 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we mul by 2 since we need two floats per vertex 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkRange(verts.length, vertOffset, count * 2); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (colors != null) { 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no mul by 2, since we need only 1 color per vertex 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkRange(colors.length, colorOffset, count); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15667c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck nativeDrawBitmapMesh(mNativeCanvasWrapper, bitmap, meshWidth, meshHeight, 1567f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy verts, vertOffset, colors, colorOffset, 1568dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint != null ? paint.getNativeInstance() : 0); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1570f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum VertexMode { 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRIANGLES(0), 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRIANGLE_STRIP(1), 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRIANGLE_FAN(2); 1575051910b9f998030dacb8a0722588cc715813fde1Raph Levien 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VertexMode(int nativeInt) { 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy 1580a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy /** 1581a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy * @hide 1582a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy */ 1583a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy public final int nativeInt; 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1585051910b9f998030dacb8a0722588cc715813fde1Raph Levien 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the array of vertices, interpreted as triangles (based on mode). The 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * verts array is required, and specifies the x,y pairs for each vertex. If 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * texs is non-null, then it is used to specify the coordinate in shader 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * coordinates to use at each vertex (the paint must have a shader in this 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * case). If there is no texs array, but there is a color array, then each 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * color is interpolated across its corresponding triangle in a gradient. If 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * both texs and colors arrays are present, then they behave as before, but 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the resulting color at each pixels is the result of multiplying the 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * colors from the shader and the color-gradient together. The indices array 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is optional, but if it is present, then it is used to specify the index 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of each triangle, rather than just walking through the arrays in order. 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode How to interpret the array of vertices 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vertexCount The number of values in the vertices array (and 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corresponding texs and colors arrays if non-null). Each logical 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vertex is two values (x, y), vertexCount must be a multiple of 2. 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param verts Array of vertices for the mesh 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vertOffset Number of values in the verts to skip before drawing. 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param texs May be null. If not null, specifies the coordinates to sample 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into the current shader (e.g. bitmap tile or gradient) 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param texOffset Number of values in texs to skip before drawing. 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colors May be null. If not null, specifies a color for each 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vertex, to be interpolated across the triangle. 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorOffset Number of values in colors to skip before drawing. 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indices If not null, array of indices to reference into the 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vertex (texs, colors) array. 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indexCount number of entries in the indices array (if not null). 1614051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param paint Specifies the shader to use if the texs array is non-null. 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1616ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawVertices(@NonNull VertexMode mode, int vertexCount, @NonNull float[] verts, 1617ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese int vertOffset, @Nullable float[] texs, int texOffset, @Nullable int[] colors, 1618ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese int colorOffset, @Nullable short[] indices, int indexOffset, int indexCount, 1619ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkRange(verts.length, vertOffset, vertexCount); 16218dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (isHardwareAccelerated()) { 16228dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return; 16238dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (texs != null) { 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkRange(texs.length, texOffset, vertexCount); 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (colors != null) { 162892ce5734b52ef014c80cc6335112a027188b3eb6Erik Faye-Lund checkRange(colors.length, colorOffset, vertexCount / 2); 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indices != null) { 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkRange(indices.length, indexOffset, indexCount); 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16335c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita nativeDrawVertices(mNativeCanvasWrapper, mode.nativeInt, vertexCount, verts, 1634f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy vertOffset, texs, texOffset, colors, colorOffset, 1635dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger indices, indexOffset, indexCount, paint.getNativeInstance()); 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 163736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text, with origin at (x,y), using the specified paint. The 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * origin is interpreted based on the Align setting in the paint. 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the origin of the text being drawn 16445dc973cb03889c58988703b58aefbd2397fb02c3Alan Viverette * @param y The y-coordinate of the baseline of the text being drawn 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1647ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawText(@NonNull char[] text, int index, int count, float x, float y, 1648ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index | count | (index + count) | 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (text.length - index - count)) < 0) { 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16535c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawText(mNativeCanvasWrapper, text, index, count, x, y, paint.mBidiFlags, 1654dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.getNativeInstance(), paint.mNativeTypeface); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text, with origin at (x,y), using the specified paint. The 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * origin is interpreted based on the Align setting in the paint. 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the origin of the text being drawn 16635dc973cb03889c58988703b58aefbd2397fb02c3Alan Viverette * @param y The y-coordinate of the baseline of the text being drawn 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1666ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) { 16675c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawText(mNativeCanvasWrapper, text, 0, text.length(), x, y, paint.mBidiFlags, 1668dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.getNativeInstance(), paint.mNativeTypeface); 1669f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text, with origin at (x,y), using the specified paint. 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The origin is interpreted based on the Align setting in the paint. 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The index of the first character in text to draw 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end (end - 1) is the index of the last character in text to draw 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the origin of the text being drawn 16795dc973cb03889c58988703b58aefbd2397fb02c3Alan Viverette * @param y The y-coordinate of the baseline of the text being drawn 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1682ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawText(@NonNull String text, int start, int end, float x, float y, 1683ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((start | end | (end - start) | (text.length() - end)) < 0) { 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16875c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawText(mNativeCanvasWrapper, text, start, end, x, y, paint.mBidiFlags, 1688dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.getNativeInstance(), paint.mNativeTypeface); 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the specified range of text, specified by start/end, with its 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * origin at (x,y), in the specified Paint. The origin is interpreted 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * based on the Align setting in the Paint. 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The index of the first character in text to draw 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end (end - 1) is the index of the last character in text 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to draw 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of origin for where to draw the text 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of origin for where to draw the text 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1704ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawText(@NonNull CharSequence text, int start, int end, float x, float y, 1705ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 1706d82f8a9a3869448e6d7d4b3fc962e34e33a1ba0eRaph Levien if ((start | end | (end - start) | (text.length() - end)) < 0) { 1707d82f8a9a3869448e6d7d4b3fc962e34e33a1ba0eRaph Levien throw new IndexOutOfBoundsException(); 1708d82f8a9a3869448e6d7d4b3fc962e34e33a1ba0eRaph Levien } 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof String || text instanceof SpannedString || 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text instanceof SpannableString) { 17115c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawText(mNativeCanvasWrapper, text.toString(), start, end, x, y, 1712dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.mBidiFlags, paint.getNativeInstance(), paint.mNativeTypeface); 1713f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } else if (text instanceof GraphicsOperations) { 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((GraphicsOperations) text).drawText(this, start, end, x, y, 1715f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy paint); 1716f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } else { 1717f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt char[] buf = TemporaryBuffer.obtain(end - start); 1718f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt TextUtils.getChars(text, start, end, buf, 0); 17195c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawText(mNativeCanvasWrapper, buf, 0, end - start, x, y, 1720dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.mBidiFlags, paint.getNativeInstance(), paint.mNativeTypeface); 1721f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt TemporaryBuffer.recycle(buf); 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1723f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1724f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 1725f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt /** 1726c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * Draw a run of text, all in a single direction, with optional context for complex text 1727c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * shaping. 1728c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * 1729c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>See {@link #drawTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint)} 1730c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * for more details. This method uses a character array rather than CharSequence to 1731c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * represent the string. Also, to be consistent with the pattern established in 1732c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * {@link #drawText}, in this method {@code count} and {@code contextCount} are used rather 1733c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * than offsets of the end position; {@code count = end - start, contextCount = contextEnd - 1734c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * contextStart}. 1735051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 1736f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param text the text to render 17370c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param index the start of the text to render 17380c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param count the count of chars to render 17390c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextIndex the start of the context for shaping. Must be 17400c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * no greater than index. 17410c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextCount the number of characters in the context for shaping. 1742f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi * contexIndex + contextCount must be no less than index + count. 1743f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param x the x position at which to draw the text 1744f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param y the y position at which to draw the text 1745051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param isRtl whether the run is in RTL direction 1746f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param paint the paint 1747f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt */ 1748ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawTextRun(@NonNull char[] text, int index, int count, int contextIndex, 1749051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextCount, float x, float y, boolean isRtl, @NonNull Paint paint) { 1750f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 1751f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt if (text == null) { 1752f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt throw new NullPointerException("text is null"); 1753f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1754f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt if (paint == null) { 1755f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt throw new NullPointerException("paint is null"); 1756f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1757f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi if ((index | count | contextIndex | contextCount | index - contextIndex 1758f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi | (contextIndex + contextCount) - (index + count) 1759f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi | text.length - (contextIndex + contextCount)) < 0) { 1760f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt throw new IndexOutOfBoundsException(); 1761f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1762f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 1763f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi native_drawTextRun(mNativeCanvasWrapper, text, index, count, contextIndex, contextCount, 1764f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface); 1765f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1766f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 1767f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt /** 1768c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * Draw a run of text, all in a single direction, with optional context for complex text 1769c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * shaping. 1770c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * 1771c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>The run of text includes the characters from {@code start} to {@code end} in the text. In 1772c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * addition, the range {@code contextStart} to {@code contextEnd} is used as context for the 1773c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * purpose of complex text shaping, such as Arabic text potentially shaped differently based on 1774c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * the text next to it. 1775c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * 1776c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>All text outside the range {@code contextStart..contextEnd} is ignored. The text between 1777c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * {@code start} and {@code end} will be laid out and drawn. 1778c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * 1779c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>The direction of the run is explicitly specified by {@code isRtl}. Thus, this method is 1780c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * suitable only for runs of a single direction. Alignment of the text is as determined by the 1781c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * Paint's TextAlign value. Further, {@code 0 <= contextStart <= start <= end <= contextEnd 1782c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <= text.length} must hold on entry. 1783c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * 1784c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>Also see {@link android.graphics.Paint#getRunAdvance} for a corresponding method to 1785c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * measure the text; the advance width of the text drawn matches the value obtained from that 1786c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * method. 17870c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 1788f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param text the text to render 1789f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param start the start of the text to render. Data before this position 1790f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * can be used for shaping context. 1791f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param end the end of the text to render. Data at or after this 1792f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * position can be used for shaping context. 1793c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * @param contextStart the index of the start of the shaping context 1794c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * @param contextEnd the index of the end of the shaping context 1795f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param x the x position at which to draw the text 1796f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param y the y position at which to draw the text 1797051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param isRtl whether the run is in RTL direction 1798f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * @param paint the paint 1799c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * 1800c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * @see #drawTextRun(char[], int, int, int, int, float, float, boolean, Paint) 1801f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt */ 1802ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawTextRun(@NonNull CharSequence text, int start, int end, int contextStart, 1803051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextEnd, float x, float y, boolean isRtl, @NonNull Paint paint) { 1804f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 1805f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt if (text == null) { 1806f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt throw new NullPointerException("text is null"); 1807f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1808f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt if (paint == null) { 1809f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt throw new NullPointerException("paint is null"); 1810f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1811f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi if ((start | end | contextStart | contextEnd | start - contextStart | end - start 1812f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi | contextEnd - end | text.length() - contextEnd) < 0) { 1813f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt throw new IndexOutOfBoundsException(); 1814f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } 1815f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 1816f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt if (text instanceof String || text instanceof SpannedString || 1817f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt text instanceof SpannableString) { 1818f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi native_drawTextRun(mNativeCanvasWrapper, text.toString(), start, end, contextStart, 1819f2122ef549dd73f68bdbe4d6767f6516935024d0Keisuke Kuroyanagi contextEnd, x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface); 1820f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } else if (text instanceof GraphicsOperations) { 18210c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt ((GraphicsOperations) text).drawTextRun(this, start, end, 1822051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextEnd, x, y, isRtl, paint); 1823f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt } else { 18240c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int contextLen = contextEnd - contextStart; 18250c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int len = end - start; 18260c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt char[] buf = TemporaryBuffer.obtain(contextLen); 18270c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt TextUtils.getChars(text, contextStart, contextEnd, buf, 0); 18285c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawTextRun(mNativeCanvasWrapper, buf, start - contextStart, len, 1829dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger 0, contextLen, x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface); 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TemporaryBuffer.recycle(buf); 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text in the array, with each character's origin specified by 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the pos array. 1837051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index of the first character to draw 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count The number of characters to draw, starting from index. 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Array of [x,y] positions, used to position each 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * character 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 1844eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * 1845eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * @deprecated This method does not support glyph composition and decomposition and 1846eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * should therefore not be used to render complex scripts. It also doesn't 1847eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * handle supplementary characters (eg emoji). 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy @Deprecated 1850b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye public void drawPosText(@NonNull char[] text, int index, int count, 1851b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye @NonNull @Size(multiple=2) float[] pos, 1852ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese @NonNull Paint paint) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0 || index + count > text.length || count*2 > pos.length) { 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18563f0d6167227d6d2cdd85f7718d92db859b443e92Raph Levien for (int i = 0; i < count; i++) { 18573f0d6167227d6d2cdd85f7718d92db859b443e92Raph Levien drawText(text, index + i, 1, pos[i * 2], pos[i * 2 + 1], paint); 18583f0d6167227d6d2cdd85f7718d92db859b443e92Raph Levien } 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text in the array, with each character's origin specified by 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the pos array. 1864051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos Array of [x,y] positions, used to position each character 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 1868eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * 1869eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * @deprecated This method does not support glyph composition and decomposition and 1870eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * should therefore not be used to render complex scripts. It also doesn't 1871eda57925cafdf1dab451e70052dea27846f368b4Chris Craik * handle supplementary characters (eg emoji). 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1873f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy @Deprecated 1874b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye public void drawPosText(@NonNull String text, @NonNull @Size(multiple=2) float[] pos, 1875b3ec733bb830f2d4425825d93f9ed95f284e9145Tor Norbye @NonNull Paint paint) { 18763f0d6167227d6d2cdd85f7718d92db859b443e92Raph Levien drawPosText(text.toCharArray(), 0, text.length(), pos, paint); 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text, with origin at (x,y), using the specified paint, along 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specified path. The paint's Align setting determins where along the 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path to start the text. 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path The path the text should follow for its baseline 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hOffset The distance along the path to add to the text's 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * starting position 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vOffset The distance above(-) or below(+) the path to position 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the text 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1892ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawTextOnPath(@NonNull char[] text, int index, int count, @NonNull Path path, 1893ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese float hOffset, float vOffset, @NonNull Paint paint) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0 || index + count > text.length) { 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18975c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita native_drawTextOnPath(mNativeCanvasWrapper, text, index, count, 1898a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv path.readOnlyNI(), hOffset, vOffset, 1899dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.mBidiFlags, paint.getNativeInstance(), paint.mNativeTypeface); 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the text, with origin at (x,y), using the specified paint, along 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specified path. The paint's Align setting determins where along the 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path to start the text. 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to be drawn 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param path The path the text should follow for its baseline 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hOffset The distance along the path to add to the text's 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * starting position 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param vOffset The distance above(-) or below(+) the path to position 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the text 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint The paint used for the text (e.g. color, size, style) 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1915ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset, 1916ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese float vOffset, @NonNull Paint paint) { 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text.length() > 0) { 1918a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv native_drawTextOnPath(mNativeCanvasWrapper, text, path.readOnlyNI(), hOffset, vOffset, 1919dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger paint.mBidiFlags, paint.getNativeInstance(), paint.mNativeTypeface); 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Save the canvas state, draw the picture, and restore the canvas state. 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This differs from picture.draw(canvas), which does not perform any 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * save/restore. 1927cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * 1928cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * <p> 1929cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * <strong>Note:</strong> This forces the picture to internally call 1930cdac497289fd2c39a352f6167dae3f77cc608cb8Derek Sollenberger * {@link Picture#endRecording} in order to prepare for playback. 1931051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param picture The picture to be drawn 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1934ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPicture(@NonNull Picture picture) { 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project picture.endRecording(); 1936667fe1039feae068d3333de8fb7115313f4a517bJonathan Dixon int restoreCount = save(); 1937667fe1039feae068d3333de8fb7115313f4a517bJonathan Dixon picture.draw(this); 1938667fe1039feae068d3333de8fb7115313f4a517bJonathan Dixon restoreToCount(restoreCount); 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1940051910b9f998030dacb8a0722588cc715813fde1Raph Levien 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the picture, stretched to fit into the dst rectangle. 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1944ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPicture(@NonNull Picture picture, @NonNull RectF dst) { 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project save(); 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(dst.left, dst.top); 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (picture.getWidth() > 0 && picture.getHeight() > 0) { 1948f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy scale(dst.width() / picture.getWidth(), dst.height() / picture.getHeight()); 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawPicture(picture); 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restore(); 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1953051910b9f998030dacb8a0722588cc715813fde1Raph Levien 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw the picture, stretched to fit into the dst rectangle. 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1957ff7215aa0cb28a4815126b056f34b2bd29e5c651Antonio Calabrese public void drawPicture(@NonNull Picture picture, @NonNull Rect dst) { 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project save(); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(dst.left, dst.top); 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (picture.getWidth() > 0 && picture.getHeight() > 0) { 1961f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy scale((float) dst.width() / picture.getWidth(), 1962f9d9c065ed75f1196316a9a31f92309f602cef76Romain Guy (float) dst.height() / picture.getHeight()); 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawPicture(picture); 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restore(); 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1967da8532c6f48b4c10b5e2ccb9e08690341efa1616Romain Guy 1968da8532c6f48b4c10b5e2ccb9e08690341efa1616Romain Guy /** 1969ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * Releases the resources associated with this canvas. 1970ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * 1971ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov * @hide 1972ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov */ 1973ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov public void release() { 1974775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler mNativeCanvasWrapper = 0; 1975775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler if (mFinalizer != null) { 1976775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler mFinalizer.run(); 1977775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler mFinalizer = null; 1978775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler } 1979ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov } 1980ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov 1981ff4adde5737be08d3e2d03fbe588c591d27d4a74Svetoslav Ganov /** 1982163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * Free up as much memory as possible from private caches (e.g. fonts, images) 1983caf0df1b7f99736aed1a0b923ef278fc4fd0fccaMike Reed * 1984163935113919a184122b8b3bd672ef08c8df65dcRomain Guy * @hide 1985caf0df1b7f99736aed1a0b923ef278fc4fd0fccaMike Reed */ 1986caf0df1b7f99736aed1a0b923ef278fc4fd0fccaMike Reed public static native void freeCaches(); 1987caf0df1b7f99736aed1a0b923ef278fc4fd0fccaMike Reed 198830ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio /** 198930ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio * Free up text layout caches 199030ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio * 199130ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio * @hide 199230ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio */ 199330ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio public static native void freeTextLayoutCaches(); 199430ca5cd11a23f06f2f8eeaa587685450826f800fFabrice Di Meglio 1995c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck private static native long initRaster(Bitmap bitmap); 19965c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita private static native void native_setBitmap(long canvasHandle, 1997c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck Bitmap bitmap); 199895d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native boolean native_isOpaque(long canvasHandle); 19996578a989566e585eee053095dc80e2552e125db2Derek Sollenberger private static native void native_setHighContrastText(long renderer, boolean highContrastText); 200095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native int native_getWidth(long canvasHandle); 200195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native int native_getHeight(long canvasHandle); 200295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita 200395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native int native_save(long canvasHandle, int saveFlags); 200436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native int native_saveLayer(long nativeCanvas, float l, 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float t, float r, float b, 200636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint, 200736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat int layerFlags); 200836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native int native_saveLayerAlpha(long nativeCanvas, float l, 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float t, float r, float b, 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha, int layerFlags); 20113891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik private static native void native_restore(long canvasHandle, boolean tolerateUnderflow); 201295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_restoreToCount(long canvasHandle, 20133891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik int saveCount, 20143891f3ad598561d5a82c07795e1fee7f1d3612d1Chris Craik boolean tolerateUnderflow); 201595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native int native_getSaveCount(long canvasHandle); 201695d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita 201795d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_translate(long canvasHandle, 201895d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita float dx, float dy); 201995d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_scale(long canvasHandle, 202095d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita float sx, float sy); 202195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_rotate(long canvasHandle, float degrees); 202295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_skew(long canvasHandle, 202395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita float sx, float sy); 202436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_concat(long nativeCanvas, 202536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeMatrix); 202636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_setMatrix(long nativeCanvas, 202736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeMatrix); 202836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_clipRect(long nativeCanvas, 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float left, float top, 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float right, float bottom, 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int regionOp); 203236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_clipPath(long nativeCanvas, 203336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePath, 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int regionOp); 203536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_clipRegion(long nativeCanvas, 203636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeRegion, 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int regionOp); 203836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetDrawFilter(long nativeCanvas, 203936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeFilter); 204036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_getClipBounds(long nativeCanvas, 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect bounds); 204236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_getCTM(long nativeCanvas, 204336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeMatrix); 204436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_quickReject(long nativeCanvas, 204536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePath); 204636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_quickReject(long nativeCanvas, 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float left, float top, 2048ca79cf69d09efa0c327e9b1237d86a119aea5da7Derek Sollenberger float right, float bottom); 204936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawColor(long nativeCanvas, int color, 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mode); 205136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawPaint(long nativeCanvas, 205236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 205395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_drawPoint(long canvasHandle, float x, float y, 205495d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita long paintHandle); 205595d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_drawPoints(long canvasHandle, float[] pts, 205695d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita int offset, int count, 205795d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita long paintHandle); 205836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawLine(long nativeCanvas, float startX, 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float startY, float stopX, 206036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float stopY, long nativePaint); 206195d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita private static native void native_drawLines(long canvasHandle, float[] pts, 206295d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita int offset, int count, 206395d49149cc7fff87a18449fa661454c1b5ddbd30Florin Malita long paintHandle); 206436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawRect(long nativeCanvas, float left, 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float top, float right, 206636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float bottom, 206736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 206824609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese private static native void native_drawOval(long nativeCanvas, float left, float top, 206924609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese float right, float bottom, long nativePaint); 207036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawCircle(long nativeCanvas, float cx, 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float cy, float radius, 207236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 207324609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese private static native void native_drawArc(long nativeCanvas, float left, float top, 207424609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese float right, float bottom, 207524609581330bc350f797179e3c1a59789c645ec2Antonio Calabrese float startAngle, float sweep, boolean useCenter, 207636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 207736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawRoundRect(long nativeCanvas, 20784d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik float left, float top, float right, float bottom, 20794d1c1538e2422d0a5b19ad1cd2fb353ed6279a88Chris Craik float rx, float ry, long nativePaint); 208036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawPath(long nativeCanvas, 208136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePath, 208236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 208394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger private static native void native_drawRegion(long nativeCanvas, 208494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger long nativeRegion, long nativePaint); 20854c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger private native void native_drawNinePatch(long nativeCanvas, long nativeBitmap, 20864c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger long ninePatch, float dstLeft, float dstTop, float dstRight, float dstBottom, 20874c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger long nativePaintOrZero, int screenDensity, int bitmapDensity); 20887c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck private native void native_drawBitmap(long nativeCanvas, Bitmap bitmap, 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float left, float top, 209036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaintOrZero, 20910d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn int canvasDensity, 20920d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn int screenDensity, 20930d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn int bitmapDensity); 20947c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck private native void native_drawBitmap(long nativeCanvas, Bitmap bitmap, 20958872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger float srcLeft, float srcTop, float srcRight, float srcBottom, 20968872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger float dstLeft, float dstTop, float dstRight, float dstBottom, 20978872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger long nativePaintOrZero, int screenDensity, int bitmapDensity); 209836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawBitmap(long nativeCanvas, int[] colors, 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offset, int stride, float x, 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float y, int width, int height, 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasAlpha, 210236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaintOrZero); 210336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeDrawBitmapMatrix(long nativeCanvas, 21047c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck Bitmap bitmap, 210536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeMatrix, 210636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 210736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeDrawBitmapMesh(long nativeCanvas, 21087c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck Bitmap bitmap, 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int meshWidth, int meshHeight, 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] verts, int vertOffset, 211136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat int[] colors, int colorOffset, 211236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativePaint); 211336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeDrawVertices(long nativeCanvas, int mode, int n, 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] verts, int vertOffset, float[] texs, int texOffset, 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] colors, int colorOffset, short[] indices, 211636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat int indexOffset, int indexCount, long nativePaint); 211736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 211836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawText(long nativeCanvas, char[] text, 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index, int count, float x, 212036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float y, int flags, long nativePaint, 212136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeTypeface); 212236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawText(long nativeCanvas, String text, 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int start, int end, float x, 212436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float y, int flags, long nativePaint, 212536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long nativeTypeface); 2126fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio 212736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawTextRun(long nativeCanvas, String text, 21280c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int start, int end, int contextStart, int contextEnd, 2129051910b9f998030dacb8a0722588cc715813fde1Raph Levien float x, float y, boolean isRtl, long nativePaint, long nativeTypeface); 2130f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 213136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawTextRun(long nativeCanvas, char[] text, 21320c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int start, int count, int contextStart, int contextCount, 2133051910b9f998030dacb8a0722588cc715813fde1Raph Levien float x, float y, boolean isRtl, long nativePaint, long nativeTypeface); 2134f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 213536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawTextOnPath(long nativeCanvas, 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] text, int index, 213736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat int count, long nativePath, 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float hOffset, 2139da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio float vOffset, int bidiFlags, 21409d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien long nativePaint, long nativeTypeface); 214136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_drawTextOnPath(long nativeCanvas, 214236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat String text, long nativePath, 214336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float hOffset, 214436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat float vOffset, 21459d2b5e1930bfc4b1da1c865843c247c708ea1565Raph Levien int flags, long nativePaint, long nativeTypeface); 2146775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler private static native long getNativeFinalizer(); 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2148