diff --git a/src/java/org/apache/poi/hssf/usermodel/FontDetails.java b/src/java/org/apache/poi/hssf/usermodel/FontDetails.java index 6a8172821..ae1b20d7c 100644 --- a/src/java/org/apache/poi/hssf/usermodel/FontDetails.java +++ b/src/java/org/apache/poi/hssf/usermodel/FontDetails.java @@ -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 FontDetails 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) { diff --git a/src/java/org/apache/poi/hssf/usermodel/StaticFontMetrics.java b/src/java/org/apache/poi/hssf/usermodel/StaticFontMetrics.java index 06ab46de9..a370968b0 100644 --- a/src/java/org/apache/poi/hssf/usermodel/StaticFontMetrics.java +++ b/src/java/org/apache/poi/hssf/usermodel/StaticFontMetrics.java @@ -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); } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics2d.java b/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics2d.java index ddbe4b0a8..6906cfdcb 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics2d.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics2d.java @@ -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);