Explorar el Código

Merge from Temp_Floats branch:

Fixed a bug with indent handling when margins are used on a surrounding block and not start/end-indent.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@427939 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-0_93
Jeremias Maerki hace 18 años
padre
commit
c0be6dbf9a

+ 30
- 31
src/java/org/apache/fop/fo/properties/IndentPropertyMaker.java Ver fichero

@@ -94,33 +94,32 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
Numeric border = getCorresponding(borderWidthCorresponding, propertyList).getNumeric();
int marginProp = pList.getWritingMode(lr_tb, rl_tb, tb_rl);
Numeric margin;
// Calculate the absolute margin.
if (propertyList.getExplicitOrShorthand(marginProp) == null) {
Property indent = propertyList.getExplicit(baseMaker.propId);
if (indent == null) {
//Neither start-indent nor margin is specified, use inherited
//Neither indent nor margin is specified, use inherited
return null;
} else {
//Use explicit indent directly
return indent;
}
margin = propertyList.getExplicit(baseMaker.propId).getNumeric();
margin = NumericOp.subtraction(margin,
propertyList.getInherited(baseMaker.propId).getNumeric());
margin = NumericOp.subtraction(margin, padding);
margin = NumericOp.subtraction(margin, border);
} else {
margin = propertyList.get(marginProp).getNumeric();
//Margin is used
Numeric margin = propertyList.get(marginProp).getNumeric();
Numeric v = new FixedLength(0);
if (!propertyList.getFObj().generatesReferenceAreas()) {
// The inherited_value_of([start|end]-indent)
v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
}
// The corresponding absolute margin-[right|left}.
v = NumericOp.addition(v, margin);
v = NumericOp.addition(v, padding);
v = NumericOp.addition(v, border);
return (Property) v;
}
Numeric v = new FixedLength(0);
if (!propertyList.getFObj().generatesReferenceAreas()) {
// The inherited_value_of([start|end]-indent)
v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
}
// The corresponding absolute margin-[right|left}.
v = NumericOp.addition(v, margin);
v = NumericOp.addition(v, padding);
v = NumericOp.addition(v, border);
return (Property) v;
}
private boolean isInherited(PropertyList pList) {
@@ -166,7 +165,6 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
pl = pl.getParentPropertyList();
}
Numeric margin;
// Calculate the absolute margin.
if (propertyList.getExplicitOrShorthand(marginProp) == null) {
Property indent = propertyList.getExplicit(baseMaker.propId);
@@ -181,19 +179,20 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
return indent;
}
} else {
margin = propertyList.get(marginProp).getNumeric();
}
Numeric v = new FixedLength(0);
if (isInherited(propertyList)) {
// The inherited_value_of([start|end]-indent)
v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
//Margin is used
Numeric margin = propertyList.get(marginProp).getNumeric();
Numeric v = new FixedLength(0);
if (isInherited(propertyList)) {
// The inherited_value_of([start|end]-indent)
v = NumericOp.addition(v, propertyList.getInherited(baseMaker.propId).getNumeric());
}
// The corresponding absolute margin-[right|left}.
v = NumericOp.addition(v, margin);
v = NumericOp.addition(v, padding);
v = NumericOp.addition(v, border);
return (Property) v;
}
// The corresponding absolute margin-[right|left}.
v = NumericOp.addition(v, margin);
v = NumericOp.addition(v, padding);
v = NumericOp.addition(v, border);
return (Property) v;
}
private Property getCorresponding(int[] corresponding, PropertyList propertyList)

+ 4
- 0
status.xml Ver fichero

@@ -28,6 +28,10 @@

<changes>
<release version="FOP Trunk">
<action context="Code" dev="JM" type="fix">
Fixed a bug with indent handling when margins are used on a surrounding block and
not start/end-indent.
</action>
<action context="Code" dev="JM" type="fix" fixes-bug="40106" due-to="Jeroen Meijer">
Compatibility fix for GCJ (GNU Classpath): Using "UTF-16BE" instead of "UnicodeBigUnmarked"
encoding.

+ 90
- 18
test/layoutengine/standard-testcases/block-container_start-indent.xml Ver fichero

@@ -36,11 +36,27 @@
</fo:layout-master-set>
<fo:page-sequence master-reference="normal" white-space-collapse="true">
<fo:flow flow-name="xsl-region-body">
<fo:block font-style="italic">Outer block with start-indent="10pt"</fo:block>
<fo:block start-indent="10pt">
<fo:block background-color="yellow">fo:block|fo:block</fo:block>
<fo:block-container>
<fo:block background-color="orange">fo:block|fo:block-container|fo:block</fo:block>
</fo:block-container>
<fo:block-container start-indent="15pt" background-color="palegoldenrod" space-before="5pt">
<fo:block background-color="red">fo:block|fo:block-container|fo:block</fo:block>
<fo:block start-indent="0pt" background-color="red">fo:block|fo:block-container|fo:block start-indent="0pt"</fo:block>
</fo:block-container>
</fo:block>
<fo:block font-style="italic" space-before="10pt">Outer block with margin-left="10pt"</fo:block>
<fo:block margin-left="10pt">
<fo:block background-color="yellow">fo:block|fo:block</fo:block>
<fo:block-container>
<fo:block background-color="orange">fo:block|fo:block-container|fo:block</fo:block>
</fo:block-container>
<fo:block-container start-indent="15pt" background-color="palegoldenrod" space-before="5pt">
<fo:block background-color="red">fo:block|fo:block-container|fo:block</fo:block>
<fo:block start-indent="0pt" background-color="red">fo:block|fo:block-container|fo:block start-indent="0pt"</fo:block>
</fo:block-container>
</fo:block>
</fo:flow>
</fo:page-sequence>
@@ -48,27 +64,83 @@
</fo>
<checks>
<!-- Outer block with the start-indent property -->
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@start-indent"/>
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@space-start"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ipd"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ipda"/>
<eval expected="10000" xpath="//flow/block[2]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[2]/@space-start"/>
<eval expected="350000" xpath="//flow/block[2]/@ipd"/>
<eval expected="350000" xpath="//flow/block[2]/@ipda"/>
<!-- yellow block -->
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@start-indent"/>
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@space-start"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@ipd"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[1]/@ipda"/>
<eval expected="10000" xpath="//flow/block[2]/block[1]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[2]/block[1]/@space-start"/>
<eval expected="350000" xpath="//flow/block[2]/block[1]/@ipd"/>
<eval expected="350000" xpath="//flow/block[2]/block[1]/@ipda"/>
<!-- block-container -->
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@start-indent"/>
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@space-start"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@ipd"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/@ipda"/>
<eval expected="10000" xpath="//flow/block[2]/block[2]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[2]/block[2]/@space-start"/>
<eval expected="350000" xpath="//flow/block[2]/block[2]/@ipd"/>
<eval expected="350000" xpath="//flow/block[2]/block[2]/@ipda"/>
<!-- block-container's reference area -->
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/@ipd"/>
<eval expected="350000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/@ipda"/>
<eval expected="350000" xpath="//flow/block[2]/block[2]/block[1]/@ipd"/>
<eval expected="350000" xpath="//flow/block[2]/block[2]/block[1]/@ipda"/>
<!-- orange block inside the block-container -->
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@start-indent"/>
<eval expected="10000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@space-start"/>
<eval expected="340000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@ipd"/>
<eval expected="340000" xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/block[2]/block[1]/block[1]/@ipda"/>
<eval expected="10000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@space-start"/>
<eval expected="340000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@ipd"/>
<eval expected="340000" xpath="//flow/block[2]/block[2]/block[1]/block[1]/@ipda"/>
<!-- block-container with start-indent -->
<eval expected="15000" xpath="//flow/block[2]/block[3]/@start-indent"/>
<eval expected="15000" xpath="//flow/block[2]/block[3]/@space-start"/>
<eval expected="345000" xpath="//flow/block[2]/block[3]/@ipd"/>
<!-- block-container's reference area -->
<eval expected="345000" xpath="//flow/block[2]/block[3]/block[1]/@ipd"/>
<!-- first red block inside the block-container -->
<eval expected="15000" xpath="//flow/block[2]/block[3]/block[1]/block[1]/@start-indent"/>
<eval expected="15000" xpath="//flow/block[2]/block[3]/block[1]/block[1]/@space-start"/>
<eval expected="330000" xpath="//flow/block[2]/block[3]/block[1]/block[1]/@ipd"/>
<!-- second red block inside the block-container -->
<true xpath="not(boolean(//flow/block[2]/block[3]/block[1]/block[2]/@start-indent))"/>
<true xpath="not(boolean(//flow/block[2]/block[3]/block[1]/block[2]/@space-indent))"/>
<eval expected="345000" xpath="//flow/block[2]/block[3]/block[1]/block[2]/@ipd"/>

<!-- === Same game with margin-left instead of start-indent on outer block === -->
<!-- === This triggered an earlier bug. === -->
<!-- Outer block with the start-indent property -->
<eval expected="10000" xpath="//flow/block[4]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[4]/@space-start"/>
<eval expected="350000" xpath="//flow/block[4]/@ipd"/>
<eval expected="350000" xpath="//flow/block[4]/@ipda"/>
<!-- yellow block -->
<eval expected="10000" xpath="//flow/block[4]/block[1]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[4]/block[1]/@space-start"/>
<eval expected="350000" xpath="//flow/block[4]/block[1]/@ipd"/>
<eval expected="350000" xpath="//flow/block[4]/block[1]/@ipda"/>
<!-- block-container -->
<eval expected="10000" xpath="//flow/block[4]/block[2]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[4]/block[2]/@space-start"/>
<eval expected="350000" xpath="//flow/block[4]/block[2]/@ipd"/>
<eval expected="350000" xpath="//flow/block[4]/block[2]/@ipda"/>
<!-- block-container's reference area -->
<eval expected="350000" xpath="//flow/block[4]/block[2]/block[1]/@ipd"/>
<eval expected="350000" xpath="//flow/block[4]/block[2]/block[1]/@ipda"/>
<!-- orange block inside the block-container -->
<eval expected="10000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@start-indent"/>
<eval expected="10000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@space-start"/>
<eval expected="340000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@ipd"/>
<eval expected="340000" xpath="//flow/block[4]/block[2]/block[1]/block[1]/@ipda"/>
<!-- block-container with start-indent -->
<eval expected="15000" xpath="//flow/block[4]/block[3]/@start-indent"/>
<eval expected="15000" xpath="//flow/block[4]/block[3]/@space-start"/>
<eval expected="345000" xpath="//flow/block[4]/block[3]/@ipd"/>
<!-- block-container's reference area -->
<eval expected="345000" xpath="//flow/block[4]/block[3]/block[1]/@ipd"/>
<!-- first red block inside the block-container -->
<eval expected="15000" xpath="//flow/block[4]/block[3]/block[1]/block[1]/@start-indent"/>
<eval expected="15000" xpath="//flow/block[4]/block[3]/block[1]/block[1]/@space-start"/>
<eval expected="330000" xpath="//flow/block[4]/block[3]/block[1]/block[1]/@ipd"/>
<!-- second red block inside the block-container -->
<true xpath="not(boolean(//flow/block[4]/block[3]/block[1]/block[2]/@start-indent))"/>
<true xpath="not(boolean(//flow/block[4]/block[3]/block[1]/block[2]/@space-indent))"/>
<eval expected="345000" xpath="//flow/block[4]/block[3]/block[1]/block[2]/@ipd"/>
</checks>
</testcase>

Cargando…
Cancelar
Guardar