]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fixed positioning of absolutely positioned block-containers in multi-column documents.
authorJeremias Maerki <jeremias@apache.org>
Thu, 5 Jun 2008 07:06:37 +0000 (07:06 +0000)
committerJeremias Maerki <jeremias@apache.org>
Thu, 5 Jun 2008 07:06:37 +0000 (07:06 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_95@663482 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
src/java/org/apache/fop/render/afp/AFPRenderer.java
src/java/org/apache/fop/render/pcl/PCLRenderer.java
status.xml
test/layoutengine/standard-testcases/block-container_absolute-position_multi-column.xml [new file with mode: 0644]

index ca9c6af97c68f78ee0af8973a24a90c5e9aaf16f..d6be016f62737d00dfbfb9c1a7cb0f07fec9cd4e 100644 (file)
@@ -36,6 +36,7 @@ import org.apache.fop.area.Area;
 import org.apache.fop.area.Block;
 import org.apache.fop.area.BlockViewport;
 import org.apache.fop.area.CTM;
+import org.apache.fop.area.NormalFlow;
 import org.apache.fop.area.RegionViewport;
 import org.apache.fop.area.Trait;
 import org.apache.fop.area.inline.ForeignObject;
@@ -556,6 +557,34 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
         currentBPPosition = saveBP;
     }
     
+    /** {@inheritDoc} */
+    protected void renderFlow(NormalFlow flow) {
+        // save position and offset
+        int saveIP = currentIPPosition;
+        int saveBP = currentBPPosition;
+
+        //Establish a new coordinate system
+        AffineTransform at = new AffineTransform();
+        at.translate(currentIPPosition, currentBPPosition);
+        
+        if (!at.isIdentity()) {
+            saveGraphicsState();
+            concatenateTransformationMatrix(mptToPt(at));
+        }
+
+        currentIPPosition = 0;
+        currentBPPosition = 0;
+        super.renderFlow(flow);
+        
+        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 dc92e0377d3758b4d79d1ec983909f25fda82394..edffc125efa1e32b29df0c6ab0eb3d5ef83359e0 100644 (file)
@@ -59,6 +59,7 @@ import org.apache.fop.area.Block;
 import org.apache.fop.area.BlockViewport;
 import org.apache.fop.area.BodyRegion;
 import org.apache.fop.area.CTM;
+import org.apache.fop.area.NormalFlow;
 import org.apache.fop.area.OffDocumentItem;
 import org.apache.fop.area.PageViewport;
 import org.apache.fop.area.RegionReference;
@@ -624,6 +625,37 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
         currentBPPosition = saveBP;
     }
     
+    /** {@inheritDoc} */
+    protected void renderFlow(NormalFlow flow) {
+        // save position and offset
+        int saveIP = currentIPPosition;
+        int saveBP = currentBPPosition;
+
+        //Establish a new coordinate system
+        AffineTransform at = new AffineTransform();
+        at.translate(currentIPPosition, currentBPPosition);
+        
+        if (!at.isIdentity()) {
+            Rectangle2D contentRect
+                = new Rectangle2D.Double(at.getTranslateX(), at.getTranslateY(),
+                        flow.getAllocIPD(), flow.getAllocBPD());
+            pushViewPortPos(new ViewPortPos(contentRect, new CTM(at)));
+        }
+
+        currentIPPosition = 0;
+        currentBPPosition = 0;
+        super.renderFlow(flow);
+        
+        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 1d46374b1d53feb62be4b80e8f8aaa0013b0641c..d9c0de8bcfd4e7d90f3f51fee4027e950f863aca 100644 (file)
@@ -65,6 +65,7 @@ import org.apache.fop.area.Area;
 import org.apache.fop.area.Block;
 import org.apache.fop.area.BlockViewport;
 import org.apache.fop.area.CTM;
+import org.apache.fop.area.NormalFlow;
 import org.apache.fop.area.PageViewport;
 import org.apache.fop.area.RegionViewport;
 import org.apache.fop.area.Trait;
@@ -1045,6 +1046,39 @@ public class PCLRenderer extends PrintRenderer {
         currentBPPosition = saveBP;
     }
     
+    /** {@inheritDoc} */
+    protected void renderFlow(NormalFlow flow) {
+        //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);
+        
+        if (!at.isIdentity()) {
+            saveGraphicsState();
+            concatenateTransformationMatrix(mptToPt(at));
+        }
+
+        currentIPPosition = 0;
+        currentBPPosition = 0;
+        super.renderFlow(flow);
+        
+        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 8ab5c8710af938c63638a5abea29684689bde27f..5350284bfd137003af439b0b0f28f6bd03ded78c 100644 (file)
@@ -60,6 +60,9 @@
       -->
     <!--/release-->
     <release version="0.95" date="TBD">
+      <action context="Renderers" dev="JM" type="fix">
+        Fixed positioning of absolutely positioned block-containers in multi-column documents.
+      </action>
       <action context="Renderers" dev="JM" type="fix">
         Fixed rendering of fixed block-containers in AFP output.
       </action>
diff --git a/test/layoutengine/standard-testcases/block-container_absolute-position_multi-column.xml b/test/layoutengine/standard-testcases/block-container_absolute-position_multi-column.xml
new file mode 100644 (file)
index 0000000..e3b6fb4
--- /dev/null
@@ -0,0 +1,71 @@
+<?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>
+  <info>
+    <p>
+      This test checks absolutely positioned block-containers in multi-column documents.
+    </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="0.1in">
+          <fo:region-body column-count="2" column-gap="0.2in"/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="normal">
+        <fo:flow flow-name="xsl-region-body" text-align="justify">
+          <fo:block background-color="yellow">
+            This should not have any line floating over it! This should not have any
+            line floating over it! This should not have any line floating over it! This
+            should not have any line floating over it!
+          </fo:block>
+          <fo:block span="all" background-color="orange">
+            <fo:block padding-top="0.5em" padding-bottom="0.5em">
+              This should not have any line floating over it! This should not have any
+              line floating over it! This should not have any line floating over
+              it!<fo:block />
+            </fo:block> 
+          </fo:block>
+          <fo:block background-color="yellow">
+            This should not have any line floating over it! This should not have any
+            line floating over it! This should not have any line floating over it! This
+            should not have any line floating over it!
+          </fo:block>
+          <fo:block-container absolute-position="absolute"
+            left="2.5in - 0.1in - 0.025in" top="auto" width="0.05in" height="100%" background-color="red">
+            <fo:block/>
+          </fo:block-container>
+          <fo:block-container absolute-position="absolute" left="2.5in - 0.1in" top="auto"
+            reference-orientation="90">
+            <fo:block width="100%" line-height="1pt" background-color="black"
+              height="1pt">&#xA0;</fo:block>
+          </fo:block-container>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <!--
+      This test is only visually interesting! Visually check that the block container begins
+      directly under the spanned block!
+    -->
+    <eval expected="1" xpath="count(//pageViewport)"/>
+  </checks>
+</testcase>