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.
9386837dc24a64af7fb007e5f2ff6b3e1cfe98f844Deepanshu Gupta    // Variant of the font. A paint's variant can only be compact or elegant.
9486837dc24a64af7fb007e5f2ff6b3e1cfe98f844Deepanshu Gupta    private FontVariant mFontVariant = FontVariant.COMPACT;
959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
96cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Xfermode_Delegate mXfermode;
97cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private ColorFilter_Delegate mColorFilter;
98cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Shader_Delegate mShader;
99cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private PathEffect_Delegate mPathEffect;
100cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private MaskFilter_Delegate mMaskFilter;
101cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Rasterizer_Delegate mRasterizer;
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    /**
209d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Xfermode} delegate or null if none have been set
210d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
211d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
212d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
213d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Xfermode_Delegate getXfermode() {
214cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mXfermode;
215251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
216251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
217d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
218d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link ColorFilter} delegate or null if none have been set
219d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
220d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
221d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
222d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public ColorFilter_Delegate getColorFilter() {
223cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mColorFilter;
224251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
225251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
2265d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez    public void setColorFilter(long colorFilterPtr) {
2275d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez        mColorFilter = ColorFilter_Delegate.getDelegate(colorFilterPtr);
2285d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez    }
2295d1013cf13e59b7f8dc8f16b5811cb29982e0ef3Diego Perez
230566b303365078fac9a454f1595add19e02631db3Diego Perez    public void setShader(long shaderPtr) {
231566b303365078fac9a454f1595add19e02631db3Diego Perez        mShader = Shader_Delegate.getDelegate(shaderPtr);
232566b303365078fac9a454f1595add19e02631db3Diego Perez    }
233566b303365078fac9a454f1595add19e02631db3Diego Perez
234d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
235d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Shader} delegate or null if none have been set
236d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
237d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
238d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
239d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Shader_Delegate getShader() {
240cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mShader;
241251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
242251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
243d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
244d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link MaskFilter} delegate or null if none have been set
245d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
246d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
247d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
248d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public MaskFilter_Delegate getMaskFilter() {
249cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mMaskFilter;
250d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    }
251d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
252d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
253d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Rasterizer} delegate or null if none have been set
254d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
255d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
256d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
257d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Rasterizer_Delegate getRasterizer() {
258cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mRasterizer;
259251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
260251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- native methods ----
2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2639a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
264491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetFlags(Paint thisPaint, long nativePaint) {
2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
266491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mFlags;
2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
274cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
275cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
2769a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
277491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetFlags(Paint thisPaint, long nativePaint, int flags) {
2789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
279491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mFlags = flags;
2859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2879a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
288491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetFilterBitmap(Paint thisPaint, long nativePaint, boolean filter) {
289491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.FILTER_BITMAP_FLAG, filter);
2909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2929a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
293491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetHinting(Paint thisPaint, long nativePaint) {
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 Paint.HINTING_ON;
2988433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        }
2998433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
3008433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        return delegate.mHintingMode;
3018433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    }
3028433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
3038433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    @LayoutlibDelegate
304491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetHinting(Paint thisPaint, long nativePaint, int mode) {
3058433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        // get the delegate from the native int.
306491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
3078433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        if (delegate == null) {
3088433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet            return;
3098433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        }
3108433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
3118433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        delegate.mHintingMode = mode;
3128433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    }
3138433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
3148433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    @LayoutlibDelegate
315491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetAntiAlias(Paint thisPaint, long nativePaint, boolean aa) {
316491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.ANTI_ALIAS_FLAG, aa);
3179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3199a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
320491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetSubpixelText(Paint thisPaint, long nativePaint,
321491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            boolean subpixelText) {
322491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3259a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
326491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetUnderlineText(Paint thisPaint, long nativePaint,
327491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            boolean underlineText) {
328491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
3299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3319a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
332491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetStrikeThruText(Paint thisPaint, long nativePaint,
333491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            boolean strikeThruText) {
334491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3379a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
338491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetFakeBoldText(Paint thisPaint, long nativePaint,
339491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            boolean fakeBoldText) {
340491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3439a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
344491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetDither(Paint thisPaint, long nativePaint, boolean dither) {
345491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.DITHER_FLAG, dither);
3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3489a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
349491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetLinearText(Paint thisPaint, long nativePaint, boolean linearText) {
350491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        setFlag(nativePaint, Paint.LINEAR_TEXT_FLAG, linearText);
3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3539a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
354491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetColor(Paint thisPaint, long nativePaint) {
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 0;
3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mColor;
3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3649a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
365491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetColor(Paint thisPaint, long nativePaint, int color) {
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;
3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mColor = color;
3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3759a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
376491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetAlpha(Paint thisPaint, long nativePaint) {
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 0;
3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
38363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return delegate.getAlpha();
3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3869a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
387491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetAlpha(Paint thisPaint, long nativePaint, int a) {
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;
3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
394d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        delegate.setAlpha(a);
3959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3979a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
398491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetStrokeWidth(Paint thisPaint, long nativePaint) {
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 1.f;
4039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeWidth;
4069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4089a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
409491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetStrokeWidth(Paint thisPaint, long nativePaint, float width) {
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;
4149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeWidth = width;
4179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4199a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
420491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetStrokeMiter(Paint thisPaint, long nativePaint) {
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 1.f;
4259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeMiter;
4289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4309a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
431491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetStrokeMiter(Paint thisPaint, long nativePaint, float miter) {
4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
433491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
4349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeMiter = miter;
4399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
442491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetShadowLayer(long paint, float radius, float dx, float dy,
4439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int color) {
4449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
445918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
44651a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                "Paint.setShadowLayer is not supported.", null, null /*data*/);
4479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4499a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
450491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static boolean nHasShadowLayer(long paint) {
4516376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta        // FIXME
4526376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
4536376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta                "Paint.hasShadowLayer is not supported.", null, null /*data*/);
4546376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta        return false;
4556376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta    }
4566376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta
4576376c407d433c91174e4cef735ddb0014461a906Deepanshu Gupta    @LayoutlibDelegate
458491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static boolean nIsElegantTextHeight(Paint thisPaint, long nativePaint) {
459baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        // get the delegate from the native int.
460491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
461ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta        return delegate != null && delegate.mFontVariant == FontVariant.ELEGANT;
46208ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta    }
46308ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta
46408ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta    @LayoutlibDelegate
465491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetElegantTextHeight(Paint thisPaint, long nativePaint,
466491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            boolean elegant) {
467baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        // get the delegate from the native int.
468491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
469baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        if (delegate == null) {
470baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta            return;
471baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        }
472baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta
473ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta        delegate.mFontVariant = elegant ? FontVariant.ELEGANT : FontVariant.COMPACT;
47408ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta    }
47508ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta
47608ea918c86175d313c8e7f10c0b4a25c1424639bDeepanshu Gupta    @LayoutlibDelegate
477491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetTextSize(Paint thisPaint, long nativePaint) {
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 1.f;
4829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSize;
4859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4879a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
488491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetTextSize(Paint thisPaint, long nativePaint, float textSize) {
4899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
490491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
4919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4956dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (delegate.mTextSize != textSize) {
4966dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.mTextSize = textSize;
4976dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.updateFontObject();
4986dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
4999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5019a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
502491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetTextScaleX(Paint thisPaint, long nativePaint) {
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 1.f;
5079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextScaleX;
5109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5129a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
513491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetTextScaleX(Paint thisPaint, long nativePaint, float scaleX) {
5149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
515491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
5169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5206dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (delegate.mTextScaleX != scaleX) {
5216dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.mTextScaleX = scaleX;
5226dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.updateFontObject();
5236dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
527491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetTextSkewX(Paint thisPaint, long nativePaint) {
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 1.f;
5329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSkewX;
5359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5379a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
538491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetTextSkewX(Paint thisPaint, long nativePaint, float skewX) {
5399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
540491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
5419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5456dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (delegate.mTextSkewX != skewX) {
5466dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.mTextSkewX = skewX;
5476dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.updateFontObject();
5486dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
5499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5519a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
552491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nAscent(Paint thisPaint, long nativePaint, long nativeTypeface) {
5538da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
554491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
5558da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
5568da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
5578da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5598da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate.mFonts.size() > 0) {
5608da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
5618da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            // Android expects negative ascent so we invert the value from Java.
5628da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return - javaMetrics.getAscent();
5638da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5648da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5658da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
5669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5689a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
569491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nDescent(Paint thisPaint, long nativePaint, long nativeTypeface) {
5705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
571491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
5725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
5735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
5745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
5775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
5788da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getDescent();
5795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
5828da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5838da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
5848da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5859a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
586491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetFontMetrics(Paint thisPaint, long nativePaint, long nativeTypeface,
587491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            FontMetrics metrics) {
5888da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
589491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
5908da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
5918da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
5928da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5938da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5948da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return delegate.getFontMetrics(metrics);
5955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
5965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
5979a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
598491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetFontMetricsInt(Paint thisPaint, long nativePaint,
599491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            long nativeTypeface, FontMetricsInt fmi) {
6009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate
601491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
6029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
6075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
6085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            if (fmi != null) {
6095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
6105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.top = - javaMetrics.getMaxAscent();
6115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.ascent = - javaMetrics.getAscent();
6125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.descent = javaMetrics.getDescent();
6135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.bottom = javaMetrics.getMaxDescent();
6145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.leading = javaMetrics.getLeading();
6155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
6169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return javaMetrics.getHeight();
6185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
6199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
6215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
6229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6239a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
624491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nBreakText(long nativePaint, long nativeTypeface, char[] text,
62584d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta            int index, int count, float maxWidth, int bidiFlags, float[] measuredWidth) {
626c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
627c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // get the delegate
62884d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
629c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        if (delegate == null) {
630c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return 0;
631c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
632c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
633c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        int inc = count > 0 ? 1 : -1;
634c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
635c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        int measureIndex = 0;
636c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        for (int i = index; i != index + count; i += inc, measureIndex++) {
637c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            int start, end;
638c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            if (i < index) {
639c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                start = i;
640c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                end = index;
641c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            } else {
642c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                start = index;
643c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                end = i;
644c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
645c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
646c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            // measure from start to end
64784d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta            RectF bounds = delegate.measureText(text, start, end - start + 1, null, 0, bidiFlags);
6485ad7c183f39df43562c69aba21ea422ad69bdae0Deepanshu Gupta            float res = bounds.right - bounds.left;
649c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
650c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            if (measuredWidth != null) {
651c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                measuredWidth[measureIndex] = res;
652c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
653c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
654c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            if (res > maxWidth) {
655c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                // we should not return this char index, but since it's 0-based
656c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                // and we need to return a count, we simply return measureIndex;
657c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                return measureIndex;
658c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
659c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
660c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
661c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
662c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        return measureIndex;
6639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
666491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nBreakText(long nativePaint, long nativeTypeface, String text,
66784d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta            boolean measureForwards,
668279c00e8e0abb20f7e10577c77937c058da080bfDeepanshu Gupta            float maxWidth, int bidiFlags, float[] measuredWidth) {
669491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        return nBreakText(nativePaint, nativeTypeface, text.toCharArray(), 0, text.length(),
67084d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta                maxWidth, bidiFlags, measuredWidth);
6719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
674491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nInit() {
6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate();
676cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
6779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6799a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
680491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nInitWithPaint(long paint) {
6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(paint);
6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate(delegate);
688cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6919a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
692491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nReset(long native_object) {
6939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.reset();
7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7029a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
703491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSet(long native_dst, long native_src) {
7049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
7069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_dst == null) {
7079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_src = sManager.getDelegate(native_src);
7129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_src == null) {
7139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate_dst.set(delegate_src);
7179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7199a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
720491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetStyle(long native_object) {
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 0;
7259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStyle;
7289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7309a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
731491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetStyle(long native_object, int style) {
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;
7369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStyle = style;
7399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
742491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetStrokeCap(long native_object) {
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 0;
7479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mCap;
7509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7529a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
753491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetStrokeCap(long native_object, int cap) {
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;
7589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mCap = cap;
7619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7639a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
764491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetStrokeJoin(long native_object) {
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 0;
7699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mJoin;
7729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7749a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
775491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetStrokeJoin(long native_object, int join) {
7769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mJoin = join;
7839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7859a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
786491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static boolean nGetFillPath(long native_object, long src, long dst) {
787b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Paint_Delegate paint = sManager.getDelegate(native_object);
788b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (paint == null) {
789b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
790b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
791b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
792b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate srcPath = Path_Delegate.getDelegate(src);
793b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (srcPath == null) {
794b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
795b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
796b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
797b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate dstPath = Path_Delegate.getDelegate(dst);
798b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstPath == null) {
799b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
800b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
801b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
802b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Stroke stroke = paint.getJavaStroke();
803b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape());
804b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
805b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstPath.setJavaShape(strokeShape);
806b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
807b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // FIXME figure out the return value?
808b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
8099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8119a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
812491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetShader(long native_object, long shader) {
813abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
814abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
815abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
816abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return shader;
817abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
818abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
819cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mShader = Shader_Delegate.getDelegate(shader);
820cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
821cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return shader;
8229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8249a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
825491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetColorFilter(long native_object, long filter) {
826abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
827abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
828abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
829abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return filter;
830abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
831abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
832baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);
833d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
834f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta        // Log warning if it's not supported.
835f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta        if (delegate.mColorFilter != null && !delegate.mColorFilter.isSupported()) {
836918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER,
837cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mColorFilter.getSupportMessage(), null, null /*data*/);
838d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
839d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
840d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return filter;
8419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8439a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
844491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetXfermode(long native_object, long xfermode) {
845abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
846abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
847abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
848abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return xfermode;
849abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
850abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
851cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mXfermode = Xfermode_Delegate.getDelegate(xfermode);
852cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
853cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return xfermode;
8549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8569a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
857491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetPathEffect(long native_object, long effect) {
858abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
859abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
860abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
861abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return effect;
862abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
863abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
864cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect);
865cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
866cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return effect;
8679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8699a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
870491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetMaskFilter(long native_object, long maskfilter) {
871abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
872abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
873abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
874abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return maskfilter;
875abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
876abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
877cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter);
878d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
879d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
880f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta        if (delegate.mMaskFilter != null && !delegate.mMaskFilter.isSupported()) {
881918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER,
882cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mMaskFilter.getSupportMessage(), null, null /*data*/);
883d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
884d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
885d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return maskfilter;
8869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8889a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
889491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetTypeface(long native_object, long typeface) {
8909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
8919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
8949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8966dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        Typeface_Delegate typefaceDelegate = Typeface_Delegate.getDelegate(typeface);
8976dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (delegate.mTypeface != typefaceDelegate || delegate.mNativeTypeface != typeface) {
8986dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.mTypeface = Typeface_Delegate.getDelegate(typeface);
8996dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.mNativeTypeface = typeface;
9006dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            delegate.updateFontObject();
9016dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
902cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return typeface;
9039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9059a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
906491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nSetRasterizer(long native_object, long rasterizer) {
907d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // get the delegate from the native int.
908d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
909d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (delegate == null) {
910d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            return rasterizer;
911d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
912d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
913cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer);
914d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
915d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
916f2af1f5d8aaff684f8cc6d8e31454c945e190976Deepanshu Gupta        if (delegate.mRasterizer != null && !delegate.mRasterizer.isSupported()) {
917918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER,
918cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mRasterizer.getSupportMessage(), null, null /*data*/);
919d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
920d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
921d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return rasterizer;
9229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9249a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
925491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetTextAlign(long native_object) {
9269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
9279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
9289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
9299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
9309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
9319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.mTextAlign;
9339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9359a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
936491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetTextAlign(long native_object, int align) {
9379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
9389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
9399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
9409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
9419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
9429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        delegate.mTextAlign = align;
9449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9469a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
947491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nSetTextLocales(long native_object, String locale) {
94884d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        // get the delegate from the native int.
94984d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(native_object);
95084d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        if (delegate == null) {
95184d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta            return 0;
95284d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        }
95384d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta
954491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        delegate.setTextLocale(locale);
955491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        return 0;
9569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9589a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
959491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetTextLocalesByMinikinLangListId(long paintPtr,
960491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            int mMinikinLangListId) {
96166743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet        // FIXME
96266743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet    }
96366743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet
96466743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet    @LayoutlibDelegate
965491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetTextAdvances(long native_object, long native_typeface,
9669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            char[] text, int index, int count, int contextIndex, int contextCount,
967491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            int bidiFlags, float[] advances, int advancesIndex) {
9680d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta
9690d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        if (advances != null)
9700d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            for (int i = advancesIndex; i< advancesIndex+count; i++)
9710d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta                advances[i]=0;
9725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate from the native int.
9735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
974baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        if (delegate == null) {
9755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0.f;
9765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
977a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta
978a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        // native_typeface is passed here since Framework's old implementation did not have the
979a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        // typeface object associated with the Paint. Since, we follow the new framework way,
980a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        // we store the typeface with the paint and use it directly.
981a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        assert (native_typeface == delegate.mNativeTypeface);
982a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta
983491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        RectF bounds = delegate.measureText(text, index, count, advances, advancesIndex, bidiFlags);
9845ad7c183f39df43562c69aba21ea422ad69bdae0Deepanshu Gupta        return bounds.right - bounds.left;
9859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9879a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
988491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetTextAdvances(long native_object, long native_typeface,
9899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, int contextStart, int contextEnd,
990491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            int bidiFlags, float[] advances, int advancesIndex) {
9910d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        // FIXME: support contextStart and contextEnd
9925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        int count = end - start;
9935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        char[] buffer = TemporaryBuffer.obtain(count);
9945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        TextUtils.getChars(text, start, end, buffer, 0);
9955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
996491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        return nGetTextAdvances(native_object, native_typeface, buffer, 0, count,
997491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta                contextStart, contextEnd - contextStart, bidiFlags, advances, advancesIndex);
9989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10009a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1001491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetTextRunCursor(Paint thisPaint, long native_object, char[] text,
10029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
10039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10048a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10058a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextRunCursor is not supported.", null, null /*data*/);
10068a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
10079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10099a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1010491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetTextRunCursor(Paint thisPaint, long native_object, String text,
10119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
10129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10138a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10148a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextRunCursor is not supported.", null, null /*data*/);
10158a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
10169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10189a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1019491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nGetTextPath(long native_object, long native_typeface,
1020ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta            int bidiFlags, char[] text, int index, int count, float x, float y, long path) {
10219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10228a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10238a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextPath is not supported.", null, null /*data*/);
10249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1027491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nGetTextPath(long native_object, long native_typeface,
1028ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta            int bidiFlags, String text, int start, int end, float x, float y, long path) {
10299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10308a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10318a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextPath is not supported.", null, null /*data*/);
10329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10349a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1035491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nGetStringBounds(long nativePaint, long native_typeface,
1036ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta            String text, int start, int end, int bidiFlags, Rect bounds) {
1037491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        nGetCharArrayBounds(nativePaint, native_typeface, text.toCharArray(), start,
1038ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta                end - start, bidiFlags, bounds);
10399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1042491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nGetCharArrayBounds(long nativePaint, long native_typeface,
1043ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta            char[] text, int index, int count, int bidiFlags, Rect bounds) {
1044c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
1045c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // get the delegate from the native int.
1046c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1047baef8c1ffe5c900fb0da9512654bf249b5fc9269Deepanshu Gupta        if (delegate == null) {
1048c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return;
1049c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
1050a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta
1051a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        // assert that the typeface passed is actually the one that we had stored.
1052a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        assert (native_typeface == delegate.mNativeTypeface);
1053a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta
105484d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        delegate.measureText(text, index, count, null, 0, bidiFlags).roundOut(bounds);
10559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10579a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1058491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static long nGetNativeFinalizer() {
1059491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        synchronized (Paint_Delegate.class) {
1060491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            if (sFinalizer == -1) {
1061491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta                sFinalizer = NativeAllocationRegistry_Delegate.createFinalizer(
1062491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta                        sManager::removeJavaReferenceFor);
1063491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta            }
1064491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        }
1065491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        return sFinalizer;
10669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10681840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta    @LayoutlibDelegate
1069491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetLetterSpacing(long nativePaint) {
1070d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1071d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (delegate == null) {
1072d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return 0;
1073d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1074d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        return delegate.mLetterSpacing;
10751840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta    }
10761840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta
10771840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta    @LayoutlibDelegate
1078491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetLetterSpacing(long nativePaint, float letterSpacing) {
10791ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta        Bridge.getLog().fidelityWarning(LayoutLog.TAG_TEXT_RENDERING,
10801ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta                "Paint.setLetterSpacing() not supported.", null, null);
1081d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1082d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (delegate == null) {
1083d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return;
1084d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1085d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        delegate.mLetterSpacing = letterSpacing;
10861840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta    }
10871840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta
10881840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta    @LayoutlibDelegate
1089491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetFontFeatureSettings(long nativePaint, String settings) {
10901ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta        Bridge.getLog().fidelityWarning(LayoutLog.TAG_TEXT_RENDERING,
1091d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta                "Paint.setFontFeatureSettings() not supported.", null, null);
1092d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    }
1093d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1094d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    @LayoutlibDelegate
1095491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetHyphenEdit(long nativePaint) {
1096d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1097d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (delegate == null) {
1098d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return 0;
1099d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1100d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        return delegate.mHyphenEdit;
1101d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    }
1102d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1103d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    @LayoutlibDelegate
1104491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static void nSetHyphenEdit(long nativePaint, int hyphen) {
1105d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1106d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (delegate == null) {
1107d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return;
1108d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1109d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        delegate.mHyphenEdit = hyphen;
1110d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    }
1111d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1112d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    @LayoutlibDelegate
1113491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static boolean nHasGlyph(long nativePaint, long nativeTypeface, int bidiFlags,
1114d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            String string) {
1115d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1116d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (delegate == null) {
1117d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return false;
1118d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1119d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (string.length() == 0) {
1120d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return false;
1121d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1122d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        if (string.length() > 1) {
11231ae505060e9726782bc14af4e612b624cf2d038aDeepanshu Gupta            Bridge.getLog().fidelityWarning(LayoutLog.TAG_TEXT_RENDERING,
1124d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta                    "Paint.hasGlyph() is not supported for ligatures.", null, null);
1125d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            return false;
1126d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1127d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        assert nativeTypeface == delegate.mNativeTypeface;
1128d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        Typeface_Delegate typeface_delegate = Typeface_Delegate.getDelegate(nativeTypeface);
1129d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1130d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        char c = string.charAt(0);
1131d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        for (Font font : typeface_delegate.getFonts(delegate.mFontVariant)) {
1132d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            if (font.canDisplay(c)) {
1133d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta                return true;
1134d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            }
1135d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1136d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        return false;
1137d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    }
1138d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1139d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1140d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    @LayoutlibDelegate
1141491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static float nGetRunAdvance(long nativePaint, long nativeTypeface,
1142d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            @NonNull char[] text, int start, int end, int contextStart, int contextEnd,
1143d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            boolean isRtl, int offset) {
1144d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        int count = end - start;
1145d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        float[] advances = new float[count];
1146491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR;
1147491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        nGetTextAdvances(nativePaint, nativeTypeface, text, start, count,
1148491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta                contextStart, contextEnd - contextStart, bidiFlags, advances, 0);
1149cd595f1998b1331fe0efba02d96c95ee43e791daDeepanshu Gupta        int startOffset = offset - start;  // offset from start.
1150d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        float sum = 0;
1151cd595f1998b1331fe0efba02d96c95ee43e791daDeepanshu Gupta        for (int i = 0; i < startOffset; i++) {
1152d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            sum += advances[i];
1153d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1154d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        return sum;
1155d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    }
1156d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta
1157d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta    @LayoutlibDelegate
1158491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    /*package*/ static int nGetOffsetForAdvance(long nativePaint, long nativeTypeface,
1159d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl,
1160d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            float advance) {
1161d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        int count = end - start;
1162d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        float[] advances = new float[count];
1163491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR;
1164491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        nGetTextAdvances(nativePaint, nativeTypeface, text, start, count,
1165491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta                contextStart, contextEnd - contextStart, bidiFlags, advances, 0);
1166d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        float sum = 0;
1167d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        int i;
1168d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        for (i = 0; i < count && sum < advance; i++) {
1169d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta            sum += advances[i];
1170d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        }
1171d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        float distanceToI = sum - advance;
1172d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        float distanceToIMinus1 = advance - (sum - advances[i]);
1173d77b9ed7dcc42efca33b225c4594a30aab9e709cDeepanshu Gupta        return distanceToI > distanceToIMinus1 ? i : i - 1;
11741840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta    }
11751840e8f2c73570e7b51c66c03d3a50bd00f3f742Deepanshu Gupta
11769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Private delegate/helper methods ----
11779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1178d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    /*package*/ Paint_Delegate() {
11799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        reset();
11809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private Paint_Delegate(Paint_Delegate paint) {
11839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        set(paint);
11849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void set(Paint_Delegate paint) {
11879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = paint.mFlags;
11889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mColor = paint.mColor;
11899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStyle = paint.mStyle;
11909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mCap = paint.mCap;
11919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mJoin = paint.mJoin;
11925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = paint.mTextAlign;
11936dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
11946dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        boolean needsFontUpdate = false;
11956dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (mTypeface != paint.mTypeface || mNativeTypeface != paint.mNativeTypeface) {
11966dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            mTypeface = paint.mTypeface;
11976dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            mNativeTypeface = paint.mNativeTypeface;
11986dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            needsFontUpdate = true;
11996dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
12006dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
12016dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (mTextSize != paint.mTextSize) {
12026dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            mTextSize = paint.mTextSize;
12036dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            needsFontUpdate = true;
12046dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
12056dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
12066dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (mTextScaleX != paint.mTextScaleX) {
12076dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            mTextScaleX = paint.mTextScaleX;
12086dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            needsFontUpdate = true;
12096dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
12106dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
12116dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (mTextSkewX != paint.mTextSkewX) {
12126dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            mTextSkewX = paint.mTextSkewX;
12136dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            needsFontUpdate = true;
12146dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
12156dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
12169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = paint.mStrokeWidth;
12179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeMiter = paint.mStrokeMiter;
1218abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = paint.mXfermode;
1219abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = paint.mColorFilter;
1220abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = paint.mShader;
1221abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = paint.mPathEffect;
1222abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = paint.mMaskFilter;
1223d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        mRasterizer = paint.mRasterizer;
12248433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        mHintingMode = paint.mHintingMode;
12256dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
12266dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        if (needsFontUpdate) {
12276dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            updateFontObject();
12286dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez        }
12299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
12309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
12319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void reset() {
1232caa6226b1735ae074ec3861e2424bbd2276b88a0Chris Craik        mFlags = Paint.HIDDEN_DEFAULT_PAINT_FLAGS;
1233d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = 0xFF000000;
123463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mStyle = Paint.Style.FILL.nativeInt;
123563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mCap = Paint.Cap.BUTT.nativeInt;
123663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mJoin = Paint.Join.MITER.nativeInt;
12375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = 0;
1238cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance);
1239a19b8c111b6961f20e1fc9132c62d1fd7f98bafeDeepanshu Gupta        mNativeTypeface = 0;
12409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = 1.f;
1241d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mStrokeMiter = 4.f;
12429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = 20.f;
12439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = 1.f;
12449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = 0.f;
1245cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mXfermode = null;
1246cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mColorFilter = null;
1247cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mShader = null;
1248cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mPathEffect = null;
1249cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mMaskFilter = null;
1250cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mRasterizer = null;
1251b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
12528433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        mHintingMode = Paint.HINTING_ON;
12539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
12549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
12559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
12569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Update the {@link Font} object from the typeface, text size and scaling
12579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
1258d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    @SuppressWarnings("deprecation")
12599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void updateFontObject() {
1260cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (mTypeface != null) {
12619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // Get the fonts from the TypeFace object.
1262ad69aee5ed503d9592c10a0f6d1a5b617d99e6c5Deepanshu Gupta            List<Font> fonts = mTypeface.getFonts(mFontVariant);
12639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
12646dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            if (fonts.isEmpty()) {
12656dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez                mFonts = Collections.emptyList();
12666dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez                return;
12676dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            }
12686dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez
12699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // create new font objects as well as FontMetrics, based on the current text size
12709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // and skew info.
12716dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            int nFonts = fonts.size();
12726dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(nFonts);
12736dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            //noinspection ForLoopReplaceableByForEach (avoid iterator instantiation)
12746dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez            for (int i = 0; i < nFonts; i++) {
12756dac0d4b7c55da32cb5deb9b589b1acb43cb536dDiego Perez                Font font = fonts.get(i);
1276e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta                if (font == null) {
1277e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta                    // If the font is null, add null to infoList. When rendering the text, if this
1278e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta                    // null is reached, a warning will be logged.
1279e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta                    infoList.add(null);
1280e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta                    continue;
1281e644ff8d92ba040d11636be0fb6c433b52bcc6c2Deepanshu Gupta                }
12829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                FontInfo info = new FontInfo();
12839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mFont = font.deriveFont(mTextSize);
12849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                if (mTextScaleX != 1.0 || mTextSkewX != 0) {
12859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    // TODO: support skew
12869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    info.mFont = info.mFont.deriveFont(new AffineTransform(
1287d410bfb2001e7960a27fe6adb9d56f229e70fe5cXavier Ducrohet                            mTextScaleX, mTextSkewX, 0, 1, 0, 0));
12889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                }
12890d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta                // The metrics here don't have anti-aliasing set.
12909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont);
12919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
12929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                infoList.add(info);
12939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            }
12949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
12959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            mFonts = Collections.unmodifiableList(infoList);
12969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
12979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
12989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
129984d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta    /*package*/ RectF measureText(char[] text, int index, int count, float[] advances,
130084d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta            int advancesIndex, int bidiFlags) {
130184d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        return new BidiRenderer(null, this, text)
130284d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta                .renderText(index, index + count, bidiFlags, advances, advancesIndex, false);
130384d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta    }
130484d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta
130584d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta    /*package*/ RectF measureText(char[] text, int index, int count, float[] advances,
130684d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta            int advancesIndex, boolean isRtl) {
130784d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta        return new BidiRenderer(null, this, text)
130884d1d431cfe3e66029380fa038f8816b06da120aDeepanshu Gupta                .renderText(index, index + count, isRtl, advances, advancesIndex, false);
13098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
13105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
13118da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    private float getFontMetrics(FontMetrics metrics) {
13128da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (mFonts.size() > 0) {
13138da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics;
13148da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            if (metrics != null) {
13158da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
13168da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.top = - javaMetrics.getMaxAscent();
13178da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.ascent = - javaMetrics.getAscent();
13188da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.descent = javaMetrics.getDescent();
13198da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.bottom = javaMetrics.getMaxDescent();
13208da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.leading = javaMetrics.getLeading();
13218da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            }
13228da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
13238da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getHeight();
13248da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
13258da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
13268da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
13275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
13285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1329cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    private void setTextLocale(String locale) {
1330cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        mLocale = new Locale(locale);
1331cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    }
13328da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
1333491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta    private static void setFlag(long nativePaint, int flagMask, boolean flagValue) {
13349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
1335491523d52cd8368ef9a92e95fb3e9332bf86a996Deepanshu Gupta        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
13369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
13379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
13389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
13399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
13409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (flagValue) {
13419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags |= flagMask;
13429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        } else {
13439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags &= ~flagMask;
13449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
13459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
13469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet}
1347