Bladeren bron

FOP-2747: OTF subsetting: Resize entry to fit value

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1811185 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_3
Simon Steiner 6 jaren geleden
bovenliggende
commit
ade0e4ebd6

+ 7
- 13
fop-core/src/main/java/org/apache/fop/fonts/truetype/OTFSubSetFile.java Bestand weergeven

} else if (dictKey.equals("CIDCount")) { } else if (dictKey.equals("CIDCount")) {
dict.write(writeCIDCount(entry)); dict.write(writeCIDCount(entry));
} else if (topDictStringEntries.contains(dictKey)) { } else if (topDictStringEntries.contains(dictKey)) {
if (entry.getOperandLength() < 2) {
entry.setOperandLength(2);
offsetExtra++;
}
dict.write(writeTopDictStringEntry(entry)); dict.write(writeTopDictStringEntry(entry));
} else { } else {
dict.write(entry.getByteData()); dict.write(entry.getByteData());
if (sid > 391) { if (sid > 391) {
stringIndexData.add(cffReader.getStringIndex().getValue(sid - 391)); stringIndexData.add(cffReader.getStringIndex().getValue(sid - 391));
} }

byte[] newDictEntry = createNewRef(stringIndexData.size() + 390, dictEntry.getOperator(), byte[] newDictEntry = createNewRef(stringIndexData.size() + 390, dictEntry.getOperator(),
dictEntry.getOperandLength(), true); dictEntry.getOperandLength(), true);
return newDictEntry; return newDictEntry;
if ((forceLength == -1 && newRef >= -107 && newRef <= 107) || forceLength == 1) { if ((forceLength == -1 && newRef >= -107 && newRef <= 107) || forceLength == 1) {
//The index values are 0 indexed //The index values are 0 indexed
newRefBytes.write(newRef + 139); newRefBytes.write(newRef + 139);
for (int i : operatorCode) {
newRefBytes.write(i);
}
} else if ((forceLength == -1 && newRef >= -1131 && newRef <= 1131) || forceLength == 2) { } else if ((forceLength == -1 && newRef >= -1131 && newRef <= 1131) || forceLength == 2) {
if (newRef <= -876) { if (newRef <= -876) {
newRefBytes.write(254); newRefBytes.write(254);
} else { } else {
newRefBytes.write(-newRef - 108); newRefBytes.write(-newRef - 108);
} }
for (int i : operatorCode) {
newRefBytes.write(i);
}
} else if ((forceLength == -1 && newRef >= -32768 && newRef <= 32767) || forceLength == 3) { } else if ((forceLength == -1 && newRef >= -32768 && newRef <= 32767) || forceLength == 3) {
newRefBytes.write(28); newRefBytes.write(28);
newRefBytes.write(newRef >> 8); newRefBytes.write(newRef >> 8);
newRefBytes.write(newRef); newRefBytes.write(newRef);
for (int i : operatorCode) {
newRefBytes.write(i);
}
} else { } else {
if (isDict) { if (isDict) {
newRefBytes.write(29); newRefBytes.write(29);
newRefBytes.write(newRef >> 16); newRefBytes.write(newRef >> 16);
newRefBytes.write(newRef >> 8); newRefBytes.write(newRef >> 8);
newRefBytes.write(newRef); newRefBytes.write(newRef);
for (int i : operatorCode) {
newRefBytes.write(i);
}
}
for (int i : operatorCode) {
newRefBytes.write(i);
} }
return newRefBytes.toByteArray(); return newRefBytes.toByteArray();
} }

+ 30
- 6
fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFSubSetFileTestCase.java Bestand weergeven

private class Operator extends BytesNumber { private class Operator extends BytesNumber {
private String opName = ""; private String opName = "";


public Operator(int number, int numBytes, String opName) {
Operator(int number, int numBytes, String opName) {
super(number, numBytes); super(number, numBytes);
this.opName = opName; this.opName = opName;
} }
int offset; int offset;
int fdFontCount = 128; int fdFontCount = 128;


public OTFSubSetFileFDArraySize() throws IOException {
OTFSubSetFileFDArraySize() throws IOException {
super(); super();
} }


int csLen; int csLen;
int fdLen; int fdLen;


public OTFSubSetFileEntryOrder(int csLen, int fdLen) throws IOException {
OTFSubSetFileEntryOrder(int csLen, int fdLen) throws IOException {
super(); super();
this.csLen = csLen; this.csLen = csLen;
this.fdLen = fdLen; this.fdLen = fdLen;
cffReader = makeCFFDataReader(); cffReader = makeCFFDataReader();
LinkedHashMap<String, DICTEntry> topDict = new LinkedHashMap<String, DICTEntry>(); LinkedHashMap<String, DICTEntry> topDict = new LinkedHashMap<String, DICTEntry>();
DICTEntry entry = new DICTEntry(); DICTEntry entry = new DICTEntry();
entry.setOperands(Arrays.<Number>asList(0));
entry.setOperands(Collections.<Number>singletonList(0));
topDict.put("charset", entry); topDict.put("charset", entry);
entry.setOperandLength(csLen); entry.setOperandLength(csLen);
topDict.put("CharStrings", entry); topDict.put("CharStrings", entry);
when(cffReader.getFDSelect()).thenReturn(fdSelect); when(cffReader.getFDSelect()).thenReturn(fdSelect);
CFFDataReader.FontDict fd = mock(CFFDataReader.FontDict.class); CFFDataReader.FontDict fd = mock(CFFDataReader.FontDict.class);
when(fd.getPrivateDictData()).thenReturn(new byte[0]); when(fd.getPrivateDictData()).thenReturn(new byte[0]);
when(cffReader.getFDFonts()).thenReturn(Arrays.asList(fd));
when(cffReader.getFDFonts()).thenReturn(Collections.singletonList(fd));


LinkedHashMap<String, DICTEntry> map = new LinkedHashMap<String, DICTEntry>(); LinkedHashMap<String, DICTEntry> map = new LinkedHashMap<String, DICTEntry>();
DICTEntry e = new DICTEntry(); DICTEntry e = new DICTEntry();
cffReader = makeCFFDataReader(); cffReader = makeCFFDataReader();
fdSubrs = new ArrayList<List<byte[]>>(); fdSubrs = new ArrayList<List<byte[]>>();
fdSubrs.add(new ArrayList<byte[]>()); fdSubrs.add(new ArrayList<byte[]>());
writeCIDDictsAndSubrs(Arrays.asList(0));
writeCIDDictsAndSubrs(Collections.singletonList(0));
} }
}; };
subSetFile.readFont(null, null, (MultiByteFont) null); subSetFile.readFont(null, null, (MultiByteFont) null);
is.skip(2); //start index is.skip(2); //start index
Assert.assertEquals(is.read(), 1); Assert.assertEquals(is.read(), 1);
} }

@Test
public void testResizeOfOperand2() throws IOException {
OTFSubSetFile otfSubSetFile = new OTFSubSetFile() {
void readFont(FontFileReader in, String embeddedName, MultiByteFont mbFont,
Map<Integer, Integer> usedGlyphs) throws IOException {
output = new byte[7];
cffReader = makeCFFDataReader();
LinkedHashMap<String, DICTEntry> topDict = new LinkedHashMap<String, DICTEntry>();
DICTEntry entry = new DICTEntry();
entry.setOperandLength(1);
entry.setOperator(new int[0]);
entry.setOperands(Collections.<Number>singletonList(0));
topDict.put("version", entry);
when(cffReader.getTopDictEntries()).thenReturn(topDict);
writeTopDICT();
}
};
otfSubSetFile.readFont(sourceSansReader, "StandardOpenType", null, glyphs);
ByteArrayInputStream fontSubset = new ByteArrayInputStream(otfSubSetFile.getFontSubset());
fontSubset.skip(5);
Assert.assertEquals(fontSubset.read(), 248);
Assert.assertEquals(fontSubset.read(), (byte)(390 - 108));
}
} }

Laden…
Annuleren
Opslaan