Paint_Delegate.java revision c2e9651bf386a1f7bf7fc706cf5424950570470c
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
19c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetrics;
229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport android.graphics.Paint.FontMetricsInt;
235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport android.text.TextUtils;
249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohetimport java.awt.BasicStroke;
269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Font;
279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.Toolkit;
289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.font.FontRenderContext;
299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.awt.geom.AffineTransform;
309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.ArrayList;
319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.Collections;
329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetimport java.util.List;
339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet/**
359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Paint
369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Paint have been replaced
389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * by calls to methods of the same name in this delegate class.
399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * it and the original Paint class.
439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * @see DelegateManager
459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet *
469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */
479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohetpublic class Paint_Delegate {
489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Class associating a {@link Font} and it's {@link java.awt.FontMetrics}.
519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static final class FontInfo {
539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Font mFont;
549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        java.awt.FontMetrics mMetrics;
559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate manager ----
589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static final DelegateManager<Paint_Delegate> sManager =
599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new DelegateManager<Paint_Delegate>();
609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate helper data ----
629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private List<FontInfo> mFonts;
639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private final FontRenderContext mFontContext = new FontRenderContext(
649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            new AffineTransform(), true, true);
659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- delegate data ----
679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mFlags;
689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mColor;
699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mStyle;
709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mCap;
719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mJoin;
725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    private int mTextAlign;
739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private int mTypeface;
749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeWidth;
759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mStrokeMiter;
769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSize;
779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextScaleX;
789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private float mTextSkewX;
799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
80abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mXfermode;
81abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mColorFilter;
82abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mShader;
83abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mPathEffect;
84abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    private int mMaskFilter;
85abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Public Helper methods ----
889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
895802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public static Paint_Delegate getDelegate(int native_paint) {
905802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return sManager.getDelegate(native_paint);
915802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
925802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Returns the list of {@link Font} objects. The first item is the main font, the rest
959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * are fall backs for characters not present in the main font.
969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    public List<FontInfo> getFonts() {
989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return mFonts;
999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
1009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
101abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    public boolean isAntiAliased() {
102abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0;
103abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet    }
104abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
1055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public boolean isFilterBitmap() {
1065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0;
1075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getStyle() {
1105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStyle;
1115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getColor() {
1145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mColor;
1155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getAlpha() {
1185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mColor >>> 24;
1195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getTextAlign() {
1225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mTextAlign;
1235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public float getStrokeWidth() {
1265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStrokeWidth;
1275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public float getStrokeMiter() {
1305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return mStrokeMiter;
1315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaCap() {
1345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sCapArray[mCap]) {
1355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BUTT:
1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_BUTT;
1375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_ROUND;
1395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case SQUARE:
1415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.CAP_SQUARE;
1425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
1455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    public int getJavaJoin() {
1465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        switch (Paint.sJoinArray[mJoin]) {
1475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            default:
1485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case MITER:
1495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_MITER;
1505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case ROUND:
1515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_ROUND;
1525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            case BEVEL:
1535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                return BasicStroke.JOIN_BEVEL;
1545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
1555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
1569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
157251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public int getXfermode() {
158251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        return mXfermode;
159251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
160251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
161251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public int getColorFilter() {
162251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        return mColorFilter;
163251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
164251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
165251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public int getShader() {
166251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        return mShader;
167251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
168251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
169251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public int getPathEffect() {
170251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        return mPathEffect;
171251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
172251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
173251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public int getMaskFilter() {
174251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        return mMaskFilter;
175251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
176251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
1779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- native methods ----
1789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getFlags(Paint thisPaint) {
1809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
1819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
1829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
1839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
1849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
1859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
1869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mFlags;
1889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
1899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFlags(Paint thisPaint, int flags) {
1919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
1929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
1939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
1949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
1959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
1969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
1979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
1989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mFlags = flags;
1999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) {
2025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter);
2039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) {
2069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa);
2079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) {
2109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
2119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) {
2149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
2159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) {
2189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
2199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) {
2229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
2239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setDither(Paint thisPaint, boolean dither) {
2269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.DITHER_FLAG, dither);
2279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) {
2309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText);
2319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getColor(Paint thisPaint) {
2349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
2389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
2399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mColor;
2429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setColor(Paint thisPaint, int color) {
2459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
2499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mColor = color;
2539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int getAlpha(Paint thisPaint) {
2569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
2609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.getAlpha();
2649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setAlpha(Paint thisPaint, int a) {
2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mColor = (a << 24) | (delegate.mColor & 0x00FFFFFF);
2759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeWidth(Paint thisPaint) {
2789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
2829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
2839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeWidth;
2869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeWidth(Paint thisPaint, float width) {
2899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
2909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
2919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
2929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
2939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
2949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
2959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeWidth = width;
2979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
2989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
2999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getStrokeMiter(Paint thisPaint) {
3009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStrokeMiter;
3089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) {
3119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStrokeMiter = miter;
3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy,
3229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int color) {
3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
3259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSize(Paint thisPaint) {
3289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSize;
3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSize(Paint thisPaint, float textSize) {
3399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSize = textSize;
3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextScaleX(Paint thisPaint) {
3509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextScaleX;
3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) {
3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextScaleX = scaleX;
3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getTextSkewX(Paint thisPaint) {
3729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 1.f;
3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTextSkewX;
3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) {
3839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
3869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
3879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
3899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mTextSkewX = skewX;
3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float ascent(Paint thisPaint) {
3949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
3959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
3969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
3979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
3989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float descent(Paint thisPaint) {
3999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
4009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
4019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) {
4045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
4055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
4075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            assert false;
4085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
4095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
4109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
4125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            if (metrics != null) {
4145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
4155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                metrics.top = - javaMetrics.getMaxAscent();
4165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                metrics.ascent = - javaMetrics.getAscent();
4175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                metrics.descent = javaMetrics.getDescent();
4185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                metrics.bottom = javaMetrics.getMaxDescent();
4195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                metrics.leading = javaMetrics.getLeading();
4205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return javaMetrics.getHeight();
4235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
4249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
4265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
4275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
4285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) {
4299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate
4309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
4339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
4349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
4375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
4385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            if (fmi != null) {
4395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Android expects negative ascent so we invert the value from Java.
4405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.top = - javaMetrics.getMaxAscent();
4415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.ascent = - javaMetrics.getAscent();
4425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.descent = javaMetrics.getDescent();
4435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.bottom = javaMetrics.getMaxDescent();
4445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                fmi.leading = javaMetrics.getLeading();
4455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
4469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return javaMetrics.getHeight();
4485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
4499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
4515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
4529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
4545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int count) {
4555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // WARNING: the logic in this method is similar to Canvas.drawText.
4565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // Any change to this method should be reflected in Canvas.drawText
4579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate
4595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
4605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
4615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            assert false;
4625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0;
4639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
4649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.measureText(text, index, count);
4669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) {
4699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), start, end - start);
4709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_measureText(Paint thisPaint, String text) {
4739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return native_measureText(thisPaint, text.toCharArray(), 0, text.length());
4749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
4779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
4789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
4799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
4809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
4839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            float maxWidth, float[] measuredWidth) {
4849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
4859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
4869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_init() {
4909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate();
4919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return sManager.addDelegate(newDelegate);
4929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
4939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
4949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_initWithPaint(int paint) {
4959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
4969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(paint);
4979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
4989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
4999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate newDelegate = new Paint_Delegate(delegate);
5039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return sManager.addDelegate(newDelegate);
5049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_reset(int native_object) {
5079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.reset();
5159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_set(int native_dst, int native_src) {
5189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
5209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_dst == null) {
5219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate_src = sManager.getDelegate(native_src);
5279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate_src == null) {
5289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate_dst.set(delegate_src);
5339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStyle(int native_object) {
5369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mStyle;
5449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStyle(int native_object, int style) {
5479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mStyle = style;
5559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeCap(int native_object) {
5589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mCap;
5669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeCap(int native_object, int cap) {
5699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mCap = cap;
5779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getStrokeJoin(int native_object) {
5809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
5859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mJoin;
5889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
5899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setStrokeJoin(int native_object, int join) {
5919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
5929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
5939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
5949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
5959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
5969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
5979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
5989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        delegate.mJoin = join;
5999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
6029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
6039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
6049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setShader(int native_object, int shader) {
607abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
608abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
609abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
610abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            assert false;
611abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return shader;
612abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
613abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
614abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mShader = shader;
6159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setColorFilter(int native_object, int filter) {
618abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
619abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
620abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
621abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            assert false;
622abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return filter;
623abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
624abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
625abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mColorFilter = filter;
6269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setXfermode(int native_object, int xfermode) {
629abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
630abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
631abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
632abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            assert false;
633abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return xfermode;
634abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
635abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
636abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mXfermode = xfermode;
6379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setPathEffect(int native_object, int effect) {
640abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
641abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
642abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
643abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            assert false;
644abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return effect;
645abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
646abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
647abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mPathEffect = effect;
6489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
651abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        // get the delegate from the native int.
652abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
653abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        if (delegate == null) {
654abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            assert false;
655abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet            return maskfilter;
656abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        }
657abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet
658abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        return delegate.mMaskFilter = maskfilter;
6599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setTypeface(int native_object, int typeface) {
6629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
6669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        return delegate.mTypeface = typeface;
6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
6739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
6749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextAlign(int native_object) {
6799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return 0;
6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return delegate.mTextAlign;
6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_setTextAlign(int native_object, int align) {
6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
6919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
6929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
6939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
6969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
6975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        delegate.mTextAlign = align;
6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
6999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) {
7019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
7069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, float[] widths) {
7079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextWidths(int native_object, String text, int start,
7129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, float[] widths) {
7139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
7189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            char[] text, int index, int count, int contextIndex, int contextCount,
7199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int flags, float[] advances, int advancesIndex) {
7205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // get the delegate from the native int.
7215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(native_object);
7225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate == null) {
7235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            assert false;
7245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return 0.f;
7255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
7265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (delegate.mFonts.size() > 0) {
728251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet            // FIXME: handle multi-char characters (see measureText)
7295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float totalAdvance = 0;
7305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            for (int i = 0; i < count; i++) {
7315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                char c = text[i + index];
7325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean found = false;
7335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (FontInfo info : delegate.mFonts) {
7345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (info.mFont.canDisplay(c)) {
7355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        float adv = info.mMetrics.charWidth(c);
7365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        totalAdvance += adv;
7375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        if (advances != null) {
7385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                            advances[i] = adv;
7395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        }
7405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        found = true;
7425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
7435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
7445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
7455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (found == false) {
7475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // no advance for this char.
7485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (advances != null) {
7495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        advances[i] = 0.f;
7505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
7515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
7525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
7535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            return totalAdvance;
7555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
7565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
7585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static float native_getTextRunAdvances(int native_object,
7629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, int contextStart, int contextEnd,
7639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int flags, float[] advances, int advancesIndex) {
7645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        // FIXME: support contextStart, contextEnd and direction flag
7655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        int count = end - start;
7665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        char[] buffer = TemporaryBuffer.obtain(count);
7675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        TextUtils.getChars(text, start, end, buffer, 0);
7685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
7695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
7705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                contextEnd - contextStart, flags, advances, advancesIndex);
7719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text,
7749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
7759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text,
7809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
7819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
7869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                char[] text, int index, int count, float x, float y, int path) {
7879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
7929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            String text, int start, int end, float x, float y, int path) {
7939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
7949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
7959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
7969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
7979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
7989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int end, Rect bounds) {
7999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
8049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            int count, Rect bounds) {
8059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // FIXME
8069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        throw new UnsupportedOperationException();
8079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /*package*/ static void finalizer(int nativePaint) {
8109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        sManager.removeDelegate(nativePaint);
8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    // ---- Private delegate/helper methods ----
8149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private Paint_Delegate() {
8169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        reset();
8179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTypeface = Typeface.sDefaults[0].native_instance;
8199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        updateFontObject();
8209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private Paint_Delegate(Paint_Delegate paint) {
8239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        set(paint);
8249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        updateFontObject();
8259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void set(Paint_Delegate paint) {
8289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = paint.mFlags;
8299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mColor = paint.mColor;
8309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStyle = paint.mStyle;
8319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mCap = paint.mCap;
8329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mJoin = paint.mJoin;
8335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = paint.mTextAlign;
8349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTypeface = paint.mTypeface;
8359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = paint.mStrokeWidth;
8369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeMiter = paint.mStrokeMiter;
8379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = paint.mTextSize;
8389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = paint.mTextScaleX;
8399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = paint.mTextSkewX;
840abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = paint.mXfermode;
841abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = paint.mColorFilter;
842abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = paint.mShader;
843abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = paint.mPathEffect;
844abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = paint.mMaskFilter;
8459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void reset() {
8489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mFlags = Paint.DEFAULT_PAINT_FLAGS;
8499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mColor = 0;
8509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStyle = 0;
8519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mCap = 0;
8529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mJoin = 0;
8535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        mTextAlign = 0;
8549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTypeface = 0;
8559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeWidth = 1.f;
8569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mStrokeMiter = 2.f;
8579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSize = 20.f;
8589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextScaleX = 1.f;
8599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        mTextSkewX = 0.f;
860abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mXfermode = 0;
861abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mColorFilter = 0;
862abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mShader = 0;
863abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mPathEffect = 0;
864abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet        mMaskFilter = 0;
8659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    /**
8689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     * Update the {@link Font} object from the typeface, text size and scaling
8699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet     */
8709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private void updateFontObject() {
8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (mTypeface != 0) {
8729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // Get the fonts from the TypeFace object.
8739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            List<Font> fonts = Typeface_Delegate.getFonts(mTypeface);
8749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // create new font objects as well as FontMetrics, based on the current text size
8769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            // and skew info.
8779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size());
8789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            for (Font font : fonts) {
8799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                FontInfo info = new FontInfo();
8809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mFont = font.deriveFont(mTextSize);
8819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                if (mTextScaleX != 1.0 || mTextSkewX != 0) {
8829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    // TODO: support skew
8839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                    info.mFont = info.mFont.deriveFont(new AffineTransform(
8849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                            mTextScaleX, mTextSkewX, 0, 0, 1, 0));
8859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                }
8869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont);
8879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet                infoList.add(info);
8899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            }
8909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            mFonts = Collections.unmodifiableList(infoList);
8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
8949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
8955802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    /*package*/ float measureText(char[] text, int index, int count) {
8965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        if (mFonts.size() > 0) {
8975802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            FontInfo mainFont = mFonts.get(0);
8985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int i = index;
8995802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            int lastIndex = index + count;
9005802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            float total = 0f;
9015802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            while (i < lastIndex) {
9025802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // always start with the main font.
9035802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex);
9045802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (upTo == -1) {
9055802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // shortcut to exit
9065802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i);
9075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                } else if (upTo > 0) {
9085802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, upTo - i);
9095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i = upTo;
9105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // don't call continue at this point. Since it is certain the main font
9115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // cannot display the font a index upTo (now ==i), we move on to the
9125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // fallback fonts directly.
9135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
9145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // no char supported, attempt to read the next char(s) with the
9165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // fallback font. In this case we only test the first character
9175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // and then go back to test with the main font.
9185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // Special test for 2-char characters.
9195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                boolean foundFont = false;
9205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                for (int f = 1 ; f < mFonts.size() ; f++) {
9215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    FontInfo fontInfo = mFonts.get(f);
9225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // need to check that the font can display the character. We test
9245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    // differently if the char is a high surrogate.
9255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
9265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount);
9275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    if (upTo == -1) {
9285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        total += fontInfo.mMetrics.charsWidth(text, i, charCount);
9295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        i += charCount;
9305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        foundFont = true;
9315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                        break;
9325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    }
9345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
9355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                // in case no font can display the char, measure it with the main font.
9375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                if (foundFont == false) {
9385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    int size = Character.isHighSurrogate(text[i]) ? 2 : 1;
9395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    total += mainFont.mMetrics.charsWidth(text, i, size);
9405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                    i += size;
9415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet                }
9425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet            }
9435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        }
9445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet        return 0;
9465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet    }
9485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet
9499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) {
9509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        // get the delegate from the native int.
9519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
9529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (delegate == null) {
9539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            assert false;
9549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            return;
9559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
9569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet
9579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        if (flagValue) {
9589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags |= flagMask;
9599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        } else {
9609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet            delegate.mFlags &= ~flagMask;
9619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet        }
9629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet    }
9639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet}
964