]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Bugfix for row/body/col background painting when padding is used in the table-cells.
authorJeremias Maerki <jeremias@apache.org>
Mon, 10 Mar 2008 22:39:38 +0000 (22:39 +0000)
committerJeremias Maerki <jeremias@apache.org>
Mon, 10 Mar 2008 22:39:38 +0000 (22:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@635741 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
test/layoutengine/standard-testcases/table_backgrounds_2.xml [new file with mode: 0644]

index 7036f199b4a53fd196b1c91ee8562f2f0ad50f55..b99df4eb35a988eff125ad0fcaac8148654df250 100644 (file)
@@ -354,11 +354,12 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager
 
         CommonBorderPaddingBackground padding = primaryGridUnit.getCell()
                 .getCommonBorderPaddingBackground();
-        int cellBPD = totalHeight - borderBeforeWidth - borderAfterWidth;
+        int paddingRectBPD = totalHeight - borderBeforeWidth - borderAfterWidth; 
+        int cellBPD = paddingRectBPD;
         cellBPD -= padding.getPaddingBefore(borderBeforeWhich == ConditionalBorder.REST, this);
         cellBPD -= padding.getPaddingAfter(borderAfterWhich == ConditionalBorder.REST, this);
 
-        addBackgroundAreas(painter, firstRowHeight, borderBeforeWidth, cellBPD);
+        addBackgroundAreas(painter, firstRowHeight, borderBeforeWidth, paddingRectBPD);
 
         if (isSeparateBorderModel()) {
             if (!emptyCell || getTableCell().showEmptyCells()) {
@@ -488,22 +489,23 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager
 
     /** Adds background areas for the column, body and row, if any. */
     private void addBackgroundAreas(RowPainter painter, int firstRowHeight, int borderBeforeWidth,
-            int cellBPD) {
+            int paddingRectBPD) {
         TableColumn column = getTable().getColumn(primaryGridUnit.getColIndex());
         if (column.getCommonBorderPaddingBackground().hasBackground()) {
-            Block colBackgroundArea = getBackgroundArea(cellBPD, borderBeforeWidth);
+            Block colBackgroundArea = getBackgroundArea(paddingRectBPD, borderBeforeWidth);
             ((TableLayoutManager) parentLM).registerColumnBackgroundArea(column, colBackgroundArea,
                     -startIndent);
         }
 
         TableBody body = primaryGridUnit.getTableBody();
         if (body.getCommonBorderPaddingBackground().hasBackground()) {
-            painter.registerPartBackgroundArea(getBackgroundArea(cellBPD, borderBeforeWidth));
+            painter.registerPartBackgroundArea(
+                    getBackgroundArea(paddingRectBPD, borderBeforeWidth));
         }
 
         TableRow row = primaryGridUnit.getRow();
         if (row != null && row.getCommonBorderPaddingBackground().hasBackground()) {
-            Block rowBackgroundArea = getBackgroundArea(cellBPD, borderBeforeWidth);
+            Block rowBackgroundArea = getBackgroundArea(paddingRectBPD, borderBeforeWidth);
             ((TableLayoutManager) parentLM).addBackgroundArea(rowBackgroundArea);
             TraitSetter.addBackground(rowBackgroundArea, row.getCommonBorderPaddingBackground(),
                     (TableLayoutManager) parentLM,
@@ -541,12 +543,16 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager
     }
 
     private Block getBackgroundArea(int bpd, int borderBeforeWidth) {
+        CommonBorderPaddingBackground padding = getTableCell().getCommonBorderPaddingBackground();
+        int paddingStart = padding.getPaddingStart(false, this);
+        int paddingEnd = padding.getPaddingStart(false, this);
+        
         Block block = new Block();
         TraitSetter.setProducerID(block, getTable().getId());
         block.setPositioning(Block.ABSOLUTE);
-        block.setIPD(cellIPD);
+        block.setIPD(cellIPD + paddingStart + paddingEnd);
         block.setBPD(bpd);
-        block.setXOffset(xoffset + startIndent);
+        block.setXOffset(xoffset + startIndent - paddingStart);
         block.setYOffset(yoffset + borderBeforeWidth);
         return block;
     }
diff --git a/test/layoutengine/standard-testcases/table_backgrounds_2.xml b/test/layoutengine/standard-testcases/table_backgrounds_2.xml
new file mode 100644 (file)
index 0000000..11d6d67
--- /dev/null
@@ -0,0 +1,113 @@
+<?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 background painting for fo:table-row, fo:table-body and fo:table-column
+      when the cells use padding.
+    </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">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:table table-layout="fixed" width="100%">
+            <fo:table-column column-width="proportional-column-width(1)" number-columns-repeated="2"/>
+            <fo:table-body>
+              <fo:table-row>
+                <fo:table-cell id="bg-cell" padding="2pt 4pt" border="solid 2pt" background-color="lightgray">
+                  <fo:block>background on cell</fo:block>
+                </fo:table-cell>
+                <fo:table-cell padding="2pt 4pt" border="solid 2pt" background-color="lightgray">
+                  <fo:block>background on cell</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row background-color="yellow">
+                <fo:table-cell id="bg-row" padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on row</fo:block>
+                </fo:table-cell>
+                <fo:table-cell padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on row</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+            <fo:table-body background-color="orange">
+              <fo:table-row>
+                <fo:table-cell id="bg-body" padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on body</fo:block>
+                </fo:table-cell>
+                <fo:table-cell padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on body</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+          <fo:table table-layout="fixed" width="100%">
+            <fo:table-column column-width="proportional-column-width(1)" number-columns-repeated="2"
+              background-color="violet"/>
+            <fo:table-body>
+              <fo:table-row>
+                <fo:table-cell id="bg-col" padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on column</fo:block>
+                </fo:table-cell>
+                <fo:table-cell padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on column</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+          <fo:table table-layout="fixed" width="100%" background-color="red">
+            <fo:table-column column-width="proportional-column-width(1)" number-columns-repeated="2"/>
+            <fo:table-body>
+              <fo:table-row>
+                <fo:table-cell id="bg-table" padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on table</fo:block>
+                </fo:table-cell>
+                <fo:table-cell padding="2pt 4pt" border="solid 2pt">
+                  <fo:block>background on table</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="18400" xpath="//block[@prod-id='bg-row']/preceding-sibling::block[1]/@bpd"/>
+    <eval expected="178000" xpath="//block[@prod-id='bg-row']/preceding-sibling::block[1]/@ipd"/>
+    <eval expected="21400" xpath="//block[@prod-id='bg-row']/preceding-sibling::block[1]/@top-offset"/>
+    <eval expected="1000" xpath="//block[@prod-id='bg-row']/preceding-sibling::block[1]/@left-offset"/>
+    
+    <eval expected="18400" xpath="//block[@prod-id='bg-body']/preceding-sibling::block[1]/@bpd"/>
+    <eval expected="178000" xpath="//block[@prod-id='bg-body']/preceding-sibling::block[1]/@ipd"/>
+    <eval expected="41800" xpath="//block[@prod-id='bg-body']/preceding-sibling::block[1]/@top-offset"/>
+    <eval expected="1000" xpath="//block[@prod-id='bg-body']/preceding-sibling::block[1]/@left-offset"/>
+
+    <eval expected="18400" xpath="//block[@prod-id='bg-col']/preceding-sibling::block[1]/@bpd"/>
+    <eval expected="178000" xpath="//block[@prod-id='bg-col']/preceding-sibling::block[1]/@ipd"/>
+    <eval expected="1000" xpath="//block[@prod-id='bg-col']/preceding-sibling::block[1]/@top-offset"/>
+    <eval expected="1000" xpath="//block[@prod-id='bg-col']/preceding-sibling::block[1]/@left-offset"/>
+  </checks>
+</testcase>