1 /* ClasspathFontPeer.java -- Font peer used by GNU Classpath.
2    Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 
39 package gnu.java.awt.peer;
40 
41 import gnu.java.awt.ClasspathToolkit;
42 
43 import java.awt.Font;
44 import java.awt.FontMetrics;
45 import java.awt.Toolkit;
46 import java.awt.font.FontRenderContext;
47 import java.awt.font.GlyphVector;
48 import java.awt.font.LineMetrics;
49 import java.awt.font.TextAttribute;
50 import java.awt.font.TransformAttribute;
51 import java.awt.geom.AffineTransform;
52 import java.awt.geom.Rectangle2D;
53 import java.awt.peer.FontPeer;
54 import java.text.AttributedCharacterIterator;
55 import java.text.CharacterIterator;
56 import java.util.HashMap;
57 import java.util.LinkedHashMap;
58 import java.util.Locale;
59 import java.util.Map;
60 
61 /**
62  * A peer for fonts that are used inside Classpath. The purpose of
63  * this interface is to abstract from platform-specific font handling
64  * in the Classpath implementation of java.awt.Font and related
65  * classes.
66  *
67  * <p><b>State kept by the peer:</b> a peer is generated for each Font
68  * object in the default implementation. If you wish to share peers between
69  * fonts, you will need to subclass both ClasspathFontPeer and
70  * {@link ClasspathToolKit}.</p>
71  *
72  * <p><b>Thread Safety:</b> Methods of this interface may be called
73  * from arbitrary threads at any time. Implementations of the
74  * <code>ClasspathFontPeer</code> interface are required to perform
75  * the necessary synchronization.</p>
76  *
77  * @see java.awt.Font#getPeer
78  * @see java.awt.Toolkit#getFontPeer
79  *
80  * @author Sascha Brawer (brawer@dandelis.ch)
81  * @author Graydon Hoare (graydon@redhat.com)
82  */
83 public abstract class ClasspathFontPeer
84   implements FontPeer
85 {
86 
87   /*************************************************************************/
88 
89   /*
90    * Instance Variables
91    */
92 
93   /**
94    * The 3 names of this font. all fonts have 3 names, some of which
95    * may be equal:
96    *
97    * logical -- name the font was constructed from
98    * family  -- a designer or brand name (Helvetica)
99    * face -- specific instance of a design (Helvetica Regular)
100    *
101    * @see isLogicalFontName
102    */
103 
104   protected String logicalName;
105   protected String familyName;
106   protected String faceName;
107 
108   /**
109    * The font style, which is a combination (by OR-ing) of the font style
110    * constants PLAIN, BOLD and ITALIC, in this class.
111    */
112   protected int style;
113 
114   /**
115    * The font point size. A point is 1/72 of an inch.
116    */
117   protected float size;
118 
119   /**
120    * The affine transformation the font is currently subject to.
121    */
122   protected AffineTransform transform;
123 
124   static class LRUCache<K,V> extends LinkedHashMap<K,V>
125   {
126     int max_entries;
LRUCache(int max)127     public LRUCache(int max)
128     {
129       super(max, 0.75f, true);
130       max_entries = max;
131     }
removeEldestEntry(Map.Entry eldest)132     protected boolean removeEldestEntry(Map.Entry eldest)
133     {
134       return size() > max_entries;
135     }
136   }
137 
138   private static LRUCache<AffineTransform,TransformAttribute> transCache =
139     new LRUCache<AffineTransform,TransformAttribute>(50);
140 
tk()141   protected static ClasspathToolkit tk()
142   {
143     return (ClasspathToolkit)(Toolkit.getDefaultToolkit ());
144   }
145 
146   /*
147    * Confusingly, a Logical Font is a concept unrelated to
148    * a Font's Logical Name.
149    *
150    * A Logical Font is one of 6 built-in, abstract font types
151    * which must be supported by any java environment: SansSerif,
152    * Serif, Monospaced, Dialog, and DialogInput.
153    *
154    * A Font's Logical Name is the name the font was constructed
155    * from. This might be the name of a Logical Font, or it might
156    * be the name of a Font Face.
157    */
158 
isLogicalFontName(String name)159   protected static boolean isLogicalFontName(String name)
160   {
161     String uname = name.toUpperCase ();
162     return (uname.equals ("SANSSERIF") ||
163             uname.equals ("SERIF") ||
164             uname.equals ("MONOSPACED") ||
165             uname.equals ("DIALOG") ||
166             uname.equals ("DIALOGINPUT") ||
167             uname.equals ("DEFAULT"));
168   }
169 
logicalFontNameToFaceName(String name)170   protected static String logicalFontNameToFaceName (String name)
171   {
172     String uname = name.toUpperCase ();
173     if (uname.equals("SANSSERIF"))
174       return "Helvetica";
175     else if (uname.equals ("SERIF"))
176       return "Times";
177     else if (uname.equals ("MONOSPACED"))
178       return "Courier";
179     else if (uname.equals ("DIALOG"))
180       return "Helvetica";
181     else if (uname.equals ("DIALOGINPUT"))
182       return "Helvetica";
183     else if (uname.equals ("DEFAULT"))
184       return "Dialog.plain";
185     else
186       return "Helvetica";
187   }
188 
faceNameToFamilyName(String name)189   protected static String faceNameToFamilyName (String name)
190   {
191     return name;
192   }
193 
copyStyleToAttrs(int style, Map attrs)194   public static void copyStyleToAttrs (int style, Map attrs)
195   {
196     if ((style & Font.BOLD) == Font.BOLD)
197       attrs.put (TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
198     else
199       attrs.put (TextAttribute.WEIGHT, TextAttribute.WEIGHT_REGULAR);
200 
201     if ((style & Font.ITALIC) == Font.ITALIC)
202       attrs.put (TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
203     else
204       attrs.put (TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR);
205   }
206 
copyFamilyToAttrs(String fam, Map attrs)207   protected static void copyFamilyToAttrs (String fam, Map attrs)
208   {
209     if (fam != null)
210       attrs.put (TextAttribute.FAMILY, fam);
211   }
212 
copySizeToAttrs(float size, Map attrs)213   public static void copySizeToAttrs (float size, Map attrs)
214   {
215     attrs.put (TextAttribute.SIZE, new Float (size));
216   }
217 
copyTransformToAttrs(AffineTransform trans, Map attrs)218   protected static void copyTransformToAttrs (AffineTransform trans, Map attrs)
219   {
220     if (trans != null)
221       {
222         TransformAttribute ta;
223         synchronized(transCache)
224           {
225             ta = transCache.get(trans);
226             if (ta == null)
227               {
228                 ta = new TransformAttribute(trans);
229                 transCache.put(trans, ta);
230               }
231           }
232         attrs.put(TextAttribute.TRANSFORM, ta);
233       }
234   }
235 
236 
setStandardAttributes(String name, String family, int style, float size, AffineTransform trans)237   protected void setStandardAttributes (String name, String family, int style,
238                                         float size, AffineTransform trans)
239   {
240     this.logicalName = name;
241 
242     if (isLogicalFontName (name))
243       this.faceName = logicalFontNameToFaceName (name);
244     else
245       this.faceName = name;
246 
247     if (family != null)
248       this.familyName = family;
249     else
250       this.familyName = faceNameToFamilyName (faceName);
251 
252     this.style = style;
253     this.size = size;
254     this.transform = trans;
255   }
256 
257 
setStandardAttributes(String name, Map attribs)258   protected void setStandardAttributes (String name, Map attribs)
259   {
260     String family = this.familyName;
261     AffineTransform trans = this.transform;
262     float size = this.size;
263     int style = this.style;
264 
265     if (attribs.containsKey (TextAttribute.FAMILY))
266       family = (String) attribs.get (TextAttribute.FAMILY);
267 
268     if (name == null)
269       name = "Default";
270 
271     if (attribs.containsKey (TextAttribute.WEIGHT))
272       {
273         Float weight = (Float) attribs.get (TextAttribute.WEIGHT);
274         if (weight.floatValue () >= TextAttribute.WEIGHT_BOLD.floatValue ())
275           style += Font.BOLD;
276       }
277 
278     if (attribs.containsKey (TextAttribute.POSTURE))
279       {
280         Float posture = (Float) attribs.get (TextAttribute.POSTURE);
281         if (posture.floatValue () >= TextAttribute.POSTURE_OBLIQUE.floatValue ())
282           style += Font.ITALIC;
283       }
284 
285     if (attribs.containsKey (TextAttribute.SIZE))
286       {
287         Float sz = (Float) attribs.get (TextAttribute.SIZE);
288         size = sz.floatValue ();
289 
290         // Pango doesn't accept 0 as a font size.
291         if (size < 1)
292           size = 1;
293       }
294     else
295       size = 12;
296 
297     if (attribs.containsKey (TextAttribute.TRANSFORM))
298       {
299         TransformAttribute ta = (TransformAttribute)
300           attribs.get(TextAttribute.TRANSFORM);
301         trans = ta.getTransform ();
302       }
303 
304     setStandardAttributes (name, family, style, size, trans);
305   }
306 
getStandardAttributes(Map attrs)307   protected void getStandardAttributes (Map attrs)
308   {
309     copyFamilyToAttrs (this.familyName, attrs);
310     copySizeToAttrs (this.size, attrs);
311     copyStyleToAttrs (this.style, attrs);
312     copyTransformToAttrs (this.transform, attrs);
313   }
314 
315 
316   /* Begin public API */
317 
ClasspathFontPeer(String name, Map attrs)318   public ClasspathFontPeer (String name, Map attrs)
319   {
320     setStandardAttributes (name, attrs);
321   }
322 
ClasspathFontPeer(String name, int style, int size)323   public ClasspathFontPeer (String name, int style, int size)
324   {
325     setStandardAttributes (name, (String)null, style,
326                            (float)size, (AffineTransform)null);
327   }
328 
329   /**
330    * Implementation of {@link Font#getName}
331    *
332    * @param font the font this peer is being called from. This may be
333    * useful if you are sharing peers between Font objects. Otherwise it may
334    * be ignored.
335    */
336 
getName(Font font)337   public String getName (Font font)
338   {
339     return logicalName;
340   }
341 
342   /**
343    * Implementation of {@link Font#getFamily()}
344    *
345    * @param font the font this peer is being called from. This may be
346    * useful if you are sharing peers between Font objects. Otherwise it may
347    * be ignored.
348    */
349 
getFamily(Font font)350   public String getFamily (Font font)
351   {
352     return familyName;
353   }
354 
355   /**
356    * Implementation of {@link Font#getFamily(Locale)}
357    *
358    * @param font the font this peer is being called from. This may be
359    * useful if you are sharing peers between Font objects. Otherwise it may
360    * be ignored.
361    */
362 
getFamily(Font font, Locale lc)363   public String getFamily (Font font, Locale lc)
364   {
365     return familyName;
366   }
367 
368   /**
369    * Implementation of {@link Font#getFontName()}
370    *
371    * @param font the font this peer is being called from. This may be
372    * useful if you are sharing peers between Font objects. Otherwise it may
373    * be ignored.
374    */
375 
getFontName(Font font)376   public String getFontName (Font font)
377   {
378     return faceName;
379   }
380 
381   /**
382    * Implementation of {@link Font#getFontName(Locale)}
383    *
384    * @param font the font this peer is being called from. This may be
385    * useful if you are sharing peers between Font objects. Otherwise it may
386    * be ignored.
387    */
388 
getFontName(Font font, Locale lc)389   public String getFontName (Font font, Locale lc)
390   {
391     return faceName;
392   }
393 
394   /**
395    * Implementation of {@link Font#getSize}
396    *
397    * @param font the font this peer is being called from. This may be
398    * useful if you are sharing peers between Font objects. Otherwise it may
399    * be ignored.
400    */
401 
getSize(Font font)402   public float getSize (Font font)
403   {
404     return size;
405   }
406 
407   /**
408    * Implementation of {@link Font#isPlain}
409    *
410    * @param font the font this peer is being called from. This may be
411    * useful if you are sharing peers between Font objects. Otherwise it may
412    * be ignored.
413    */
414 
isPlain(Font font)415   public boolean isPlain (Font font)
416   {
417     return style == Font.PLAIN;
418   }
419 
420   /**
421    * Implementation of {@link Font#isBold}
422    *
423    * @param font the font this peer is being called from. This may be
424    * useful if you are sharing peers between Font objects. Otherwise it may
425    * be ignored.
426    */
427 
isBold(Font font)428   public boolean isBold (Font font)
429   {
430     return ((style & Font.BOLD) == Font.BOLD);
431   }
432 
433   /**
434    * Implementation of {@link Font#isItalic}
435    *
436    * @param font the font this peer is being called from. This may be
437    * useful if you are sharing peers between Font objects. Otherwise it may
438    * be ignored.
439    */
440 
isItalic(Font font)441   public boolean isItalic (Font font)
442   {
443     return ((style & Font.ITALIC) == Font.ITALIC);
444   }
445 
446   /**
447    * Implementation of {@link Font#deriveFont(int, float)}
448    *
449    * @param font the font this peer is being called from. This may be
450    * useful if you are sharing peers between Font objects. Otherwise it may
451    * be ignored.
452    */
453 
deriveFont(Font font, int style, float size)454   public Font deriveFont (Font font, int style, float size)
455   {
456     Map attrs = new HashMap ();
457     getStandardAttributes (attrs);
458     copyStyleToAttrs (style, attrs);
459     copySizeToAttrs (size, attrs);
460     return tk().getFont (logicalName, attrs);
461   }
462 
463   /**
464    * Implementation of {@link Font#deriveFont(float)}
465    *
466    * @param font the font this peer is being called from. This may be
467    * useful if you are sharing peers between Font objects. Otherwise it may
468    * be ignored.
469    */
470 
deriveFont(Font font, float size)471   public Font deriveFont (Font font, float size)
472   {
473     Map attrs = new HashMap ();
474     getStandardAttributes (attrs);
475     copySizeToAttrs (size, attrs);
476     return tk().getFont (logicalName, attrs);
477   }
478 
479   /**
480    * Implementation of {@link Font#deriveFont(int)}
481    *
482    * @param font the font this peer is being called from. This may be
483    * useful if you are sharing peers between Font objects. Otherwise it may
484    * be ignored.
485    */
486 
deriveFont(Font font, int style)487   public Font deriveFont (Font font, int style)
488   {
489     Map attrs = new HashMap ();
490     getStandardAttributes (attrs);
491     copyStyleToAttrs (style, attrs);
492     return tk().getFont (logicalName, attrs);
493   }
494 
495   /**
496    * Implementation of {@link Font#deriveFont(int, AffineTransform)}
497    *
498    * @param font the font this peer is being called from. This may be
499    * useful if you are sharing peers between Font objects. Otherwise it may
500    * be ignored.
501    */
502 
deriveFont(Font font, int style, AffineTransform t)503   public Font deriveFont (Font font, int style, AffineTransform t)
504   {
505     Map attrs = new HashMap ();
506     getStandardAttributes (attrs);
507     copyStyleToAttrs (style, attrs);
508     copyTransformToAttrs (t, attrs);
509     return tk().getFont (logicalName, attrs);
510   }
511 
512   /**
513    * Implementation of {@link Font#deriveFont(AffineTransform)}
514    *
515    * @param font the font this peer is being called from. This may be
516    * useful if you are sharing peers between Font objects. Otherwise it may
517    * be ignored.
518    */
519 
deriveFont(Font font, AffineTransform t)520   public Font deriveFont (Font font, AffineTransform t)
521   {
522     Map attrs = new HashMap ();
523     getStandardAttributes (attrs);
524     copyTransformToAttrs (t, attrs);
525     return tk().getFont (logicalName, attrs);
526   }
527 
528   /**
529    * Implementation of {@link Font#deriveFont(Map)}
530    *
531    * @param font the font this peer is being called from. This may be
532    * useful if you are sharing peers between Font objects. Otherwise it may
533    * be ignored.
534    */
535 
deriveFont(Font font, Map attrs)536   public Font deriveFont (Font font, Map attrs)
537   {
538     return tk().getFont (logicalName, attrs);
539   }
540 
541   /**
542    * Implementation of {@link Font#getAttributes()}
543    *
544    * @param font the font this peer is being called from. This may be
545    * useful if you are sharing peers between Font objects. Otherwise it may
546    * be ignored.
547    */
548 
getAttributes(Font font)549   public Map getAttributes (Font font)
550   {
551     HashMap h = new HashMap ();
552     getStandardAttributes (h);
553     return h;
554   }
555 
556   /**
557    * Implementation of {@link Font#getAvailableAttributes()}
558    *
559    * @param font the font this peer is being called from. This may be
560    * useful if you are sharing peers between Font objects. Otherwise it may
561    * be ignored.
562    */
563 
getAvailableAttributes(Font font)564   public AttributedCharacterIterator.Attribute[] getAvailableAttributes(Font font)
565   {
566     AttributedCharacterIterator.Attribute a[] =
567       new AttributedCharacterIterator.Attribute[5];
568     a[0] = TextAttribute.FAMILY;
569     a[1] = TextAttribute.SIZE;
570     a[2] = TextAttribute.POSTURE;
571     a[3] = TextAttribute.WEIGHT;
572     a[4] = TextAttribute.TRANSFORM;
573     return a;
574   }
575 
576   /**
577    * Implementation of {@link Font#getTransform()}
578    *
579    * @param font the font this peer is being called from. This may be
580    * useful if you are sharing peers between Font objects. Otherwise it may
581    * be ignored.
582    */
583 
getTransform(Font font)584   public AffineTransform getTransform (Font font)
585   {
586     if (transform == null)
587       transform = new AffineTransform ();
588     return transform;
589   }
590 
591   /**
592    * Implementation of {@link Font#isTransformed()}
593    *
594    * @param font the font this peer is being called from. This may be
595    * useful if you are sharing peers between Font objects. Otherwise it may
596    * be ignored.
597    */
598 
isTransformed(Font font)599   public boolean isTransformed (Font font)
600   {
601     return ! transform.isIdentity ();
602   }
603 
604   /**
605    * Implementation of {@link Font#getItalicAngle()}
606    *
607    * @param font the font this peer is being called from. This may be
608    * useful if you are sharing peers between Font objects. Otherwise it may
609    * be ignored.
610    */
611 
getItalicAngle(Font font)612   public float getItalicAngle (Font font)
613   {
614     if ((style & Font.ITALIC) == Font.ITALIC)
615       return TextAttribute.POSTURE_OBLIQUE.floatValue ();
616     else
617       return TextAttribute.POSTURE_REGULAR.floatValue ();
618   }
619 
620 
621   /**
622    * Implementation of {@link Font#getStyle()}
623    *
624    * @param font the font this peer is being called from. This may be
625    * useful if you are sharing peers between Font objects. Otherwise it may
626    * be ignored.
627    */
628 
getStyle(Font font)629   public int getStyle (Font font)
630   {
631     return style;
632   }
633 
634 
635 
636 
637   /* Remaining methods are abstract */
638 
639   /**
640    * Implementation of {@link Font#canDisplay(char)}
641    *
642    * @param font the font this peer is being called from. This may be
643    * useful if you are sharing peers between Font objects. Otherwise it may
644    * be ignored.
645    */
646 
canDisplay(Font font, int c)647   public abstract boolean canDisplay (Font font, int c);
648 
649   /**
650    * Implementation of {@link Font#canDisplay(String)},
651    * {@link Font#canDisplay(char [], int, int)}, and
652    * {@link Font#canDisplay(CharacterIterator, int, int)}.
653    *
654    * @param font the font this peer is being called from. This may be
655    * useful if you are sharing peers between Font objects. Otherwise it may
656    * be ignored.
657    */
658 
canDisplayUpTo(Font font, CharacterIterator i, int start, int limit)659   public abstract int canDisplayUpTo (Font font, CharacterIterator i, int start, int limit);
660 
661 
662   /**
663    * Returns the name of this font face inside the family, for example
664    * <i>&#x201c;Light&#x201d;</i>.
665    *
666    * <p>This method is currently not used by {@link Font}. However,
667    * this name would be needed by any serious desktop publishing
668    * application.
669    *
670    * @param font the font whose sub-family name is requested.
671    *
672    * @param locale the locale for which to localize the name.  If
673    * <code>locale</code> is <code>null</code>, the returned name is
674    * localized to the user&#x2019;s default locale.
675    *
676    * @return the name of the face inside its family, or
677    * <code>null</code> if the font does not provide a sub-family name.
678    */
679 
getSubFamilyName(Font font, Locale locale)680   public abstract String getSubFamilyName (Font font, Locale locale);
681 
682 
683   /**
684    * Implementation of {@link Font#getPSName()}
685    *
686    * @param font the font this peer is being called from. This may be
687    * useful if you are sharing peers between Font objects. Otherwise it may
688    * be ignored.
689    */
690 
getPostScriptName(Font font)691   public abstract String getPostScriptName (Font font);
692 
693 
694   /**
695    * Implementation of {@link Font#getNumGlyphs()}
696    *
697    * @param font the font this peer is being called from. This may be
698    * useful if you are sharing peers between Font objects. Otherwise it may
699    * be ignored.
700    */
701 
getNumGlyphs(Font font)702   public abstract int getNumGlyphs (Font font);
703 
704 
705   /**
706    * Implementation of {@link Font#getMissingGlyphCode()}
707    *
708    * @param font the font this peer is being called from. This may be
709    * useful if you are sharing peers between Font objects. Otherwise it may
710    * be ignored.
711    */
712 
getMissingGlyphCode(Font font)713   public abstract int getMissingGlyphCode (Font font);
714 
715 
716   /**
717    * Implementation of {@link Font#getBaselineFor(char)}
718    *
719    * @param font the font this peer is being called from. This may be
720    * useful if you are sharing peers between Font objects. Otherwise it may
721    * be ignored.
722    */
723 
getBaselineFor(Font font, char c)724   public abstract byte getBaselineFor (Font font, char c);
725 
726 
727   /**
728    * Returns a name for the specified glyph. This is useful for
729    * generating PostScript or PDF files that embed some glyphs of a
730    * font. If the implementation follows glyph naming conventions
731    * specified by Adobe, search engines can extract the original text
732    * from the generated PostScript and PDF files.
733    *
734    * <p>This method is currently not used by GNU Classpath. However,
735    * it would be very useful for someone wishing to write a good
736    * PostScript or PDF stream provider for the
737    * <code>javax.print</code> package.
738    *
739    * <p><b>Names are not unique:</b> Under some rare circumstances,
740    * the same name can be returned for different glyphs. It is
741    * therefore recommended that printer drivers check whether the same
742    * name has already been returned for antoher glyph, and make the
743    * name unique by adding the string ".alt" followed by the glyph
744    * index.</p>
745    *
746    * <p>This situation would occur for an OpenType or TrueType font
747    * that has a <code>post</code> table of format 3 and provides a
748    * mapping from glyph IDs to Unicode sequences through a
749    * <code>Zapf</code> table. If the same sequence of Unicode
750    * codepoints leads to different glyphs (depending on contextual
751    * position, for example, or on typographic sophistication level),
752    * the same name would get synthesized for those glyphs. To avoid
753    * this, the font peer would have to go through the names of all
754    * glyphs, which would make this operation very inefficient with
755    * large fonts.
756    *
757    * @param font the font containing the glyph whose name is
758    * requested.
759    *
760    * @param glyphIndex the glyph whose name the caller wants to
761    * retrieve.
762    *
763    * @return the glyph name, or <code>null</code> if a font does not
764    * provide glyph names.
765    */
766 
getGlyphName(Font font, int glyphIndex)767   public abstract String getGlyphName (Font font, int glyphIndex);
768 
769 
770   /**
771    * Implementation of {@link
772    * Font#createGlyphVector(FontRenderContext, String)}, {@link
773    * Font#createGlyphVector(FontRenderContext, char[])}, and {@link
774    * Font#createGlyphVector(FontRenderContext, CharacterIterator)}.
775    *
776    * @param font the font object that the created GlyphVector will return
777    * when it gets asked for its font. This argument is needed because the
778    * public API of {@link GlyphVector} works with {@link java.awt.Font},
779    * not with font peers.
780    */
781 
createGlyphVector(Font font, FontRenderContext frc, CharacterIterator ci)782   public abstract GlyphVector createGlyphVector (Font font,
783                                                  FontRenderContext frc,
784                                                  CharacterIterator ci);
785 
786 
787   /**
788    * Implementation of {@link Font#createGlyphVector(FontRenderContext,
789    * int[])}.
790    *
791    * @param font the font object that the created GlyphVector will return
792    * when it gets asked for its font. This argument is needed because the
793    * public API of {@link GlyphVector} works with {@link java.awt.Font},
794    * not with font peers.
795    */
796 
createGlyphVector(Font font, FontRenderContext ctx, int[] glyphCodes)797   public abstract GlyphVector createGlyphVector (Font font,
798                                                  FontRenderContext ctx,
799                                                  int[] glyphCodes);
800 
801 
802   /**
803    * Implementation of {@link Font#layoutGlyphVector(FontRenderContext,
804    * char[], int, int, int)}.
805    *
806    * @param font the font object that the created GlyphVector will return
807    * when it gets asked for its font. This argument is needed because the
808    * public API of {@link GlyphVector} works with {@link java.awt.Font},
809    * not with font peers.
810    */
811 
layoutGlyphVector(Font font, FontRenderContext frc, char[] chars, int start, int limit, int flags)812   public abstract GlyphVector layoutGlyphVector (Font font,
813                                                  FontRenderContext frc,
814                                                  char[] chars, int start,
815                                                  int limit, int flags);
816 
817 
818   /**
819    * Implementation of {@link Font#getFontMetrics()}
820    *
821    * @param font the font this peer is being called from. This may be
822    * useful if you are sharing peers between Font objects. Otherwise it may
823    * be ignored.
824    */
825 
getFontMetrics(Font font)826   public abstract FontMetrics getFontMetrics (Font font);
827 
828 
829   /**
830    * Implementation of {@link Font#hasUniformLineMetrics()}
831    *
832    * @param font the font this peer is being called from. This may be
833    * useful if you are sharing peers between Font objects. Otherwise it may
834    * be ignored.
835    */
836 
hasUniformLineMetrics(Font font)837   public abstract boolean hasUniformLineMetrics (Font font);
838 
839 
840   /**
841    * Implementation of {@link Font#getLineMetrics(CharacterIterator, int,
842    * int, FontRenderContext)}
843    *
844    * @param font the font this peer is being called from. This may be
845    * useful if you are sharing peers between Font objects. Otherwise it may
846    * be ignored.
847    */
848 
getLineMetrics(Font font, CharacterIterator ci, int begin, int limit, FontRenderContext rc)849   public abstract LineMetrics getLineMetrics (Font font,
850                                               CharacterIterator ci,
851                                               int begin, int limit,
852                                               FontRenderContext rc);
853 
854   /**
855    * Implementation of {@link Font#getMaxCharBounds(FontRenderContext)}
856    *
857    * @param font the font this peer is being called from. This may be
858    * useful if you are sharing peers between Font objects. Otherwise it may
859    * be ignored.
860    */
861 
getMaxCharBounds(Font font, FontRenderContext rc)862   public abstract Rectangle2D getMaxCharBounds (Font font,
863                                                 FontRenderContext rc);
864 
865 }
866