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/03/10 17:57:29 UTC
svn commit: r921450 - in
/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff: CFFFont.java
CFFParser.java charset/CFFCharset.java encoding/CFFEncoding.java
Author: lehmi
Date: Wed Mar 10 16:57:29 2010
New Revision: 921450
URL: http://svn.apache.org/viewvc?rev=921450&view=rev
Log:
PDFBOX-619: added some CFF/Type2 font encoding enhancements. Patch by Villu Russmann (villu dot ruusmann at gmail dot com)
Modified:
pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java
pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java
pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java
pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java
Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFFont.java Wed Mar 10 16:57:29 2010
@@ -133,12 +133,9 @@ public class CFFFont
{
List<Mapping> mappings = new ArrayList<Mapping>();
Set<String> mappedNames = new HashSet<String>();
- Iterator<Integer> codes = fontEncoding.getCodes();
- while (codes.hasNext())
+ for (CFFEncoding.Entry entry : fontEncoding.getEntries())
{
- int code = codes.next();
- int sid = fontEncoding.getSID(code);
- String charName = fontCharset.getName(sid);
+ String charName = fontCharset.getName(entry.getSID());
// Predefined encoding
if (charName == null)
{
@@ -150,13 +147,38 @@ public class CFFFont
continue;
}
Mapping mapping = new Mapping();
- mapping.setCode(code);
- mapping.setSID(sid);
+ mapping.setCode(entry.getCode());
+ mapping.setSID(entry.getSID());
mapping.setName(charName);
mapping.setBytes(bytes);
mappings.add(mapping);
mappedNames.add(charName);
}
+ if (fontEncoding instanceof CFFParser.EmbeddedEncoding)
+ {
+ CFFParser.EmbeddedEncoding embeddedEncoding = (CFFParser.EmbeddedEncoding)fontEncoding;
+
+ for (CFFParser.EmbeddedEncoding.Supplement supplement : embeddedEncoding.getSupplements())
+ {
+ String charName = fontCharset.getName(supplement.getGlyph());
+ if (charName == null)
+ {
+ continue;
+ }
+ byte[] bytes = charStringsDict.get(charName);
+ if (bytes == null)
+ {
+ continue;
+ }
+ Mapping mapping = new Mapping();
+ mapping.setCode(supplement.getCode());
+ mapping.setSID(supplement.getGlyph());
+ mapping.setName(charName);
+ mapping.setBytes(bytes);
+ mappings.add(mapping);
+ mappedNames.add(charName);
+ }
+ }
// XXX
int code = 256;
for (CFFCharset.Entry entry : fontCharset.getEntries())
Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/CFFParser.java Wed Mar 10 16:57:29 2010
@@ -19,6 +19,7 @@ package org.apache.fontbox.cff;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import org.apache.fontbox.cff.charset.CFFCharset;
@@ -704,7 +705,7 @@ public class CFFParser
/**
* Inner class representing an embedded CFF encoding.
*/
- private abstract static class EmbeddedEncoding extends CFFEncoding
+ abstract static class EmbeddedEncoding extends CFFEncoding
{
private int nSups;
@@ -716,14 +717,30 @@ public class CFFParser
return true;
}
+ List<Supplement> getSupplements()
+ {
+ if(supplement == null){
+ return Collections.<Supplement>emptyList();
+ }
+ return Arrays.asList(supplement);
+ }
+
/**
* Inner class representing a supplement for an encoding.
*/
- private static class Supplement
+ static class Supplement
{
private int code;
private int glyph;
+ int getCode(){
+ return code;
+ }
+
+ int getGlyph(){
+ return glyph;
+ }
+
@Override
public String toString()
{
@@ -788,7 +805,7 @@ public class CFFParser
/**
* Inner class representing an embedded CFF charset.
*/
- private abstract static class EmbeddedCharset extends CFFCharset
+ abstract static class EmbeddedCharset extends CFFCharset
{
@Override
public boolean isFontSpecific()
Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/charset/CFFCharset.java Wed Mar 10 16:57:29 2010
@@ -92,7 +92,7 @@ public abstract class CFFCharset
}
/**
- * This class represents a single name/SID mapping of the charset.
+ * This class represents a single SID/name mapping of the charset.
*
*/
public static class Entry
Modified: pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java
URL: http://svn.apache.org/viewvc/pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java?rev=921450&r1=921449&r2=921450&view=diff
==============================================================================
--- pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java (original)
+++ pdfbox/fontbox/trunk/src/main/java/org/apache/fontbox/cff/encoding/CFFEncoding.java Wed Mar 10 16:57:29 2010
@@ -16,8 +16,8 @@
*/
package org.apache.fontbox.cff.encoding;
-import java.util.HashMap;
-import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.List;
/**
* This is the superclass for all CFFFont encodings.
@@ -28,8 +28,7 @@ import java.util.Iterator;
public abstract class CFFEncoding
{
- private static HashMap<Integer,Integer> code2sid = new HashMap<Integer,Integer>();
- private static HashMap<Integer,Integer> sid2code = new HashMap<Integer,Integer>();
+ private List<Entry> entries = new ArrayList<Entry>();
/**
* Determines if the encoding is font specific or not.
@@ -47,9 +46,12 @@ public abstract class CFFEncoding
*/
public int getCode(int sid)
{
- if (sid2code.containsKey(sid))
+ for(Entry entry : entries)
{
- return sid2code.get(sid);
+ if(entry.entrySID == sid)
+ {
+ return entry.entryCode;
+ }
}
return -1;
}
@@ -61,9 +63,12 @@ public abstract class CFFEncoding
*/
public int getSID(int code)
{
- if (code2sid.containsKey(code))
+ for(Entry entry : entries)
{
- return code2sid.get(code);
+ if(entry.entryCode == code)
+ {
+ return entry.entrySID;
+ }
}
return -1;
}
@@ -75,18 +80,62 @@ public abstract class CFFEncoding
*/
public void register(int code, int sid)
{
- // TODO check if mapping already exists
- sid2code.put(sid,code);
- code2sid.put(code,sid);
+ entries.add(new Entry(code, sid));
}
/**
- * Returns an iterator for all codes of this encoding.
- *
- * @return the iterator for all codes of this encoding
+ * A list of all entries within this encoding.
+ * @return a list of all entries
*/
- public Iterator<Integer> getCodes()
+ public List<Entry> getEntries()
{
- return code2sid.keySet().iterator();
+ return entries;
+ }
+
+ /**
+ * This class represents a single code/SID mapping of the encoding.
+ *
+ */
+ public static class Entry
+ {
+ private int entryCode;
+ private int entrySID;
+
+ /**
+ * Create a new instance of Entry with the given values.
+ * @param code the code
+ * @param sid the SID
+ */
+ protected Entry(int code, int sid)
+ {
+ this.entryCode = code;
+ this.entrySID = sid;
+ }
+
+ /**
+ * The code of the entry.
+ * @return the code
+ */
+ public int getCode()
+ {
+ return this.entryCode;
+ }
+
+ /**
+ * The SID of the entry.
+ * @return the SID
+ */
+ public int getSID()
+ {
+ return this.entrySID;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString()
+ {
+ return "[code=" + entryCode + ", sid=" + entrySID + "]";
+ }
}
}
\ No newline at end of file