/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Oleg V. Khaschansky * @version $Revision$ * */ package org.apache.harmony.awt.gl.font; import java.awt.font.LineMetrics; import java.awt.font.GraphicAttribute; import java.awt.*; /** * Date: May 14, 2005 * Time: 7:44:13 PM * * This class incapsulates text metrics specific for the text layout or * for the separate text segment. Text segment is a text run with the constant direction * and attributes like font, decorations, etc. BasicMetrics is also used to store * calculated text metrics like advance, ascent or descent. this class is very similar to * LineMetrics, but provides some additional info, constructors and is more transparent. */ public class BasicMetrics { int baseLineIndex; float ascent; // Ascent of the font float descent; // Descent of the font float leading; // External leading float advance; float italicAngle; float superScriptOffset; float underlineOffset; float underlineThickness; float strikethroughOffset; float strikethroughThickness; /** * Constructs BasicMetrics from LineMetrics and font * @param lm * @param font */ BasicMetrics(LineMetrics lm, Font font) { ascent = lm.getAscent(); descent = lm.getDescent(); leading = lm.getLeading(); underlineOffset = lm.getUnderlineOffset(); underlineThickness = lm.getUnderlineThickness(); strikethroughOffset = lm.getStrikethroughOffset(); strikethroughThickness = lm.getStrikethroughThickness(); baseLineIndex = lm.getBaselineIndex(); italicAngle = font.getItalicAngle(); superScriptOffset = (float) font.getTransform().getTranslateY(); } /** * Constructs BasicMetrics from GraphicAttribute. * It gets ascent and descent from the graphic attribute and * computes reasonable defaults for other metrics. * @param ga - graphic attribute */ BasicMetrics(GraphicAttribute ga) { ascent = ga.getAscent(); descent = ga.getDescent(); leading = 2; baseLineIndex = ga.getAlignment(); italicAngle = 0; superScriptOffset = 0; underlineOffset = Math.max(descent/2, 1); // Just suggested, should be cap_stem_width or something like that underlineThickness = Math.max(ascent/13, 1); strikethroughOffset = -ascent/2; // Something like middle of the line strikethroughThickness = underlineThickness; } /** * Copies metrics from the TextMetricsCalculator object. * @param tmc - TextMetricsCalculator object */ BasicMetrics(TextMetricsCalculator tmc) { ascent = tmc.ascent; descent = tmc.descent; leading = tmc.leading; advance = tmc.advance; baseLineIndex = tmc.baselineIndex; } public float getAscent() { return ascent; } public float getDescent() { return descent; } public float getLeading() { return leading; } public float getAdvance() { return advance; } public int getBaseLineIndex() { return baseLineIndex; } }