Parcourir la source

Fixed positioning of absolutely positioned block-containers in multi-column documents.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_95@663482 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-0_95
Jeremias Maerki il y a 16 ans
Parent
révision
ec3a0d00aa

+ 29
- 0
src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java Voir le fichier

@@ -36,6 +36,7 @@ import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.CTM;
import org.apache.fop.area.NormalFlow;
import org.apache.fop.area.RegionViewport;
import org.apache.fop.area.Trait;
import org.apache.fop.area.inline.ForeignObject;
@@ -556,6 +557,34 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
currentBPPosition = saveBP;
}
/** {@inheritDoc} */
protected void renderFlow(NormalFlow flow) {
// save position and offset
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;

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

currentIPPosition = 0;
currentBPPosition = 0;
super.renderFlow(flow);
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.

+ 32
- 0
src/java/org/apache/fop/render/afp/AFPRenderer.java Voir le fichier

@@ -59,6 +59,7 @@ import org.apache.fop.area.Block;
import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.BodyRegion;
import org.apache.fop.area.CTM;
import org.apache.fop.area.NormalFlow;
import org.apache.fop.area.OffDocumentItem;
import org.apache.fop.area.PageViewport;
import org.apache.fop.area.RegionReference;
@@ -624,6 +625,37 @@ public class AFPRenderer extends AbstractPathOrientedRenderer {
currentBPPosition = saveBP;
}
/** {@inheritDoc} */
protected void renderFlow(NormalFlow flow) {
// save position and offset
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;

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

currentIPPosition = 0;
currentBPPosition = 0;
super.renderFlow(flow);
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.

+ 34
- 0
src/java/org/apache/fop/render/pcl/PCLRenderer.java Voir le fichier

@@ -65,6 +65,7 @@ import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.CTM;
import org.apache.fop.area.NormalFlow;
import org.apache.fop.area.PageViewport;
import org.apache.fop.area.RegionViewport;
import org.apache.fop.area.Trait;
@@ -1045,6 +1046,39 @@ public class PCLRenderer extends PrintRenderer {
currentBPPosition = saveBP;
}
/** {@inheritDoc} */
protected void renderFlow(NormalFlow flow) {
//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);
if (!at.isIdentity()) {
saveGraphicsState();
concatenateTransformationMatrix(mptToPt(at));
}

currentIPPosition = 0;
currentBPPosition = 0;
super.renderFlow(flow);
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.

+ 3
- 0
status.xml Voir le fichier

@@ -60,6 +60,9 @@
-->
<!--/release-->
<release version="0.95" date="TBD">
<action context="Renderers" dev="JM" type="fix">
Fixed positioning of absolutely positioned block-containers in multi-column documents.
</action>
<action context="Renderers" dev="JM" type="fix">
Fixed rendering of fixed block-containers in AFP output.
</action>

+ 71
- 0
test/layoutengine/standard-testcases/block-container_absolute-position_multi-column.xml Voir le fichier

@@ -0,0 +1,71 @@
<?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>
<info>
<p>
This test checks absolutely positioned block-containers in multi-column documents.
</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="0.1in">
<fo:region-body column-count="2" column-gap="0.2in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="normal">
<fo:flow flow-name="xsl-region-body" text-align="justify">
<fo:block background-color="yellow">
This should not have any line floating over it! This should not have any
line floating over it! This should not have any line floating over it! This
should not have any line floating over it!
</fo:block>
<fo:block span="all" background-color="orange">
<fo:block padding-top="0.5em" padding-bottom="0.5em">
This should not have any line floating over it! This should not have any
line floating over it! This should not have any line floating over
it!<fo:block />
</fo:block>
</fo:block>
<fo:block background-color="yellow">
This should not have any line floating over it! This should not have any
line floating over it! This should not have any line floating over it! This
should not have any line floating over it!
</fo:block>
<fo:block-container absolute-position="absolute"
left="2.5in - 0.1in - 0.025in" top="auto" width="0.05in" height="100%" background-color="red">
<fo:block/>
</fo:block-container>
<fo:block-container absolute-position="absolute" left="2.5in - 0.1in" top="auto"
reference-orientation="90">
<fo:block width="100%" line-height="1pt" background-color="black"
height="1pt">&#xA0;</fo:block>
</fo:block-container>
</fo:flow>
</fo:page-sequence>
</fo:root>
</fo>
<checks>
<!--
This test is only visually interesting! Visually check that the block container begins
directly under the spanned block!
-->
<eval expected="1" xpath="count(//pageViewport)"/>
</checks>
</testcase>

Chargement…
Annuler
Enregistrer