deweese 2003/09/11 03:40:24 Modified: samples/tests/spec/scripting zeroSize.svg sources/org/apache/batik/bridge BridgeContext.java SVGCircleElementBridge.java SVGEllipseElementBridge.java SVGImageElementBridge.java SVGRectElementBridge.java sources/org/apache/batik/gvt RasterImageNode.java ShapeNode.java sources/org/apache/batik/gvt/event AWTEventDispatcher.java test-references/samples/tests/spec/scripting zeroSize.png Log: 1) Zero w/h image elements no longer cause problems with rendering. 2) You can now get correct bbox information for zero w/h items (circle, ellipse, rect, image). 3) Ammended zeroSize test to test both of these. Revision Changes Path 1.3 +109 -2 xml-batik/samples/tests/spec/scripting/zeroSize.svg Index: zeroSize.svg =================================================================== RCS file: /home/cvs/xml-batik/samples/tests/spec/scripting/zeroSize.svg,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- zeroSize.svg 8 Aug 2003 11:39:33 -0000 1.2 +++ zeroSize.svg 11 Sep 2003 10:40:23 -0000 1.3 @@ -61,24 +61,87 @@ <?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?> -<svg id="body" width="450" height="500" viewBox="0 0 450 500"> +<svg id="body" width="450" height="500" viewBox="0 0 450 500" + onload="doShowBounds=false"> <title>Resizing zero w/h items 'onload'</title> <text x="50%" y="45" class="title">Resizing zero w/h items 'onload'</text> <script type="text/ecmascript"><![CDATA[ + var svgns = "http://www.w3.org/2000/svg"; + var root = document.getRootElement(); + var doShowBounds = true; + var stressTest = false; + function resizeRect(id, w, h) { var rect = document.getElementById(id); + var ow = rect.getAttribute("width"); + var oh = rect.getAttribute("height"); rect.setAttribute("width", w); rect.setAttribute("height", h); + showBounds(rect); + if (stressTest) + setTimeout("resizeRect('"+id+"',"+ow+","+oh+")", 1000); } + function resizeCircle(id, r) { var circle = document.getElementById(id); + var or = circle.getAttribute("r"); circle.setAttribute("r", r); + showBounds(circle); + if (stressTest) + setTimeout("resizeCircle('"+id+"',"+or+")", 1000); } function resizeEllipse(id, rx, ry) { var ellipse = document.getElementById(id); + var orx = ellipse.getAttribute("rx"); + var ory = ellipse.getAttribute("ry"); ellipse.setAttribute("rx", rx); ellipse.setAttribute("ry", ry); + showBounds(ellipse); + if (stressTest) + setTimeout("resizeEllipse('"+id+"',"+orx+","+ory+")", 1000); + } + + function showBounds(shape) { + if (!doShowBounds) return; + var bbox = shape.getBBox(); + var elem; + if (bbox.width == 0) { + if (bbox.height == 0) { + elem = document.createElementNS(svgns, "circle"); + elem.setAttribute("cx", ""+bbox.x); + elem.setAttribute("cy", ""+bbox.y); + elem.setAttribute("r", "5"); + elem.setAttribute("stroke","none"); + elem.setAttribute("fill","lime"); + elem.setAttribute("fill-opacity", ".5"); + shape.parentNode.insertBefore(elem, shape.nextSibling); + return; + } else { + elem = document.createElementNS(svgns, "line"); + elem.setAttribute("x1", ""+bbox.x); + elem.setAttribute("y1", ""+bbox.y); + elem.setAttribute("x2", ""+bbox.x); + elem.setAttribute("y2", ""+(bbox.y+bbox.height)); + } + } else if (bbox.height == 0) { + elem = document.createElementNS(svgns, "line"); + elem.setAttribute("x1", ""+bbox.x); + elem.setAttribute("y1", ""+bbox.y); + elem.setAttribute("x2", ""+(bbox.x+bbox.width)); + elem.setAttribute("y2", ""+bbox.y); + } else { + elem = document.createElementNS(svgns, "rect"); + elem.setAttribute("x", ""+bbox.x); + elem.setAttribute("y", ""+bbox.y); + elem.setAttribute("width", ""+bbox.width); + elem.setAttribute("height", ""+bbox.height); + } + elem.setAttribute("fill","none"); + elem.setAttribute("stroke-width", "5"); + elem.setAttribute("stroke", "lime"); + elem.setAttribute("stroke-opacity", ".5"); + shape.parentNode.insertBefore(elem, shape.nextSibling); } ]]></script> @@ -155,6 +218,50 @@ onload="resizeEllipse('e4-2', '25', '0')"/> <ellipse id="e4-3" cx="395" cy="265" rx="25" ry="15" onload="resizeEllipse('e4-3', '0', '15')"/> + </g> + + <g transform="translate(0,300)"> + <image id="i5-1" x="10" y="0" width="50" height="50" + xlink:href="../../resources/images/png2.png" + onload="resizeRect('i5-1', '0', '0')"/> + <image id="i5-2" x="70" y="0" width="50" height="50" + xlink:href="../../resources/images/png2.png" + onload="resizeRect('i5-2', '50', '0')"/> + <image id="i5-3" x="130" y="0" width="50" height="50" + xlink:href="../../resources/images/png2.png" + onload="resizeRect('i5-3', '0', '50')"/> + + <image id="i5-4" x="190" y="0" width="0" height="0" + xlink:href="../../resources/images/png2.png" + onload="resizeRect('i5-4', '50', '50')"/> + <image id="i5-5" x="250" y="0" width="50" height="0" + xlink:href="../../resources/images/png2.png" + onload="resizeRect('i5-5', '50', '50')"/> + <image id="i5-6" x="310" y="0" width="0" height="50" + xlink:href="../../resources/images/png2.png" + onload="resizeRect('i5-6', '50', '50')"/> + </g> + + <g transform="translate(0,360)"> + <image id="i6-1" x="10" y="0" width="50" height="50" + xlink:href="../../resources/images/svg2.svg" + onload="resizeRect('i6-1', '0', '0')"/> + <image id="i6-2" x="70" y="0" width="50" height="50" + xlink:href="../../resources/images/svg2.svg" + onload="resizeRect('i6-2', '50', '0')"/> + <image id="i6-3" x="130" y="0" width="50" height="50" + xlink:href="../../resources/images/svg2.svg" + onload="resizeRect('i6-3', '0', '50')"/> + + <image id="i6-4" x="190" y="0" width="0" height="0" + xlink:href="../../resources/images/svg2.svg" + onload="resizeRect('i6-4', '50', '50')"/> + <image id="i6-5" x="250" y="0" width="50" height="0" + xlink:href="../../resources/images/svg2.svg" + onload="resizeRect('i6-5', '50', '50')"/> + <image id="i6-6" x="310" y="0" width="0" height="50" + xlink:href="../../resources/images/svg2.svg" + onload="resizeRect('i6-6', '50', '50')"/> </g> </g> </svg> 1.72 +3 -2 xml-batik/sources/org/apache/batik/bridge/BridgeContext.java Index: BridgeContext.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeContext.java,v retrieving revision 1.71 retrieving revision 1.72 diff -u -r1.71 -r1.72 --- BridgeContext.java 14 Aug 2003 00:53:51 -0000 1.71 +++ BridgeContext.java 11 Sep 2003 10:40:24 -0000 1.72 @@ -1038,7 +1038,8 @@ Iterator iter = interpreterMap.values().iterator(); while (iter.hasNext()) { Interpreter interpreter = (Interpreter)iter.next(); - interpreter.dispose(); + if (interpreter != null) + interpreter.dispose(); } interpreterMap.clear(); 1.14 +12 -6 xml-batik/sources/org/apache/batik/bridge/SVGCircleElementBridge.java Index: SVGCircleElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGCircleElementBridge.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- SVGCircleElementBridge.java 7 Sep 2003 22:25:27 -0000 1.13 +++ SVGCircleElementBridge.java 11 Sep 2003 10:40:24 -0000 1.14 @@ -51,8 +51,10 @@ package org.apache.batik.bridge; import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; import org.apache.batik.gvt.ShapeNode; +import org.apache.batik.gvt.ShapePainter; import org.w3c.dom.Element; import org.w3c.dom.events.MutationEvent; @@ -122,11 +124,6 @@ throw new BridgeException(e, ERR_ATTRIBUTE_MISSING, new Object[] {SVG_R_ATTRIBUTE, s}); } - // A value of zero disables rendering of the element - if (r == 0) { - shapeNode.setShape(null); - return; - } float x = cx - r; float y = cy - r; float w = r * 2; @@ -149,5 +146,14 @@ } else { super.handleDOMAttrModifiedEvent(evt); } + } + + protected ShapePainter createShapePainter(BridgeContext ctx, + Element e, + ShapeNode shapeNode) { + Rectangle2D r2d = shapeNode.getShape().getBounds2D(); + if ((r2d.getWidth() == 0) || (r2d.getHeight() == 0)) + return null; + return super.createShapePainter(ctx, e, shapeNode); } } 1.14 +12 -7 xml-batik/sources/org/apache/batik/bridge/SVGEllipseElementBridge.java Index: SVGEllipseElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGEllipseElementBridge.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- SVGEllipseElementBridge.java 8 Aug 2003 11:38:51 -0000 1.13 +++ SVGEllipseElementBridge.java 11 Sep 2003 10:40:24 -0000 1.14 @@ -51,8 +51,10 @@ package org.apache.batik.bridge; import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; import org.apache.batik.gvt.ShapeNode; +import org.apache.batik.gvt.ShapePainter; import org.w3c.dom.Element; import org.w3c.dom.events.MutationEvent; @@ -135,12 +137,6 @@ new Object[] {SVG_RY_ATTRIBUTE, s}); } - // A value of zero disables rendering of the element - if ((rx == 0) || (ry == 0)) { - shapeNode.setShape(null); - return; - } - shapeNode.setShape(new Ellipse2D.Float(cx-rx, cy-ry, rx*2, ry*2)); } @@ -161,5 +157,14 @@ } else { super.handleDOMAttrModifiedEvent(evt); } + } + + protected ShapePainter createShapePainter(BridgeContext ctx, + Element e, + ShapeNode shapeNode) { + Rectangle2D r2d = shapeNode.getShape().getBounds2D(); + if ((r2d.getWidth() == 0) || (r2d.getHeight() == 0)) + return null; + return super.createShapePainter(ctx, e, shapeNode); } } 1.61 +104 -65 xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java Index: SVGImageElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java,v retrieving revision 1.60 retrieving revision 1.61 diff -u -r1.60 -r1.61 --- SVGImageElementBridge.java 27 Aug 2003 11:07:40 -0000 1.60 +++ SVGImageElementBridge.java 11 Sep 2003 10:40:24 -0000 1.61 @@ -76,6 +76,7 @@ import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.gvt.ImageNode; import org.apache.batik.gvt.RasterImageNode; +import org.apache.batik.gvt.ShapeNode; import org.apache.batik.util.ParsedURL; import org.apache.batik.util.MimeTypeConstants; import org.w3c.dom.Document; @@ -419,76 +420,101 @@ if (attrName.equals(SVG_X_ATTRIBUTE) || attrName.equals(SVG_Y_ATTRIBUTE) || - attrName.equals(SVG_WIDTH_ATTRIBUTE) || - attrName.equals(SVG_HEIGHT_ATTRIBUTE) || attrName.equals(SVG_PRESERVE_ASPECT_RATIO_ATTRIBUTE)){ - - //retrieve the new bounds of the image tag - Rectangle2D bounds = getImageBounds(ctx, e); - GraphicsNode imageNode = ((ImageNode)node).getImage(); - float [] vb = null; - if (imageNode instanceof RasterImageNode) { - //Raster image - Rectangle2D imgBounds = - ((RasterImageNode)imageNode).getImageBounds(); - // create the implicit viewBox for the raster - // image. The viewBox for a raster image is the size - // of the image - vb = new float[4]; - vb[0] = 0; // x - vb[1] = 0; // y - vb[2] = (float)imgBounds.getWidth(); // width - vb[3] = (float)imgBounds.getHeight(); // height - } else { - if (imgDocument != null) { - Element svgElement = imgDocument.getRootElement(); - String viewBox = svgElement.getAttributeNS - (null, SVG_VIEW_BOX_ATTRIBUTE); - vb = ViewBox.parseViewBoxAttribute(e, viewBox); - } - } - if (imageNode != null) { - // handles the 'preserveAspectRatio', 'overflow' and - // 'clip' and sets the appropriate AffineTransform to - // the image node - initializeViewport(ctx, e, imageNode, vb, bounds); - } - + updateImageBounds(); } else if (( XLinkSupport.XLINK_NAMESPACE_URI.equals (evtNode.getNamespaceURI()) ) && SVG_HREF_ATTRIBUTE.equals(evtNode.getLocalName()) ){ - //reference copy of the imgDocument - SVGDocument oldSVGDoc = imgDocument; - - //update of the reference of the image. - GraphicsNode inode = buildImageGraphicsNode(ctx,e); - - if (inode == null) { - String uriStr = XLinkSupport.getXLinkHref(e); - throw new BridgeException(e, ERR_URI_IMAGE_INVALID, - new Object[] {uriStr}); - } - ImageNode imgNode = (ImageNode)node; - //HACK : see 'initializeDynamicSupport' - if (imgNode.getImage() instanceof RasterImageNode) { - // register the RasterImageNode instead - ctx.unbind(e); - ctx.bind(e, inode ); + rebuildImageNode(); + } else if(attrName.equals(SVG_WIDTH_ATTRIBUTE) || + attrName.equals(SVG_HEIGHT_ATTRIBUTE)) { + float oldV = 0, newV=0; + String s = evt.getPrevValue(); + UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, e); + + if (s.length() != 0) { + oldV = UnitProcessor.svgHorizontalCoordinateToUserSpace + (s, attrName, uctx); } - else{ - //it was an svg file referenced - //dispose it - if ( oldSVGDoc != null ){ - disposeTree(oldSVGDoc); - } + s = evt.getNewValue(); + if (s.length() != 0) { + newV = UnitProcessor.svgHorizontalCoordinateToUserSpace + (s, attrName, uctx); } - imgNode.setImage(inode); + if (oldV == newV) return; - } else { - super.handleDOMAttrModifiedEvent(evt); + if ((oldV == 0) || (newV == 0)) + rebuildImageNode(); + else + updateImageBounds(); + } else { + super.handleDOMAttrModifiedEvent(evt); } } + protected void updateImageBounds() { + //retrieve the new bounds of the image tag + Rectangle2D bounds = getImageBounds(ctx, e); + GraphicsNode imageNode = ((ImageNode)node).getImage(); + float [] vb = null; + if (imageNode instanceof RasterImageNode) { + //Raster image + Rectangle2D imgBounds = + ((RasterImageNode)imageNode).getImageBounds(); + // create the implicit viewBox for the raster + // image. The viewBox for a raster image is the size + // of the image + vb = new float[4]; + vb[0] = 0; // x + vb[1] = 0; // y + vb[2] = (float)imgBounds.getWidth(); // width + vb[3] = (float)imgBounds.getHeight(); // height + } else { + if (imgDocument != null) { + Element svgElement = imgDocument.getRootElement(); + String viewBox = svgElement.getAttributeNS + (null, SVG_VIEW_BOX_ATTRIBUTE); + vb = ViewBox.parseViewBoxAttribute(e, viewBox); + } + } + if (imageNode != null) { + // handles the 'preserveAspectRatio', 'overflow' and + // 'clip' and sets the appropriate AffineTransform to + // the image node + initializeViewport(ctx, e, imageNode, vb, bounds); + } + + } + + protected void rebuildImageNode() { + //reference copy of the imgDocument + SVGDocument oldSVGDoc = imgDocument; + + //update of the reference of the image. + GraphicsNode inode = buildImageGraphicsNode(ctx,e); + + if (inode == null) { + String uriStr = XLinkSupport.getXLinkHref(e); + throw new BridgeException(e, ERR_URI_IMAGE_INVALID, + new Object[] {uriStr}); + } + ImageNode imgNode = (ImageNode)node; + //HACK : see 'initializeDynamicSupport' + if (imgNode.getImage() instanceof RasterImageNode) { + // register the RasterImageNode instead + ctx.unbind(e); + ctx.bind(e, inode ); + } + else{ + //it was an svg file referenced + //dispose it + if ( oldSVGDoc != null ){ + disposeTree(oldSVGDoc); + } + } + imgNode.setImage(inode); + } + /** * Invoked for each CSS property that has changed. */ @@ -520,7 +546,14 @@ protected static GraphicsNode createRasterImageNode(BridgeContext ctx, Element e, Filter img) { + Rectangle2D bounds = getImageBounds(ctx, e); + if ((bounds.getWidth() == 0) || (bounds.getHeight() == 0)) { + ShapeNode sn = new ShapeNode(); + sn.setShape(bounds); + return sn; + } RasterImageNode node = new RasterImageNode(); + Object obj = img.getProperty (SVGBrokenLinkProvider.SVG_BROKEN_LINK_DOCUMENT_PROPERTY); if ((obj != null) && (obj instanceof SVGDocument)) { @@ -531,7 +564,6 @@ } node.setImage(img); Rectangle2D imgBounds = img.getBounds2D(); - Rectangle2D bounds = getImageBounds(ctx, e); // create the implicit viewBox for the raster image. The viewBox for a // raster image is the size of the image @@ -560,6 +592,16 @@ SVGDocument imgDocument) { CompositeGraphicsNode result = new CompositeGraphicsNode(); + // handles the 'preserveAspectRatio', 'overflow' and 'clip' and + // sets the appropriate AffineTransform to the image node + Rectangle2D bounds = getImageBounds(ctx, e); + + if ((bounds.getWidth() == 0) || (bounds.getHeight() == 0)) { + ShapeNode sn = new ShapeNode(); + sn.setShape(bounds); + result.getChildren().add(sn); + return result; + } Rectangle2D r = CSSUtilities.convertEnableBackground(e); if (r != null) { @@ -587,9 +629,6 @@ svgElement.getAttributeNS(null, SVG_VIEW_BOX_ATTRIBUTE); float [] vb = ViewBox.parseViewBoxAttribute(e, viewBox); - // handles the 'preserveAspectRatio', 'overflow' and 'clip' and sets the - // appropriate AffineTransform to the image node - Rectangle2D bounds = getImageBounds(ctx, e); initializeViewport(ctx, e, result, vb, bounds); // add a listener on the outermost svg element of the SVG image. 1.15 +14 -11 xml-batik/sources/org/apache/batik/bridge/SVGRectElementBridge.java Index: SVGRectElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGRectElementBridge.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- SVGRectElementBridge.java 8 Aug 2003 11:38:51 -0000 1.14 +++ SVGRectElementBridge.java 11 Sep 2003 10:40:24 -0000 1.15 @@ -55,6 +55,8 @@ import java.awt.geom.RoundRectangle2D; import org.apache.batik.gvt.ShapeNode; +import org.apache.batik.gvt.ShapePainter; + import org.w3c.dom.Element; import org.w3c.dom.events.MutationEvent; @@ -125,11 +127,6 @@ throw new BridgeException(e, ERR_ATTRIBUTE_MISSING, new Object[] {SVG_WIDTH_ATTRIBUTE, s}); } - // A value of zero disables rendering of the element - if (w == 0) { - shapeNode.setShape(null); - return; - } // 'height' attribute - required s = e.getAttributeNS(null, SVG_HEIGHT_ATTRIBUTE); @@ -141,11 +138,6 @@ throw new BridgeException(e, ERR_ATTRIBUTE_MISSING, new Object[] {SVG_HEIGHT_ATTRIBUTE, s}); } - // A value of zero disables rendering of the element - if (h == 0) { - shapeNode.setShape(null); - return; - } // 'rx' attribute - default is 0 s = e.getAttributeNS(null, SVG_RX_ATTRIBUTE); @@ -211,5 +203,16 @@ } else { super.handleDOMAttrModifiedEvent(evt); } + } + + + protected ShapePainter createShapePainter(BridgeContext ctx, + Element e, + ShapeNode shapeNode) { + Shape shape = shapeNode.getShape(); + Rectangle2D r2d = shape.getBounds2D(); + if ((r2d.getWidth() == 0) || (r2d.getHeight() == 0)) + return null; + return super.createShapePainter(ctx, e, shapeNode); } } 1.16 +11 -1 xml-batik/sources/org/apache/batik/gvt/RasterImageNode.java Index: RasterImageNode.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/RasterImageNode.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- RasterImageNode.java 8 Aug 2003 11:39:14 -0000 1.15 +++ RasterImageNode.java 11 Sep 2003 10:40:24 -0000 1.16 @@ -107,6 +107,8 @@ * @return the bounds of this raster image node */ public Rectangle2D getImageBounds() { + if (image == null) + return null; return (Rectangle2D) image.getBounds2D().clone(); } @@ -142,6 +144,8 @@ * Returns the bounds of the area covered by this node's primitive paint. */ public Rectangle2D getPrimitiveBounds() { + if (image == null) + return null; return image.getBounds2D(); } @@ -151,6 +155,8 @@ * masking, filtering or stroking, for example. */ public Rectangle2D getGeometryBounds() { + if (image == null) + return null; return image.getBounds2D(); } @@ -160,6 +166,8 @@ * of clipping, masking or filtering. */ public Rectangle2D getSensitiveBounds() { + if (image == null) + return null; return image.getBounds2D(); } @@ -167,6 +175,8 @@ * Returns the outline of this node. */ public Shape getOutline() { + if (image == null) + return null; return image.getBounds2D(); } } 1.23 +7 -6 xml-batik/sources/org/apache/batik/gvt/ShapeNode.java Index: ShapeNode.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/ShapeNode.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- ShapeNode.java 8 Aug 2003 11:39:14 -0000 1.22 +++ ShapeNode.java 11 Sep 2003 10:40:24 -0000 1.23 @@ -257,12 +257,13 @@ */ public Rectangle2D getPrimitiveBounds() { if (primitiveBounds == null) { - if ((shape == null) || (shapePainter == null)) { + if (shape == null) return null; - } - // paintedArea = shapePainter.getPaintedArea(); - // primitiveBounds = paintedArea.getBounds2D(); - primitiveBounds = shapePainter.getPaintedBounds2D(); + + if (shapePainter == null) + primitiveBounds = shape.getBounds2D(); + else + primitiveBounds = shapePainter.getPaintedBounds2D(); // Make sure we haven't been interrupted if (Thread.currentThread().isInterrupted()) { 1.20 +2 -2 xml-batik/sources/org/apache/batik/gvt/event/AWTEventDispatcher.java Index: AWTEventDispatcher.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/event/AWTEventDispatcher.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- AWTEventDispatcher.java 22 Aug 2003 10:49:06 -0000 1.19 +++ AWTEventDispatcher.java 11 Sep 2003 10:40:24 -0000 1.20 @@ -431,7 +431,7 @@ } GraphicsNode node = root.nodeHitAt(gnp); - + // If the receiving node has changed, send a notification // check if we enter a new node Point screenPos; 1.2 +44 -23 xml-batik/test-references/samples/tests/spec/scripting/zeroSize.png <<Binary file>>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]