]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fixed regression causing bad positioning of block-containers if used as descendant...
authorJeremias Maerki <jeremias@apache.org>
Thu, 24 Apr 2008 16:08:53 +0000 (16:08 +0000)
committerJeremias Maerki <jeremias@apache.org>
Thu, 24 Apr 2008 16:08:53 +0000 (16:08 +0000)
See also: http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-users/200804.mbox/%3c20080424164128.973A.DEV@jeremias-maerki.ch%3e

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_95@651302 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
src/java/org/apache/fop/render/AbstractRenderer.java
src/java/org/apache/fop/render/afp/AFPRenderer.java
src/java/org/apache/fop/render/pcl/PCLRenderer.java
src/java/org/apache/fop/render/xml/XMLRenderer.java
status.xml
test/layoutengine/standard-testcases/table-cell_bc-child.xml [new file with mode: 0644]

index 9e13476f64c3015ff2d3c8acb1d0e1fccc41af84..ca9c6af97c68f78ee0af8973a24a90c5e9aaf16f 100644 (file)
@@ -521,6 +521,41 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
         }
     }
 
+    /** {@inheritDoc} */
+    protected void renderReferenceArea(Block block) {
+        // save position and offset
+        int saveIP = currentIPPosition;
+        int saveBP = currentBPPosition;
+
+        //Establish a new coordinate system
+        AffineTransform at = new AffineTransform();
+        at.translate(currentIPPosition, currentBPPosition);
+        at.translate(block.getXOffset(), block.getYOffset());
+        at.translate(0, block.getSpaceBefore());
+        
+        if (!at.isIdentity()) {
+            saveGraphicsState();
+            concatenateTransformationMatrix(mptToPt(at));
+        }
+
+        currentIPPosition = 0;
+        currentBPPosition = 0;
+        handleBlockTraits(block);
+
+        List children = block.getChildAreas();
+        if (children != null) {
+            renderBlocks(block, children);
+        }
+
+        if (!at.isIdentity()) {
+            restoreGraphicsState();
+        }
+        
+        // stacked and relative blocks effect stacking
+        currentIPPosition = saveIP;
+        currentBPPosition = saveBP;
+    }
+    
     /**
      * Concatenates the current transformation matrix with the given one, therefore establishing
      * a new coordinate system.
index 32c4b33c4b5d233cf122d87dfb8889c18efe43e8..7fa62dd1122c1737b55fc52aec46a05fd4a0bbb7 100644 (file)
@@ -481,6 +481,13 @@ public abstract class AbstractRenderer
         }
     }
 
+    /**
+     * Renders a block area that represents a reference area. The reference area establishes
+     * a new coordinate system.
+     * @param block the block area
+     */
+    protected abstract void renderReferenceArea(Block block);
+    
     /**
      * Renders a list of block areas.
      *
@@ -549,6 +556,8 @@ public abstract class AbstractRenderer
                 // simply move position
                 currentBPPosition += block.getAllocBPD();
             }
+        } else if (Boolean.TRUE.equals(block.getTrait(Trait.IS_REFERENCE_AREA))) {
+            renderReferenceArea(block);
         } else {
             // save position and offset
             int saveIP = currentIPPosition;
index 20587349375145b762e251209010fb89566642a7..cbf0beb3a78acc166e65e878f17f712a6707a0a9 100644 (file)
@@ -587,6 +587,45 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
         }
     }
 
+    /** {@inheritDoc} */
+    protected void renderReferenceArea(Block block) {
+        //TODO Remove this method once concatenateTransformationMatrix() is implemented 
+        
+        // save position and offset
+        int saveIP = currentIPPosition;
+        int saveBP = currentBPPosition;
+
+        //Establish a new coordinate system
+        AffineTransform at = new AffineTransform();
+        at.translate(currentIPPosition, currentBPPosition);
+        at.translate(block.getXOffset(), block.getYOffset());
+        at.translate(0, block.getSpaceBefore());
+        
+        if (!at.isIdentity()) {
+            Rectangle2D contentRect
+                = new Rectangle2D.Double(at.getTranslateX(), at.getTranslateY(),
+                        block.getAllocIPD(), block.getAllocBPD());
+            pushViewPortPos(new ViewPortPos(contentRect, new CTM(at)));
+        }
+
+        currentIPPosition = 0;
+        currentBPPosition = 0;
+        handleBlockTraits(block);
+
+        List children = block.getChildAreas();
+        if (children != null) {
+            renderBlocks(block, children);
+        }
+
+        if (!at.isIdentity()) {
+            popViewPortPos();
+        }
+        
+        // stacked and relative blocks effect stacking
+        currentIPPosition = saveIP;
+        currentBPPosition = saveBP;
+    }
+    
     /** {@inheritDoc} */
     protected void concatenateTransformationMatrix(AffineTransform at) {
         //Not used here since AFPRenderer defines its own renderBlockViewport() method.
index 1d606e9196cdfc97329acb7a7399a097669b70b7..1d46374b1d53feb62be4b80e8f8aaa0013b0641c 100644 (file)
@@ -1005,6 +1005,46 @@ public class PCLRenderer extends PrintRenderer {
         //currentFontName = saveFontName;
     }
 
+    /** {@inheritDoc} */
+    protected void renderReferenceArea(Block block) {
+        //TODO This is the same code as in AbstractPathOrientedRenderer
+        //So there's some optimization potential but not otherwise PCLRenderer is a little
+        //difficult to derive from AbstractPathOrientedRenderer. Maybe an additional layer
+        //between PrintRenderer and AbstractPathOrientedRenderer is necessary.
+        
+        // save position and offset
+        int saveIP = currentIPPosition;
+        int saveBP = currentBPPosition;
+
+        //Establish a new coordinate system
+        AffineTransform at = new AffineTransform();
+        at.translate(currentIPPosition, currentBPPosition);
+        at.translate(block.getXOffset(), block.getYOffset());
+        at.translate(0, block.getSpaceBefore());
+        
+        if (!at.isIdentity()) {
+            saveGraphicsState();
+            concatenateTransformationMatrix(mptToPt(at));
+        }
+
+        currentIPPosition = 0;
+        currentBPPosition = 0;
+        handleBlockTraits(block);
+
+        List children = block.getChildAreas();
+        if (children != null) {
+            renderBlocks(block, children);
+        }
+
+        if (!at.isIdentity()) {
+            restoreGraphicsState();
+        }
+        
+        // stacked and relative blocks effect stacking
+        currentIPPosition = saveIP;
+        currentBPPosition = saveBP;
+    }
+    
     /**
      * Concatenates the current transformation matrix with the given one, therefore establishing
      * a new coordinate system.
index 66cce0ae1815d532b0e00eef29c5cfdbfc039103..7798eef92124638ad8810805b20a71a585f95eae 100644 (file)
@@ -754,9 +754,17 @@ public class XMLRenderer extends PrintRenderer {
         endElement("flow");
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
+    protected void renderReferenceArea(Block block) {
+        handleBlockTraits(block);
+
+        List children = block.getChildAreas();
+        if (children != null) {
+            renderBlocks(block, children);
+        }
+    }
+    
+    /** {@inheritDoc} */
     protected void renderBlock(Block block) {
         atts.clear();
         addAreaAttributes(block);
index fafd67543b0c8943cc6158cea2495119972e910f..7b5965defbb5486bd741defff851b7962adcdb78 100644 (file)
       -->
     <!--/release-->
     <release version="0.95" date="TBD">
+      <action context="Renderers" dev="JM" type="fix">
+        Fixed regression causing bad positioning of block-containers if used as descendant
+        of a table-cell.
+      </action>
       <action context="Fonts" dev="JM" type="fix">
         Fixed text extraction problem with ZapfDingbats and Symbol font in PDF output.
       </action>
diff --git a/test/layoutengine/standard-testcases/table-cell_bc-child.xml b/test/layoutengine/standard-testcases/table-cell_bc-child.xml
new file mode 100644 (file)
index 0000000..eb199c7
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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$ -->
+<testcase visual="only">
+  <info>
+    <p>
+      This test checks the rendering of block viewports in reference areas generated
+      by table-cells. This does not test the layout engine, only the renderer.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in" margin="20pt">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="normal">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:table table-layout="fixed" width="4in" background-color="lightgray"
+                space-before="2in" space-before.conditionality="retain">
+            <fo:table-column column-width="100%"/>
+            <fo:table-body>
+              <fo:table-row>
+                <fo:table-cell background-color="rgb(230, 230, 255)">
+                  <fo:block-container absolute-position="absolute" width="100%" height="2em">
+                    <fo:block color="red">No red text should be visible!</fo:block>
+                  </fo:block-container>
+                  <fo:block color="green">No red text should be visible!</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row>
+                <fo:table-cell padding="10pt" background-color="rgb(230, 255, 230)">
+                  <fo:block-container absolute-position="absolute" width="100%" height="2em" top="10pt">
+                    <fo:block color="red">No red text should be visible!</fo:block>
+                  </fo:block-container>
+                  <fo:block color="green">No red text should be visible!</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <!-- Dummy test. This test is only useful with BatchDiffer. -->
+    <eval expected="1" xpath="count(//pageViewport)"/>
+  </checks>
+</testcase>