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.
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;
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();
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);
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);
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;
} 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();
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()
Rectangle2D rect = new Rectangle2D.Double(
contentRectOffsetX, contentRectOffsetY,
- vpContentIPD, vpContentBPD);
+ getContentAreaIPD(), vpContentBPD);
relDims = new FODimension(0, 0);
absoluteCTM = CTM.getCTMandRelDims(
getBlockContainerFO().getReferenceOrientation(),
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());
--- /dev/null
+<?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 if block-container provides the right base values for percentage evaluations for its children.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
+ <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" white-space-collapse="true">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block-container width="100pt" height="100pt" background-color="yellow">
+ <fo:block-container width="50%" height="50%" background-color="orange"><fo:block>50% nested</fo:block></fo:block-container>
+ </fo:block-container>
+ <fo:block-container width="100pt" background-color="yellow" space-before="10pt">
+ <fo:block-container width="50%" height="10%" background-color="orange"><fo:block>50% nested autoheight</fo:block></fo:block-container>
+ </fo:block-container>
+ <fo:block-container width="100pt" height="100pt" absolute-position="absolute" left="150pt" top="50pt" background-color="yellow">
+ <fo:block-container width="50%" height="50%" background-color="orange"><fo:block>50% nested abs</fo:block></fo:block-container>
+ </fo:block-container>
+ <fo:block-container width="100pt" absolute-position="absolute" left="150pt" top="200pt" background-color="yellow">
+ <fo:block-container width="50%" height="10%" background-color="orange"><fo:block>50% nested abs autoheight</fo:block></fo:block-container>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <eval expected="360000" xpath="//regionBody/@bpd"/>
+ <eval expected="360000" xpath="//regionBody/@ipd"/>
+
+ <!-- relative -->
+ <eval expected="100000" xpath="//flow/block[1]/@bpd"/>
+ <eval expected="100000" xpath="//flow/block[1]/@ipd"/>
+ <eval expected="50000" xpath="//flow/block[1]/block[1]/block[1]/@bpd"/>
+ <eval expected="50000" xpath="//flow/block[1]/block[1]/block[1]/@ipd"/>
+
+ <!-- relative with autoheight -->
+ <!-- from the spec: If that dimension is not specified explicitly (i.e., it depends on
+ content's blockprogression-dimension), the value is interpreted as "auto". -->
+ <!-- The 10% are ignored in this case. -->
+ <eval expected="28800" xpath="//flow/block[2]/@bpd"/> <!-- 2 lines -->
+ <eval expected="100000" xpath="//flow/block[2]/@ipd"/>
+ <eval expected="28800" xpath="//flow/block[2]/block[1]/block[1]/@bpd"/>
+ <eval expected="50000" xpath="//flow/block[2]/block[1]/block[1]/@ipd"/>
+
+ <!-- absolute -->
+ <eval expected="100000" xpath="//flow/block[3]/@bpd"/>
+ <eval expected="100000" xpath="//flow/block[3]/@ipd"/>
+ <eval expected="50000" xpath="//flow/block[3]/block[1]/block[1]/@bpd"/>
+ <eval expected="50000" xpath="//flow/block[3]/block[1]/block[1]/@ipd"/>
+
+ <!-- absolute with autoheight -->
+ <!-- from the spec: If that dimension is not specified explicitly (i.e., it depends on
+ content's blockprogression-dimension), the value is interpreted as "auto". -->
+ <!-- The 10% are ignored in this case. -->
+ <eval expected="43200" xpath="//flow/block[4]/@bpd"/> <!-- 3 lines -->
+ <eval expected="100000" xpath="//flow/block[4]/@ipd"/>
+ <eval expected="43200" xpath="//flow/block[4]/block[1]/block[1]/@bpd"/>
+ <eval expected="50000" xpath="//flow/block[4]/block[1]/block[1]/@ipd"/>
+ </checks>
+</testcase>