You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by vh...@apache.org on 2001/03/13 18:19:39 UTC
cvs commit: xml-batik/sources/org/apache/batik/bridge SVGPatternElementBridge.java
vhardy 01/03/13 09:19:38
Modified: sources/org/apache/batik/bridge SVGPatternElementBridge.java
Log:
Simplified pattern bridge and fixed a couple bugs.
Revision Changes Path
1.16 +68 -48 xml-batik/sources/org/apache/batik/bridge/SVGPatternElementBridge.java
Index: SVGPatternElementBridge.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGPatternElementBridge.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- SVGPatternElementBridge.java 2001/03/08 12:39:28 1.15
+++ SVGPatternElementBridge.java 2001/03/13 17:19:33 1.16
@@ -40,7 +40,7 @@
* Bridge class for the <pattern> element.
*
* @author <a href="mailto:tkormann@apache.org">Thierry Kormann</a>
- * @version $Id: SVGPatternElementBridge.java,v 1.15 2001/03/08 12:39:28 tkormann Exp $
+ * @version $Id: SVGPatternElementBridge.java,v 1.16 2001/03/13 17:19:33 vhardy Exp $
*/
public class SVGPatternElementBridge implements PaintBridge,
SVGConstants,
@@ -74,7 +74,7 @@
return null; // no content means no paint
}
- // get pattern region using 'patternUnits'
+ // get pattern region using 'patternUnits'. Pattern region is in tile pace.
Rectangle2D patternRegion = SVGUtilities.convertPatternRegion
(patternElement, paintedElement, paintedNode, ctx);
@@ -91,12 +91,9 @@
patternTransform = new AffineTransform();
}
- // 'overflow' on the painted element
+ // 'overflow' on the pattern element
boolean overflowIsHidden = CSSUtilities.convertOverflow(patternElement);
- // 'clip' on the painted element
- float[] clip = CSSUtilities.convertClip(patternElement);
-
// 'patternContentUnits' - default is userSpaceOnUse
short contentCoordSystem;
s = SVGUtilities.getChainableAttributeNS
@@ -109,56 +106,84 @@
}
// Compute a transform according to viewBox, preserveAspectRatio
- // and patternContentUnits
+ // and patternContentUnits and the pattern transform attribute.
+ //
+ // The stack of transforms is:
+ //
+ // +-------------------------------+
+ // | viewPortTranslation |
+ // +-------------------------------+
+ // | preserveAspectRatioTransform |
+ // +-------------------------------+
+ // + patternContentUnitsTransform |
+ // +-------------------------------+
+ //
+ // where:
+ // - viewPortTranslation is the transform that translate to the viewPort's
+ // origin.
+ // - preserveAspectRatioTransform is the transformed implied by the
+ // preserveAspectRatio attribute.
+ // - patternContentUnitsTransform is the transform implied by the
+ // patternContentUnits attribute.
+ //
+ // Note that there is an additional transform from the tiling space to the
+ // user space (patternTransform) that is passed separately to the PatternPaintContext.
+ //
GraphicsNodeRenderContext rc = ctx.getGraphicsNodeRenderContext();
- AffineTransform patternContentTransform;
+ AffineTransform patternContentTransform
+ = new AffineTransform();
+
+ //
+ // Process viewPortTranslation
+ //
+ patternContentTransform.translate(patternRegion.getX(),
+ patternRegion.getY());
+
+ //
+ // Process preserveAspectRatioTransform
+ //
// 'viewBox' attribute
String viewBoxStr = SVGUtilities.getChainableAttributeNS
(patternElement, null, SVG_VIEW_BOX_ATTRIBUTE, ctx);
- if (viewBoxStr.length() == 0) {
- // No viewBox has been found, handle 'patternContentUnits'
- if (contentCoordSystem == SVGUtilities.OBJECT_BOUNDING_BOX) {
- // objectBoundingBox: a transform for paintedNode bounds
- Rectangle2D r = paintedNode.getGeometryBounds(rc);
- patternContentTransform = new AffineTransform();
- patternContentTransform.translate(r.getX(), r.getY());
- patternContentTransform.scale(r.getWidth(), r.getHeight());
- } else {
- // userSpaceOnUse: no additional transform required
- patternContentTransform = null;
- }
- } else {
- // A viewBox has been found, handle 'preserveAspectRatio'
+ if (viewBoxStr.length() > 0) {
+ // There is a viewBox attribute. Then, take
+ // preserveAspectRatio into account.
String aspectRatioStr = SVGUtilities.getChainableAttributeNS
(patternElement, null, SVG_PRESERVE_ASPECT_RATIO_ATTRIBUTE, ctx);
float w = (float)patternRegion.getWidth();
float h = (float)patternRegion.getHeight();
- patternContentTransform = ViewBox.getPreserveAspectRatioTransform
+ AffineTransform preserveAspectRatioTransform
+ = ViewBox.getPreserveAspectRatioTransform
(patternElement, viewBoxStr, aspectRatioStr, w, h);
- // <!> FIXME: START
- // - Why do we clip using viewBox region?
- // - Why do we ignore the objectBoundingBox transform?
-
- // clip the patternContentNode according to the 'overflow' property
- if (overflowIsHidden) {
- float [] vb
- = ViewBox.parseViewBoxAttribute(patternElement, viewBoxStr);
- Rectangle2D viewBox
- = new Rectangle2D.Float(vb[0], vb[1], vb[2], vb[3]);
-
- CompositeGraphicsNode comp = new CompositeGraphicsNode();
- comp.getChildren().add(patternContentNode);
-
- Filter filter = new GraphicsNodeRable8Bit(comp, rc);
- comp.setClip(new ClipRable8Bit(filter, viewBox));
-
- patternContentNode = comp;
- }
- // <!> FIXME: END
+ patternContentTransform.concatenate(preserveAspectRatioTransform);
}
+
+ //
+ // Process patternContentUnitsTransform
+ //
+ if(contentCoordSystem == SVGUtilities.OBJECT_BOUNDING_BOX){
+ AffineTransform patternContentUnitsTransform
+ = new AffineTransform();
+ Rectangle2D objectBoundingBox = paintedNode.getGeometryBounds(rc);
+ patternContentUnitsTransform.translate
+ (objectBoundingBox.getX(),
+ objectBoundingBox.getY());
+
+ patternContentUnitsTransform.scale
+ (objectBoundingBox.getWidth(),
+ objectBoundingBox.getHeight());
+
+ patternContentTransform.concatenate
+ (patternContentUnitsTransform);
+ }
+
+ //
+ // Apply transform
+ //
+ patternContentNode.setTransform(patternContentTransform);
// take the opacity into account. opacity is implemented by a Filter
if (opacity != 1) {
@@ -167,20 +192,15 @@
{0, 0, 1, 0, 0},
{0, 0, 0, opacity, 0} };
- // <!> FIXME: Why do we need to create an intermediate node?
ColorMatrixRable filter = ColorMatrixRable8Bit.buildMatrix(matrix);
Filter contentRable
= new GraphicsNodeRable8Bit(patternContentNode, rc);
filter.setSource(contentRable);
patternContentNode.setFilter(filter);
- CompositeGraphicsNode comp = new CompositeGraphicsNode();
- comp.getChildren().add(patternContentNode);
- patternContentNode = comp;
}
return new PatternPaint(patternContentNode,
rc,
- patternContentTransform,
patternRegion,
!overflowIsHidden,
patternTransform);
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org