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 2010/06/03 13:28:53 UTC

svn commit: r950969 - in /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap: CMap.java CMapParser.java

Author: lehmi
Date: Thu Jun  3 11:28:52 2010
New Revision: 950969

URL: http://svn.apache.org/viewvc?rev=950969&view=rev
Log:
PDFBOX-295: improved the parser to read begincidrange.

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java?rev=950969&r1=950968&r2=950969&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMap.java Thu Jun  3 11:28:52 2010
@@ -76,11 +76,9 @@ public class CMap
     public String lookup( byte[] code, int offset, int length )
     {
         String result = null;
-        Integer key = null;
         if( length == 1 )
         {
-            
-            key = new Integer( (code[offset]+256)%256 );
+            int key = (code[offset]+256)%256;
             result = singleByteMappings.get( key );
         }
         else if( length == 2 )
@@ -88,9 +86,7 @@ public class CMap
             int intKey = (code[offset]+256)%256;
             intKey <<= 8;
             intKey += (code[offset+1]+256)%256;
-            key = new Integer( intKey );
-
-            result = doubleByteMappings.get( key );
+            result = doubleByteMappings.get( intKey );
         }
 
         return result;
@@ -108,14 +104,14 @@ public class CMap
     {
         if( src.length == 1 )
         {
-            singleByteMappings.put( new Integer( 0xFF & src[0] ), dest );
+            singleByteMappings.put( (src[0]+256)%256 , dest );
         }
         else if( src.length == 2 )
         {
-            int intSrc = src[0]&0xFF;
+            int intSrc = (src[0]+256)%256;
             intSrc <<= 8;
-            intSrc |= (src[1]&0xFF);
-            doubleByteMappings.put( new Integer( intSrc ), dest );
+            intSrc += (src[1]+256)%256;
+            doubleByteMappings.put( intSrc , dest );
         }
         else
         {
@@ -123,7 +119,6 @@ public class CMap
         }
     }
 
-
     /**
      * This will add a codespace range.
      *

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java?rev=950969&r1=950968&r2=950969&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java Thu Jun  3 11:28:52 2010
@@ -40,6 +40,7 @@ public class CMapParser
     private static final String BEGIN_CODESPACE_RANGE = "begincodespacerange";
     private static final String BEGIN_BASE_FONT_CHAR = "beginbfchar";
     private static final String BEGIN_BASE_FONT_RANGE = "beginbfrange";
+    private static final String BEGIN_CID_RANGE = "begincidrange";
     private static final String USECMAP = "usecmap";
     
     private static final String MARK_END_OF_DICTIONARY = ">>";
@@ -153,7 +154,7 @@ public class CMapParser
                         }
                     }
                 }
-               else if( op.op.equals( BEGIN_BASE_FONT_RANGE ) )
+                else if( op.op.equals( BEGIN_BASE_FONT_RANGE ) )
                 {
                     Number cosCount = (Number)previousToken;
                     
@@ -203,6 +204,25 @@ public class CMapParser
                         }
                     }
                 }
+                else if( op.op.equals( BEGIN_CID_RANGE ) )
+                {
+                    int numberOfLines = (Integer)previousToken;
+                    for (int n=0; n < numberOfLines;n++) {
+                        byte[] startCode = (byte[])parseNextToken( cmapStream );
+                        int start = createIntFromBytes(startCode);
+                        byte[] endCode = (byte[])parseNextToken( cmapStream );
+                        int end = createIntFromBytes(endCode);
+                        int mappedCode = (Integer)parseNextToken( cmapStream );
+                        int numberOfMappings = end-start;
+                        byte[] mappedBytes = createBytesFromInt(mappedCode); 
+                        for (int i=0; i<numberOfMappings; i++) {
+                            String mappedStr = createStringFromBytes(startCode);
+                            result.addMapping(mappedBytes, mappedStr);
+                            increment(startCode);
+                            increment(mappedBytes);
+                        }
+                    }
+                }
             }
             previousToken = token;
         }
@@ -441,6 +461,14 @@ public class CMapParser
         }
     }
     
+    private int createIntFromBytes(byte[] bytes) 
+    {
+        int intValue = (bytes[0]+256)%256;
+        intValue <<= 8;
+        intValue += (bytes[1]+256)%256;
+        return intValue;
+    }
+    
     private String createStringFromBytes( byte[] bytes ) throws IOException
     {
         String retval = null;
@@ -455,25 +483,33 @@ public class CMapParser
         return retval;
     }
 
+    private byte[] createBytesFromInt( int value ) throws IOException
+    {
+        byte[] bytes = new byte[2];
+        bytes[1] = (byte)(value % 256);
+        bytes[0] = (byte)(value & 0x00 >> 8);
+        return bytes;
+    }
+
     private int compare( byte[] first, byte[] second )
     {
         int retval = 1;
-        boolean done = false;
-        for( int i=0; i<first.length && !done; i++ )
+        int firstLength = first.length;
+        for( int i=0; i<firstLength; i++ )
         {
             if( first[i] == second[i] )
             {
-                //move to next position
+                continue;
             }
             else if( ((first[i]+256)%256) < ((second[i]+256)%256) )
             {
-                done = true;
                 retval = -1;
+                break;
             }
             else
             {
-                done = true;
                 retval = 1;
+                break;
             }
         }
         return retval;