19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this work for additional information regarding copyright ownership. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the "License"); you may not use this file except in compliance with 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Ilya S. Okomin 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$ 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage org.apache.harmony.awt.gl.font; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.font.FontRenderContext; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.font.LineMetricsImpl; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Linux implementation of LineMetrics class 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AndroidLineMetrics extends LineMetricsImpl { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AndroidLineMetrics( AndroidFont fnt, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FontRenderContext frc, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str){ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numChars = str.length(); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project baseLineIndex = 0; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ascent = fnt.ascent; // Ascent of the font 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descent = -fnt.descent; // Descent of the font 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leading = fnt.leading; // External leading 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = ascent + descent + leading; // Height of the font ( == (ascent + descent + leading)) 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project underlineThickness = 0.0f; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project underlineOffset = 0.0f; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strikethroughThickness = 0.0f; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strikethroughOffset = 0.0f; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxCharWidth = 0.0f; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Find out pixel metrics 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * positive metrics rounded to the smallest int that is bigger than value 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * negative metrics rounded to the smallest int that is lesser than value 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * thicknesses rounded to int ((int)round(value + 0.5)) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lAscent = (int)Math.ceil(fnt.ascent);// // Ascent of the font 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lDescent = -(int)Math.ceil(fnt.descent);// Descent of the font 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lLeading = (int)Math.ceil(leading); // External leading 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lHeight = lAscent + lDescent + lLeading; // Height of the font ( == (ascent + descent + leading)) 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lUnderlineThickness = Math.round(underlineThickness);//(int)metrics[11]; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (underlineOffset >= 0){ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lUnderlineOffset = (int)Math.ceil(underlineOffset); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lUnderlineOffset = (int)Math.floor(underlineOffset); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStrikethroughThickness = Math.round(strikethroughThickness); //(int)metrics[13]; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strikethroughOffset >= 0){ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStrikethroughOffset = (int)Math.ceil(strikethroughOffset); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStrikethroughOffset = (int)Math.floor(strikethroughOffset); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lMaxCharWidth = (int)Math.ceil(maxCharWidth); //(int)metrics[15]; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project units_per_EM = 0; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float[] getBaselineOffsets() { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: implement baseline offsets for TrueType fonts 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (baselineOffsets == null){ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] baselineData = null; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Temporary workaround: 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Commented out native data initialization, since it can 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cause failures with opening files in multithreaded applications. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: support work with truetype data in multithreaded 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // applications. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If font TrueType data is taken from BASE table 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// if ((this.font.getFontHandle() != 0) && (font.getFontType() == FontManager.FONT_TYPE_TT)){ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// baselineData = LinuxNativeFont.getBaselineOffsetsNative(font.getFontHandle(), font.getSize(), ascent, descent, units_per_EM); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project baseLineIndex = 0; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project baselineOffsets = new float[]{0, (-ascent+descent)/2, -ascent}; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return baselineOffsets; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getBaselineIndex() { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (baselineOffsets == null){ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get offsets and set correct index 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getBaselineOffsets(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return baseLineIndex; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 121