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