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)


Reply via email to