]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fix for Bug #36403.
authorJeremias Maerki <jeremias@apache.org>
Thu, 27 Oct 2005 13:09:58 +0000 (13:09 +0000)
committerJeremias Maerki <jeremias@apache.org>
Thu, 27 Oct 2005 13:09:58 +0000 (13:09 +0000)
The problem is similar to the row backtracking that has to be done in case of spanned rows but it has to be handled a little differently.

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

src/java/org/apache/fop/layoutmgr/table/TableStepper.java
test/layoutengine/testcases/table_bug36403.xml [new file with mode: 0644]

index 00eeae4bab6661a3a7916ac3a1f1ddca7c38c89f..68b8cb4c1111e05a2c953af56ed6674433583e27 100644 (file)
@@ -26,7 +26,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.flow.TableRow;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.ElementListUtils;
 import org.apache.fop.layoutmgr.KnuthBox;
@@ -61,6 +60,7 @@ public class TableStepper {
     private int[] borderAfter;
     private int[] paddingAfter;
     private boolean rowBacktrackForLastStep;
+    private boolean skippedStep;
     private boolean[] keepWithNextSignals;
     private boolean[] forcedBreaks;
     
@@ -334,7 +334,16 @@ public class TableStepper {
             if (signalKeepWithNext || getTableLM().mustKeepTogether()) {
                 p = KnuthPenalty.INFINITE;
             }
+            if (skippedStep) {
+                p = KnuthPenalty.INFINITE;
+                //Need to avoid breaking because borders and/or paddding from other columns would
+                //not fit in the available space (see getNextStep())
+            }
             if (isBreakCondition()) {
+                if (skippedStep) {
+                    log.error("This is a conflict situation. The output may be wrong." 
+                            + " Please send your FO file to fop-dev@xmlgraphics.apache.org!");
+                }
                 p = -KnuthPenalty.INFINITE; //Overrides any keeps (see 4.8 in XSL 1.0)
                 clearBreakCondition();
             }
@@ -493,7 +502,9 @@ public class TableStepper {
                 minStep = Math.min(len, minStep);
             }
         }
-        log.debug("candidate steps: " + sb);
+        if (log.isDebugEnabled()) {
+            log.debug("candidate steps: " + sb + " lastStep=" + lastStep);
+        }
 
         //Check for constellations that would result in overlapping borders
         /*
@@ -502,15 +513,26 @@ public class TableStepper {
         }*/
         
         //Reset bigger-than-minimum sequences
+        //See http://people.apache.org/~jeremias/fop/NextStepAlgoNotes.pdf
         rowBacktrackForLastStep = false;
+        skippedStep = false;
         for (int i = 0; i < widths.length; i++) {
             int len = baseWidth[i] + widths[i];
             if (len > minStep) {
                 widths[i] = backupWidths[i];
                 end[i] = start[i] - 1;
                 if (baseWidth[i] + widths[i] > minStep) {
-                    log.debug("Meeeeep!");
-                    rowBacktrackForLastStep = true;
+                    log.debug("minStep vs. border/padding increase conflict:");
+                    if (activeRow == 0) {
+                        log.debug("  First row. Skip this step.");
+                        skippedStep = true;
+                    } else {
+                        log.debug("  row-span situation: backtracking to last row");
+                        //Stay on the previous row for another step because borders and padding on 
+                        //columns may make their contribution to the step bigger than the addition
+                        //of the next element for this step would make the step to grow.
+                        rowBacktrackForLastStep = true;
+                    }
                 }
             }
         }
diff --git a/test/layoutengine/testcases/table_bug36403.xml b/test/layoutengine/testcases/table_bug36403.xml
new file mode 100644 (file)
index 0000000..e674392
--- /dev/null
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2005 The Apache Software Foundation
+
+  Licensed 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 <a href="http://issues.apache.org/bugzilla/show_bug.cgi?id=36403">Bugzilla issue 36403</a>.
+    </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">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="normal" id="skipped-step">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+            <fo:table-column column-number="1"/>
+            <fo:table-column column-number="2"/>
+            <fo:table-body>
+              <fo:table-row>
+                <fo:table-cell>
+                  <fo:block>Row 1 Col 1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="solid 18pt" background-color="yellow">
+                  <fo:block>Row 1 Col 3</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+      <fo:page-sequence master-reference="normal" id="backtrack">
+        <fo:flow flow-name="xsl-region-body">
+          <!-- This situation is similar to the one on http://wiki.apache.org/xmlgraphics-fop/TableLayout/KnuthElementsForTables/RowBorder2
+               where the algorithm has to backtrack to the previous row. This is simply to verify that the change necessary because
+               of the above test case doesn't break the row backtracking that was already in place. -->
+          <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+            <fo:table-column column-number="1"/>
+            <fo:table-column column-number="2"/>
+            <fo:table-body>
+              <fo:table-row>
+                <fo:table-cell number-rows-spanned="2" font-size="10pt" line-height="10pt">
+                  <fo:block>Cell 1/1</fo:block>
+                  <fo:block>Cell 1/2</fo:block>
+                  <fo:block>Cell 1/3</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="solid 2pt" background-color="yellow">
+                  <fo:block>Cell 2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row>
+                <fo:table-cell border="solid 5pt" background-color="orange">
+                  <fo:block>Cell 3</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <element-list category="breaker" id="skipped-step">
+      <box w="0"/>
+      <penalty w="14400" p="INF"/> <!-- Skipped step has an INFINITE penalty -->
+      <box w="50400"/>
+      <skip>3</skip>
+    </element-list>
+    <element-list category="breaker" id="backtrack">
+      <box w="0"/>
+      <penalty w="10000"/> <!-- p > 0 && p <= INF -->
+      <box w="18400"/>
+      <penalty w="0" p="0"/>
+      <box w="0"/>
+      <penalty w="1600"/> <!-- p = ??? --> <!-- I'm not sure here what the penalty values should be for these two. -->
+      <box w="0"/>
+      <penalty w="11600"/> <!-- p = ??? -->
+      <box w="24400"/>
+      <skip>3</skip>
+    </element-list>
+  </checks>
+</testcase>