Paint_Delegate.java revision cc4977d0fdaf657907912fd6cc2f9426dc8d2e36
19f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/*
29f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project
39f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
49f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
59f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * you may not use this file except in compliance with the License.
69f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * You may obtain a copy of the License at
79f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
89f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
99f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * See the License for the specific language governing permissions and
149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * limitations under the License.
159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */
169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpackage android.graphics;
189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
19918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog;
20d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
21c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetrics;
259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetricsInt;
265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport android.text.TextUtils;
279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport java.awt.BasicStroke;
299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Font;
30b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Shape;
31b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Stroke;
329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Toolkit;
339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.font.FontRenderContext;
349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.geom.AffineTransform;
359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.ArrayList;
369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.Collections;
379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.List;
389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/**
409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Paint
419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Paint have been replaced
439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * by calls to methods of the same name in this delegate class.
449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * it and the original Paint class.
489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * @see DelegateManager
509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */
529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpublic class Paint_Delegate {
539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Class associating a {@link Font} and it's {@link java.awt.FontMetrics}.
569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static final class FontInfo {
589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Font mFont;
599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        java.awt.FontMetrics mMetrics;
609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate manager ----
639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static final DelegateManager<Paint_Delegate> sManager =
649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new DelegateManager<Paint_Delegate>();
659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate helper data ----
679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private List<FontInfo> mFonts;
689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private final FontRenderContext mFontContext = new FontRenderContext(
699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new AffineTransform(), true, true);
709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate data ----
729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mFlags;
739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mColor;
749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mStyle;
759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mCap;
769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mJoin;
775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    private int mTextAlign;
78cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Typeface_Delegate mTypeface;
799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeWidth;
809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeMiter;
819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSize;
829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextScaleX;
839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSkewX;
849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
85cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Xfermode_Delegate mXfermode;
86cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private ColorFilter_Delegate mColorFilter;
87cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Shader_Delegate mShader;
88cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private PathEffect_Delegate mPathEffect;
89cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private MaskFilter_Delegate mMaskFilter;
90cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Rasterizer_Delegate mRasterizer;
91abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Public Helper methods ----
949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public static Paint_Delegate getDelegate(int native_paint) {
965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return sManager.getDelegate(native_paint);
975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
1009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Returns the list of {@link Font} objects. The first item is the main font, the rest
1019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * are fall backs for characters not present in the main font.
1029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
1039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    public List<FontInfo> getFonts() {
1049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return mFonts;
1059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
1069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
107abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    public boolean isAntiAliased() {
108abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0;
109abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    }
110abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
1115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public boolean isFilterBitmap() {
1125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0;
1135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getStyle() {
1165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStyle;
1175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getColor() {
1205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mColor;
1215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
12363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    public int getAlpha() {
12463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return mColor >>> 24;
12563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    }
12663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet
127d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    public void setAlpha(int alpha) {
128d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = (alpha << 24) | (mColor & 0x00FFFFFF);
129d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    }
130d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet
1315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getTextAlign() {
1325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mTextAlign;
1335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public float getStrokeWidth() {
1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStrokeWidth;
1375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
13963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    /**
14063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet     * returns the value of stroke miter needed by the java api.
14163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet     */
14263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet    public float getJavaStrokeMiter() {
143d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        float miter = mStrokeMiter * mStrokeWidth;
144d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        if (miter < 1.f) {
145d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet            miter = 1.f;
146d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        }
147d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        return miter;
1485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaCap() {
1515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sCapArray[mCap]) {
1525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BUTT:
1535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_BUTT;
1545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_ROUND;
1565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case SQUARE:
1585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_SQUARE;
1595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaJoin() {
1635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sJoinArray[mJoin]) {
1645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case MITER:
1665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_MITER;
1675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_ROUND;
1695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BEVEL:
1705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_BEVEL;
1715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
174b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    public Stroke getJavaStroke() {
175cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (mPathEffect != null) {
176cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet            if (mPathEffect.isSupported()) {
177cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                Stroke stroke = mPathEffect.getStroke(this);
178b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                assert stroke != null;
179b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                if (stroke != null) {
180b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    return stroke;
181b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                }
182b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            } else {
183918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT,
184cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                        mPathEffect.getSupportMessage(),
18551a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        null, null /*data*/);
186b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            }
187b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
188b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
189b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // if no custom stroke as been set, set the default one.
190b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return new BasicStroke(
191b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getStrokeWidth(),
192b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaCap(),
193b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaJoin(),
194b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                    getJavaStrokeMiter());
195b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
196b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
197d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
198d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Xfermode} delegate or null if none have been set
199d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
200d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
201d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
202d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Xfermode_Delegate getXfermode() {
203cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mXfermode;
204251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
205251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
206d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
207d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link ColorFilter} delegate or null if none have been set
208d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
209d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
210d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
211d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public ColorFilter_Delegate getColorFilter() {
212cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mColorFilter;
213251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
214251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
215d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
216d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Shader} delegate or null if none have been set
217d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
218d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
219d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
220d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Shader_Delegate getShader() {
221cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mShader;
222251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
223251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
224d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
225d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link MaskFilter} delegate or null if none have been set
226d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
227d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
228d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
229d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public MaskFilter_Delegate getMaskFilter() {
230cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mMaskFilter;
231d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    }
232d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
233d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    /**
234d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * Returns the {@link Rasterizer} delegate or null if none have been set
235d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     *
236d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     * @return the delegate or null.
237d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet     */
238d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    public Rasterizer_Delegate getRasterizer() {
239cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return mRasterizer;
240251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
241251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
2429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- native methods ----
2439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2449a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getFlags(Paint thisPaint) {
2469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mFlags;
2539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2559a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFlags(Paint thisPaint, int flags) {
2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mFlags = flags;
2649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2669a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) {
2685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter);
2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2719a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) {
2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa);
2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2769a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) {
2789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
2799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2819a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) {
2839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
2849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2869a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) {
2889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
2899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2919a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) {
2939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
2949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2969a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setDither(Paint thisPaint, boolean dither) {
2989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.DITHER_FLAG, dither);
2999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3019a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) {
3039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText);
3049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3069a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getColor(Paint thisPaint) {
3089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mColor;
3159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3179a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setColor(Paint thisPaint, int color) {
3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mColor = color;
3269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3289a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getAlpha(Paint thisPaint) {
3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
3349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
33663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        return delegate.getAlpha();
3379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3399a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAlpha(Paint thisPaint, int a) {
3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
347d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        delegate.setAlpha(a);
3489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3509a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeWidth(Paint thisPaint) {
3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeWidth;
3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3619a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeWidth(Paint thisPaint, float width) {
3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeWidth = width;
3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeMiter(Paint thisPaint) {
3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeMiter;
3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3839a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) {
3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeMiter = miter;
3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3949a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
3959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy,
3969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int color) {
3979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
398918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
39951a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                "Paint.setShadowLayer is not supported.", null, null /*data*/);
4009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4029a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSize(Paint thisPaint) {
4049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSize;
4119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4139a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSize(Paint thisPaint, float textSize) {
4159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSize = textSize;
422b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4259a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextScaleX(Paint thisPaint) {
4279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextScaleX;
4349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4369a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) {
4389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextScaleX = scaleX;
445b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4489a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSkewX(Paint thisPaint) {
4509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
4549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSkewX;
4579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4599a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) {
4619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
4659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSkewX = skewX;
468b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
4699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4719a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float ascent(Paint thisPaint) {
4738da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
4748da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4758da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
4768da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
4778da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
4789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4798da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate.mFonts.size() > 0) {
4808da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4818da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            // Android expects negative ascent so we invert the value from Java.
4828da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return - javaMetrics.getAscent();
4838da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
4848da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
4858da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
4869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4889a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4898da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    /*package*/ static float descent(Paint thisPaint) {
4905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
4915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
4935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
4945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
4959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
4975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4988da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getDescent();
4995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
5028da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5038da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
5048da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5059a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5068da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) {
5078da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate
5088da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
5108da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0;
5118da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
5128da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
5138da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return delegate.getFontMetrics(metrics);
5145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
5155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
5169a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) {
5189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate
5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
5255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
5265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            if (fmi != null) {
5275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
5285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.top = - javaMetrics.getMaxAscent();
5295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.ascent = - javaMetrics.getAscent();
5305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.descent = javaMetrics.getDescent();
5315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.bottom = javaMetrics.getMaxDescent();
5325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.leading = javaMetrics.getLeading();
5335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
5349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return javaMetrics.getHeight();
5365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
5379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
5395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
5409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
5435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int count) {
5445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // WARNING: the logic in this method is similar to Canvas.drawText.
5455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // Any change to this method should be reflected in Canvas.drawText
5469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
5485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
5495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
5505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
5519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.measureText(text, index, count);
5549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5569a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) {
5589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), start, end - start);
5599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5619a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text) {
5639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), 0, text.length());
5649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5669a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
5689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
5699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
5708a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
5718a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.native_breakText is not supported.", null, null /*data*/);
5728a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
5739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5759a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
5779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
5789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
5798a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
5808a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.native_breakText is not supported.", null, null /*data*/);
5818a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
5829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5849a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_init() {
5869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate();
587cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
5889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5909a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
5919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_initWithPaint(int paint) {
5929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(paint);
5949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate(delegate);
599cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
6009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6029a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_reset(int native_object) {
6049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.reset();
6119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6139a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_set(int native_dst, int native_src) {
6159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
6179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_dst == null) {
6189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_src = sManager.getDelegate(native_src);
6239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_src == null) {
6249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate_dst.set(delegate_src);
6289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6309a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStyle(int native_object) {
6329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStyle;
6399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6419a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStyle(int native_object, int style) {
6439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStyle = style;
6509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6529a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeCap(int native_object) {
6549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mCap;
6619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6639a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeCap(int native_object, int cap) {
6659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mCap = cap;
6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6749a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeJoin(int native_object) {
6769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mJoin;
6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6859a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeJoin(int native_object, int join) {
6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mJoin = join;
6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6969a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
6979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
698b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Paint_Delegate paint = sManager.getDelegate(native_object);
699b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (paint == null) {
700b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
701b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
702b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
703b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate srcPath = Path_Delegate.getDelegate(src);
704b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (srcPath == null) {
705b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
706b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
707b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
708b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate dstPath = Path_Delegate.getDelegate(dst);
709b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstPath == null) {
710b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
711b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
712b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
713b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Stroke stroke = paint.getJavaStroke();
714b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape());
715b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
716b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstPath.setJavaShape(strokeShape);
717b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
718b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // FIXME figure out the return value?
719b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
7209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setShader(int native_object, int shader) {
724abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
725abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
726abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
727abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return shader;
728abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
729abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
730cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mShader = Shader_Delegate.getDelegate(shader);
731cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
732cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return shader;
7339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7359a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setColorFilter(int native_object, int filter) {
737abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
738abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
739abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
740abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return filter;
741abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
742abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
743cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);;
744d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
745d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
746cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (delegate.mColorFilter != null && delegate.mColorFilter.isSupported() == false) {
747918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER,
748cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mColorFilter.getSupportMessage(), null, null /*data*/);
749d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
750d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
751d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return filter;
7529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setXfermode(int native_object, int xfermode) {
756abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
757abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
758abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
759abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return xfermode;
760abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
761abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
762cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mXfermode = Xfermode_Delegate.getDelegate(xfermode);
763cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
764cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return xfermode;
7659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7679a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setPathEffect(int native_object, int effect) {
769abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
770abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
771abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
772abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return effect;
773abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
774abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
775cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect);
776cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet
777cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return effect;
7789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7809a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
7819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
782abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
783abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
784abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
785abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return maskfilter;
786abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
787abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
788cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter);
789d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
790d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
791cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (delegate.mMaskFilter != null && delegate.mMaskFilter.isSupported() == false) {
792918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER,
793cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mMaskFilter.getSupportMessage(), null, null /*data*/);
794d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
795d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
796d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return maskfilter;
7979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7999a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setTypeface(int native_object, int typeface) {
8019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
8029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
8049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
8059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
807cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mTypeface = Typeface_Delegate.getDelegate(typeface);
808b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        delegate.updateFontObject();
809cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return typeface;
8109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8129a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
814d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // get the delegate from the native int.
815d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
816d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        if (delegate == null) {
817d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet            return rasterizer;
818d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
819d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
820cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer);
821d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
822d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        // since none of those are supported, display a fidelity warning right away
823cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (delegate.mRasterizer != null && delegate.mRasterizer.isSupported() == false) {
824918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet            Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER,
825cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet                    delegate.mRasterizer.getSupportMessage(), null, null /*data*/);
826d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        }
827d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet
828d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        return rasterizer;
8299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8319a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextAlign(int native_object) {
8339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
8349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
8369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
8379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.mTextAlign;
8409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8429a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setTextAlign(int native_object, int align) {
8449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
8459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
8479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
8489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        delegate.mTextAlign = align;
8519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8539a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) {
8558da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        // get the delegate from the native int.
8568da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_paint);
8578da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (delegate == null) {
8588da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return 0.f;
8598da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
8608da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
8618da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return delegate.getFontMetrics(metrics);
8629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8649a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
8669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, float[] widths) {
8679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8688a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
8698a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextWidths is not supported.", null, null /*data*/);
8708a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, String text, int start,
8759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, float[] widths) {
8769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8778a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
8788a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextWidths is not supported.", null, null /*data*/);
8798a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
8809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8829a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
8839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
8849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            char[] text, int index, int count, int contextIndex, int contextCount,
8859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int flags, float[] advances, int advancesIndex) {
8865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate from the native int.
8875802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
8885802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
8895802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0.f;
8905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
8915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
8925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
893251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet            // FIXME: handle multi-char characters (see measureText)
8945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float totalAdvance = 0;
8955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            for (int i = 0; i < count; i++) {
8965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                char c = text[i + index];
8975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean found = false;
8985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (FontInfo info : delegate.mFonts) {
8995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (info.mFont.canDisplay(c)) {
9005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        float adv = info.mMetrics.charWidth(c);
9015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        totalAdvance += adv;
9025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        if (advances != null) {
9035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                            advances[i] = adv;
9045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        }
9055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        found = true;
9075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
9085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
9095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
9105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (found == false) {
9125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // no advance for this char.
9135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (advances != null) {
9145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        advances[i] = 0.f;
9155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
9165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
9175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
9185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return totalAdvance;
9205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
9215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
9235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9269a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
9289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, int contextStart, int contextEnd,
9299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int flags, float[] advances, int advancesIndex) {
9305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // FIXME: support contextStart, contextEnd and direction flag
9315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        int count = end - start;
9325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        char[] buffer = TemporaryBuffer.obtain(count);
9335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        TextUtils.getChars(text, start, end, buffer, 0);
9345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
9365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                contextEnd - contextStart, flags, advances, advancesIndex);
9379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9399a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text,
9419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
9429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
9438a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
9448a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextRunCursor is not supported.", null, null /*data*/);
9458a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
9469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9489a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text,
9509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
9519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
9528a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
9538a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextRunCursor is not supported.", null, null /*data*/);
9548a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        return 0;
9559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9579a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
9599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                char[] text, int index, int count, float x, float y, int path) {
9609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
9618a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
9628a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextPath is not supported.", null, null /*data*/);
9639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
9679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, float x, float y, int path) {
9689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
9698a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
9708a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getTextPath is not supported.", null, null /*data*/);
9719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
9759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, Rect bounds) {
9769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
9778a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
9788a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getStringBounds is not supported.", null, null /*data*/);
9799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9819a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
9839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, Rect bounds) {
9849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
9858a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet        Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
9868a80a8555238cc564f445f902aff5231993a8f96Xavier Ducrohet                "Paint.getCharArrayBounds is not supported.", null, null /*data*/);
9879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9899a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
9909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void finalizer(int nativePaint) {
991cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        sManager.removeJavaReferenceFor(nativePaint);
9929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Private delegate/helper methods ----
9959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
996d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet    /*package*/ Paint_Delegate() {
9979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        reset();
9989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private Paint_Delegate(Paint_Delegate paint) {
10019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        set(paint);
10029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void set(Paint_Delegate paint) {
10059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = paint.mFlags;
10069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mColor = paint.mColor;
10079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStyle = paint.mStyle;
10089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mCap = paint.mCap;
10099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mJoin = paint.mJoin;
10105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = paint.mTextAlign;
10119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTypeface = paint.mTypeface;
10129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = paint.mStrokeWidth;
10139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeMiter = paint.mStrokeMiter;
10149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = paint.mTextSize;
10159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = paint.mTextScaleX;
10169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = paint.mTextSkewX;
1017abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = paint.mXfermode;
1018abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = paint.mColorFilter;
1019abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = paint.mShader;
1020abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = paint.mPathEffect;
1021abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = paint.mMaskFilter;
1022d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet        mRasterizer = paint.mRasterizer;
1023b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
10249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void reset() {
10279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = Paint.DEFAULT_PAINT_FLAGS;
1028d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mColor = 0xFF000000;
102963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mStyle = Paint.Style.FILL.nativeInt;
103063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mCap = Paint.Cap.BUTT.nativeInt;
103163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        mJoin = Paint.Join.MITER.nativeInt;
10325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = 0;
1033cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance);
10349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = 1.f;
1035d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet        mStrokeMiter = 4.f;
10369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = 20.f;
10379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = 1.f;
10389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = 0.f;
1039cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mXfermode = null;
1040cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mColorFilter = null;
1041cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mShader = null;
1042cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mPathEffect = null;
1043cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mMaskFilter = null;
1044cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        mRasterizer = null;
1045b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet        updateFontObject();
10469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
10499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Update the {@link Font} object from the typeface, text size and scaling
10509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
1051d43909c7503e11eb335a452d296a10804bb01fd6Xavier Ducrohet    @SuppressWarnings("deprecation")
10529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void updateFontObject() {
1053cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (mTypeface != null) {
10549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // Get the fonts from the TypeFace object.
1055cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet            List<Font> fonts = mTypeface.getFonts();
10569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // create new font objects as well as FontMetrics, based on the current text size
10589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // and skew info.
10599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size());
10609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            for (Font font : fonts) {
10619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                FontInfo info = new FontInfo();
10629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mFont = font.deriveFont(mTextSize);
10639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                if (mTextScaleX != 1.0 || mTextSkewX != 0) {
10649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    // TODO: support skew
10659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    info.mFont = info.mFont.deriveFont(new AffineTransform(
10669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                            mTextScaleX, mTextSkewX, 0, 0, 1, 0));
10679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                }
10689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont);
10699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                infoList.add(info);
10719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            }
10729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            mFonts = Collections.unmodifiableList(infoList);
10749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
10759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
10769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
10775802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ float measureText(char[] text, int index, int count) {
10785802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (mFonts.size() > 0) {
10795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            FontInfo mainFont = mFonts.get(0);
10805802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int i = index;
10815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int lastIndex = index + count;
10825802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float total = 0f;
10835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            while (i < lastIndex) {
10845802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // always start with the main font.
10855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex);
10865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (upTo == -1) {
10875802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // shortcut to exit
10885802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i);
10895802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                } else if (upTo > 0) {
10905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, upTo - i);
10915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i = upTo;
10925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // don't call continue at this point. Since it is certain the main font
10935802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // cannot display the font a index upTo (now ==i), we move on to the
10945802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // fallback fonts directly.
10955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
10965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
10975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // no char supported, attempt to read the next char(s) with the
10985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // fallback font. In this case we only test the first character
10995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // and then go back to test with the main font.
11005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Special test for 2-char characters.
11015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean foundFont = false;
11025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (int f = 1 ; f < mFonts.size() ; f++) {
11035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    FontInfo fontInfo = mFonts.get(f);
11045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
11055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // need to check that the font can display the character. We test
11065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // differently if the char is a high surrogate.
11075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
11085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount);
11095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (upTo == -1) {
11105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        total += fontInfo.mMetrics.charsWidth(text, i, charCount);
11115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        i += charCount;
11125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        foundFont = true;
11135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
11145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
11155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
11165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
11175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
11185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // in case no font can display the char, measure it with the main font.
11195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (foundFont == false) {
11205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int size = Character.isHighSurrogate(text[i]) ? 2 : 1;
11215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, size);
11225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i += size;
11235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
11245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
11255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
11265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
11275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
11288da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    }
11295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
11308da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet    private float getFontMetrics(FontMetrics metrics) {
11318da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        if (mFonts.size() > 0) {
11328da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics;
11338da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            if (metrics != null) {
11348da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
11358da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.top = - javaMetrics.getMaxAscent();
11368da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.ascent = - javaMetrics.getAscent();
11378da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.descent = javaMetrics.getDescent();
11388da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.bottom = javaMetrics.getMaxDescent();
11398da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet                metrics.leading = javaMetrics.getLeading();
11408da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            }
11418da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
11428da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet            return javaMetrics.getHeight();
11438da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        }
11448da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
11458da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet        return 0;
11465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
11475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
11488da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
11498da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet
11509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) {
11519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
11529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
11539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
11549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
11559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
11569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
11579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (flagValue) {
11589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags |= flagMask;
11599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        } else {
11609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags &= ~flagMask;
11619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
11629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
11639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet}
1164