]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Bugzilla #49885:
authorJeremias Maerki <jeremias@apache.org>
Tue, 7 Sep 2010 13:45:39 +0000 (13:45 +0000)
committerJeremias Maerki <jeremias@apache.org>
Tue, 7 Sep 2010 13:45:39 +0000 (13:45 +0000)
Fixed retrieval of available BPD for cases spanning columns and multiple pages with differing page masters.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@993357 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/area/PageViewport.java
src/java/org/apache/fop/layoutmgr/Page.java
src/java/org/apache/fop/layoutmgr/PageBreaker.java
src/java/org/apache/fop/layoutmgr/PageProvider.java
status.xml
test/layoutengine/standard-testcases/region-body_column-count_span_4.xml [new file with mode: 0644]

index 63740386e07c5e6a0103eb28b428f55bfed53e18..bccae8754dbb5a69bca5855993a4c3f7fd0c6ded 100644 (file)
@@ -95,8 +95,10 @@ public class PageViewport extends AreaTreeObject implements Resolvable, Cloneabl
      * @param pageNumber the page number
      * @param pageStr String representation of the page number
      * @param blank true if this is a blank page
+     * @param spanAll true if the first span area spans all columns
      */
-    public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr, boolean blank) {
+    public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr,
+            boolean blank, boolean spanAll) {
         this.simplePageMasterName = spm.getMasterName();
         setExtensionAttachments(spm.getExtensionAttachments());
         setForeignAttributes(spm.getForeignAttributes());
@@ -107,7 +109,18 @@ public class PageViewport extends AreaTreeObject implements Resolvable, Cloneabl
         this.pageNumberString = pageStr;
         this.viewArea = new Rectangle(0, 0, pageWidth, pageHeight);
         this.page = new Page(spm);
-        createSpan(false);
+        createSpan(spanAll);
+    }
+
+    /**
+     * Create a page viewport.
+     * @param spm SimplePageMaster indicating the page and region dimensions
+     * @param pageNumber the page number
+     * @param pageStr String representation of the page number
+     * @param blank true if this is a blank page
+     */
+    public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr, boolean blank) {
+        this(spm, pageNumber, pageStr, blank, false);
     }
 
     /**
index b183efa01d3d7907e129fc7b4c5fc263317fbe70..d8ec66e82284b43f398d770cc5f4dac9a01cb7e4 100644 (file)
@@ -41,10 +41,12 @@ public class Page {
      * @param pageNumber the page number (as an int)
      * @param pageNumberStr the page number (as a String)
      * @param blank true if this is a blank page
+     * @param spanAll true if the first span area spans all columns
      */
-    public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr, boolean blank) {
+    public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr,
+            boolean blank, boolean spanAll) {
         this.spm = spm;
-        this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, blank);
+        this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, blank, spanAll);
     }
 
     /**
index b65433bd7c93be811724f461ad85bb914e0a4283..3a41eb191cf2d1c40a89d6c9a29be79af34762c4 100644 (file)
@@ -45,6 +45,7 @@ public class PageBreaker extends AbstractBreaker {
     private boolean needColumnBalancing;
     private PageProvider pageProvider;
     private Block separatorArea;
+    private boolean spanAllActive;
 
     /**
      * The FlowLayoutManager object, which processes
@@ -148,8 +149,9 @@ public class PageBreaker extends AbstractBreaker {
         }
         firstPart = false;
         pageBreakHandled = true;
+
         pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
-                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex());
+                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(), this.spanAllActive);
         return super.getNextBlockList(childLC, nextSequenceStartsOn, positionAtIPDChange,
                 restartLM, firstElements);
     }
@@ -342,8 +344,9 @@ public class PageBreaker extends AbstractBreaker {
         pageBreakHandled = true;
         //Update so the available BPD is reported correctly
         int currentPageNum = pslm.getCurrentPageNum();
+
         pageProvider.setStartOfNextElementList(currentPageNum,
-                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex());
+                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(), this.spanAllActive);
 
         //Make sure we only add the areas we haven't added already
         effectiveList.ignoreAtStart = newStartPos;
@@ -387,7 +390,7 @@ public class PageBreaker extends AbstractBreaker {
 
         boolean fitsOnePage
             = optimalPageCount <= pslm.getCurrentPV()
-            .getBodyRegion().getMainReference().getCurrentSpan().getColumnCount();
+                .getBodyRegion().getMainReference().getCurrentSpan().getColumnCount();
 
         if (needColumnBalancing) {
             if (!fitsOnePage) {
@@ -435,7 +438,8 @@ public class PageBreaker extends AbstractBreaker {
                 handleBreakTrait(breakClass);
             }
             pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
-                    pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex());
+                    pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(),
+                    this.spanAllActive);
         }
         pageBreakHandled = false;
         // add static areas and resolve any new id areas
@@ -503,9 +507,11 @@ public class PageBreaker extends AbstractBreaker {
         case Constants.EN_ALL:
             //break due to span change in multi-column layout
             curPage.getPageViewport().createSpan(true);
+            this.spanAllActive = true;
             return;
         case Constants.EN_NONE:
             curPage.getPageViewport().createSpan(false);
+            this.spanAllActive = false;
             return;
         case Constants.EN_COLUMN:
         case Constants.EN_AUTO:
index 2e531a8d8b48b510a8923bb9f752021bdedf8fd0..8caafa72b96601f20f2c506ed73ebd121feb8a78 100644 (file)
@@ -51,6 +51,7 @@ public class PageProvider implements Constants {
     private int startPageOfPageSequence;
     private int startPageOfCurrentElementList;
     private int startColumnOfCurrentElementList;
+    private boolean spanAllForCurrentElementList;
     private List cachedPages = new java.util.ArrayList();
 
     private int lastPageIndex = -1;
@@ -88,12 +89,17 @@ public class PageProvider implements Constants {
      * on so it can later retrieve PageViewports relative to this first page.
      * @param startPage the number of the first page for the element list.
      * @param startColumn the starting column number for the element list.
+     * @param spanAll true if the current element list is for a column-spanning section
      */
-    public void setStartOfNextElementList(int startPage, int startColumn) {
-        log.debug("start of the next element list is:"
-                + " page=" + startPage + " col=" + startColumn);
+    public void setStartOfNextElementList(int startPage, int startColumn, boolean spanAll) {
+        if (log.isDebugEnabled()) {
+            log.debug("start of the next element list is:"
+                    + " page=" + startPage + " col=" + startColumn
+                    + (spanAll ? ", column-spanning" : ""));
+        }
         this.startPageOfCurrentElementList = startPage - startPageOfPageSequence + 1;
         this.startColumnOfCurrentElementList = startColumn;
+        this.spanAllForCurrentElementList = spanAll;
         //Reset Cache
         this.lastRequestedIndex = -1;
         this.lastReportedBPD = -1;
@@ -290,7 +296,7 @@ public class PageProvider implements Constants {
             if (log.isTraceEnabled()) {
                 log.trace("Caching " + index);
             }
-            cacheNextPage(index, isBlank, isLastPage);
+            cacheNextPage(index, isBlank, isLastPage, this.spanAllForCurrentElementList);
         }
         Page page = (Page)cachedPages.get(intIndex);
         boolean replace = false;
@@ -306,7 +312,7 @@ public class PageProvider implements Constants {
         }
         if (replace) {
             discardCacheStartingWith(intIndex);
-            page = cacheNextPage(index, isBlank, isLastPage);
+            page = cacheNextPage(index, isBlank, isLastPage, this.spanAllForCurrentElementList);
         }
         return page;
     }
@@ -320,7 +326,7 @@ public class PageProvider implements Constants {
         }
     }
 
-    private Page cacheNextPage(int index, boolean isBlank, boolean isLastPage) {
+    private Page cacheNextPage(int index, boolean isBlank, boolean isLastPage, boolean spanAll) {
         String pageNumberString = pageSeq.makeFormattedPageNumber(index);
         boolean isFirstPage = (startPageOfPageSequence == index);
         SimplePageMaster spm = pageSeq.getNextSimplePageMaster(
@@ -335,7 +341,7 @@ public class PageProvider implements Constants {
             eventProducer.flowNotMappingToRegionBody(this,
                     pageSeq.getMainFlow().getFlowName(), spm.getMasterName(), spm.getLocator());
         }
-        Page page = new Page(spm, index, pageNumberString, isBlank);
+        Page page = new Page(spm, index, pageNumberString, isBlank, spanAll);
         //Set unique key obtained from the AreaTreeHandler
         page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey());
         page.getPageViewport().setForeignAttributes(spm.getForeignAttributes());
index 1f091675306fe1cf82cdc84546350c2718859ec2..57b7a94b388cdfb8cd6bc66b47b873f141a513a4 100644 (file)
@@ -58,6 +58,9 @@
       documents. Example: the fix of marks layering will be such a case when it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Layout" dev="JM" type="fix" fixes-bug="49885">
+        Fixed retrieval of available BPD for cases spanning columns and multiple pages with differing page masters.
+      </action>
       <action context="Renderers" dev="VH" type="remove">
         Removed old Renderer implementations for those output formats that have a version based on 
         the new DocumentHandler architecture available (AFP, PCL, PDF, PS).
diff --git a/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml b/test/layoutengine/standard-testcases/region-body_column-count_span_4.xml
new file mode 100644 (file)
index 0000000..8bc4652
--- /dev/null
@@ -0,0 +1,84 @@
+<?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 multi-column documents. Check that spanned section that are broken over
+      to multiple pages still respect the span setting. This particular test makes sure that pages with different region-body
+      height are handled properly.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="odd-page" page-height="3.5cm" page-width="4cm" margin="0.45cm">
+          <fo:region-body margin-top="12pt * 1.2 * 2" column-count="2" background-color="yellow"/>
+        </fo:simple-page-master>
+        <fo:simple-page-master master-name="even-page" page-height="3.5cm" page-width="4cm" margin="0.45cm">
+          <fo:region-body column-count="2" background-color="orange"/>
+        </fo:simple-page-master>
+        <fo:page-sequence-master master-name="master">
+          <fo:repeatable-page-master-alternatives>
+            <fo:conditional-page-master-reference master-reference="odd-page" odd-or-even="odd" blank-or-not-blank="not-blank"/>
+            <fo:conditional-page-master-reference master-reference="even-page" odd-or-even="even" blank-or-not-blank="not-blank"/>
+          </fo:repeatable-page-master-alternatives>
+        </fo:page-sequence-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="master">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block span="all">
+            <fo:block>Line 1</fo:block>
+            <fo:block>Line 2</fo:block>
+            <fo:block>Line 3</fo:block>
+            <fo:block>Line 4</fo:block>
+            <fo:block>Line 5</fo:block>
+            <fo:block>Line 6</fo:block>
+            <fo:block>Line 7</fo:block>
+            <fo:block>Line 8</fo:block>
+            <fo:block>Line 9</fo:block>
+            <fo:block>Line 10</fo:block>
+            <fo:block>Line 11</fo:block>
+            <fo:block>Line 12</fo:block>
+            <fo:block>Line 13</fo:block>
+            <fo:block>Line 14</fo:block>
+            <fo:block>Line 15</fo:block>
+            <fo:block>Line 16</fo:block>
+            <fo:block>Line 17</fo:block>
+            <fo:block>Line 18</fo:block>
+            <fo:block>Line 19</fo:block>
+            <fo:block>Line 20</fo:block>
+            <fo:block>Line 21</fo:block>
+            <fo:block>Line 22</fo:block>
+          </fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="6" xpath="count(//pageViewport)"/>
+    
+    <eval expected="3" xpath="count(//pageViewport[@nr=1]//lineArea)"/>
+    <eval expected="5" xpath="count(//pageViewport[@nr=2]//lineArea)"/>
+    <eval expected="3" xpath="count(//pageViewport[@nr=3]//lineArea)"/>
+    <eval expected="5" xpath="count(//pageViewport[@nr=4]//lineArea)"/>
+    <eval expected="3" xpath="count(//pageViewport[@nr=5]//lineArea)"/>
+    <eval expected="3" xpath="count(//pageViewport[@nr=6]//lineArea)"/>
+    
+  </checks>
+</testcase>