| /* ClasspathFontPeer.java -- Font peer used by GNU Classpath. | |
| Copyright (C) 2003, 2004 Free Software Foundation, Inc. | |
| This file is part of GNU Classpath. | |
| GNU Classpath is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 2, or (at your option) | |
| any later version. | |
| GNU Classpath 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 for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with GNU Classpath; see the file COPYING. If not, write to the | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| 02110-1301 USA. | |
| Linking this library statically or dynamically with other modules is | |
| making a combined work based on this library. Thus, the terms and | |
| conditions of the GNU General Public License cover the whole | |
| combination. | |
| As a special exception, the copyright holders of this library give you | |
| permission to link this library with independent modules to produce an | |
| executable, regardless of the license terms of these independent | |
| modules, and to copy and distribute the resulting executable under | |
| terms of your choice, provided that you also meet, for each linked | |
| independent module, the terms and conditions of the license of that | |
| module. An independent module is a module which is not derived from | |
| or based on this library. If you modify this library, you may extend | |
| this exception to your version of the library, but you are not | |
| obligated to do so. If you do not wish to do so, delete this | |
| exception statement from your version. */ | |
| package gnu.java.awt.peer; | |
| import gnu.java.awt.ClasspathToolkit; | |
| import java.awt.Font; | |
| import java.awt.FontMetrics; | |
| import java.awt.Toolkit; | |
| import java.awt.font.FontRenderContext; | |
| import java.awt.font.GlyphVector; | |
| import java.awt.font.LineMetrics; | |
| import java.awt.font.TextAttribute; | |
| import java.awt.font.TransformAttribute; | |
| import java.awt.geom.AffineTransform; | |
| import java.awt.geom.Rectangle2D; | |
| import java.awt.peer.FontPeer; | |
| import java.text.AttributedCharacterIterator; | |
| import java.text.CharacterIterator; | |
| import java.util.HashMap; | |
| import java.util.LinkedHashMap; | |
| import java.util.Locale; | |
| import java.util.Map; | |
| /** | |
| * A peer for fonts that are used inside Classpath. The purpose of | |
| * this interface is to abstract from platform-specific font handling | |
| * in the Classpath implementation of java.awt.Font and related | |
| * classes. | |
| * | |
| * <p><b>State kept by the peer:</b> a peer is generated for each Font | |
| * object in the default implementation. If you wish to share peers between | |
| * fonts, you will need to subclass both ClasspathFontPeer and | |
| * {@link ClasspathToolKit}.</p> | |
| * | |
| * <p><b>Thread Safety:</b> Methods of this interface may be called | |
| * from arbitrary threads at any time. Implementations of the | |
| * <code>ClasspathFontPeer</code> interface are required to perform | |
| * the necessary synchronization.</p> | |
| * | |
| * @see java.awt.Font#getPeer | |
| * @see java.awt.Toolkit#getFontPeer | |
| * | |
| * @author Sascha Brawer (brawer@dandelis.ch) | |
| * @author Graydon Hoare (graydon@redhat.com) | |
| */ | |
| public abstract class ClasspathFontPeer | |
| implements FontPeer | |
| { | |
| /*************************************************************************/ | |
| /* | |
| * Instance Variables | |
| */ | |
| /** | |
| * The 3 names of this font. all fonts have 3 names, some of which | |
| * may be equal: | |
| * | |
| * logical -- name the font was constructed from | |
| * family -- a designer or brand name (Helvetica) | |
| * face -- specific instance of a design (Helvetica Regular) | |
| * | |
| * @see isLogicalFontName | |
| */ | |
| protected String logicalName; | |
| protected String familyName; | |
| protected String faceName; | |
| /** | |
| * The font style, which is a combination (by OR-ing) of the font style | |
| * constants PLAIN, BOLD and ITALIC, in this class. | |
| */ | |
| protected int style; | |
| /** | |
| * The font point size. A point is 1/72 of an inch. | |
| */ | |
| protected float size; | |
| /** | |
| * The affine transformation the font is currently subject to. | |
| */ | |
| protected AffineTransform transform; | |
| static class LRUCache<K,V> extends LinkedHashMap<K,V> | |
| { | |
| int max_entries; | |
| public LRUCache(int max) | |
| { | |
| super(max, 0.75f, true); | |
| max_entries = max; | |
| } | |
| protected boolean removeEldestEntry(Map.Entry eldest) | |
| { | |
| return size() > max_entries; | |
| } | |
| } | |
| private static LRUCache<AffineTransform,TransformAttribute> transCache = | |
| new LRUCache<AffineTransform,TransformAttribute>(50); | |
| protected static ClasspathToolkit tk() | |
| { | |
| return (ClasspathToolkit)(Toolkit.getDefaultToolkit ()); | |
| } | |
| /* | |
| * Confusingly, a Logical Font is a concept unrelated to | |
| * a Font's Logical Name. | |
| * | |
| * A Logical Font is one of 6 built-in, abstract font types | |
| * which must be supported by any java environment: SansSerif, | |
| * Serif, Monospaced, Dialog, and DialogInput. | |
| * | |
| * A Font's Logical Name is the name the font was constructed | |
| * from. This might be the name of a Logical Font, or it might | |
| * be the name of a Font Face. | |
| */ | |
| protected static boolean isLogicalFontName(String name) | |
| { | |
| String uname = name.toUpperCase (); | |
| return (uname.equals ("SANSSERIF") || | |
| uname.equals ("SERIF") || | |
| uname.equals ("MONOSPACED") || | |
| uname.equals ("DIALOG") || | |
| uname.equals ("DIALOGINPUT") || | |
| uname.equals ("DEFAULT")); | |
| } | |
| protected static String logicalFontNameToFaceName (String name) | |
| { | |
| String uname = name.toUpperCase (); | |
| if (uname.equals("SANSSERIF")) | |
| return "Helvetica"; | |
| else if (uname.equals ("SERIF")) | |
| return "Times"; | |
| else if (uname.equals ("MONOSPACED")) | |
| return "Courier"; | |
| else if (uname.equals ("DIALOG")) | |
| return "Helvetica"; | |
| else if (uname.equals ("DIALOGINPUT")) | |
| return "Helvetica"; | |
| else if (uname.equals ("DEFAULT")) | |
| return "Dialog.plain"; | |
| else | |
| return "Helvetica"; | |
| } | |
| protected static String faceNameToFamilyName (String name) | |
| { | |
| return name; | |
| } | |
| public static void copyStyleToAttrs (int style, Map attrs) | |
| { | |
| if ((style & Font.BOLD) == Font.BOLD) | |
| attrs.put (TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); | |
| else | |
| attrs.put (TextAttribute.WEIGHT, TextAttribute.WEIGHT_REGULAR); | |
| if ((style & Font.ITALIC) == Font.ITALIC) | |
| attrs.put (TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); | |
| else | |
| attrs.put (TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR); | |
| } | |
| protected static void copyFamilyToAttrs (String fam, Map attrs) | |
| { | |
| if (fam != null) | |
| attrs.put (TextAttribute.FAMILY, fam); | |
| } | |
| public static void copySizeToAttrs (float size, Map attrs) | |
| { | |
| attrs.put (TextAttribute.SIZE, new Float (size)); | |
| } | |
| protected static void copyTransformToAttrs (AffineTransform trans, Map attrs) | |
| { | |
| if (trans != null) | |
| { | |
| TransformAttribute ta; | |
| synchronized(transCache) | |
| { | |
| ta = transCache.get(trans); | |
| if (ta == null) | |
| { | |
| ta = new TransformAttribute(trans); | |
| transCache.put(trans, ta); | |
| } | |
| } | |
| attrs.put(TextAttribute.TRANSFORM, ta); | |
| } | |
| } | |
| protected void setStandardAttributes (String name, String family, int style, | |
| float size, AffineTransform trans) | |
| { | |
| this.logicalName = name; | |
| if (isLogicalFontName (name)) | |
| this.faceName = logicalFontNameToFaceName (name); | |
| else | |
| this.faceName = name; | |
| if (family != null) | |
| this.familyName = family; | |
| else | |
| this.familyName = faceNameToFamilyName (faceName); | |
| this.style = style; | |
| this.size = size; | |
| this.transform = trans; | |
| } | |
| protected void setStandardAttributes (String name, Map attribs) | |
| { | |
| String family = this.familyName; | |
| AffineTransform trans = this.transform; | |
| float size = this.size; | |
| int style = this.style; | |
| if (attribs.containsKey (TextAttribute.FAMILY)) | |
| family = (String) attribs.get (TextAttribute.FAMILY); | |
| if (name == null) | |
| name = "Default"; | |
| if (attribs.containsKey (TextAttribute.WEIGHT)) | |
| { | |
| Float weight = (Float) attribs.get (TextAttribute.WEIGHT); | |
| if (weight.floatValue () >= TextAttribute.WEIGHT_BOLD.floatValue ()) | |
| style += Font.BOLD; | |
| } | |
| if (attribs.containsKey (TextAttribute.POSTURE)) | |
| { | |
| Float posture = (Float) attribs.get (TextAttribute.POSTURE); | |
| if (posture.floatValue () >= TextAttribute.POSTURE_OBLIQUE.floatValue ()) | |
| style += Font.ITALIC; | |
| } | |
| if (attribs.containsKey (TextAttribute.SIZE)) | |
| { | |
| Float sz = (Float) attribs.get (TextAttribute.SIZE); | |
| size = sz.floatValue (); | |
| // Pango doesn't accept 0 as a font size. | |
| if (size < 1) | |
| size = 1; | |
| } | |
| else | |
| size = 12; | |
| if (attribs.containsKey (TextAttribute.TRANSFORM)) | |
| { | |
| TransformAttribute ta = (TransformAttribute) | |
| attribs.get(TextAttribute.TRANSFORM); | |
| trans = ta.getTransform (); | |
| } | |
| setStandardAttributes (name, family, style, size, trans); | |
| } | |
| protected void getStandardAttributes (Map attrs) | |
| { | |
| copyFamilyToAttrs (this.familyName, attrs); | |
| copySizeToAttrs (this.size, attrs); | |
| copyStyleToAttrs (this.style, attrs); | |
| copyTransformToAttrs (this.transform, attrs); | |
| } | |
| /* Begin public API */ | |
| public ClasspathFontPeer (String name, Map attrs) | |
| { | |
| setStandardAttributes (name, attrs); | |
| } | |
| public ClasspathFontPeer (String name, int style, int size) | |
| { | |
| setStandardAttributes (name, (String)null, style, | |
| (float)size, (AffineTransform)null); | |
| } | |
| /** | |
| * Implementation of {@link Font#getName} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public String getName (Font font) | |
| { | |
| return logicalName; | |
| } | |
| /** | |
| * Implementation of {@link Font#getFamily()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public String getFamily (Font font) | |
| { | |
| return familyName; | |
| } | |
| /** | |
| * Implementation of {@link Font#getFamily(Locale)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public String getFamily (Font font, Locale lc) | |
| { | |
| return familyName; | |
| } | |
| /** | |
| * Implementation of {@link Font#getFontName()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public String getFontName (Font font) | |
| { | |
| return faceName; | |
| } | |
| /** | |
| * Implementation of {@link Font#getFontName(Locale)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public String getFontName (Font font, Locale lc) | |
| { | |
| return faceName; | |
| } | |
| /** | |
| * Implementation of {@link Font#getSize} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public float getSize (Font font) | |
| { | |
| return size; | |
| } | |
| /** | |
| * Implementation of {@link Font#isPlain} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public boolean isPlain (Font font) | |
| { | |
| return style == Font.PLAIN; | |
| } | |
| /** | |
| * Implementation of {@link Font#isBold} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public boolean isBold (Font font) | |
| { | |
| return ((style & Font.BOLD) == Font.BOLD); | |
| } | |
| /** | |
| * Implementation of {@link Font#isItalic} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public boolean isItalic (Font font) | |
| { | |
| return ((style & Font.ITALIC) == Font.ITALIC); | |
| } | |
| /** | |
| * Implementation of {@link Font#deriveFont(int, float)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Font deriveFont (Font font, int style, float size) | |
| { | |
| Map attrs = new HashMap (); | |
| getStandardAttributes (attrs); | |
| copyStyleToAttrs (style, attrs); | |
| copySizeToAttrs (size, attrs); | |
| return tk().getFont (logicalName, attrs); | |
| } | |
| /** | |
| * Implementation of {@link Font#deriveFont(float)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Font deriveFont (Font font, float size) | |
| { | |
| Map attrs = new HashMap (); | |
| getStandardAttributes (attrs); | |
| copySizeToAttrs (size, attrs); | |
| return tk().getFont (logicalName, attrs); | |
| } | |
| /** | |
| * Implementation of {@link Font#deriveFont(int)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Font deriveFont (Font font, int style) | |
| { | |
| Map attrs = new HashMap (); | |
| getStandardAttributes (attrs); | |
| copyStyleToAttrs (style, attrs); | |
| return tk().getFont (logicalName, attrs); | |
| } | |
| /** | |
| * Implementation of {@link Font#deriveFont(int, AffineTransform)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Font deriveFont (Font font, int style, AffineTransform t) | |
| { | |
| Map attrs = new HashMap (); | |
| getStandardAttributes (attrs); | |
| copyStyleToAttrs (style, attrs); | |
| copyTransformToAttrs (t, attrs); | |
| return tk().getFont (logicalName, attrs); | |
| } | |
| /** | |
| * Implementation of {@link Font#deriveFont(AffineTransform)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Font deriveFont (Font font, AffineTransform t) | |
| { | |
| Map attrs = new HashMap (); | |
| getStandardAttributes (attrs); | |
| copyTransformToAttrs (t, attrs); | |
| return tk().getFont (logicalName, attrs); | |
| } | |
| /** | |
| * Implementation of {@link Font#deriveFont(Map)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Font deriveFont (Font font, Map attrs) | |
| { | |
| return tk().getFont (logicalName, attrs); | |
| } | |
| /** | |
| * Implementation of {@link Font#getAttributes()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public Map getAttributes (Font font) | |
| { | |
| HashMap h = new HashMap (); | |
| getStandardAttributes (h); | |
| return h; | |
| } | |
| /** | |
| * Implementation of {@link Font#getAvailableAttributes()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public AttributedCharacterIterator.Attribute[] getAvailableAttributes(Font font) | |
| { | |
| AttributedCharacterIterator.Attribute a[] = | |
| new AttributedCharacterIterator.Attribute[5]; | |
| a[0] = TextAttribute.FAMILY; | |
| a[1] = TextAttribute.SIZE; | |
| a[2] = TextAttribute.POSTURE; | |
| a[3] = TextAttribute.WEIGHT; | |
| a[4] = TextAttribute.TRANSFORM; | |
| return a; | |
| } | |
| /** | |
| * Implementation of {@link Font#getTransform()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public AffineTransform getTransform (Font font) | |
| { | |
| if (transform == null) | |
| transform = new AffineTransform (); | |
| return transform; | |
| } | |
| /** | |
| * Implementation of {@link Font#isTransformed()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public boolean isTransformed (Font font) | |
| { | |
| return ! transform.isIdentity (); | |
| } | |
| /** | |
| * Implementation of {@link Font#getItalicAngle()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public float getItalicAngle (Font font) | |
| { | |
| if ((style & Font.ITALIC) == Font.ITALIC) | |
| return TextAttribute.POSTURE_OBLIQUE.floatValue (); | |
| else | |
| return TextAttribute.POSTURE_REGULAR.floatValue (); | |
| } | |
| /** | |
| * Implementation of {@link Font#getStyle()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public int getStyle (Font font) | |
| { | |
| return style; | |
| } | |
| /* Remaining methods are abstract */ | |
| /** | |
| * Implementation of {@link Font#canDisplay(char)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract boolean canDisplay (Font font, int c); | |
| /** | |
| * Implementation of {@link Font#canDisplay(String)}, | |
| * {@link Font#canDisplay(char [], int, int)}, and | |
| * {@link Font#canDisplay(CharacterIterator, int, int)}. | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract int canDisplayUpTo (Font font, CharacterIterator i, int start, int limit); | |
| /** | |
| * Returns the name of this font face inside the family, for example | |
| * <i>“Light”</i>. | |
| * | |
| * <p>This method is currently not used by {@link Font}. However, | |
| * this name would be needed by any serious desktop publishing | |
| * application. | |
| * | |
| * @param font the font whose sub-family name is requested. | |
| * | |
| * @param locale the locale for which to localize the name. If | |
| * <code>locale</code> is <code>null</code>, the returned name is | |
| * localized to the user’s default locale. | |
| * | |
| * @return the name of the face inside its family, or | |
| * <code>null</code> if the font does not provide a sub-family name. | |
| */ | |
| public abstract String getSubFamilyName (Font font, Locale locale); | |
| /** | |
| * Implementation of {@link Font#getPSName()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract String getPostScriptName (Font font); | |
| /** | |
| * Implementation of {@link Font#getNumGlyphs()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract int getNumGlyphs (Font font); | |
| /** | |
| * Implementation of {@link Font#getMissingGlyphCode()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract int getMissingGlyphCode (Font font); | |
| /** | |
| * Implementation of {@link Font#getBaselineFor(char)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract byte getBaselineFor (Font font, char c); | |
| /** | |
| * Returns a name for the specified glyph. This is useful for | |
| * generating PostScript or PDF files that embed some glyphs of a | |
| * font. If the implementation follows glyph naming conventions | |
| * specified by Adobe, search engines can extract the original text | |
| * from the generated PostScript and PDF files. | |
| * | |
| * <p>This method is currently not used by GNU Classpath. However, | |
| * it would be very useful for someone wishing to write a good | |
| * PostScript or PDF stream provider for the | |
| * <code>javax.print</code> package. | |
| * | |
| * <p><b>Names are not unique:</b> Under some rare circumstances, | |
| * the same name can be returned for different glyphs. It is | |
| * therefore recommended that printer drivers check whether the same | |
| * name has already been returned for antoher glyph, and make the | |
| * name unique by adding the string ".alt" followed by the glyph | |
| * index.</p> | |
| * | |
| * <p>This situation would occur for an OpenType or TrueType font | |
| * that has a <code>post</code> table of format 3 and provides a | |
| * mapping from glyph IDs to Unicode sequences through a | |
| * <code>Zapf</code> table. If the same sequence of Unicode | |
| * codepoints leads to different glyphs (depending on contextual | |
| * position, for example, or on typographic sophistication level), | |
| * the same name would get synthesized for those glyphs. To avoid | |
| * this, the font peer would have to go through the names of all | |
| * glyphs, which would make this operation very inefficient with | |
| * large fonts. | |
| * | |
| * @param font the font containing the glyph whose name is | |
| * requested. | |
| * | |
| * @param glyphIndex the glyph whose name the caller wants to | |
| * retrieve. | |
| * | |
| * @return the glyph name, or <code>null</code> if a font does not | |
| * provide glyph names. | |
| */ | |
| public abstract String getGlyphName (Font font, int glyphIndex); | |
| /** | |
| * Implementation of {@link | |
| * Font#createGlyphVector(FontRenderContext, String)}, {@link | |
| * Font#createGlyphVector(FontRenderContext, char[])}, and {@link | |
| * Font#createGlyphVector(FontRenderContext, CharacterIterator)}. | |
| * | |
| * @param font the font object that the created GlyphVector will return | |
| * when it gets asked for its font. This argument is needed because the | |
| * public API of {@link GlyphVector} works with {@link java.awt.Font}, | |
| * not with font peers. | |
| */ | |
| public abstract GlyphVector createGlyphVector (Font font, | |
| FontRenderContext frc, | |
| CharacterIterator ci); | |
| /** | |
| * Implementation of {@link Font#createGlyphVector(FontRenderContext, | |
| * int[])}. | |
| * | |
| * @param font the font object that the created GlyphVector will return | |
| * when it gets asked for its font. This argument is needed because the | |
| * public API of {@link GlyphVector} works with {@link java.awt.Font}, | |
| * not with font peers. | |
| */ | |
| public abstract GlyphVector createGlyphVector (Font font, | |
| FontRenderContext ctx, | |
| int[] glyphCodes); | |
| /** | |
| * Implementation of {@link Font#layoutGlyphVector(FontRenderContext, | |
| * char[], int, int, int)}. | |
| * | |
| * @param font the font object that the created GlyphVector will return | |
| * when it gets asked for its font. This argument is needed because the | |
| * public API of {@link GlyphVector} works with {@link java.awt.Font}, | |
| * not with font peers. | |
| */ | |
| public abstract GlyphVector layoutGlyphVector (Font font, | |
| FontRenderContext frc, | |
| char[] chars, int start, | |
| int limit, int flags); | |
| /** | |
| * Implementation of {@link Font#getFontMetrics()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract FontMetrics getFontMetrics (Font font); | |
| /** | |
| * Implementation of {@link Font#hasUniformLineMetrics()} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract boolean hasUniformLineMetrics (Font font); | |
| /** | |
| * Implementation of {@link Font#getLineMetrics(CharacterIterator, int, | |
| * int, FontRenderContext)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract LineMetrics getLineMetrics (Font font, | |
| CharacterIterator ci, | |
| int begin, int limit, | |
| FontRenderContext rc); | |
| /** | |
| * Implementation of {@link Font#getMaxCharBounds(FontRenderContext)} | |
| * | |
| * @param font the font this peer is being called from. This may be | |
| * useful if you are sharing peers between Font objects. Otherwise it may | |
| * be ignored. | |
| */ | |
| public abstract Rectangle2D getMaxCharBounds (Font font, | |
| FontRenderContext rc); | |
| } |