blob: 370146d91e0c24a685df2c8cb61bcbfc20c13afa [file] [log] [blame]
/*
* 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 Ilya S. Okomin
* @version $Revision$
*/
package org.apache.harmony.awt.gl.font;
import java.awt.font.LineMetrics;
import org.apache.harmony.awt.internal.nls.Messages;
/**
*
* LineMetrics implementation class.
*/
public class LineMetricsImpl extends LineMetrics implements Cloneable{
// array of baseline offsets
float[] baselineOffsets;
// the number of characters to measure
int numChars;
// baseline index of the font corresponding to this line metrics
int baseLineIndex;
// underline thickness
float underlineThickness;
// underline offset
float underlineOffset;
// strikethrough thickness
float strikethroughThickness;
// strikethrough offset
float strikethroughOffset;
// External leading
float leading;
// Height of the font ( == (ascent+descent+leading))
float height;
// Ascent of the font
float ascent;
// Descent of the font
float descent;
// Width of the widest char in the font
float maxCharWidth;
// underline thickness (in pixels)
int lUnderlineThickness;
// underline offset (in pixels)
int lUnderlineOffset;
// strikethrough thickness (in pixels)
int lStrikethroughThickness;
// strikethrough offset (in pixels)
int lStrikethroughOffset;
// External leading (in pixels)
int lLeading;
// Height of the font ( == (ascent+descent+leading)) (in pixels)
int lHeight;
// Ascent of the font (in pixels)
int lAscent;
// Descent of the font (in pixels)
int lDescent;
// Width of the widest char in the font (in pixels)
int lMaxCharWidth;
// units per EM square in font value
int units_per_EM = 0;
/**
* Creates LineMetricsImpl object from specified parameters. If baseline data parameter
* is null than {0, (-ascent+descent)/2, -ascent} values are used for baseline offsets.
*
* @param len a number of characters
* @param metrics an array of 16 elements with metrics values that can be
* initialized in native code.<p>
* metrics[0] - ascent<p>
* metrics[1] - descent<p>
* metrics[2] - external leading<p>
* metrics[3] - underline thickness<p>
* -metrics[4] - underline offset<p>
* metrics[5] - strikethrough thickness<p>
* -metrics[6] - strikethrough offset<p>
* metrics[7] - maximum char width<p>
* metrics[8] - ascent in pixels<p>
* metrics[9] - descent in pixles<p>
* metrics[10] - external leading in pixels<p>
* metrics[11] - underline thickness in pixels<p>
* -metrics[12] - underline offset in pixels<p>
* metrics[13] - strikethrough thickness in pixels<p>
* -metrics[14] - strikethrough offset in pixels<p>
* metrics[15] - maximum char width in pixels<p>
* @param _baselineData an array of 3 elements with baseline offsets metrics<p>
* _baselineData[0] - roman baseline offset<p>
* _baselineData[1] - center baseline offset<p>
* _baselineData[2] - hanging baseline offset<p>
*/
public LineMetricsImpl(int len, float[] metrics, float[] _baselineData){
numChars = len;
ascent = metrics[0]; // Ascent of the font
descent = metrics[1]; // Descent of the font
leading = metrics[2]; // External leading
height = metrics[0] + metrics[1] + metrics[2]; // Height of the font ( == (ascent + descent + leading))
}
/**
* Creates LineMetricsImpl object from specified parameters. If baseline data parameter
* is null than {0, (-ascent+descent)/2, -ascent} values are used for baseline offsets.
*
* @param _numChars number of chars
* @param _baseLineIndex index of the baseline offset
* @param _baselineOffsets an array of baseline offsets
* @param _underlineThickness underline thickness
* @param _underlineOffset underline offset
* @param _strikethroughThickness strikethrough thickness
* @param _strikethroughOffset strinkethrough offset
* @param _leading leading of the font
* @param _height font height
* @param _ascent ascent of the font
* @param _descent descent of the font
* @param _maxCharWidth max char width
*/
public LineMetricsImpl(int _numChars, int _baseLineIndex,
float[] _baselineOffsets, float _underlineThickness,
float _underlineOffset, float _strikethroughThickness,
float _strikethroughOffset, float _leading, float _height,
float _ascent, float _descent, float _maxCharWidth) {
numChars = _numChars;
baseLineIndex = _baseLineIndex;
underlineThickness = _underlineThickness;
underlineOffset = _underlineOffset;
strikethroughThickness = _strikethroughThickness;
strikethroughOffset = _strikethroughOffset;
leading = _leading;
height = _height;
ascent = _ascent;
descent = _descent;
baselineOffsets = _baselineOffsets;
lUnderlineThickness = (int) underlineThickness;
lUnderlineOffset = (int) underlineOffset;
lStrikethroughThickness = (int) strikethroughThickness;
lStrikethroughOffset = (int) strikethroughOffset;
lLeading = (int) leading;
lHeight = (int) height;
lAscent = (int) ascent;
lDescent = (int) descent;
maxCharWidth = _maxCharWidth;
}
public LineMetricsImpl(){
}
/**
* All metrics are scaled according to scaleX and scaleY values.
* This function helps to recompute metrics according to the scale factors
* of desired AffineTransform.
*
* @param scaleX scale X factor
* @param scaleY scale Y factor
*/
public void scale(float scaleX, float scaleY){
float absScaleX = Math.abs(scaleX);
float absScaleY = Math.abs(scaleY);
underlineThickness *= absScaleY;
underlineOffset *= scaleY;
strikethroughThickness *= absScaleY;
strikethroughOffset *= scaleY;
leading *= absScaleY;
height *= absScaleY;
ascent *= absScaleY;
descent *= absScaleY;
if(baselineOffsets == null) {
getBaselineOffsets();
}
for (int i=0; i< baselineOffsets.length; i++){
baselineOffsets[i] *= scaleY;
}
lUnderlineThickness *= absScaleY;
lUnderlineOffset *= scaleY;
lStrikethroughThickness *= absScaleY;
lStrikethroughOffset *= scaleY;
lLeading *= absScaleY;
lHeight *= absScaleY;
lAscent *= absScaleY;
lDescent *= absScaleY;
maxCharWidth *= absScaleX;
}
/**
* Returns offset of the baseline.
*/
@Override
public float[] getBaselineOffsets() {
// XXX: at the moment there only horizontal metrics are taken into
// account. If there is no baseline information in TrueType font
// file default values used: {0, -ascent, (-ascent+descent)/2}
return baselineOffsets;
}
/**
* Returns a number of chars in specified text
*/
@Override
public int getNumChars() {
return numChars;
}
/**
* Returns index of the baseline, one of predefined constants.
*/
@Override
public int getBaselineIndex() {
// Baseline index is the deafult baseline index value
// taken from the TrueType table "BASE".
return baseLineIndex;
}
/**
* Returns thickness of the Underline.
*/
@Override
public float getUnderlineThickness() {
return underlineThickness;
}
/**
* Returns offset of the Underline.
*/
@Override
public float getUnderlineOffset() {
return underlineOffset;
}
/**
* Returns thickness of the Strikethrough line.
*/
@Override
public float getStrikethroughThickness() {
return strikethroughThickness;
}
/**
* Returns offset of the Strikethrough line.
*/
@Override
public float getStrikethroughOffset() {
return strikethroughOffset;
}
/**
* Returns the leading.
*/
@Override
public float getLeading() {
return leading;
}
/**
* Returns the height of the font.
*/
@Override
public float getHeight() {
//return height; // equals to (ascent + descent + leading);
return ascent + descent + leading;
}
/**
* Returns the descent.
*/
@Override
public float getDescent() {
return descent;
}
/**
* Returns the ascent.
*/
@Override
public float getAscent() {
return ascent;
}
/**
* Returns logical thickness of the Underline.
*/
public int getLogicalUnderlineThickness() {
return lUnderlineThickness;
}
/**
* Returns logical offset of the Underline.
*/
public int getLogicalUnderlineOffset() {
return lUnderlineOffset;
}
/**
* Returns logical thickness of the Strikethrough line.
*/
public int getLogicalStrikethroughThickness() {
return lStrikethroughThickness;
}
/**
* Returns logical offset of the Strikethrough line.
*/
public int getLogicalStrikethroughOffset() {
return lStrikethroughOffset;
}
/**
* Returns the logical leading.
*/
public int getLogicalLeading() {
return lLeading;
}
/**
* Returns the logical height of the font.
*/
public int getLogicalHeight() {
return lHeight; // equals to (ascent + descent + leading);
}
/**
* Returns the logical descent.
*/
public int getLogicalDescent() {
return lDescent;
}
/**
* Returns the logical ascent.
*/
public int getLogicalAscent() {
return lAscent;
}
/**
* Returns the logical size of the widest char.
*/
public int getLogicalMaxCharWidth() {
return lMaxCharWidth;
}
/**
* Returns the size of the widest char.
*/
public float getMaxCharWidth() {
return maxCharWidth;
}
/**
* Set num chars to the desired value.
*
* @param num specified number of chars
*/
public void setNumChars(int num){
numChars = num;
}
@Override
public Object clone(){
try{
return super.clone();
}catch (CloneNotSupportedException e){
return null;
}
}
}