PDFBOX-5808: add test for aalt
git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1917436 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fontbox/src/test/java/org/apache/fontbox/ttf/gsub/GsubWorkerForAalt.java b/fontbox/src/test/java/org/apache/fontbox/ttf/gsub/GsubWorkerForAalt.java
new file mode 100644
index 0000000..b9f7ac8
--- /dev/null
+++ b/fontbox/src/test/java/org/apache/fontbox/ttf/gsub/GsubWorkerForAalt.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fontbox.ttf.gsub;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.fontbox.ttf.CmapLookup;
+import org.apache.fontbox.ttf.model.GsubData;
+import org.apache.fontbox.ttf.model.ScriptFeature;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ *
+ * GSUB worker to test "aalt", code is copied from the latin worker except for the features.
+ *
+ * @author Palash Ray
+ * @author Tilman Hausherr
+ *
+ */
+public class GsubWorkerForAalt implements GsubWorker
+{
+ private static final Logger LOG = LogManager.getLogger(GsubWorkerForAalt.class);
+
+ private static final List<String> FEATURES_IN_ORDER = Arrays.asList("aalt");
+
+ private final CmapLookup cmapLookup;
+ private final GsubData gsubData;
+
+ GsubWorkerForAalt(CmapLookup cmapLookup, GsubData gsubData)
+ {
+ this.cmapLookup = cmapLookup;
+ this.gsubData = gsubData;
+ }
+
+ @Override
+ public List<Integer> applyTransforms(List<Integer> originalGlyphIds)
+ {
+ List<Integer> intermediateGlyphsFromGsub = originalGlyphIds;
+
+ for (String feature : FEATURES_IN_ORDER)
+ {
+ if (!gsubData.isFeatureSupported(feature))
+ {
+ LOG.debug("the feature {} was not found", feature);
+ continue;
+ }
+
+ LOG.debug("applying the feature {}", feature);
+
+ ScriptFeature scriptFeature = gsubData.getFeature(feature);
+
+ intermediateGlyphsFromGsub = applyGsubFeature(scriptFeature,
+ intermediateGlyphsFromGsub);
+ }
+
+ return Collections.unmodifiableList(intermediateGlyphsFromGsub);
+ }
+
+ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature,
+ List<Integer> originalGlyphs)
+ {
+ if (scriptFeature.getAllGlyphIdsForSubstitution().isEmpty())
+ {
+ LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty",
+ scriptFeature.getName());
+ return originalGlyphs;
+ }
+
+ GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
+ scriptFeature.getAllGlyphIdsForSubstitution());
+
+ List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
+ List<Integer> gsubProcessedGlyphs = new ArrayList<>();
+
+ for (List<Integer> chunk : tokens)
+ {
+ if (scriptFeature.canReplaceGlyphs(chunk))
+ {
+ // gsub system kicks in, you get the glyphId directly
+ int glyphId = scriptFeature.getReplacementForGlyphs(chunk);
+ gsubProcessedGlyphs.add(glyphId);
+ }
+ else
+ {
+ gsubProcessedGlyphs.addAll(chunk);
+ }
+ }
+
+ LOG.debug("originalGlyphs: {}, gsubProcessedGlyphs: {}", originalGlyphs, gsubProcessedGlyphs);
+
+ return gsubProcessedGlyphs;
+ }
+}
diff --git a/fontbox/src/test/java/org/apache/fontbox/ttf/gsub/GsubWorkerForAaltTest.java b/fontbox/src/test/java/org/apache/fontbox/ttf/gsub/GsubWorkerForAaltTest.java
new file mode 100644
index 0000000..78f521e
--- /dev/null
+++ b/fontbox/src/test/java/org/apache/fontbox/ttf/gsub/GsubWorkerForAaltTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fontbox.ttf.gsub;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.fontbox.ttf.CmapLookup;
+import org.apache.fontbox.ttf.OTFParser;
+import org.apache.fontbox.ttf.TrueTypeFont;
+import org.apache.pdfbox.io.RandomAccessReadBufferedFile;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test the "aalt" type 3 tables of a font.
+ *
+ * @author Tilman Hausherr
+ */
+class GsubWorkerForAaltTest
+{
+
+ @Test
+ void testFoglihtenNo07() throws IOException
+ {
+ CmapLookup cmapLookup;
+ GsubWorker gsubWorkerForAlt;
+ try (TrueTypeFont ttf = new OTFParser().parse(
+ new RandomAccessReadBufferedFile("src/test/resources/otf/FoglihtenNo07.otf")))
+ {
+ cmapLookup = ttf.getUnicodeCmapLookup();
+ gsubWorkerForAlt = new GsubWorkerForAalt(cmapLookup, ttf.getGsubData());
+ }
+
+ // Values should be the same you get by looking at the GSUB lookup lists 12 or 13 with
+ // a font tool
+ assertEquals(Arrays.asList(1139, 1562, 1477),
+ gsubWorkerForAlt.applyTransforms(getGlyphIds("Abc", cmapLookup)));
+ }
+
+ private List<Integer> getGlyphIds(String word, CmapLookup cmapLookup)
+ {
+ List<Integer> originalGlyphIds = new ArrayList<>();
+
+ for (char unicodeChar : word.toCharArray())
+ {
+ int glyphId = cmapLookup.getGlyphId(unicodeChar);
+ assertTrue(glyphId > 0);
+ originalGlyphIds.add(glyphId);
+ }
+
+ return originalGlyphIds;
+ }
+}
\ No newline at end of file