/*
* 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;
}
}
|