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-ffa450edef68tags/fop-0_95
@@ -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. |
@@ -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; |
@@ -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. |
@@ -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. |
@@ -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); |
@@ -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> |
@@ -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> |