Paint_Delegate.java revision cb092e2b7fa46477651c8b8733d50307b0de9d6d
19f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/*
29f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project
39f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
49f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
59f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * you may not use this file except in compliance with the License.
69f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * You may obtain a copy of the License at
79f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
89f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
99f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * See the License for the specific language governing permissions and
149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * limitations under the License.
159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */
169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpackage android.graphics;
189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
19918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog;
20d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
21c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetrics;
259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetricsInt;
265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport android.text.TextUtils;
279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport java.awt.BasicStroke;
299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Font;
30b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Shape;
31b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Stroke;
329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Toolkit;
339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.font.FontRenderContext;
349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.geom.AffineTransform;
35c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohetimport java.awt.geom.Rectangle2D;
369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.ArrayList;
379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.Collections;
389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.List;
39cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohetimport java.util.Locale;
409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/**
429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Paint
439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Paint have been replaced
459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * by calls to methods of the same name in this delegate class.
469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * it and the original Paint class.
509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * @see DelegateManager
529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */
549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpublic class Paint_Delegate {
559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Class associating a {@link Font} and it's {@link java.awt.FontMetrics}.
589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static final class FontInfo {
609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Font mFont;
619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        java.awt.FontMetrics mMetrics;
629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate manager ----
659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static final DelegateManager<Paint_Delegate> sManager =
66f0a53435f14d23d9555fc46014352ee6a7baa647Xavier Ducrohet            new DelegateManager<Paint_Delegate>(Paint_Delegate.class);
679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate helper data ----
699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private List<FontInfo> mFonts;
709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private final FontRenderContext mFontContext = new FontRenderContext(
719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new AffineTransform(), true, true);
729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate data ----
749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mFlags;
759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mColor;
769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mStyle;
779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mCap;
789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mJoin;
795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    private int mTextAlign;
80cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Typeface_Delegate mTypeface;
819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeWidth;
829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeMiter;
839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSize;
849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextScaleX;
859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSkewX;
868433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    private int mHintingMode = Paint.HINTING_ON;
879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
88cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Xfermode_Delegate mXfermode;
89cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private ColorFilter_Delegate mColorFilter;
90cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Shader_Delegate mShader;
91cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private PathEffect_Delegate mPathEffect;
92cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private MaskFilter_Delegate mMaskFilter;
93cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Rasterizer_Delegate mRasterizer;
94abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
95cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    private Locale mLocale = Locale.getDefault();
96cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Public Helper methods ----
999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public static Paint_Delegate getDelegate(int native_paint) {
1015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return sManager.getDelegate(native_paint);
1025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
1059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Returns the list of {@link Font} objects. The first item is the main font, the rest
1069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * are fall backs for characters not present in the main font.
1079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
1089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    public List<FontInfo> getFonts() {
1099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return mFonts;
1109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
1119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
112abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    public boolean isAntiAliased() {
113abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0;
114abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    }
115abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
1165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public boolean isFilterBitmap() {
1175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0;
1185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getStyle() {
1215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStyle;
1225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getColor() {
1255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mColor;
1265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    public int getAlpha() {
12963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return mColor >>> 24;
13063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    }
13163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet
132d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    public void setAlpha(int alpha) {
133d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = (alpha << 24) | (mColor & 0x00FFFFFF);
134d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    }
135d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet
1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getTextAlign() {
1375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mTextAlign;
1385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public float getStrokeWidth() {
1415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStrokeWidth;
1425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
14463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    /**
14563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet     * returns the value of stroke miter needed by the java api.
14663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet     */
14763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    public float getJavaStrokeMiter() {
148d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        float miter = mStrokeMiter * mStrokeWidth;
149d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        if (miter < 1.f) {
150d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet            miter = 1.f;
151d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        }
152d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        return miter;
1535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaCap() {
1565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sCapArray[mCap]) {
1575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BUTT:
1585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_BUTT;
1595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_ROUND;
1615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case SQUARE:
1635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_SQUARE;
1645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaJoin() {
1685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sJoinArray[mJoin]) {
1695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case MITER:
1715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_MITER;
1725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_ROUND;
1745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BEVEL:
1755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_BEVEL;
1765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
179b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    public Stroke getJavaStroke() {
180cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (mPathEffect != null) {
181cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet            if (mPathEffect.isSupported()) {
182cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                Stroke stroke = mPathEffect.getStroke(this);
183b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                assert stroke != null;
184b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                if (stroke != null) {
185b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    return stroke;
186b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                }
187b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            } else {
188918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT,
189cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                        mPathEffect.getSupportMessage(),
19051a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        null, null /*data*/);
191b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            }
192b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
193b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
194b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // if no custom stroke as been set, set the default one.
195b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return new BasicStroke(
196b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getStrokeWidth(),
197b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaCap(),
198b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaJoin(),
199b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaStrokeMiter());
200b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
201b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
202d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
203d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Xfermode} delegate or null if none have been set
204d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
205d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
206d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
207d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Xfermode_Delegate getXfermode() {
208cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mXfermode;
209251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
210251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
211d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
212d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link ColorFilter} delegate or null if none have been set
213d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
214d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
215d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
216d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public ColorFilter_Delegate getColorFilter() {
217cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mColorFilter;
218251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
219251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
220d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
221d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Shader} delegate or null if none have been set
222d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
223d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
224d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
225d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Shader_Delegate getShader() {
226cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mShader;
227251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
228251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
229d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
230d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link MaskFilter} delegate or null if none have been set
231d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
232d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
233d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
234d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public MaskFilter_Delegate getMaskFilter() {
235cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mMaskFilter;
236d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    }
237d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
238d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
239d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Rasterizer} delegate or null if none have been set
240d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
241d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
242d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
243d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Rasterizer_Delegate getRasterizer() {
244cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mRasterizer;
245251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
246251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
2479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- native methods ----
2489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2499a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getFlags(Paint thisPaint) {
2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
2559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mFlags;
2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
260cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
261cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
2629a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFlags(Paint thisPaint, int flags) {
2649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mFlags = flags;
2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) {
2755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter);
2769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2789a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2798433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    /*package*/ static int getHinting(Paint thisPaint) {
2808433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        // get the delegate from the native int.
2818433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2828433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        if (delegate == null) {
2838433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet            return Paint.HINTING_ON;
2848433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        }
2858433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
2868433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        return delegate.mHintingMode;
2878433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    }
2888433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
2898433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    @LayoutlibDelegate
2908433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    /*package*/ static void setHinting(Paint thisPaint, int mode) {
2918433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        // get the delegate from the native int.
2928433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2938433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        if (delegate == null) {
2948433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet            return;
2958433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        }
2968433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
2978433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        delegate.mHintingMode = mode;
2988433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    }
2998433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet
3008433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet    @LayoutlibDelegate
3019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) {
3029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa);
3039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3059a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) {
3079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
3089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3109a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) {
3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3159a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) {
3179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3209a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) {
3229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3259a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setDither(Paint thisPaint, boolean dither) {
3279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.DITHER_FLAG, dither);
3289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3309a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) {
3329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText);
3339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3359a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getColor(Paint thisPaint) {
3379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mColor;
3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3469a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setColor(Paint thisPaint, int color) {
3489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mColor = color;
3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3579a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getAlpha(Paint thisPaint) {
3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
36563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return delegate.getAlpha();
3669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3689a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAlpha(Paint thisPaint, int a) {
3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
376d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        delegate.setAlpha(a);
3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3799a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeWidth(Paint thisPaint) {
3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeWidth;
3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3909a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeWidth(Paint thisPaint, float width) {
3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeWidth = width;
3999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4019a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeMiter(Paint thisPaint) {
4039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeMiter;
4109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4129a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) {
4149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeMiter = miter;
4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4239a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy,
4259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int color) {
4269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
427918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
42851a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                "Paint.setShadowLayer is not supported.", null, null /*data*/);
4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4319a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSize(Paint thisPaint) {
4339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSize;
4409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSize(Paint thisPaint, float textSize) {
4449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSize = textSize;
451b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextScaleX(Paint thisPaint) {
4569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextScaleX;
4639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) {
4679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextScaleX = scaleX;
474b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4779a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSkewX(Paint thisPaint) {
4799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSkewX;
4869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4889a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) {
4909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSkewX = skewX;
497b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5009a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float ascent(Paint thisPaint) {
5028da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
5038da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5048da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
5058da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
5068da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5088da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate.mFonts.size() > 0) {
5098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
5108da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            // Android expects negative ascent so we invert the value from Java.
5118da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return - javaMetrics.getAscent();
5128da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5138da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5148da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
5159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5179a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5188da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    /*package*/ static float descent(Paint thisPaint) {
5195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
5205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
5225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
5235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
5265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
5278da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getDescent();
5285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
5318da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5328da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
5338da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5349a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5358da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) {
5368da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
5378da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5388da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
5398da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
5408da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5418da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5428da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return delegate.getFontMetrics(metrics);
5435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
5445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
5459a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) {
5479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate
5489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
5545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
5555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            if (fmi != null) {
5565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
5575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.top = - javaMetrics.getMaxAscent();
5585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.ascent = - javaMetrics.getAscent();
5595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.descent = javaMetrics.getDescent();
5605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.bottom = javaMetrics.getMaxDescent();
5615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.leading = javaMetrics.getLeading();
5625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
5639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return javaMetrics.getHeight();
5655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
5685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
5699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5709a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
5725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int count) {
5735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
5745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
5765802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
5779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.measureText(text, index, count);
5809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5829a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) {
5849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), start, end - start);
5859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5879a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text) {
5899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), 0, text.length());
5909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5929a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
5949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
595c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
596c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // get the delegate
597c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
598c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        if (delegate == null) {
599c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return 0;
600c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
601c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
602c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        int inc = count > 0 ? 1 : -1;
603c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
604c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        int measureIndex = 0;
605c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        float measureAcc = 0;
606c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        for (int i = index; i != index + count; i += inc, measureIndex++) {
607c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            int start, end;
608c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            if (i < index) {
609c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                start = i;
610c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                end = index;
611c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            } else {
612c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                start = index;
613c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                end = i;
614c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
615c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
616c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            // measure from start to end
617c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            float res = delegate.measureText(text, start, end - start + 1);
618c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
619c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            if (measuredWidth != null) {
620c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                measuredWidth[measureIndex] = res;
621c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
622c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
623c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            measureAcc += res;
624c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            if (res > maxWidth) {
625c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                // we should not return this char index, but since it's 0-based
626c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                // and we need to return a count, we simply return measureIndex;
627c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                return measureIndex;
628c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
629c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
630c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
631c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
632c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        return measureIndex;
6339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6359a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
6379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
638c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        return native_breakText(thisPaint, text.toCharArray(), 0, text.length(), maxWidth,
639c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                measuredWidth);
6409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_init() {
6449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate();
645cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
6469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6489a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_initWithPaint(int paint) {
6509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(paint);
6529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate(delegate);
657cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
6589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_reset(int native_object) {
6629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.reset();
6699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6719a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_set(int native_dst, int native_src) {
6739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_dst == null) {
6769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_src = sManager.getDelegate(native_src);
6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_src == null) {
6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate_dst.set(delegate_src);
6869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6889a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStyle(int native_object) {
6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStyle;
6979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6999a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStyle(int native_object, int style) {
7019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStyle = style;
7089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7109a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeCap(int native_object) {
7129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
7169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mCap;
7199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7219a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeCap(int native_object, int cap) {
7239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mCap = cap;
7309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7329a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeJoin(int native_object) {
7349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
7389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mJoin;
7419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7439a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeJoin(int native_object, int join) {
7459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mJoin = join;
7529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
756b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Paint_Delegate paint = sManager.getDelegate(native_object);
757b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (paint == null) {
758b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
759b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
760b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
761b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate srcPath = Path_Delegate.getDelegate(src);
762b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (srcPath == null) {
763b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
764b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
765b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
766b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate dstPath = Path_Delegate.getDelegate(dst);
767b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstPath == null) {
768b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
769b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
770b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
771b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Stroke stroke = paint.getJavaStroke();
772b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape());
773b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
774b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstPath.setJavaShape(strokeShape);
775b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
776b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // FIXME figure out the return value?
777b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
7789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7809a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setShader(int native_object, int shader) {
782abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
783abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
784abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
785abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return shader;
786abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
787abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
788cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mShader = Shader_Delegate.getDelegate(shader);
789cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
790cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return shader;
7919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7939a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setColorFilter(int native_object, int filter) {
795abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
796abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
797abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
798abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return filter;
799abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
800abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
801cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);;
802d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
803d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
804cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (delegate.mColorFilter != null && delegate.mColorFilter.isSupported() == false) {
805918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER,
806cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mColorFilter.getSupportMessage(), null, null /*data*/);
807d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
808d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
809d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return filter;
8109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8129a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setXfermode(int native_object, int xfermode) {
814abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
815abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
816abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
817abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return xfermode;
818abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
819abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
820cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mXfermode = Xfermode_Delegate.getDelegate(xfermode);
821cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
822cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return xfermode;
8239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8259a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setPathEffect(int native_object, int effect) {
827abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
828abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
829abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
830abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return effect;
831abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
832abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
833cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect);
834cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
835cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return effect;
8369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8389a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
840abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
841abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
842abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
843abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return maskfilter;
844abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
845abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
846cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter);
847d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
848d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
849cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (delegate.mMaskFilter != null && delegate.mMaskFilter.isSupported() == false) {
850918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER,
851cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mMaskFilter.getSupportMessage(), null, null /*data*/);
852d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
853d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
854d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return maskfilter;
8559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8579a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setTypeface(int native_object, int typeface) {
8599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
8609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
8629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
8639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
865cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mTypeface = Typeface_Delegate.getDelegate(typeface);
866b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
867cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return typeface;
8689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8709a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
872d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // get the delegate from the native int.
873d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
874d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (delegate == null) {
875d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            return rasterizer;
876d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
877d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
878cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer);
879d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
880d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
881cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (delegate.mRasterizer != null && delegate.mRasterizer.isSupported() == false) {
882918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER,
883cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mRasterizer.getSupportMessage(), null, null /*data*/);
884d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
885d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
886d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return rasterizer;
8879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8899a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextAlign(int native_object) {
8919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
8949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
8959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.mTextAlign;
8989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9009a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setTextAlign(int native_object, int align) {
9029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
9039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
9049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
9059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
9069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
9079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        delegate.mTextAlign = align;
9099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9119a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
912cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    /*package*/ static void native_setTextLocale(int native_object, String locale) {
913cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        // get the delegate from the native int.
914cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
915cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        if (delegate == null) {
916cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet            return;
917cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        }
918cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
919cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        delegate.setTextLocale(locale);
920cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    }
921cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
922cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    @LayoutlibDelegate
9239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
9249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, float[] widths) {
925c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // get the delegate from the native int.
926c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
927c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        if (delegate == null) {
928c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return 0;
929c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
930c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
931c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        if (delegate.mFonts.size() > 0) {
932c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            // FIXME: handle multi-char characters (see measureText)
933c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            float totalAdvance = 0;
934c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            for (int i = 0; i < count; i++) {
935c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                char c = text[i + index];
936c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                boolean found = false;
937c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                for (FontInfo info : delegate.mFonts) {
938c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                    if (info.mFont.canDisplay(c)) {
939c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        float adv = info.mMetrics.charWidth(c);
940c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        totalAdvance += adv;
941c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        if (widths != null) {
942c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                            widths[i] = adv;
943c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        }
944c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
945c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        found = true;
946c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        break;
947c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                    }
948c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                }
949c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
950c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                if (found == false) {
951c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                    // no advance for this char.
952c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                    if (widths != null) {
953c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                        widths[i] = 0.f;
954c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                    }
955c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                }
956c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            }
957c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
958c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return (int) totalAdvance;
959c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
960c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
9618a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
9629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9649a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, String text, int start,
9669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, float[] widths) {
967c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        return native_getTextWidths(native_object, text.toCharArray(), start, end - start, widths);
9689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9709a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
97166743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet    /* package */static int native_getTextGlyphs(int native_object, String text, int start,
97266743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet            int end, int contextStart, int contextEnd, int flags, char[] glyphs) {
97366743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet        // FIXME
97466743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet        return 0;
97566743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet    }
97666743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet
97766743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet    @LayoutlibDelegate
9789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
9799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            char[] text, int index, int count, int contextIndex, int contextCount,
98066743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet            int flags, float[] advances, int advancesIndex, int reserved) {
9815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate from the native int.
9825802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
9835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
9845802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0.f;
9855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
9865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9875802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
988251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet            // FIXME: handle multi-char characters (see measureText)
9895802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float totalAdvance = 0;
9905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            for (int i = 0; i < count; i++) {
9915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                char c = text[i + index];
9925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean found = false;
9935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (FontInfo info : delegate.mFonts) {
9945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (info.mFont.canDisplay(c)) {
9955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        float adv = info.mMetrics.charWidth(c);
9965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        totalAdvance += adv;
9975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        if (advances != null) {
9985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                            advances[i] = adv;
9995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        }
10005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        found = true;
10025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
10035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
10045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
10055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (found == false) {
10075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // no advance for this char.
10085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (advances != null) {
10095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        advances[i] = 0.f;
10105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
10115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
10125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
10135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return totalAdvance;
10155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
10165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
10185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10219a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
10239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, int contextStart, int contextEnd,
102466743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet            int flags, float[] advances, int advancesIndex, int reserved) {
10255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // FIXME: support contextStart, contextEnd and direction flag
10265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        int count = end - start;
10275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        char[] buffer = TemporaryBuffer.obtain(count);
10285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        TextUtils.getChars(text, start, end, buffer, 0);
10295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
103166743a1ec0dddadec7cd8f026f9b6a2239f515beXavier Ducrohet                contextEnd - contextStart, flags, advances, advancesIndex, reserved);
10329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10349a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text,
10369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
10379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10388a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10398a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextRunCursor is not supported.", null, null /*data*/);
10408a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
10419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10439a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text,
10459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
10469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10478a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10488a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextRunCursor is not supported.", null, null /*data*/);
10498a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
10509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10529a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
10549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                char[] text, int index, int count, float x, float y, int path) {
10559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10568a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10578a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextPath is not supported.", null, null /*data*/);
10589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
10629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, float x, float y, int path) {
10639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
10648a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
10658a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextPath is not supported.", null, null /*data*/);
10669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10689a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
10709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, Rect bounds) {
1071c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bounds);
10729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10749a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
10769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, Rect bounds) {
1077c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
1078c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // get the delegate from the native int.
1079c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(nativePaint);
1080c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        if (delegate == null) {
1081c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return;
1082c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
1083c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
1084c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // FIXME should test if the main font can display all those characters.
1085c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // See MeasureText
1086c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        if (delegate.mFonts.size() > 0) {
1087c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            FontInfo mainInfo = delegate.mFonts.get(0);
1088c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
1089c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            Rectangle2D rect = mainInfo.mFont.getStringBounds(text, index, index + count,
1090c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet                    delegate.mFontContext);
1091c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            bounds.set(0, 0, (int) rect.getWidth(), (int) rect.getHeight());
1092c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        }
10939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10959a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
10969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void finalizer(int nativePaint) {
1097cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        sManager.removeJavaReferenceFor(nativePaint);
10989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Private delegate/helper methods ----
11019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1102d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    /*package*/ Paint_Delegate() {
11039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        reset();
11049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private Paint_Delegate(Paint_Delegate paint) {
11079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        set(paint);
11089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void set(Paint_Delegate paint) {
11119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = paint.mFlags;
11129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mColor = paint.mColor;
11139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStyle = paint.mStyle;
11149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mCap = paint.mCap;
11159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mJoin = paint.mJoin;
11165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = paint.mTextAlign;
11179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTypeface = paint.mTypeface;
11189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = paint.mStrokeWidth;
11199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeMiter = paint.mStrokeMiter;
11209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = paint.mTextSize;
11219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = paint.mTextScaleX;
11229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = paint.mTextSkewX;
1123abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = paint.mXfermode;
1124abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = paint.mColorFilter;
1125abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = paint.mShader;
1126abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = paint.mPathEffect;
1127abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = paint.mMaskFilter;
1128d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        mRasterizer = paint.mRasterizer;
11298433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        mHintingMode = paint.mHintingMode;
1130b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
11319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void reset() {
11349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = Paint.DEFAULT_PAINT_FLAGS;
1135d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = 0xFF000000;
113663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mStyle = Paint.Style.FILL.nativeInt;
113763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mCap = Paint.Cap.BUTT.nativeInt;
113863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mJoin = Paint.Join.MITER.nativeInt;
11395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = 0;
1140cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance);
11419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = 1.f;
1142d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mStrokeMiter = 4.f;
11439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = 20.f;
11449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = 1.f;
11459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = 0.f;
1146cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mXfermode = null;
1147cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mColorFilter = null;
1148cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mShader = null;
1149cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mPathEffect = null;
1150cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mMaskFilter = null;
1151cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mRasterizer = null;
1152b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
11538433c36a98c9f45c37d2c60afc8a6a27514ddf2bXavier Ducrohet        mHintingMode = Paint.HINTING_ON;
11549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
11579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Update the {@link Font} object from the typeface, text size and scaling
11589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
1159d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    @SuppressWarnings("deprecation")
11609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void updateFontObject() {
1161cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (mTypeface != null) {
11629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // Get the fonts from the TypeFace object.
1163cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet            List<Font> fonts = mTypeface.getFonts();
11649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // create new font objects as well as FontMetrics, based on the current text size
11669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // and skew info.
11679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size());
11689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            for (Font font : fonts) {
11699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                FontInfo info = new FontInfo();
11709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mFont = font.deriveFont(mTextSize);
11719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                if (mTextScaleX != 1.0 || mTextSkewX != 0) {
11729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    // TODO: support skew
11739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    info.mFont = info.mFont.deriveFont(new AffineTransform(
1174d410bfb2001e7960a27fe6adb9d56f229e70fe5cXavier Ducrohet                            mTextScaleX, mTextSkewX, 0, 1, 0, 0));
11759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                }
11769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont);
11779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                infoList.add(info);
11799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            }
11809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            mFonts = Collections.unmodifiableList(infoList);
11829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
11839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ float measureText(char[] text, int index, int count) {
1186c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
1187c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // WARNING: the logic in this method is similar to Canvas_Delegate.native_drawText
1188c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet        // Any change to this method should be reflected there as well
1189c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
11905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (mFonts.size() > 0) {
11915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            FontInfo mainFont = mFonts.get(0);
11925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int i = index;
11935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int lastIndex = index + count;
11945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float total = 0f;
11955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            while (i < lastIndex) {
11965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // always start with the main font.
11975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex);
11985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (upTo == -1) {
11995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // shortcut to exit
12005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i);
12015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                } else if (upTo > 0) {
12025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, upTo - i);
12035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i = upTo;
12045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // don't call continue at this point. Since it is certain the main font
12055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // cannot display the font a index upTo (now ==i), we move on to the
12065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // fallback fonts directly.
12075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
12085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // no char supported, attempt to read the next char(s) with the
12105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // fallback font. In this case we only test the first character
12115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // and then go back to test with the main font.
12125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Special test for 2-char characters.
12135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean foundFont = false;
12145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (int f = 1 ; f < mFonts.size() ; f++) {
12155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    FontInfo fontInfo = mFonts.get(f);
12165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // need to check that the font can display the character. We test
12185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // differently if the char is a high surrogate.
12195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
12205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount);
12215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (upTo == -1) {
12225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        total += fontInfo.mMetrics.charsWidth(text, i, charCount);
12235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        i += charCount;
12245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        foundFont = true;
12255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
12265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
12285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
12295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // in case no font can display the char, measure it with the main font.
12315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (foundFont == false) {
12325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int size = Character.isHighSurrogate(text[i]) ? 2 : 1;
12335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, size);
12345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i += size;
12355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
12365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
1237c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet
1238c6083f2c9eadb1f8a502ea9806868f5b0148667eXavier Ducrohet            return total;
12395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
12405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
12428da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
12435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12448da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    private float getFontMetrics(FontMetrics metrics) {
12458da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (mFonts.size() > 0) {
12468da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics;
12478da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            if (metrics != null) {
12488da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
12498da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.top = - javaMetrics.getMaxAscent();
12508da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.ascent = - javaMetrics.getAscent();
12518da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.descent = javaMetrics.getDescent();
12528da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.bottom = javaMetrics.getMaxDescent();
12538da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.leading = javaMetrics.getLeading();
12548da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            }
12558da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
12568da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getHeight();
12578da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
12588da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
12598da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
12605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
12615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1262cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    private void setTextLocale(String locale) {
1263cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet        mLocale = new Locale(locale);
1264cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet    }
12658da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
12669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) {
12679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
12689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
12699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
12709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
12719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
12729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
12739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (flagValue) {
12749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags |= flagMask;
12759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        } else {
12769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags &= ~flagMask;
12779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
12789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
1279cb092e2b7fa46477651c8b8733d50307b0de9d6dXavier Ducrohet
12809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet}
1281