Преглед изворни кода

Fixed regression causing bad positioning of block-containers if used as descendant of a table-cell. This was not caught because of the lack of a test case that would have shown the problem in visual testing with BatchDiffer.

See also: http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-users/200804.mbox/%3c20080424164128.973A.DEV@jeremias-maerki.ch%3e


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_95@651302 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-0_95
Jeremias Maerki пре 16 година
родитељ
комит
324e3ea6f7

+ 35
- 0
src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java Прегледај датотеку

@@ -521,6 +521,41 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
}
}

/** {@inheritDoc} */
protected void renderReferenceArea(Block block) {
// save position and offset
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;

//Establish a new coordinate system
AffineTransform at = new AffineTransform();
at.translate(currentIPPosition, currentBPPosition);
at.translate(block.getXOffset(), block.getYOffset());
at.translate(0, block.getSpaceBefore());
if (!at.isIdentity()) {
saveGraphicsState();
concatenateTransformationMatrix(mptToPt(at));
}

currentIPPosition = 0;
currentBPPosition = 0;
handleBlockTraits(block);

List children = block.getChildAreas();
if (children != null) {
renderBlocks(block, children);
}

if (!at.isIdentity()) {
restoreGraphicsState();
}
// stacked and relative blocks effect stacking
currentIPPosition = saveIP;
currentBPPosition = saveBP;
}
/**
* Concatenates the current transformation matrix with the given one, therefore establishing
* a new coordinate system.

+ 9
- 0
src/java/org/apache/fop/render/AbstractRenderer.java Прегледај датотеку

@@ -481,6 +481,13 @@ public abstract class AbstractRenderer
}
}

/**
* Renders a block area that represents a reference area. The reference area establishes
* a new coordinate system.
* @param block the block area
*/
protected abstract void renderReferenceArea(Block block);
/**
* Renders a list of block areas.
*
@@ -549,6 +556,8 @@ public abstract class AbstractRenderer
// simply move position
currentBPPosition += block.getAllocBPD();
}
} else if (Boolean.TRUE.equals(block.getTrait(Trait.IS_REFERENCE_AREA))) {
renderReferenceArea(block);
} else {
// save position and offset
int saveIP = currentIPPosition;

+ 39
- 0
src/java/org/apache/fop/render/afp/AFPRenderer.java Прегледај датотеку

@@ -587,6 +587,45 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
}
}

/** {@inheritDoc} */
protected void renderReferenceArea(Block block) {
//TODO Remove this method once concatenateTransformationMatrix() is implemented
// save position and offset
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;

//Establish a new coordinate system
AffineTransform at = new AffineTransform();
at.translate(currentIPPosition, currentBPPosition);
at.translate(block.getXOffset(), block.getYOffset());
at.translate(0, block.getSpaceBefore());
if (!at.isIdentity()) {
Rectangle2D contentRect
= new Rectangle2D.Double(at.getTranslateX(), at.getTranslateY(),
block.getAllocIPD(), block.getAllocBPD());
pushViewPortPos(new ViewPortPos(contentRect, new CTM(at)));
}

currentIPPosition = 0;
currentBPPosition = 0;
handleBlockTraits(block);

List children = block.getChildAreas();
if (children != null) {
renderBlocks(block, children);
}

if (!at.isIdentity()) {
popViewPortPos();
}
// stacked and relative blocks effect stacking
currentIPPosition = saveIP;
currentBPPosition = saveBP;
}
/** {@inheritDoc} */
protected void concatenateTransformationMatrix(AffineTransform at) {
//Not used here since AFPRenderer defines its own renderBlockViewport() method.

+ 40
- 0
src/java/org/apache/fop/render/pcl/PCLRenderer.java Прегледај датотеку

@@ -1005,6 +1005,46 @@ public class PCLRenderer extends PrintRenderer {
//currentFontName = saveFontName;
}

/** {@inheritDoc} */
protected void renderReferenceArea(Block block) {
//TODO This is the same code as in AbstractPathOrientedRenderer
//So there's some optimization potential but not otherwise PCLRenderer is a little
//difficult to derive from AbstractPathOrientedRenderer. Maybe an additional layer
//between PrintRenderer and AbstractPathOrientedRenderer is necessary.
// save position and offset
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;

//Establish a new coordinate system
AffineTransform at = new AffineTransform();
at.translate(currentIPPosition, currentBPPosition);
at.translate(block.getXOffset(), block.getYOffset());
at.translate(0, block.getSpaceBefore());
if (!at.isIdentity()) {
saveGraphicsState();
concatenateTransformationMatrix(mptToPt(at));
}

currentIPPosition = 0;
currentBPPosition = 0;
handleBlockTraits(block);

List children = block.getChildAreas();
if (children != null) {
renderBlocks(block, children);
}

if (!at.isIdentity()) {
restoreGraphicsState();
}
// stacked and relative blocks effect stacking
currentIPPosition = saveIP;
currentBPPosition = saveBP;
}
/**
* Concatenates the current transformation matrix with the given one, therefore establishing
* a new coordinate system.

+ 11
- 3
src/java/org/apache/fop/render/xml/XMLRenderer.java Прегледај датотеку

@@ -754,9 +754,17 @@ public class XMLRenderer extends PrintRenderer {
endElement("flow");
}

/**
* {@inheritDoc}
*/
/** {@inheritDoc} */
protected void renderReferenceArea(Block block) {
handleBlockTraits(block);

List children = block.getChildAreas();
if (children != null) {
renderBlocks(block, children);
}
}
/** {@inheritDoc} */
protected void renderBlock(Block block) {
atts.clear();
addAreaAttributes(block);

+ 4
- 0
status.xml Прегледај датотеку

@@ -60,6 +60,10 @@
-->
<!--/release-->
<release version="0.95" date="TBD">
<action context="Renderers" dev="JM" type="fix">
Fixed regression causing bad positioning of block-containers if used as descendant
of a table-cell.
</action>
<action context="Fonts" dev="JM" type="fix">
Fixed text extraction problem with ZapfDingbats and Symbol font in PDF output.
</action>

+ 65
- 0
test/layoutengine/standard-testcases/table-cell_bc-child.xml Прегледај датотеку

@@ -0,0 +1,65 @@
<?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 visual="only">
<info>
<p>
This test checks the rendering of block viewports in reference areas generated
by table-cells. This does not test the layout engine, only the renderer.
</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" margin="20pt">
<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="4in" background-color="lightgray"
space-before="2in" space-before.conditionality="retain">
<fo:table-column column-width="100%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell background-color="rgb(230, 230, 255)">
<fo:block-container absolute-position="absolute" width="100%" height="2em">
<fo:block color="red">No red text should be visible!</fo:block>
</fo:block-container>
<fo:block color="green">No red text should be visible!</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding="10pt" background-color="rgb(230, 255, 230)">
<fo:block-container absolute-position="absolute" width="100%" height="2em" top="10pt">
<fo:block color="red">No red text should be visible!</fo:block>
</fo:block-container>
<fo:block color="green">No red text should be visible!</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
</fo>
<checks>
<!-- Dummy test. This test is only useful with BatchDiffer. -->
<eval expected="1" xpath="count(//pageViewport)"/>
</checks>
</testcase>

Loading…
Откажи
Сачувај