From 9f04f8cafdda119d9812a3897756899ffb0b7423 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Sun, 13 Nov 2005 14:53:07 +0000 Subject: [PATCH] Bugfix for handling of percentage width and height inside block-containers. Fixes problem in examples/fo/basic/border.fo. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@333011 13f79535-47bb-0310-9956-ffa450edef68 --- .../BlockContainerLayoutManager.java | 63 +++++++++----- ...lock-container_content_size_precentage.xml | 83 +++++++++++++++++++ 2 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 test/layoutengine/standard-testcases/block-container_content_size_precentage.xml diff --git a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java index 85474abfd..a12084780 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java @@ -51,7 +51,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager private boolean clip = false; private Length width; private Length height; - private int vpContentIPD; + //private int vpContentIPD; private int vpContentBPD; // When viewport should grow with the content. @@ -143,10 +143,12 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager private int getBPIndents() { int indents = 0; + /* TODO This is wrong isn't it? indents += getBlockContainerFO().getCommonMarginBlock() .spaceBefore.getOptimum(this).getLength().getValue(this); indents += getBlockContainerFO().getCommonMarginBlock() .spaceAfter.getOptimum(this).getLength().getValue(this); + */ indents += getBlockContainerFO().getCommonBorderPaddingBackground() .getBPPaddingAndBorder(false, this); return indents; @@ -168,6 +170,15 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager return (abProps.absolutePosition == EN_FIXED); } + /** @see org.apache.fop.layoutmgr.LayoutManager#getContentAreaBPD() */ + public int getContentAreaBPD() { + if (autoHeight) { + return -1; + } else { + return this.vpContentBPD; + } + } + /** @see org.apache.fop.layoutmgr.LayoutManager */ public LinkedList getNextKnuthElements(LayoutContext context, int alignment) { resetSpaces(); @@ -180,23 +191,26 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager referenceIPD = context.getRefIPD(); int maxbpd = context.getStackLimit().opt; int allocBPD, allocIPD; - if (height.getEnum() != EN_AUTO) { - allocBPD = height.getValue(this); //this is the content-height - allocBPD += getBPIndents(); - } else { + if (height.getEnum() == EN_AUTO + || (!height.isAbsolute() && getAncestorBlockAreaBPD() <= 0)) { + //auto height when height="auto" or "if that dimension is not specified explicitly + //(i.e., it depends on content's blockprogression-dimension)" (XSL 1.0, 7.14.1) allocBPD = maxbpd; autoHeight = true; + } else { + allocBPD = height.getValue(this); //this is the content-height + allocBPD += getBPIndents(); } - if (width.getEnum() != EN_AUTO) { + if (width.getEnum() == EN_AUTO) { + allocIPD = referenceIPD; + } else { allocIPD = width.getValue(this); //this is the content-width allocIPD += getIPIndents(); - } else { - allocIPD = referenceIPD; } vpContentBPD = allocBPD - getBPIndents(); - vpContentIPD = allocIPD - getIPIndents(); - setContentAreaIPD(vpContentIPD); + setContentAreaIPD(allocIPD - getIPIndents()); + double contentRectOffsetX = 0; contentRectOffsetX += getBlockContainerFO() .getCommonMarginBlock().startIndent.getValue(this); @@ -208,7 +222,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager Rectangle2D rect = new Rectangle2D.Double( contentRectOffsetX, contentRectOffsetY, - vpContentIPD, vpContentBPD); + getContentAreaIPD(), getContentAreaBPD()); relDims = new FODimension(0, 0); absoluteCTM = CTM.getCTMandRelDims(getBlockContainerFO().getReferenceOrientation(), getBlockContainerFO().getWritingMode(), rect, relDims); @@ -364,10 +378,10 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager Point offset = getAbsOffset(); int allocBPD, allocIPD; - if (height.getEnum() != EN_AUTO) { - allocBPD = height.getValue(this); //this is the content-height - allocBPD += getBPIndents(); - } else { + if (height.getEnum() == EN_AUTO + || (!height.isAbsolute() && getAncestorBlockAreaBPD() <= 0)) { + //auto height when height="auto" or "if that dimension is not specified explicitly + //(i.e., it depends on content's blockprogression-dimension)" (XSL 1.0, 7.14.1) allocBPD = 0; if (abProps.bottom.getEnum() != EN_AUTO) { int availHeight; @@ -401,11 +415,11 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager } else { autoHeight = true; } - } - if (width.getEnum() != EN_AUTO) { - allocIPD = width.getValue(this); //this is the content-width - allocIPD += getIPIndents(); } else { + allocBPD = height.getValue(this); //this is the content-height + allocBPD += getBPIndents(); + } + if (width.getEnum() == EN_AUTO) { int availWidth; if (isFixed()) { availWidth = (int)getCurrentPV().getViewArea().getWidth(); @@ -436,10 +450,13 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager allocIPD = 0; } } + } else { + allocIPD = width.getValue(this); //this is the content-width + allocIPD += getIPIndents(); } vpContentBPD = allocBPD - getBPIndents(); - vpContentIPD = allocIPD - getIPIndents(); + setContentAreaIPD(allocIPD - getIPIndents()); double contentRectOffsetX = offset.getX(); contentRectOffsetX += getBlockContainerFO() @@ -453,7 +470,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager Rectangle2D rect = new Rectangle2D.Double( contentRectOffsetX, contentRectOffsetY, - vpContentIPD, vpContentBPD); + getContentAreaIPD(), vpContentBPD); relDims = new FODimension(0, 0); absoluteCTM = CTM.getCTMandRelDims( getBlockContainerFO().getReferenceOrientation(), @@ -824,11 +841,11 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager if (referenceArea == null) { viewportBlockArea = new BlockViewport(); viewportBlockArea.addTrait(Trait.IS_VIEWPORT_AREA, Boolean.TRUE); - viewportBlockArea.setIPD(vpContentIPD); + viewportBlockArea.setIPD(getContentAreaIPD()); if (autoHeight) { viewportBlockArea.setBPD(0); } else { - viewportBlockArea.setBPD(vpContentBPD); + viewportBlockArea.setBPD(getContentAreaBPD()); } TraitSetter.setProducerID(viewportBlockArea, getBlockContainerFO().getId()); diff --git a/test/layoutengine/standard-testcases/block-container_content_size_precentage.xml b/test/layoutengine/standard-testcases/block-container_content_size_precentage.xml new file mode 100644 index 000000000..de4aaa083 --- /dev/null +++ b/test/layoutengine/standard-testcases/block-container_content_size_precentage.xml @@ -0,0 +1,83 @@ + + + + + +

+ This test checks if block-container provides the right base values for percentage evaluations for its children. +

+
+ + + + + + + + + + + 50% nested + + + 50% nested autoheight + + + 50% nested abs + + + 50% nested abs autoheight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-- 2.39.5