Author: jeremias
Date: Thu Jan 17 05:37:04 2008
New Revision: 612815
URL: http://svn.apache.org/viewvc?rev=612815&view=rev
Log:
Fixed logic error setting the transformation matrix for block-container
viewports (applies to absolute and fixed block-containers only). The CTM now
only rotates and shifts the content as necessary for reference-orientation and
writing-mode. All the rest of the transformation is done by the renderer which
allows to add additional transformations as made possible by fox:transform (see
below).
Important: External renderer implementations need to adjust for the change and
implement the new method concatenateTransformationMatrix(AffineTransform) if
the renderer is derived from AbstractPathOrientedRenderer.
New extension attribute fox:transform on fo:block-container allows free-form
transformation (rotation, scaling etc.) of absolute and fixed block-containers.
Supported only for PDF, PS and Java2D-based renderers.
Added missing region background painting for PCL renderer.
Added:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml
(with props)
Modified:
xmlgraphics/fop/trunk/src/documentation/content/xdocs/trunk/extensions.xml
xmlgraphics/fop/trunk/src/java/org/apache/fop/area/CTM.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
xmlgraphics/fop/trunk/status.xml
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_display-align.xml
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fixed.xml
Modified:
xmlgraphics/fop/trunk/src/documentation/content/xdocs/trunk/extensions.xml
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/documentation/content/xdocs/trunk/extensions.xml?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/documentation/content/xdocs/trunk/extensions.xml
(original)
+++ xmlgraphics/fop/trunk/src/documentation/content/xdocs/trunk/extensions.xml
Thu Jan 17 05:37:04 2008
@@ -187,6 +187,27 @@
</note>
</section>
</section>
+ <section id="transform">
+ <title>Free-form Transformation for fo:block-container</title>
+ <p>
+ For <code>fo:block-container</code> elements whose
<code>absolute-position</code> set to
+ "absolute" or "fixed" you can use the extension attribute
<code>fox:transform</code>
+ to apply a free-form transformation to the whole block-container.
The content of the
+ <code>fox:transform</code> attribute is the same as for
+ <a
href="http://www.w3.org/TR/SVG/coords.html#TransformAttribute">SVG's transform
attribute</a>.
+ The transformation specified here is performed in addition to other
implicit
+ transformations of the block-container (resulting from top, left and
other properties)
+ and after them.
+ </p>
+ <p>
+ An example: <code>fox:transform="rotate(45)"</code> would rotate the
block-container
+ by 45 degrees clock-wise around its upper-left corner.
+ </p>
+ <note>
+ This extension attribute doesn't work for all output formats! It's
currently only
+ supported for PDF, PS and Java2D-based renderers.
+ </note>
+ </section>
</section>
</body>
</document>
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/area/CTM.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/area/CTM.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/area/CTM.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/area/CTM.java Thu Jan 17
05:37:04 2008
@@ -20,6 +20,7 @@
package org.apache.fop.area;
import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.Serializable;
@@ -101,6 +102,22 @@
}
/**
+ * Initialize a CTM with the values of an AffineTransform.
+ *
+ * @param at the transformation matrix
+ */
+ public CTM(AffineTransform at) {
+ double[] matrix = new double[6];
+ at.getMatrix(matrix);
+ this.a = matrix[0];
+ this.b = matrix[1];
+ this.c = matrix[2];
+ this.d = matrix[3];
+ this.e = matrix[4];
+ this.f = matrix[5];
+ }
+
+ /**
* Return a CTM which will transform coordinates for a particular
writing-mode
* into normalized first quandrant coordinates.
* @param wm A writing mode constant from fo.properties.WritingMode, ie.
@@ -245,6 +262,14 @@
return new double[]{a, b, c, d, e, f};
}
+ /**
+ * Returns this CTM as an AffineTransform object.
+ * @return the AffineTransform representation
+ */
+ public AffineTransform toAffineTransform() {
+ return new AffineTransform(toArray());
+ }
+
/**
* Construct a coordinate transformation matrix (CTM).
* @param absRefOrient absolute reference orientation
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
(original)
+++
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
Thu Jan 17 05:37:04 2008
@@ -19,25 +19,26 @@
package org.apache.fop.layoutmgr;
+import java.awt.Point;
+import java.awt.geom.Rectangle2D;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
-import java.awt.Point;
-import java.awt.geom.Rectangle2D;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.fop.area.Area;
-import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.Block;
+import org.apache.fop.area.BlockViewport;
+import org.apache.fop.area.CTM;
import org.apache.fop.area.Trait;
+import org.apache.fop.datatypes.FODimension;
+import org.apache.fop.datatypes.Length;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.flow.BlockContainer;
import org.apache.fop.fo.properties.CommonAbsolutePosition;
import org.apache.fop.layoutmgr.inline.InlineLayoutManager;
-import org.apache.fop.area.CTM;
-import org.apache.fop.datatypes.FODimension;
-import org.apache.fop.datatypes.Length;
import org.apache.fop.traits.MinOptMax;
import org.apache.fop.traits.SpaceVal;
@@ -485,15 +486,8 @@
vpContentBPD = allocBPD - getBPIndents();
setContentAreaIPD(allocIPD - getIPIndents());
- double contentRectOffsetX = offset.getX();
- contentRectOffsetX += getBlockContainerFO()
- .getCommonMarginBlock().startIndent.getValue(this);
- double contentRectOffsetY = offset.getY();
- contentRectOffsetY += getSpaceBefore(); //TODO Uhm, is that necessary?
- contentRectOffsetY += getBlockContainerFO()
-
.getCommonBorderPaddingBackground().getBorderBeforeWidth(false);
- contentRectOffsetY += getBlockContainerFO()
- .getCommonBorderPaddingBackground().getPaddingBefore(false,
this);
+ double contentRectOffsetX = 0;
+ double contentRectOffsetY = 0;
Rectangle2D rect = new Rectangle2D.Double(
contentRectOffsetX, contentRectOffsetY,
@@ -871,7 +865,8 @@
} else {
viewportBlockArea.setBPD(getContentAreaBPD());
}
-
+ transferForeignAttributes(viewportBlockArea);
+
TraitSetter.setProducerID(viewportBlockArea,
getBlockContainerFO().getId());
TraitSetter.addBorders(viewportBlockArea,
getBlockContainerFO().getCommonBorderPaddingBackground(),
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
(original)
+++
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
Thu Jan 17 05:37:04 2008
@@ -21,12 +21,15 @@
import java.awt.Color;
import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.List;
import java.util.Map;
import org.w3c.dom.Document;
+import org.apache.batik.parser.AWTTransformProducer;
+
import org.apache.xmlgraphics.image.loader.ImageSize;
import org.apache.fop.area.Area;
@@ -39,8 +42,10 @@
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.Viewport;
import org.apache.fop.fo.Constants;
+import org.apache.fop.fo.extensions.ExtensionElementMapping;
import org.apache.fop.fonts.FontMetrics;
import org.apache.fop.traits.BorderProps;
+import org.apache.fop.util.QName;
/**
* Abstract base class for renderers like PDF and PostScript where many
painting operations
@@ -401,6 +406,8 @@
}
+ private final QName FOX_TRANSFORM = new QName(ExtensionElementMapping.URI,
"fox:transform");
+
/** [EMAIL PROTECTED] */
protected void renderBlockViewport(BlockViewport bv, List children) {
// clip and position viewport if necessary
@@ -408,25 +415,17 @@
// save positions
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;
- //String saveFontName = currentFontName;
CTM ctm = bv.getCTM();
int borderPaddingStart = bv.getBorderAndPaddingWidthStart();
int borderPaddingBefore = bv.getBorderAndPaddingWidthBefore();
- float x, y;
- x = (float)(bv.getXOffset() + containingIPPosition) / 1000f;
- y = (float)(bv.getYOffset() + containingBPPosition) / 1000f;
//This is the content-rect
float width = (float)bv.getIPD() / 1000f;
float height = (float)bv.getBPD() / 1000f;
-
if (bv.getPositioning() == Block.ABSOLUTE
|| bv.getPositioning() == Block.FIXED) {
- currentIPPosition = bv.getXOffset();
- currentBPPosition = bv.getYOffset();
-
//For FIXED, we need to break out of the current viewports to the
//one established by the page. We save the state stack for
restoration
//after the block-container has been painted. See below.
@@ -435,37 +434,51 @@
breakOutList = breakOutOfStateStack();
}
- CTM tempctm = new CTM(containingIPPosition, containingBPPosition);
- ctm = tempctm.multiply(ctm);
-
- //Adjust for spaces (from margin or indirectly by start-indent etc.
- x += bv.getSpaceStart() / 1000f;
- currentIPPosition += bv.getSpaceStart();
+ AffineTransform positionTransform = new AffineTransform();
+ positionTransform.translate(bv.getXOffset(), bv.getYOffset());
- y += bv.getSpaceBefore() / 1000f;
- currentBPPosition += bv.getSpaceBefore();
+ //"left/"top" (bv.getX/YOffset()) specify the position of the
content rectangle
+ positionTransform.translate(-borderPaddingStart,
-borderPaddingBefore);
+ //Free transformation for the block-container viewport
+ String transf;
+ transf = bv.getForeignAttributeValue(FOX_TRANSFORM);
+ if (transf != null) {
+ AffineTransform freeTransform =
AWTTransformProducer.createAffineTransform(transf);
+ positionTransform.concatenate(freeTransform);
+ }
+
+ saveGraphicsState();
+ //Viewport position
+ concatenateTransformationMatrix(mptToPt(positionTransform));
+
+ //Background and borders
float bpwidth = (borderPaddingStart +
bv.getBorderAndPaddingWidthEnd()) / 1000f;
float bpheight = (borderPaddingBefore +
bv.getBorderAndPaddingWidthAfter()) / 1000f;
+ drawBackAndBorders(bv, 0, 0, width + bpwidth, height + bpheight);
- drawBackAndBorders(bv, x, y, width + bpwidth, height + bpheight);
-
- //Now adjust for border/padding
- currentIPPosition += borderPaddingStart;
- currentBPPosition += borderPaddingBefore;
+ //Shift to content rectangle after border painting
+ AffineTransform contentRectTransform = new AffineTransform();
+ contentRectTransform.translate(borderPaddingStart,
borderPaddingBefore);
+ concatenateTransformationMatrix(mptToPt(contentRectTransform));
- Rectangle2D clippingRect = null;
+ //Clipping
if (bv.getClip()) {
- clippingRect = new Rectangle(currentIPPosition,
currentBPPosition,
- bv.getIPD(), bv.getBPD());
+ clipRect(0f, 0f, width, height);
}
- startVParea(ctm, clippingRect);
+ saveGraphicsState();
+ //Set up coordinate system for content rectangle
+ AffineTransform contentTransform = ctm.toAffineTransform();
+ concatenateTransformationMatrix(mptToPt(contentTransform));
+
currentIPPosition = 0;
currentBPPosition = 0;
renderBlocks(bv, children);
- endVParea();
+ restoreGraphicsState();
+ restoreGraphicsState();
+
if (breakOutList != null) {
restoreStateStackAfterBreakOut(breakOutList);
}
@@ -505,10 +518,16 @@
currentBPPosition += (int)(bv.getAllocBPD());
}
- //currentFontName = saveFontName;
}
/**
+ * Concatenates the current transformation matrix with the given one,
therefore establishing
+ * a new coordinate system.
+ * @param at the transformation matrix to process (coordinates in points)
+ */
+ protected abstract void concatenateTransformationMatrix(AffineTransform
at);
+
+ /**
* Render an inline viewport.
* This renders an inline viewport by clipping if necessary.
* @param viewport the viewport to handle
@@ -613,10 +632,10 @@
/**
* Clip using a rectangular area.
- * @param x the x coordinate
- * @param y the y coordinate
- * @param width the width of the rectangle
- * @param height the height of the rectangle
+ * @param x the x coordinate (in points)
+ * @param y the y coordinate (in points)
+ * @param width the width of the rectangle (in points)
+ * @param height the height of the rectangle (in points)
*/
protected abstract void clipRect(float x, float y, float width, float
height);
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
Thu Jan 17 05:37:04 2008
@@ -21,6 +21,7 @@
// Java
import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.OutputStream;
@@ -835,5 +836,33 @@
*/
public String getMimeType() {
return null;
+ }
+
+ /**
+ * Converts a millipoint-based transformation matrix to points.
+ * @param at a millipoint-based transformation matrix
+ * @return a point-based transformation matrix
+ */
+ protected AffineTransform mptToPt(AffineTransform at) {
+ double[] matrix = new double[6];
+ at.getMatrix(matrix);
+ //Convert to points
+ matrix[4] = matrix[4] / 1000;
+ matrix[5] = matrix[5] / 1000;
+ return new AffineTransform(matrix);
+ }
+
+ /**
+ * Converts a point-based transformation matrix to millipoints.
+ * @param at a point-based transformation matrix
+ * @return a millipoint-based transformation matrix
+ */
+ protected AffineTransform ptToMpt(AffineTransform at) {
+ double[] matrix = new double[6];
+ at.getMatrix(matrix);
+ //Convert to millipoints
+ matrix[4] = matrix[4] * 1000;
+ matrix[5] = matrix[5] * 1000;
+ return new AffineTransform(matrix);
}
}
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java
Thu Jan 17 05:37:04 2008
@@ -22,6 +22,7 @@
import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.RenderedImage;
import java.io.FileNotFoundException;
@@ -525,6 +526,12 @@
// currentFontName = saveFontName;
}
+ /** [EMAIL PROTECTED] */
+ protected void concatenateTransformationMatrix(AffineTransform at) {
+ //Not used here since AFPRenderer defines its own
renderBlockViewport() method.
+ throw new UnsupportedOperationException("NYI");
+ }
+
/**
* [EMAIL PROTECTED]
*/
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
(original)
+++
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
Thu Jan 17 05:37:04 2008
@@ -399,9 +399,12 @@
state = (Java2DGraphicsState)stateStack.pop();
}
- /**
- * [EMAIL PROTECTED]
- */
+ /** [EMAIL PROTECTED] */
+ protected void concatenateTransformationMatrix(AffineTransform at) {
+ state.transform(at);
+ }
+
+ /** [EMAIL PROTECTED] */
protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
saveGraphicsState();
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLRenderer.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pcl/PCLRenderer.java
Thu Jan 17 05:37:04 2008
@@ -66,6 +66,7 @@
import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.CTM;
import org.apache.fop.area.PageViewport;
+import org.apache.fop.area.RegionViewport;
import org.apache.fop.area.Trait;
import org.apache.fop.area.inline.AbstractTextArea;
import org.apache.fop.area.inline.ForeignObject;
@@ -92,6 +93,12 @@
import org.apache.fop.util.QName;
import org.apache.fop.util.UnitConv;
+/* Note:
+ * There are some commonalities with AbstractPathOrientedRenderer but it's not
possible
+ * to derive from it due to PCL's restrictions. We may need an additional
common subclass to
+ * avoid methods copied from AbstractPathOrientedRenderer. Or we wait until
after the IF redesign.
+ */
+
/**
* Renderer for the PCL 5 printer language. It also uses HP GL/2 for certain
graphic elements.
*/
@@ -582,6 +589,24 @@
/**
* [EMAIL PROTECTED]
+ * @todo Copied from AbstractPathOrientedRenderer
+ */
+ protected void handleRegionTraits(RegionViewport region) {
+ Rectangle2D viewArea = region.getViewArea();
+ float startx = (float)(viewArea.getX() / 1000f);
+ float starty = (float)(viewArea.getY() / 1000f);
+ float width = (float)(viewArea.getWidth() / 1000f);
+ float height = (float)(viewArea.getHeight() / 1000f);
+
+ if (region.getRegionReference().getRegionClass() == FO_REGION_BODY) {
+ currentBPPosition = region.getBorderAndPaddingWidthBefore();
+ currentIPPosition = region.getBorderAndPaddingWidthStart();
+ }
+ drawBackAndBorders(region, startx, starty, width, height);
+ }
+
+ /**
+ * [EMAIL PROTECTED]
*/
protected void renderText(final TextArea text) {
renderInlineAreaBackAndBorders(text);
@@ -881,14 +906,10 @@
// save positions
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;
- //String saveFontName = currentFontName;
CTM ctm = bv.getCTM();
int borderPaddingStart = bv.getBorderAndPaddingWidthStart();
int borderPaddingBefore = bv.getBorderAndPaddingWidthBefore();
- float x, y;
- x = (float)(bv.getXOffset() + containingIPPosition) / 1000f;
- y = (float)(bv.getYOffset() + containingBPPosition) / 1000f;
//This is the content-rect
float width = (float)bv.getIPD() / 1000f;
float height = (float)bv.getBPD() / 1000f;
@@ -897,9 +918,6 @@
if (bv.getPositioning() == Block.ABSOLUTE
|| bv.getPositioning() == Block.FIXED) {
- currentIPPosition = bv.getXOffset();
- currentBPPosition = bv.getYOffset();
-
//For FIXED, we need to break out of the current viewports to the
//one established by the page. We save the state stack for
restoration
//after the block-container has been painted. See below.
@@ -908,36 +926,42 @@
breakOutList = breakOutOfStateStack();
}
- CTM tempctm = new CTM(containingIPPosition, containingBPPosition);
- ctm = tempctm.multiply(ctm);
-
- //Adjust for spaces (from margin or indirectly by start-indent etc.
- x += bv.getSpaceStart() / 1000f;
- currentIPPosition += bv.getSpaceStart();
+ AffineTransform positionTransform = new AffineTransform();
+ positionTransform.translate(bv.getXOffset(), bv.getYOffset());
- y += bv.getSpaceBefore() / 1000f;
- currentBPPosition += bv.getSpaceBefore();
+ //"left/"top" (bv.getX/YOffset()) specify the position of the
content rectangle
+ positionTransform.translate(-borderPaddingStart,
-borderPaddingBefore);
+ saveGraphicsState();
+ //Viewport position
+ concatenateTransformationMatrix(mptToPt(positionTransform));
+
+ //Background and borders
float bpwidth = (borderPaddingStart +
bv.getBorderAndPaddingWidthEnd()) / 1000f;
float bpheight = (borderPaddingBefore +
bv.getBorderAndPaddingWidthAfter()) / 1000f;
+ drawBackAndBorders(bv, 0, 0, width + bpwidth, height + bpheight);
- drawBackAndBorders(bv, x, y, width + bpwidth, height + bpheight);
-
- //Now adjust for border/padding
- currentIPPosition += borderPaddingStart;
- currentBPPosition += borderPaddingBefore;
+ //Shift to content rectangle after border painting
+ AffineTransform contentRectTransform = new AffineTransform();
+ contentRectTransform.translate(borderPaddingStart,
borderPaddingBefore);
+ concatenateTransformationMatrix(mptToPt(contentRectTransform));
- Rectangle2D clippingRect = null;
+ //Clipping
if (bv.getClip()) {
- clippingRect = new Rectangle(currentIPPosition,
currentBPPosition,
- bv.getIPD(), bv.getBPD());
+ clipRect(0f, 0f, width, height);
}
- startVParea(ctm, clippingRect);
+ saveGraphicsState();
+ //Set up coordinate system for content rectangle
+ AffineTransform contentTransform = ctm.toAffineTransform();
+ concatenateTransformationMatrix(mptToPt(contentTransform));
+
currentIPPosition = 0;
currentBPPosition = 0;
renderBlocks(bv, children);
- endVParea();
+
+ restoreGraphicsState();
+ restoreGraphicsState();
if (breakOutList != null) {
restoreStateStackAfterBreakOut(breakOutList);
@@ -981,6 +1005,18 @@
//currentFontName = saveFontName;
}
+ /**
+ * Concatenates the current transformation matrix with the given one,
therefore establishing
+ * a new coordinate system.
+ * @param at the transformation matrix to process (coordinates in points)
+ */
+ protected void concatenateTransformationMatrix(AffineTransform at) {
+ if (!at.isIdentity()) {
+ graphicContext.transform(ptToMpt(at));
+ changePrintDirection();
+ }
+ }
+
private List breakOutOfStateStack() {
log.debug("Block.FIXED --> break out");
List breakOutList = new java.util.ArrayList();
@@ -1280,8 +1316,8 @@
final BorderProps bpsStart, final BorderProps bpsEnd) {
Graphics2DAdapter g2a = getGraphics2DAdapter();
final Rectangle.Float effBorderRect = new Rectangle2D.Float(
- borderRect.x - (currentIPPosition / 1000f),
- borderRect.y - (currentBPPosition / 1000f),
+ 0,
+ 0,
borderRect.width,
borderRect.height);
final Rectangle paintRect = new Rectangle(
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java
Thu Jan 17 05:37:04 2008
@@ -639,16 +639,24 @@
}
}
- /** Saves the graphics state of the rendering engine. */
+ /** [EMAIL PROTECTED] */
protected void saveGraphicsState() {
endTextObject();
+ currentState.push();
currentStream.add("q\n");
}
- /** Restores the last graphics state of the rendering engine. */
- protected void restoreGraphicsState() {
+ private void restoreGraphicsState(boolean popState) {
endTextObject();
currentStream.add("Q\n");
+ if (popState) {
+ currentState.pop();
+ }
+ }
+
+ /** [EMAIL PROTECTED] */
+ protected void restoreGraphicsState() {
+ restoreGraphicsState(true);
}
/** Indicates the beginning of a text object. */
@@ -786,16 +794,14 @@
this.pdfDoc.output(ostream);
}
- /**
- * [EMAIL PROTECTED]
- */
+ /** [EMAIL PROTECTED] */
protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
+ saveGraphicsState();
+ //currentState.push();
// Set the given CTM in the graphics state
- currentState.push();
currentState.concatenate(
new AffineTransform(CTMHelper.toPDFArray(ctm)));
- saveGraphicsState();
if (clippingRect != null) {
clipRect((float)clippingRect.getX() / 1000f,
(float)clippingRect.getY() / 1000f,
@@ -806,14 +812,21 @@
currentStream.add(CTMHelper.toPDFString(ctm) + " cm\n");
}
- /**
- * [EMAIL PROTECTED]
- */
+ /** [EMAIL PROTECTED] */
protected void endVParea() {
restoreGraphicsState();
- currentState.pop();
+ //currentState.pop();
}
+ /** [EMAIL PROTECTED] */
+ protected void concatenateTransformationMatrix(AffineTransform at) {
+ System.out.println(at);
+ if (!at.isIdentity()) {
+ currentState.concatenate(at);
+ currentStream.add(CTMHelper.toPDFString(at, false) + " cm\n");
+ }
+ }
+
/**
* Handle the traits for a region
* This is used to draw the traits for the given page region.
@@ -1015,15 +1028,7 @@
}
}
- /**
- * Clip a rectangular area.
- * write a clipping operation given coordinates in the current
- * transform.
- * @param x the x coordinate
- * @param y the y coordinate
- * @param width the width of the area
- * @param height the height of the area
- */
+ /** [EMAIL PROTECTED] */
protected void clipRect(float x, float y, float width, float height) {
currentStream.add(format(x) + " " + format(y) + " "
+ format(width) + " " + format(height) + " re ");
@@ -1104,7 +1109,7 @@
comment("------ break out!");
}
breakOutList.add(0, data); //Insert because of stack-popping
- restoreGraphicsState();
+ restoreGraphicsState(false);
}
return breakOutList;
}
@@ -1114,23 +1119,14 @@
* @param breakOutList the state stack to restore.
*/
protected void restoreStateStackAfterBreakOut(List breakOutList) {
- CTM tempctm;
comment("------ restoring context after break-out...");
PDFState.Data data;
Iterator i = breakOutList.iterator();
- double[] matrix = new double[6];
while (i.hasNext()) {
data = (PDFState.Data)i.next();
- currentState.push();
saveGraphicsState();
AffineTransform at = data.getTransform();
- if (!at.isIdentity()) {
- currentState.concatenate(at);
- at.getMatrix(matrix);
- tempctm = new CTM(matrix[0], matrix[1], matrix[2], matrix[3],
- matrix[4] * 1000, matrix[5] * 1000);
- currentStream.add(CTMHelper.toPDFString(tempctm) + " cm\n");
- }
+ concatenateTransformationMatrix(at);
//TODO Break-out: Also restore items such as line width and color
//Left out for now because all this painting stuff is very
//inconsistent. Some values go over PDFState, some don't.
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java Thu
Jan 17 05:37:04 2008
@@ -21,6 +21,7 @@
// Java
import java.awt.Color;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.RenderedImage;
import java.io.File;
@@ -326,15 +327,7 @@
writeln("clip newpath");
}
- /**
- * Clip an area.
- * Write a clipping operation given coordinates in the current
- * transform.
- * @param x the x coordinate
- * @param y the y coordinate
- * @param width the width of the area
- * @param height the height of the area
- */
+ /** [EMAIL PROTECTED] */
protected void clipRect(float x, float y, float width, float height) {
try {
gen.defineRect(x, y, width, height);
@@ -619,6 +612,7 @@
/** Restores the last graphics state of the rendering engine. */
public void restoreGraphicsState() {
try {
+ endTextObject();
//delegate
gen.restoreGraphicsState();
} catch (IOException ioe) {
@@ -657,6 +651,15 @@
}
}
+ /** [EMAIL PROTECTED] */
+ protected void concatenateTransformationMatrix(AffineTransform at) {
+ try {
+ gen.concatMatrix(at);
+ } catch (IOException ioe) {
+ handleIOTrouble(ioe);
+ }
+ }
+
private String getPostScriptNameForFontKey(String key) {
Map fonts = fontInfo.getFonts();
Typeface tf = (Typeface)fonts.get(key);
@@ -1284,9 +1287,9 @@
/** Indicates the end of a text object. */
protected void endTextObject() {
if (inTextMode) {
+ inTextMode = false; //set before restoreGraphicsState() to avoid
recursion
writeln("ET");
restoreGraphicsState();
- inTextMode = false;
}
}
@@ -1466,7 +1469,6 @@
* [EMAIL PROTECTED]
*/
protected void endVParea() {
- endTextObject();
restoreGraphicsState();
}
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
Thu Jan 17 05:37:04 2008
@@ -21,6 +21,7 @@
import java.awt.Color;
import java.awt.Point;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.OutputStream;
@@ -322,6 +323,7 @@
* [EMAIL PROTECTED]
*/
protected void saveGraphicsState() {
+ currentState.push(new CTM());
}
/**
@@ -329,6 +331,7 @@
* [EMAIL PROTECTED]
*/
protected void restoreGraphicsState() {
+ currentState.pop();
}
/**
@@ -564,4 +567,10 @@
protected void endVParea() {
currentState.pop();
}
+
+ /** [EMAIL PROTECTED] */
+ protected void concatenateTransformationMatrix(AffineTransform at) {
+ currentState.push(new CTM(ptToMpt(at)));
+ }
+
}
Modified: xmlgraphics/fop/trunk/status.xml
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/status.xml?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Thu Jan 17 05:37:04 2008
@@ -28,6 +28,22 @@
<changes>
<release version="FOP Trunk">
+ <action context="Code" dev="JM" type="fix">
+ Compliance fix: for absolutely positioned block-containers, "top"
wasn't
+ interpreted correctly.
+ </action>
+ <action context="Code" dev="JM" type="add">
+ New extension attribute fox:transform on fo:block-container allows
free-form transformation
+ (rotation, scaling etc.) of absolute and fixed block-containers.
Supported only
+ for PDF, PS and Java2D-based renderers.
+ </action>
+ <action context="Code" dev="JM" type="fix">
+ Fixed logic error setting the transformation matrix for
block-container viewports
+ (applies to absolute and fixed block-containers only).
+ Important: External renderer implementations need to adjust for the
change and implement
+ the new method concatenateTransformationMatrix(AffineTransform) if the
renderer is
+ derived from AbstractPathOrientedRenderer.
+ </action>
<action context="Code" dev="JM" importance="high" type="fix">
A new image loading framework has been introduced to fix various
problems with external
graphics and improve performance.
Modified:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_display-align.xml
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_display-align.xml?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_display-align.xml
(original)
+++
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_display-align.xml
Thu Jan 17 05:37:04 2008
@@ -58,7 +58,7 @@
<checks>
<!-- first block-container -->
<true
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@is-viewport-area"/>
- <eval expected="[1.0 0.0 0.0 1.0 10000.0 10000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ctm"/>
+ <eval expected="[1.0 0.0 0.0 1.0 0.0 0.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ctm"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ipd"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ipda"/>
<eval expected="100000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@bpd"/>
@@ -74,7 +74,7 @@
<!-- second block-container -->
<true
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@is-viewport-area"/>
- <eval expected="[0.0 -1.0 1.0 0.0 190000.0 160000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@ctm"/>
+ <eval expected="[0.0 -1.0 1.0 0.0 0.0 150000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@ctm"/>
<eval expected="100000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@ipd"/>
<eval expected="100000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@ipda"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@bpd"/>
@@ -90,7 +90,7 @@
<!-- third block-container -->
<true
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[3]/@is-viewport-area"/>
- <eval expected="[-1.0 -0.0 0.0 -1.0 160000.0 290000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[3]/@ctm"/>
+ <eval expected="[-1.0 -0.0 0.0 -1.0 150000.0 100000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[3]/@ctm"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[3]/@ipd"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[3]/@ipda"/>
<eval expected="100000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[3]/@bpd"/>
@@ -109,7 +109,7 @@
<!-- fourth block-container -->
<true
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[4]/@is-viewport-area"/>
- <eval expected="[0.0 1.0 -1.0 0.0 290000.0 190000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[4]/@ctm"/>
+ <eval expected="[0.0 1.0 -1.0 0.0 100000.0 0.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[4]/@ctm"/>
<eval expected="100000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[4]/@ipd"/>
<eval expected="100000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[4]/@ipda"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[4]/@bpd"/>
@@ -128,7 +128,7 @@
<!-- fifth block-container -->
<true
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[5]/@is-viewport-area"/>
- <eval expected="[1.0 0.0 0.0 1.0 30000.0 150000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[5]/@ctm"/>
+ <eval expected="[1.0 0.0 0.0 1.0 0.0 0.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[5]/@ctm"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[5]/@ipd"/>
<eval expected="150000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[5]/@ipda"/>
<eval expected="28800"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[5]/@bpd"/>
Modified:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fixed.xml
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fixed.xml?rev=612815&r1=612814&r2=612815&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fixed.xml
(original)
+++
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fixed.xml
Thu Jan 17 05:37:04 2008
@@ -56,8 +56,8 @@
<true
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@is-viewport-area"/>
<eval expected="fixed"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@positioning"/>
<eval expected="absolute"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@positioning"/>
- <eval expected="[1.0 0.0 0.0 1.0 30000.0 30000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ctm"/>
- <eval expected="[1.0 0.0 0.0 1.0 30000.0 30000.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@ctm"/>
+ <eval expected="[1.0 0.0 0.0 1.0 0.0 0.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@ctm"/>
+ <eval expected="[1.0 0.0 0.0 1.0 0.0 0.0]"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@ctm"/>
<eval expected="30000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@left-position"/>
<eval expected="30000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[2]/@left-position"/>
<eval expected="30000"
xpath="/areaTree/pageSequence/pageViewport/page[1]/regionViewport/regionBody/mainReference/span/flow/block[1]/@top-position"/>
Added:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml?rev=612815&view=auto
==============================================================================
---
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml
(added)
+++
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml
Thu Jan 17 05:37:04 2008
@@ -0,0 +1,54 @@
+<?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 with
fox:transform.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
+ <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">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block-container id="ro0" left="10pt" top="10pt" width="150pt"
height="100pt" absolute-position="absolute" background-color="orange"
margin="0pt" border="solid 5pt" border-top-color="red"
reference-orientation="0">
+ <fo:block background-color="yellow" start-indent="0pt"
end-indent="0pt">ro = 0</fo:block>
+ </fo:block-container>
+ <fo:block-container id="ro90" left="190pt" top="10pt" width="150pt"
height="100pt" absolute-position="absolute" background-color="orange"
margin="0pt" border="solid 5pt" border-top-color="red"
reference-orientation="90" fox:transform="rotate(2)">
+ <fo:block background-color="yellow" start-indent="0pt"
end-indent="0pt">ro = 90</fo:block>
+ </fo:block-container>
+ <fo:block-container id="ro180" left="10pt" top="190pt" width="150pt"
height="100pt" absolute-position="absolute" background-color="orange"
margin="0pt" border="solid 5pt" border-top-color="red"
reference-orientation="180" fox:transform="scale(0.5) skewX(45)">
+ <fo:block background-color="yellow" start-indent="0pt"
end-indent="0pt">ro = 180</fo:block>
+ </fo:block-container>
+ <fo:block-container id="ro270" left="190pt" top="190pt"
width="150pt" height="100pt" absolute-position="absolute"
background-color="orange" margin="0pt" border="solid 5pt"
border-top-color="red" reference-orientation="270">
+ <fo:block background-color="yellow" start-indent="0pt"
end-indent="0pt">ro = 270</fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
+ <eval expected="rotate(2)" xpath="//[EMAIL
PROTECTED]'ro90']/@fox:transform"/>
+ <eval expected="scale(0.5) skewX(45)" xpath="//[EMAIL
PROTECTED]'ro180']/@fox:transform"/>
+ </checks>
+</testcase>
Propchange:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block-container_absolute-position_fox-transform.xml
------------------------------------------------------------------------------
svn:keywords = Id
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]