]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-3074: Reorder glyphs based on gpa value
authorSimon Steiner <ssteiner@apache.org>
Mon, 6 Jun 2022 12:56:20 +0000 (12:56 +0000)
committerSimon Steiner <ssteiner@apache.org>
Mon, 6 Jun 2022 12:56:20 +0000 (12:56 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1901699 13f79535-47bb-0310-9956-ffa450edef68

fop-core/src/main/java/org/apache/fop/complexscripts/scripts/DefaultScriptProcessor.java
fop-core/src/main/java/org/apache/fop/complexscripts/scripts/HebrewScriptProcessor.java
fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ThaiScriptProcessor.java
fop-core/src/test/java/org/apache/fop/complexscripts/scripts/DefaultScriptTestCase.java

index 16c130a3e49e4efab1dff086cbec92d5efbf39e3..0de1a2058c7566cac51d0d10f71a1a227a006625 100644 (file)
@@ -88,7 +88,8 @@ public class DefaultScriptProcessor extends ScriptProcessor {
         for (int i = 0; i < ng; i++) {
             int gid = ga [ i ];
             int gw = unscaledWidths [ i ];
-            if (isReorderedMark(gdef, ga, unscaledWidths, i)) {
+            int[] pa = (gpa != null) ? gpa[i] : null;
+            if (isReorderedMark(gdef, ga, unscaledWidths, i, pa)) {
                 nm++;
             }
         }
@@ -106,7 +107,7 @@ public class DefaultScriptProcessor extends ScriptProcessor {
                 int gid = ga [ i ];
                 int[] pa = (gpa != null) ? gpa [ i ] : null;
                 CharAssociation ca = aa [ i ];
-                if (isReorderedMark(gdef, ga, unscaledWidths, i)) {
+                if (isReorderedMark(gdef, ga, unscaledWidths, i, pa)) {
                     nga [ k ] = gid;
                     naa [ k ] = ca;
                     if (npa != null) {
@@ -150,8 +151,9 @@ public class DefaultScriptProcessor extends ScriptProcessor {
         }
     }
 
-    protected boolean isReorderedMark(GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index) {
-        return gdef.isGlyphClass(glyphs[index], GlyphDefinitionTable.GLYPH_CLASS_MARK);
+    protected boolean isReorderedMark(GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index, int[] pa) {
+        pa = (pa != null) ? pa : new int[1];
+        return gdef.isGlyphClass(glyphs[index], GlyphDefinitionTable.GLYPH_CLASS_MARK) && pa[0] != 0;
     }
 
 }
index d772fe3371861a23959f51d3e0926fe6bb18e128..a2915ca24e3da55f1da506be7ab433f3e9dd3dc0 100644 (file)
@@ -25,7 +25,9 @@ public class HebrewScriptProcessor extends DefaultScriptProcessor {
         super(script);
     }
 
-    protected boolean isReorderedMark(GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index) {
+    @Override
+    protected boolean isReorderedMark(
+            GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index, int[] pa) {
         return gdef.isGlyphClass(glyphs[index], GlyphDefinitionTable.GLYPH_CLASS_MARK) && (unscaledWidths[index] != 0);
     }
 }
index c681861e94d2f3ed6733b618b726342c6d972d99..4c293d41d74bd4af4878935e455ee27ce898025d 100644 (file)
@@ -25,7 +25,9 @@ public class ThaiScriptProcessor extends DefaultScriptProcessor {
         super(script);
     }
 
-    protected boolean isReorderedMark(GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index) {
+    @Override
+    protected boolean isReorderedMark(
+            GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index, int[] pa) {
         return gdef.isGlyphClass(glyphs[index], GlyphDefinitionTable.GLYPH_CLASS_MARK);
     }
 }
index 96d3ba04f081e1e2ad4a772182330e56a50f0f29..b8357068b19387e653d037771ceb80ea76abe239 100644 (file)
@@ -35,8 +35,24 @@ import org.apache.fop.fonts.MultiByteFont;
 
 public class DefaultScriptTestCase {
     @Test
-    public void testProcessor() {
+    public void testProcessorReorder() {
         String in = "\u00F6\u0323";
+        int[][] gpa = new int[2][1];
+        gpa[0][0] = 1;
+        gpa[1][0] = 1;
+        String actual = getFont().reorderCombiningMarks(in, gpa, OTFScript.DEFAULT, null, null).toString();
+        Assert.assertEquals(actual.charAt(0), 803);
+    }
+
+    @Test
+    public void testProcessorNoReorder() {
+        String in = "\u00F6\u0323";
+        int[][] gpa = new int[2][1];
+        String actual = getFont().reorderCombiningMarks(in, gpa, OTFScript.DEFAULT, null, null).toString();
+        Assert.assertEquals(actual.charAt(0), 57344);
+    }
+
+    private MultiByteFont getFont() {
         MultiByteFont font = new MultiByteFont(null, null);
         font.setWidthArray(new int[0]);
         font.setCMap(new CMapSegment[]{new CMapSegment('\u0323', '\u0323', 1)});
@@ -46,7 +62,6 @@ public class DefaultScriptTestCase {
                 GlyphClassTable.createClassTable(entries), null);
         font.setGDEF(
                 new GlyphDefinitionTable(Collections.singletonList(table), new HashMap<String, ScriptProcessor>()));
-        String actual = font.reorderCombiningMarks(in, null, OTFScript.DEFAULT, null, null).toString();
-        Assert.assertEquals(actual.charAt(0), 803);
+        return font;
     }
 }