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 2012/12/22 17:10:40 UTC

svn commit: r1425304 - /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java

Author: lehmi
Date: Sat Dec 22 16:10:40 2012
New Revision: 1425304

URL: http://svn.apache.org/viewvc?rev=1425304&view=rev
Log:
PDFBOX-1473: added open type font support as proposed by Juraj Lonc

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java?rev=1425304&r1=1425303&r2=1425304&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java Sat Dec 22 16:10:40 2012
@@ -59,6 +59,45 @@ public class CFFParser
     public List<CFFFont> parse(byte[] bytes) throws IOException
     {
         input = new CFFDataInput(bytes);
+        
+    	String firstTag = readTagName(input);
+    	if (firstTag.equals("OTTO")) 
+    	{
+    		// this is OpenType font containing CFF data
+    		// so find CFF tag
+    		short numTables = input.readShort();
+    		short searchRange = input.readShort();
+    		short entrySelector = input.readShort();
+    		short rangeShift = input.readShort();
+    		
+    		boolean cffFound = false;
+    		for (int q=0; q<numTables; q++) 
+    		{
+    			String tagName = readTagName(input);
+    			long checksum = readLong(input);
+    			long offset = readLong(input);
+    			long length = readLong(input);
+    			if (tagName.equals("CFF ")) 
+    			{
+    				cffFound = true;
+    				byte[] bytes2 = new byte[(int)length];
+    				System.arraycopy(bytes, (int)offset, bytes2, 0, bytes2.length);
+    				input = new CFFDataInput(bytes2);
+    				break;
+    			}
+    		}
+    		
+    		if (!cffFound) 
+    		{
+    			throw new IOException("CFF tag not found in this OpenType font.");
+    		}
+    		
+    	} 
+    	else 
+    	{
+    		input.setPosition(0);
+    	}
+        
         header = readHeader(input);
         nameIndex = readIndexData(input);
         topDictIndex = readIndexData(input);
@@ -74,15 +113,26 @@ public class CFFParser
         }
         return fonts;
     }
+    
+    private static String readTagName(CFFDataInput input) throws IOException 
+    {
+    	byte[] b=input.readBytes(4);
+    	return new String(b);
+    }
+
+    private static long readLong(CFFDataInput input) throws IOException 
+    {
+    	return (input.readCard16()<<16) | input.readCard16();
+    }
 
     private static Header readHeader(CFFDataInput input) throws IOException
     {
-        Header header = new Header();
-        header.major = input.readCard8();
-        header.minor = input.readCard8();
-        header.hdrSize = input.readCard8();
-        header.offSize = input.readOffSize();
-        return header;
+        Header cffHeader = new Header();
+        cffHeader.major = input.readCard8();
+        cffHeader.minor = input.readCard8();
+        cffHeader.hdrSize = input.readCard8();
+        cffHeader.offSize = input.readOffSize();
+        return cffHeader;
     }
 
     private static IndexData readIndexData(CFFDataInput input)