Paint_Delegate.java revision 8da36314fd76ae6fe4549773ad00dc1883cb6bff
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 getTextAlign() { 1185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mTextAlign; 1195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public float getStrokeWidth() { 1225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mStrokeWidth; 1235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public float getStrokeMiter() { 1265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return mStrokeMiter; 1275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getJavaCap() { 1305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet switch (Paint.sCapArray[mCap]) { 1315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case BUTT: 1325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_BUTT; 1335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case ROUND: 1345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_ROUND; 1355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet default: 1365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case SQUARE: 1375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.CAP_SQUARE; 1385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 1415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet public int getJavaJoin() { 1425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet switch (Paint.sJoinArray[mJoin]) { 1435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet default: 1445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case MITER: 1455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_MITER; 1465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case ROUND: 1475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_ROUND; 1485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet case BEVEL: 1495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return BasicStroke.JOIN_BEVEL; 1505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 1529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 153251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public int getXfermode() { 154251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mXfermode; 155251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 156251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 157251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public int getColorFilter() { 158251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mColorFilter; 159251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 160251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 161251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public int getShader() { 162251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mShader; 163251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 164251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 165251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public int getPathEffect() { 166251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mPathEffect; 167251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 168251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 169251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public int getMaskFilter() { 170251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mMaskFilter; 171251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 172251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 1739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- native methods ---- 1749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int getFlags(Paint thisPaint) { 1769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 1779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 1789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 1799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 1809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 1819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 1829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mFlags; 1849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 1859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setFlags(Paint thisPaint, int flags) { 1879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 1889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 1899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 1909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 1919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 1929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 1939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags = flags; 1959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 1969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 1979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) { 1985802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter); 1999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) { 2029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa); 2039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) { 2069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText); 2079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) { 2109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText); 2119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) { 2149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText); 2159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) { 2189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText); 2199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setDither(Paint thisPaint, boolean dither) { 2229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.DITHER_FLAG, dither); 2239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) { 2269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText); 2279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int getColor(Paint thisPaint) { 2309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 2349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 2359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mColor; 2389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setColor(Paint thisPaint, int color) { 2419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 2459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 2469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mColor = color; 2499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int getAlpha(Paint thisPaint) { 2529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 2569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 2579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2599e27936e4ab227126e48c4d92a4352dad987e672Xavier Ducrohet return delegate.mColor >>> 24; 2609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setAlpha(Paint thisPaint, int a) { 2639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 2679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 2689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mColor = (a << 24) | (delegate.mColor & 0x00FFFFFF); 2719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getStrokeWidth(Paint thisPaint) { 2749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 2789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 2799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStrokeWidth; 2829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setStrokeWidth(Paint thisPaint, float width) { 2859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 2899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 2909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStrokeWidth = width; 2939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 2949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 2959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getStrokeMiter(Paint thisPaint) { 2969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 2979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 2989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 2999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStrokeMiter; 3049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) { 3079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStrokeMiter = miter; 3159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy, 3189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int color) { 3199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 3209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 3219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getTextSize(Paint thisPaint) { 3249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextSize; 3329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setTextSize(Paint thisPaint, float textSize) { 3359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mTextSize = textSize; 343b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 3449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getTextScaleX(Paint thisPaint) { 3479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextScaleX; 3559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) { 3589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mTextScaleX = scaleX; 366b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 3679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float getTextSkewX(Paint thisPaint) { 3709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 1.f; 3759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mTextSkewX; 3789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) { 3819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 3829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 3849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 3859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 3869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mTextSkewX = skewX; 389b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 3909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 3919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 3929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float ascent(Paint thisPaint) { 3938da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate 3948da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 3958da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 3968da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet assert false; 3978da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 3988da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 3999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4008da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate.mFonts.size() > 0) { 4018da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 4028da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // Android expects negative ascent so we invert the value from Java. 4038da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return - javaMetrics.getAscent(); 4048da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 4058da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 4068da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 4079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4098da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet /*package*/ static float descent(Paint thisPaint) { 4105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate 4115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 4135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet assert false; 4145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 4155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate.mFonts.size() > 0) { 4185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 4198da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return javaMetrics.getDescent(); 4205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 4238da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 4248da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 4258da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 4268da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) { 4278da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate 4288da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4298da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 4308da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet assert false; 4318da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 4328da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 4338da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 4348da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return delegate.getFontMetrics(metrics); 4355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 4375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) { 4389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate 4399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 4419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 4429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 4439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate.mFonts.size() > 0) { 4465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics; 4475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (fmi != null) { 4485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // Android expects negative ascent so we invert the value from Java. 4495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.top = - javaMetrics.getMaxAscent(); 4505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.ascent = - javaMetrics.getAscent(); 4515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.descent = javaMetrics.getDescent(); 4525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.bottom = javaMetrics.getMaxDescent(); 4535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet fmi.leading = javaMetrics.getLeading(); 4545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return javaMetrics.getHeight(); 4575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 4605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 4619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index, 4635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int count) { 4645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // WARNING: the logic in this method is similar to Canvas.drawText. 4655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // Any change to this method should be reflected in Canvas.drawText 4669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate 4685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 4695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 4705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet assert false; 4715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 4729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return delegate.measureText(text, index, count); 4759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) { 4789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return native_measureText(thisPaint, text.toCharArray(), start, end - start); 4799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_measureText(Paint thisPaint, String text) { 4829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return native_measureText(thisPaint, text.toCharArray(), 0, text.length()); 4839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count, 4869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet float maxWidth, float[] measuredWidth) { 4879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 4889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 4899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards, 4929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet float maxWidth, float[] measuredWidth) { 4939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 4949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 4959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 4969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 4989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_init() { 4999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate newDelegate = new Paint_Delegate(); 5009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return sManager.addDelegate(newDelegate); 5019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_initWithPaint(int paint) { 5049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(paint); 5069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 5099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate newDelegate = new Paint_Delegate(delegate); 5129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return sManager.addDelegate(newDelegate); 5139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_reset(int native_object) { 5169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 5189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.reset(); 5249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_set(int native_dst, int native_src) { 5279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate_dst = sManager.getDelegate(native_dst); 5299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate_dst == null) { 5309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate_src = sManager.getDelegate(native_src); 5369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate_src == null) { 5379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate_dst.set(delegate_src); 5429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getStyle(int native_object) { 5459f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 5479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 5509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5529f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mStyle; 5539f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5549f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5559f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setStyle(int native_object, int style) { 5569f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 5589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mStyle = style; 5649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5669f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getStrokeCap(int native_object) { 5679f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 5699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 5729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mCap; 5759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setStrokeCap(int native_object, int cap) { 5789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 5809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 5839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mCap = cap; 5869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getStrokeJoin(int native_object) { 5899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 5909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 5919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 5929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 5939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 5949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return delegate.mJoin; 5979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 5989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 5999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setStrokeJoin(int native_object, int join) { 6009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 6049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 6059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mJoin = join; 6089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) { 6119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 6129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 6139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setShader(int native_object, int shader) { 616abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 617abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 618abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 619abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet assert false; 620abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return shader; 621abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 622abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 623abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return delegate.mShader = shader; 6249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setColorFilter(int native_object, int filter) { 627abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 628abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 629abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 630abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet assert false; 631abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return filter; 632abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 633abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 634abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return delegate.mColorFilter = filter; 6359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setXfermode(int native_object, int xfermode) { 638abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 639abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 640abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 641abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet assert false; 642abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return xfermode; 643abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 644abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 645abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return delegate.mXfermode = xfermode; 6469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setPathEffect(int native_object, int effect) { 649abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 650abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 651abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 652abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet assert false; 653abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return effect; 654abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 655abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 656abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return delegate.mPathEffect = effect; 6579f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) { 660abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet // get the delegate from the native int. 661abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 662abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet if (delegate == null) { 663abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet assert false; 664abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return maskfilter; 665abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet } 666abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet 667abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet return delegate.mMaskFilter = maskfilter; 6689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setTypeface(int native_object, int typeface) { 6719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6739f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6749f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 6759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 6769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 678b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.mTypeface = typeface; 679b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet delegate.updateFontObject(); 680b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet return delegate.mTypeface; 6819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_setRasterizer(int native_object, int rasterizer) { 6849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 6859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 6869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextAlign(int native_object) { 6899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 6909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 6919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 6929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 6939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return 0; 6949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6965802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return delegate.mTextAlign; 6979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 6989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 6999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_setTextAlign(int native_object, int align) { 7009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 7019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 7039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 7049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 7059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7075802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet delegate.mTextAlign = align; 7089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) { 7118da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // get the delegate from the native int. 7128da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_paint); 7138da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (delegate == null) { 7148da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet assert false; 7158da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0.f; 7168da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 7178da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 7188da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return delegate.getFontMetrics(metrics); 7199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextWidths(int native_object, char[] text, int index, 7229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int count, float[] widths) { 7239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 7249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 7259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextWidths(int native_object, String text, int start, 7289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int end, float[] widths) { 7299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 7309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 7319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_getTextRunAdvances(int native_object, 7349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet char[] text, int index, int count, int contextIndex, int contextCount, 7359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int flags, float[] advances, int advancesIndex) { 7365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // get the delegate from the native int. 7375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(native_object); 7385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate == null) { 7395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet assert false; 7405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0.f; 7415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (delegate.mFonts.size() > 0) { 744251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // FIXME: handle multi-char characters (see measureText) 7455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet float totalAdvance = 0; 7465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet for (int i = 0; i < count; i++) { 7475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet char c = text[i + index]; 7485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet boolean found = false; 7495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet for (FontInfo info : delegate.mFonts) { 7505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (info.mFont.canDisplay(c)) { 7515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet float adv = info.mMetrics.charWidth(c); 7525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet totalAdvance += adv; 7535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (advances != null) { 7545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet advances[i] = adv; 7555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet found = true; 7585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet break; 7595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7605802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7625802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (found == false) { 7635802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // no advance for this char. 7645802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (advances != null) { 7655802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet advances[i] = 0.f; 7665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7675802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7685802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7695802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7705802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return totalAdvance; 7715802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 7725802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7735802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 7745802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7759f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7769f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7779f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static float native_getTextRunAdvances(int native_object, 7789f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet String text, int start, int end, int contextStart, int contextEnd, 7799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int flags, float[] advances, int advancesIndex) { 7805802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // FIXME: support contextStart, contextEnd and direction flag 7815802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int count = end - start; 7825802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet char[] buffer = TemporaryBuffer.obtain(count); 7835802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet TextUtils.getChars(text, start, end, buffer, 0); 7845802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 7855802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart, 7865802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet contextEnd - contextStart, flags, advances, advancesIndex); 7879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text, 7909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int contextStart, int contextLength, int flags, int offset, int cursorOpt) { 7919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 7929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 7939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 7949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 7959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text, 7969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int contextStart, int contextEnd, int flags, int offset, int cursorOpt) { 7979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 7989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 7999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_getTextPath(int native_object, int bidiFlags, 8029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet char[] text, int index, int count, float x, float y, int path) { 8039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 8049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 8059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void native_getTextPath(int native_object, int bidiFlags, 8089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet String text, int start, int end, float x, float y, int path) { 8099f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 8109f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 8119f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8129f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8139f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start, 8149f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int end, Rect bounds) { 8159f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 8169f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 8179f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8189f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8199f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index, 8209f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet int count, Rect bounds) { 8219f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // FIXME 8229f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet throw new UnsupportedOperationException(); 8239f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8249f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8259f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /*package*/ static void finalizer(int nativePaint) { 8269f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet sManager.removeDelegate(nativePaint); 8279f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8289f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8299f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // ---- Private delegate/helper methods ---- 8309f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8319f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private Paint_Delegate() { 8329f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet reset(); 8339f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8349f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8359f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private Paint_Delegate(Paint_Delegate paint) { 8369f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet set(paint); 8379f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8389f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8399f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void set(Paint_Delegate paint) { 8409f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFlags = paint.mFlags; 8419f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mColor = paint.mColor; 8429f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStyle = paint.mStyle; 8439f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mCap = paint.mCap; 8449f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mJoin = paint.mJoin; 8455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet mTextAlign = paint.mTextAlign; 8469f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTypeface = paint.mTypeface; 8479f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeWidth = paint.mStrokeWidth; 8489f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeMiter = paint.mStrokeMiter; 8499f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSize = paint.mTextSize; 8509f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX = paint.mTextScaleX; 8519f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSkewX = paint.mTextSkewX; 852abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mXfermode = paint.mXfermode; 853abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mColorFilter = paint.mColorFilter; 854abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mShader = paint.mShader; 855abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mPathEffect = paint.mPathEffect; 856abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mMaskFilter = paint.mMaskFilter; 857b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet updateFontObject(); 8589f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8599f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8609f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void reset() { 8619f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFlags = Paint.DEFAULT_PAINT_FLAGS; 8629f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mColor = 0; 8639f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStyle = 0; 8649f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mCap = 0; 8659f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mJoin = 0; 8665802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet mTextAlign = 0; 867b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet mTypeface = Typeface.sDefaults[0].native_instance; 8689f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeWidth = 1.f; 8699f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mStrokeMiter = 2.f; 8709f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSize = 20.f; 8719f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX = 1.f; 8729f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextSkewX = 0.f; 873abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mXfermode = 0; 874abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mColorFilter = 0; 875abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mShader = 0; 876abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mPathEffect = 0; 877abff653ce84e5079f35afab008c906063b0b2b6cXavier Ducrohet mMaskFilter = 0; 878b5ddf041d61f9346a4055b5bc5d51bd812b2ec28Xavier Ducrohet updateFontObject(); 8799f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 8809f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8819f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet /** 8829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet * Update the {@link Font} object from the typeface, text size and scaling 8839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet */ 8849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private void updateFontObject() { 8859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (mTypeface != 0) { 8869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // Get the fonts from the TypeFace object. 8879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet List<Font> fonts = Typeface_Delegate.getFonts(mTypeface); 8889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 8899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // create new font objects as well as FontMetrics, based on the current text size 8909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // and skew info. 8919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size()); 8929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet for (Font font : fonts) { 8939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet FontInfo info = new FontInfo(); 8949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mFont = font.deriveFont(mTextSize); 8959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (mTextScaleX != 1.0 || mTextSkewX != 0) { 8969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // TODO: support skew 8979f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mFont = info.mFont.deriveFont(new AffineTransform( 8989f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mTextScaleX, mTextSkewX, 0, 0, 1, 0)); 8999f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9009f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont); 9019f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9029f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet infoList.add(info); 9039f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9049f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9059f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet mFonts = Collections.unmodifiableList(infoList); 9069f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9079f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9089f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9095802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet /*package*/ float measureText(char[] text, int index, int count) { 9105802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (mFonts.size() > 0) { 9115802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet FontInfo mainFont = mFonts.get(0); 9125802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int i = index; 9135802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int lastIndex = index + count; 9145802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet float total = 0f; 9155802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet while (i < lastIndex) { 9165802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // always start with the main font. 9175802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex); 9185802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (upTo == -1) { 9195802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // shortcut to exit 9205802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i); 9215802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } else if (upTo > 0) { 9225802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet total += mainFont.mMetrics.charsWidth(text, i, upTo - i); 9235802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet i = upTo; 9245802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // don't call continue at this point. Since it is certain the main font 9255802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // cannot display the font a index upTo (now ==i), we move on to the 9265802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // fallback fonts directly. 9275802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9285802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9295802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // no char supported, attempt to read the next char(s) with the 9305802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // fallback font. In this case we only test the first character 9315802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // and then go back to test with the main font. 9325802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // Special test for 2-char characters. 9335802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet boolean foundFont = false; 9345802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet for (int f = 1 ; f < mFonts.size() ; f++) { 9355802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet FontInfo fontInfo = mFonts.get(f); 9365802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9375802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // need to check that the font can display the character. We test 9385802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // differently if the char is a high surrogate. 9395802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1; 9405802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount); 9415802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (upTo == -1) { 9425802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet total += fontInfo.mMetrics.charsWidth(text, i, charCount); 9435802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet i += charCount; 9445802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet foundFont = true; 9455802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet break; 9465802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9475802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9485802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9495802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9505802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet // in case no font can display the char, measure it with the main font. 9515802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet if (foundFont == false) { 9525802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet int size = Character.isHighSurrogate(text[i]) ? 2 : 1; 9535802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet total += mainFont.mMetrics.charsWidth(text, i, size); 9545802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet i += size; 9555802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9565802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9575802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9585802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9595802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet return 0; 9608da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 9615802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9628da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet private float getFontMetrics(FontMetrics metrics) { 9638da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (mFonts.size() > 0) { 9648da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics; 9658da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet if (metrics != null) { 9668da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet // Android expects negative ascent so we invert the value from Java. 9678da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.top = - javaMetrics.getMaxAscent(); 9688da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.ascent = - javaMetrics.getAscent(); 9698da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.descent = javaMetrics.getDescent(); 9708da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.bottom = javaMetrics.getMaxDescent(); 9718da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet metrics.leading = javaMetrics.getLeading(); 9728da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 9738da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 9748da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return javaMetrics.getHeight(); 9758da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet } 9768da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 9778da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet return 0; 9785802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet } 9795802deabf06a0754c36e990ce2af7b5c8727e543Xavier Ducrohet 9808da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 9818da36314fd76ae6fe4549773ad00dc1883cb6bffXavier Ducrohet 9829f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) { 9839f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet // get the delegate from the native int. 9849f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); 9859f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (delegate == null) { 9869f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet assert false; 9879f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet return; 9889f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9899f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet 9909f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet if (flagValue) { 9919f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags |= flagMask; 9929f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } else { 9939f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet delegate.mFlags &= ~flagMask; 9949f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9959f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet } 9969f63ff263b0a97f0fa63e97136c18f6abccbfc68Xavier Ducrohet} 997