blob: 8d8a9515df74d7e78a3a20949510d50badfc4199 [file] [log] [blame]
/*
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.awt.windows;
import java.awt.*;
import java.util.Hashtable;
/**
* A font metrics object for a WServer font.
*
* @author Jim Graham
*/
@SuppressWarnings("serial") // JDK-implementation class
final class WFontMetrics extends FontMetrics {
static {
initIDs();
}
/**
* The widths of the first 256 characters.
*/
int widths[];
/**
* The standard ascent of the font. This is the logical height
* above the baseline for the Alphanumeric characters and should
* be used for determining line spacing. Note, however, that some
* characters in the font may extend above this height.
*/
int ascent;
/**
* The standard descent of the font. This is the logical height
* below the baseline for the Alphanumeric characters and should
* be used for determining line spacing. Note, however, that some
* characters in the font may extend below this height.
*/
int descent;
/**
* The standard leading for the font. This is the logical amount
* of space to be reserved between the descent of one line of text
* and the ascent of the next line. The height metric is calculated
* to include this extra space.
*/
int leading;
/**
* The standard height of a line of text in this font. This is
* the distance between the baseline of adjacent lines of text.
* It is the sum of the ascent+descent+leading. There is no
* guarantee that lines of text spaced at this distance will be
* disjoint; such lines may overlap if some characters overshoot
* the standard ascent and descent metrics.
*/
int height;
/**
* The maximum ascent for all characters in this font. No character
* will extend further above the baseline than this metric.
*/
int maxAscent;
/**
* The maximum descent for all characters in this font. No character
* will descend further below the baseline than this metric.
*/
int maxDescent;
/**
* The maximum possible height of a line of text in this font.
* Adjacent lines of text spaced this distance apart will be
* guaranteed not to overlap. Note, however, that many paragraphs
* that contain ordinary alphanumeric text may look too widely
* spaced if this metric is used to determine line spacing. The
* height field should be preferred unless the text in a given
* line contains particularly tall characters.
*/
int maxHeight;
/**
* The maximum advance width of any character in this font.
*/
int maxAdvance;
/**
* Calculate the metrics from the given WServer and font.
*/
public WFontMetrics(Font font) {
super(font);
init();
}
/**
* Get leading
*/
@Override
public int getLeading() {
return leading;
}
/**
* Get ascent.
*/
@Override
public int getAscent() {
return ascent;
}
/**
* Get descent
*/
@Override
public int getDescent() {
return descent;
}
/**
* Get height
*/
@Override
public int getHeight() {
return height;
}
/**
* Get maxAscent
*/
@Override
public int getMaxAscent() {
return maxAscent;
}
/**
* Get maxDescent
*/
@Override
public int getMaxDescent() {
return maxDescent;
}
/**
* Get maxAdvance
*/
@Override
public int getMaxAdvance() {
return maxAdvance;
}
/**
* Return the width of the specified string in this Font.
*/
@Override
public native int stringWidth(String str);
/**
* Return the width of the specified char[] in this Font.
*/
@Override
public native int charsWidth(char data[], int off, int len);
/**
* Return the width of the specified byte[] in this Font.
*/
@Override
public native int bytesWidth(byte data[], int off, int len);
/**
* Get the widths of the first 256 characters in the font.
*/
@Override
public int[] getWidths() {
return widths;
}
native void init();
static Hashtable<Font, FontMetrics> table = new Hashtable<>();
static FontMetrics getFontMetrics(Font font) {
FontMetrics fm = table.get(font);
if (fm == null) {
table.put(font, fm = new WFontMetrics(font));
}
return fm;
}
/**
* Initialize JNI field and method IDs
*/
private static native void initIDs();
}