Paint_Delegate.java revision f0a53435f14d23d9555fc46014352ee6a7baa647
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 249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetrics; 259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetricsInt; 265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport android.text.TextUtils; 279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport java.awt.BasicStroke; 299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Font; 30b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Shape; 31b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Stroke; 329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Toolkit; 339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.font.FontRenderContext; 349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.geom.AffineTransform; 35c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohetimport java.awt.geom.Rectangle2D; 369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.ArrayList; 379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.Collections; 389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.List; 399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/** 419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Paint 429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Paint have been replaced 449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * by calls to methods of the same name in this delegate class. 459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * it and the original Paint class. 499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * @see DelegateManager 519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * 529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpublic class Paint_Delegate { 549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Class associating a {@link Font} and it's {@link java.awt.FontMetrics}. 579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ static final class FontInfo { 599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Font mFont; 609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet java.awt.FontMetrics mMetrics; 619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- delegate manager ---- 649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private static final DelegateManager<Paint_Delegate> sManager = 65f0a53435f14d23d9555fc46014352ee6a7baa647Xavier Ducrohet new DelegateManager<Paint_Delegate>(Paint_Delegate.class); 669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- delegate helper data ---- 689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private List<FontInfo> mFonts; 699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private final FontRenderContext mFontContext = new FontRenderContext( 709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet new AffineTransform(), true, true); 719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- delegate data ---- 739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mFlags; 749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mColor; 759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mStyle; 769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mCap; 779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private int mJoin; 785802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet private int mTextAlign; 79cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Typeface_Delegate mTypeface; 809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mStrokeWidth; 819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mStrokeMiter; 829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mTextSize; 839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mTextScaleX; 849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private float mTextSkewX; 859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 86cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Xfermode_Delegate mXfermode; 87cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private ColorFilter_Delegate mColorFilter; 88cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Shader_Delegate mShader; 89cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private PathEffect_Delegate mPathEffect; 90cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private MaskFilter_Delegate mMaskFilter; 91cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Rasterizer_Delegate mRasterizer; 92abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- Public Helper methods ---- 959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public static Paint_Delegate getDelegate(int native_paint) { 975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return sManager.getDelegate(native_paint); 985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 1019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Returns the list of {@link Font} objects. The first item is the main font, the rest 1029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * are fall backs for characters not present in the main font. 1039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 1049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet public List<FontInfo> getFonts() { 1059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return mFonts; 1069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 1079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 108abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet public boolean isAntiAliased() { 109abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0; 110abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 111abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 1125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public boolean isFilterBitmap() { 1135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0; 1145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getStyle() { 1175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mStyle; 1185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getColor() { 1215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mColor; 1225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 12463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet public int getAlpha() { 12563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet return mColor >>> 24; 12663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } 12763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet 128d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet public void setAlpha(int alpha) { 129d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mColor = (alpha << 24) | (mColor & 0x00FFFFFF); 130d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet } 131d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet 1325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getTextAlign() { 1335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mTextAlign; 1345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public float getStrokeWidth() { 1375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mStrokeWidth; 1385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 14063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet /** 14163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet * returns the value of stroke miter needed by the java api. 14263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet */ 14363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet public float getJavaStrokeMiter() { 144d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet float miter = mStrokeMiter * mStrokeWidth; 145d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet if (miter < 1.f) { 146d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet miter = 1.f; 147d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet } 148d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet return miter; 1495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getJavaCap() { 1525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet switch (Paint.sCapArray[mCap]) { 1535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case BUTT: 1545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_BUTT; 1555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case ROUND: 1565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_ROUND; 1575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet default: 1585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case SQUARE: 1595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_SQUARE; 1605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getJavaJoin() { 1645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet switch (Paint.sJoinArray[mJoin]) { 1655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet default: 1665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case MITER: 1675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_MITER; 1685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case ROUND: 1695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_ROUND; 1705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case BEVEL: 1715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_BEVEL; 1725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 175b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet public Stroke getJavaStroke() { 176cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mPathEffect != null) { 177cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mPathEffect.isSupported()) { 178cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet Stroke stroke = mPathEffect.getStroke(this); 179b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet assert stroke != null; 180b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (stroke != null) { 181b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return stroke; 182b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 183b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } else { 184918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT, 185cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mPathEffect.getSupportMessage(), 18651a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet null, null /*data*/); 187b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 188b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 189b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 190b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet // if no custom stroke as been set, set the default one. 191b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return new BasicStroke( 192b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getStrokeWidth(), 193b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getJavaCap(), 194b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getJavaJoin(), 195b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet getJavaStrokeMiter()); 196b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 197b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 198d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 199d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link Xfermode} delegate or null if none have been set 200d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 201d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 202d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 203d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public Xfermode_Delegate getXfermode() { 204cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mXfermode; 205251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 206251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 207d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 208d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link ColorFilter} delegate or null if none have been set 209d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 210d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 211d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 212d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public ColorFilter_Delegate getColorFilter() { 213cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mColorFilter; 214251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 215251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 216d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 217d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link Shader} delegate or null if none have been set 218d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 219d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 220d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 221d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public Shader_Delegate getShader() { 222cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mShader; 223251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 224251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 225d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 226d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link MaskFilter} delegate or null if none have been set 227d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 228d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 229d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 230d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public MaskFilter_Delegate getMaskFilter() { 231cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mMaskFilter; 232d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 233d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 234d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet /** 235d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * Returns the {@link Rasterizer} delegate or null if none have been set 236d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * 237d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet * @return the delegate or null. 238d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet */ 239d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet public Rasterizer_Delegate getRasterizer() { 240cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mRasterizer; 241251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 242251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 2439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- native methods ---- 2449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2459a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int getFlags(Paint thisPaint) { 2479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mFlags; 2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2569a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setFlags(Paint thisPaint, int flags) { 2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags = flags; 2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2679a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) { 2695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter); 2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) { 2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa); 2759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2779a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) { 2799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText); 2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2829a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) { 2849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText); 2859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2879a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) { 2899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText); 2909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2929a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) { 2949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText); 2959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2979a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 2989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setDither(Paint thisPaint, boolean dither) { 2999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.DITHER_FLAG, dither); 3009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3029a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) { 3049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText); 3059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3079a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int getColor(Paint thisPaint) { 3099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mColor; 3169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3189a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setColor(Paint thisPaint, int color) { 3209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mColor = color; 3279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3299a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int getAlpha(Paint thisPaint) { 3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 33763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet return delegate.getAlpha(); 3389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3409a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setAlpha(Paint thisPaint, int a) { 3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 348d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet delegate.setAlpha(a); 3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3519a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getStrokeWidth(Paint thisPaint) { 3539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStrokeWidth; 3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3629a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setStrokeWidth(Paint thisPaint, float width) { 3649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStrokeWidth = width; 3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getStrokeMiter(Paint thisPaint) { 3759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStrokeMiter; 3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3849a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) { 3869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStrokeMiter = miter; 3939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3959a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 3969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy, 3979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int color) { 3989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 399918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 40051a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Paint.setShadowLayer is not supported.", null, null /*data*/); 4019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4039a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getTextSize(Paint thisPaint) { 4059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 4069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 4099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextSize; 4129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4149a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setTextSize(Paint thisPaint, float textSize) { 4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 4179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 4209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mTextSize = textSize; 423b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 4249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getTextScaleX(Paint thisPaint) { 4289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextScaleX; 4359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4379a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) { 4399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 4409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 4439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mTextScaleX = scaleX; 446b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 4479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4499a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getTextSkewX(Paint thisPaint) { 4519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 4529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 4559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextSkewX; 4589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) { 4629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 4639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 4669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mTextSkewX = skewX; 469b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 4709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float ascent(Paint thisPaint) { 4748da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate 4758da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4768da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 4778da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 4788da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 4799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4808da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate.mFonts.size() > 0) { 4818da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 4828da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // Android expects negative ascent so we invert the value from Java. 4838da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return - javaMetrics.getAscent(); 4848da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 4858da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 4868da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 4879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4899a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 4908da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet /*package*/ static float descent(Paint thisPaint) { 4915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate 4925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 4945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 4955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate.mFonts.size() > 0) { 4985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 4998da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return javaMetrics.getDescent(); 5005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 5038da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5048da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 5058da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5069a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 5078da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) { 5088da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate 5098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 5108da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 5118da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 5128da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 5138da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 5148da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return delegate.getFontMetrics(metrics); 5155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 5179a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 5185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) { 5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate 5209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 5219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 5239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate.mFonts.size() > 0) { 5265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 5275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (fmi != null) { 5285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // Android expects negative ascent so we invert the value from Java. 5295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.top = - javaMetrics.getMaxAscent(); 5305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.ascent = - javaMetrics.getAscent(); 5315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.descent = javaMetrics.getDescent(); 5325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.bottom = javaMetrics.getMaxDescent(); 5335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.leading = javaMetrics.getLeading(); 5345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return javaMetrics.getHeight(); 5375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 5405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 5419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 5435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index, 5445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int count) { 5455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate 5465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 5475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 5485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 5499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return delegate.measureText(text, index, count); 5529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 5559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) { 5569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return native_measureText(thisPaint, text.toCharArray(), start, end - start); 5579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5599a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 5609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_measureText(Paint thisPaint, String text) { 5619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return native_measureText(thisPaint, text.toCharArray(), 0, text.length()); 5629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5649a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 5659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count, 5669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet float maxWidth, float[] measuredWidth) { 567c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 568c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // get the delegate 569c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 570c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (delegate == null) { 571c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return 0; 572c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 573c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 574c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet int inc = count > 0 ? 1 : -1; 575c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 576c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet int measureIndex = 0; 577c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet float measureAcc = 0; 578c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet for (int i = index; i != index + count; i += inc, measureIndex++) { 579c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet int start, end; 580c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (i < index) { 581c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet start = i; 582c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet end = index; 583c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } else { 584c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet start = index; 585c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet end = i; 586c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 587c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 588c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // measure from start to end 589c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet float res = delegate.measureText(text, start, end - start + 1); 590c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 591c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (measuredWidth != null) { 592c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet measuredWidth[measureIndex] = res; 593c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 594c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 595c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet measureAcc += res; 596c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (res > maxWidth) { 597c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // we should not return this char index, but since it's 0-based 598c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // and we need to return a count, we simply return measureIndex; 599c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return measureIndex; 600c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 601c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 602c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 603c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 604c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return measureIndex; 6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6079a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards, 6099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet float maxWidth, float[] measuredWidth) { 610c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return native_breakText(thisPaint, text.toCharArray(), 0, text.length(), maxWidth, 611c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet measuredWidth); 6129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6149a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_init() { 6169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate newDelegate = new Paint_Delegate(); 617cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 6189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6209a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_initWithPaint(int paint) { 6229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(paint); 6249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 6269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate newDelegate = new Paint_Delegate(delegate); 629cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 6309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6329a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_reset(int native_object) { 6349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.reset(); 6419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6439a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_set(int native_dst, int native_src) { 6459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate_dst = sManager.getDelegate(native_dst); 6479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate_dst == null) { 6489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate_src = sManager.getDelegate(native_src); 6539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate_src == null) { 6549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate_dst.set(delegate_src); 6589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getStyle(int native_object) { 6629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 6669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStyle; 6699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6719a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setStyle(int native_object, int style) { 6739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStyle = style; 6809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6829a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getStrokeCap(int native_object) { 6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 6889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mCap; 6919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6939a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setStrokeCap(int native_object, int cap) { 6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mCap = cap; 7029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7049a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getStrokeJoin(int native_object) { 7069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 7109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mJoin; 7139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7159a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setStrokeJoin(int native_object, int join) { 7179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 7219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mJoin = join; 7249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) { 728b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Paint_Delegate paint = sManager.getDelegate(native_object); 729b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (paint == null) { 730b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return false; 731b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 732b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 733b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Path_Delegate srcPath = Path_Delegate.getDelegate(src); 734b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (srcPath == null) { 735b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return true; 736b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 737b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 738b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Path_Delegate dstPath = Path_Delegate.getDelegate(dst); 739b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet if (dstPath == null) { 740b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return true; 741b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet } 742b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 743b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Stroke stroke = paint.getJavaStroke(); 744b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape()); 745b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 746b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet dstPath.setJavaShape(strokeShape); 747b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet 748b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet // FIXME figure out the return value? 749b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet return true; 7509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7529a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setShader(int native_object, int shader) { 754abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 755abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 756abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 757abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return shader; 758abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 759abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 760cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mShader = Shader_Delegate.getDelegate(shader); 761cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet 762cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return shader; 7639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setColorFilter(int native_object, int filter) { 767abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 768abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 769abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 770abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return filter; 771abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 772abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 773cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);; 774d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 775d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet // since none of those are supported, display a fidelity warning right away 776cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (delegate.mColorFilter != null && delegate.mColorFilter.isSupported() == false) { 777918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER, 778cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mColorFilter.getSupportMessage(), null, null /*data*/); 779d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 780d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 781d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet return filter; 7829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7849a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setXfermode(int native_object, int xfermode) { 786abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 787abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 788abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 789abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return xfermode; 790abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 791abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 792cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mXfermode = Xfermode_Delegate.getDelegate(xfermode); 793cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet 794cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return xfermode; 7959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7979a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 7989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setPathEffect(int native_object, int effect) { 799abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 800abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 801abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 802abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return effect; 803abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 804abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 805cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect); 806cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet 807cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return effect; 8089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8109a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) { 812abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 813abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 814abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 815abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return maskfilter; 816abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 817abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 818cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter); 819d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 820d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet // since none of those are supported, display a fidelity warning right away 821cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (delegate.mMaskFilter != null && delegate.mMaskFilter.isSupported() == false) { 822918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER, 823cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mMaskFilter.getSupportMessage(), null, null /*data*/); 824d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 825d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 826d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet return maskfilter; 8279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8299a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setTypeface(int native_object, int typeface) { 8319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 8329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 8339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 8349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 8359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 837cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mTypeface = Typeface_Delegate.getDelegate(typeface); 838b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 839cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return typeface; 8409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setRasterizer(int native_object, int rasterizer) { 844d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet // get the delegate from the native int. 845d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 846d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet if (delegate == null) { 847d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet return rasterizer; 848d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 849d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 850cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer); 851d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 852d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet // since none of those are supported, display a fidelity warning right away 853cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (delegate.mRasterizer != null && delegate.mRasterizer.isSupported() == false) { 854918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER, 855cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet delegate.mRasterizer.getSupportMessage(), null, null /*data*/); 856d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet } 857d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet 858d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet return rasterizer; 8599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8619a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextAlign(int native_object) { 8639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 8649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 8659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 8669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 8679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return delegate.mTextAlign; 8709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setTextAlign(int native_object, int align) { 8749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 8759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 8769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 8779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 8789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8805802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet delegate.mTextAlign = align; 8819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8839a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) { 8858da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate from the native int. 8868da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_paint); 8878da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 8888da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0.f; 8898da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 8908da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 8918da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return delegate.getFontMetrics(metrics); 8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8949a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 8959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextWidths(int native_object, char[] text, int index, 8969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int count, float[] widths) { 897c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // get the delegate from the native int. 898c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 899c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (delegate == null) { 900c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return 0; 901c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 902c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 903c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (delegate.mFonts.size() > 0) { 904c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // FIXME: handle multi-char characters (see measureText) 905c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet float totalAdvance = 0; 906c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet for (int i = 0; i < count; i++) { 907c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet char c = text[i + index]; 908c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet boolean found = false; 909c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet for (FontInfo info : delegate.mFonts) { 910c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (info.mFont.canDisplay(c)) { 911c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet float adv = info.mMetrics.charWidth(c); 912c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet totalAdvance += adv; 913c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (widths != null) { 914c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet widths[i] = adv; 915c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 916c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 917c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet found = true; 918c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet break; 919c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 920c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 921c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 922c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (found == false) { 923c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // no advance for this char. 924c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (widths != null) { 925c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet widths[i] = 0.f; 926c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 927c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 928c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 929c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 930c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return (int) totalAdvance; 931c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 932c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 9338a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet return 0; 9349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9369a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 9379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextWidths(int native_object, String text, int start, 9389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int end, float[] widths) { 939c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return native_getTextWidths(native_object, text.toCharArray(), start, end - start, widths); 9409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 9439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_getTextRunAdvances(int native_object, 9449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet char[] text, int index, int count, int contextIndex, int contextCount, 9459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int flags, float[] advances, int advancesIndex) { 9465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate from the native int. 9475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 9485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 9495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0.f; 9505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate.mFonts.size() > 0) { 953251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // FIXME: handle multi-char characters (see measureText) 9545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet float totalAdvance = 0; 9555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet for (int i = 0; i < count; i++) { 9565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet char c = text[i + index]; 9575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet boolean found = false; 9585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet for (FontInfo info : delegate.mFonts) { 9595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (info.mFont.canDisplay(c)) { 9605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet float adv = info.mMetrics.charWidth(c); 9615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet totalAdvance += adv; 9625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (advances != null) { 9635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet advances[i] = adv; 9645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet found = true; 9675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet break; 9685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (found == false) { 9725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // no advance for this char. 9735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (advances != null) { 9745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet advances[i] = 0.f; 9755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9785802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return totalAdvance; 9805802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9825802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 9835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9869a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 9879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_getTextRunAdvances(int native_object, 9889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet String text, int start, int end, int contextStart, int contextEnd, 9899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int flags, float[] advances, int advancesIndex) { 9905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // FIXME: support contextStart, contextEnd and direction flag 9915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int count = end - start; 9925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet char[] buffer = TemporaryBuffer.obtain(count); 9935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet TextUtils.getChars(text, start, end, buffer, 0); 9945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart, 9965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet contextEnd - contextStart, flags, advances, advancesIndex); 9979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9999a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text, 10019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int contextStart, int contextLength, int flags, int offset, int cursorOpt) { 10029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 10038a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 10048a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextRunCursor is not supported.", null, null /*data*/); 10058a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet return 0; 10069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10089a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text, 10109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int contextStart, int contextEnd, int flags, int offset, int cursorOpt) { 10119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 10128a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 10138a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextRunCursor is not supported.", null, null /*data*/); 10148a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet return 0; 10159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10179a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_getTextPath(int native_object, int bidiFlags, 10199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet char[] text, int index, int count, float x, float y, int path) { 10209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 10218a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 10228a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextPath is not supported.", null, null /*data*/); 10239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10259a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_getTextPath(int native_object, int bidiFlags, 10279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet String text, int start, int end, float x, float y, int path) { 10289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 10298a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 10308a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet "Paint.getTextPath is not supported.", null, null /*data*/); 10319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10339a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start, 10359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int end, Rect bounds) { 1036c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bounds); 10379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10399a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index, 10419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int count, Rect bounds) { 1042c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 1043c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // get the delegate from the native int. 1044c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(nativePaint); 1045c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (delegate == null) { 1046c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return; 1047c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 1048c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 1049c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // FIXME should test if the main font can display all those characters. 1050c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // See MeasureText 1051c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet if (delegate.mFonts.size() > 0) { 1052c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet FontInfo mainInfo = delegate.mFonts.get(0); 1053c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 1054c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet Rectangle2D rect = mainInfo.mFont.getStringBounds(text, index, index + count, 1055c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet delegate.mFontContext); 1056c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet bounds.set(0, 0, (int) rect.getWidth(), (int) rect.getHeight()); 1057c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet } 10589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 10619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void finalizer(int nativePaint) { 1062cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet sManager.removeJavaReferenceFor(nativePaint); 10639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- Private delegate/helper methods ---- 10669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1067d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet /*package*/ Paint_Delegate() { 10689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet reset(); 10699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private Paint_Delegate(Paint_Delegate paint) { 10729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet set(paint); 10739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void set(Paint_Delegate paint) { 10769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFlags = paint.mFlags; 10779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mColor = paint.mColor; 10789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStyle = paint.mStyle; 10799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mCap = paint.mCap; 10809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mJoin = paint.mJoin; 10815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet mTextAlign = paint.mTextAlign; 10829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTypeface = paint.mTypeface; 10839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeWidth = paint.mStrokeWidth; 10849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeMiter = paint.mStrokeMiter; 10859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSize = paint.mTextSize; 10869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX = paint.mTextScaleX; 10879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSkewX = paint.mTextSkewX; 1088abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mXfermode = paint.mXfermode; 1089abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mColorFilter = paint.mColorFilter; 1090abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mShader = paint.mShader; 1091abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mPathEffect = paint.mPathEffect; 1092abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mMaskFilter = paint.mMaskFilter; 1093d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet mRasterizer = paint.mRasterizer; 1094b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet updateFontObject(); 10959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 10969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 10979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void reset() { 10989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFlags = Paint.DEFAULT_PAINT_FLAGS; 1099d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mColor = 0xFF000000; 110063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mStyle = Paint.Style.FILL.nativeInt; 110163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mCap = Paint.Cap.BUTT.nativeInt; 110263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet mJoin = Paint.Join.MITER.nativeInt; 11035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet mTextAlign = 0; 1104cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance); 11059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeWidth = 1.f; 1106d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mStrokeMiter = 4.f; 11079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSize = 20.f; 11089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX = 1.f; 11099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSkewX = 0.f; 1110cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mXfermode = null; 1111cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mColorFilter = null; 1112cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mShader = null; 1113cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mPathEffect = null; 1114cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mMaskFilter = null; 1115cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet mRasterizer = null; 1116b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet updateFontObject(); 11179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 11209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Update the {@link Font} object from the typeface, text size and scaling 11219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 1122d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet @SuppressWarnings("deprecation") 11239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void updateFontObject() { 1124cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mTypeface != null) { 11259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // Get the fonts from the TypeFace object. 1126cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet List<Font> fonts = mTypeface.getFonts(); 11279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // create new font objects as well as FontMetrics, based on the current text size 11299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // and skew info. 11309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size()); 11319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet for (Font font : fonts) { 11329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet FontInfo info = new FontInfo(); 11339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mFont = font.deriveFont(mTextSize); 11349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (mTextScaleX != 1.0 || mTextSkewX != 0) { 11359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // TODO: support skew 11369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mFont = info.mFont.deriveFont(new AffineTransform( 11379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX, mTextSkewX, 0, 0, 1, 0)); 11389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont); 11409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet infoList.add(info); 11429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFonts = Collections.unmodifiableList(infoList); 11459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 11479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 11485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ float measureText(char[] text, int index, int count) { 1149c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 1150c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // WARNING: the logic in this method is similar to Canvas_Delegate.native_drawText 1151c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet // Any change to this method should be reflected there as well 1152c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 11535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (mFonts.size() > 0) { 11545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet FontInfo mainFont = mFonts.get(0); 11555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int i = index; 11565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int lastIndex = index + count; 11575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet float total = 0f; 11585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet while (i < lastIndex) { 11595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // always start with the main font. 11605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex); 11615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (upTo == -1) { 11625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // shortcut to exit 11635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i); 11645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } else if (upTo > 0) { 11655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet total += mainFont.mMetrics.charsWidth(text, i, upTo - i); 11665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet i = upTo; 11675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // don't call continue at this point. Since it is certain the main font 11685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // cannot display the font a index upTo (now ==i), we move on to the 11695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // fallback fonts directly. 11705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 11715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 11725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // no char supported, attempt to read the next char(s) with the 11735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // fallback font. In this case we only test the first character 11745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // and then go back to test with the main font. 11755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // Special test for 2-char characters. 11765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet boolean foundFont = false; 11775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet for (int f = 1 ; f < mFonts.size() ; f++) { 11785802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet FontInfo fontInfo = mFonts.get(f); 11795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 11805802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // need to check that the font can display the character. We test 11815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // differently if the char is a high surrogate. 11825802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1; 11835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount); 11845802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (upTo == -1) { 11855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet total += fontInfo.mMetrics.charsWidth(text, i, charCount); 11865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet i += charCount; 11875802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet foundFont = true; 11885802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet break; 11895802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 11905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 11915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 11925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 11935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // in case no font can display the char, measure it with the main font. 11945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (foundFont == false) { 11955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int size = Character.isHighSurrogate(text[i]) ? 2 : 1; 11965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet total += mainFont.mMetrics.charsWidth(text, i, size); 11975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet i += size; 11985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 11995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1200c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet 1201c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet return total; 12025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 12035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 12045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 12058da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 12065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 12078da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet private float getFontMetrics(FontMetrics metrics) { 12088da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (mFonts.size() > 0) { 12098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics; 12108da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (metrics != null) { 12118da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // Android expects negative ascent so we invert the value from Java. 12128da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.top = - javaMetrics.getMaxAscent(); 12138da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.ascent = - javaMetrics.getAscent(); 12148da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.descent = javaMetrics.getDescent(); 12158da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.bottom = javaMetrics.getMaxDescent(); 12168da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.leading = javaMetrics.getLeading(); 12178da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 12188da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 12198da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return javaMetrics.getHeight(); 12208da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 12218da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 12228da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 12235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 12245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 12258da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 12268da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 12279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) { 12289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 12299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 12309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 12319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 12329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 12349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (flagValue) { 12359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags |= flagMask; 12369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } else { 12379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags &= ~flagMask; 12389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 12409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet} 1241