19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1980756e38882720860db52f1fcc21fa1505a02abfTor Norbyeimport android.annotation.ColorInt; 20a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournaderimport android.annotation.NonNull; 21a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournaderimport android.annotation.Size; 220763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonakaimport android.graphics.FontListParser; 23ff55115121a7a2753ba2265cb3201a3a14c0874dSeigo Nonakaimport android.graphics.fonts.FontVariationAxis; 2423cbe85610f780134cc77dd4a54732a22ed6e86eYohei Yukawaimport android.os.LocaleList; 250763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonakaimport android.text.FontConfig; 26f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Feltimport android.text.GraphicsOperations; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableString; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannedString; 29f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Feltimport android.text.TextUtils; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonakaimport com.android.internal.annotations.GuardedBy; 32cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka 33f22859757b7981cdb3e05579bbb5f782965b5ca9John Reckimport dalvik.annotation.optimization.CriticalNative; 34f22859757b7981cdb3e05579bbb5f782965b5ca9John Reckimport dalvik.annotation.optimization.FastNative; 35f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck 360763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonakaimport java.util.ArrayList; 370763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonakaimport java.util.Arrays; 380763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonakaimport java.util.Collections; 39cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonakaimport java.util.HashMap; 40517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglioimport java.util.Locale; 41517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio 42775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhlerimport libcore.util.NativeAllocationRegistry; 43775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Paint class holds the style and color information about how to draw 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * geometries, text and bitmaps. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Paint { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50f4242b107caa1b760304dc9ea547206c391bc05eDerek Sollenberger private long mNativePaint; 516097eca72134034fcc6086c110673b5df94913b0Chris Craik private long mNativeShader; 526097eca72134034fcc6086c110673b5df94913b0Chris Craik private long mNativeColorFilter; 53dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger 54775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler // The approximate size of a native paint object. 55775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler private static final long NATIVE_PAINT_SIZE = 98; 56775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler 57f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe // Use a Holder to allow static initialization of Paint in the boot image. 58f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe private static class NoImagePreloadHolder { 59f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( 600ebdbb4a8470bb77f38c33a42c220ecb8a7adcc6Richard Uhler Paint.class.getClassLoader(), nGetNativeFinalizer(), NATIVE_PAINT_SIZE); 61f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe } 62775873a66a946fae2b0535abb51df9817bd1b20cRichard Uhler 63a033630e805c407080221e20b236b6054f324670Raph Levien /** 64a033630e805c407080221e20b236b6054f324670Raph Levien * @hide 65a033630e805c407080221e20b236b6054f324670Raph Levien */ 6636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat public long mNativeTypeface; 67c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ColorFilter mColorFilter; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MaskFilter mMaskFilter; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PathEffect mPathEffect; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Shader mShader; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Typeface mTypeface; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Xfermode mXfermode; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn private boolean mHasCompatScaling; 76afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn private float mCompatScaling; 77afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn private float mInvCompatScaling; 781e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy 79a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader private LocaleList mLocales; 80805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod private String mFontFeatureSettings; 819ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka private String mFontVariationSettings; 82517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio 83538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader private float mShadowLayerRadius; 84538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader private float mShadowLayerDx; 85538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader private float mShadowLayerDy; 86538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader private int mShadowLayerColor; 87538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader 88cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka private static final Object sCacheLock = new Object(); 89cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka 90cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka /** 91cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka * Cache for the Minikin language list ID. 92cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka * 93cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka * A map from a string representation of the LocaleList to Minikin's language list ID. 94cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka */ 95cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka @GuardedBy("sCacheLock") 96cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka private static final HashMap<String, Integer> sMinikinLangListIdCache = new HashMap<>(); 97cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka 981e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy /** 991e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy * @hide 1001e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy */ 101da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public int mBidiFlags = BIDI_DEFAULT_LTR; 102051910b9f998030dacb8a0722588cc715813fde1Raph Levien 1037f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet static final Style[] sStyleArray = { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Style.FILL, Style.STROKE, Style.FILL_AND_STROKE 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1067f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet static final Cap[] sCapArray = { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cap.BUTT, Cap.ROUND, Cap.SQUARE 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1097f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet static final Join[] sJoinArray = { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Join.MITER, Join.ROUND, Join.BEVEL 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1127f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet static final Align[] sAlignArray = { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Align.LEFT, Align.CENTER, Align.RIGHT 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1168dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1178dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that enables antialiasing when drawing. 1188dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1198dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>Enabling this flag will cause all draw operations that support 1208dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * antialiasing to use it.</p> 1218dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1228dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1238dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1248dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ANTI_ALIAS_FLAG = 0x01; 1268dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1278dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that enables bilinear sampling on scaled bitmaps. 1288dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1298dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>If cleared, scaled bitmaps will be drawn with nearest neighbor 1308dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * sampling, likely resulting in artifacts. This should generally be on 1318dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * when drawing bitmaps, unless performance-bound (rendering to software 1328dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * canvas) or preferring pixelation artifacts to blurriness when scaling 1338dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * significantly.</p> 1348dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1358dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>If bitmaps are scaled for device density at creation time (as 1368dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * resource bitmaps often are) the filtering will already have been 1378dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * done.</p> 1388dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1398dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1408dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1418dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILTER_BITMAP_FLAG = 0x02; 1438dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1448dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that enables dithering when blitting. 1458dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1468dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>Enabling this flag applies a dither to any blit operation where the 1478dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * target's colour space is more constrained than the source. 1488dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1498dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1508dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1518dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DITHER_FLAG = 0x04; 1538dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1548dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that applies an underline decoration to drawn text. 1558dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1568dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1578dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1588dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNDERLINE_TEXT_FLAG = 0x08; 1608dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1618dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that applies a strike-through decoration to drawn text. 1628dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1638dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1648dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1658dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STRIKE_THRU_TEXT_FLAG = 0x10; 1678dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1688dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that applies a synthetic bolding effect to drawn text. 1698dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1708dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>Enabling this flag will cause text draw operations to apply a 1718dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * simulated bold effect when drawing a {@link Typeface} that is not 1728dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * already bold.</p> 1738dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1748dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1758dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1768dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FAKE_BOLD_TEXT_FLAG = 0x20; 1788dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1798dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that enables smooth linear scaling of text. 1808dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1818dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>Enabling this flag does not actually scale text, but rather adjusts 1828dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * text draw operations to deal gracefully with smooth adjustment of scale. 1838dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * When this flag is enabled, font hinting is disabled to prevent shape 1848dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * deformation between scale factors, and glyph caching is disabled due to 1858dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * the large number of glyph images that will be generated.</p> 1868dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1878dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>{@link #SUBPIXEL_TEXT_FLAG} should be used in conjunction with this 1888dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * flag to prevent glyph positions from snapping to whole pixel values as 1898dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * scale factor is adjusted.</p> 1908dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1918dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 1928dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 1938dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int LINEAR_TEXT_FLAG = 0x40; 1958dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 1968dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that enables subpixel positioning of text. 1978dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 1988dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>Enabling this flag causes glyph advances to be computed with subpixel 1998dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * accuracy.</p> 2008dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 2018dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>This can be used with {@link #LINEAR_TEXT_FLAG} to prevent text from 2028dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * jittering during smooth scale transitions.</p> 2038dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 2048dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 2058dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 2068dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SUBPIXEL_TEXT_FLAG = 0x80; 2088dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** Legacy Paint flag, no longer used. */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DEV_KERN_TEXT_FLAG = 0x100; 2101e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease /** @hide bit mask for the flag enabling subpixel glyph rendering for text */ 2111e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease public static final int LCD_RENDER_TEXT_FLAG = 0x200; 2128dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease /** 2138dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Paint flag that enables the use of bitmap fonts when drawing text. 2148dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 2158dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * <p>Disabling this flag will prevent text draw operations from using 2168dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * embedded bitmap strikes in fonts, causing fonts with both scalable 2178dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * outlines and bitmap strikes to draw only the scalable outlines, and 2188dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * fonts with only bitmap strikes to not draw at all.</p> 2198dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 2208dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #Paint(int) 2218dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setFlags(int) 2228dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease */ 2231e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease public static final int EMBEDDED_BITMAP_TEXT_FLAG = 0x400; 2241e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease /** @hide bit mask for the flag forcing freetype's autohinter on for text */ 2251e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease public static final int AUTO_HINTING_TEXT_FLAG = 0x800; 2261e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease /** @hide bit mask for the flag enabling vertical rendering for text */ 2271e546815bbb736c50679a8aefc25f48561026fc5Victoria Lease public static final int VERTICAL_TEXT_FLAG = 0x1000; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229caa6226b1735ae074ec3861e2424bbd2276b88a0Chris Craik // These flags are always set on a new/reset paint, even if flags 0 is passed. 230caa6226b1735ae074ec3861e2424bbd2276b88a0Chris Craik static final int HIDDEN_DEFAULT_PAINT_FLAGS = DEV_KERN_TEXT_FLAG | EMBEDDED_BITMAP_TEXT_FLAG; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2338dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Font hinter option that disables font hinting. 2348dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 2358dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setHinting(int) 236f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn */ 237f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn public static final int HINTING_OFF = 0x0; 238f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn 239f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn /** 2408dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * Font hinter option that enables font hinting. 2418dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * 2428dc7d5ea2680b7e397d2cdb7f83427d2c86c9de7Victoria Lease * @see #setHinting(int) 243f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn */ 244f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn public static final int HINTING_ON = 0x1; 245f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn 246f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn /** 247da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Bidi flag to set LTR paragraph direction. 248051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 249da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 250da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 251da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int BIDI_LTR = 0x0; 252da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 253da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 254da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Bidi flag to set RTL paragraph direction. 255051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 256da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 257da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 258da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int BIDI_RTL = 0x1; 259da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 260da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 261da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Bidi flag to detect paragraph direction via heuristics, defaulting to 262da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * LTR. 263051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 264da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 265da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 266da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int BIDI_DEFAULT_LTR = 0x2; 267da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 268da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 269da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Bidi flag to detect paragraph direction via heuristics, defaulting to 270da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * RTL. 271051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 272da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 273da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 274da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int BIDI_DEFAULT_RTL = 0x3; 275da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 276da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 277da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Bidi flag to override direction to all LTR (ignore bidi). 278051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 279da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 280da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 281da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int BIDI_FORCE_LTR = 0x4; 282da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 283da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 284da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Bidi flag to override direction to all RTL (ignore bidi). 285051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 286da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 287da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 288da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int BIDI_FORCE_RTL = 0x5; 289da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 290da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 291da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Maximum Bidi flag value. 292da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 293da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 294da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio private static final int BIDI_MAX_FLAG_VALUE = BIDI_FORCE_RTL; 295da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 296da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 297da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Mask for bidi flags. 298da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 299da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 300da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio private static final int BIDI_FLAG_MASK = 0x7; 301da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 302da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 303da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Flag for getTextRunAdvances indicating left-to-right run direction. 304da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 305da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 306da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int DIRECTION_LTR = 0; 307da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 308da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 309da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Flag for getTextRunAdvances indicating right-to-left run direction. 310da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 311da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 312da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public static final int DIRECTION_RTL = 1; 313da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 314da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 3150c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Option for getTextRunCursor to compute the valid cursor after 3160c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * offset or the limit of the context, whichever is less. 3170c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 3180c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 3190c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public static final int CURSOR_AFTER = 0; 3200c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 3210c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 3220c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Option for getTextRunCursor to compute the valid cursor at or after 3230c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * the offset or the limit of the context, whichever is less. 3240c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 3250c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 3260c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public static final int CURSOR_AT_OR_AFTER = 1; 3270c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 3280c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 3290c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Option for getTextRunCursor to compute the valid cursor before 3300c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * offset or the start of the context, whichever is greater. 3310c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 3320c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 3330c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public static final int CURSOR_BEFORE = 2; 3340c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 3350c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 3360c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Option for getTextRunCursor to compute the valid cursor at or before 3370c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * offset or the start of the context, whichever is greater. 3380c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 3390c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 3400c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public static final int CURSOR_AT_OR_BEFORE = 3; 3410c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 3420c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 3430c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Option for getTextRunCursor to return offset if the cursor at offset 3440c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * is valid, or -1 if it isn't. 3450c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 3460c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 3470c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public static final int CURSOR_AT = 4; 3480c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 3490c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 3500c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Maximum cursor option value. 3510c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 3520c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt private static final int CURSOR_OPT_MAX_VALUE = CURSOR_AT; 3530c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 354f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt /** 35546c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * Mask for hyphen edits that happen at the end of a line. Keep in sync with the definition in 35646c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * Minikin's Hyphenator.h. 35746c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * @hide 35846c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader */ 35946c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader public static final int HYPHENEDIT_MASK_END_OF_LINE = 0x07; 36046c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader 36146c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader /** 36246c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * Mask for hyphen edits that happen at the start of a line. Keep in sync with the definition in 36346c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * Minikin's Hyphenator.h. 36446c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * @hide 36546c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader */ 36646c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader public static final int HYPHENEDIT_MASK_START_OF_LINE = 0x03 << 3; 36746c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader 36846c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader /** 369f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * The Style specifies if the primitive being drawn is filled, stroked, or 370f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt * both (in the same color). The default is FILL. 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Style { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Geometry and text drawn with this style will be filled, ignoring all 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stroke-related settings in the paint. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FILL (0), 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Geometry and text drawn with this style will be stroked, respecting 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the stroke-related fields on the paint. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STROKE (1), 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Geometry and text drawn with this style will be both filled and 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stroked at the same time, respecting the stroke-related fields on 386d404d6f162cfd4071c8ff3a2d44b1077307e2102Mike Reed * the paint. This mode can give unexpected results if the geometry 387d404d6f162cfd4071c8ff3a2d44b1077307e2102Mike Reed * is oriented counter-clockwise. This restriction does not apply to 388d404d6f162cfd4071c8ff3a2d44b1077307e2102Mike Reed * either FILL or STROKE. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FILL_AND_STROKE (2); 391051910b9f998030dacb8a0722588cc715813fde1Raph Levien 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Style(int nativeInt) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Cap specifies the treatment for the beginning and ending of 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stroked lines and paths. The default is BUTT. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Cap { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The stroke ends with the path, and does not project beyond it. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BUTT (0), 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 408c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The stroke projects out as a semicircle, with the center at the 409c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * end of the path. 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ROUND (1), 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 413c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The stroke projects out as a square, with the center at the end 414c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * of the path. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SQUARE (2); 417051910b9f998030dacb8a0722588cc715813fde1Raph Levien 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cap(int nativeInt) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Join specifies the treatment where lines and curve segments 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * join on a stroked path. The default is MITER. 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Join { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The outer edges of a join meet at a sharp angle 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MITER (0), 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The outer edges of a join meet in a circular arc. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ROUND (1), 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The outer edges of a join meet with a straight line 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BEVEL (2); 441051910b9f998030dacb8a0722588cc715813fde1Raph Levien 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Join(int nativeInt) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Align specifies how drawText aligns its text relative to the 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * [x,y] coordinates. The default is LEFT. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Align { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The text is drawn to the right of the x,y origin 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LEFT (0), 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The text is drawn centered horizontally on the x,y origin 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CENTER (1), 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The text is drawn to the left of the x,y origin 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RIGHT (2); 465051910b9f998030dacb8a0722588cc715813fde1Raph Levien 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Align(int nativeInt) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new paint with default settings. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Paint() { 476caa6226b1735ae074ec3861e2424bbd2276b88a0Chris Craik this(0); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 478051910b9f998030dacb8a0722588cc715813fde1Raph Levien 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new paint with the specified flags. Use setFlags() to change 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these after the paint is created. 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags initial flag bits, as if they were passed via setFlags(). 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Paint(int flags) { 486dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck mNativePaint = nInit(); 487f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativePaint); 4881b60cc0529161b5eca6407b551d67d355994c567Chris Craik setFlags(flags | HIDDEN_DEFAULT_PAINT_FLAGS); 489f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // TODO: Turning off hinting has undesirable side effects, we need to 490f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // revisit hinting once we add support for subpixel positioning 491f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV 492f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // ? HINTING_OFF : HINTING_ON); 493afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mCompatScaling = mInvCompatScaling = 1; 494fee44846376c212114223fc4259382921e6dca7aRoozbeh Pournader setTextLocales(LocaleList.getAdjustedDefault()); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new paint, initialized with the attributes in the specified 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paint parameter. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param paint Existing paint used to initialized the attributes of the 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new paint. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Paint(Paint paint) { 505dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck mNativePaint = nInitWithPaint(paint.getNativeInstance()); 506f6765f3965ce669458e0bb5d2e226d4233a1acb3Andreas Gampe NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativePaint); 507bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey setClassVariablesFrom(paint); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Restores the paint to its default settings. */ 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() { 512dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nReset(mNativePaint); 513caa6226b1735ae074ec3861e2424bbd2276b88a0Chris Craik setFlags(HIDDEN_DEFAULT_PAINT_FLAGS); 514885d82d4274170873919660550c28df9ee14ca1bRomain Guy 515f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // TODO: Turning off hinting has undesirable side effects, we need to 516f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // revisit hinting once we add support for subpixel positioning 517f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV 518f68832bcc1069c70ef27248da6d82e9f9056955aRomain Guy // ? HINTING_OFF : HINTING_ON); 519885d82d4274170873919660550c28df9ee14ca1bRomain Guy 520885d82d4274170873919660550c28df9ee14ca1bRomain Guy mColorFilter = null; 521885d82d4274170873919660550c28df9ee14ca1bRomain Guy mMaskFilter = null; 522885d82d4274170873919660550c28df9ee14ca1bRomain Guy mPathEffect = null; 523885d82d4274170873919660550c28df9ee14ca1bRomain Guy mShader = null; 524dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger mNativeShader = 0; 525885d82d4274170873919660550c28df9ee14ca1bRomain Guy mTypeface = null; 526a033630e805c407080221e20b236b6054f324670Raph Levien mNativeTypeface = 0; 527885d82d4274170873919660550c28df9ee14ca1bRomain Guy mXfermode = null; 528885d82d4274170873919660550c28df9ee14ca1bRomain Guy 529afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mHasCompatScaling = false; 530885d82d4274170873919660550c28df9ee14ca1bRomain Guy mCompatScaling = 1; 531885d82d4274170873919660550c28df9ee14ca1bRomain Guy mInvCompatScaling = 1; 532885d82d4274170873919660550c28df9ee14ca1bRomain Guy 533da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio mBidiFlags = BIDI_DEFAULT_LTR; 534fee44846376c212114223fc4259382921e6dca7aRoozbeh Pournader setTextLocales(LocaleList.getAdjustedDefault()); 53553c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien setElegantTextHeight(false); 536805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod mFontFeatureSettings = null; 537425e719c462edbedd66ccec14667357ab409a483Roozbeh Pournader mFontVariationSettings = null; 538538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader 539538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerRadius = 0.0f; 540538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerDx = 0.0f; 541538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerDy = 0.0f; 542538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerColor = 0; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 544051910b9f998030dacb8a0722588cc715813fde1Raph Levien 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy the fields from src into this paint. This is equivalent to calling 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * get() on all of the src fields, and calling the corresponding set() 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods on this. 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Paint src) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this != src) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // copy over the native settings 553dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSet(mNativePaint, src.mNativePaint); 554bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey setClassVariablesFrom(src); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 558bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey /** 559bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey * Set all class variables using current values from the given 560bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey * {@link Paint}. 561bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey */ 562bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey private void setClassVariablesFrom(Paint paint) { 563bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mColorFilter = paint.mColorFilter; 564bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mMaskFilter = paint.mMaskFilter; 565bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mPathEffect = paint.mPathEffect; 566dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger mShader = paint.mShader; 567dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger mNativeShader = paint.mNativeShader; 568bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mTypeface = paint.mTypeface; 569a033630e805c407080221e20b236b6054f324670Raph Levien mNativeTypeface = paint.mNativeTypeface; 570bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mXfermode = paint.mXfermode; 571bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey 572bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mHasCompatScaling = paint.mHasCompatScaling; 573bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mCompatScaling = paint.mCompatScaling; 574bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey mInvCompatScaling = paint.mInvCompatScaling; 575bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey 576da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio mBidiFlags = paint.mBidiFlags; 577a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader mLocales = paint.mLocales; 578805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod mFontFeatureSettings = paint.mFontFeatureSettings; 579425e719c462edbedd66ccec14667357ab409a483Roozbeh Pournader mFontVariationSettings = paint.mFontVariationSettings; 580538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader 581538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerRadius = paint.mShadowLayerRadius; 582538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerDx = paint.mShadowLayerDx; 583538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerDy = paint.mShadowLayerDy; 584538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerColor = paint.mShadowLayerColor; 585538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader } 586538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader 587538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader /** 588538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader * Returns true if all attributes are equal. 589538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader * 590538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader * The caller is expected to have checked the trivial cases, like the pointers being equal, 591538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader * the objects having different classes, or the parameter being null. 592538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader * @hide 593538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader */ 594538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader public boolean hasEqualAttributes(@NonNull Paint other) { 595538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader return mColorFilter == other.mColorFilter 596538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mMaskFilter == other.mMaskFilter 597538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mPathEffect == other.mPathEffect 598538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mShader == other.mShader 599538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mTypeface == other.mTypeface 600538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mXfermode == other.mXfermode 601538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mHasCompatScaling == other.mHasCompatScaling 602538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mCompatScaling == other.mCompatScaling 603538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mInvCompatScaling == other.mInvCompatScaling 604538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mBidiFlags == other.mBidiFlags 605538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mLocales.equals(other.mLocales) 606538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && TextUtils.equals(mFontFeatureSettings, other.mFontFeatureSettings) 607538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && TextUtils.equals(mFontVariationSettings, other.mFontVariationSettings) 608538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mShadowLayerRadius == other.mShadowLayerRadius 609538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mShadowLayerDx == other.mShadowLayerDx 610538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mShadowLayerDy == other.mShadowLayerDy 611538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && mShadowLayerColor == other.mShadowLayerColor 612538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getFlags() == other.getFlags() 613538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getHinting() == other.getHinting() 614538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getStyle() == other.getStyle() 615538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getColor() == other.getColor() 616538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getStrokeWidth() == other.getStrokeWidth() 617538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getStrokeMiter() == other.getStrokeMiter() 618538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getStrokeCap() == other.getStrokeCap() 619538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getStrokeJoin() == other.getStrokeJoin() 620538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getTextAlign() == other.getTextAlign() 621538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && isElegantTextHeight() == other.isElegantTextHeight() 622538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getTextSize() == other.getTextSize() 623538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getTextScaleX() == other.getTextScaleX() 624538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getTextSkewX() == other.getTextSkewX() 625538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getLetterSpacing() == other.getLetterSpacing() 626538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getWordSpacing() == other.getWordSpacing() 627538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader && getHyphenEdit() == other.getHyphenEdit(); 628bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey } 629bb66c21f01b42f533878613f57d5894817c32c93Jeff Sharkey 630afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn /** @hide */ 631afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn public void setCompatibilityScaling(float factor) { 632afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (factor == 1.0) { 633afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mHasCompatScaling = false; 634afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mCompatScaling = mInvCompatScaling = 1.0f; 635afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } else { 636afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mHasCompatScaling = true; 637afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mCompatScaling = factor; 638afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn mInvCompatScaling = 1.0f/factor; 639afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 640afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 641f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt 642f47d7405bbcb25d7cdf89ebb059f41520fe9ab87Doug Felt /** 643dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger * Return the pointer to the native object while ensuring that any 644dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger * mutable objects that are attached to the paint are also up-to-date. 645dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger * 646dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger * @hide 647dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger */ 648dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger public long getNativeInstance() { 6496170cd1f351d8a8e6833137a3de8d2b949f989a3Chris Craik long newNativeShader = mShader == null ? 0 : mShader.getNativeInstance(); 6506170cd1f351d8a8e6833137a3de8d2b949f989a3Chris Craik if (newNativeShader != mNativeShader) { 6516170cd1f351d8a8e6833137a3de8d2b949f989a3Chris Craik mNativeShader = newNativeShader; 652dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetShader(mNativePaint, mNativeShader); 653dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger } 6546097eca72134034fcc6086c110673b5df94913b0Chris Craik long newNativeColorFilter = mColorFilter == null ? 0 : mColorFilter.getNativeInstance(); 6556097eca72134034fcc6086c110673b5df94913b0Chris Craik if (newNativeColorFilter != mNativeColorFilter) { 6566097eca72134034fcc6086c110673b5df94913b0Chris Craik mNativeColorFilter = newNativeColorFilter; 6576097eca72134034fcc6086c110673b5df94913b0Chris Craik nSetColorFilter(mNativePaint, mNativeColorFilter); 6586097eca72134034fcc6086c110673b5df94913b0Chris Craik } 659dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger return mNativePaint; 660dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger } 661dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger 662dfba4d3d11bbf47dff45f94d61d4d97510b3034aDerek Sollenberger /** 663da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Return the bidi flags on the paint. 664051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 665da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @return the bidi flags on the paint 666da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 667da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 668da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public int getBidiFlags() { 669da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio return mBidiFlags; 670da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio } 671da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 672da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 673da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * Set the bidi flags on the paint. 674da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 675da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 676da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public void setBidiFlags(int flags) { 677da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio // only flag value is the 3-bit BIDI control setting 678da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio flags &= BIDI_FLAG_MASK; 679da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio if (flags > BIDI_MAX_FLAG_VALUE) { 680da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio throw new IllegalArgumentException("unknown bidi flag: " + flags); 681da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio } 682da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio mBidiFlags = flags; 683da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio } 684da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio 685da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio /** 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's flags. Use the Flag enum to test flag values. 687051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's flags (see enums ending in _Flag for bit masks) 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 690dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public int getFlags() { 691dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetFlags(mNativePaint); 692dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 693dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's flags. Use the Flag enum to specific flag values. 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags The new flag bits for the paint 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setFlags(int flags) { 700dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetFlags(mNativePaint, flags); 701dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 702dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 704f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn * Return the paint's hinting mode. Returns either 705f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn * {@link #HINTING_OFF} or {@link #HINTING_ON}. 706f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn */ 707dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public int getHinting() { 708dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetHinting(mNativePaint); 709dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 710dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 711f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn /** 712f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn * Set the paint's hinting mode. May be either 713f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn * {@link #HINTING_OFF} or {@link #HINTING_ON}. 714f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn */ 715dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setHinting(int mode) { 716dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetHinting(mNativePaint, mode); 717dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 718dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 719f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn /** 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if ANTI_ALIAS_FLAG bit is set 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AntiAliasing smooths out the edges of what is being drawn, but is has 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no impact on the interior of the shape. See setDither() and 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setFilterBitmap() to affect how colors are treated. 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the antialias bit is set in the paint's flags. 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isAntiAlias() { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & ANTI_ALIAS_FLAG) != 0; 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 730051910b9f998030dacb8a0722588cc715813fde1Raph Levien 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the ANTI_ALIAS_FLAG bit 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AntiAliasing smooths out the edges of what is being drawn, but is has 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no impact on the interior of the shape. See setDither() and 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setFilterBitmap() to affect how colors are treated. 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param aa true to set the antialias bit in the flags, false to clear it 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setAntiAlias(boolean aa) { 740dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetAntiAlias(mNativePaint, aa); 741dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 742dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if DITHER_FLAG bit is set 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dithering affects how colors that are higher precision than the device 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are down-sampled. No dithering is generally faster, but higher precision 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * colors are just truncated down (e.g. 8888 -> 565). Dithering tries to 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distribute the error inherent in this process, to reduce the visual 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * artifacts. 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the dithering bit is set in the paint's flags. 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isDither() { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & DITHER_FLAG) != 0; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 756051910b9f998030dacb8a0722588cc715813fde1Raph Levien 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the DITHER_FLAG bit 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dithering affects how colors that are higher precision than the device 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are down-sampled. No dithering is generally faster, but higher precision 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * colors are just truncated down (e.g. 8888 -> 565). Dithering tries to 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distribute the error inherent in this process, to reduce the visual 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * artifacts. 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dither true to set the dithering bit in flags, false to clear it 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 767dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setDither(boolean dither) { 768dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetDither(mNativePaint, dither); 769dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 770dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if LINEAR_TEXT_FLAG bit is set 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the lineartext bit is set in the paint's flags 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isLinearText() { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & LINEAR_TEXT_FLAG) != 0; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the LINEAR_TEXT_FLAG bit 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linearText true to set the linearText bit in the paint's flags, 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false to clear it. 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 786dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setLinearText(boolean linearText) { 787dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetLinearText(mNativePaint, linearText); 788dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 789dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if SUBPIXEL_TEXT_FLAG bit is set 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the subpixel bit is set in the paint's flags 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isSubpixelText() { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & SUBPIXEL_TEXT_FLAG) != 0; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 798051910b9f998030dacb8a0722588cc715813fde1Raph Levien 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the SUBPIXEL_TEXT_FLAG bit 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param subpixelText true to set the subpixelText bit in the paint's 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags, false to clear it. 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 805dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setSubpixelText(boolean subpixelText) { 806dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetSubpixelText(mNativePaint, subpixelText); 807dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 808dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if UNDERLINE_TEXT_FLAG bit is set 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the underlineText bit is set in the paint's flags. 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isUnderlineText() { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & UNDERLINE_TEXT_FLAG) != 0; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader * Distance from top of the underline to the baseline. Positive values mean below the baseline. 820fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader * This method returns where the underline should be drawn independent of if the underlineText 821fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader * bit is set at the moment. 822fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader * @hide 823fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader */ 824fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader public float getUnderlinePosition() { 825ca8a04a36640eb227a556ad9ced925c48ced2495Roozbeh Pournader return nGetUnderlinePosition(mNativePaint, mNativeTypeface); 826fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader } 827fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader 828fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader /** 829fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader * @hide 830fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader */ 831fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader public float getUnderlineThickness() { 832ca8a04a36640eb227a556ad9ced925c48ced2495Roozbeh Pournader return nGetUnderlineThickness(mNativePaint, mNativeTypeface); 833fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader } 834fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader 835fd8c22d513d92d547f883efc45a3dbcd9558f90aRoozbeh Pournader /** 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the UNDERLINE_TEXT_FLAG bit 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param underlineText true to set the underlineText bit in the paint's 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags, false to clear it. 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 841dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setUnderlineText(boolean underlineText) { 842dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetUnderlineText(mNativePaint, underlineText); 843dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 844dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if STRIKE_THRU_TEXT_FLAG bit is set 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the strikeThruText bit is set in the paint's flags. 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isStrikeThruText() { 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & STRIKE_THRU_TEXT_FLAG) != 0; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8551378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader * Distance from top of the strike-through line to the baseline. Negative values mean above the 8561378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader * baseline. This method returns where the strike-through line should be drawn independent of if 8571378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader * the strikeThruText bit is set at the moment. 8581378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader * @hide 8591378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader */ 8601378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader public float getStrikeThruPosition() { 8611378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader return nGetStrikeThruPosition(mNativePaint, mNativeTypeface); 8621378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader } 8631378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader 8641378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader /** 8651378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader * @hide 8661378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader */ 8671378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader public float getStrikeThruThickness() { 8681378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader return nGetStrikeThruThickness(mNativePaint, mNativeTypeface); 8691378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader } 8701378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader 8711378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader /** 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param strikeThruText true to set the strikeThruText bit in the paint's 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags, false to clear it. 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 877dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setStrikeThruText(boolean strikeThruText) { 878dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetStrikeThruText(mNativePaint, strikeThruText); 879dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 880dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for getFlags(), returning true if FAKE_BOLD_TEXT_FLAG bit is set 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the fakeBoldText bit is set in the paint's flags. 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isFakeBoldText() { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & FAKE_BOLD_TEXT_FLAG) != 0; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 89127c1d4debb3848f5accd5673fffeeacad3e61648Chet Haase * Helper for setFlags(), setting or clearing the FAKE_BOLD_TEXT_FLAG bit 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fakeBoldText true to set the fakeBoldText bit in the paint's 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags, false to clear it. 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 896dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setFakeBoldText(boolean fakeBoldText) { 897dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetFakeBoldText(mNativePaint, fakeBoldText); 898dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 899dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether or not the bitmap filter is activated. 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Filtering affects the sampling of bitmaps when they are transformed. 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Filtering does not affect how the colors in the bitmap are converted into 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device pixels. That is dependent on dithering and xfermodes. 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setFilterBitmap(boolean) setFilterBitmap() 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isFilterBitmap() { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getFlags() & FILTER_BITMAP_FLAG) != 0; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 911051910b9f998030dacb8a0722588cc715813fde1Raph Levien 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper for setFlags(), setting or clearing the FILTER_BITMAP_FLAG bit. 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Filtering affects the sampling of bitmaps when they are transformed. 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Filtering does not affect how the colors in the bitmap are converted into 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device pixels. That is dependent on dithering and xfermodes. 917051910b9f998030dacb8a0722588cc715813fde1Raph Levien * 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param filter true to set the FILTER_BITMAP_FLAG bit in the paint's 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags, false to clear it. 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 921dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setFilterBitmap(boolean filter) { 922dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetFilterBitmap(mNativePaint, filter); 923dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 924dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's style, used for controlling how primitives' 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * geometries are interpreted (except for drawBitmap, which always assumes 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FILL_STYLE). 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's style setting (Fill, Stroke, StrokeAndFill) 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Style getStyle() { 933dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return sStyleArray[nGetStyle(mNativePaint)]; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's style, used for controlling how primitives' 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * geometries are interpreted (except for drawBitmap, which always assumes 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Fill). 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param style The new style to set in the paint 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStyle(Style style) { 944dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetStyle(mNativePaint, style.nativeInt); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's color. Note that the color is a 32bit value 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing alpha as well as r,g,b. This 32bit value is not premultiplied, 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * meaning that its alpha can be any value, regardless of the values of 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * r,g,b. See the Color class for more details. 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's color (and alpha). 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 95580756e38882720860db52f1fcc21fa1505a02abfTor Norbye @ColorInt 956dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public int getColor() { 957dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetColor(mNativePaint); 958dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 959dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's color. Note that the color is an int containing alpha 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as well as r,g,b. This 32bit value is not premultiplied, meaning that 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its alpha can be any value, regardless of the values of r,g,b. 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the Color class for more details. 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color The new color (including alpha) to set in the paint. 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 968dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setColor(@ColorInt int color) { 969dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetColor(mNativePaint, color); 970dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 971dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper to getColor() that just returns the color's alpha value. This is 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same as calling getColor() >>> 24. It always returns a value between 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 (completely transparent) and 255 (completely opaque). 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the alpha component of the paint's color. 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 979dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public int getAlpha() { 980dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetAlpha(mNativePaint); 981dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 982dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper to setColor(), that only assigns the color's alpha value, 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * leaving its r,g,b values unchanged. Results are undefined if the alpha 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value is outside of the range [0..255] 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a set the alpha component [0..255] of the paint's color. 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 990dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setAlpha(int a) { 991dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetAlpha(mNativePaint, a); 992dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 993dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper to setColor(), that takes a,r,g,b and constructs the color int 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The new alpha component (0..255) of the paint's color. 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The new red component (0..255) of the paint's color. 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param g The new green component (0..255) of the paint's color. 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b The new blue component (0..255) of the paint's color. 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setARGB(int a, int r, int g, int b) { 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setColor((a << 24) | (r << 16) | (g << 8) | b); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the width for stroking. 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A value of 0 strokes in hairline mode. 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hairlines always draws a single pixel independent of the canva's matrix. 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's stroke width, used whenever the paint's style is 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stroke or StrokeAndFill. 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1015dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float getStrokeWidth() { 1016dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetStrokeWidth(mNativePaint); 1017dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1018dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the width for stroking. 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass 0 to stroke in hairline mode. 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hairlines always draws a single pixel independent of the canva's matrix. 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width set the paint's stroke width, used whenever the paint's 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * style is Stroke or StrokeAndFill. 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1027dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setStrokeWidth(float width) { 1028dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetStrokeWidth(mNativePaint, width); 1029dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1030dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's stroke miter value. Used to control the behavior 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of miter joins when the joins angle is sharp. 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's miter limit, used whenever the paint's style is 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stroke or StrokeAndFill. 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1038dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float getStrokeMiter() { 1039dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetStrokeMiter(mNativePaint); 1040dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1041dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's stroke miter value. This is used to control the behavior 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of miter joins when the joins angle is sharp. This value must be >= 0. 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param miter set the miter limit on the paint, used whenever the paint's 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * style is Stroke or StrokeAndFill. 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1049dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setStrokeMiter(float miter) { 1050dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetStrokeMiter(mNativePaint, miter); 1051dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1052dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's Cap, controlling how the start and end of stroked 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lines and paths are treated. 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line cap style for the paint, used whenever the paint's 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * style is Stroke or StrokeAndFill. 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Cap getStrokeCap() { 1061dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return sCapArray[nGetStrokeCap(mNativePaint)]; 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's Cap. 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cap set the paint's line cap style, used whenever the paint's 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * style is Stroke or StrokeAndFill. 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStrokeCap(Cap cap) { 1071dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetStrokeCap(mNativePaint, cap.nativeInt); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's stroke join type. 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's Join. 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Join getStrokeJoin() { 1080dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return sJoinArray[nGetStrokeJoin(mNativePaint)]; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's Join. 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param join set the paint's Join, used whenever the paint's style is 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stroke or StrokeAndFill. 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStrokeJoin(Join join) { 1090dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetStrokeJoin(mNativePaint, join.nativeInt); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applies any/all effects (patheffect, stroking) to src, returning the 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result in dst. The result is that drawing src with this paint will be 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same as drawing dst with a default paint (at least from the 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * geometric perspective). 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src input path 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst output path (may be the same as src) 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the path should be filled, or false if it should be 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawn with a hairline (width == 0) 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getFillPath(Path src, Path dst) { 1105a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv return nGetFillPath(mNativePaint, src.readOnlyNI(), dst.mutateNI()); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the paint's shader object. 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's shader (or null) 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Shader getShader() { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShader; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the shader object. 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass null to clear any previous shader. 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As a convenience, the parameter passed is also returned. 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param shader May be null. the new shader to be installed in the paint 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return shader 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Shader setShader(Shader shader) { 1127dfb8cb4580aef56a1f1e286389cdddf24c96792bWinson // If mShader changes, cached value of native shader aren't valid, since 1128dfb8cb4580aef56a1f1e286389cdddf24c96792bWinson // old shader's pointer may be reused by another shader allocation later 1129dfb8cb4580aef56a1f1e286389cdddf24c96792bWinson if (mShader != shader) { 1130dfb8cb4580aef56a1f1e286389cdddf24c96792bWinson mNativeShader = -1; 1131fbff7117abac7a335c6bc2e2f8b927a8dac5753eJohn Reck // Release any native references to the old shader content 1132fbff7117abac7a335c6bc2e2f8b927a8dac5753eJohn Reck nSetShader(mNativePaint, 0); 1133dfb8cb4580aef56a1f1e286389cdddf24c96792bWinson } 1134f4242b107caa1b760304dc9ea547206c391bc05eDerek Sollenberger // Defer setting the shader natively until getNativeInstance() is called 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShader = shader; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return shader; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the paint's colorfilter (maybe be null). 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's colorfilter (maybe be null) 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ColorFilter getColorFilter() { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mColorFilter; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the paint's colorfilter, returning the parameter. 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param filter May be null. The new filter to be installed in the paint 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return filter 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ColorFilter setColorFilter(ColorFilter filter) { 11556097eca72134034fcc6086c110673b5df94913b0Chris Craik // If mColorFilter changes, cached value of native shader aren't valid, since 11566097eca72134034fcc6086c110673b5df94913b0Chris Craik // old shader's pointer may be reused by another shader allocation later 11576097eca72134034fcc6086c110673b5df94913b0Chris Craik if (mColorFilter != filter) { 11586097eca72134034fcc6086c110673b5df94913b0Chris Craik mNativeColorFilter = -1; 11596097eca72134034fcc6086c110673b5df94913b0Chris Craik } 11606097eca72134034fcc6086c110673b5df94913b0Chris Craik 11616097eca72134034fcc6086c110673b5df94913b0Chris Craik // Defer setting the filter natively until getNativeInstance() is called 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColorFilter = filter; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return filter; 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1167c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * Get the paint's transfer mode object. 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1169c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * @return the paint's transfer mode (or null) 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Xfermode getXfermode() { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mXfermode; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1176c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * Set or clear the transfer mode object. A transfer mode defines how 1177c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * source pixels (generate by a drawing command) are composited with 1178c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * the destination pixels (content of the render target). 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 1180c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * Pass null to clear any previous transfer mode. 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As a convenience, the parameter passed is also returned. 1182c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * <p /> 1183c7dacca00828e586ce4496d83a25a4d60a6fb60fRomain Guy * {@link PorterDuffXfermode} is the most common transfer mode. 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param xfermode May be null. The xfermode to be installed in the paint 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return xfermode 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Xfermode setXfermode(Xfermode xfermode) { 11895d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck int newMode = xfermode != null ? xfermode.porterDuffMode : Xfermode.DEFAULT; 11905d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck int curMode = mXfermode != null ? mXfermode.porterDuffMode : Xfermode.DEFAULT; 11915d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck if (newMode != curMode) { 11925d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck nSetXfermode(mNativePaint, newMode); 11935d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mXfermode = xfermode; 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return xfermode; 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the paint's patheffect object. 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's patheffect (or null) 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PathEffect getPathEffect() { 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPathEffect; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the patheffect object. 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass null to clear any previous patheffect. 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As a convenience, the parameter passed is also returned. 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param effect May be null. The patheffect to be installed in the paint 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return effect 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PathEffect setPathEffect(PathEffect effect) { 121736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long effectNative = 0; 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (effect != null) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project effectNative = effect.native_instance; 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1221dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetPathEffect(mNativePaint, effectNative); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPathEffect = effect; 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return effect; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the paint's maskfilter object. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's maskfilter (or null) 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MaskFilter getMaskFilter() { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMaskFilter; 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the maskfilter object. 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass null to clear any previous maskfilter. 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As a convenience, the parameter passed is also returned. 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param maskfilter May be null. The maskfilter to be installed in the 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paint 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return maskfilter 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MaskFilter setMaskFilter(MaskFilter maskfilter) { 124636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long maskfilterNative = 0; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maskfilter != null) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maskfilterNative = maskfilter.native_instance; 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1250dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetMaskFilter(mNativePaint, maskfilterNative); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaskFilter = maskfilter; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return maskfilter; 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the paint's typeface object. 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The typeface object identifies which font to use when drawing or 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measuring text. 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's typeface (or null) 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Typeface getTypeface() { 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTypeface; 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the typeface object. 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass null to clear any previous typeface. 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As a convenience, the parameter passed is also returned. 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param typeface May be null. The typeface to be installed in the paint 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return typeface 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Typeface setTypeface(Typeface typeface) { 127736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long typefaceNative = 0; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (typeface != null) { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typefaceNative = typeface.native_instance; 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1281dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetTypeface(mNativePaint, typefaceNative); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTypeface = typeface; 1283a033630e805c407080221e20b236b6054f324670Raph Levien mNativeTypeface = typefaceNative; 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return typeface; 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12863c35b57cbbc1b20d609753f24677a305bff88f29Mike Reed 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the paint's rasterizer (or null). 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The raster controls/modifies how paths/text are turned into alpha masks. 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's rasterizer (or null) 12933c35b57cbbc1b20d609753f24677a305bff88f29Mike Reed * 1294dcc3630100b406e4e6cb18f00d39059690153292Derek Sollenberger * @deprecated Rasterizer is not supported by either the HW or PDF backends. 1295dcc3630100b406e4e6cb18f00d39059690153292Derek Sollenberger * @removed 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12973c35b57cbbc1b20d609753f24677a305bff88f29Mike Reed @Deprecated 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rasterizer getRasterizer() { 1299dcc3630100b406e4e6cb18f00d39059690153292Derek Sollenberger return null; 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set or clear the rasterizer object. 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass null to clear any previous rasterizer. 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As a convenience, the parameter passed is also returned. 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rasterizer May be null. The new rasterizer to be installed in 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the paint. 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return rasterizer 13113c35b57cbbc1b20d609753f24677a305bff88f29Mike Reed * 1312dcc3630100b406e4e6cb18f00d39059690153292Derek Sollenberger * @deprecated Rasterizer is not supported by either the HW or PDF backends. 1313dcc3630100b406e4e6cb18f00d39059690153292Derek Sollenberger * @removed 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13153c35b57cbbc1b20d609753f24677a305bff88f29Mike Reed @Deprecated 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rasterizer setRasterizer(Rasterizer rasterizer) { 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rasterizer; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13193c35b57cbbc1b20d609753f24677a305bff88f29Mike Reed 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1321694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * This draws a shadow layer below the main layer, with the specified 1322694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * offset and color, and blur radius. If radius is 0, then the shadow 1323694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * layer is removed. 1324d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * <p> 1325d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * Can be used to create a blurred shadow underneath text. Support for use 1326d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * with other drawing operations is constrained to the software rendering 1327d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * pipeline. 1328d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * <p> 1329d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * The alpha of the shadow will be the paint's alpha if the shadow color is 1330d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik * opaque, or the alpha from the shadow color if not. 1331d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik */ 1332d1d7389880225f126abcc2a268ab62cce97a92a5Chris Craik public void setShadowLayer(float radius, float dx, float dy, int shadowColor) { 1333538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerRadius = radius; 1334538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerDx = dx; 1335538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerDy = dy; 1336538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader mShadowLayerColor = shadowColor; 1337dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetShadowLayer(mNativePaint, radius, dx, dy, shadowColor); 13381e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1341694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * Clear the shadow layer. 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearShadowLayer() { 1344c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger setShadowLayer(0, 0, 0, 0); 1345c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 1346c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 1347c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger /** 1348c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger * Checks if the paint has a shadow layer attached 1349c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger * 1350c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger * @return true if the paint has a shadow layer attached and false otherwise 1351c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger * @hide 1352c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger */ 1353c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger public boolean hasShadowLayer() { 1354dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nHasShadowLayer(mNativePaint); 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's Align value for drawing text. This controls how the 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text is positioned relative to its origin. LEFT align means that all of 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the text will be drawn to the right of its origin (i.e. the origin 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifieds the LEFT edge of the text) and so on. 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's Align value for drawing text. 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Align getTextAlign() { 1366dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return sAlignArray[nGetTextAlign(mNativePaint)]; 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's text alignment. This controls how the 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text is positioned relative to its origin. LEFT align means that all of 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the text will be drawn to the right of its origin (i.e. the origin 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifieds the LEFT edge of the text) and so on. 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param align set the paint's Align value for drawing text. 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextAlign(Align align) { 1378dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetTextAlign(mNativePaint, align.nativeInt); 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1382a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * Get the text's primary Locale. Note that this is not all of the locale-related information 1383a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * Paint has. Use {@link #getTextLocales()} to get the complete list. 1384517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio * 1385a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * @return the paint's primary Locale used for drawing text, never null. 1386517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio */ 1387a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader @NonNull 1388517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio public Locale getTextLocale() { 1389fee44846376c212114223fc4259382921e6dca7aRoozbeh Pournader return mLocales.get(0); 1390517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio } 1391517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio 1392517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio /** 1393a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * Get the text locale list. 1394517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio * 1395a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * @return the paint's LocaleList used for drawing text, never null or empty. 1396a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader */ 1397a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader @NonNull @Size(min=1) 1398a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader public LocaleList getTextLocales() { 1399a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader return mLocales; 1400a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader } 1401a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader 1402a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader /** 1403a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * Set the text locale list to a one-member list consisting of just the locale. 1404a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * 1405a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * See {@link #setTextLocales(LocaleList)} for how the locale list affects 1406a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * the way the text is drawn for some languages. 1407029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * 1408a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * @param locale the paint's locale value for drawing text, must not be null. 1409a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader */ 1410a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader public void setTextLocale(@NonNull Locale locale) { 1411a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader if (locale == null) { 1412a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader throw new IllegalArgumentException("locale cannot be null"); 1413a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader } 1414fee44846376c212114223fc4259382921e6dca7aRoozbeh Pournader if (mLocales != null && mLocales.size() == 1 && locale.equals(mLocales.get(0))) { 1415a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader return; 1416a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader } 1417a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader mLocales = new LocaleList(locale); 1418cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka syncTextLocalesWithMinikin(); 1419a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader } 1420a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader 1421a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader /** 1422a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * Set the text locale list. 1423a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * 1424a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * The text locale list affects how the text is drawn for some languages. 1425a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * 1426a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * For example, if the locale list contains {@link Locale#CHINESE} or {@link Locale#CHINA}, 1427029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * then the text renderer will prefer to draw text using a Chinese font. Likewise, 1428a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * if the locale list contains {@link Locale#JAPANESE} or {@link Locale#JAPAN}, then the text 1429a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * renderer will prefer to draw text using a Japanese font. If the locale list contains both, 1430a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * the order those locales appear in the list is considered for deciding the font. 1431029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * 1432029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * This distinction is important because Chinese and Japanese text both use many 1433029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * of the same Unicode code points but their appearance is subtly different for 1434029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * each language. 1435029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * 1436a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * By default, the text locale list is initialized to a one-member list just containing the 1437fee44846376c212114223fc4259382921e6dca7aRoozbeh Pournader * system locales. This assumes that the text to be rendered will most likely be in the user's 1438fee44846376c212114223fc4259382921e6dca7aRoozbeh Pournader * preferred language. 1439517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio * 1440a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * If the actual language or languages of the text is/are known, then they can be provided to 1441a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * the text renderer using this method. The text renderer may attempt to guess the 1442029b6330380a21787647ed9faa9aa2d6ee93da82Fabrice Di Meglio * language script based on the contents of the text to be drawn independent of 1443a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * the text locale here. Specifying the text locales just helps it do a better 1444a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * job in certain ambiguous cases. 1445517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio * 1446a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader * @param locales the paint's locale list for drawing text, must not be null or empty. 1447517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio */ 1448a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader public void setTextLocales(@NonNull @Size(min=1) LocaleList locales) { 1449a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader if (locales == null || locales.isEmpty()) { 1450a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader throw new IllegalArgumentException("locales cannot be null or empty"); 1451517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio } 1452a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader if (locales.equals(mLocales)) return; 1453a23748a9ff9ddc8b490fc31752afa9b955d5e156Roozbeh Pournader mLocales = locales; 1454cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka syncTextLocalesWithMinikin(); 1455cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka } 1456cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka 1457cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka private void syncTextLocalesWithMinikin() { 1458cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka final String languageTags = mLocales.toLanguageTags(); 1459cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka final Integer minikinLangListId; 1460cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka synchronized (sCacheLock) { 1461cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka minikinLangListId = sMinikinLangListIdCache.get(languageTags); 1462cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka if (minikinLangListId == null) { 1463cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka final int newID = nSetTextLocales(mNativePaint, languageTags); 1464cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka sMinikinLangListIdCache.put(languageTags, newID); 1465cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka return; 1466cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka } 1467cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka } 1468cfc607cf57d453f977c9c4bf09b41ac481c4bbecSeigo Nonaka nSetTextLocalesByMinikinLangListId(mNativePaint, minikinLangListId.intValue()); 1469517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio } 1470517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio 1471517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio /** 147253c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * Get the elegant metrics flag. 147353c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * 147453c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * @return true if elegant metrics are enabled for text drawing. 147553c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien */ 1476dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public boolean isElegantTextHeight() { 1477dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nIsElegantTextHeight(mNativePaint); 1478dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1479dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 148053c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien /** 148153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * Set the paint's elegant height metrics flag. This setting selects font 148253c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * variants that have not been compacted to fit Latin-based vertical 148353c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * metrics, and also increases top and bottom bounds to provide more space. 148453c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * 148553c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien * @param elegant set the paint's elegant metrics flag for drawing text. 148653c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien */ 1487dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setElegantTextHeight(boolean elegant) { 1488dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetElegantTextHeight(mNativePaint, elegant); 1489dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1490dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 149153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien /** 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's text size. 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14945f052561063597043938d69064872a209ace8ffaMark Lu * @return the paint's text size in pixel units. 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1496dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float getTextSize() { 1497dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetTextSize(mNativePaint); 1498dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1499dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's text size. This value must be > 0 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15035f052561063597043938d69064872a209ace8ffaMark Lu * @param textSize set the paint's text size in pixel units. 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1505dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setTextSize(float textSize) { 1506dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetTextSize(mNativePaint, textSize); 1507dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1508dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's horizontal scale factor for text. The default value 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is 1.0. 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's scale factor in X for drawing/measuring text 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1515dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float getTextScaleX() { 1516dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetTextScaleX(mNativePaint); 1517dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1518dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's horizontal scale factor for text. The default value 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is 1.0. Values > 1.0 will stretch the text wider. Values < 1.0 will 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stretch the text narrower. 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param scaleX set the paint's scale in X for drawing/measuring text. 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1526dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setTextScaleX(float scaleX) { 1527dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetTextScaleX(mNativePaint, scaleX); 1528dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1529dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the paint's horizontal skew factor for text. The default value 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is 0. 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the paint's skew factor in X for drawing text. 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1536dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float getTextSkewX() { 1537dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetTextSkewX(mNativePaint); 1538dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1539dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the paint's horizontal skew factor for text. The default value 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is 0. For approximating oblique text, use values around -0.25. 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param skewX set the paint's skew factor in X for drawing text. 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1546dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public void setTextSkewX(float skewX) { 1547dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetTextSkewX(mNativePaint, skewX); 1548dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1549dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1551fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * Return the paint's letter-spacing for text. The default value 1552fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * is 0. 1553fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * 1554fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * @return the paint's letter-spacing for drawing text. 1555fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod */ 1556fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod public float getLetterSpacing() { 1557dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetLetterSpacing(mNativePaint); 1558fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod } 1559fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod 1560fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod /** 1561fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * Set the paint's letter-spacing for text. The default value 1562fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * is 0. The value is in 'EM' units. Typical values for slight 1563fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * expansion will be around 0.05. Negative values tighten text. 1564fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * 1565fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod * @param letterSpacing set the paint's letter-spacing for drawing text. 1566fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod */ 1567fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod public void setLetterSpacing(float letterSpacing) { 1568dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetLetterSpacing(mNativePaint, letterSpacing); 1569fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod } 1570fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod 1571fa80f7491df82d71b7084500519a2195afbea706Behdad Esfahbod /** 1572219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * Return the paint's word-spacing for text. The default value is 0. 1573219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * 1574219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * @return the paint's word-spacing for drawing text. 1575219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * @hide 1576219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka */ 1577219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka public float getWordSpacing() { 1578219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka return nGetWordSpacing(mNativePaint); 1579219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka } 1580219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka 1581219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka /** 1582219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * Set the paint's word-spacing for text. The default value is 0. 1583219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * The value is in pixels (note the units are not the same as for 1584219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * letter-spacing). 1585219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * 1586219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * @param wordSpacing set the paint's word-spacing for drawing text. 1587219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka * @hide 1588219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka */ 1589219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka public void setWordSpacing(float wordSpacing) { 1590219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka nSetWordSpacing(mNativePaint, wordSpacing); 1591219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka } 1592219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka 1593219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka /** 15940925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * Returns the font feature settings. The format is the same as the CSS 15950925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * font-feature-settings attribute: 1596317029aecc50a53aa1b9cc88422d316f7b893526Siyamed Sinir * <a href="https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop"> 1597317029aecc50a53aa1b9cc88422d316f7b893526Siyamed Sinir * https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop</a> 1598805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod * 15990925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * @return the paint's currently set font feature settings. Default is null. 16000925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * 16010925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * @see #setFontFeatureSettings(String) 1602805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod */ 1603805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod public String getFontFeatureSettings() { 1604805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod return mFontFeatureSettings; 1605805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod } 1606805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod 1607805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod /** 1608805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod * Set font feature settings. 1609805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod * 1610805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod * The format is the same as the CSS font-feature-settings attribute: 1611317029aecc50a53aa1b9cc88422d316f7b893526Siyamed Sinir * <a href="https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop"> 1612317029aecc50a53aa1b9cc88422d316f7b893526Siyamed Sinir * https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop</a> 16130925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * 16140925f40372cb140fd9e2a55ec0b5c645e90f3b84Siyamed Sinir * @see #getFontFeatureSettings() 1615805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod * 1616805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod * @param settings the font feature settings string to use, may be null. 1617805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod */ 1618805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod public void setFontFeatureSettings(String settings) { 1619e9ad3931fae71c8a8cd000fd52d5df4be79b0895Behdad Esfahbod if (settings != null && settings.equals("")) { 1620805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod settings = null; 1621e9ad3931fae71c8a8cd000fd52d5df4be79b0895Behdad Esfahbod } 1622805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod if ((settings == null && mFontFeatureSettings == null) 1623e9ad3931fae71c8a8cd000fd52d5df4be79b0895Behdad Esfahbod || (settings != null && settings.equals(mFontFeatureSettings))) { 1624e9ad3931fae71c8a8cd000fd52d5df4be79b0895Behdad Esfahbod return; 1625e9ad3931fae71c8a8cd000fd52d5df4be79b0895Behdad Esfahbod } 1626805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod mFontFeatureSettings = settings; 1627dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetFontFeatureSettings(mNativePaint, settings); 1628805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod } 1629805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod 1630805f6ebf17e2791624bb1a30834b4c1cc65583bfBehdad Esfahbod /** 16319ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka * Returns the font variation settings. 16329ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka * 16339ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka * @return the paint's currently set font variation settings. Default is null. 16349ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka * 16359ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka * @see #setFontVariationSettings(String) 16369ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka */ 16379ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka public String getFontVariationSettings() { 16389ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka return mFontVariationSettings; 16399ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka } 16409ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka 16419ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka /** 164292009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * Sets TrueType or OpenType font variation settings. The settings string is constructed from 164392009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * multiple pairs of axis tag and style values. The axis tag must contain four ASCII characters 164492009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * and must be wrapped with single quotes (U+0027) or double quotes (U+0022). Axis strings that 164592009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * are longer or shorter than four characters, or contain characters outside of U+0020..U+007E 164692009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * are invalid. If a specified axis name is not defined in the font, the settings will be 164792009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * ignored. 164892009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * 164992009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * Examples, 165092009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <ul> 165192009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <li>Set font width to 150. 165292009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <pre> 165392009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <code> 165492009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * Paint paint = new Paint(); 165592009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * paint.setFontVariationSettings("'wdth' 150"); 165692009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </code> 165792009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </pre> 165892009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </li> 165992009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * 166092009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <li>Set the font slant to 20 degrees and ask for italic style. 166192009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <pre> 166292009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * <code> 166392009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * Paint paint = new Paint(); 166492009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * paint.setFontVariationSettings("'slnt' 20, 'ital' 1"); 166592009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </code> 166692009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </pre> 166792009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </li> 166892009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * </ul> 166992009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * 167092009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * @param fontVariationSettings font variation settings. You can pass null or empty string as 167192009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * no variation settings. 16729ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka * 16730763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka * @return true if the given settings is effective to at least one font file underlying this 16740763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka * typeface. This function also returns true for empty settings string. Otherwise 16750763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka * returns false 167692009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * 16770f07dd5b14e76695bbae758e948e00b86935232cSeigo Nonaka * @throws IllegalArgumentException If given string is not a valid font variation settings 16780f07dd5b14e76695bbae758e948e00b86935232cSeigo Nonaka * format 167992009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * 168092009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * @see #getFontVariationSettings() 168192009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka * @see FontVariationAxis 16829ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka */ 16830f07dd5b14e76695bbae758e948e00b86935232cSeigo Nonaka public boolean setFontVariationSettings(String fontVariationSettings) { 168492009445e06a83ef6bd87277b14e69ec26cdba39Seigo Nonaka final String settings = TextUtils.nullIfEmpty(fontVariationSettings); 16859ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka if (settings == mFontVariationSettings 16869ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka || (settings != null && settings.equals(mFontVariationSettings))) { 16870763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka return true; 16880763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka } 16890763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka 16900763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka if (settings == null || settings.length() == 0) { 16910763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka mFontVariationSettings = null; 16920763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka setTypeface(Typeface.createFromTypefaceWithVariation(mTypeface, 16930763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka Collections.emptyList())); 16940763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka return true; 16950763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka } 16960763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka 1697ffae6c7f71e9da9f887002994d270b9dbf6d0673Seigo Nonaka // The null typeface is valid and it is equivalent to Typeface.DEFAULT. 1698ffae6c7f71e9da9f887002994d270b9dbf6d0673Seigo Nonaka // To call isSupportedAxes method, use Typeface.DEFAULT instance. 1699ffae6c7f71e9da9f887002994d270b9dbf6d0673Seigo Nonaka Typeface targetTypeface = mTypeface == null ? Typeface.DEFAULT : mTypeface; 1700ff55115121a7a2753ba2265cb3201a3a14c0874dSeigo Nonaka FontVariationAxis[] axes = FontVariationAxis.fromFontVariationSettings(settings); 1701ff55115121a7a2753ba2265cb3201a3a14c0874dSeigo Nonaka final ArrayList<FontVariationAxis> filteredAxes = new ArrayList<FontVariationAxis>(); 1702ff55115121a7a2753ba2265cb3201a3a14c0874dSeigo Nonaka for (final FontVariationAxis axis : axes) { 1703ffae6c7f71e9da9f887002994d270b9dbf6d0673Seigo Nonaka if (targetTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) { 17040763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka filteredAxes.add(axis); 17050763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka } 17060763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka } 17070763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka if (filteredAxes.isEmpty()) { 17080763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka return false; 17099ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka } 17109ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka mFontVariationSettings = settings; 1711ffae6c7f71e9da9f887002994d270b9dbf6d0673Seigo Nonaka setTypeface(Typeface.createFromTypefaceWithVariation(targetTypeface, filteredAxes)); 17120763650a13dd1968f45e8e64950a32c6b508ce28Seigo Nonaka return true; 17139ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka } 17149ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka 17159ff994d98846d24bc488939af6e7dc440149a4bcSeigo Nonaka /** 1716210a189e226d5ce64f760d557efc6570409c8147Raph Levien * Get the current value of hyphen edit. 1717210a189e226d5ce64f760d557efc6570409c8147Raph Levien * 1718210a189e226d5ce64f760d557efc6570409c8147Raph Levien * @return the current hyphen edit value 1719210a189e226d5ce64f760d557efc6570409c8147Raph Levien * 1720210a189e226d5ce64f760d557efc6570409c8147Raph Levien * @hide 1721210a189e226d5ce64f760d557efc6570409c8147Raph Levien */ 1722210a189e226d5ce64f760d557efc6570409c8147Raph Levien public int getHyphenEdit() { 1723dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetHyphenEdit(mNativePaint); 1724210a189e226d5ce64f760d557efc6570409c8147Raph Levien } 1725210a189e226d5ce64f760d557efc6570409c8147Raph Levien 1726210a189e226d5ce64f760d557efc6570409c8147Raph Levien /** 1727210a189e226d5ce64f760d557efc6570409c8147Raph Levien * Set a hyphen edit on the paint (causes a hyphen to be added to text when 1728210a189e226d5ce64f760d557efc6570409c8147Raph Levien * measured or drawn). 1729210a189e226d5ce64f760d557efc6570409c8147Raph Levien * 173046c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * @param hyphen 0 for no edit, 1 for adding a hyphen at the end, etc. 173146c6f4c5ea7846fee4e6ef40c035ef2bee1adcbbRoozbeh Pournader * Definition of various values are in the HyphenEdit class in Minikin's Hyphenator.h. 1732210a189e226d5ce64f760d557efc6570409c8147Raph Levien * 1733210a189e226d5ce64f760d557efc6570409c8147Raph Levien * @hide 1734210a189e226d5ce64f760d557efc6570409c8147Raph Levien */ 1735210a189e226d5ce64f760d557efc6570409c8147Raph Levien public void setHyphenEdit(int hyphen) { 1736dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nSetHyphenEdit(mNativePaint, hyphen); 1737210a189e226d5ce64f760d557efc6570409c8147Raph Levien } 1738210a189e226d5ce64f760d557efc6570409c8147Raph Levien 1739210a189e226d5ce64f760d557efc6570409c8147Raph Levien /** 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the distance above (negative) the baseline (ascent) based on the 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current typeface and text size. 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the distance above (negative) the baseline (ascent) based on the 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current typeface and text size. 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1746dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float ascent() { 1747dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nAscent(mNativePaint, mNativeTypeface); 1748dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1749dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the distance below (positive) the baseline (descent) based on the 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current typeface and text size. 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the distance below (positive) the baseline (descent) based on 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current typeface and text size. 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1757dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float descent() { 1758dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nDescent(mNativePaint, mNativeTypeface); 1759dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1760dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class that describes the various metrics for a font at a given text size. 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remember, Y values increase going down, so those values will be positive, 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and values that measure distances going up will be negative. This class 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is returned by getFontMetrics(). 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class FontMetrics { 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1769051910b9f998030dacb8a0722588cc715813fde1Raph Levien * The maximum distance above the baseline for the tallest glyph in 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the font at a given text size. 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float top; 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The recommended distance above the baseline for singled spaced text. 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float ascent; 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The recommended distance below the baseline for singled spaced text. 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float descent; 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1782051910b9f998030dacb8a0722588cc715813fde1Raph Levien * The maximum distance below the baseline for the lowest glyph in 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the font at a given text size. 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float bottom; 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The recommended additional space to add between lines of text. 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float leading; 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1791051910b9f998030dacb8a0722588cc715813fde1Raph Levien 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the font's recommended interline spacing, given the Paint's 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings for typeface, textSize, etc. If metrics is not null, return the 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fontmetric values in it. 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param metrics If this object is not null, its fields are filled with 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the appropriate values given the paint's text attributes. 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the font's recommended interline spacing. 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1801dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public float getFontMetrics(FontMetrics metrics) { 1802dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetFontMetrics(mNativePaint, mNativeTypeface, metrics); 1803dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1804dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allocates a new FontMetrics object, and then calls getFontMetrics(fm) 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with it, returning the object. 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FontMetrics getFontMetrics() { 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FontMetrics fm = new FontMetrics(); 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getFontMetrics(fm); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fm; 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1814051910b9f998030dacb8a0722588cc715813fde1Raph Levien 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convenience method for callers that want to have FontMetrics values as 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integers. 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class FontMetricsInt { 18208b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase /** 18218b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * The maximum distance above the baseline for the tallest glyph in 18228b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * the font at a given text size. 18238b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase */ 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int top; 18258b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase /** 18268b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * The recommended distance above the baseline for singled spaced text. 18278b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase */ 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int ascent; 18298b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase /** 18308b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * The recommended distance below the baseline for singled spaced text. 18318b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase */ 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int descent; 18338b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase /** 18348b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * The maximum distance below the baseline for the lowest glyph in 18358b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * the font at a given text size. 18368b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase */ 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int bottom; 18388b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase /** 18398b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase * The recommended additional space to add between lines of text. 18408b9ed44f8d559be2590b25cb4b72d2aefd3b3784Chet Haase */ 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int leading; 1842051910b9f998030dacb8a0722588cc715813fde1Raph Levien 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public String toString() { 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "FontMetricsInt: top=" + top + " ascent=" + ascent + 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " descent=" + descent + " bottom=" + bottom + 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " leading=" + leading; 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the font's interline spacing, given the Paint's settings for 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * typeface, textSize, etc. If metrics is not null, return the fontmetric 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values in it. Note: all values have been converted to integers from 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * floats, in such a way has to make the answers useful for both spacing 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and clipping. If you want more control over the rounding, call 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getFontMetrics(). 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the font's interline spacing. 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1860dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck public int getFontMetricsInt(FontMetricsInt fmi) { 1861dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetFontMetricsInt(mNativePaint, mNativeTypeface, fmi); 1862dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck } 1863dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FontMetricsInt getFontMetricsInt() { 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FontMetricsInt fm = new FontMetricsInt(); 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getFontMetricsInt(fm); 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fm; 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869051910b9f998030dacb8a0722588cc715813fde1Raph Levien 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the recommend line spacing based on the current typeface and 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text size. 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return recommend line spacing based on the current typeface and 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text size. 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFontSpacing() { 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFontMetrics(null); 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the width of the text. 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18848984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index of the first character to start measuring 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count THe number of characters to measure, beginning with start 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The width of the text 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1889afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn public float measureText(char[] text, int index, int count) { 18908984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 18918984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 18928984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 18938984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if ((index | count) < 0 || index + count > text.length) { 18948984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new ArrayIndexOutOfBoundsException(); 18958984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 18968984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 18978984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length == 0 || count == 0) { 189815c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0f; 189915c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 19008984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (!mHasCompatScaling) { 1901dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return (float) Math.ceil(nGetTextAdvances(mNativePaint, mNativeTypeface, text, 1902536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi index, count, index, count, mBidiFlags, null, 0)); 19038984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 19048984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 1905afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn final float oldSize = getTextSize(); 1906536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi setTextSize(oldSize * mCompatScaling); 1907dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck float w = nGetTextAdvances(mNativePaint, mNativeTypeface, text, index, count, index, 1908536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi count, mBidiFlags, null, 0); 1909afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize); 19108e04840f38a16f806754dfca3de50c2548e67913Victoria Lease return (float) Math.ceil(w*mInvCompatScaling); 1911afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the width of the text. 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19168984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The index of the first character to start measuring 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end 1 beyond the index of the last character to measure 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The width of the text 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1921afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn public float measureText(String text, int start, int end) { 19228984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 19238984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 19248984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 19258984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if ((start | end | (end - start) | (text.length() - end)) < 0) { 19268984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IndexOutOfBoundsException(); 19278984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 19288984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 19298984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || start == end) { 193015c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0f; 193115c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 19328984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (!mHasCompatScaling) { 1933dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return (float) Math.ceil(nGetTextAdvances(mNativePaint, mNativeTypeface, text, 1934536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi start, end, start, end, mBidiFlags, null, 0)); 19358984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 1936afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn final float oldSize = getTextSize(); 1937536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi setTextSize(oldSize * mCompatScaling); 1938dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck float w = nGetTextAdvances(mNativePaint, mNativeTypeface, text, start, end, start, 1939536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi end, mBidiFlags, null, 0); 1940afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize); 1941536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi return (float) Math.ceil(w * mInvCompatScaling); 1942afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the width of the text. 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19478984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The width of the text 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1950afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn public float measureText(String text) { 19518984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 19528984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 19538984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 1954536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi return measureText(text, 0, text.length()); 1955afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the width of the text. 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to measure 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The index of the first character to start measuring 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end 1 beyond the index of the last character to measure 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The width of the text 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float measureText(CharSequence text, int start, int end) { 19668984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 19678984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 19688984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 19698984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if ((start | end | (end - start) | (text.length() - end)) < 0) { 19708984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IndexOutOfBoundsException(); 19718984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 19728984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 19738984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || start == end) { 197415c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0f; 197515c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof String) { 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return measureText((String)text, start, end); 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof SpannedString || 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text instanceof SpannableString) { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return measureText(text.toString(), start, end); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof GraphicsOperations) { 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((GraphicsOperations)text).measureText(start, end, this); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] buf = TemporaryBuffer.obtain(end - start); 1988afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn TextUtils.getChars(text, start, end, buf, 0); 1989afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn float result = measureText(buf, 0, end - start); 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TemporaryBuffer.recycle(buf); 1991afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn return result; 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1993051910b9f998030dacb8a0722588cc715813fde1Raph Levien 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Measure the text, stopping early if the measured width exceeds maxWidth. 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the number of chars that were measured, and if measuredWidth is 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not null, return in it the actual width measured. 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19998984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The offset into text to begin measuring at 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count The number of maximum number of entries to measure. If count 20028a9f9d880da83877206d0a52d03c784e936d3814Brian Muramatsu * is negative, then the characters are measured in reverse order. 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param maxWidth The maximum width to accumulate. 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param measuredWidth Optional. If not null, returns the actual width 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measured. 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The number of chars that were measured. Will always be <= 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * abs(count). 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn public int breakText(char[] text, int index, int count, 2010afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn float maxWidth, float[] measuredWidth) { 20118984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 20128984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 20138984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 20148fa6503feb1954d8c11a0591a567e6acedf7abe9Fabrice Di Meglio if (index < 0 || text.length - index < Math.abs(count)) { 20158984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new ArrayIndexOutOfBoundsException(); 20168984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 20178984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 20188984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length == 0 || count == 0) { 201915c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0; 202015c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 2021afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (!mHasCompatScaling) { 2022dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nBreakText(mNativePaint, mNativeTypeface, text, index, count, maxWidth, 2023a7aa1b0aa566b2ff310cb89fbc9437de4819f583Anish Athalye mBidiFlags, measuredWidth); 2024afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 20258984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 2026afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn final float oldSize = getTextSize(); 2027a7aa1b0aa566b2ff310cb89fbc9437de4819f583Anish Athalye setTextSize(oldSize * mCompatScaling); 2028dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck int res = nBreakText(mNativePaint, mNativeTypeface, text, index, count, 2029a7aa1b0aa566b2ff310cb89fbc9437de4819f583Anish Athalye maxWidth * mCompatScaling, mBidiFlags, measuredWidth); 2030afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize); 2031afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling; 2032afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn return res; 2033afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 2034afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Measure the text, stopping early if the measured width exceeds maxWidth. 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the number of chars that were measured, and if measuredWidth is 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not null, return in it the actual width measured. 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20408984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The offset into text to begin measuring at 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end The end of the text slice to measure. 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param measureForwards If true, measure forwards, starting at start. 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Otherwise, measure backwards, starting with end. 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param maxWidth The maximum width to accumulate. 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param measuredWidth Optional. If not null, returns the actual width 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measured. 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The number of chars that were measured. Will always be <= 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * abs(end - start). 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int breakText(CharSequence text, int start, int end, 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean measureForwards, 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float maxWidth, float[] measuredWidth) { 20548984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 20558984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 20568984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 20578984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if ((start | end | (end - start) | (text.length() - end)) < 0) { 20588984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IndexOutOfBoundsException(); 20598984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 20608984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 20618984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || start == end) { 206215c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0; 206315c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (start == 0 && text instanceof String && end == text.length()) { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return breakText((String) text, measureForwards, maxWidth, 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measuredWidth); 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] buf = TemporaryBuffer.obtain(end - start); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.getChars(text, start, end, buf, 0); 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (measureForwards) { 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = breakText(buf, 0, end - start, maxWidth, measuredWidth); 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = breakText(buf, 0, -(end - start), maxWidth, measuredWidth); 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TemporaryBuffer.recycle(buf); 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Measure the text, stopping early if the measured width exceeds maxWidth. 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the number of chars that were measured, and if measuredWidth is 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not null, return in it the actual width measured. 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20898984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 209033a31b314f571ddcbef003e8a399c20ddeff6905Dirk Dougherty * @param measureForwards If true, measure forwards, starting with the 209133a31b314f571ddcbef003e8a399c20ddeff6905Dirk Dougherty * first character in the string. Otherwise, 209233a31b314f571ddcbef003e8a399c20ddeff6905Dirk Dougherty * measure backwards, starting with the 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last character in the string. 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param maxWidth The maximum width to accumulate. 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param measuredWidth Optional. If not null, returns the actual width 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measured. 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The number of chars that were measured. Will always be <= 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * abs(count). 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2100afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn public int breakText(String text, boolean measureForwards, 2101afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn float maxWidth, float[] measuredWidth) { 21028984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 21038984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 21048984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 21058984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 21068984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0) { 210715c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0; 210815c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 2109afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (!mHasCompatScaling) { 2110dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nBreakText(mNativePaint, mNativeTypeface, text, measureForwards, 2111a7aa1b0aa566b2ff310cb89fbc9437de4819f583Anish Athalye maxWidth, mBidiFlags, measuredWidth); 2112afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 21138984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 2114afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn final float oldSize = getTextSize(); 2115afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize*mCompatScaling); 2116dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck int res = nBreakText(mNativePaint, mNativeTypeface, text, measureForwards, 2117a7aa1b0aa566b2ff310cb89fbc9437de4819f583Anish Athalye maxWidth*mCompatScaling, mBidiFlags, measuredWidth); 2118afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize); 2119afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (measuredWidth != null) measuredWidth[0] *= mInvCompatScaling; 2120afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn return res; 2121afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 2122afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the advance widths for the characters in the string. 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21268984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index of the first char to to measure 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count The number of chars starting with index to measure 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widths array to receive the advance widths of the characters. 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be at least a large as count. 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the actual number of widths returned. 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getTextWidths(char[] text, int index, int count, 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] widths) { 21358984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 21368984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 213715c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index | count) < 0 || index + count > text.length 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || count > widths.length) { 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21428984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 21438984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length == 0 || count == 0) { 21448984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio return 0; 21458984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 2146afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (!mHasCompatScaling) { 2147dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetTextAdvances(mNativePaint, mNativeTypeface, text, index, count, index, count, 2148536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi mBidiFlags, widths, 0); 2149536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi return count; 2150afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 21518984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 2152afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn final float oldSize = getTextSize(); 2153536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi setTextSize(oldSize * mCompatScaling); 2154dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetTextAdvances(mNativePaint, mNativeTypeface, text, index, count, index, count, 2155536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi mBidiFlags, widths, 0); 2156afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize); 2157536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi for (int i = 0; i < count; i++) { 2158afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn widths[i] *= mInvCompatScaling; 2159afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 2160536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi return count; 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the advance widths for the characters in the string. 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21668984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The index of the first char to to measure 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end The end of the text slice to measure 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widths array to receive the advance widths of the characters. 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be at least a large as (end - start). 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the actual number of widths returned. 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getTextWidths(CharSequence text, int start, int end, 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] widths) { 21758984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 21768984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 21778984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 21788984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if ((start | end | (end - start) | (text.length() - end)) < 0) { 21798984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IndexOutOfBoundsException(); 21808984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 21818984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (end - start > widths.length) { 21828984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new ArrayIndexOutOfBoundsException(); 21838984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 21848984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 21858984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || start == end) { 218615c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio return 0; 218715c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof String) { 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getTextWidths((String) text, start, end, widths); 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof SpannedString || 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text instanceof SpannableString) { 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getTextWidths(text.toString(), start, end, widths); 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text instanceof GraphicsOperations) { 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((GraphicsOperations) text).getTextWidths(start, end, 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widths, this); 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] buf = TemporaryBuffer.obtain(end - start); 22010c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt TextUtils.getChars(text, start, end, buf, 0); 22020c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int result = getTextWidths(buf, 0, end - start, widths); 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TemporaryBuffer.recycle(buf); 22040c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return result; 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the advance widths for the characters in the string. 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22108984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text The text to measure. Cannot be null. 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start The index of the first char to to measure 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param end The end of the text slice to measure 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widths array to receive the advance widths of the characters. 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be at least a large as the text. 2215536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi * @return the number of code units in the specified text. 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getTextWidths(String text, int start, int end, float[] widths) { 22188984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 22198984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 222015c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((start | end | (end - start) | (text.length() - end)) < 0) { 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (end - start > widths.length) { 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2227051910b9f998030dacb8a0722588cc715813fde1Raph Levien 22288984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || start == end) { 22298984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio return 0; 22308984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 2231afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn if (!mHasCompatScaling) { 2232dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetTextAdvances(mNativePaint, mNativeTypeface, text, start, end, start, end, 2233536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi mBidiFlags, widths, 0); 2234536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi return end - start; 2235afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 22368984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 2237afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn final float oldSize = getTextSize(); 2238536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi setTextSize(oldSize * mCompatScaling); 2239dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetTextAdvances(mNativePaint, mNativeTypeface, text, start, end, start, end, 2240536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi mBidiFlags, widths, 0); 2241afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn setTextSize(oldSize); 2242536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi for (int i = 0; i < end - start; i++) { 2243afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn widths[i] *= mInvCompatScaling; 2244afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn } 2245536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi return end - start; 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2247051910b9f998030dacb8a0722588cc715813fde1Raph Levien 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the advance widths for the characters in the string. 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The text to measure 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widths array to receive the advance widths of the characters. 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Must be at least a large as the text. 2254536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi * @return the number of code units in the specified text. 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getTextWidths(String text, float[] widths) { 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getTextWidths(text, 0, text.length(), widths); 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22610c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Convenience overload that takes a char array instead of a 22620c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * String. 22630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 22641b60cc0529161b5eca6407b551d67d355994c567Chris Craik * @see #getTextRunAdvances(String, int, int, int, int, boolean, float[], int) 22650c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 22660c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 22670c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public float getTextRunAdvances(char[] chars, int index, int count, 2268051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextIndex, int contextCount, boolean isRtl, float[] advances, 22690c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int advancesIndex) { 2270eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 22718984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (chars == null) { 22728984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 22738984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 2274eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if ((index | count | contextIndex | contextCount | advancesIndex 22758984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio | (index - contextIndex) | (contextCount - count) 2276eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio | ((contextIndex + contextCount) - (index + count)) 2277eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio | (chars.length - (contextIndex + contextCount)) 2278eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio | (advances == null ? 0 : 2279eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio (advances.length - (advancesIndex + count)))) < 0) { 2280eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio throw new IndexOutOfBoundsException(); 2281eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2282eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 22838984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (chars.length == 0 || count == 0){ 22848984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio return 0f; 22858984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 2286eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (!mHasCompatScaling) { 2287dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetTextAdvances(mNativePaint, mNativeTypeface, chars, index, count, 2288536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi contextIndex, contextCount, isRtl ? BIDI_FORCE_RTL : BIDI_FORCE_LTR, advances, 2289536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi advancesIndex); 2290eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2291eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2292eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio final float oldSize = getTextSize(); 2293eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio setTextSize(oldSize * mCompatScaling); 2294dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck float res = nGetTextAdvances(mNativePaint, mNativeTypeface, chars, index, count, 2295536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi contextIndex, contextCount, isRtl ? BIDI_FORCE_RTL : BIDI_FORCE_LTR, advances, 2296536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi advancesIndex); 2297eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio setTextSize(oldSize); 2298eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2299eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (advances != null) { 2300eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio for (int i = advancesIndex, e = i + count; i < e; i++) { 2301eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio advances[i] *= mInvCompatScaling; 2302eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2303eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2304eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio return res * mInvCompatScaling; // assume errors are not significant 2305eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2306eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2307eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio /** 23080c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Convenience overload that takes a CharSequence instead of a 23090c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * String. 23100c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 23111b60cc0529161b5eca6407b551d67d355994c567Chris Craik * @see #getTextRunAdvances(String, int, int, int, int, boolean, float[], int) 23120c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 23130c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 23140c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public float getTextRunAdvances(CharSequence text, int start, int end, 2315051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextStart, int contextEnd, boolean isRtl, float[] advances, 23160c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int advancesIndex) { 23178984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 23188984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 23198984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 23208984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if ((start | end | contextStart | contextEnd | advancesIndex | (end - start) 23218984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio | (start - contextStart) | (contextEnd - end) 23228984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio | (text.length() - contextEnd) 23238984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio | (advances == null ? 0 : 23248984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio (advances.length - advancesIndex - (end - start)))) < 0) { 23258984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IndexOutOfBoundsException(); 232615c097a1c23105cdc0dd66dd5605ff35467d7118Fabrice Di Meglio } 23278984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 2328eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (text instanceof String) { 23290a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio return getTextRunAdvances((String) text, start, end, 2330051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextEnd, isRtl, advances, advancesIndex); 2331eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2332eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (text instanceof SpannedString || 2333eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio text instanceof SpannableString) { 23340a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio return getTextRunAdvances(text.toString(), start, end, 2335051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextEnd, isRtl, advances, advancesIndex); 2336eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2337eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (text instanceof GraphicsOperations) { 23380a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio return ((GraphicsOperations) text).getTextRunAdvances(start, end, 2339051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextEnd, isRtl, advances, advancesIndex, this); 2340eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 23418984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || end == start) { 23428984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio return 0f; 23438984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 2344eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2345eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio int contextLen = contextEnd - contextStart; 2346eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio int len = end - start; 2347eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio char[] buf = TemporaryBuffer.obtain(contextLen); 23484c7dbc04958cb585a2b68eaa664e816f0d84da9fFabrice Di Meglio TextUtils.getChars(text, contextStart, contextEnd, buf, 0); 23494c7dbc04958cb585a2b68eaa664e816f0d84da9fFabrice Di Meglio float result = getTextRunAdvances(buf, start - contextStart, len, 2350051910b9f998030dacb8a0722588cc715813fde1Raph Levien 0, contextLen, isRtl, advances, advancesIndex); 2351eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio TemporaryBuffer.recycle(buf); 2352eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio return result; 2353eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2354eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2355eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio /** 23560c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Returns the total advance width for the characters in the run 23570c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * between start and end, and if advances is not null, the advance 23580c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * assigned to each of these characters (java chars). 23590c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 23600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>The trailing surrogate in a valid surrogate pair is assigned 23610c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * an advance of 0. Thus the number of returned advances is 23620c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * always equal to count, not to the number of unicode codepoints 23630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * represented by the run. 23640c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 23650c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>In the case of conjuncts or combining marks, the total 23660c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * advance is assigned to the first logical character, and the 23670c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * following characters are assigned an advance of 0. 23680c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 23690c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>This generates the sum of the advances of glyphs for 23700c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * characters in a reordered cluster as the width of the first 23710c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * logical character in the cluster, and 0 for the widths of all 23720c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * other characters in the cluster. In effect, such clusters are 23730c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * treated like conjuncts. 23740c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 23750c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>The shaping bounds limit the amount of context available 23760c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * outside start and end that can be used for shaping analysis. 23770c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * These bounds typically reflect changes in bidi level or font 23780c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * metrics across which shaping does not occur. 23790c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 23808984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio * @param text the text to measure. Cannot be null. 23810c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param start the index of the first character to measure 23820c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param end the index past the last character to measure 23830c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextStart the index of the first character to use for shaping context, 23840c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * must be <= start 23850c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextEnd the index past the last character to use for shaping context, 23860c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * must be >= end 2387051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param isRtl whether the run is in RTL direction 2388da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @param advances array to receive the advances, must have room for all advances, 2389da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * can be null if only total advance is needed 2390da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @param advancesIndex the position in advances at which to put the 2391da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * advance corresponding to the character at start 2392da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @return the total advance 2393da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * 2394da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio * @hide 2395da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio */ 2396da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio public float getTextRunAdvances(String text, int start, int end, int contextStart, 2397051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextEnd, boolean isRtl, float[] advances, int advancesIndex) { 23988984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text == null) { 23998984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio throw new IllegalArgumentException("text cannot be null"); 24008984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio } 2401eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if ((start | end | contextStart | contextEnd | advancesIndex | (end - start) 2402eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio | (start - contextStart) | (contextEnd - end) 2403eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio | (text.length() - contextEnd) 2404eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio | (advances == null ? 0 : 2405eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio (advances.length - advancesIndex - (end - start)))) < 0) { 2406eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio throw new IndexOutOfBoundsException(); 2407eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 24088984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio 24098984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio if (text.length() == 0 || start == end) { 24108984b41665f7ea2f0fdbc8ce00556b9e7762668eFabrice Di Meglio return 0f; 2411eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2412eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2413eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (!mHasCompatScaling) { 2414dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetTextAdvances(mNativePaint, mNativeTypeface, text, start, end, 2415536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi contextStart, contextEnd, isRtl ? BIDI_FORCE_RTL : BIDI_FORCE_LTR, advances, 2416536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi advancesIndex); 2417eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2418eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2419eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio final float oldSize = getTextSize(); 2420eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio setTextSize(oldSize * mCompatScaling); 2421dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck float totalAdvance = nGetTextAdvances(mNativePaint, mNativeTypeface, text, start, 2422536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi end, contextStart, contextEnd, isRtl ? BIDI_FORCE_RTL : BIDI_FORCE_LTR, advances, 2423536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi advancesIndex); 2424eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio setTextSize(oldSize); 2425eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2426eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (advances != null) { 2427eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio for (int i = advancesIndex, e = i + (end - start); i < e; i++) { 2428eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio advances[i] *= mInvCompatScaling; 2429eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2430eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2431eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio return totalAdvance * mInvCompatScaling; // assume errors are insignificant 2432eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 2433eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 2434eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio /** 24350c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Returns the next cursor position in the run. This avoids placing the 24360c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cursor between surrogates, between characters that form conjuncts, 24370c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * between base characters and combining marks, or within a reordering 24380c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cluster. 24390c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 24400c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>ContextStart and offset are relative to the start of text. 24410c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * The context is the shaping context for cursor movement, generally 24420c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * the bounds of the metric span enclosing the cursor in the direction of 24430c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * movement. 24440c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 24450c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>If cursorOpt is {@link #CURSOR_AT} and the offset is not a valid 24460c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cursor position, this returns -1. Otherwise this will never return a 24470c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * value before contextStart or after contextStart + contextLength. 24480c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 24490c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param text the text 24500c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextStart the start of the context 24510c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextLength the length of the context 2452051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param dir either {@link #DIRECTION_RTL} or {@link #DIRECTION_LTR} 24530c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param offset the cursor position to move from 24540c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param cursorOpt how to move the cursor, one of {@link #CURSOR_AFTER}, 24550c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * {@link #CURSOR_AT_OR_AFTER}, {@link #CURSOR_BEFORE}, 24560c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * {@link #CURSOR_AT_OR_BEFORE}, or {@link #CURSOR_AT} 24570c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @return the offset of the next position, or -1 24580c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 24590c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 24600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public int getTextRunCursor(char[] text, int contextStart, int contextLength, 2461051910b9f998030dacb8a0722588cc715813fde1Raph Levien int dir, int offset, int cursorOpt) { 24620c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int contextEnd = contextStart + contextLength; 24630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (((contextStart | contextEnd | offset | (contextEnd - contextStart) 24640c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt | (offset - contextStart) | (contextEnd - offset) 24650c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt | (text.length - contextEnd) | cursorOpt) < 0) 24660c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt || cursorOpt > CURSOR_OPT_MAX_VALUE) { 24670c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt throw new IndexOutOfBoundsException(); 24680c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 24690c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 24705d74b1c76f5da4510a1d70d8d3b0e8c15765f231Roozbeh Pournader return nGetTextRunCursor(mNativePaint, mNativeTypeface, text, 2471051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextLength, dir, offset, cursorOpt); 24720c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 24730c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 24740c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 24750c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Returns the next cursor position in the run. This avoids placing the 24760c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cursor between surrogates, between characters that form conjuncts, 24770c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * between base characters and combining marks, or within a reordering 24780c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cluster. 24790c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 24800c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>ContextStart, contextEnd, and offset are relative to the start of 24810c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * text. The context is the shaping context for cursor movement, generally 24820c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * the bounds of the metric span enclosing the cursor in the direction of 24830c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * movement. 24840c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 24850c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>If cursorOpt is {@link #CURSOR_AT} and the offset is not a valid 24860c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cursor position, this returns -1. Otherwise this will never return a 24870c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * value before contextStart or after contextEnd. 24880c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 24890c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param text the text 24900c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextStart the start of the context 24910c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextEnd the end of the context 2492051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param dir either {@link #DIRECTION_RTL} or {@link #DIRECTION_LTR} 24930c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param offset the cursor position to move from 24940c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param cursorOpt how to move the cursor, one of {@link #CURSOR_AFTER}, 24950c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * {@link #CURSOR_AT_OR_AFTER}, {@link #CURSOR_BEFORE}, 24960c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * {@link #CURSOR_AT_OR_BEFORE}, or {@link #CURSOR_AT} 24970c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @return the offset of the next position, or -1 24980c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 24990c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 25000c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public int getTextRunCursor(CharSequence text, int contextStart, 2501051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextEnd, int dir, int offset, int cursorOpt) { 25020c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 25030c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (text instanceof String || text instanceof SpannedString || 25040c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt text instanceof SpannableString) { 25050c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return getTextRunCursor(text.toString(), contextStart, contextEnd, 2506051910b9f998030dacb8a0722588cc715813fde1Raph Levien dir, offset, cursorOpt); 25070c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 25080c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (text instanceof GraphicsOperations) { 25090c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return ((GraphicsOperations) text).getTextRunCursor( 2510051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextEnd, dir, offset, cursorOpt, this); 25110c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 25120c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 25130c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int contextLen = contextEnd - contextStart; 25140c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt char[] buf = TemporaryBuffer.obtain(contextLen); 25150c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt TextUtils.getChars(text, contextStart, contextEnd, buf, 0); 2516b89a605b58bc20ef1ee0923f0578a2fa99a71793Seigo Nonaka int relPos = getTextRunCursor(buf, 0, contextLen, dir, offset - contextStart, cursorOpt); 25170c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt TemporaryBuffer.recycle(buf); 2518b89a605b58bc20ef1ee0923f0578a2fa99a71793Seigo Nonaka return (relPos == -1) ? -1 : relPos + contextStart; 25190c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 25200c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 25210c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 25220c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * Returns the next cursor position in the run. This avoids placing the 25230c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cursor between surrogates, between characters that form conjuncts, 25240c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * between base characters and combining marks, or within a reordering 25250c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cluster. 25260c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 25270c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>ContextStart, contextEnd, and offset are relative to the start of 25280c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * text. The context is the shaping context for cursor movement, generally 25290c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * the bounds of the metric span enclosing the cursor in the direction of 25300c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * movement. 25310c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 25320c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * <p>If cursorOpt is {@link #CURSOR_AT} and the offset is not a valid 25330c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * cursor position, this returns -1. Otherwise this will never return a 25340c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * value before contextStart or after contextEnd. 25350c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * 25360c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param text the text 25370c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextStart the start of the context 25380c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param contextEnd the end of the context 2539051910b9f998030dacb8a0722588cc715813fde1Raph Levien * @param dir either {@link #DIRECTION_RTL} or {@link #DIRECTION_LTR} 25400c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param offset the cursor position to move from 25410c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @param cursorOpt how to move the cursor, one of {@link #CURSOR_AFTER}, 25420c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * {@link #CURSOR_AT_OR_AFTER}, {@link #CURSOR_BEFORE}, 25430c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * {@link #CURSOR_AT_OR_BEFORE}, or {@link #CURSOR_AT} 25440c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @return the offset of the next position, or -1 25450c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt * @hide 25460c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt */ 25470c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt public int getTextRunCursor(String text, int contextStart, int contextEnd, 2548051910b9f998030dacb8a0722588cc715813fde1Raph Levien int dir, int offset, int cursorOpt) { 25490c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (((contextStart | contextEnd | offset | (contextEnd - contextStart) 25500c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt | (offset - contextStart) | (contextEnd - offset) 25510c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt | (text.length() - contextEnd) | cursorOpt) < 0) 25520c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt || cursorOpt > CURSOR_OPT_MAX_VALUE) { 25530c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt throw new IndexOutOfBoundsException(); 25540c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 25550c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 25565d74b1c76f5da4510a1d70d8d3b0e8c15765f231Roozbeh Pournader return nGetTextRunCursor(mNativePaint, mNativeTypeface, text, 2557051910b9f998030dacb8a0722588cc715813fde1Raph Levien contextStart, contextEnd, dir, offset, cursorOpt); 25580c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 25590c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 25600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt /** 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the path (outline) for the specified text. 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: just like Canvas.drawText, this will respect the Align setting in 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the paint. 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2565f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param text the text to retrieve the path from 2566f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param index the index of the first character in text 2567f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param count the number of characters starting with index 2568f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param x the x coordinate of the text's origin 2569f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param y the y coordinate of the text's origin 2570f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param path the path to receive the data describing the text. Must be allocated by the caller 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getTextPath(char[] text, int index, int count, 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x, float y, Path path) { 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index | count) < 0 || index + count > text.length) { 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2577dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetTextPath(mNativePaint, mNativeTypeface, mBidiFlags, text, index, count, x, y, 2578a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv path.mutateNI()); 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the path (outline) for the specified text. 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: just like Canvas.drawText, this will respect the Align setting 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the paint. 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2586f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param text the text to retrieve the path from 2587f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param start the first character in the text 2588f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param end 1 past the last character in the text 2589f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param x the x coordinate of the text's origin 2590f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param y the y coordinate of the text's origin 2591f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param path the path to receive the data describing the text. Must be allocated by the caller 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getTextPath(String text, int start, int end, 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x, float y, Path path) { 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((start | end | (end - start) | (text.length() - end)) < 0) { 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2598dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetTextPath(mNativePaint, mNativeTypeface, mBidiFlags, text, start, end, x, y, 2599a6a8557d6e6c8ecc170767b7552979dbdb4254efsergeyv path.mutateNI()); 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2601051910b9f998030dacb8a0722588cc715813fde1Raph Levien 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return in bounds (allocated by the caller) the smallest rectangle that 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * encloses all of the characters, with an implied origin at (0,0). 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2606f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param text string to measure and return its bounds 2607f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param start index of the first char in the string to measure 2608f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param end 1 past the last char in the string to measure 2609f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param bounds returns the unioned bounds of all the text. Must be allocated by the caller 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getTextBounds(String text, int start, int end, Rect bounds) { 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((start | end | (end - start) | (text.length() - end)) < 0) { 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bounds == null) { 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need bounds Rect"); 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2618dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetStringBounds(mNativePaint, mNativeTypeface, text, start, end, mBidiFlags, bounds); 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2620051910b9f998030dacb8a0722588cc715813fde1Raph Levien 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return in bounds (allocated by the caller) the smallest rectangle that 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * encloses all of the characters, with an implied origin at (0,0). 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2625f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param text text to measure and return its bounds 2626f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param start index of the first char in the text to measure 2627f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param end 1 past the last char in the text to measure 2628f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param bounds returns the unioned bounds of all the text. Must be allocated by the caller 2629f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @hide 2630f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi */ 2631f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi public void getTextBounds(CharSequence text, int start, int end, Rect bounds) { 2632f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi if ((start | end | (end - start) | (text.length() - end)) < 0) { 2633f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi throw new IndexOutOfBoundsException(); 2634f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi } 2635f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi if (bounds == null) { 2636f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi throw new NullPointerException("need bounds Rect"); 2637f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi } 2638f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi char[] buf = TemporaryBuffer.obtain(end - start); 2639f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi TextUtils.getChars(text, start, end, buf, 0); 2640f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi getTextBounds(buf, 0, end - start, bounds); 2641f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi TemporaryBuffer.recycle(buf); 2642f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi } 2643f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi 2644f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi /** 2645f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * Return in bounds (allocated by the caller) the smallest rectangle that 2646f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * encloses all of the characters, with an implied origin at (0,0). 2647f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * 2648f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param text array of chars to measure and return their unioned bounds 2649f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param index index of the first char in the array to measure 2650f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param count the number of chars, beginning at index, to measure 2651f5af4a344e086efa87740a0154cace064465fe54Keisuke Kuroyanagi * @param bounds returns the unioned bounds of all the text. Must be allocated by the caller 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getTextBounds(char[] text, int index, int count, Rect bounds) { 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index | count) < 0 || index + count > text.length) { 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bounds == null) { 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need bounds Rect"); 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2660dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck nGetCharArrayBounds(mNativePaint, mNativeTypeface, text, index, count, mBidiFlags, 2661854363e3d2fb2a9e41d8719f4a2f0f8b89440a46Raph Levien bounds); 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2663051910b9f998030dacb8a0722588cc715813fde1Raph Levien 2664f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien /** 2665f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * Determine whether the typeface set on the paint has a glyph supporting the string. The 2666f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * simplest case is when the string contains a single character, in which this method 2667f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * determines whether the font has the character. In the case of multiple characters, the 2668f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * method returns true if there is a single glyph representing the ligature. For example, if 2669f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * the input is a pair of regional indicator symbols, determine whether there is an emoji flag 2670f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * for the pair. 2671f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * 2672c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>Finally, if the string contains a variation selector, the method only returns true if 2673f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * the fonts contains a glyph specific to that variation. 2674f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * 2675c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>Checking is done on the entire fallback chain, not just the immediate font referenced. 2676f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * 2677f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * @param string the string to test whether there is glyph support 2678f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien * @return true if the typeface has a glyph for the string 2679f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien */ 2680f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien public boolean hasGlyph(String string) { 2681dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nHasGlyph(mNativePaint, mNativeTypeface, mBidiFlags, string); 2682f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien } 2683f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien 2684a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien /** 2685a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * Measure cursor position within a run of text. 2686a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2687a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <p>The run of text includes the characters from {@code start} to {@code end} in the text. In 2688a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * addition, the range {@code contextStart} to {@code contextEnd} is used as context for the 2689a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * purpose of complex text shaping, such as Arabic text potentially shaped differently based on 2690a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * the text next to it. 2691a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2692c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>All text outside the range {@code contextStart..contextEnd} is ignored. The text between 2693a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * {@code start} and {@code end} will be laid out to be measured. 2694a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2695c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>The returned width measurement is the advance from {@code start} to {@code offset}. It is 2696a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * generally a positive value, no matter the direction of the run. If {@code offset == end}, 2697a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * the return value is simply the width of the whole run from {@code start} to {@code end}. 2698a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2699c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>Ligatures are formed for characters in the range {@code start..end} (but not for 2700a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * {@code start..contextStart} or {@code end..contextEnd}). If {@code offset} points to a 2701a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * character in the middle of such a formed ligature, but at a grapheme cluster boundary, the 2702a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * return value will also reflect an advance in the middle of the ligature. See 2703a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * {@link #getOffsetForAdvance} for more discussion of grapheme cluster boundaries. 2704a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2705c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * <p>The direction of the run is explicitly specified by {@code isRtl}. Thus, this method is 2706a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * suitable only for runs of a single direction. 2707a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2708a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <p>All indices are relative to the start of {@code text}. Further, {@code 0 <= contextStart 2709a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <= start <= offset <= end <= contextEnd <= text.length} must hold on entry. 2710a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2711a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param text the text to measure. Cannot be null. 2712a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param start the index of the start of the range to measure 2713a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param end the index + 1 of the end of the range to measure 2714a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param contextStart the index of the start of the shaping context 2715c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * @param contextEnd the index + 1 of the end of the shaping context 2716a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param isRtl whether the run is in RTL direction 2717a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param offset index of caret position 2718a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @return width measurement between start and offset 2719a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien */ 2720a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien public float getRunAdvance(char[] text, int start, int end, int contextStart, int contextEnd, 2721a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien boolean isRtl, int offset) { 2722a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if (text == null) { 2723a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IllegalArgumentException("text cannot be null"); 2724a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2725a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if ((contextStart | start | offset | end | contextEnd 2726a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | start - contextStart | offset - start | end - offset 2727a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | contextEnd - end | text.length - contextEnd) < 0) { 2728a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IndexOutOfBoundsException(); 2729a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2730a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if (end == start) { 2731a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien return 0.0f; 2732a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2733a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien // TODO: take mCompatScaling into account (or eliminate compat scaling)? 2734dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetRunAdvance(mNativePaint, mNativeTypeface, text, start, end, 2735a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien contextStart, contextEnd, isRtl, offset); 2736a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2737a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien 2738a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien /** 2739a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @see #getRunAdvance(char[], int, int, int, int, boolean, int) 2740a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2741a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param text the text to measure. Cannot be null. 2742a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param start the index of the start of the range to measure 2743a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param end the index + 1 of the end of the range to measure 2744a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param contextStart the index of the start of the shaping context 2745c6abf5bff6bbfafa1f133644f02a5d50d5269b7fRaph Levien * @param contextEnd the index + 1 of the end of the shaping context 2746a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param isRtl whether the run is in RTL direction 2747a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param offset index of caret position 2748a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @return width measurement between start and offset 2749a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien */ 2750a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien public float getRunAdvance(CharSequence text, int start, int end, int contextStart, 2751a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien int contextEnd, boolean isRtl, int offset) { 2752a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if (text == null) { 2753a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IllegalArgumentException("text cannot be null"); 2754a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2755a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if ((contextStart | start | offset | end | contextEnd 2756a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | start - contextStart | offset - start | end - offset 2757a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | contextEnd - end | text.length() - contextEnd) < 0) { 2758a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IndexOutOfBoundsException(); 2759a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2760a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if (end == start) { 2761a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien return 0.0f; 2762a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2763a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien // TODO performance: specialized alternatives to avoid buffer copy, if win is significant 2764a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien char[] buf = TemporaryBuffer.obtain(contextEnd - contextStart); 2765a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien TextUtils.getChars(text, contextStart, contextEnd, buf, 0); 2766a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien float result = getRunAdvance(buf, start - contextStart, end - contextStart, 0, 2767a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien contextEnd - contextStart, isRtl, offset - contextStart); 2768a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien TemporaryBuffer.recycle(buf); 2769a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien return result; 2770a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2771a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien 2772a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien /** 2773a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * Get the character offset within the string whose position is closest to the specified 2774a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * horizontal position. 2775a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2776a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <p>The returned value is generally the value of {@code offset} for which 2777a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * {@link #getRunAdvance} yields a result most closely approximating {@code advance}, 2778a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * and which is also on a grapheme cluster boundary. As such, it is the preferred method 2779a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * for positioning a cursor in response to a touch or pointer event. The grapheme cluster 2780a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * boundaries are based on 2781a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <a href="http://unicode.org/reports/tr29/">Unicode Standard Annex #29</a> but with some 2782a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * tailoring for better user experience. 2783a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2784a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <p>Note that {@code advance} is a (generally positive) width measurement relative to the start 2785a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * of the run. Thus, for RTL runs it the distance from the point to the right edge. 2786a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2787a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <p>All indices are relative to the start of {@code text}. Further, {@code 0 <= contextStart 2788a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <= start <= end <= contextEnd <= text.length} must hold on entry, and {@code start <= result 2789a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * <= end} will hold on return. 2790a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2791a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param text the text to measure. Cannot be null. 2792a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param start the index of the start of the range to measure 2793a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param end the index + 1 of the end of the range to measure 2794a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param contextStart the index of the start of the shaping context 2795a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param contextEnd the index + 1 of the end of the range to measure 2796a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param isRtl whether the run is in RTL direction 2797a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param advance width relative to start of run 2798a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @return index of offset 2799a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien */ 2800a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien public int getOffsetForAdvance(char[] text, int start, int end, int contextStart, 2801a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien int contextEnd, boolean isRtl, float advance) { 2802a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if (text == null) { 2803a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IllegalArgumentException("text cannot be null"); 2804a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2805a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if ((contextStart | start | end | contextEnd 2806a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | start - contextStart | end - start | contextEnd - end 2807a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | text.length - contextEnd) < 0) { 2808a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IndexOutOfBoundsException(); 2809a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2810a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien // TODO: take mCompatScaling into account (or eliminate compat scaling)? 2811dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck return nGetOffsetForAdvance(mNativePaint, mNativeTypeface, text, start, end, 2812a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien contextStart, contextEnd, isRtl, advance); 2813a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2814a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien 2815a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien /** 2816a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @see #getOffsetForAdvance(char[], int, int, int, int, boolean, float) 2817a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * 2818a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param text the text to measure. Cannot be null. 2819a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param start the index of the start of the range to measure 2820a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param end the index + 1 of the end of the range to measure 2821a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param contextStart the index of the start of the shaping context 2822a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param contextEnd the index + 1 of the end of the range to measure 2823a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param isRtl whether the run is in RTL direction 2824a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @param advance width relative to start of run 2825a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien * @return index of offset 2826a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien */ 2827a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien public int getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, 2828a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien int contextEnd, boolean isRtl, float advance) { 2829a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if (text == null) { 2830a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IllegalArgumentException("text cannot be null"); 2831a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2832a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien if ((contextStart | start | end | contextEnd 2833a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | start - contextStart | end - start | contextEnd - end 2834a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien | text.length() - contextEnd) < 0) { 2835a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien throw new IndexOutOfBoundsException(); 2836a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2837a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien // TODO performance: specialized alternatives to avoid buffer copy, if win is significant 2838a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien char[] buf = TemporaryBuffer.obtain(contextEnd - contextStart); 2839a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien TextUtils.getChars(text, contextStart, contextEnd, buf, 0); 2840a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien int result = getOffsetForAdvance(buf, start - contextStart, end - contextStart, 0, 2841a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien contextEnd - contextStart, isRtl, advance) + contextStart; 2842a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien TemporaryBuffer.recycle(buf); 2843a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien return result; 2844a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien } 2845a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien 2846f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck // regular JNI 2847f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native long nGetNativeFinalizer(); 2848dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native long nInit(); 2849dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native long nInitWithPaint(long paint); 2850f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nBreakText(long nObject, long nTypeface, 2851f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck char[] text, int index, int count, 2852f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck float maxWidth, int bidiFlags, float[] measuredWidth); 2853f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nBreakText(long nObject, long nTypeface, 2854f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck String text, boolean measureForwards, 2855f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck float maxWidth, int bidiFlags, float[] measuredWidth); 2856dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native float nGetTextAdvances(long paintPtr, long typefacePtr, 28570c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt char[] text, int index, int count, int contextIndex, int contextCount, 2858536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi int bidiFlags, float[] advances, int advancesIndex); 2859dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native float nGetTextAdvances(long paintPtr, long typefacePtr, 28600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt String text, int start, int end, int contextStart, int contextEnd, 2861536afe6ef79a663e59c3b9781c561f7029ee9319Keisuke Kuroyanagi int bidiFlags, float[] advances, int advancesIndex); 28625d74b1c76f5da4510a1d70d8d3b0e8c15765f231Roozbeh Pournader private native int nGetTextRunCursor(long paintPtr, long typefacePtr, char[] text, 2863051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextStart, int contextLength, int dir, int offset, int cursorOpt); 28645d74b1c76f5da4510a1d70d8d3b0e8c15765f231Roozbeh Pournader private native int nGetTextRunCursor(long paintPtr, long typefacePtr, String text, 2865051910b9f998030dacb8a0722588cc715813fde1Raph Levien int contextStart, int contextEnd, int dir, int offset, int cursorOpt); 2866dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native void nGetTextPath(long paintPtr, long typefacePtr, 2867f2114d5646194100242206b267ddd6e7194b7da9Raph Levien int bidiFlags, char[] text, int index, int count, float x, float y, long path); 2868dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native void nGetTextPath(long paintPtr, long typefacePtr, 2869f2114d5646194100242206b267ddd6e7194b7da9Raph Levien int bidiFlags, String text, int start, int end, float x, float y, long path); 2870dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native void nGetStringBounds(long nativePaint, long typefacePtr, 2871f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck String text, int start, int end, int bidiFlags, Rect bounds); 2872dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native void nGetCharArrayBounds(long nativePaint, long typefacePtr, 2873f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck char[] text, int index, int count, int bidiFlags, Rect bounds); 2874dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native boolean nHasGlyph(long paintPtr, long typefacePtr, 2875f7f969e67e9ab420404807b1b103dcd18d7aa7b7Raph Levien int bidiFlags, String string); 2876dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native float nGetRunAdvance(long paintPtr, long typefacePtr, 2877a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, 2878a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien int offset); 2879dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck private static native int nGetOffsetForAdvance(long paintPtr, 2880dbffd250003e60c0f11ac3ad2b63f91f67962610John Reck long typefacePtr, char[] text, int start, int end, int contextStart, int contextEnd, 2881a027ec5c2dbfbbf10cac9ea538f5e230b093be2fRaph Levien boolean isRtl, float advance); 2882f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck 2883f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck 2884f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck // ---------------- @FastNative ------------------------ 2885f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck 2886f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @FastNative 2887f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nSetTextLocales(long paintPtr, String locales); 2888f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @FastNative 2889f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetFontFeatureSettings(long paintPtr, String settings); 2890f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @FastNative 2891f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetFontMetrics(long paintPtr, 2892f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck long typefacePtr, FontMetrics metrics); 2893f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @FastNative 2894f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetFontMetricsInt(long paintPtr, 2895f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck long typefacePtr, FontMetricsInt fmi); 2896f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck 2897538de5bb3b3662c51c17cd9dd24e660c85e88b78Roozbeh Pournader 2898f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck // ---------------- @CriticalNative ------------------------ 2899f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck 2900f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2901f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nReset(long paintPtr); 2902f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2903f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSet(long paintPtrDest, long paintPtrSrc); 2904f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2905f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetStyle(long paintPtr); 2906f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2907f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetStyle(long paintPtr, int style); 2908f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2909f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetStrokeCap(long paintPtr); 2910f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2911f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetStrokeCap(long paintPtr, int cap); 2912f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2913f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetStrokeJoin(long paintPtr); 2914f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2915f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetStrokeJoin(long paintPtr, int join); 2916f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2917f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native boolean nGetFillPath(long paintPtr, long src, long dst); 2918f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2919f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native long nSetShader(long paintPtr, long shader); 2920f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2921f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native long nSetColorFilter(long paintPtr, long filter); 2922f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2923f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetXfermode(long paintPtr, int xfermode); 2924f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2925f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native long nSetPathEffect(long paintPtr, long effect); 2926f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2927f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native long nSetMaskFilter(long paintPtr, long maskfilter); 2928f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2929f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native long nSetTypeface(long paintPtr, long typeface); 2930f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2931f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetTextAlign(long paintPtr); 2932f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2933f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetTextAlign(long paintPtr, int align); 2934f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2935f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetTextLocalesByMinikinLangListId(long paintPtr, 2936f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck int mMinikinLangListId); 2937f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2938f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetShadowLayer(long paintPtr, 2939f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck float radius, float dx, float dy, int color); 2940f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2941f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native boolean nHasShadowLayer(long paintPtr); 2942f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2943f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetLetterSpacing(long paintPtr); 2944f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2945f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetLetterSpacing(long paintPtr, float letterSpacing); 2946f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2947219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka private static native float nGetWordSpacing(long paintPtr); 2948219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka @CriticalNative 2949219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka private static native void nSetWordSpacing(long paintPtr, float wordSpacing); 2950219e2c79490296b03e58ec36a3a4ff4a2ebf52e3Seigo Nonaka @CriticalNative 2951f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetHyphenEdit(long paintPtr); 2952f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2953f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetHyphenEdit(long paintPtr, int hyphen); 2954f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2955f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetStrokeMiter(long paintPtr, float miter); 2956f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2957f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetStrokeMiter(long paintPtr); 2958f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2959f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetStrokeWidth(long paintPtr, float width); 2960f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2961f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetStrokeWidth(long paintPtr); 2962f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2963f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetAlpha(long paintPtr, int a); 2964f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2965f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetDither(long paintPtr, boolean dither); 2966f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2967f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetFlags(long paintPtr); 2968f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2969f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetFlags(long paintPtr, int flags); 2970f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2971f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetHinting(long paintPtr); 2972f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2973f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetHinting(long paintPtr, int mode); 2974f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2975f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetAntiAlias(long paintPtr, boolean aa); 2976f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2977f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetLinearText(long paintPtr, boolean linearText); 2978f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2979f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetSubpixelText(long paintPtr, boolean subpixelText); 2980f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2981f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetUnderlineText(long paintPtr, boolean underlineText); 2982f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2983f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetFakeBoldText(long paintPtr, boolean fakeBoldText); 2984f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2985f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetFilterBitmap(long paintPtr, boolean filter); 2986f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2987f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetColor(long paintPtr); 2988f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2989f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetColor(long paintPtr, @ColorInt int color); 2990f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2991f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native int nGetAlpha(long paintPtr); 2992f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2993f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetStrikeThruText(long paintPtr, boolean strikeThruText); 2994f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2995f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native boolean nIsElegantTextHeight(long paintPtr); 2996f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2997f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetElegantTextHeight(long paintPtr, boolean elegant); 2998f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 2999f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetTextSize(long paintPtr); 3000f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3001f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetTextScaleX(long paintPtr); 3002f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3003f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetTextScaleX(long paintPtr, float scaleX); 3004f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3005f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nGetTextSkewX(long paintPtr); 3006f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3007f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetTextSkewX(long paintPtr, float skewX); 3008f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3009f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nAscent(long paintPtr, long typefacePtr); 3010f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3011f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native float nDescent(long paintPtr, long typefacePtr); 3012f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck @CriticalNative 3013ca8a04a36640eb227a556ad9ced925c48ced2495Roozbeh Pournader private static native float nGetUnderlinePosition(long paintPtr, long typefacePtr); 3014ca8a04a36640eb227a556ad9ced925c48ced2495Roozbeh Pournader @CriticalNative 3015ca8a04a36640eb227a556ad9ced925c48ced2495Roozbeh Pournader private static native float nGetUnderlineThickness(long paintPtr, long typefacePtr); 3016ca8a04a36640eb227a556ad9ced925c48ced2495Roozbeh Pournader @CriticalNative 30171378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader private static native float nGetStrikeThruPosition(long paintPtr, long typefacePtr); 30181378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader @CriticalNative 30191378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader private static native float nGetStrikeThruThickness(long paintPtr, long typefacePtr); 30201378a9d72cb4a9f7a939f0a28a78fcfb87fb7879Roozbeh Pournader @CriticalNative 3021f22859757b7981cdb3e05579bbb5f782965b5ca9John Reck private static native void nSetTextSize(long paintPtr, float textSize); 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3023