FOP-3031: Add MCF before MDR in AFP

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1894576 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fop-core/src/main/java/org/apache/fop/afp/modca/ActiveEnvironmentGroup.java b/fop-core/src/main/java/org/apache/fop/afp/modca/ActiveEnvironmentGroup.java
index 653229c..687fea7 100644
--- a/fop-core/src/main/java/org/apache/fop/afp/modca/ActiveEnvironmentGroup.java
+++ b/fop-core/src/main/java/org/apache/fop/afp/modca/ActiveEnvironmentGroup.java
@@ -73,6 +73,7 @@
     private final Factory factory;
 
     private MapDataResource mdr;
+    private MapCodedFont mapCodedFont;
 
     /**
      * Constructor for the ActiveEnvironmentGroup, this takes a
@@ -198,17 +199,16 @@
             mdr.addTriplet(new DataObjectFontTriplet(size / 1000));
             mdr.finishElement();
         } else {
-            MapCodedFont mapCodedFont = getCurrentMapCodedFont();
             if (mapCodedFont == null) {
                 mapCodedFont = factory.createMapCodedFont();
-                mapCodedFonts.add(mapCodedFont);
+                mapCodedFonts.add(0, mapCodedFont);
             }
 
             try {
                 mapCodedFont.addFont(fontRef, font, size, orientation);
             } catch (MaximumSizeExceededException msee) {
                 mapCodedFont = factory.createMapCodedFont();
-                mapCodedFonts.add(mapCodedFont);
+                mapCodedFonts.add(0, mapCodedFont);
 
                 try {
                     mapCodedFont.addFont(fontRef, font, size, orientation);
diff --git a/fop-core/src/test/java/org/apache/fop/render/afp/AFPTrueTypeTestCase.java b/fop-core/src/test/java/org/apache/fop/render/afp/AFPTrueTypeTestCase.java
index 992436b..9a9e5be 100644
--- a/fop-core/src/test/java/org/apache/fop/render/afp/AFPTrueTypeTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/render/afp/AFPTrueTypeTestCase.java
@@ -70,6 +70,24 @@
 
 public class AFPTrueTypeTestCase {
     private String font;
+    private String fopxconf = "<fop version=\"1.0\">\n"
+            + "  <renderers>\n"
+            + "    <renderer mime=\"application/x-afp\">\n"
+            + "      <fonts>\n"
+            + "        <font name=\"Univers\" embed-url=\"test/resources/fonts/ttf/DejaVuLGCSerif.ttf\">\n"
+            + "          <font-triplet name=\"Univers\" style=\"normal\" weight=\"normal\"/>\n"
+            + "          <font-triplet name=\"any\" style=\"normal\" weight=\"normal\"/>\n"
+            + "        </font>\n"
+            + "        <font>\n"
+            + "          <afp-font name=\"Times Roman\" type=\"raster\" codepage=\"T1V10500\" encoding=\"Cp500\">\n"
+            + "            <afp-raster-font size=\"12\" characterset=\"C0N200B0\" base14-font=\"TimesRoman\"/>\n"
+            + "          </afp-font>\n"
+            + "          <font-triplet name=\"Times\" style=\"normal\" weight=\"normal\"/>\n"
+            + "        </font>"
+            + "      </fonts>\n"
+            + "    </renderer>\n"
+            + "  </renderers>\n"
+            + "</fop>";
 
     @Test
     public void testAFPTrueType() throws IOException, SAXException, TransformerException, URISyntaxException {
@@ -100,10 +118,10 @@
                 + "BEGIN PAGE_GROUP PGP00001\n"
                 + "BEGIN PAGE PGN00001\n"
                 + "BEGIN ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
-                + "MAP DATA_RESOURCE Triplets: 0x01,FULLY_QUALIFIED_NAME,FULLY_QUALIFIED_NAME,OBJECT_CLASSIFICATION,"
-                + "DATA_OBJECT_FONT_DESCRIPTOR,\n"
                 + "MAP CODED_FONT Triplets: FULLY_QUALIFIED_NAME,FULLY_QUALIFIED_NAME,CHARACTER_ROTATION,"
                 + "RESOURCE_LOCAL_IDENTIFIER,\n"
+                + "MAP DATA_RESOURCE Triplets: 0x01,FULLY_QUALIFIED_NAME,FULLY_QUALIFIED_NAME,OBJECT_CLASSIFICATION,"
+                + "DATA_OBJECT_FONT_DESCRIPTOR,\n"
                 + "DESCRIPTOR PAGE\n"
                 + "MIGRATION PRESENTATION_TEXT\n"
                 + "END ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
@@ -119,6 +137,58 @@
     }
 
     @Test
+    public void testTTFMixedWithRaster() throws Exception {
+        String fo = "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n"
+                + "  <fo:layout-master-set>\n"
+                + "    <fo:simple-page-master master-name=\"simple\">\n"
+                + "      <fo:region-body />\n"
+                + "    </fo:simple-page-master>\n"
+                + "  </fo:layout-master-set>\n"
+                + "  <fo:page-sequence master-reference=\"simple\">\n"
+                + "    <fo:flow flow-name=\"xsl-region-body\">\n"
+                + "    <fo:block font-family=\"Times New Roman\">a</fo:block>\n"
+                + "      <fo:block font-family=\"1\">a</fo:block>\n"
+                + "      <fo:block font-family=\"2\">b</fo:block>\n"
+                + "      <fo:block font-family=\"3\">c</fo:block>\n"
+                + "      <fo:block font-family=\"4\">d</fo:block>"
+                + "    </fo:flow>\n"
+                + "  </fo:page-sequence>\n"
+                + "</fo:root>";
+        StringBuilder sb = new StringBuilder();
+        for (int i = 1; i < 5; i++) {
+            sb.append("<font>\n"
+                    + "  <afp-font name=\"3OF9\" type=\"raster\" codepage=\"T1V10500\" encoding=\"Cp500\">\n"
+                    + "      <afp-raster-font size=\"18\" characterset=\"C0920AB0\" base14-font=\"TimesRoman\"/>\n"
+                    + "  </afp-font>\n"
+                    + "  <font-triplet name=\"" + i + "\" style=\"normal\" weight=\"normal\"/>\n"
+                    + "</font>");
+        }
+        fopxconf = "<fop version=\"1.0\">\n"
+                + "  <renderers>\n"
+                + "    <renderer mime=\"application/x-afp\">\n"
+                + "      <fonts>\n"
+                + sb.toString()
+                + "<font embed-url=\"test/resources/fonts/ttf/DejaVuLGCSerif.ttf\" name=\"TimesNewRomanBold\"> \n"
+                + "  <font-triplet name=\"Times New Roman\" style=\"normal\" weight=\"bold\"/> \n"
+                + "  <font-triplet name=\"any\" style=\"normal\" weight=\"normal\"/> \n"
+                + "</font>"
+                + "      </fonts>\n"
+                + "    </renderer>\n"
+                + "  </renderers>\n"
+                + "</fop>";
+        Assert.assertTrue(getAFP(fo).contains("BEGIN ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+                + "MAP CODED_FONT Triplets: FULLY_QUALIFIED_NAME,FULLY_QUALIFIED_NAME,CHARACTER_ROTATION,"
+                + "RESOURCE_LOCAL_IDENTIFIER,EXTENDED_RESOURCE_LOCAL_IDENTIFIER,FULLY_QUALIFIED_NAME,"
+                + "FULLY_QUALIFIED_NAME,CHARACTER_ROTATION,RESOURCE_LOCAL_IDENTIFIER,"
+                + "EXTENDED_RESOURCE_LOCAL_IDENTIFIER,FULLY_QUALIFIED_NAME,FULLY_QUALIFIED_NAME,CHARACTER_ROTATION,"
+                + "RESOURCE_LOCAL_IDENTIFIER,EXTENDED_RESOURCE_LOCAL_IDENTIFIER,FULLY_QUALIFIED_NAME,"
+                + "FULLY_QUALIFIED_NAME,CHARACTER_ROTATION,RESOURCE_LOCAL_IDENTIFIER,\n"
+                + "MAP DATA_RESOURCE Triplets: 0x01,FULLY_QUALIFIED_NAME,FULLY_QUALIFIED_NAME,OBJECT_CLASSIFICATION,"
+                + "DATA_OBJECT_FONT_DESCRIPTOR,\n"
+                + "DESCRIPTOR PAGE"));
+    }
+
+    @Test
     public void testSVGAFPTrueType() throws IOException, SAXException, TransformerException, URISyntaxException {
         String fo = "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\" "
                 + "xmlns:fox=\"http://xmlgraphics.apache.org/fop/extensions\" "
@@ -159,24 +229,6 @@
     }
 
     private String getAFP(String fo) throws IOException, TransformerException, SAXException, URISyntaxException {
-        String fopxconf = "<fop version=\"1.0\">\n"
-                + "  <renderers>\n"
-                + "    <renderer mime=\"application/x-afp\">\n"
-                + "      <fonts>\n"
-                + "        <font name=\"Univers\" embed-url=\"test/resources/fonts/ttf/DejaVuLGCSerif.ttf\">\n"
-                + "          <font-triplet name=\"Univers\" style=\"normal\" weight=\"normal\"/>\n"
-                + "          <font-triplet name=\"any\" style=\"normal\" weight=\"normal\"/>\n"
-                + "        </font>\n"
-                + "        <font>\n"
-                + "          <afp-font name=\"Times Roman\" type=\"raster\" codepage=\"T1V10500\" encoding=\"Cp500\">\n"
-                + "            <afp-raster-font size=\"12\" characterset=\"C0N200B0\" base14-font=\"TimesRoman\"/>\n"
-                + "          </afp-font>\n"
-                + "          <font-triplet name=\"Times\" style=\"normal\" weight=\"normal\"/>\n"
-                + "        </font>"
-                + "      </fonts>\n"
-                + "    </renderer>\n"
-                + "  </renderers>\n"
-                + "</fop>";
         FopFactoryBuilder confBuilder = new FopConfParser(
                 new ByteArrayInputStream(fopxconf.getBytes()),
                 EnvironmentalProfileFactory.createRestrictedIO(new URI("."),