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