19f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/* 29f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project 39f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 49f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 59f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * you may not use this file except in compliance with the License. 69f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * You may obtain a copy of the License at 79f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 89f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 99f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software 119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * See the License for the specific language governing permissions and 149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * limitations under the License. 159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpackage android.graphics; 189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 19918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog; 20d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge; 21c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager; 229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 24476e582d2ffdf25102d4c55f8c242baa3d21d37fDeepanshu Guptaimport android.annotation.NonNull; 25476e582d2ffdf25102d4c55f8c242baa3d21d37fDeepanshu Guptaimport android.annotation.Nullable; 26ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Guptaimport android.graphics.FontFamily_Delegate.FontVariant; 279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetrics; 289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetricsInt; 295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport android.text.TextUtils; 309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport java.awt.BasicStroke; 329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Font; 33b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Shape; 34b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Stroke; 359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Toolkit; 369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.geom.AffineTransform; 379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.ArrayList; 389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.Collections; 399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.List; 40cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohetimport java.util.Locale; 419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 42491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Guptaimport libcore.util.NativeAllocationRegistry_Delegate; 43491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta 449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/** 459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Paint 469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Paint have been replaced 489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * by calls to methods of the same name in this delegate class. 499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * it and the original Paint class. 539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * @see DelegateManager 559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpublic class Paint_Delegate { 589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 60baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta * Class associating a {@link Font} and its {@link java.awt.FontMetrics}. 619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ static final class FontInfo { 639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Font mFont; 649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet java.awt.FontMetrics mMetrics; 659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- delegate manager ---- 689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private static final DelegateManager<Paint_Delegate> sManager = 69f0a53435f14d23d9555fc46014352ee6a7baa647Xavier Ducrohet new DelegateManager<Paint_Delegate>(Paint_Delegate.class); 70491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta private static long sFinalizer = -1; 719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- delegate helper data ---- 73e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta 74e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta // This list can contain null elements. 759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private List<FontInfo> mFonts; 769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- delegate data ---- 789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mFlags; 799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mColor; 809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mStyle; 819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mCap; 829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mJoin; 835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet private int mTextAlign; 84cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Typeface_Delegate mTypeface; 859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mStrokeWidth; 869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mStrokeMiter; 879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mTextSize; 889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mTextScaleX; 899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mTextSkewX; 908433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet private int mHintingMode = Paint.HINTING_ON; 91d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta private int mHyphenEdit; 92d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta private float mLetterSpacing; // not used in actual text rendering. 93f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard private float mWordSpacing; // not used in actual text rendering. 9486837dc24a64af7fb007e5f2ff6b3e1cfe98f844Deepanshu Gupta // Variant of the font. A paint's variant can only be compact or elegant. 9586837dc24a64af7fb007e5f2ff6b3e1cfe98f844Deepanshu Gupta private FontVariant mFontVariant = FontVariant.COMPACT; 969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 97f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard private int mPorterDuffMode = Xfermode.DEFAULT; 98cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private ColorFilter_Delegate mColorFilter; 99cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Shader_Delegate mShader; 100cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private PathEffect_Delegate mPathEffect; 101cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private MaskFilter_Delegate mMaskFilter; 102abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 103cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet private Locale mLocale = Locale.getDefault(); 104cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet 105a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta // Used only to assert invariants. 106a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta public long mNativeTypeface; 1079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- Public Helper methods ---- 1099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 110d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @Nullable 11184151432e7ead6666eb8cf6377bff577b2027694Narayan Kamath public static Paint_Delegate getDelegate(long native_paint) { 1125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return sManager.getDelegate(native_paint); 1135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 116baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta * Returns the list of {@link Font} objects. 1179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 1189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet public List<FontInfo> getFonts() { 1199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return mFonts; 1209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 1219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 122abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet public boolean isAntiAliased() { 123abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0; 124abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 125abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 1265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public boolean isFilterBitmap() { 1275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0; 1285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getStyle() { 1315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mStyle; 1325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getColor() { 1355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mColor; 1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 13863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet public int getAlpha() { 13963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet return mColor >>> 24; 14063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } 14163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 142d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet public void setAlpha(int alpha) { 143d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mColor = (alpha << 24) | (mColor & 0x00FFFFFF); 144d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet } 145d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet 1465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getTextAlign() { 1475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mTextAlign; 1485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public float getStrokeWidth() { 1515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mStrokeWidth; 1525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 15463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet /** 15563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet * returns the value of stroke miter needed by the java api. 15663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet */ 15763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet public float getJavaStrokeMiter() { 158b9c48d8f49d35e2682c7205a9d8d5fcc25d7c736Diego Perez return mStrokeMiter; 1595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getJavaCap() { 1625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet switch (Paint.sCapArray[mCap]) { 1635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case BUTT: 1645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_BUTT; 1655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case ROUND: 1665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_ROUND; 1675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet default: 1685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case SQUARE: 1695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_SQUARE; 1705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getJavaJoin() { 1745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet switch (Paint.sJoinArray[mJoin]) { 1755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet default: 1765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case MITER: 1775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_MITER; 1785802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case ROUND: 1795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_ROUND; 1805802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case BEVEL: 1815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_BEVEL; 1825802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 185b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet public Stroke getJavaStroke() { 186cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mPathEffect != null) { 187cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mPathEffect.isSupported()) { 188cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet Stroke stroke = mPathEffect.getStroke(this); 189b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet assert stroke != null; 190b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (stroke != null) { 191b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return stroke; 192b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 193b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } else { 194918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT, 195cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mPathEffect.getSupportMessage(), 19651a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet null, null /*data*/); 197b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 198b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 199b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 200b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet // if no custom stroke as been set, set the default one. 201b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return new BasicStroke( 202b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getStrokeWidth(), 203b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getJavaCap(), 204b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getJavaJoin(), 205b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getJavaStrokeMiter()); 206b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 207b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 208d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 209f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard * Returns the {@link PorterDuff.Mode} as an int 210d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 211f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard public int getPorterDuffMode() { 212f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard return mPorterDuffMode; 213251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 214251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 215d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 216d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link ColorFilter} delegate or null if none have been set 217d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 218d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 219d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 220d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public ColorFilter_Delegate getColorFilter() { 221cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mColorFilter; 222251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 223251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 2245d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez public void setColorFilter(long colorFilterPtr) { 2255d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez mColorFilter = ColorFilter_Delegate.getDelegate(colorFilterPtr); 2265d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez } 2275d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez 228566b303365078fac9a454f1595add19e02631db3Diego Perez public void setShader(long shaderPtr) { 229566b303365078fac9a454f1595add19e02631db3Diego Perez mShader = Shader_Delegate.getDelegate(shaderPtr); 230566b303365078fac9a454f1595add19e02631db3Diego Perez } 231566b303365078fac9a454f1595add19e02631db3Diego Perez 232d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 233d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link Shader} delegate or null if none have been set 234d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 235d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 236d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 237d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public Shader_Delegate getShader() { 238cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mShader; 239251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 240251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 241d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 242d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link MaskFilter} delegate or null if none have been set 243d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 244d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 245d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 246d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public MaskFilter_Delegate getMaskFilter() { 247cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mMaskFilter; 248d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 249d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- native methods ---- 2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2529a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 253a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static int nGetFlags(long nativePaint) { 2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 255491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 2569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mFlags; 2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 263cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet 264cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet 2659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 266a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetFlags(long nativePaint, int flags) { 2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 268491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags = flags; 2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2769a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 277a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetFilterBitmap(long nativePaint, boolean filter) { 278491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.FILTER_BITMAP_FLAG, filter); 2799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2819a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 282a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static int nGetHinting(long nativePaint) { 2838433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet // get the delegate from the native int. 284491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 2858433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet if (delegate == null) { 2868433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet return Paint.HINTING_ON; 2878433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet } 2888433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet 2898433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet return delegate.mHintingMode; 2908433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet } 2918433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet 2928433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet @LayoutlibDelegate 293a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetHinting(long nativePaint, int mode) { 2948433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet // get the delegate from the native int. 295491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 2968433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet if (delegate == null) { 2978433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet return; 2988433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet } 2998433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet 3008433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet delegate.mHintingMode = mode; 3018433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet } 3028433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet 3038433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet @LayoutlibDelegate 304a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetAntiAlias(long nativePaint, boolean aa) { 305491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.ANTI_ALIAS_FLAG, aa); 3069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3089a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 309a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetSubpixelText(long nativePaint, 310491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta boolean subpixelText) { 311491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText); 3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3149a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 315a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetUnderlineText(long nativePaint, 316491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta boolean underlineText) { 317491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.UNDERLINE_TEXT_FLAG, underlineText); 3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3209a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 321a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetStrikeThruText(long nativePaint, 322491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta boolean strikeThruText) { 323491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText); 3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 327a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetFakeBoldText(long nativePaint, 328491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta boolean fakeBoldText) { 329491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText); 3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3329a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 333a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetDither(long nativePaint, boolean dither) { 334491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.DITHER_FLAG, dither); 3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3379a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 338a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetLinearText(long nativePaint, boolean linearText) { 339491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta setFlag(nativePaint, Paint.LINEAR_TEXT_FLAG, linearText); 3409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 343a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static int nGetColor(long nativePaint) { 3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 345491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 3489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mColor; 3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3539a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 354a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetColor(long nativePaint, int color) { 3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 356491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 3579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mColor = color; 3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3649a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 365a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static int nGetAlpha(long nativePaint) { 3669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 367491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 3689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 37263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet return delegate.getAlpha(); 3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3759a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 376a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetAlpha(long nativePaint, int a) { 3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 378491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 3799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 383d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet delegate.setAlpha(a); 3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3869a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 387a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nGetStrokeWidth(long nativePaint) { 3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 389491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 3909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStrokeWidth; 3959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3979a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 398a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetStrokeWidth(long nativePaint, float width) { 3999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 400491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 4019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 4039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStrokeWidth = width; 4069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4089a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 409a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nGetStrokeMiter(long nativePaint) { 4109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 411491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 4129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 4149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStrokeMiter; 4179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4199a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 420a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetStrokeMiter(long nativePaint, float miter) { 4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 422491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 4239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 4259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStrokeMiter = miter; 4289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4309a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 431491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetShadowLayer(long paint, float radius, float dx, float dy, 4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int color) { 4339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 434918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 43551a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Paint.setShadowLayer is not supported.", null, null /*data*/); 4369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4389a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 439491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static boolean nHasShadowLayer(long paint) { 4406376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta // FIXME 4416376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 4426376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta "Paint.hasShadowLayer is not supported.", null, null /*data*/); 4436376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta return false; 4446376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta } 4456376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta 4466376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta @LayoutlibDelegate 447a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static boolean nIsElegantTextHeight(long nativePaint) { 448baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta // get the delegate from the native int. 449491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 450ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta return delegate != null && delegate.mFontVariant == FontVariant.ELEGANT; 45108ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta } 45208ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta 45308ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta @LayoutlibDelegate 454a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetElegantTextHeight(long nativePaint, 455491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta boolean elegant) { 456baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta // get the delegate from the native int. 457491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 458baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta if (delegate == null) { 459baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta return; 460baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta } 461baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta 462ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta delegate.mFontVariant = elegant ? FontVariant.ELEGANT : FontVariant.COMPACT; 46308ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta } 46408ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta 46508ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta @LayoutlibDelegate 466a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nGetTextSize(long nativePaint) { 4679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 468491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 4699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 4719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextSize; 4749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4769a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 477a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetTextSize(long nativePaint, float textSize) { 4789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 479491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 4809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 4829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4846dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (delegate.mTextSize != textSize) { 4856dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.mTextSize = textSize; 4866dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.updateFontObject(); 4876dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 4889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4909a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 491a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nGetTextScaleX(long nativePaint) { 4929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 493491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 4949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 4969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextScaleX; 4999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5019a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 502a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetTextScaleX(long nativePaint, float scaleX) { 5039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 504491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5096dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (delegate.mTextScaleX != scaleX) { 5106dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.mTextScaleX = scaleX; 5116dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.updateFontObject(); 5126dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 5139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5159a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 516a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nGetTextSkewX(long nativePaint) { 5179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 518491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 5219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextSkewX; 5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 527a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static void nSetTextSkewX(long nativePaint, float skewX) { 5289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 529491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5346dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (delegate.mTextSkewX != skewX) { 5356dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.mTextSkewX = skewX; 5366dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.updateFontObject(); 5376dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 5389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5409a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 541a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nAscent(long nativePaint, long nativeTypeface) { 5428da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate 543491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5448da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 5458da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 5468da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 5479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5488da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate.mFonts.size() > 0) { 5498da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 5508da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // Android expects negative ascent so we invert the value from Java. 5518da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return - javaMetrics.getAscent(); 5528da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 5538da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5548da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 5559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5579a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 558a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nDescent(long nativePaint, long nativeTypeface) { 5595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate 560491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 5625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 5635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate.mFonts.size() > 0) { 5665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 5678da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return javaMetrics.getDescent(); 5685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 5718da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5728da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 5738da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5749a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 575a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static float nGetFontMetrics(long nativePaint, long nativeTypeface, 576491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta FontMetrics metrics) { 5778da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate 578491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5798da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 5808da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 5818da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 5828da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5838da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return delegate.getFontMetrics(metrics); 5845802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 5869a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 587a10973ebd1ca33c14f0cb06c22ea9d2f9828ac99Jerome Gaillard /*package*/ static int nGetFontMetricsInt(long nativePaint, 588491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta long nativeTypeface, FontMetricsInt fmi) { 5899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate 590491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 5919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 5939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate.mFonts.size() > 0) { 5965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 5975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (fmi != null) { 5985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // Android expects negative ascent so we invert the value from Java. 5995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.top = - javaMetrics.getMaxAscent(); 6005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.ascent = - javaMetrics.getAscent(); 6015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.descent = javaMetrics.getDescent(); 6025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.bottom = javaMetrics.getMaxDescent(); 6035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.leading = javaMetrics.getLeading(); 6045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return javaMetrics.getHeight(); 6075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 6089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 6105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 6119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6129a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 613491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nBreakText(long nativePaint, long nativeTypeface, char[] text, 61484d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta int index, int count, float maxWidth, int bidiFlags, float[] measuredWidth) { 615c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 616c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // get the delegate 61784d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 618c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (delegate == null) { 619c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return 0; 620c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 621c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 622c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet int inc = count > 0 ? 1 : -1; 623c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 624c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet int measureIndex = 0; 625c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet for (int i = index; i != index + count; i += inc, measureIndex++) { 626c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet int start, end; 627c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (i < index) { 628c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet start = i; 629c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet end = index; 630c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } else { 631c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet start = index; 632c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet end = i; 633c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 634c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 635c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // measure from start to end 63684d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta RectF bounds = delegate.measureText(text, start, end - start + 1, null, 0, bidiFlags); 6375ad7c183f39df43562c69aba21ea422ad69bdae0Deepanshu Gupta float res = bounds.right - bounds.left; 638c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 639c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (measuredWidth != null) { 640c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet measuredWidth[measureIndex] = res; 641c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 642c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 643c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (res > maxWidth) { 644c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // we should not return this char index, but since it's 0-based 645c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // and we need to return a count, we simply return measureIndex; 646c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return measureIndex; 647c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 648c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 649c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 650c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 651c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return measureIndex; 6529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 655491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nBreakText(long nativePaint, long nativeTypeface, String text, 65684d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta boolean measureForwards, 657279c00e8e0abb20f7e10577c77937c058da080bfDeepanshu Gupta float maxWidth, int bidiFlags, float[] measuredWidth) { 658491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta return nBreakText(nativePaint, nativeTypeface, text.toCharArray(), 0, text.length(), 65984d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta maxWidth, bidiFlags, measuredWidth); 6609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6629a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 663491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nInit() { 6649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate newDelegate = new Paint_Delegate(); 665cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 6669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6689a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 669491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nInitWithPaint(long paint) { 6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(paint); 6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 6749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate newDelegate = new Paint_Delegate(delegate); 677cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 6789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6809a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 681491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nReset(long native_object) { 6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.reset(); 6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6919a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 692491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSet(long native_dst, long native_src) { 6939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate_dst = sManager.getDelegate(native_dst); 6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate_dst == null) { 6969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate_src = sManager.getDelegate(native_src); 7019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate_src == null) { 7029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 7039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate_dst.set(delegate_src); 7069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7089a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 709491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nGetStyle(long native_object) { 7109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 7149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStyle; 7179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7199a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 720491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetStyle(long native_object, int style) { 7219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 7259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStyle = style; 7289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7309a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 731491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nGetStrokeCap(long native_object) { 7329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 7369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mCap; 7399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 742491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetStrokeCap(long native_object, int cap) { 7439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 7479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mCap = cap; 7509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7529a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 753491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nGetStrokeJoin(long native_object) { 7549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 7589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mJoin; 7619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7639a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 764491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetStrokeJoin(long native_object, int join) { 7659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 7699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mJoin = join; 7729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7749a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 775491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static boolean nGetFillPath(long native_object, long src, long dst) { 776b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Paint_Delegate paint = sManager.getDelegate(native_object); 777b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (paint == null) { 778b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return false; 779b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 780b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 781b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Path_Delegate srcPath = Path_Delegate.getDelegate(src); 782b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (srcPath == null) { 783b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return true; 784b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 785b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 786b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Path_Delegate dstPath = Path_Delegate.getDelegate(dst); 787b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (dstPath == null) { 788b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return true; 789b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 790b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 791b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Stroke stroke = paint.getJavaStroke(); 792b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape()); 793b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 794b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet dstPath.setJavaShape(strokeShape); 795b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 796b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet // FIXME figure out the return value? 797b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return true; 7989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8009a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 801491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nSetShader(long native_object, long shader) { 802abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 803abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 804abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 805abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return shader; 806abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 807abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 808cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mShader = Shader_Delegate.getDelegate(shader); 809cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet 810cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return shader; 8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8139a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 814491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nSetColorFilter(long native_object, long filter) { 815abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 816abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 817abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 818abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return filter; 819abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 820abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 821baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter); 822d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 823f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta // Log warning if it's not supported. 824f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta if (delegate.mColorFilter != null && !delegate.mColorFilter.isSupported()) { 825918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER, 826cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mColorFilter.getSupportMessage(), null, null /*data*/); 827d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 828d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 829d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet return filter; 8309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8329a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 833f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard /*package*/ static void nSetXfermode(long native_object, int xfermode) { 834abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 835abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 836f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard return; 837abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 838f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard delegate.mPorterDuffMode = xfermode; 8399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 842491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nSetPathEffect(long native_object, long effect) { 843abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 844abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 845abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 846abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return effect; 847abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 848abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 849cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect); 850cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet 851cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return effect; 8529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 855491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nSetMaskFilter(long native_object, long maskfilter) { 856abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 857abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 858abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 859abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return maskfilter; 860abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 861abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 862cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter); 863d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 864d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet // since none of those are supported, display a fidelity warning right away 865f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta if (delegate.mMaskFilter != null && !delegate.mMaskFilter.isSupported()) { 866918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER, 867cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mMaskFilter.getSupportMessage(), null, null /*data*/); 868d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 869d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 870d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet return maskfilter; 8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 874491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nSetTypeface(long native_object, long typeface) { 8759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 8769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 8779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 8789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 8799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8816dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez Typeface_Delegate typefaceDelegate = Typeface_Delegate.getDelegate(typeface); 8826dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (delegate.mTypeface != typefaceDelegate || delegate.mNativeTypeface != typeface) { 8836dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.mTypeface = Typeface_Delegate.getDelegate(typeface); 8846dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.mNativeTypeface = typeface; 8856dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez delegate.updateFontObject(); 8866dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 887cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return typeface; 8889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8909a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 891491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nGetTextAlign(long native_object) { 8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 8949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 8959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 8969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return delegate.mTextAlign; 8999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9019a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 902491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetTextAlign(long native_object, int align) { 9039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 9049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 9059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 9069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 9079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet delegate.mTextAlign = align; 9109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9129a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 913491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nSetTextLocales(long native_object, String locale) { 91484d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta // get the delegate from the native int. 91584d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(native_object); 91684d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta if (delegate == null) { 91784d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta return 0; 91884d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta } 91984d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta 920491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta delegate.setTextLocale(locale); 921491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta return 0; 9229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9249a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 925491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetTextLocalesByMinikinLangListId(long paintPtr, 926491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta int mMinikinLangListId) { 92766743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet // FIXME 92866743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet } 92966743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet 93066743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet @LayoutlibDelegate 931491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static float nGetTextAdvances(long native_object, long native_typeface, 9329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet char[] text, int index, int count, int contextIndex, int contextCount, 933491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta int bidiFlags, float[] advances, int advancesIndex) { 9340d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta 9350d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta if (advances != null) 9360d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta for (int i = advancesIndex; i< advancesIndex+count; i++) 9370d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta advances[i]=0; 9385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate from the native int. 9395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 940baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta if (delegate == null) { 9415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0.f; 9425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 943a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta 944a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta // native_typeface is passed here since Framework's old implementation did not have the 945a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta // typeface object associated with the Paint. Since, we follow the new framework way, 946a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta // we store the typeface with the paint and use it directly. 947a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta assert (native_typeface == delegate.mNativeTypeface); 948a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta 949491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta RectF bounds = delegate.measureText(text, index, count, advances, advancesIndex, bidiFlags); 9505ad7c183f39df43562c69aba21ea422ad69bdae0Deepanshu Gupta return bounds.right - bounds.left; 9519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9539a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 954491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static float nGetTextAdvances(long native_object, long native_typeface, 9559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet String text, int start, int end, int contextStart, int contextEnd, 956491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta int bidiFlags, float[] advances, int advancesIndex) { 9570d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta // FIXME: support contextStart and contextEnd 9585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int count = end - start; 9595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet char[] buffer = TemporaryBuffer.obtain(count); 9605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet TextUtils.getChars(text, start, end, buffer, 0); 9615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 962491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta return nGetTextAdvances(native_object, native_typeface, buffer, 0, count, 963491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta contextStart, contextEnd - contextStart, bidiFlags, advances, advancesIndex); 9649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9669a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 96795f36e23c328384493a8455f106dc5e88688295dJerome Gaillard /*package*/ static int nGetTextRunCursor(Paint paint, long native_object, long typefacePtr, 96895f36e23c328384493a8455f106dc5e88688295dJerome Gaillard char[] text, int contextStart, int contextLength, int flags, int offset, 96995f36e23c328384493a8455f106dc5e88688295dJerome Gaillard int cursorOpt) { 9709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 9718a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 9728a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextRunCursor is not supported.", null, null /*data*/); 9738a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet return 0; 9749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9769a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 97795f36e23c328384493a8455f106dc5e88688295dJerome Gaillard /*package*/ static int nGetTextRunCursor(Paint paint, long native_object, long typefacePtr, 97895f36e23c328384493a8455f106dc5e88688295dJerome Gaillard String text, int contextStart, int contextEnd, int flags, int offset, int cursorOpt) { 9799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 9808a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 9818a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextRunCursor is not supported.", null, null /*data*/); 9828a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet return 0; 9839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9859a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 986491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nGetTextPath(long native_object, long native_typeface, 987ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta int bidiFlags, char[] text, int index, int count, float x, float y, long path) { 9889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 9898a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 9908a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextPath is not supported.", null, null /*data*/); 9919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9939a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 994491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nGetTextPath(long native_object, long native_typeface, 995ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta int bidiFlags, String text, int start, int end, float x, float y, long path) { 9969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 9978a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 9988a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextPath is not supported.", null, null /*data*/); 9999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10019a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 1002491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nGetStringBounds(long nativePaint, long native_typeface, 1003ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta String text, int start, int end, int bidiFlags, Rect bounds) { 1004491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta nGetCharArrayBounds(nativePaint, native_typeface, text.toCharArray(), start, 1005ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta end - start, bidiFlags, bounds); 10069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10089a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 1009491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nGetCharArrayBounds(long nativePaint, long native_typeface, 1010ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta char[] text, int index, int count, int bidiFlags, Rect bounds) { 1011c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 1012c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // get the delegate from the native int. 1013c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1014baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta if (delegate == null) { 1015c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return; 1016c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 1017a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta 1018a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta // assert that the typeface passed is actually the one that we had stored. 1019a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta assert (native_typeface == delegate.mNativeTypeface); 1020a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta 102184d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta delegate.measureText(text, index, count, null, 0, bidiFlags).roundOut(bounds); 10229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10249a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 1025491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static long nGetNativeFinalizer() { 1026491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta synchronized (Paint_Delegate.class) { 1027491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta if (sFinalizer == -1) { 1028491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta sFinalizer = NativeAllocationRegistry_Delegate.createFinalizer( 1029491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta sManager::removeJavaReferenceFor); 1030491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta } 1031491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta } 1032491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta return sFinalizer; 10339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10351840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta @LayoutlibDelegate 1036491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static float nGetLetterSpacing(long nativePaint) { 1037d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1038d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (delegate == null) { 1039d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return 0; 1040d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1041d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return delegate.mLetterSpacing; 10421840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta } 10431840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta 10441840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta @LayoutlibDelegate 1045491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetLetterSpacing(long nativePaint, float letterSpacing) { 10461ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta Bridge.getLog().fidelityWarning(LayoutLog.TAG_TEXT_RENDERING, 10471ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta "Paint.setLetterSpacing() not supported.", null, null); 1048d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1049d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (delegate == null) { 1050d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return; 1051d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1052d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta delegate.mLetterSpacing = letterSpacing; 10531840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta } 10541840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta 10551840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta @LayoutlibDelegate 1056f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard /*package*/ static float nGetWordSpacing(long nativePaint) { 1057f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1058f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard if (delegate == null) { 1059f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard return 0; 1060f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard } 1061f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard return delegate.mWordSpacing; 1062f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard } 1063f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard 1064f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard @LayoutlibDelegate 1065f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard /*package*/ static void nSetWordSpacing(long nativePaint, float wordSpacing) { 1066f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1067f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard if (delegate == null) { 1068f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard return; 1069f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard } 1070f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard delegate.mWordSpacing = wordSpacing; 1071f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard } 1072f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard 1073f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard @LayoutlibDelegate 1074491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetFontFeatureSettings(long nativePaint, String settings) { 10751ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta Bridge.getLog().fidelityWarning(LayoutLog.TAG_TEXT_RENDERING, 1076d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta "Paint.setFontFeatureSettings() not supported.", null, null); 1077d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1078d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1079d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @LayoutlibDelegate 1080491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nGetHyphenEdit(long nativePaint) { 1081d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1082d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (delegate == null) { 1083d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return 0; 1084d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1085d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return delegate.mHyphenEdit; 1086d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1087d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1088d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @LayoutlibDelegate 1089491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static void nSetHyphenEdit(long nativePaint, int hyphen) { 1090d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1091d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (delegate == null) { 1092d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return; 1093d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1094d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta delegate.mHyphenEdit = hyphen; 1095d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1096d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1097d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @LayoutlibDelegate 1098491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static boolean nHasGlyph(long nativePaint, long nativeTypeface, int bidiFlags, 1099d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta String string) { 1100d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1101d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (delegate == null) { 1102d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return false; 1103d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1104d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (string.length() == 0) { 1105d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return false; 1106d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1107d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (string.length() > 1) { 11081ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta Bridge.getLog().fidelityWarning(LayoutLog.TAG_TEXT_RENDERING, 1109d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta "Paint.hasGlyph() is not supported for ligatures.", null, null); 1110d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return false; 1111d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1112d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta assert nativeTypeface == delegate.mNativeTypeface; 1113d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta Typeface_Delegate typeface_delegate = Typeface_Delegate.getDelegate(nativeTypeface); 1114d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1115d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta char c = string.charAt(0); 1116d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta for (Font font : typeface_delegate.getFonts(delegate.mFontVariant)) { 1117d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta if (font.canDisplay(c)) { 1118d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return true; 1119d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1120d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1121d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return false; 1122d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1123d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1124d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1125d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @LayoutlibDelegate 1126491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static float nGetRunAdvance(long nativePaint, long nativeTypeface, 1127d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @NonNull char[] text, int start, int end, int contextStart, int contextEnd, 1128d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta boolean isRtl, int offset) { 1129d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta int count = end - start; 1130d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float[] advances = new float[count]; 1131491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR; 1132491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta nGetTextAdvances(nativePaint, nativeTypeface, text, start, count, 1133491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta contextStart, contextEnd - contextStart, bidiFlags, advances, 0); 1134cd595f1998b1331fe0efba02d96c95ee43e791daDeepanshu Gupta int startOffset = offset - start; // offset from start. 1135d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float sum = 0; 1136cd595f1998b1331fe0efba02d96c95ee43e791daDeepanshu Gupta for (int i = 0; i < startOffset; i++) { 1137d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta sum += advances[i]; 1138d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1139d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return sum; 1140d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1141d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta 1142d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta @LayoutlibDelegate 1143491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta /*package*/ static int nGetOffsetForAdvance(long nativePaint, long nativeTypeface, 1144d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, 1145d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float advance) { 1146d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta int count = end - start; 1147d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float[] advances = new float[count]; 1148491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR; 1149491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta nGetTextAdvances(nativePaint, nativeTypeface, text, start, count, 1150491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta contextStart, contextEnd - contextStart, bidiFlags, advances, 0); 1151d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float sum = 0; 1152d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta int i; 1153d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta for (i = 0; i < count && sum < advance; i++) { 1154d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta sum += advances[i]; 1155d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta } 1156d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float distanceToI = sum - advance; 1157d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta float distanceToIMinus1 = advance - (sum - advances[i]); 1158d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta return distanceToI > distanceToIMinus1 ? i : i - 1; 11591840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta } 11601840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta 11619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- Private delegate/helper methods ---- 11629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1163d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet /*package*/ Paint_Delegate() { 11649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet reset(); 11659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private Paint_Delegate(Paint_Delegate paint) { 11689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet set(paint); 11699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void set(Paint_Delegate paint) { 11729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFlags = paint.mFlags; 11739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mColor = paint.mColor; 11749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStyle = paint.mStyle; 11759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mCap = paint.mCap; 11769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mJoin = paint.mJoin; 11775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet mTextAlign = paint.mTextAlign; 11786dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 11796dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez boolean needsFontUpdate = false; 11806dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (mTypeface != paint.mTypeface || mNativeTypeface != paint.mNativeTypeface) { 11816dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez mTypeface = paint.mTypeface; 11826dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez mNativeTypeface = paint.mNativeTypeface; 11836dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez needsFontUpdate = true; 11846dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 11856dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 11866dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (mTextSize != paint.mTextSize) { 11876dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez mTextSize = paint.mTextSize; 11886dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez needsFontUpdate = true; 11896dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 11906dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 11916dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (mTextScaleX != paint.mTextScaleX) { 11926dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez mTextScaleX = paint.mTextScaleX; 11936dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez needsFontUpdate = true; 11946dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 11956dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 11966dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (mTextSkewX != paint.mTextSkewX) { 11976dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez mTextSkewX = paint.mTextSkewX; 11986dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez needsFontUpdate = true; 11996dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 12006dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 12019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeWidth = paint.mStrokeWidth; 12029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeMiter = paint.mStrokeMiter; 1203f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard mPorterDuffMode = paint.mPorterDuffMode; 1204abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mColorFilter = paint.mColorFilter; 1205abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mShader = paint.mShader; 1206abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mPathEffect = paint.mPathEffect; 1207abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mMaskFilter = paint.mMaskFilter; 12088433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet mHintingMode = paint.mHintingMode; 12096dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 12106dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (needsFontUpdate) { 12116dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez updateFontObject(); 12126dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 12139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 12159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void reset() { 1216caa6226b1735ae074ec3861e2424bbd2276b88a0Chris Craik mFlags = Paint.HIDDEN_DEFAULT_PAINT_FLAGS; 1217d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mColor = 0xFF000000; 121863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mStyle = Paint.Style.FILL.nativeInt; 121963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mCap = Paint.Cap.BUTT.nativeInt; 122063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mJoin = Paint.Join.MITER.nativeInt; 12215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet mTextAlign = 0; 1222cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance); 1223a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta mNativeTypeface = 0; 12249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeWidth = 1.f; 1225d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mStrokeMiter = 4.f; 12269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSize = 20.f; 12279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX = 1.f; 12289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSkewX = 0.f; 1229f666c0e2eaceb265069a77c520e84c1a08f08ae4Jerome Gaillard mPorterDuffMode = Xfermode.DEFAULT; 1230cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mColorFilter = null; 1231cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mShader = null; 1232cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mPathEffect = null; 1233cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mMaskFilter = null; 1234b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet updateFontObject(); 12358433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet mHintingMode = Paint.HINTING_ON; 12369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 12389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 12399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Update the {@link Font} object from the typeface, text size and scaling 12409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 1241d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet @SuppressWarnings("deprecation") 12429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void updateFontObject() { 1243cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mTypeface != null) { 12449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // Get the fonts from the TypeFace object. 1245ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta List<Font> fonts = mTypeface.getFonts(mFontVariant); 12469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 12476dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez if (fonts.isEmpty()) { 12486dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez mFonts = Collections.emptyList(); 12496dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez return; 12506dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez } 12516dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez 12529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // create new font objects as well as FontMetrics, based on the current text size 12539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // and skew info. 12546dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez int nFonts = fonts.size(); 12556dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(nFonts); 12566dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez //noinspection ForLoopReplaceableByForEach (avoid iterator instantiation) 12576dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez for (int i = 0; i < nFonts; i++) { 12586dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez Font font = fonts.get(i); 1259e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta if (font == null) { 1260e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta // If the font is null, add null to infoList. When rendering the text, if this 1261e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta // null is reached, a warning will be logged. 1262e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta infoList.add(null); 1263e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta continue; 1264e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta } 12659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet FontInfo info = new FontInfo(); 12669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mFont = font.deriveFont(mTextSize); 12679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (mTextScaleX != 1.0 || mTextSkewX != 0) { 12689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // TODO: support skew 12699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mFont = info.mFont.deriveFont(new AffineTransform( 1270d410bfb2001e7960a27fe6adb9d56f229e70fe5cXavier Ducrohet mTextScaleX, mTextSkewX, 0, 1, 0, 0)); 12719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12720d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta // The metrics here don't have anti-aliasing set. 12739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont); 12749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 12759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet infoList.add(info); 12769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 12789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFonts = Collections.unmodifiableList(infoList); 12799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 128284d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta /*package*/ RectF measureText(char[] text, int index, int count, float[] advances, 128384d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta int advancesIndex, int bidiFlags) { 128484d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta return new BidiRenderer(null, this, text) 128584d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta .renderText(index, index + count, bidiFlags, advances, advancesIndex, false); 128684d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta } 128784d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta 128884d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta /*package*/ RectF measureText(char[] text, int index, int count, float[] advances, 128984d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta int advancesIndex, boolean isRtl) { 129084d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta return new BidiRenderer(null, this, text) 129184d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta .renderText(index, index + count, isRtl, advances, advancesIndex, false); 12928da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 12935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 12948da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet private float getFontMetrics(FontMetrics metrics) { 12958da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (mFonts.size() > 0) { 12968da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics; 12978da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (metrics != null) { 12988da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // Android expects negative ascent so we invert the value from Java. 12998da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.top = - javaMetrics.getMaxAscent(); 13008da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.ascent = - javaMetrics.getAscent(); 13018da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.descent = javaMetrics.getDescent(); 13028da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.bottom = javaMetrics.getMaxDescent(); 13038da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.leading = javaMetrics.getLeading(); 13048da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 13058da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 13068da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return javaMetrics.getHeight(); 13078da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 13088da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 13098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 13105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 13115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1312cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet private void setTextLocale(String locale) { 1313cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet mLocale = new Locale(locale); 1314cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet } 13158da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 1316491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta private static void setFlag(long nativePaint, int flagMask, boolean flagValue) { 13179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 1318491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta Paint_Delegate delegate = sManager.getDelegate(nativePaint); 13199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 13209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 13219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 13229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 13239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (flagValue) { 13249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags |= flagMask; 13259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } else { 13269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags &= ~flagMask; 13279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 13289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 13299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet} 1330