]> source.dussan.org Git - poi.git/commitdiff
Further enhancements to Font Metrics support, wrt fonts with bold/italic varients...
authorNick Burch <nick@apache.org>
Thu, 9 Aug 2007 16:27:16 +0000 (16:27 +0000)
committerNick Burch <nick@apache.org>
Thu, 9 Aug 2007 16:27:16 +0000 (16:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@564263 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/FontDetails.java
src/java/org/apache/poi/hssf/usermodel/StaticFontMetrics.java
src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics2d.java

index 6a8172821b93c578b9998850f5eee296e66cee45..ae1b20d7c82cc681ef7f6fe64b384d36a472f906 100644 (file)
@@ -82,6 +82,16 @@ public class FontDetails
         }
     }
 
+       protected static String buildFontHeightProperty(String fontName) {
+               return "font." + fontName + ".height";
+       }
+       protected static String buildFontWidthsProperty(String fontName) {
+               return "font." + fontName + ".widths";
+       }
+       protected static String buildFontCharactersProperty(String fontName) {
+               return "font." + fontName + ".characters";
+       }
+
     /**
      * Create an instance of <code>FontDetails</code> by loading them from the
      * provided property object.
@@ -92,9 +102,9 @@ public class FontDetails
      */
     public static FontDetails create( String fontName, Properties fontMetricsProps )
     {
-        String heightStr = fontMetricsProps.getProperty( "font." + fontName + ".height");
-        String widthsStr = fontMetricsProps.getProperty( "font." + fontName + ".widths");
-        String charactersStr = fontMetricsProps.getProperty( "font." + fontName + ".characters");
+        String heightStr = fontMetricsProps.getProperty( buildFontHeightProperty(fontName) );
+        String widthsStr = fontMetricsProps.getProperty( buildFontWidthsProperty(fontName) );
+        String charactersStr = fontMetricsProps.getProperty( buildFontCharactersProperty(fontName) );
 
         // Ensure that this is a font we know about
         if(heightStr == null || widthsStr == null || charactersStr == null) {
index 06ab46de931fa5deaed316dbc6b181a6c456a7af..a370968b083960a583368ea5455c5d67e5b75870 100644 (file)
@@ -32,7 +32,9 @@ import java.io.*;
  */
 class StaticFontMetrics
 {
+       /** The font metrics property file we're using */
     private static Properties fontMetricsProps;
+       /** Our cache of font details we've already looked up */
     private static Map fontDetailsMap = new HashMap();
 
     /**
@@ -42,6 +44,8 @@ class StaticFontMetrics
      */
     public static FontDetails getFontDetails(Font font)
     {
+               // If we haven't already identified out font metrics file,
+               //  figure out which one to use and load it
         if (fontMetricsProps == null)
         {
             InputStream metricsIn = null;
@@ -81,16 +85,31 @@ class StaticFontMetrics
             }
         }
 
+               // Grab the base name of the font they've asked about
         String fontName = font.getName();
 
-        if (fontDetailsMap.get(fontName) == null)
-        {
+               // Some fonts support plain/bold/italic/bolditalic variants
+               // Others have different font instances for bold etc
+               // (eg font.dialog.plain.* vs font.Californian FB Bold.*)
+               String fontStyle = "";
+               if(font.isPlain())  fontStyle += "plain";
+               if(font.isBold())   fontStyle += "bold";
+               if(font.isItalic()) fontStyle += "italic";
+
+               // Do we have a definition for this font with just the name?
+               // If not, check with the font style added
+               if(fontMetricsProps.get(FontDetails.buildFontHeightProperty(fontName)) == null && 
+               fontMetricsProps.get(FontDetails.buildFontHeightProperty(fontName+"."+fontStyle)) != null) {
+                       // Need to add on the style to the font name
+                       fontName += "." + fontStyle;
+               }
+
+               // Get the details on this font
+        if (fontDetailsMap.get(fontName) == null) {
             FontDetails fontDetails = FontDetails.create(fontName, fontMetricsProps);
             fontDetailsMap.put( fontName, fontDetails );
             return fontDetails;
-        }
-        else
-        {
+        } else {
             return (FontDetails) fontDetailsMap.get(fontName);
         }
 
index ddbe4b0a8fead7a888324b6f8b5ed7287cbf9548..6906cfdcb8b59aa19c92257e1ebefdbfef8e4a9c 100644 (file)
@@ -56,6 +56,15 @@ public class TestEscherGraphics2d extends TestCase
                graphics.setFont(font);
         graphics.drawString("This is another test", 10, 10);
 
+               // And test with ones that need the style appending
+               font = new Font("dialog", Font.PLAIN, 12);
+               graphics.setFont(font);
+        graphics.drawString("This is another test", 10, 10);
+
+               font = new Font("dialog", Font.BOLD, 12);
+               graphics.setFont(font);
+        graphics.drawString("This is another test", 10, 10);
+
                // But with an invalid font, we get an exception
                font = new Font("IamAmadeUPfont", Font.PLAIN, 22);
                graphics.setFont(font);