aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Steiner <ssteiner@apache.org>2016-11-08 14:34:28 +0000
committerSimon Steiner <ssteiner@apache.org>2016-11-08 14:34:28 +0000
commitd38a721c3023236a70828b28f0df12d0293632d4 (patch)
tree5645fe30306a97ddc45ac87c8b5a03d3da270e79
parent055aabb32fb900ff3fccde7d9f4dd600602120c8 (diff)
downloadxmlgraphics-fop-d38a721c3023236a70828b28f0df12d0293632d4.tar.gz
xmlgraphics-fop-d38a721c3023236a70828b28f0df12d0293632d4.zip
FOP-2664: Use page-position=only if there is enough space
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1768702 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java8
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java1
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java4
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java5
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java14
-rw-r--r--fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java20
-rw-r--r--fop/test/layoutengine/standard-testcases/page-position_only_2.xml80
7 files changed, 120 insertions, 12 deletions
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
index 36dd6f407..25fa35885 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBreaker.java
@@ -45,6 +45,7 @@ public abstract class AbstractBreaker {
private LayoutManager originalRestartAtLM;
private Position positionAtBreak;
private List firstElementsForRestart;
+ protected PageSequenceLayoutManager pslm;
/**
* A page break position.
@@ -368,7 +369,7 @@ public abstract class AbstractBreaker {
* @param autoHeight true if warnings about overflows should be disabled because the
* the BPD is really undefined (for footnote-separators, for example)
*/
- public void doLayout(int flowBPD, boolean autoHeight) {
+ public boolean doLayout(int flowBPD, boolean autoHeight) {
LayoutContext childLC = createLayoutContext();
childLC.setStackLimitBP(MinOptMax.getInstance(flowBPD));
alignment = Constants.EN_START;
@@ -418,6 +419,10 @@ public abstract class AbstractBreaker {
onLastPageAndIPDChanges = (lastPageHasIPDChange() && !thereIsANonRestartableLM(alg)
&& (shouldRedoLayout() || (wasLayoutRedone() && optimalPageCount > 1)));
}
+ if ((ipdChangesOnNextPage || hasMoreContent() || optimalPageCount > 1)
+ && pslm != null && pslm.getCurrentPage().isPagePositionOnly) {
+ return false;
+ }
if (alg.handlingFloat()) {
nextSequenceStartsOn = handleFloatLayout(alg, optimalPageCount, blockList, childLC);
} else if (ipdChangesOnNextPage || onLastPageAndIPDChanges) {
@@ -457,6 +462,7 @@ public abstract class AbstractBreaker {
// done
blockLists = null;
+ return true;
}
private LayoutManager getRestartAtLM(PageBreakingAlgorithm alg, boolean ipdChangesOnNextPage,
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
index 8435ad093..64f87757a 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractPageSequenceLayoutManager.java
@@ -111,6 +111,7 @@ public abstract class AbstractPageSequenceLayoutManager extends AbstractLayoutMa
public void initialize() {
startPageNum = pageSeq.getStartingPageNumber();
currentPageNum = startPageNum - 1;
+ curPage = null;
}
/**
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java
index d8ec66e82..6f3b97cd4 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/Page.java
@@ -34,6 +34,7 @@ public class Page {
private SimplePageMaster spm;
private PageViewport pageViewport;
+ protected boolean isPagePositionOnly;
/**
* Main constructor
@@ -44,9 +45,10 @@ public class Page {
* @param spanAll true if the first span area spans all columns
*/
public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr,
- boolean blank, boolean spanAll) {
+ boolean blank, boolean spanAll, boolean isPagePositionOnly) {
this.spm = spm;
this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, blank, spanAll);
+ this.isPagePositionOnly = isPagePositionOnly;
}
/**
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
index 9c1315640..43fca99a2 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageBreaker.java
@@ -43,7 +43,6 @@ import org.apache.fop.traits.MinOptMax;
*/
public class PageBreaker extends AbstractBreaker {
- private PageSequenceLayoutManager pslm;
private boolean firstPart = true;
private boolean pageBreakHandled;
private boolean needColumnBalancing;
@@ -109,8 +108,8 @@ public class PageBreaker extends AbstractBreaker {
* Starts the page breaking process.
* @param flowBPD the constant available block-progression-dimension (used for every part)
*/
- void doLayout(int flowBPD) {
- doLayout(flowBPD, false);
+ boolean doLayout(int flowBPD) {
+ return doLayout(flowBPD, false);
}
/** {@inheritDoc} */
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
index ca41c8c1e..ff6a277c7 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageProvider.java
@@ -75,6 +75,8 @@ public class PageProvider implements Constants {
*/
private PageSequence pageSeq;
+ protected boolean skipPagePositionOnly;
+
/**
* Main constructor.
* @param ath the area tree handler
@@ -86,6 +88,10 @@ public class PageProvider implements Constants {
this.startPageOfPageSequence = ps.getStartingPageNumber();
}
+ public void initialize() {
+ cachedPages.clear();
+ }
+
/**
* The page breaker notifies the provider about the page number an element list starts
* on so it can later retrieve PageViewports relative to this first page.
@@ -346,7 +352,11 @@ public class PageProvider implements Constants {
boolean isFirstPage = (startPageOfPageSequence == index);
SimplePageMaster spm = pageSeq.getNextSimplePageMaster(
index, isFirstPage, isLastPage, isBlank);
- Page page = new Page(spm, index, pageNumberString, isBlank, spanAll);
+ boolean isPagePositionOnly = pageSeq.hasPagePositionOnly() && !skipPagePositionOnly;
+ if (isPagePositionOnly) {
+ spm = pageSeq.getNextSimplePageMaster(index, isFirstPage, true, isBlank);
+ }
+ Page page = new Page(spm, index, pageNumberString, isBlank, spanAll, isPagePositionOnly);
//Set unique key obtained from the AreaTreeHandler
page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey());
page.getPageViewport().setForeignAttributes(spm.getForeignAttributes());
@@ -372,7 +382,7 @@ public class PageProvider implements Constants {
int index = this.cachedPages.size();
boolean isFirstPage = (startPageOfPageSequence == index);
SimplePageMaster spm = pageSeq.getLastSimplePageMaster(index, isFirstPage, false);
- Page page = new Page(spm, index, "", false, false);
+ Page page = new Page(spm, index, "", false, false, false);
if (pageSeq.getRoot().getLastSeq() != null && pageSeq.getRoot().getLastSeq() != pageSeq) {
return -1;
}
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
index 0ee7121af..cfcaabb33 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
@@ -131,15 +131,25 @@ public class PageSequenceLayoutManager extends AbstractPageSequenceLayoutManager
log.debug("Starting layout");
}
- curPage = makeNewPage(false);
-
- pageBreaker = new PageBreaker(this);
- int flowBPD = getCurrentPV().getBodyRegion().getRemainingBPD();
- pageBreaker.doLayout(flowBPD);
+ boolean finished = false;
+ while (!finished) {
+ initialize();
+ curPage = makeNewPage(false);
+
+ pageBreaker = new PageBreaker(this);
+ int flowBPD = getCurrentPV().getBodyRegion().getRemainingBPD();
+ finished = pageBreaker.doLayout(flowBPD);
+ pageProvider.skipPagePositionOnly = true;
+ }
finishPage();
}
+ public void initialize() {
+ super.initialize();
+ pageProvider.initialize();
+ }
+
/** {@inheritDoc} */
public void finishPageSequence() {
if (pageSeq.hasId()) {
diff --git a/fop/test/layoutengine/standard-testcases/page-position_only_2.xml b/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
new file mode 100644
index 000000000..08a485a8f
--- /dev/null
+++ b/fop/test/layoutengine/standard-testcases/page-position_only_2.xml
@@ -0,0 +1,80 @@
+<?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 for the use of an 'only' conditional-page-master-reference (XSL 1.1)
+ </p>
+ </info>
+ <fo>
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master margin-left="20mm" margin-right="20mm" page-height="297mm" page-width="210mm" master-name="OnlyPage" margin-bottom="5mm" margin-top="12mm">
+ <fo:region-body region-name="Body" margin-bottom="30mm" margin-top="105mm" background-color="red" />
+ </fo:simple-page-master>
+ <fo:simple-page-master page-height="297mm" page-width="210mm" master-name="FrontPage" margin-bottom="5mm" margin-left="20mm" margin-right="20mm" margin-top="12mm">
+ <fo:region-body region-name="Body" margin-bottom="70mm" margin-top="105mm" background-color="green" />
+ </fo:simple-page-master>
+ <fo:simple-page-master page-height="297mm" page-width="210mm" master-name="BackPage" margin-bottom="5mm" margin-left="20mm" margin-right="20mm" margin-top="15mm">
+ <fo:region-body region-name="Body" margin-bottom="30mm" margin-top="20mm" background-color="transparent" />
+ </fo:simple-page-master>
+ <fo:page-sequence-master master-name="LetterPages">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="OnlyPage" page-position="only" />
+ <fo:conditional-page-master-reference master-reference="FrontPage" page-position="first" />
+ <fo:conditional-page-master-reference master-reference="BackPage" page-position="rest" />
+ <fo:conditional-page-master-reference master-reference="BackPage" page-position="last" />
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="LetterPages" force-page-count="auto" initial-page-number="auto">
+
+ <fo:flow flow-name="Body">
+ <fo:block>
+ <fo:block>1test</fo:block>
+ <fo:block>2test</fo:block>
+ <fo:block>3test</fo:block>
+ <fo:block>4test</fo:block>
+ <fo:block>5test</fo:block>
+ <fo:block>6test</fo:block>
+ <fo:block>7test</fo:block>
+ <fo:block>8test</fo:block>
+ <fo:block>9test</fo:block>
+ <fo:block>10test</fo:block>
+ <fo:block>11test</fo:block>
+ <fo:block>12test</fo:block>
+ <fo:block>13test</fo:block>
+ <fo:block>14test</fo:block>
+ <fo:block>15test</fo:block>
+ <fo:block>16test</fo:block>
+ <fo:block>17test</fo:block>
+ <fo:block>18test</fo:block>
+ <fo:block>19test</fo:block>
+ <fo:block>20test</fo:block>
+ <fo:block>21test</fo:block>
+ </fo:block>
+
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
+ </fo>
+ <checks>
+ <eval expected="21test" xpath="//pageViewport[1]//flow/block/block[21]/lineArea[1]/text/word[1]"/>
+ </checks>
+</testcase>