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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableString;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannedString;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.GraphicsOperations;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Paint class holds the style and color information about how to draw
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * geometries, text and bitmaps.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Paint {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int     mNativePaint;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ColorFilter mColorFilter;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MaskFilter  mMaskFilter;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PathEffect  mPathEffect;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Rasterizer  mRasterizer;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Shader      mShader;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Typeface    mTypeface;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Xfermode    mXfermode;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    private boolean     mHasCompatScaling;
40afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    private float       mCompatScaling;
41afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    private float       mInvCompatScaling;
42afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Style[] sStyleArray = {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Style.FILL, Style.STROKE, Style.FILL_AND_STROKE
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Cap[] sCapArray = {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cap.BUTT, Cap.ROUND, Cap.SQUARE
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Join[] sJoinArray = {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Join.MITER, Join.ROUND, Join.BEVEL
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Align[] sAlignArray = {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Align.LEFT, Align.CENTER, Align.RIGHT
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling antialiasing */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ANTI_ALIAS_FLAG     = 0x01;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling bitmap filtering */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FILTER_BITMAP_FLAG  = 0x02;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling dithering */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DITHER_FLAG         = 0x04;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling underline text */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int UNDERLINE_TEXT_FLAG = 0x08;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling strike-thru text */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STRIKE_THRU_TEXT_FLAG = 0x10;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling fake-bold text */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FAKE_BOLD_TEXT_FLAG = 0x20;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling linear-text (no caching) */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int LINEAR_TEXT_FLAG    = 0x40;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling subpixel-text */
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SUBPIXEL_TEXT_FLAG  = 0x80;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** bit mask for the flag enabling device kerning for text */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEV_KERN_TEXT_FLAG  = 0x100;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // we use this when we first create a paint
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DEFAULT_PAINT_FLAGS = DEV_KERN_TEXT_FLAG;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Style specifies if the primitive being drawn is filled,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stroked, or both (in the same color). The default is FILL.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum Style {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Geometry and text drawn with this style will be filled, ignoring all
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * stroke-related settings in the paint.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FILL            (0),
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Geometry and text drawn with this style will be stroked, respecting
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the stroke-related fields on the paint.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        STROKE          (1),
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Geometry and text drawn with this style will be both filled and
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * stroked at the same time, respecting the stroke-related fields on
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the paint.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FILL_AND_STROKE (2);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Style(int nativeInt) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.nativeInt = nativeInt;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int nativeInt;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Cap specifies the treatment for the beginning and ending of
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stroked lines and paths. The default is BUTT.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum Cap {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The stroke ends with the path, and does not project beyond it.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BUTT    (0),
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
116c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * The stroke projects out as a semicircle, with the center at the
117c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * end of the path.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ROUND   (1),
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
121c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * The stroke projects out as a square, with the center at the end
122c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project         * of the path.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQUARE  (2);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Cap(int nativeInt) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.nativeInt = nativeInt;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int nativeInt;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Join specifies the treatment where lines and curve segments
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * join on a stroked path. The default is MITER.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum Join {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The outer edges of a join meet at a sharp angle
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MITER   (0),
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The outer edges of a join meet in a circular arc.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ROUND   (1),
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The outer edges of a join meet with a straight line
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BEVEL   (2);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Join(int nativeInt) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.nativeInt = nativeInt;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int nativeInt;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Align specifies how drawText aligns its text relative to the
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * [x,y] coordinates. The default is LEFT.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum Align {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The text is drawn to the right of the x,y origin
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LEFT    (0),
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The text is drawn centered horizontally on the x,y origin
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CENTER  (1),
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The text is drawn to the left of the x,y origin
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RIGHT   (2);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Align(int nativeInt) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.nativeInt = nativeInt;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int nativeInt;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new paint with default settings.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Paint() {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(0);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new paint with the specified flags. Use setFlags() to change
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * these after the paint is created.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags initial flag bits, as if they were passed via setFlags().
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Paint(int flags) {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNativePaint = native_init();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(flags | DEFAULT_PAINT_FLAGS);
196afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        mCompatScaling = mInvCompatScaling = 1;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new paint, initialized with the attributes in the specified
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * paint parameter.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param paint Existing paint used to initialized the attributes of the
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              new paint.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Paint(Paint paint) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNativePaint = native_initWithPaint(paint.mNativePaint);
208afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        mHasCompatScaling = paint.mHasCompatScaling;
209afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        mCompatScaling = paint.mCompatScaling;
210afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        mInvCompatScaling = paint.mInvCompatScaling;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Restores the paint to its default settings. */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reset() {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_reset(mNativePaint);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(DEFAULT_PAINT_FLAGS);
217afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        mHasCompatScaling = false;
218afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        mCompatScaling = mInvCompatScaling = 1;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy the fields from src into this paint. This is equivalent to calling
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * get() on all of the src fields, and calling the corresponding set()
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * methods on this.
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void set(Paint src) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this != src) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // copy over the native settings
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            native_set(mNativePaint, src.mNativePaint);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // copy over our java settings
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColorFilter    = src.mColorFilter;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMaskFilter     = src.mMaskFilter;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPathEffect     = src.mPathEffect;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRasterizer     = src.mRasterizer;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShader         = src.mShader;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTypeface       = src.mTypeface;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mXfermode       = src.mXfermode;
238afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mHasCompatScaling = src.mHasCompatScaling;
239afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mCompatScaling    = src.mCompatScaling;
240afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mInvCompatScaling = src.mInvCompatScaling;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
244afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    /** @hide */
245afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    public void setCompatibilityScaling(float factor) {
246afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (factor == 1.0) {
247afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mHasCompatScaling = false;
248afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mCompatScaling = mInvCompatScaling = 1.0f;
249afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        } else {
250afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mHasCompatScaling = true;
251afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mCompatScaling = factor;
252afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            mInvCompatScaling = 1.0f/factor;
253afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
254afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    }
255afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's flags. Use the Flag enum to test flag values.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's flags (see enums ending in _Flag for bit masks)
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getFlags();
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's flags. Use the Flag enum to specific flag values.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The new flag bits for the paint
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setFlags(int flags);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if ANTI_ALIAS_FLAG bit is set
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AntiAliasing smooths out the edges of what is being drawn, but is has
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no impact on the interior of the shape. See setDither() and
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setFilterBitmap() to affect how colors are treated.
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the antialias bit is set in the paint's flags.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isAntiAlias() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & ANTI_ALIAS_FLAG) != 0;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the ANTI_ALIAS_FLAG bit
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AntiAliasing smooths out the edges of what is being drawn, but is has
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no impact on the interior of the shape. See setDither() and
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setFilterBitmap() to affect how colors are treated.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param aa true to set the antialias bit in the flags, false to clear it
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setAntiAlias(boolean aa);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if DITHER_FLAG bit is set
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dithering affects how colors that are higher precision than the device
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are down-sampled. No dithering is generally faster, but higher precision
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * colors are just truncated down (e.g. 8888 -> 565). Dithering tries to
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * distribute the error inherent in this process, to reduce the visual
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * artifacts.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the dithering bit is set in the paint's flags.
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isDither() {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & DITHER_FLAG) != 0;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the DITHER_FLAG bit
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dithering affects how colors that are higher precision than the device
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are down-sampled. No dithering is generally faster, but higher precision
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * colors are just truncated down (e.g. 8888 -> 565). Dithering tries to
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * distribute the error inherent in this process, to reduce the visual
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * artifacts.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dither true to set the dithering bit in flags, false to clear it
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setDither(boolean dither);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if LINEAR_TEXT_FLAG bit is set
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the lineartext bit is set in the paint's flags
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isLinearText() {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & LINEAR_TEXT_FLAG) != 0;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the LINEAR_TEXT_FLAG bit
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linearText true to set the linearText bit in the paint's flags,
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   false to clear it.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setLinearText(boolean linearText);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if SUBPIXEL_TEXT_FLAG bit is set
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the subpixel bit is set in the paint's flags
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSubpixelText() {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & SUBPIXEL_TEXT_FLAG) != 0;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the SUBPIXEL_TEXT_FLAG bit
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param subpixelText true to set the subpixelText bit in the paint's
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     flags, false to clear it.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setSubpixelText(boolean subpixelText);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if UNDERLINE_TEXT_FLAG bit is set
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the underlineText bit is set in the paint's flags.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isUnderlineText() {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & UNDERLINE_TEXT_FLAG) != 0;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the UNDERLINE_TEXT_FLAG bit
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param underlineText true to set the underlineText bit in the paint's
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                      flags, false to clear it.
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setUnderlineText(boolean underlineText);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if STRIKE_THRU_TEXT_FLAG bit is set
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the strikeThruText bit is set in the paint's flags.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isStrikeThruText() {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & STRIKE_THRU_TEXT_FLAG) != 0;
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param strikeThruText true to set the strikeThruText bit in the paint's
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                       flags, false to clear it.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setStrikeThruText(boolean strikeThruText);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getFlags(), returning true if FAKE_BOLD_TEXT_FLAG bit is set
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the fakeBoldText bit is set in the paint's flags.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isFakeBoldText() {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & FAKE_BOLD_TEXT_FLAG) != 0;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fakeBoldText true to set the fakeBoldText bit in the paint's
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     flags, false to clear it.
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setFakeBoldText(boolean fakeBoldText);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether or not the bitmap filter is activated.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Filtering affects the sampling of bitmaps when they are transformed.
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Filtering does not affect how the colors in the bitmap are converted into
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * device pixels. That is dependent on dithering and xfermodes.
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFilterBitmap(boolean) setFilterBitmap()
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isFilterBitmap() {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getFlags() & FILTER_BITMAP_FLAG) != 0;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for setFlags(), setting or clearing the FILTER_BITMAP_FLAG bit.
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Filtering affects the sampling of bitmaps when they are transformed.
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Filtering does not affect how the colors in the bitmap are converted into
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * device pixels. That is dependent on dithering and xfermodes.
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filter true to set the FILTER_BITMAP_FLAG bit in the paint's
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               flags, false to clear it.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setFilterBitmap(boolean filter);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's style, used for controlling how primitives'
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * geometries are interpreted (except for drawBitmap, which always assumes
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FILL_STYLE).
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's style setting (Fill, Stroke, StrokeAndFill)
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Style getStyle() {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sStyleArray[native_getStyle(mNativePaint)];
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's style, used for controlling how primitives'
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * geometries are interpreted (except for drawBitmap, which always assumes
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Fill).
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param style The new style to set in the paint
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStyle(Style style) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setStyle(mNativePaint, style.nativeInt);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's color. Note that the color is a 32bit value
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * containing alpha as well as r,g,b. This 32bit value is not premultiplied,
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * meaning that its alpha can be any value, regardless of the values of
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * r,g,b. See the Color class for more details.
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's color (and alpha).
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getColor();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's color. Note that the color is an int containing alpha
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as well as r,g,b. This 32bit value is not premultiplied, meaning that
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its alpha can be any value, regardless of the values of r,g,b.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See the Color class for more details.
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param color The new color (including alpha) to set in the paint.
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setColor(int color);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper to getColor() that just returns the color's alpha value. This is
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same as calling getColor() >>> 24. It always returns a value between
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 0 (completely transparent) and 255 (completely opaque).
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the alpha component of the paint's color.
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getAlpha();
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper to setColor(), that only assigns the color's alpha value,
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * leaving its r,g,b values unchanged. Results are undefined if the alpha
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value is outside of the range [0..255]
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param a set the alpha component [0..255] of the paint's color.
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setAlpha(int a);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper to setColor(), that takes a,r,g,b and constructs the color int
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param a The new alpha component (0..255) of the paint's color.
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param r The new red component (0..255) of the paint's color.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param g The new green component (0..255) of the paint's color.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param b The new blue component (0..255) of the paint's color.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setARGB(int a, int r, int g, int b) {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColor((a << 24) | (r << 16) | (g << 8) | b);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the width for stroking.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A value of 0 strokes in hairline mode.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hairlines always draws a single pixel independent of the canva's matrix.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's stroke width, used whenever the paint's style is
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         Stroke or StrokeAndFill.
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float getStrokeWidth();
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the width for stroking.
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass 0 to stroke in hairline mode.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hairlines always draws a single pixel independent of the canva's matrix.
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param width set the paint's stroke width, used whenever the paint's
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              style is Stroke or StrokeAndFill.
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setStrokeWidth(float width);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's stroke miter value. Used to control the behavior
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of miter joins when the joins angle is sharp.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's miter limit, used whenever the paint's style is
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         Stroke or StrokeAndFill.
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float getStrokeMiter();
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's stroke miter value. This is used to control the behavior
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of miter joins when the joins angle is sharp. This value must be >= 0.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param miter set the miter limit on the paint, used whenever the paint's
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              style is Stroke or StrokeAndFill.
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setStrokeMiter(float miter);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's Cap, controlling how the start and end of stroked
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lines and paths are treated.
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line cap style for the paint, used whenever the paint's
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         style is Stroke or StrokeAndFill.
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Cap getStrokeCap() {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sCapArray[native_getStrokeCap(mNativePaint)];
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's Cap.
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cap set the paint's line cap style, used whenever the paint's
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            style is Stroke or StrokeAndFill.
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStrokeCap(Cap cap) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setStrokeCap(mNativePaint, cap.nativeInt);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's stroke join type.
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's Join.
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Join getStrokeJoin() {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sJoinArray[native_getStrokeJoin(mNativePaint)];
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's Join.
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param join set the paint's Join, used whenever the paint's style is
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             Stroke or StrokeAndFill.
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStrokeJoin(Join join) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setStrokeJoin(mNativePaint, join.nativeInt);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies any/all effects (patheffect, stroking) to src, returning the
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * result in dst. The result is that drawing src with this paint will be
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same as drawing dst with a default paint (at least from the
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * geometric perspective).
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src input path
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst output path (may be the same as src)
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return    true if the path should be filled, or false if it should be
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 drawn with a hairline (width == 0)
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getFillPath(Path src, Path dst) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_getFillPath(mNativePaint, src.ni(), dst.ni());
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's shader object.
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's shader (or null)
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Shader getShader() {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mShader;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the shader object.
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass null to clear any previous shader.
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * As a convenience, the parameter passed is also returned.
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shader May be null. the new shader to be installed in the paint
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return       shader
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Shader setShader(Shader shader) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int shaderNative = 0;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shader != null)
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            shaderNative = shader.native_instance;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setShader(mNativePaint, shaderNative);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mShader = shader;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return shader;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's colorfilter (maybe be null).
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's colorfilter (maybe be null)
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorFilter getColorFilter() {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mColorFilter;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the paint's colorfilter, returning the parameter.
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filter May be null. The new filter to be installed in the paint
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return       filter
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorFilter setColorFilter(ColorFilter filter) {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int filterNative = 0;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (filter != null)
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filterNative = filter.native_instance;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setColorFilter(mNativePaint, filterNative);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColorFilter = filter;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return filter;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's xfermode object.
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's xfermode (or null)
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Xfermode getXfermode() {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mXfermode;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the xfermode object.
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass null to clear any previous xfermode.
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * As a convenience, the parameter passed is also returned.
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xfermode May be null. The xfermode to be installed in the paint
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return         xfermode
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Xfermode setXfermode(Xfermode xfermode) {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int xfermodeNative = 0;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (xfermode != null)
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            xfermodeNative = xfermode.native_instance;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setXfermode(mNativePaint, xfermodeNative);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mXfermode = xfermode;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return xfermode;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's patheffect object.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's patheffect (or null)
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PathEffect getPathEffect() {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPathEffect;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the patheffect object.
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass null to clear any previous patheffect.
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * As a convenience, the parameter passed is also returned.
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param effect May be null. The patheffect to be installed in the paint
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return       effect
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PathEffect setPathEffect(PathEffect effect) {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int effectNative = 0;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (effect != null) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            effectNative = effect.native_instance;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setPathEffect(mNativePaint, effectNative);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPathEffect = effect;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return effect;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's maskfilter object.
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's maskfilter (or null)
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MaskFilter getMaskFilter() {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMaskFilter;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the maskfilter object.
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass null to clear any previous maskfilter.
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * As a convenience, the parameter passed is also returned.
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param maskfilter May be null. The maskfilter to be installed in the
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   paint
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return           maskfilter
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MaskFilter setMaskFilter(MaskFilter maskfilter) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int maskfilterNative = 0;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (maskfilter != null) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            maskfilterNative = maskfilter.native_instance;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setMaskFilter(mNativePaint, maskfilterNative);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMaskFilter = maskfilter;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return maskfilter;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's typeface object.
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The typeface object identifies which font to use when drawing or
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * measuring text.
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's typeface (or null)
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Typeface getTypeface() {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTypeface;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the typeface object.
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass null to clear any previous typeface.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * As a convenience, the parameter passed is also returned.
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param typeface May be null. The typeface to be installed in the paint
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return         typeface
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Typeface setTypeface(Typeface typeface) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int typefaceNative = 0;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (typeface != null) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            typefaceNative = typeface.native_instance;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setTypeface(mNativePaint, typefaceNative);
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTypeface = typeface;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return typeface;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the paint's rasterizer (or null).
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The raster controls/modifies how paths/text are turned into alpha masks.
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return         the paint's rasterizer (or null)
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rasterizer getRasterizer() {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRasterizer;
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set or clear the rasterizer object.
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p />
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass null to clear any previous rasterizer.
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * As a convenience, the parameter passed is also returned.
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rasterizer May be null. The new rasterizer to be installed in
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   the paint.
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return           rasterizer
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rasterizer setRasterizer(Rasterizer rasterizer) {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int rasterizerNative = 0;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rasterizer != null) {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rasterizerNative = rasterizer.native_instance;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setRasterizer(mNativePaint, rasterizerNative);
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRasterizer = rasterizer;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rasterizer;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary API to expose layer drawing. This draws a shadow layer below
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the main layer, with the specified offset and color, and blur radius.
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If radius is 0, then the shadow layer is removed.
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setShadowLayer(float radius, float dx, float dy,
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      int color);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary API to clear the shadow layer.
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearShadowLayer() {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setShadowLayer(0, 0, 0, 0);
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's Align value for drawing text. This controls how the
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * text is positioned relative to its origin. LEFT align means that all of
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the text will be drawn to the right of its origin (i.e. the origin
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specifieds the LEFT edge of the text) and so on.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's Align value for drawing text.
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Align getTextAlign() {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sAlignArray[native_getTextAlign(mNativePaint)];
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's text alignment. This controls how the
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * text is positioned relative to its origin. LEFT align means that all of
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the text will be drawn to the right of its origin (i.e. the origin
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specifieds the LEFT edge of the text) and so on.
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param align set the paint's Align value for drawing text.
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTextAlign(Align align) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setTextAlign(mNativePaint, align.nativeInt);
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's text size.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's text size.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float getTextSize();
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's text size. This value must be > 0
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param textSize set the paint's text size.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setTextSize(float textSize);
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's horizontal scale factor for text. The default value
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is 1.0.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the paint's scale factor in X for drawing/measuring text
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float getTextScaleX();
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's horizontal scale factor for text. The default value
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is 1.0. Values > 1.0 will stretch the text wider. Values < 1.0 will
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stretch the text narrower.
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scaleX set the paint's scale in X for drawing/measuring text.
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setTextScaleX(float scaleX);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the paint's horizontal skew factor for text. The default value
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is 0.
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return         the paint's skew factor in X for drawing text.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float getTextSkewX();
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the paint's horizontal skew factor for text. The default value
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is 0. For approximating oblique text, use values around -0.25.
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param skewX set the paint's skew factor in X for drawing text.
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void setTextSkewX(float skewX);
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the distance above (negative) the baseline (ascent) based on the
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current typeface and text size.
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the distance above (negative) the baseline (ascent) based on the
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         current typeface and text size.
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float ascent();
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the distance below (positive) the baseline (descent) based on the
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current typeface and text size.
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the distance below (positive) the baseline (descent) based on
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the current typeface and text size.
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float descent();
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Class that describes the various metrics for a font at a given text size.
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remember, Y values increase going down, so those values will be positive,
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and values that measure distances going up will be negative. This class
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is returned by getFontMetrics().
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class FontMetrics {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum distance above the baseline for the tallest glyph in
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the font at a given text size.
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float   top;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The recommended distance above the baseline for singled spaced text.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float   ascent;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The recommended distance below the baseline for singled spaced text.
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float   descent;
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum distance below the baseline for the lowest glyph in
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the font at a given text size.
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float   bottom;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The recommended additional space to add between lines of text.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float   leading;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the font's recommended interline spacing, given the Paint's
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * settings for typeface, textSize, etc. If metrics is not null, return the
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fontmetric values in it.
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metrics If this object is not null, its fields are filled with
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                the appropriate values given the paint's text attributes.
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the font's recommended interline spacing.
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native float getFontMetrics(FontMetrics metrics);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Allocates a new FontMetrics object, and then calls getFontMetrics(fm)
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with it, returning the object.
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FontMetrics getFontMetrics() {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FontMetrics fm = new FontMetrics();
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getFontMetrics(fm);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fm;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method for callers that want to have FontMetrics values as
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * integers.
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class FontMetricsInt {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int   top;
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int   ascent;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int   descent;
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int   bottom;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int   leading;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public String toString() {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "FontMetricsInt: top=" + top + " ascent=" + ascent +
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " descent=" + descent + " bottom=" + bottom +
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " leading=" + leading;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the font's interline spacing, given the Paint's settings for
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * typeface, textSize, etc. If metrics is not null, return the fontmetric
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values in it. Note: all values have been converted to integers from
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * floats, in such a way has to make the answers useful for both spacing
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and clipping. If you want more control over the rounding, call
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * getFontMetrics().
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the font's interline spacing.
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int getFontMetricsInt(FontMetricsInt fmi);
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FontMetricsInt getFontMetricsInt() {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FontMetricsInt fm = new FontMetricsInt();
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getFontMetricsInt(fm);
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fm;
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the recommend line spacing based on the current typeface and
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * text size.
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return  recommend line spacing based on the current typeface and
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *          text size.
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getFontSpacing() {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getFontMetrics(null);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the width of the text.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index The index of the first character to start measuring
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param count THe number of characters to measure, beginning with start
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return      The width of the text
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1000afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    public float measureText(char[] text, int index, int count) {
1001afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) return native_measureText(text, index, count);
1002afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1003afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1004afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        float w = native_measureText(text, index, count);
1005afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1006afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return w*mInvCompatScaling;
1007afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    }
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    private native float native_measureText(char[] text, int index, int count);
1010afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the width of the text.
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start The index of the first character to start measuring
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end   1 beyond the index of the last character to measure
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return      The width of the text
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1019afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    public float measureText(String text, int start, int end) {
1020afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) return native_measureText(text, start, end);
1021afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1022afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1023afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        float w = native_measureText(text, start, end);
1024afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1025afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return w*mInvCompatScaling;
1026afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    }
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1028afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    private native float native_measureText(String text, int start, int end);
1029afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the width of the text.
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return      The width of the text
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1036afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    public float measureText(String text) {
1037afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) return native_measureText(text);
1038afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1039afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1040afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        float w = native_measureText(text);
1041afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1042afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return w*mInvCompatScaling;
1043afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    }
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1045afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    private native float native_measureText(String text);
1046afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the width of the text.
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start The index of the first character to start measuring
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end   1 beyond the index of the last character to measure
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return      The width of the text
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float measureText(CharSequence text, int start, int end) {
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text instanceof String) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return measureText((String)text, start, end);
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text instanceof SpannedString ||
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            text instanceof SpannableString) {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return measureText(text.toString(), start, end);
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text instanceof GraphicsOperations) {
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ((GraphicsOperations)text).measureText(start, end, this);
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char[] buf = TemporaryBuffer.obtain(end - start);
1068afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        TextUtils.getChars(text, start, end, buf, 0);
1069afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        float result = measureText(buf, 0, end - start);
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TemporaryBuffer.recycle(buf);
1071afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return result;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Measure the text, stopping early if the measured width exceeds maxWidth.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the number of chars that were measured, and if measuredWidth is
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not null, return in it the actual width measured.
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index The offset into text to begin measuring at
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param count The number of maximum number of entries to measure. If count
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              is negative, then the characters before index are measured
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              in reverse order. This allows for measuring the end of
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              string.
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param maxWidth The maximum width to accumulate.
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measuredWidth Optional. If not null, returns the actual width
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     measured.
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of chars that were measured. Will always be <=
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         abs(count).
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1091afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    public int breakText(char[] text, int index, int count,
1092afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn                                float maxWidth, float[] measuredWidth) {
1093afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) {
1094afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            return native_breakText(text, index, count, maxWidth, measuredWidth);
1095afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
1096afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1097afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1098afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        int res = native_breakText(text, index, count, maxWidth*mCompatScaling,
1099afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn                measuredWidth);
1100afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1101afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling;
1102afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return res;
1103afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    }
1104afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
1105c20a9608f379b23aee473f992a327ac26a31ba17Dianne Hackborn    private native int native_breakText(char[] text, int index, int count,
1106c20a9608f379b23aee473f992a327ac26a31ba17Dianne Hackborn                                        float maxWidth, float[] measuredWidth);
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Measure the text, stopping early if the measured width exceeds maxWidth.
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the number of chars that were measured, and if measuredWidth is
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not null, return in it the actual width measured.
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start The offset into text to begin measuring at
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end   The end of the text slice to measure.
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measureForwards If true, measure forwards, starting at start.
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                        Otherwise, measure backwards, starting with end.
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param maxWidth The maximum width to accumulate.
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measuredWidth Optional. If not null, returns the actual width
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     measured.
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of chars that were measured. Will always be <=
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         abs(end - start).
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int breakText(CharSequence text, int start, int end,
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         boolean measureForwards,
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         float maxWidth, float[] measuredWidth) {
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (start == 0 && text instanceof String && end == text.length()) {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return breakText((String) text, measureForwards, maxWidth,
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             measuredWidth);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char[] buf = TemporaryBuffer.obtain(end - start);
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int result;
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextUtils.getChars(text, start, end, buf, 0);
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (measureForwards) {
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = breakText(buf, 0, end - start, maxWidth, measuredWidth);
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = breakText(buf, 0, -(end - start), maxWidth, measuredWidth);
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TemporaryBuffer.recycle(buf);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Measure the text, stopping early if the measured width exceeds maxWidth.
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the number of chars that were measured, and if measuredWidth is
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not null, return in it the actual width measured.
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to measure
115333a31b314f571ddcbef003e8a399c20ddeff6905Dirk Dougherty     * @param measureForwards If true, measure forwards, starting with the
115433a31b314f571ddcbef003e8a399c20ddeff6905Dirk Dougherty     *                        first character in the string. Otherwise,
115533a31b314f571ddcbef003e8a399c20ddeff6905Dirk Dougherty     *                        measure backwards, starting with the
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                        last character in the string.
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param maxWidth The maximum width to accumulate.
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measuredWidth Optional. If not null, returns the actual width
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     measured.
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of chars that were measured. Will always be <=
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         abs(count).
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1163afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    public int breakText(String text, boolean measureForwards,
1164afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn                                float maxWidth, float[] measuredWidth) {
1165afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) {
1166afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            return native_breakText(text, measureForwards, maxWidth, measuredWidth);
1167afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
1168afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1169afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1170afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        int res = native_breakText(text, measureForwards, maxWidth*mCompatScaling,
1171afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn                measuredWidth);
1172afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1173afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling;
1174afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return res;
1175afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn    }
1176afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
1177c20a9608f379b23aee473f992a327ac26a31ba17Dianne Hackborn    private native int native_breakText(String text, boolean measureForwards,
1178c20a9608f379b23aee473f992a327ac26a31ba17Dianne Hackborn                                        float maxWidth, float[] measuredWidth);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the advance widths for the characters in the string.
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text     The text to measure
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index    The index of the first char to to measure
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param count    The number of chars starting with index to measure
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widths   array to receive the advance widths of the characters.
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 Must be at least a large as count.
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return         the actual number of widths returned.
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTextWidths(char[] text, int index, int count,
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             float[] widths) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((index | count) < 0 || index + count > text.length
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || count > widths.length) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1196afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
1197afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) {
1198afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            return native_getTextWidths(mNativePaint, text, index, count, widths);
1199afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
1200afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1201afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1202afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        int res = native_getTextWidths(mNativePaint, text, index, count, widths);
1203afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1204afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        for (int i=0; i<res; i++) {
1205afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            widths[i] *= mInvCompatScaling;
1206afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
1207afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return res;
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the advance widths for the characters in the string.
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text     The text to measure
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start    The index of the first char to to measure
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end      The end of the text slice to measure
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widths   array to receive the advance widths of the characters.
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 Must be at least a large as (end - start).
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return         the actual number of widths returned.
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTextWidths(CharSequence text, int start, int end,
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             float[] widths) {
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text instanceof String) {
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getTextWidths((String) text, start, end, widths);
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text instanceof SpannedString ||
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            text instanceof SpannableString) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getTextWidths(text.toString(), start, end, widths);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text instanceof GraphicsOperations) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ((GraphicsOperations) text).getTextWidths(start, end,
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                 widths, this);
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char[] buf = TemporaryBuffer.obtain(end - start);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	TextUtils.getChars(text, start, end, buf, 0);
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	int result = getTextWidths(buf, 0, end - start, widths);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TemporaryBuffer.recycle(buf);
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	return result;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the advance widths for the characters in the string.
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text   The text to measure
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start  The index of the first char to to measure
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end    The end of the text slice to measure
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widths array to receive the advance widths of the characters.
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               Must be at least a large as the text.
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return       the number of unichars in the specified text.
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTextWidths(String text, int start, int end, float[] widths) {
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((start | end | (end - start) | (text.length() - end)) < 0) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IndexOutOfBoundsException();
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (end - start > widths.length) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1258afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn
1259afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        if (!mHasCompatScaling) {
1260afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            return native_getTextWidths(mNativePaint, text, start, end, widths);
1261afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
1262afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        final float oldSize = getTextSize();
1263afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize*mCompatScaling);
1264afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        int res = native_getTextWidths(mNativePaint, text, start, end, widths);
1265afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        setTextSize(oldSize);
1266afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        for (int i=0; i<res; i++) {
1267afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn            widths[i] *= mInvCompatScaling;
1268afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        }
1269afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn        return res;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the advance widths for the characters in the string.
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text   The text to measure
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widths array to receive the advance widths of the characters.
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               Must be at least a large as the text.
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return       the number of unichars in the specified text.
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTextWidths(String text, float[] widths) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getTextWidths(text, 0, text.length(), widths);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the path (outline) for the specified text.
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note: just like Canvas.drawText, this will respect the Align setting in
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the paint.
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text     The text to retrieve the path from
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index    The index of the first character in text
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param count    The number of characterss starting with index
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x        The x coordinate of the text's origin
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y        The y coordinate of the text's origin
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param path     The path to receive the data describing the text. Must
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 be allocated by the caller.
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextPath(char[] text, int index, int count,
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            float x, float y, Path path) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((index | count) < 0 || index + count > text.length) {
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_getTextPath(mNativePaint, text, index, count, x, y, path.ni());
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the path (outline) for the specified text.
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note: just like Canvas.drawText, this will respect the Align setting
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the paint.
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  The text to retrieve the path from
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start The first character in the text
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end   1 past the last charcter in the text
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x     The x coordinate of the text's origin
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y     The y coordinate of the text's origin
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param path  The path to receive the data describing the text. Must
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              be allocated by the caller.
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextPath(String text, int start, int end,
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            float x, float y, Path path) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((start | end | (end - start) | (text.length() - end)) < 0) {
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IndexOutOfBoundsException();
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_getTextPath(mNativePaint, text, start, end, x, y, path.ni());
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return in bounds (allocated by the caller) the smallest rectangle that
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * encloses all of the characters, with an implied origin at (0,0).
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  String to measure and return its bounds
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start Index of the first char in the string to measure
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end   1 past the last char in the string measure
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bounds Returns the unioned bounds of all the text. Must be
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               allocated by the caller.
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextBounds(String text, int start, int end, Rect bounds) {
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((start | end | (end - start) | (text.length() - end)) < 0) {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IndexOutOfBoundsException();
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bounds == null) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NullPointerException("need bounds Rect");
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nativeGetStringBounds(mNativePaint, text, start, end, bounds);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return in bounds (allocated by the caller) the smallest rectangle that
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * encloses all of the characters, with an implied origin at (0,0).
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text  Array of chars to measure and return their unioned bounds
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index Index of the first char in the array to measure
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param count The number of chars, beginning at index, to measure
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bounds Returns the unioned bounds of all the text. Must be
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               allocated by the caller.
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getTextBounds(char[] text, int index, int count, Rect bounds) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((index | count) < 0 || index + count > text.length) {
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bounds == null) {
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NullPointerException("need bounds Rect");
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nativeGetCharArrayBounds(mNativePaint, text, index, count, bounds);
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finalizer(mNativePaint);
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_init();
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_initWithPaint(int paint);
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_reset(int native_object);
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_set(int native_dst, int native_src);
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_getStyle(int native_object);
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setStyle(int native_object, int style);
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_getStrokeCap(int native_object);
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setStrokeCap(int native_object, int cap);
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_getStrokeJoin(int native_object);
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setStrokeJoin(int native_object,
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int join);
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_getFillPath(int native_object,
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                     int src, int dst);
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setShader(int native_object, int shader);
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setColorFilter(int native_object,
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int filter);
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setXfermode(int native_object,
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 int xfermode);
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setPathEffect(int native_object,
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   int effect);
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setMaskFilter(int native_object,
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   int maskfilter);
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setTypeface(int native_object,
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 int typeface);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_setRasterizer(int native_object,
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   int rasterizer);
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_getTextAlign(int native_object);
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setTextAlign(int native_object,
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   int align);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native float native_getFontMetrics(int native_paint,
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                      FontMetrics metrics);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_getTextWidths(int native_object,
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            char[] text, int index, int count, float[] widths);
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_getTextWidths(int native_object,
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            String text, int start, int end, float[] widths);
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_getTextPath(int native_object,
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char[] text, int index, int count, float x, float y, int path);
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_getTextPath(int native_object,
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String text, int start, int end, float x, float y, int path);
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeGetStringBounds(int nativePaint,
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                String text, int start, int end, Rect bounds);
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeGetCharArrayBounds(int nativePaint,
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                char[] text, int index, int count, Rect bounds);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void finalizer(int nativePaint);
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1418