FOP-3078: Fix position of macron glyph

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1901980 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/DefaultScriptProcessor.java b/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/DefaultScriptProcessor.java
index 0de1a20..0dcde59 100644
--- a/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/DefaultScriptProcessor.java
+++ b/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/DefaultScriptProcessor.java
@@ -103,45 +103,29 @@
             CharAssociation ba = null;
             int bg = -1;
             int[] bpa = null;
+            int[] order = new int[ng];
             for (int i = 0; i < ng; i++) {
-                int gid = ga [ i ];
-                int[] pa = (gpa != null) ? gpa [ i ] : null;
-                CharAssociation ca = aa [ i ];
+                order[i] = i;
+            }
+            for (int i = 1; i < ng; i++) {
+                int[] pa = (gpa != null) ? gpa[i] : null;
                 if (isReorderedMark(gdef, ga, unscaledWidths, i, pa)) {
-                    nga [ k ] = gid;
-                    naa [ k ] = ca;
-                    if (npa != null) {
-                        npa [ k ] = pa;
-                    }
-                    k++;
-                } else {
-                    if (bg != -1) {
-                        nga [ k ] = bg;
-                        naa [ k ] = ba;
-                        if (npa != null) {
-                            npa [ k ] = bpa;
+                    for (int j = i; j > 0; j--) {
+                        switchGlyphs(order, j);
+                        int[] paj = (gpa != null) ? gpa[order[j]] : null;
+                        if (!isMarkNotReordered(gdef, ga, order[j], paj)) {
+                            break;
                         }
-                        k++;
-                        bg = -1;
-                        ba = null;
-                        bpa = null;
-                    }
-                    if (bg == -1) {
-                        bg = gid;
-                        ba = ca;
-                        bpa = pa;
                     }
                 }
             }
-            if (bg != -1) {
-                nga [ k ] = bg;
-                naa [ k ] = ba;
-                if (npa != null) {
-                    npa [ k ] = bpa;
+            for (int i = 0; i < ng; i++) {
+                nga[i] = ga[order[i]];
+                naa[i] = aa[order[i]];
+                if (gpa != null) {
+                    npa[i] = gpa[order[i]];
                 }
-                k++;
             }
-            assert k == ng;
             if (npa != null) {
                 System.arraycopy(npa, 0, gpa, 0, ng);
             }
@@ -151,9 +135,22 @@
         }
     }
 
+    private static void switchGlyphs(int[] order, int i) {
+        if (i < 1) {
+            throw new IllegalArgumentException(i + " must be > 0");
+        }
+        int oi = order[i];
+        order[i] = order[i - 1];
+        order[i - 1] = oi;
+    }
+
     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;
     }
 
+    private boolean isMarkNotReordered(GlyphDefinitionTable gdef, int[] glyphs, int index, int[] pa) {
+        pa = (pa != null) ? pa : new int[1];
+        return gdef.isGlyphClass(glyphs[index], GlyphDefinitionTable.GLYPH_CLASS_MARK) && pa[0] == 0;
+    }
 }
diff --git a/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/DefaultScriptTestCase.java b/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/DefaultScriptTestCase.java
index ba4ddf5..a7fec3b 100644
--- a/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/DefaultScriptTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/DefaultScriptTestCase.java
@@ -54,11 +54,14 @@
 
     @Test
     public void testProcessorReorder2() {
-        String in = "\u00F6\u0323";
-        int[][] gpa = new int[2][2];
-        gpa[1][1] = 1;
+        String in = "S\u0323\u0323;";
+        int[][] gpa = new int[4][1];
+        gpa[2][0] = 1;
         String actual = getFont().reorderCombiningMarks(in, gpa, OTFScript.DEFAULT, null, null).toString();
-        Assert.assertEquals(actual.charAt(0), 57344);
+        Assert.assertEquals(actual.charAt(0), 803);
+        Assert.assertEquals(actual.charAt(1), 57344);
+        Assert.assertEquals(actual.charAt(2), 803);
+        Assert.assertEquals(actual.charAt(3), 57344);
     }
 
     private MultiByteFont getFont() {