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;