mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			866 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			866 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* 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);
 | |
| 
 | |
| }
 |