You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2009/02/11 20:24:55 UTC

svn commit: r743456 - in /incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel: PDResources.java font/PDFontFactory.java font/PDType0Font.java

Author: lehmi
Date: Wed Feb 11 19:24:55 2009
New Revision: 743456

URL: http://svn.apache.org/viewvc?rev=743456&view=rev
Log:
PDFBOX-421: using a selfgenerated unique key for font-caching, caching descendant font within PDType0Font to avoid multiple font creation

Modified:
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontFactory.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java?rev=743456&r1=743455&r2=743456&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java Wed Feb 11 19:24:55 2009
@@ -120,18 +120,7 @@
             if( font instanceof COSDictionary )
             {
                 COSDictionary fontDictionary = (COSDictionary)font;
-                PDFont newFont = null;
-                if (fontCache != null) {
-	                if (fontCache.containsKey(fontName.getName()))
-	                	newFont = (PDFont)fontCache.get(fontName.getName());
-	                else {
-	                	newFont = PDFontFactory.createFont( fontDictionary );
-	                	fontCache.put(fontName.getName(), newFont);
-	                }
-                }
-                else
-                	newFont = PDFontFactory.createFont( fontDictionary );
-	            actuals.put( fontName.getName(), newFont);
+	            actuals.put( fontName.getName(), PDFontFactory.createFont( fontDictionary, fontCache ));
             }
         }
         return retval;

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontFactory.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontFactory.java?rev=743456&r1=743455&r2=743456&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontFactory.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontFactory.java Wed Feb 11 19:24:55 2009
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.font;
 
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
@@ -41,6 +42,35 @@
      *
      * @param dic The populated dictionary.
      *
+     * @param fontCache A Map to cache already created fonts
+     *
+     * @return The corrent implementation for the font.
+     *
+     * @throws IOException If the dictionary is not valid.
+     */
+    public static PDFont createFont(COSDictionary dic, Map fontCache) throws IOException
+    {
+    	PDFont retval = null;
+        if (fontCache != null) {
+            String fontKey = dic.getNameAsString(COSName.BASE_FONT) + dic.getNameAsString(COSName.NAME)+dic.getNameAsString(COSName.SUBTYPE);
+        	if (dic.getItem(COSName.ENCODING) != null)
+        		fontKey += dic.getItem(COSName.ENCODING).toString();
+            if (fontCache.containsKey(fontKey))
+            	retval = (PDFont)fontCache.get(fontKey);
+            else 
+            {
+            	retval = PDFontFactory.createFont( dic );
+            	fontCache.put(fontKey, retval);
+            }
+        }
+        return retval;
+    }
+
+    /**
+     * This will create the correct font based on information in the dictionary.
+     *
+     * @param dic The populated dictionary.
+     *
      * @return The corrent implementation for the font.
      *
      * @throws IOException If the dictionary is not valid.

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java?rev=743456&r1=743455&r2=743456&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java Wed Feb 11 19:24:55 2009
@@ -34,7 +34,9 @@
  */
 public class PDType0Font extends /*PDFont following is a hack ...*/ PDType1Font
 {
-    /**
+
+	private PDFont descendentFont;
+	/**
      * Constructor.
      */
     public PDType0Font()
@@ -88,12 +90,14 @@
      */
     public float getFontWidth( byte[] c, int offset, int length ) throws IOException
     {
-        COSArray descendantFontArray =
-            (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
-
-        COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
-        PDFont descendentFont = PDFontFactory.createFont( descendantFontDictionary );
-
+        if (descendentFont == null) 
+        {
+	    	COSArray descendantFontArray =
+	            (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
+	
+	        COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
+	        descendentFont = PDFontFactory.createFont( descendantFontDictionary );
+        }
         return descendentFont.getFontWidth( c, offset, length );
     }
 
@@ -110,12 +114,14 @@
      */
     public float getFontHeight( byte[] c, int offset, int length ) throws IOException
     {
-        COSArray descendantFontArray =
-            (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
-
-        COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
-        PDFont descendentFont = PDFontFactory.createFont( descendantFontDictionary );
-
+        if (descendentFont == null) 
+        {
+	    	COSArray descendantFontArray =
+	            (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
+	
+	        COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
+	        descendentFont = PDFontFactory.createFont( descendantFontDictionary );
+        }
         return descendentFont.getFontHeight( c, offset, length );
     }
 
@@ -128,12 +134,14 @@
      */
     public float getAverageFontWidth() throws IOException
     {
-        COSArray descendantFontArray =
-            (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
-
-        COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
-        PDFont descendentFont = PDFontFactory.createFont( descendantFontDictionary );
-
+    	if (descendentFont == null) 
+    	{
+	    	COSArray descendantFontArray =
+	            (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
+	
+	        COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
+	        descendentFont = PDFontFactory.createFont( descendantFontDictionary );
+    	}
         return descendentFont.getAverageFontWidth();
     }
 }