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