You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ga...@apache.org on 2013/11/01 15:34:20 UTC

svn commit: r1537948 [1/3] - in /xmlgraphics/fop/trunk: ./ src/documentation/intermediate-format-ng/ src/java/org/apache/fop/area/ src/java/org/apache/fop/fo/ src/java/org/apache/fop/fo/extensions/ src/java/org/apache/fop/layoutmgr/ src/java/org/apache...

Author: gadams
Date: Fri Nov  1 14:34:18 2013
New Revision: 1537948

URL: http://svn.apache.org/r1537948
Log:
FOP-2301: Enable support for PDF sub-page transitions.

Added:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFIdentifiedDictionary.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFLayer.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigator.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigatorAction.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFSetOCGStateAction.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTransitionAction.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFActionElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFActionExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFArrayElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFArrayExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFCatalogElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFCatalogExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFCollectionEntryElement.java
      - copied, changed from r1537941, xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryEntryElement.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFCollectionEntryExtension.java
      - copied, changed from r1537941, xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryEntryExtension.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFCollectionExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFLayerElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFLayerExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFNavigatorElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFNavigatorExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFObjectExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFObjectType.java
      - copied, changed from r1537941, xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryEntryType.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFPageElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFPageExtension.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFReferenceElement.java   (with props)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFReferenceExtension.java   (with props)
    xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/pdf-dictionary-extension_2.xml   (with props)
    xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/pdf-dictionary-extension_3.xml   (with props)
Removed:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/AbstractPDFDictionaryElement.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryEntryElement.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryEntryExtension.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryEntryType.java
Modified:
    xmlgraphics/fop/trunk/src/documentation/intermediate-format-ng/fop-intermediate-format-ng-content.xsd
    xmlgraphics/fop/trunk/src/java/org/apache/fop/area/AreaTreeParser.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/area/Trait.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FObj.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/TraitSetter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/AbstractPDFStream.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDictionary.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDocument.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFFactory.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFResources.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFGraphicContext.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFParser.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFSerializer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderingUtil.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryAttachment.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryElement.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryExtension.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFDictionaryType.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFElementMapping.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/extensions/PDFExtensionHandler.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSPainter.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/xml/XMLRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/util/AbstractPaintingState.java
    xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/svg/SVGPainter.java
    xmlgraphics/fop/trunk/status.xml
    xmlgraphics/fop/trunk/test/java/org/apache/fop/fonts/EmbedFontInfoTestCase.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/fonts/FontsTestSuite.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/pdf/PDFDestsTestCase.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/pdf/PDFDictionaryTestCase.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/pdf/PDFPageLabelsTestCase.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/pdf/PDFStreamTestCase.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/pdf/xref/CrossReferenceTableTestCase.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/render/intermediate/AbstractIFPainterTestCase.java

Modified: xmlgraphics/fop/trunk/src/documentation/intermediate-format-ng/fop-intermediate-format-ng-content.xsd
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/documentation/intermediate-format-ng/fop-intermediate-format-ng-content.xsd?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/documentation/intermediate-format-ng/fop-intermediate-format-ng-content.xsd (original)
+++ xmlgraphics/fop/trunk/src/documentation/intermediate-format-ng/fop-intermediate-format-ng-content.xsd Fri Nov  1 14:34:18 2013
@@ -38,6 +38,7 @@
           <xs:complexContent>
             <xs:extension base="mf:contentType">
               <xs:attribute name="transform" type="xs:string"/>
+              <xs:attribute name="layer" type="xs:string"/>
             </xs:extension>
           </xs:complexContent>
         </xs:complexType>

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/area/AreaTreeParser.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/area/AreaTreeParser.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/area/AreaTreeParser.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/area/AreaTreeParser.java Fri Nov  1 14:34:18 2013
@@ -1040,7 +1040,7 @@ public class AreaTreeParser {
         }
 
         private static final Object[] SUBSET_COMMON = new Object[] {
-            Trait.PROD_ID};
+            Trait.PROD_ID, Trait.LAYER};
         private static final Object[] SUBSET_LINK = new Object[] {
             Trait.INTERNAL_LINK, Trait.EXTERNAL_LINK};
         private static final Object[] SUBSET_COLOR = new Object[] {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/area/Trait.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/area/Trait.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/area/Trait.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/area/Trait.java Fri Nov  1 14:34:18 2013
@@ -169,9 +169,11 @@ public final class Trait implements Seri
     /** shift direction trait */
     public static final Integer SHIFT_DIRECTION = 42;
 
+    /** For optional content groups. */
+    public static final Integer LAYER = 43;
 
     /** Maximum value used by trait keys */
-    public static final int MAX_TRAIT_KEY = 42;
+    public static final int MAX_TRAIT_KEY = 43;
 
     private static final TraitInfo[] TRAIT_INFO = new TraitInfo[MAX_TRAIT_KEY + 1];
 
@@ -243,6 +245,7 @@ public final class Trait implements Seri
                 new TraitInfo("block-progression-direction", Direction.class));
         put(SHIFT_DIRECTION,
                 new TraitInfo("shift-direction", Direction.class));
+        put(LAYER, new TraitInfo("layer", String.class));
 
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java Fri Nov  1 14:34:18 2013
@@ -816,8 +816,11 @@ public interface Constants {
     /** Scope for table header */
     int PR_X_HEADER_COLUMN = 290;
 
+    /** For specifying PDF optional content group (layer) binding. */
+    int PR_X_LAYER = 291;
+
     /** Number of property constants defined */
-    int PROPERTY_COUNT = 290;
+    int PROPERTY_COUNT = 291;
 
     // compound property constants
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java Fri Nov  1 14:34:18 2013
@@ -2721,6 +2721,13 @@ public final class FOPropertyMapping imp
         m.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
         m.setDefault("auto");
         addPropertyMaker("z-index", m);
+
+        // fox:layer
+        m  = new StringProperty.Maker(PR_X_LAYER);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("fox:layer", m);
+
     }
 
     private void createShorthandProperties() {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FObj.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FObj.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FObj.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FObj.java Fri Nov  1 14:34:18 2013
@@ -74,7 +74,8 @@ public abstract class FObj extends FONod
     private int bidiLevel = -1;
 
     // The value of properties relevant for all fo objects
-    private String id = null;
+    private String id;
+    private String layer;
     // End of property values
 
     /**
@@ -173,6 +174,7 @@ public abstract class FObj extends FONod
      */
     public void bind(PropertyList pList) throws FOPException {
         id = pList.get(PR_ID).getString();
+        layer = pList.get(PR_X_LAYER).getString();
     }
 
     /**
@@ -583,6 +585,16 @@ public abstract class FObj extends FONod
         return (id != null && id.length() > 0);
     }
 
+    /** @return the "layer" property. */
+    public String getLayer() {
+        return layer;
+    }
+
+    /** @return whether this object has an layer set */
+    public boolean hasLayer() {
+        return (layer != null && layer.length() > 0);
+    }
+
     /** {@inheritDoc} */
     public String getNamespaceURI() {
         return FOElementMapping.URI;

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java Fri Nov  1 14:34:18 2013
@@ -66,6 +66,8 @@ public class ExtensionElementMapping ext
         PROPERTY_ATTRIBUTES.add("border-before-end-radius");
         PROPERTY_ATTRIBUTES.add("border-after-start-radius");
         PROPERTY_ATTRIBUTES.add("border-after-end-radius");
+        //Optional content groups (layers)
+        PROPERTY_ATTRIBUTES.add("layer");
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java Fri Nov  1 14:34:18 2013
@@ -867,6 +867,7 @@ public class BlockContainerLayoutManager
             transferForeignAttributes(viewportBlockArea);
 
             TraitSetter.setProducerID(viewportBlockArea, getBlockContainerFO().getId());
+            TraitSetter.setLayer(viewportBlockArea, getBlockContainerFO().getLayer());
             TraitSetter.addBorders(viewportBlockArea,
                     getBlockContainerFO().getCommonBorderPaddingBackground(),
                     discardBorderBefore, discardBorderAfter, false, false, this);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java Fri Nov  1 14:34:18 2013
@@ -381,6 +381,7 @@ public class BlockLayoutManager extends 
                     getBlockFO().getCommonBorderPaddingBackground(),
                     startIndent, endIndent,
                     this);
+            TraitSetter.setLayer(curBlockArea, getBlockFO().getLayer());
 
             curBlockArea.setLocale(getBlockFO().getCommonHyphenation().getLocale());
             curBlockArea.setLocation(FONode.getLocatorString(getBlockFO().getLocator()));

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/TraitSetter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/TraitSetter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/TraitSetter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/TraitSetter.java Fri Nov  1 14:34:18 2013
@@ -617,4 +617,15 @@ public final class TraitSetter {
             area.addTrait(Trait.PROD_ID, id);
         }
     }
+
+    /**
+     * Sets the optional content group layer as a trait on the area.
+     * @param area the area to set the traits on
+     * @param layer the layer ID to set
+     */
+    public static void setLayer(Area area, String layer) {
+        if (layer != null && layer.length() > 0) {
+            area.addTrait(Trait.LAYER, layer);
+        }
+    }
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java Fri Nov  1 14:34:18 2013
@@ -213,6 +213,7 @@ public class InlineLayoutManager extends
         }
         if (fobj instanceof Inline || fobj instanceof BasicLink) {
             TraitSetter.setProducerID(area, fobj.getId());
+            TraitSetter.setLayer(area, fobj.getLayer());
         }
         return area;
     }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/AbstractPDFStream.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/AbstractPDFStream.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/AbstractPDFStream.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/AbstractPDFStream.java Fri Nov  1 14:34:18 2013
@@ -143,7 +143,7 @@ public abstract class AbstractPDFStream 
      */
     protected int outputStreamData(StreamCache encodedStream, OutputStream out) throws IOException {
         int length = 0;
-        byte[] p = encode("stream\n");
+        byte[] p = encode("\nstream\n");
         out.write(p);
         length += p.length;
 
@@ -186,7 +186,7 @@ public abstract class AbstractPDFStream 
                 throws IOException {
         int bytesWritten = 0;
         //Stream header
-        byte[] buf = encode("stream\n");
+        byte[] buf = encode("\nstream\n");
         out.write(buf);
         bytesWritten += buf.length;
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDictionary.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDictionary.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDictionary.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDictionary.java Fri Nov  1 14:34:18 2013
@@ -131,7 +131,7 @@ public class PDFDictionary extends PDFOb
         } else {
             textBuffer.append('\n');
         }
-        textBuffer.append(">>\n");
+        textBuffer.append(">>");
     }
 
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDocument.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDocument.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDocument.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFDocument.java Fri Nov  1 14:34:18 2013
@@ -155,6 +155,12 @@ public class PDFDocument {
 
     private List<PDFLaunch> launches = new ArrayList<PDFLaunch>();
 
+    private List<PDFLayer> layers;
+
+    private List<PDFNavigator> navigators;
+
+    private List<PDFNavigatorAction> navigatorActions;
+
     private PDFFactory factory;
 
     private FileIDGenerator fileIDGenerator;
@@ -477,6 +483,24 @@ public class PDFDocument {
         if (obj instanceof PDFGoToRemote) {
             this.gotoremotes.add((PDFGoToRemote) obj);
         }
+        if (obj instanceof PDFLayer) {
+            if (this.layers == null) {
+                this.layers = new ArrayList<PDFLayer>();
+            }
+            this.layers.add((PDFLayer) obj);
+        }
+        if (obj instanceof PDFNavigator) {
+            if (this.navigators == null) {
+                this.navigators = new ArrayList<PDFNavigator>();
+            }
+            this.navigators.add((PDFNavigator) obj);
+        }
+        if (obj instanceof PDFNavigatorAction) {
+            if (this.navigatorActions == null) {
+                this.navigatorActions = new ArrayList<PDFNavigatorAction>();
+            }
+            this.navigatorActions.add((PDFNavigatorAction) obj);
+        }
     }
 
     /**
@@ -890,6 +914,34 @@ public class PDFDocument {
     }
 
     /**
+     *
+     */
+    public PDFReference resolveExtensionReference(String id) {
+        if (layers != null) {
+            for (PDFLayer layer : layers) {
+                if (layer.hasId(id)) {
+                    return layer.makeReference();
+                }
+            }
+        }
+        if (navigators != null) {
+            for (PDFNavigator navigator : navigators) {
+                if (navigator.hasId(id)) {
+                    return navigator.makeReference();
+                }
+            }
+        }
+        if (navigatorActions != null) {
+            for (PDFNavigatorAction action : navigatorActions) {
+                if (action.hasId(id)) {
+                    return action.makeReference();
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
      * Writes out the entire document
      *
      * @param stream the OutputStream to output the document to
@@ -1009,7 +1061,7 @@ public class PDFDocument {
         streamIndirectObjects(trailerObjects, stream);
         TrailerDictionary trailerDictionary = createTrailerDictionary();
         long startxref = trailerOutputHelper.outputCrossReferenceObject(stream, trailerDictionary);
-        String trailer = "startxref\n" + startxref + "\n%%EOF\n";
+        String trailer = "\nstartxref\n" + startxref + "\n%%EOF\n";
         stream.write(encode(trailer));
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFFactory.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFFactory.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFFactory.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFFactory.java Fri Nov  1 14:34:18 2013
@@ -1821,4 +1821,28 @@ public class PDFFactory {
         return obj;
     }
 
+    public PDFLayer makeLayer(String id) {
+        PDFLayer layer = new PDFLayer(id);
+        getDocument().registerObject(layer);
+        return layer;
+    }
+
+    public PDFSetOCGStateAction makeSetOCGStateAction(String id) {
+        PDFSetOCGStateAction action = new PDFSetOCGStateAction(id);
+        getDocument().registerObject(action);
+        return action;
+    }
+
+    public PDFTransitionAction makeTransitionAction(String id) {
+        PDFTransitionAction action = new PDFTransitionAction(id);
+        getDocument().registerObject(action);
+        return action;
+    }
+
+    public PDFNavigator makeNavigator(String id) {
+        PDFNavigator navigator = new PDFNavigator(id);
+        getDocument().registerObject(navigator);
+        return navigator;
+    }
+
 }

Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFIdentifiedDictionary.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFIdentifiedDictionary.java?rev=1537948&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFIdentifiedDictionary.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFIdentifiedDictionary.java Fri Nov  1 14:34:18 2013
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+/**
+ * Identified Dictionary.
+ */
+public class PDFIdentifiedDictionary extends PDFDictionary {
+
+    private final String id;
+
+    public PDFIdentifiedDictionary(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return this.id;
+    }
+
+    public boolean hasId(String id) {
+        return (this.id != null) && (id != null) && this.id.equals(id);
+    }
+
+}
+

Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFIdentifiedDictionary.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFLayer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFLayer.java?rev=1537948&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFLayer.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFLayer.java Fri Nov  1 14:34:18 2013
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Optional Content Group Dictionary, which we will call a 'layer'.
+ */
+public class PDFLayer extends PDFIdentifiedDictionary {
+
+    public abstract static class Resolver {
+        private boolean resolved;
+        private PDFLayer layer;
+        private Object extension;
+        public Resolver(PDFLayer layer, Object extension) {
+            this.layer = layer;
+            this.extension = extension;
+        }
+        public PDFLayer getLayer() {
+            return layer;
+        }
+        public Object getExtension() {
+            return extension;
+        }
+        public void resolve() {
+            if (!resolved) {
+                performResolution();
+                resolved = true;
+            }
+        }
+        protected void performResolution() {
+        }
+    }
+
+    private Resolver resolver;
+
+    public PDFLayer(String id) {
+        super(id);
+        put("Type", new PDFName("OCG"));
+    }
+
+    @Override
+    public int output(OutputStream stream) throws IOException {
+        if (resolver != null) {
+            resolver.resolve();
+        }
+        return super.output(stream);
+    }
+
+    public void setResolver(Resolver resolver) {
+        this.resolver = resolver;
+    }
+
+    public void populate(Object name, Object intent, Object usage) {
+        if (name != null) {
+            put("Name", name);
+        }
+        if (intent != null) {
+            put("Intent", intent);
+        }
+        if (usage != null) {
+            put("Usage", usage);
+        }
+    }
+
+}
+

Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFLayer.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigator.java?rev=1537948&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigator.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigator.java Fri Nov  1 14:34:18 2013
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Navigation Node Dictionary, which we call a 'navigator'.
+ * This class is used to for sub-page navigation.
+ */
+public class PDFNavigator extends PDFIdentifiedDictionary {
+
+    public abstract static class Resolver {
+        private boolean resolved;
+        private PDFNavigator navigator;
+        private Object extension;
+        public Resolver(PDFNavigator navigator, Object extension) {
+            this.navigator = navigator;
+            this.extension = extension;
+        }
+        public PDFNavigator getNavigator() {
+            return navigator;
+        }
+        public Object getExtension() {
+            return extension;
+        }
+        public void resolve() {
+            if (!resolved) {
+                performResolution();
+                resolved = true;
+            }
+        }
+        protected void performResolution() {
+        }
+    }
+
+    private Resolver resolver;
+
+    public PDFNavigator(String id) {
+        super(id);
+        put("Type", new PDFName("NavNode"));
+    }
+
+    @Override
+    public int output(OutputStream stream) throws IOException {
+        if (resolver != null) {
+            resolver.resolve();
+        }
+        return super.output(stream);
+    }
+
+    public void setResolver(Resolver resolver) {
+        this.resolver = resolver;
+    }
+
+    public void populate(Object nextAction, Object nextNode, Object prevAction, Object prevNode, Object duration) {
+        if (nextAction != null) {
+            put("NA", nextAction);
+        }
+        if (nextNode != null) {
+            put("Next", nextNode);
+        }
+        if (prevAction != null) {
+            put("PA", prevAction);
+        }
+        if (prevNode != null) {
+            put("Prev", prevNode);
+        }
+        if (duration != null) {
+            put("Dur", duration);
+        }
+    }
+
+}
+

Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigator.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigatorAction.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigatorAction.java?rev=1537948&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigatorAction.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigatorAction.java Fri Nov  1 14:34:18 2013
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+public abstract class PDFNavigatorAction extends PDFIdentifiedDictionary {
+
+    protected PDFNavigatorAction(String id) {
+        super(id);
+    }
+
+}

Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNavigatorAction.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java Fri Nov  1 14:34:18 2013
@@ -44,8 +44,6 @@ import org.apache.fop.util.AbstractPaint
  * previous state then the necessary values can be overridden.
  * The current transform behaves differently to other values as the
  * matrix is combined with the current resolved value.
- * It is impossible to optimise the result without analysing the all
- * the possible combinations after completing.
  */
 public class PDFPaintingState extends org.apache.fop.util.AbstractPaintingState {
 
@@ -187,6 +185,36 @@ public class PDFPaintingState extends or
         return newState;
     }
 
+    public void setLayer(String layer) {
+        getPDFData().setLayer(layer);
+    }
+
+    public String getLayer() {
+        return getPDFData().getLayer();
+    }
+
+    public boolean getLayerChanged() {
+        String layerCurrent = getLayer();
+        if (layerCurrent == null) {
+            return false;
+        } else if (getStateStack().isEmpty()) {
+            return true;
+        } else {
+            for (int i = getStackLevel(); i > 0; --i) {
+                String layerPrev = ((PDFData) getStateStack().get(i - 1)).getLayer();
+                if (layerPrev == null) {
+                    continue;
+                } else {
+                    // Both current and prior are set, so, if same, then we know layer
+                    // didn't change (and can stop search), otherwise it did change.
+                    return !layerCurrent.equals(layerPrev);
+                }
+            }
+            // Current layer set, but no prior saved layer set, so must have changed.
+            return true;
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     protected AbstractData instantiateData() {
@@ -209,7 +237,7 @@ public class PDFPaintingState extends or
         AbstractData data = getData();
         AbstractData copy = (AbstractData)data.clone();
         data.clearTransform();
-        getStateStack().add(copy);
+        getStateStack().push(copy);
     }
 
     private PDFData getPDFData() {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFResources.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFResources.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFResources.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFResources.java Fri Nov  1 14:34:18 2013
@@ -37,8 +37,8 @@ import org.apache.fop.fonts.base14.ZapfD
 /**
  * Class representing a /Resources object.
  *
- * /Resources object contain a list of references to the fonts for the
- * document
+ * /Resources object contain a list of references to the fonts, patterns,
+ * shadings, etc.,  for the document.
  */
 public class PDFResources extends PDFDictionary {
 
@@ -73,6 +73,9 @@ public class PDFResources extends PDFDic
     /** Map of ICC color spaces (key: ICC profile description) */
     protected Map<String, PDFICCBasedColorSpace> iccColorSpaces = new LinkedHashMap<String, PDFICCBasedColorSpace>();
 
+    /** Named properties */
+    protected Map<String, PDFReference> properties = new LinkedHashMap<String, PDFReference>();
+
     /**
      * create a /Resources object.
      *
@@ -191,6 +194,25 @@ public class PDFResources extends PDFDic
         return cs;
     }
 
+    /**
+     * Add a named property.
+     *
+     * @param name name of property
+     * @param property reference to property value
+     */
+    public void addProperty(String name, PDFReference property) {
+        this.properties.put(name, property);
+    }
+
+    /**
+     * Get a named property.
+     *
+     * @param name name of property
+     */
+    public PDFReference getProperty(String name) {
+        return this.properties.get(name);
+    }
+
     @Override
     public int output(OutputStream stream) throws IOException {
         populateDictionary();
@@ -253,6 +275,14 @@ public class PDFResources extends PDFDic
             }
             put("ColorSpace", dict);
         }
+
+        if (!properties.isEmpty()) {
+            PDFDictionary dict = new PDFDictionary(this);
+            for (String name : properties.keySet()) {
+                dict.put(name, properties.get(name));
+            }
+            put("Properties", dict);
+        }
     }
 
 }

Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFSetOCGStateAction.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFSetOCGStateAction.java?rev=1537948&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFSetOCGStateAction.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFSetOCGStateAction.java Fri Nov  1 14:34:18 2013
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class PDFSetOCGStateAction extends PDFNavigatorAction {
+
+    public abstract static class Resolver {
+        private boolean resolved;
+        private PDFSetOCGStateAction action;
+        private Object extension;
+        public Resolver(PDFSetOCGStateAction action, Object extension) {
+            this.action = action;
+            this.extension = extension;
+        }
+        public PDFSetOCGStateAction getAction() {
+            return action;
+        }
+        public Object getExtension() {
+            return extension;
+        }
+        public void resolve() {
+            if (!resolved) {
+                performResolution();
+                resolved = true;
+            }
+        }
+        protected void performResolution() {
+        }
+    }
+
+    private Resolver resolver;
+
+    public PDFSetOCGStateAction(String id) {
+        super(id);
+        put("Type", new PDFName("Action"));
+        put("S", new PDFName("SetOCGState"));
+    }
+
+    @Override
+    public int output(OutputStream stream) throws IOException {
+        if (resolver != null) {
+            resolver.resolve();
+        }
+        return super.output(stream);
+    }
+
+    public void setResolver(Resolver resolver) {
+        this.resolver = resolver;
+    }
+
+    public void populate(Object state, Object preserveRB, Object nextAction) {
+        if (state != null) {
+            put("State", state);
+        }
+        if (preserveRB != null) {
+            put("PreserveRB", preserveRB);
+        }
+        if (nextAction != null) {
+            put("Next", nextAction);
+        }
+    }
+}

Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFSetOCGStateAction.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTransitionAction.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTransitionAction.java?rev=1537948&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTransitionAction.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTransitionAction.java Fri Nov  1 14:34:18 2013
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class PDFTransitionAction extends PDFNavigatorAction {
+
+    public abstract static class Resolver {
+        private boolean resolved;
+        private PDFTransitionAction action;
+        private Object extension;
+        public Resolver(PDFTransitionAction action, Object extension) {
+            this.action = action;
+            this.extension = extension;
+        }
+        public PDFTransitionAction getAction() {
+            return action;
+        }
+        public Object getExtension() {
+            return extension;
+        }
+        public void resolve() {
+            if (!resolved) {
+                performResolution();
+                resolved = true;
+            }
+        }
+        protected void performResolution() {
+        }
+    }
+
+    private Resolver resolver;
+
+    public PDFTransitionAction(String id) {
+        super(id);
+        put("Type", new PDFName("Action"));
+        put("S", new PDFName("Trans"));
+    }
+
+    @Override
+    public int output(OutputStream stream) throws IOException {
+        if (resolver != null) {
+            resolver.resolve();
+        }
+        return super.output(stream);
+    }
+
+    public void setResolver(Resolver resolver) {
+        this.resolver = resolver;
+    }
+
+    public void populate(Object transition, Object nextAction) {
+        if (transition != null) {
+            put("Trans", transition);
+        }
+        if (nextAction != null) {
+            put("Next", nextAction);
+        }
+    }
+}

Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTransitionAction.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java Fri Nov  1 14:34:18 2013
@@ -28,6 +28,7 @@ import java.io.OutputStream;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
+import java.util.Stack;
 
 import org.w3c.dom.Document;
 
@@ -112,8 +113,12 @@ public abstract class AbstractRenderer
     /** the currently active PageViewport */
     protected PageViewport currentPageViewport;
 
+    /* warned XML handlers */
     private Set warnedXMLHandlers;
 
+    /* layers stack */
+    private Stack<String> layers;
+
     /** {@inheritDoc} */
     public abstract void setupFontInfo(FontInfo fontInfo) throws FOPException;
 
@@ -471,6 +476,10 @@ public abstract class AbstractRenderer
      * @param children  The children to render within the block viewport
      */
     protected void renderBlockViewport(BlockViewport bv, List children) {
+        boolean inNewLayer = false;
+        if (maybeStartLayer(bv)) {
+            inNewLayer = true;
+        }
         // clip and position viewport if necessary
         if (bv.getPositioning() == Block.ABSOLUTE) {
             // save positions
@@ -506,6 +515,7 @@ public abstract class AbstractRenderer
             currentIPPosition = saveIP;
             currentBPPosition = saveBP + bv.getAllocBPD();
         }
+        maybeEndLayer(bv, inNewLayer);
     }
 
     /**
@@ -573,6 +583,10 @@ public abstract class AbstractRenderer
     protected void renderBlock(Block block) {
         assert block != null;
         List children = block.getChildAreas();
+        boolean inNewLayer = false;
+        if (maybeStartLayer(block)) {
+            inNewLayer = true;
+        }
         if (block instanceof BlockViewport) {
             if (children != null) {
                 renderBlockViewport((BlockViewport) block, children);
@@ -607,6 +621,45 @@ public abstract class AbstractRenderer
                 currentBPPosition = saveBP + block.getAllocBPD();
             }
         }
+        maybeEndLayer(block, inNewLayer);
+    }
+
+    /**
+     * Establish new optional content group layer.
+     * @param layer name of layer
+     */
+    protected abstract void startLayer(String layer);
+
+    /**
+     * Finish current optional content group layer.
+     */
+    protected abstract void endLayer();
+
+    protected boolean maybeStartLayer(Area area) {
+        String layer = (String) area.getTrait(Trait.LAYER);
+        if (layer != null) {
+            if (layers == null) {
+                layers = new Stack<String>();
+            }
+            if (layers.empty() || !layers.peek().equals(layer)) {
+                layers.push(layer);
+                startLayer(layer);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected void maybeEndLayer(Area area, boolean inNewLayer) {
+        if (inNewLayer) {
+            assert layers != null;
+            assert !layers.empty();
+            String layer = (String) area.getTrait(Trait.LAYER);
+            assert layer != null;
+            assert layers.peek().equals(layer);
+            endLayer();
+            layers.pop();
+        }
     }
 
     /**
@@ -746,6 +799,10 @@ public abstract class AbstractRenderer
      * @param ip the inline parent to render
      */
     protected void renderInlineParent(InlineParent ip) {
+        boolean inNewLayer = false;
+        if (maybeStartLayer(ip)) {
+            inNewLayer = true;
+        }
         int level = ip.getBidiLevel();
         List children = ip.getChildAreas();
         renderInlineAreaBackAndBorders(ip);
@@ -782,6 +839,7 @@ public abstract class AbstractRenderer
         }
         currentIPPosition = saveIP + ip.getAllocIPD();
         currentBPPosition = saveBP;
+        maybeEndLayer(ip, inNewLayer);
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPPainter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPPainter.java Fri Nov  1 14:34:18 2013
@@ -164,7 +164,7 @@ public class AFPPainter extends Abstract
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform transform) throws IFException {
+    public void startGroup(AffineTransform transform, String layer) throws IFException {
         try {
             saveGraphicsState();
             concatenateTransformationMatrix(transform);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java Fri Nov  1 14:34:18 2013
@@ -126,8 +126,8 @@ public abstract class AbstractIFPainter<
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform[] transforms) throws IFException {
-        startGroup(combine(transforms));
+    public void startGroup(AffineTransform[] transforms, String layer) throws IFException {
+        startGroup(combine(transforms), layer);
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFGraphicContext.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFGraphicContext.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFGraphicContext.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFGraphicContext.java Fri Nov  1 14:34:18 2013
@@ -89,6 +89,7 @@ public class IFGraphicContext extends Gr
     public static class Group {
 
         private AffineTransform[] transforms;
+        private String layer;
 
         /**
          * Construct a Group.
@@ -106,6 +107,16 @@ public class IFGraphicContext extends Gr
             this(new AffineTransform[] {transform});
         }
 
+        /**
+         * Construct a layer Group, i.e., a Group with no transforms
+         * but with a optional content group layer label.
+         * @param layer a layer label
+         */
+        public Group(String layer) {
+            this();
+            this.layer = layer;
+        }
+
         /** Default constructor. */
         public Group() {
             this(EMPTY_TRANSFORM_ARRAY);
@@ -116,12 +127,17 @@ public class IFGraphicContext extends Gr
             return this.transforms;
         }
 
+        /** @return layer */
+        public String getLayer() {
+            return this.layer;
+        }
+
         /**
          * @param painter a painter
          * @throws IFException in not caught
          */
         public void start(IFPainter painter) throws IFException {
-            painter.startGroup(transforms);
+            painter.startGroup(transforms, layer);
         }
 
         /**
@@ -136,6 +152,11 @@ public class IFGraphicContext extends Gr
         public String toString() {
             StringBuffer sb = new StringBuffer("group: ");
             IFUtil.toString(getTransforms(), sb);
+            if ((layer != null) && (layer.length() > 0)) {
+                sb.append(" layer(");
+                sb.append(layer);
+                sb.append(')');
+            }
             return sb.toString();
         }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFPainter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFPainter.java Fri Nov  1 14:34:18 2013
@@ -113,19 +113,21 @@ public interface IFPainter {
     /**
      * Starts a new group of graphical elements. Corresponds to SVG's g element.
      * @param transforms a series of transformation matrices establishing the new coordinate system
+     * @param layer an optional layer label (or null if none)
      * @throws IFException if an error occurs while handling this element
      */
-    void startGroup(AffineTransform[] transforms) throws IFException;
+    void startGroup(AffineTransform[] transforms, String layer) throws IFException;
 
     /**
      * Starts a new group of graphical elements. Corresponds to SVG's g element.
      * @param transform the transformation matrix establishing the new coordinate system
+     * @param layer an optional layer label (or null if none)
      * @throws IFException if an error occurs while handling this element
      */
-    void startGroup(AffineTransform transform) throws IFException;
+    void startGroup(AffineTransform transform, String layer) throws IFException;
 
     /**
-     * Ends the current group and restores the previous coordinate system.
+     * Ends the current group and restores the previous coordinate system (and layer).
      * @throws IFException if an error occurs while handling this element
      */
     void endGroup() throws IFException;

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFParser.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFParser.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFParser.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFParser.java Fri Nov  1 14:34:18 2013
@@ -592,7 +592,8 @@ public class IFParser implements IFConst
                 String transform = attributes.getValue("transform");
                 AffineTransform[] transforms
                     = AffineTransformArrayParser.createAffineTransform(transform);
-                painter.startGroup(transforms);
+                String layer = attributes.getValue("layer");
+                painter.startGroup(transforms, layer);
             }
 
             public void endElement() throws IFException {
@@ -800,8 +801,8 @@ public class IFParser implements IFConst
                     }
                     painter.drawImage(uri, new Rectangle(x, y, width, height));
                 }
-                resetForeignAttributes();
                 resetStructureTreeElement();
+                resetForeignAttributes();
                 inForeignObject = false;
             }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFRenderer.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFRenderer.java Fri Nov  1 14:34:18 2013
@@ -742,6 +742,12 @@ public class IFRenderer extends Abstract
     protected void renderBlockViewport(BlockViewport bv, List children) {
         //Essentially the same code as in the super class but optimized for the IF
 
+        // Handle new layer.
+        boolean inNewLayer = false;
+        if (maybeStartLayer(bv)) {
+            inNewLayer = true;
+        }
+
         //This is the content-rect
         Dimension dim = new Dimension(bv.getIPD(), bv.getBPD());
         viewportDimensionStack.push(dim);
@@ -842,6 +848,7 @@ public class IFRenderer extends Abstract
             currentBPPosition += bv.getAllocBPD();
         }
         viewportDimensionStack.pop();
+        maybeEndLayer(bv, inNewLayer);
     }
 
     /** {@inheritDoc} */
@@ -849,7 +856,7 @@ public class IFRenderer extends Abstract
         StructureTreeElement structElem
                 = (StructureTreeElement) viewport.getTrait(Trait.STRUCTURE_TREE_ELEMENT);
         establishStructureTreeElement(structElem);
-        pushdID(viewport);
+        pushID(viewport);
         Dimension dim = new Dimension(viewport.getIPD(), viewport.getBPD());
         viewportDimensionStack.push(dim);
         super.renderInlineViewport(viewport);
@@ -896,9 +903,26 @@ public class IFRenderer extends Abstract
     }
 
     /** {@inheritDoc} */
+    protected void startLayer(String layer) {
+        if (log.isTraceEnabled()) {
+            log.trace("startLayer() layer=" + layer);
+        }
+        saveGraphicsState();
+        pushGroup(new IFGraphicContext.Group(layer));
+    }
+
+    /** {@inheritDoc} */
+    protected void endLayer() {
+        if (log.isTraceEnabled()) {
+            log.trace("endLayer()");
+        }
+        restoreGraphicsState();
+    }
+
+    /** {@inheritDoc} */
     protected void renderInlineArea(InlineArea inlineArea) {
         saveInlinePosIfTargetable(inlineArea);
-        pushdID(inlineArea);
+        pushID(inlineArea);
         super.renderInlineArea(inlineArea);
         popID(inlineArea);
     }
@@ -965,7 +989,7 @@ public class IFRenderer extends Abstract
             log.trace("renderBlock() " + block);
         }
         saveBlockPosIfTargetable(block);
-        pushdID(block);
+        pushID(block);
         IFContext context = documentHandler.getContext();
         Locale oldLocale = context.getLanguage();
         context.setLanguage(block.getLocale());
@@ -977,7 +1001,7 @@ public class IFRenderer extends Abstract
         popID(block);
     }
 
-    private void pushdID(Area area) {
+    private void pushID(Area area) {
         String prodID = (String) area.getTrait(Trait.PROD_ID);
         if (prodID != null) {
             ids.push(prodID);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFSerializer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFSerializer.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFSerializer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/intermediate/IFSerializer.java Fri Nov  1 14:34:18 2013
@@ -428,21 +428,24 @@ implements IFConstants, IFPainter, IFDoc
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform[] transforms) throws IFException {
-        startGroup(IFUtil.toString(transforms));
+    public void startGroup(AffineTransform[] transforms, String layer) throws IFException {
+        startGroup(IFUtil.toString(transforms), layer);
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform transform) throws IFException {
-        startGroup(IFUtil.toString(transform));
+    public void startGroup(AffineTransform transform, String layer) throws IFException {
+        startGroup(IFUtil.toString(transform), layer);
     }
 
-    private void startGroup(String transform) throws IFException {
+    private void startGroup(String transform, String layer) throws IFException {
         try {
             AttributesImpl atts = new AttributesImpl();
             if (transform != null && transform.length() > 0) {
                 addAttribute(atts, "transform", transform);
             }
+            if (layer != null && layer.length() > 0) {
+                addAttribute(atts, "layer", layer);
+            }
             handler.startElement(EL_GROUP, atts);
         } catch (SAXException e) {
             throw new IFException("SAX error in startGroup()", e);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DPainter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DPainter.java Fri Nov  1 14:34:18 2013
@@ -143,7 +143,7 @@ public class Java2DPainter extends Abstr
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform transform) throws IFException {
+    public void startGroup(AffineTransform transform, String layer) throws IFException {
         saveGraphicsState();
         try {
             concatenateTransformationMatrix(transform);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java Fri Nov  1 14:34:18 2013
@@ -476,6 +476,14 @@ public abstract class Java2DRenderer ext
     }
 
     /** {@inheritDoc} */
+    protected void startLayer(String layer) {
+    }
+
+    /** {@inheritDoc} */
+    protected void endLayer() {
+    }
+
+    /** {@inheritDoc} */
     protected List breakOutOfStateStack() {
         log.debug("Block.FIXED --> break out");
         List breakOutList;

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLPainter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLPainter.java Fri Nov  1 14:34:18 2013
@@ -126,7 +126,7 @@ public class PCLPainter extends Abstract
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform transform) throws IFException {
+    public void startGroup(AffineTransform transform, String layer) throws IFException {
         saveGraphicsState();
         try {
             concatenateTransformationMatrix(transform);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java Fri Nov  1 14:34:18 2013
@@ -30,6 +30,7 @@ import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFFilterList;
 import org.apache.fop.pdf.PDFNumber;
 import org.apache.fop.pdf.PDFPaintingState;
+import org.apache.fop.pdf.PDFReference;
 import org.apache.fop.pdf.PDFResourceContext;
 import org.apache.fop.pdf.PDFStream;
 import org.apache.fop.pdf.PDFText;
@@ -55,7 +56,7 @@ public class PDFContentGenerator {
     private PDFColorHandler colorHandler;
 
     /** drawing state */
-    protected PDFPaintingState currentState = null;
+    protected PDFPaintingState currentState;
     /** Text generation utility holding the current font status */
     protected PDFTextUtil textutil;
 
@@ -156,15 +157,23 @@ public class PDFContentGenerator {
      */
     protected void comment(String text) {
         if (WRITE_COMMENTS) {
-            currentStream.add("% " + text + "\n");
+            getStream().add("% " + text + "\n");
         }
     }
 
     /** Save graphics state. */
     protected void saveGraphicsState() {
         endTextObject();
-        currentState.save();
-        currentStream.add("q\n");
+        getState().save();
+        getStream().add("q\n");
+    }
+
+    /** Save graphics state with optional layer. */
+    protected void saveGraphicsState(String layer) {
+        endTextObject();
+        getState().save();
+        maybeBeginLayer(layer);
+        getStream().add("q\n");
     }
 
     /**
@@ -174,9 +183,9 @@ public class PDFContentGenerator {
      */
     protected void saveGraphicsState(String structElemType, int sequenceNum) {
         endTextObject();
-        currentState.save();
+        getState().save();
         beginMarkedContentSequence(structElemType, sequenceNum);
-        currentStream.add("q\n");
+        getStream().add("q\n");
     }
 
     /**
@@ -208,18 +217,18 @@ public class PDFContentGenerator {
         if (structElemType != null) {
             String actualTextProperty = actualText == null ? ""
                     : " /ActualText " + PDFText.escapeText(actualText);
-            currentStream.add(structElemType + " <</MCID " + String.valueOf(mcid)
+            getStream().add(structElemType + " <</MCID " + String.valueOf(mcid)
                     + actualTextProperty + ">>\n"
                     + "BDC\n");
         } else {
-            currentStream.add("/Artifact\nBMC\n");
+            getStream().add("/Artifact\nBMC\n");
             this.inArtifactMode = true;
         }
         this.inMarkedContentSequence = true;
     }
 
     void endMarkedContentSequence() {
-        currentStream.add("EMC\n");
+        getStream().add("EMC\n");
         this.inMarkedContentSequence = false;
         this.inArtifactMode = false;
     }
@@ -231,9 +240,10 @@ public class PDFContentGenerator {
      */
     protected void restoreGraphicsState(boolean popState) {
         endTextObject();
-        currentStream.add("Q\n");
+        getStream().add("Q\n");
+        maybeEndLayer();
         if (popState) {
-            currentState.restore();
+            getState().restore();
         }
     }
 
@@ -251,11 +261,42 @@ public class PDFContentGenerator {
      */
     protected void restoreGraphicsStateAccess() {
         endTextObject();
-        currentStream.add("Q\n");
+        getStream().add("Q\n");
         if (this.inMarkedContentSequence) {
             endMarkedContentSequence();
         }
-        currentState.restore();
+        getState().restore();
+    }
+
+    private void maybeBeginLayer(String layer) {
+        if ((layer != null) && (layer.length() > 0)) {
+            getState().setLayer(layer);
+            beginOptionalContent(layer);
+        }
+    }
+
+    private void maybeEndLayer() {
+        if (getState().getLayerChanged()) {
+            endOptionalContent();
+        }
+    }
+
+    private int ocNameIndex = 0;
+
+    private void beginOptionalContent(String layerId) {
+        String name;
+        PDFReference layer = document.resolveExtensionReference(layerId);
+        if (layer != null) {
+            name = "oc" + ++ocNameIndex;
+            document.getResources().addProperty(name, layer);
+        } else {
+            name = "unknown";
+        }
+        getStream().add("/OC /" + name + " BDC\n");
+    }
+
+    private void endOptionalContent() {
+        getStream().add("EMC\n");
     }
 
     /** Indicates the beginning of a text object. */
@@ -310,8 +351,8 @@ public class PDFContentGenerator {
     public void concatenate(AffineTransform transform) {
         this.transform = transform;
         if (!transform.isIdentity()) {
-            currentState.concatenate(transform);
-            currentStream.add(CTMHelper.toPDFString(transform, false) + " cm\n");
+            getState().concatenate(transform);
+            getStream().add(CTMHelper.toPDFString(transform, false) + " cm\n");
         }
     }
 
@@ -333,7 +374,7 @@ public class PDFContentGenerator {
      * @param content the PDF content
      */
     public void add(String content) {
-        currentStream.add(content);
+        getStream().add(content);
     }
 
     /**
@@ -350,9 +391,9 @@ public class PDFContentGenerator {
      * @param width line width in points
      */
     public void updateLineWidth(float width) {
-        if (currentState.setLineWidth(width)) {
+        if (getState().setLineWidth(width)) {
             //Only write if value has changed WRT the current line width
-            currentStream.add(format(width) + " w\n");
+            getStream().add(format(width) + " w\n");
         }
     }
 
@@ -362,7 +403,7 @@ public class PDFContentGenerator {
      */
     public void updateCharacterSpacing(float value) {
         if (getState().setCharacterSpacing(value)) {
-            currentStream.add(format(value) + " Tc\n");
+            getStream().add(format(value) + " Tc\n");
         }
     }
 
@@ -400,7 +441,7 @@ public class PDFContentGenerator {
         if (pdf != null) {
             colorHandler.establishColor(pdf, col, fill);
         } else {
-            setColor(col, fill, this.currentStream);
+            setColor(col, fill, getStream());
         }
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java Fri Nov  1 14:34:18 2013
@@ -306,8 +306,7 @@ public class PDFDocumentHandler extends 
                 throw new IFException("Error adding embedded file: " + embeddedFile.getSrc(), ioe);
             }
         } else if (extension instanceof PDFDictionaryAttachment) {
-            PDFDictionaryAttachment dictionaryExtension = (PDFDictionaryAttachment) extension;
-            pdfUtil.renderDictionaryExtension(dictionaryExtension, currentPage);
+            pdfUtil.renderDictionaryExtension((PDFDictionaryAttachment) extension, currentPage);
         } else if (extension != null) {
             log.debug("Don't know how to handle extension object. Ignoring: "
                     + extension + " (" + extension.getClass().getName() + ")");

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFPainter.java?rev=1537948&r1=1537947&r2=1537948&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFPainter.java Fri Nov  1 14:34:18 2013
@@ -143,8 +143,8 @@ public class PDFPainter extends Abstract
     }
 
     /** {@inheritDoc} */
-    public void startGroup(AffineTransform transform) throws IFException {
-        generator.saveGraphicsState();
+    public void startGroup(AffineTransform transform, String layer) throws IFException {
+        generator.saveGraphicsState(layer);
         generator.concatenate(toPoints(transform));
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org