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