Paint_Delegate.java revision b44b43b1579486ff7ecd0f7528f17711acdeae98
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
19d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
20c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetrics;
239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetricsInt;
245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport android.text.TextUtils;
259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport java.awt.BasicStroke;
279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Font;
28b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Shape;
29b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Stroke;
309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Toolkit;
319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.font.FontRenderContext;
329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.geom.AffineTransform;
339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.ArrayList;
349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.Collections;
359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.List;
369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/**
389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Paint
399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Paint have been replaced
419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * by calls to methods of the same name in this delegate class.
429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * it and the original Paint class.
469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * @see DelegateManager
489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */
509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpublic class Paint_Delegate {
519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Class associating a {@link Font} and it's {@link java.awt.FontMetrics}.
549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static final class FontInfo {
569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Font mFont;
579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        java.awt.FontMetrics mMetrics;
589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate manager ----
619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static final DelegateManager<Paint_Delegate> sManager =
629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new DelegateManager<Paint_Delegate>();
639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate helper data ----
659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private List<FontInfo> mFonts;
669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private final FontRenderContext mFontContext = new FontRenderContext(
679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new AffineTransform(), true, true);
689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate data ----
709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mFlags;
719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mColor;
729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mStyle;
739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mCap;
749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mJoin;
755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    private int mTextAlign;
769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mTypeface;
779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeWidth;
789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeMiter;
799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSize;
809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextScaleX;
819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSkewX;
829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
83abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mXfermode;
84abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mColorFilter;
85abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mShader;
86abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mPathEffect;
87abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mMaskFilter;
88d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    private int mRasterizer;
89abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Public Helper methods ----
929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public static Paint_Delegate getDelegate(int native_paint) {
945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return sManager.getDelegate(native_paint);
955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Returns the list of {@link Font} objects. The first item is the main font, the rest
999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * are fall backs for characters not present in the main font.
1009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
1019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    public List<FontInfo> getFonts() {
1029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return mFonts;
1039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
1049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
105abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    public boolean isAntiAliased() {
106abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0;
107abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    }
108abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
1095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public boolean isFilterBitmap() {
1105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0;
1115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getStyle() {
1145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStyle;
1155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getColor() {
1185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mColor;
1195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    public int getAlpha() {
12263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return mColor >>> 24;
12363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    }
12463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet
125d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    public void setAlpha(int alpha) {
126d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = (alpha << 24) | (mColor & 0x00FFFFFF);
127d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    }
128d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet
1295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getTextAlign() {
1305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mTextAlign;
1315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public float getStrokeWidth() {
1345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStrokeWidth;
1355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
13763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    /**
13863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet     * returns the value of stroke miter needed by the java api.
13963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet     */
14063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    public float getJavaStrokeMiter() {
141d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        float miter = mStrokeMiter * mStrokeWidth;
142d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        if (miter < 1.f) {
143d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet            miter = 1.f;
144d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        }
145d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        return miter;
1465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaCap() {
1495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sCapArray[mCap]) {
1505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BUTT:
1515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_BUTT;
1525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_ROUND;
1545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case SQUARE:
1565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_SQUARE;
1575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaJoin() {
1615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sJoinArray[mJoin]) {
1625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case MITER:
1645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_MITER;
1655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_ROUND;
1675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BEVEL:
1685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_BEVEL;
1695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
172b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    public Stroke getJavaStroke() {
173b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        PathEffect_Delegate effectDelegate = PathEffect_Delegate.getDelegate(mPathEffect);
174b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (effectDelegate != null) {
175b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            if (effectDelegate.isSupported()) {
176b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                Stroke stroke = effectDelegate.getStroke(this);
177b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                assert stroke != null;
178b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                if (stroke != null) {
179b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    return stroke;
180b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                }
181b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            } else {
182b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                Bridge.getLog().fidelityWarning(null,
183b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                        effectDelegate.getSupportMessage(),
184b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                        null);
185b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            }
186b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
187b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
188b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // if no custom stroke as been set, set the default one.
189b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return new BasicStroke(
190b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getStrokeWidth(),
191b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaCap(),
192b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaJoin(),
193b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaStrokeMiter());
194b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
195b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
196d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
197d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Xfermode} delegate or null if none have been set
198d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
199d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
200d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
201d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Xfermode_Delegate getXfermode() {
202d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return  Xfermode_Delegate.getDelegate(mXfermode);
203251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
204251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
205d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
206d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link ColorFilter} delegate or null if none have been set
207d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
208d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
209d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
210d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public ColorFilter_Delegate getColorFilter() {
211d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return ColorFilter_Delegate.getDelegate(mColorFilter);
212251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
213251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
214d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
215d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Shader} delegate or null if none have been set
216d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
217d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
218d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
219d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Shader_Delegate getShader() {
220d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return Shader_Delegate.getDelegate(mShader);
221251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
222251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
223d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
224d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link MaskFilter} delegate or null if none have been set
225d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
226d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
227d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
228d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public MaskFilter_Delegate getMaskFilter() {
229d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return MaskFilter_Delegate.getDelegate(mMaskFilter);
230d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    }
231d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
232d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
233d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Rasterizer} delegate or null if none have been set
234d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
235d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
236d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
237d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Rasterizer_Delegate getRasterizer() {
238d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return Rasterizer_Delegate.getDelegate(mRasterizer);
239251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
240251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
2419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- native methods ----
2429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getFlags(Paint thisPaint) {
2449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
2489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mFlags;
2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFlags(Paint thisPaint, int flags) {
2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mFlags = flags;
2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) {
2645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter);
2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) {
2689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa);
2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) {
2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) {
2769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
2779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) {
2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
2819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) {
2849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
2859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setDither(Paint thisPaint, boolean dither) {
2889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.DITHER_FLAG, dither);
2899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) {
2929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText);
2939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getColor(Paint thisPaint) {
2969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
3009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mColor;
3039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setColor(Paint thisPaint, int color) {
3069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mColor = color;
3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getAlpha(Paint thisPaint) {
3169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
3209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
32263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return delegate.getAlpha();
3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAlpha(Paint thisPaint, int a) {
3269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
332d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        delegate.setAlpha(a);
3339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeWidth(Paint thisPaint) {
3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeWidth;
3439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeWidth(Paint thisPaint, float width) {
3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeWidth = width;
3539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeMiter(Paint thisPaint) {
3569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeMiter;
3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) {
3669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeMiter = miter;
3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy,
3769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int color) {
3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
3789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
3799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSize(Paint thisPaint) {
3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSize;
3899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSize(Paint thisPaint, float textSize) {
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.mTextSize = textSize;
399b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextScaleX(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.mTextScaleX;
4109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) {
4139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextScaleX = scaleX;
420b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSkewX(Paint thisPaint) {
4249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSkewX;
4319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) {
4349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSkewX = skewX;
441b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float ascent(Paint thisPaint) {
4458da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
4468da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4478da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
4488da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
4498da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
4509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4518da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate.mFonts.size() > 0) {
4528da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4538da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            // Android expects negative ascent so we invert the value from Java.
4548da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return - javaMetrics.getAscent();
4558da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
4568da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
4578da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
4589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4608da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    /*package*/ static float descent(Paint thisPaint) {
4615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
4625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
4645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
4655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
4669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
4685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4698da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getDescent();
4705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
4719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
4738da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
4748da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
4758da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
4768da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) {
4778da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
4788da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4798da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
4808da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
4818da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
4828da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
4838da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return delegate.getFontMetrics(metrics);
4845802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
4855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
4865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) {
4879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate
4889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
4919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
4945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            if (fmi != null) {
4965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
4975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.top = - javaMetrics.getMaxAscent();
4985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.ascent = - javaMetrics.getAscent();
4995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.descent = javaMetrics.getDescent();
5005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.bottom = javaMetrics.getMaxDescent();
5015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.leading = javaMetrics.getLeading();
5025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
5039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return javaMetrics.getHeight();
5055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
5085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
5099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
5115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int count) {
5125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // WARNING: the logic in this method is similar to Canvas.drawText.
5135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // Any change to this method should be reflected in Canvas.drawText
5149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
5165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
5185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.measureText(text, index, count);
5229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) {
5259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), start, end - start);
5269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text) {
5299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), 0, text.length());
5309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
5339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
5349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
5359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
5369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
5399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
5409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
5419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
5429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_init() {
5469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate();
5479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return sManager.addDelegate(newDelegate);
5489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_initWithPaint(int paint) {
5519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(paint);
5539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate(delegate);
5589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return sManager.addDelegate(newDelegate);
5599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_reset(int native_object) {
5629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.reset();
5699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_set(int native_dst, int native_src) {
5729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
5749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_dst == null) {
5759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_src = sManager.getDelegate(native_src);
5809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_src == null) {
5819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate_dst.set(delegate_src);
5859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStyle(int native_object) {
5889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStyle;
5959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStyle(int native_object, int style) {
5989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStyle = style;
6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeCap(int native_object) {
6089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mCap;
6159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeCap(int native_object, int cap) {
6189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mCap = cap;
6259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeJoin(int native_object) {
6289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mJoin;
6359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeJoin(int native_object, int join) {
6389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mJoin = join;
6459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
648b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Paint_Delegate paint = sManager.getDelegate(native_object);
649b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (paint == null) {
650b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
651b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
652b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
653b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate srcPath = Path_Delegate.getDelegate(src);
654b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (srcPath == null) {
655b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
656b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
657b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
658b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate dstPath = Path_Delegate.getDelegate(dst);
659b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstPath == null) {
660b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
661b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
662b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
663b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Stroke stroke = paint.getJavaStroke();
664b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape());
665b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
666b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstPath.setJavaShape(strokeShape);
667b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
668b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // FIXME figure out the return value?
669b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setShader(int native_object, int shader) {
673abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
674abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
675abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
676abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return shader;
677abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
678abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
679abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mShader = shader;
6809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setColorFilter(int native_object, int filter) {
683abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
684abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
685abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
686abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return filter;
687abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
688abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
689d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        delegate.mColorFilter = filter;
690d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
691d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
692d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        ColorFilter_Delegate filterDelegate = delegate.getColorFilter();
693d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (filterDelegate != null && filterDelegate.isSupported() == false) {
694d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            Bridge.getLog().fidelityWarning(null, filterDelegate.getSupportMessage(), null);
695d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
696d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
697d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return filter;
6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setXfermode(int native_object, int xfermode) {
701abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
702abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
703abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
704abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return xfermode;
705abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
706abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
707abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mXfermode = xfermode;
7089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setPathEffect(int native_object, int effect) {
711abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
712abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
713abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
714abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return effect;
715abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
716abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
717abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mPathEffect = effect;
7189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
721abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
722abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
723abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
724abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return maskfilter;
725abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
726abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
727d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        delegate.mMaskFilter = maskfilter;
728d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
729d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
730d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        MaskFilter_Delegate filterDelegate = delegate.getMaskFilter();
731d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (filterDelegate != null && filterDelegate.isSupported() == false) {
732d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            Bridge.getLog().fidelityWarning(null, filterDelegate.getSupportMessage(), null);
733d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
734d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
735d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return maskfilter;
7369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setTypeface(int native_object, int typeface) {
7399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
7439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
745b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.mTypeface = typeface;
746b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
747b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        return delegate.mTypeface;
7489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
751d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // get the delegate from the native int.
752d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
753d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (delegate == null) {
754d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            return rasterizer;
755d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
756d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
757d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        delegate.mRasterizer = rasterizer;
758d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
759d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
760d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        Rasterizer_Delegate rasterizerDelegate = delegate.getRasterizer();
761d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (rasterizerDelegate != null && rasterizerDelegate.isSupported() == false) {
762d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            Bridge.getLog().fidelityWarning(null, rasterizerDelegate.getSupportMessage(), null);
763d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
764d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
765d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return rasterizer;
7669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextAlign(int native_object) {
7699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
7739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7755802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.mTextAlign;
7769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setTextAlign(int native_object, int align) {
7799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
7809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
7829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
7839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
7849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        delegate.mTextAlign = align;
7869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) {
7898da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate from the native int.
7908da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_paint);
7918da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
7928da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0.f;
7938da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
7948da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
7958da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return delegate.getFontMetrics(metrics);
7969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
7999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, float[] widths) {
8009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, String text, int start,
8059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, float[] widths) {
8069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            char[] text, int index, int count, int contextIndex, int contextCount,
8129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int flags, float[] advances, int advancesIndex) {
8135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate from the native int.
8145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
8165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0.f;
8175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
8185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
820251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet            // FIXME: handle multi-char characters (see measureText)
8215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float totalAdvance = 0;
8225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            for (int i = 0; i < count; i++) {
8235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                char c = text[i + index];
8245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean found = false;
8255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (FontInfo info : delegate.mFonts) {
8265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (info.mFont.canDisplay(c)) {
8275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        float adv = info.mMetrics.charWidth(c);
8285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        totalAdvance += adv;
8295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        if (advances != null) {
8305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                            advances[i] = adv;
8315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        }
8325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        found = true;
8345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
8355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
8365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
8375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (found == false) {
8395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // no advance for this char.
8405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (advances != null) {
8415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        advances[i] = 0.f;
8425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
8435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
8445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
8455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return totalAdvance;
8475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
8485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
8505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
8549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, int contextStart, int contextEnd,
8559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int flags, float[] advances, int advancesIndex) {
8565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // FIXME: support contextStart, contextEnd and direction flag
8575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        int count = end - start;
8585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        char[] buffer = TemporaryBuffer.obtain(count);
8595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        TextUtils.getChars(text, start, end, buffer, 0);
8605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
8625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                contextEnd - contextStart, flags, advances, advancesIndex);
8639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text,
8669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
8679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text,
8729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
8739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
8789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                char[] text, int index, int count, float x, float y, int path) {
8799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
8849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, float x, float y, int path) {
8859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
8909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, Rect bounds) {
8919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
8969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, Rect bounds) {
8979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void finalizer(int nativePaint) {
9029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        sManager.removeDelegate(nativePaint);
9039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Private delegate/helper methods ----
9069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
907d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    /*package*/ Paint_Delegate() {
9089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        reset();
9099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private Paint_Delegate(Paint_Delegate paint) {
9129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        set(paint);
9139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void set(Paint_Delegate paint) {
9169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = paint.mFlags;
9179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mColor = paint.mColor;
9189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStyle = paint.mStyle;
9199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mCap = paint.mCap;
9209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mJoin = paint.mJoin;
9215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = paint.mTextAlign;
9229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTypeface = paint.mTypeface;
9239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = paint.mStrokeWidth;
9249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeMiter = paint.mStrokeMiter;
9259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = paint.mTextSize;
9269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = paint.mTextScaleX;
9279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = paint.mTextSkewX;
928abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = paint.mXfermode;
929abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = paint.mColorFilter;
930abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = paint.mShader;
931abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = paint.mPathEffect;
932abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = paint.mMaskFilter;
933d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        mRasterizer = paint.mRasterizer;
934b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
9359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void reset() {
9389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = Paint.DEFAULT_PAINT_FLAGS;
939d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = 0xFF000000;
94063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mStyle = Paint.Style.FILL.nativeInt;
94163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mCap = Paint.Cap.BUTT.nativeInt;
94263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mJoin = Paint.Join.MITER.nativeInt;
9435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = 0;
944b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        mTypeface = Typeface.sDefaults[0].native_instance;
9459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = 1.f;
946d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mStrokeMiter = 4.f;
9479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = 20.f;
9489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = 1.f;
9499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = 0.f;
950abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = 0;
951abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = 0;
952abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = 0;
953abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = 0;
954abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = 0;
955d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        mRasterizer = 0;
956b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
9579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
9609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Update the {@link Font} object from the typeface, text size and scaling
9619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
962d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    @SuppressWarnings("deprecation")
9639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void updateFontObject() {
9649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (mTypeface != 0) {
9659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // Get the fonts from the TypeFace object.
9669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            List<Font> fonts = Typeface_Delegate.getFonts(mTypeface);
9679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // create new font objects as well as FontMetrics, based on the current text size
9699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // and skew info.
9709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size());
9719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            for (Font font : fonts) {
9729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                FontInfo info = new FontInfo();
9739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mFont = font.deriveFont(mTextSize);
9749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                if (mTextScaleX != 1.0 || mTextSkewX != 0) {
9759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    // TODO: support skew
9769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    info.mFont = info.mFont.deriveFont(new AffineTransform(
9779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                            mTextScaleX, mTextSkewX, 0, 0, 1, 0));
9789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                }
9799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont);
9809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                infoList.add(info);
9829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            }
9839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            mFonts = Collections.unmodifiableList(infoList);
9859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
9869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9885802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ float measureText(char[] text, int index, int count) {
9895802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (mFonts.size() > 0) {
9905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            FontInfo mainFont = mFonts.get(0);
9915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int i = index;
9925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int lastIndex = index + count;
9935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float total = 0f;
9945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            while (i < lastIndex) {
9955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // always start with the main font.
9965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex);
9975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (upTo == -1) {
9985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // shortcut to exit
9995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i);
10005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                } else if (upTo > 0) {
10015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, upTo - i);
10025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i = upTo;
10035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // don't call continue at this point. Since it is certain the main font
10045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // cannot display the font a index upTo (now ==i), we move on to the
10055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // fallback fonts directly.
10065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
10075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // no char supported, attempt to read the next char(s) with the
10095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // fallback font. In this case we only test the first character
10105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // and then go back to test with the main font.
10115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Special test for 2-char characters.
10125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean foundFont = false;
10135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (int f = 1 ; f < mFonts.size() ; f++) {
10145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    FontInfo fontInfo = mFonts.get(f);
10155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // need to check that the font can display the character. We test
10175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // differently if the char is a high surrogate.
10185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
10195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount);
10205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (upTo == -1) {
10215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        total += fontInfo.mMetrics.charsWidth(text, i, charCount);
10225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        i += charCount;
10235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        foundFont = true;
10245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
10255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
10275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
10285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // in case no font can display the char, measure it with the main font.
10305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (foundFont == false) {
10315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int size = Character.isHighSurrogate(text[i]) ? 2 : 1;
10325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, size);
10335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i += size;
10345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
10355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
10365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
10375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
10398da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
10405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10418da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    private float getFontMetrics(FontMetrics metrics) {
10428da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (mFonts.size() > 0) {
10438da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics;
10448da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            if (metrics != null) {
10458da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
10468da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.top = - javaMetrics.getMaxAscent();
10478da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.ascent = - javaMetrics.getAscent();
10488da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.descent = javaMetrics.getDescent();
10498da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.bottom = javaMetrics.getMaxDescent();
10508da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.leading = javaMetrics.getLeading();
10518da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            }
10528da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
10538da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getHeight();
10548da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
10558da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
10568da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
10575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
10585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10598da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
10608da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
10619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) {
10629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
10639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
10649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
10659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
10669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
10679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (flagValue) {
10699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags |= flagMask;
10709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        } else {
10719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags &= ~flagMask;
10729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
10739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet}
1075