summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java80
-rw-r--r--test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java2
2 files changed, 80 insertions, 2 deletions
diff --git a/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java b/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java
index 88c613e7d..5673efbb4 100644
--- a/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java
+++ b/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java
@@ -18,9 +18,12 @@
/* $Id$ */
package org.apache.fop.render.pcl.fonts;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -33,6 +36,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.fop.fonts.CustomFont;
+import org.apache.fop.fonts.SingleByteFont;
import org.apache.fop.render.java2d.CustomFontMetricsMapper;
import org.apache.fop.render.pcl.fonts.PCLFontSegment.SegmentID;
import org.apache.fop.render.pcl.fonts.truetype.PCLTTFFontReader;
@@ -53,7 +57,13 @@ public class PCLTTFFontReaderTestCase {
CustomFont sbFont = mock(CustomFont.class);
when(sbFont.getInputStream()).thenReturn(new FileInputStream(new File(TEST_FONT_A)));
when(customFont.getRealFont()).thenReturn(sbFont);
+ SingleByteFont font = mock(SingleByteFont.class);
+ when(font.getGIDFromChar('h')).thenReturn(104);
+ when(font.getGIDFromChar('e')).thenReturn(101);
+ when(font.getGIDFromChar('l')).thenReturn(108);
+ when(font.getGIDFromChar('o')).thenReturn(111);
PCLTTFFontReader reader = new MockPCLTTFFontReader(customFont, byteWriter);
+ reader.setFont(font);
verifyFontData(reader);
validateOffsets(reader);
validateFontSegments(reader);
@@ -103,7 +113,13 @@ public class PCLTTFFontReaderTestCase {
* @throws IOException
*/
private void validateFontSegments(PCLTTFFontReader reader) throws IOException {
- List<PCLFontSegment> segments = reader.getFontSegments();
+ HashMap<Character, Integer> mappedChars = new HashMap<Character, Integer>();
+ mappedChars.put('H', 1);
+ mappedChars.put('e', 1);
+ mappedChars.put('l', 1);
+ mappedChars.put('o', 1);
+
+ List<PCLFontSegment> segments = reader.getFontSegments(mappedChars);
assertEquals(segments.size(), 5);
for (PCLFontSegment segment : segments) {
if (segment.getIdentifier() == SegmentID.PA) {
@@ -111,10 +127,72 @@ public class PCLTTFFontReaderTestCase {
assertEquals(segment.getData().length, 10);
byte[] panose = {2, 6, 6, 3, 5, 6, 5, 2, 2, 4};
assertArrayEquals(segment.getData(), panose);
+ } else if (segment.getIdentifier() == SegmentID.GT) {
+ verifyGlobalTrueTypeData(segment, mappedChars.size());
} else if (segment.getIdentifier() == SegmentID.NULL) {
// Terminating segment
assertEquals(segment.getData().length, 0);
}
}
}
+
+ private void verifyGlobalTrueTypeData(PCLFontSegment segment, int mappedCharsSize)
+ throws IOException {
+ byte[] ttfData = segment.getData();
+ int currentPos = 0;
+ //Version
+ assertEquals(readInt(new byte[]{ttfData[currentPos++], ttfData[currentPos++]}), 1);
+ assertEquals(readInt(new byte[]{ttfData[currentPos++], ttfData[currentPos++]}), 0);
+ //Number of tables
+ int numTables = readInt(new byte[]{ttfData[currentPos++], ttfData[currentPos++]});
+ assertEquals(numTables, 8);
+ //Search range
+ assertEquals(readInt(new byte[]{ttfData[currentPos++], ttfData[currentPos++]}), 128);
+ //Entry Selector
+ assertEquals(readInt(new byte[]{ttfData[currentPos++], ttfData[currentPos++]}), 3);
+ //Range shift
+ assertEquals(readInt(new byte[]{ttfData[currentPos++], ttfData[currentPos++]}), 0);
+ String[] validTags = {"head", "hhea", "hmtx", "maxp", "gdir"};
+ int matches = 0;
+ for (int i = 0; i < numTables; i++) {
+ String tag = readTag(new byte[]{ttfData[currentPos++], ttfData[currentPos++],
+ ttfData[currentPos++], ttfData[currentPos++]});
+ if (Arrays.asList(validTags).contains(tag)) {
+ matches++;
+ }
+ if (tag.equals("hmtx")) {
+ currentPos += 4;
+ int offset = readLong(new byte[]{ttfData[currentPos++], ttfData[currentPos++],
+ ttfData[currentPos++], ttfData[currentPos++]});
+ int length = readLong(new byte[]{ttfData[currentPos++], ttfData[currentPos++],
+ ttfData[currentPos++], ttfData[currentPos++]});
+ verifyHmtx(ttfData, offset, length, mappedCharsSize);
+ } else {
+ currentPos += 12;
+ }
+ }
+ assertEquals(matches, 5);
+ }
+
+ private void verifyHmtx(byte[] ttfData, int offset, int length, int mappedCharsSize)
+ throws IOException {
+ ByteArrayInputStream bais = new ByteArrayInputStream(ttfData);
+ byte[] subsetHmtx = new byte[length];
+ bais.skip(offset);
+ bais.read(subsetHmtx);
+ assertEquals(subsetHmtx.length, (mappedCharsSize + 32) * 4);
+ }
+
+ private int readInt(byte[] bytes) {
+ return ((0xFF & bytes[0]) << 8) | (0xFF & bytes[1]);
+ }
+
+ private int readLong(byte[] bytes) {
+ return ((0xFF & bytes[0]) << 24) | ((0xFF & bytes[1]) << 16) | ((0xFF & bytes[2]) << 8)
+ | (0xFF & bytes[3]);
+ }
+
+ private String readTag(byte[] tag) {
+ return new String(tag);
+ }
}
diff --git a/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java b/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java
index 10263d067..04849db87 100644
--- a/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java
+++ b/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java
@@ -46,7 +46,7 @@ public class PCLTTFCharacterWriterTestCase {
public void verifyCharacterDefinition() throws Exception {
CustomFont sbFont = mock(CustomFont.class);
when(customFont.getRealFont()).thenReturn(sbFont);
- softFont = new PCLSoftFont(1, customFont);
+ softFont = new PCLSoftFont(1, customFont, false);
TTFFile openFont = new TTFFile();
FontFileReader reader = new FontFileReader(new FileInputStream(new File(TEST_FONT_A)));
String header = OFFontLoader.readHeader(reader);