Author: lehmi
Date: Mon Feb 25 19:16:41 2013
New Revision: 1449818
URL: http://svn.apache.org/r1449818
Log:
PDFBOX-1522: add an additional "0" if the exponent of a malformed floating
value is missing
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=1449818&r1=1449817&r2=1449818&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
Mon Feb 25 19:16:41 2013
@@ -27,7 +27,6 @@ import java.util.Map;
import java.util.Set;
import org.apache.fontbox.cff.CFFFont.Mapping;
-import org.apache.fontbox.cff.CFFOperator;
import org.apache.fontbox.cff.charset.CFFCharset;
import org.apache.fontbox.cff.charset.CFFExpertCharset;
import org.apache.fontbox.cff.charset.CFFExpertSubsetCharset;
@@ -60,43 +59,43 @@ public class CFFParser
{
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);
- }
+ 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);
@@ -116,13 +115,13 @@ public class CFFParser
private static String readTagName(CFFDataInput input) throws IOException
{
- byte[] b=input.readBytes(4);
- return new String(b);
+ byte[] b=input.readBytes(4);
+ return new String(b);
}
private static long readLong(CFFDataInput input) throws IOException
{
- return (input.readCard16()<<16) | input.readCard16();
+ return (input.readCard16()<<16) | input.readCard16();
}
private static Header readHeader(CFFDataInput input) throws IOException
@@ -263,6 +262,7 @@ public class CFFParser
{
StringBuffer sb = new StringBuffer();
boolean done = false;
+ boolean exponentMissing = false;
while (!done)
{
int b = input.readUnsignedByte();
@@ -282,15 +282,18 @@ public class CFFParser
case 0x8:
case 0x9:
sb.append(nibble);
+ exponentMissing = false;
break;
case 0xa:
sb.append(".");
break;
case 0xb:
sb.append("E");
+ exponentMissing = true;
break;
case 0xc:
sb.append("E-");
+ exponentMissing = true;
break;
case 0xd:
break;
@@ -305,6 +308,13 @@ public class CFFParser
}
}
}
+ if (exponentMissing)
+ {
+ // the exponent is missing, just append "0" to avoid an exception
+ // not sure if 0 is the correct value, but it seems to fit
+ // see PDFBOX-1522
+ sb.append("0");
+ }
return Double.valueOf(sb.toString());
}
@@ -323,16 +333,18 @@ public class CFFParser
}
DictData.Entry rosEntry = topDict.getEntry("ROS");
- if (rosEntry != null) {
- font = new CFFFontROS();
-
((CFFFontROS)font).setRegistry(readString(rosEntry.getNumber(0).intValue()));
-
((CFFFontROS)font).setOrdering(readString(rosEntry.getNumber(1).intValue()));
-
((CFFFontROS)font).setSupplement(rosEntry.getNumber(2).intValue());
+ if (rosEntry != null)
+ {
+ font = new CFFFontROS();
+
((CFFFontROS)font).setRegistry(readString(rosEntry.getNumber(0).intValue()));
+
((CFFFontROS)font).setOrdering(readString(rosEntry.getNumber(1).intValue()));
+ ((CFFFontROS)font).setSupplement(rosEntry.getNumber(2).intValue());
}
- if (font == null) {
- // -- No specific behavior for this font
- font = new CFFFont();
+ if (font == null)
+ {
+ // -- No specific behavior for this font
+ font = new CFFFont();
}
font.setName(name);
@@ -414,129 +426,136 @@ public class CFFParser
font.setEncoding(encoding);
- if (rosEntry != null) {
+ if (rosEntry != null)
+ {
+ // ---- It is a CIDKeyed Font, The Private Dictionary isn't in the
Top Dict But in the Font Dict
+ // ---- Font Dict can be accessed by the FDArray and FDSelect
+ DictData.Entry fdArrayEntry = topDict.getEntry("FDArray");
+ if (fdArrayEntry == null)
+ {
+ throw new IOException("FDArray is missing for a CIDKeyed
Font.");
+ }
- // ---- It is a CIDKeyed Font, The Private Dictionary isn't in
the Top Dict But in the Font Dict
- // ---- Font Dict can be accessed by the FDArray and FDSelect
- DictData.Entry fdArrayEntry = topDict.getEntry("FDArray");
- if (fdArrayEntry == null) {
- throw new IOException("FDArray is missing for a
CIDKeyed Font.");
- }
-
- int fontDictOffset = fdArrayEntry.getNumber(0).intValue();
- input.setPosition(fontDictOffset);
- IndexData fdIndex = readIndexData(input);
+ int fontDictOffset = fdArrayEntry.getNumber(0).intValue();
+ input.setPosition(fontDictOffset);
+ IndexData fdIndex = readIndexData(input);
List<Map<String, Object>> privateDictionaries = new
LinkedList<Map<String, Object>>();
List<Map<String, Object>> fontDictionaries = new
LinkedList<Map<String, Object>>();
- CFFFontROS fontRos = (CFFFontROS)font;
+ CFFFontROS fontRos = (CFFFontROS)font;
+
+ for (int i = 0; i < fdIndex.getCount(); ++i)
+ {
+ byte[] b = fdIndex.getBytes(i);
+ CFFDataInput fontDictInput = new CFFDataInput(b);
+ DictData fontDictData = readDictData(fontDictInput);
+
+ Map<String, Object> fontDictMap = new LinkedHashMap<String,
Object>();
+ fontDictMap.put("FontName", getString(fontDictData,
"FontName"));
+ fontDictMap.put("FontType", getNumber(fontDictData,
"FontType", 0));
+ fontDictMap.put("FontBBox", getDelta(fontDictData, "FontBBox",
null));
+ fontDictMap.put("FontMatrix", getDelta(fontDictData,
"FontMatrix", null));
+ // TODO OD-4 : Add here other keys
+ fontDictionaries.add(fontDictMap);
+
+ DictData.Entry privateEntry = fontDictData.getEntry("Private");
+ // --- Font DICT is invalid without "Private" entry
+ if ( privateEntry == null)
+ {
+ throw new IOException("Missing Private Dictionary");
+ }
+
+ int privateOffset = privateEntry.getNumber(1).intValue();
+ input.setPosition(privateOffset);
+ int privateSize = privateEntry.getNumber(0).intValue();
+ CFFDataInput privateDictData = new
CFFDataInput(input.readBytes(privateSize));
+ DictData privateDict = readDictData(privateDictData);
+
+ Map<String, Object> privDict = new LinkedHashMap<String,
Object>();
+ privDict.put("BlueValues", getDelta(privateDict, "BlueValues",
null));
+ privDict.put("OtherBlues", getDelta(privateDict, "OtherBlues",
null));
+ privDict.put("FamilyBlues", getDelta(privateDict,
"FamilyBlues", null));
+ privDict.put("FamilyOtherBlues", getDelta(privateDict,
"FamilyOtherBlues", null));
+ privDict.put("BlueScale", getNumber(privateDict, "BlueScale",
Double.valueOf(0.039625)));
+ privDict.put("BlueShift", getNumber(privateDict, "BlueShift",
Integer.valueOf(7)));
+ privDict.put("BlueFuzz", getNumber(privateDict, "BlueFuzz",
Integer.valueOf(1)));
+ privDict.put("StdHW", getNumber(privateDict, "StdHW", null));
+ privDict.put("StdVW", getNumber(privateDict, "StdVW", null));
+ privDict.put("StemSnapH", getDelta(privateDict, "StemSnapH",
null));
+ privDict.put("StemSnapV", getDelta(privateDict, "StemSnapV",
null));
+ privDict.put("ForceBold", getBoolean(privateDict, "ForceBold",
false));
+ privDict.put("LanguageGroup", getNumber(privateDict,
"LanguageGroup", Integer.valueOf(0)));
+ privDict.put("ExpansionFactor", getNumber(privateDict,
"ExpansionFactor", Double.valueOf(0.06)));
+ privDict.put("initialRandomSeed", getNumber(privateDict,
"initialRandomSeed", Integer.valueOf(0)));
+ privDict.put("defaultWidthX", getNumber(privateDict,
"defaultWidthX", Integer.valueOf(0)));
+ privDict.put("nominalWidthX", getNumber(privateDict,
"nominalWidthX", Integer.valueOf(0)));
+
+ int localSubrOffset = (Integer)getNumber(privateDict, "Subrs",
Integer.valueOf(0));
+ if (localSubrOffset == 0)
+ {
+ font.setLocalSubrIndex(new IndexData(0));
+ }
+ else
+ {
+ input.setPosition(privateOffset + localSubrOffset);
+ font.setLocalSubrIndex(readIndexData(input));
+ }
+
+ privateDictionaries.add(privDict);
+ }
+
+ fontRos.setFontDict(fontDictionaries);
+ fontRos.setPrivDict(privateDictionaries);
+
+ DictData.Entry fdSelectEntry = topDict.getEntry("FDSelect");
+ int fdSelectPos = fdSelectEntry.getNumber(0).intValue();
+ input.setPosition(fdSelectPos);
+ CIDKeyedFDSelect fdSelect = readFDSelect(input,
charStringsIndex.getCount(), fontRos);
+
+ font.addValueToPrivateDict("defaultWidthX", Integer.valueOf(1000));
+ font.addValueToPrivateDict("nominalWidthX", Integer.valueOf(0));
+
+ fontRos.setFdSelect(fdSelect);
- for (int i = 0; i < fdIndex.getCount(); ++i) {
- byte[] b = fdIndex.getBytes(i);
- CFFDataInput fontDictInput = new CFFDataInput(b);
- DictData fontDictData = readDictData(fontDictInput);
-
- Map<String, Object> fontDictMap = new
LinkedHashMap<String, Object>();
- fontDictMap.put("FontName", getString(fontDictData,
"FontName"));
- fontDictMap.put("FontType", getNumber(fontDictData,
"FontType", 0));
- fontDictMap.put("FontBBox", getDelta(fontDictData,
"FontBBox", null));
- fontDictMap.put("FontMatrix", getDelta(fontDictData,
"FontMatrix", null));
- // TODO OD-4 : Add here other keys
- fontDictionaries.add(fontDictMap);
-
- DictData.Entry privateEntry =
fontDictData.getEntry("Private");
- // --- Font DICT is invalid without "Private" entry
- if ( privateEntry == null) {
- throw new IOException("Missing Private
Dictionary");
- }
-
- int privateOffset = privateEntry.getNumber(1).intValue();
- input.setPosition(privateOffset);
- int privateSize = privateEntry.getNumber(0).intValue();
- CFFDataInput privateDictData = new
CFFDataInput(input.readBytes(privateSize));
- DictData privateDict = readDictData(privateDictData);
-
- Map<String, Object> privDict = new LinkedHashMap<String,
Object>();
- privDict.put("BlueValues", getDelta(privateDict, "BlueValues",
null));
- privDict.put("OtherBlues", getDelta(privateDict, "OtherBlues",
null));
- privDict.put("FamilyBlues", getDelta(privateDict,
"FamilyBlues", null));
- privDict.put("FamilyOtherBlues", getDelta(privateDict,
"FamilyOtherBlues", null));
- privDict.put("BlueScale", getNumber(privateDict, "BlueScale",
Double.valueOf(0.039625)));
- privDict.put("BlueShift", getNumber(privateDict, "BlueShift",
Integer.valueOf(7)));
- privDict.put("BlueFuzz", getNumber(privateDict, "BlueFuzz",
Integer.valueOf(1)));
- privDict.put("StdHW", getNumber(privateDict, "StdHW", null));
- privDict.put("StdVW", getNumber(privateDict, "StdVW", null));
- privDict.put("StemSnapH", getDelta(privateDict, "StemSnapH",
null));
- privDict.put("StemSnapV", getDelta(privateDict, "StemSnapV",
null));
- privDict.put("ForceBold", getBoolean(privateDict, "ForceBold",
false));
- privDict.put("LanguageGroup", getNumber(privateDict,
"LanguageGroup", Integer.valueOf(0)));
- privDict.put("ExpansionFactor", getNumber(privateDict,
"ExpansionFactor", Double.valueOf(0.06)));
- privDict.put("initialRandomSeed", getNumber(privateDict,
"initialRandomSeed", Integer.valueOf(0)));
- privDict.put("defaultWidthX", getNumber(privateDict,
"defaultWidthX", Integer.valueOf(0)));
- privDict.put("nominalWidthX", getNumber(privateDict,
"nominalWidthX", Integer.valueOf(0)));
-
- int localSubrOffset = (Integer)getNumber(privateDict, "Subrs",
Integer.valueOf(0));
- if (localSubrOffset == 0)
- {
- font.setLocalSubrIndex(new IndexData(0));
- }
- else
- {
- input.setPosition(privateOffset + localSubrOffset);
- font.setLocalSubrIndex(readIndexData(input));
- }
-
- privateDictionaries.add(privDict);
- }
-
- fontRos.setFontDict(fontDictionaries);
- fontRos.setPrivDict(privateDictionaries);
-
- DictData.Entry fdSelectEntry = topDict.getEntry("FDSelect");
- int fdSelectPos = fdSelectEntry.getNumber(0).intValue();
- input.setPosition(fdSelectPos);
- CIDKeyedFDSelect fdSelect = readFDSelect(input,
charStringsIndex.getCount(), fontRos);
-
- font.addValueToPrivateDict("defaultWidthX",
Integer.valueOf(1000));
- font.addValueToPrivateDict("nominalWidthX", Integer.valueOf(0));
-
- fontRos.setFdSelect(fdSelect);
-
- } else {
- DictData.Entry privateEntry = topDict.getEntry("Private");
- int privateOffset = privateEntry.getNumber(1).intValue();
- input.setPosition(privateOffset);
- int privateSize = privateEntry.getNumber(0).intValue();
- CFFDataInput privateDictData = new
CFFDataInput(input.readBytes(privateSize));
- DictData privateDict = readDictData(privateDictData);
- font.addValueToPrivateDict("BlueValues", getDelta(privateDict,
"BlueValues", null));
- font.addValueToPrivateDict("OtherBlues", getDelta(privateDict,
"OtherBlues", null));
- font.addValueToPrivateDict("FamilyBlues", getDelta(privateDict,
"FamilyBlues", null));
- font.addValueToPrivateDict("FamilyOtherBlues",
getDelta(privateDict, "FamilyOtherBlues", null));
- font.addValueToPrivateDict("BlueScale", getNumber(privateDict,
"BlueScale", Double.valueOf(0.039625)));
- font.addValueToPrivateDict("BlueShift", getNumber(privateDict,
"BlueShift", Integer.valueOf(7)));
- font.addValueToPrivateDict("BlueFuzz", getNumber(privateDict,
"BlueFuzz", Integer.valueOf(1)));
- font.addValueToPrivateDict("StdHW", getNumber(privateDict,
"StdHW", null));
- font.addValueToPrivateDict("StdVW", getNumber(privateDict,
"StdVW", null));
- font.addValueToPrivateDict("StemSnapH", getDelta(privateDict,
"StemSnapH", null));
- font.addValueToPrivateDict("StemSnapV", getDelta(privateDict,
"StemSnapV", null));
- font.addValueToPrivateDict("ForceBold", getBoolean(privateDict,
"ForceBold", false));
- font.addValueToPrivateDict("LanguageGroup",
getNumber(privateDict, "LanguageGroup", Integer.valueOf(0)));
- font.addValueToPrivateDict("ExpansionFactor",
getNumber(privateDict, "ExpansionFactor", Double.valueOf(0.06)));
- font.addValueToPrivateDict("initialRandomSeed",
getNumber(privateDict, "initialRandomSeed", Integer.valueOf(0)));
- font.addValueToPrivateDict("defaultWidthX",
getNumber(privateDict, "defaultWidthX", Integer.valueOf(0)));
- font.addValueToPrivateDict("nominalWidthX",
getNumber(privateDict, "nominalWidthX", Integer.valueOf(0)));
-
- int localSubrOffset = (Integer)getNumber(privateDict, "Subrs",
Integer.valueOf(0));
- if (localSubrOffset == 0)
- {
- font.setLocalSubrIndex(new IndexData(0));
- }
- else
- {
- input.setPosition(privateOffset + localSubrOffset);
- font.setLocalSubrIndex(readIndexData(input));
- }
+ }
+ else
+ {
+ DictData.Entry privateEntry = topDict.getEntry("Private");
+ int privateOffset = privateEntry.getNumber(1).intValue();
+ input.setPosition(privateOffset);
+ int privateSize = privateEntry.getNumber(0).intValue();
+ CFFDataInput privateDictData = new
CFFDataInput(input.readBytes(privateSize));
+ DictData privateDict = readDictData(privateDictData);
+ font.addValueToPrivateDict("BlueValues", getDelta(privateDict,
"BlueValues", null));
+ font.addValueToPrivateDict("OtherBlues", getDelta(privateDict,
"OtherBlues", null));
+ font.addValueToPrivateDict("FamilyBlues", getDelta(privateDict,
"FamilyBlues", null));
+ font.addValueToPrivateDict("FamilyOtherBlues",
getDelta(privateDict, "FamilyOtherBlues", null));
+ font.addValueToPrivateDict("BlueScale", getNumber(privateDict,
"BlueScale", Double.valueOf(0.039625)));
+ font.addValueToPrivateDict("BlueShift", getNumber(privateDict,
"BlueShift", Integer.valueOf(7)));
+ font.addValueToPrivateDict("BlueFuzz", getNumber(privateDict,
"BlueFuzz", Integer.valueOf(1)));
+ font.addValueToPrivateDict("StdHW", getNumber(privateDict,
"StdHW", null));
+ font.addValueToPrivateDict("StdVW", getNumber(privateDict,
"StdVW", null));
+ font.addValueToPrivateDict("StemSnapH", getDelta(privateDict,
"StemSnapH", null));
+ font.addValueToPrivateDict("StemSnapV", getDelta(privateDict,
"StemSnapV", null));
+ font.addValueToPrivateDict("ForceBold", getBoolean(privateDict,
"ForceBold", false));
+ font.addValueToPrivateDict("LanguageGroup", getNumber(privateDict,
"LanguageGroup", Integer.valueOf(0)));
+ font.addValueToPrivateDict("ExpansionFactor",
+ getNumber(privateDict, "ExpansionFactor",
Double.valueOf(0.06)));
+ font.addValueToPrivateDict("initialRandomSeed",
+ getNumber(privateDict, "initialRandomSeed",
Integer.valueOf(0)));
+ font.addValueToPrivateDict("defaultWidthX", getNumber(privateDict,
"defaultWidthX", Integer.valueOf(0)));
+ font.addValueToPrivateDict("nominalWidthX", getNumber(privateDict,
"nominalWidthX", Integer.valueOf(0)));
+
+ int localSubrOffset = (Integer)getNumber(privateDict, "Subrs",
Integer.valueOf(0));
+ if (localSubrOffset == 0)
+ {
+ font.setLocalSubrIndex(new IndexData(0));
+ }
+ else
+ {
+ input.setPosition(privateOffset + localSubrOffset);
+ font.setLocalSubrIndex(readIndexData(input));
+ }
}
return font;
@@ -548,11 +567,13 @@ public class CFFParser
{
return CFFStandardString.getName(index);
}
- if (index - 391 <= stringIndex.getCount()) {
+ if (index - 391 <= stringIndex.getCount())
+ {
DataInput dataInput = new DataInput(stringIndex.getBytes(index -
391));
return dataInput.getString();
}
- else {
+ else
+ {
return CFFStandardString.getName(0);
}
}
@@ -679,21 +700,21 @@ public class CFFParser
*/
private CIDKeyedFDSelect readFDSelect(CFFDataInput dataInput, int nGlyphs,
CFFFontROS ros)
throws IOException
- {
- int format = dataInput.readCard8();
- if (format == 0)
- {
- return readFormat0FDSelect(dataInput, format, nGlyphs, ros);
- }
- else if (format == 3)
- {
- return readFormat3FDSelect(dataInput, format, nGlyphs, ros);
- }
- else
- {
- throw new IllegalArgumentException();
- }
- }
+ {
+ int format = dataInput.readCard8();
+ if (format == 0)
+ {
+ return readFormat0FDSelect(dataInput, format, nGlyphs, ros);
+ }
+ else if (format == 3)
+ {
+ return readFormat3FDSelect(dataInput, format, nGlyphs, ros);
+ }
+ else
+ {
+ throw new IllegalArgumentException();
+ }
+ }
/**
* Read the Format 0 of the FDSelect data structure.
@@ -704,14 +725,15 @@ public class CFFParser
* @return
* @throws IOException
*/
- private Format0FDSelect readFormat0FDSelect(CFFDataInput dataInput, int
format, int nGlyphs, CFFFontROS ros) throws IOException
+ private Format0FDSelect readFormat0FDSelect(CFFDataInput dataInput, int
format, int nGlyphs, CFFFontROS ros)
+ throws IOException
{
- Format0FDSelect fdselect = new Format0FDSelect(ros);
- fdselect.format = format;
+ Format0FDSelect fdselect = new Format0FDSelect(ros);
+ fdselect.format = format;
fdselect.fds = new int[nGlyphs];
for (int i = 0; i < fdselect.fds.length; i++)
{
- fdselect.fds[i] = dataInput.readCard8();
+ fdselect.fds[i] = dataInput.readCard8();
}
return fdselect;
@@ -727,19 +749,20 @@ public class CFFParser
* @return
* @throws IOException
*/
- private Format3FDSelect readFormat3FDSelect(CFFDataInput dataInput, int
format, int nGlyphs, CFFFontROS ros) throws IOException
+ private Format3FDSelect readFormat3FDSelect(CFFDataInput dataInput, int
format, int nGlyphs, CFFFontROS ros)
+ throws IOException
{
- Format3FDSelect fdselect = new Format3FDSelect(ros);
- fdselect.format = format;
- fdselect.nbRanges = dataInput.readCard16();
+ Format3FDSelect fdselect = new Format3FDSelect(ros);
+ fdselect.format = format;
+ fdselect.nbRanges = dataInput.readCard16();
- fdselect.range3 = new Range3[fdselect.nbRanges];
+ fdselect.range3 = new Range3[fdselect.nbRanges];
for (int i = 0; i < fdselect.nbRanges; i++)
{
- Range3 r3 = new Range3();
- r3.first = dataInput.readCard16();
- r3.fd = dataInput.readCard8();
- fdselect.range3[i] = r3;
+ Range3 r3 = new Range3();
+ r3.first = dataInput.readCard16();
+ r3.fd = dataInput.readCard8();
+ fdselect.range3[i] = r3;
}
@@ -748,45 +771,59 @@ public class CFFParser
}
/**
- * Container of a Format 3 FDSelect data (see "The Compact Font Format
Specification" chapter "FDSelect" )
+ * Container of a Format 3 FDSelect data (see "The Compact Font Format
Specification" chapter "FDSelect" ).
*/
- private static class Format3FDSelect extends CIDKeyedFDSelect {
+ private static class Format3FDSelect extends CIDKeyedFDSelect
+ {
private int format;
private int nbRanges;
private Range3[] range3;
private int sentinel;
- private Format3FDSelect(CFFFontROS _owner) {
- super(_owner);
- }
-
- /* (non-Javadoc)
- * @see org.apache.fontbox.cff.CIDKeyedFDSelect#getFd(int)
- */
- @Override
- public int getFd(int glyph) {
- for (int i = 0 ; i < nbRanges; ++i) {
- if (range3[i].first >= glyph) {
- if (i + 1 < nbRanges ) {
- if (range3[i+1].first > glyph )
{
- return range3[i].fd;
- } else {
- // go to next range
- }
- } else {
- // last range reach, the
sentinel must be greater than glyph
- if (sentinel > glyph) {
- return range3[i].fd;
- } else {
- return -1;
- }
- }
- }
- }
- return 0;
- }
+ private Format3FDSelect(CFFFontROS owner)
+ {
+ super(owner);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.fontbox.cff.CIDKeyedFDSelect#getFd(int)
+ */
+ @Override
+ public int getFd(int glyph)
+ {
+ for (int i = 0; i < nbRanges; ++i)
+ {
+ if (range3[i].first >= glyph)
+ {
+ if (i + 1 < nbRanges )
+ {
+ if (range3[i+1].first > glyph )
+ {
+ return range3[i].fd;
+ }
+ else
+ {
+ // go to next range
+ }
+ }
+ else
+ {
+ // last range reach, the sentinel must be greater than
glyph
+ if (sentinel > glyph)
+ {
+ return range3[i].fd;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ }
+ }
+ return 0;
+ }
- @Override
+ @Override
public String toString()
{
return getClass().getName() + "[format=" + format + " nbRanges=" +
nbRanges + ", range3="
@@ -795,53 +832,61 @@ public class CFFParser
}
/**
- * Structure of a Range3 element
+ * Structure of a Range3 element.
*/
- private static class Range3 {
- private int first;
- private int fd;
-
- @Override
- public String toString() {
- return getClass().getName() + "[first=" + first + ", fd=" + fd
+ "]";
- }
+ private static class Range3
+ {
+ private int first;
+ private int fd;
+
+ @Override
+ public String toString()
+ {
+ return getClass().getName() + "[first=" + first + ", fd=" + fd +
"]";
+ }
}
/**
- * Container of a Format 0 FDSelect data (see "The Compact Font Format
Specification" chapter "FDSelect" )
+ * Container of a Format 0 FDSelect data (see "The Compact Font Format
Specification" chapter "FDSelect" ).
*/
- private static class Format0FDSelect extends CIDKeyedFDSelect {
+ private static class Format0FDSelect extends CIDKeyedFDSelect
+ {
private int format;
private int[] fds;
- private Format0FDSelect(CFFFontROS _owner) {
- super(_owner);
- }
-
- /* (non-Javadoc)
- * @see org.apache.fontbox.cff.CIDKeyedFDSelect#getFd(int)
- */
- @Override
- public int getFd(int glyph) {
- // ---- search the position of the given glyph
- for (Mapping mapping: this.owner.getMappings()) {
- if (mapping.getSID() == glyph) {
- int index = 0;
- Map<String, byte[]> charString =
this.owner.getCharStringsDict();
- Set<String> keys = charString.keySet();
- for (String str : keys) {
- if
(mapping.getName().equals(str)) {
- return fds[index];
- }
- ++index;
- }
- }
- }
+ private Format0FDSelect(CFFFontROS owner)
+ {
+ super(owner);
+ }
- return -1;
- }
+ /* (non-Javadoc)
+ * @see org.apache.fontbox.cff.CIDKeyedFDSelect#getFd(int)
+ */
+ @Override
+ public int getFd(int glyph)
+ {
+ // ---- search the position of the given glyph
+ for (Mapping mapping: this.owner.getMappings())
+ {
+ if (mapping.getSID() == glyph)
+ {
+ int index = 0;
+ Map<String, byte[]> charString =
this.owner.getCharStringsDict();
+ Set<String> keys = charString.keySet();
+ for (String str : keys)
+ {
+ if (mapping.getName().equals(str))
+ {
+ return fds[index];
+ }
+ ++index;
+ }
+ }
+ }
+ return -1;
+ }
- @Override
+ @Override
public String toString()
{
return getClass().getName() + "[format=" + format + ", fds="
@@ -910,12 +955,12 @@ public class CFFParser
private Format2Charset readFormat2Charset(CFFDataInput dataInput, int
format,
int nGlyphs) throws IOException
{
- Format2Charset charset = new Format2Charset();
+ Format2Charset charset = new Format2Charset();
charset.format = format;
charset.range = new Format2Charset.Range2[0];
for (int i = 0; i < nGlyphs - 1;)
{
- Format2Charset.Range2[] newRange = new
Format2Charset.Range2[charset.range.length + 1];
+ Format2Charset.Range2[] newRange = new
Format2Charset.Range2[charset.range.length + 1];
System.arraycopy(charset.range, 0, newRange, 0,
charset.range.length);
charset.range = newRange;
@@ -973,7 +1018,7 @@ public class CFFParser
{
for (Entry entry : entries)
{
- // Check for null entry before comparing the Font
+ // Check for null entry before comparing the Font
if (entry != null && entry.operator != null &&
entry.operator.equals(operator))
{
@@ -1085,11 +1130,13 @@ public class CFFParser
private int code;
private int glyph;
- int getCode(){
+ int getCode()
+ {
return code;
}
- int getGlyph(){
+ int getGlyph()
+ {
return glyph;
}