tkormann 01/08/21 08:03:24
Modified: sources/org/apache/batik/bridge SVGImageElementBridge.java
sources/org/apache/batik/swing/gvt GVTTreeRenderer.java
Log:
- bug fix. When loading multiple documents on the command line, an
InteruptedExcetpion occured sometimes.
- bug fix. 'preserveAspectRatio', 'viewBox' and 'clip' now works properly on
the<image> element.
Some additional tests have to be done.
- fix imageViewbox (raster images)
- add a new test for SVG image and preserveAspectRatio and viewBox
- add a new test for testing clip on SVG images and raster images
Revision Changes Path
1.23 +67 -36
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.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- SVGImageElementBridge.java 2001/08/07 17:28:21 1.22
+++ SVGImageElementBridge.java 2001/08/21 15:03:24 1.23
@@ -14,6 +14,7 @@
import java.awt.color.ICC_Profile;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
+import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
@@ -22,6 +23,7 @@
import org.apache.batik.dom.svg.SVGOMDocument;
import org.apache.batik.dom.util.XLinkSupport;
import org.apache.batik.ext.awt.color.ICCColorSpaceExt;
+import org.apache.batik.ext.awt.image.renderable.ClipRable8Bit;
import org.apache.batik.ext.awt.image.renderable.Filter;
import org.apache.batik.ext.awt.image.spi.ImageTagRegistry;
import org.apache.batik.gvt.CompositeGraphicsNode;
@@ -43,7 +45,7 @@
* Bridge class for the <image> element.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a>
- * @version $Id: SVGImageElementBridge.java,v 1.22 2001/08/07 17:28:21 deweese Exp $
+ * @version $Id: SVGImageElementBridge.java,v 1.23 2001/08/21 15:03:24 tkormann Exp
$
*/
public class SVGImageElementBridge extends AbstractGraphicsNodeBridge {
@@ -60,12 +62,12 @@
}
/**
- * Creates a graphics node using the specified BridgeContext and
- * for the specified element.
+ * Creates a graphics node using the specified BridgeContext and for the
+ * specified element.
*
* @param ctx the bridge context to use
* @param e the element that describes the graphics node to build
- * @return a graphics node that represents the specified element
+ * @return a graphics node that represents the specified element
*/
public GraphicsNode createGraphicsNode(BridgeContext ctx, Element e) {
@@ -87,7 +89,6 @@
URL baseURL = ((SVGOMDocument)svgDoc).getURLObject();
ParsedURL purl = new ParsedURL(baseURL, uriStr);
-
// try to load an SVG document
DocumentLoader loader = ctx.getDocumentLoader();
URIResolver resolver = new URIResolver(svgDoc, loader);
@@ -99,8 +100,8 @@
}
} catch (BridgeException ex) {
throw ex;
- } catch (Exception ex) {
- /* Nothing to do */
+ } catch (Exception ex) {
+ /* Nothing to do */
}
if (node == null) {
@@ -148,19 +149,18 @@
}
/**
- * Returns a GraphicsNode that represents an raster image in JPEG
- * or PNG format.
+ * Returns a GraphicsNode that represents an raster image in JPEG or PNG
+ * format.
*
* @param ctx the bridge context
* @param e the image element
- * @param uriStr the uri of the image
+ * @param uriStr the uri of the image
*/
protected static GraphicsNode createRasterImageNode(BridgeContext ctx,
Element e,
ParsedURL purl) {
+
RasterImageNode node = new RasterImageNode();
- // create the image
- Rectangle2D bounds = getImageBounds(ctx, e);
ImageTagRegistry reg = ImageTagRegistry.getRegistry();
Filter img = reg.readURL(purl, extractColorSpace(e, ctx));
@@ -171,8 +171,11 @@
return createSVGImageNode(ctx, e, errDoc);
}
node.setImage(img);
+ node.setImageBounds(img.getBounds2D());
+ Rectangle2D bounds = getImageBounds(ctx, e);
+
+ initializeViewport(ctx, e, node, bounds);
- node.setImageBounds(bounds);
return node;
}
@@ -205,39 +208,67 @@
svgElement.setAttributeNS(null, SVG_HEIGHT_ATTRIBUTE,
String.valueOf(bounds.getHeight()));
- AffineTransform at
- = ViewBox.getPreserveAspectRatioTransform(svgElement,
- (float)bounds.getWidth(),
- (float)bounds.getHeight());
- at.preConcatenate(AffineTransform.getTranslateInstance(bounds.getX(),
- bounds.getY()));
- result.setTransform(at);
-
GraphicsNode node = ctx.getGVTBuilder().build(ctx, svgElement);
result.getChildren().add(node);
- /*
- // resolve x, y, width, height and preserveAspectRatio on image
+ initializeViewport(ctx, element, result, bounds);
- Rectangle2D bounds = getImageBounds(ctx, element);
+ return result;
+ }
+
+ /**
+ * Initializes according to the specified element, the specified graphics
+ * node with the specified bounds. This method takes into account the
+ * 'viewBox', 'preserveAspectRatio', and 'clip' properties. According to
+ * those properties, a AffineTransform and a clip is set.
+ *
+ * @param ctx the bridge context
+ * @param e the image element that defines the properties
+ * @param node the graphics node
+ * @param bounds the bounds of the image element
+ */
+ protected static void initializeViewport(BridgeContext ctx,
+ Element e,
+ GraphicsNode node,
+ Rectangle2D bounds) {
+
+ // 'viewBox' and 'preserveAspectRatio'
float x = (float)bounds.getX();
float y = (float)bounds.getY();
float w = (float)bounds.getWidth();
float h = (float)bounds.getHeight();
AffineTransform at
- = ViewBox.getPreserveAspectRatioTransform(element, w, h);
+ = ViewBox.getPreserveAspectRatioTransform(e, w, h);
at.preConcatenate(AffineTransform.getTranslateInstance(x, y));
- result.setTransform(at);
- try {
- at = at.createInverse(); // clip in user space
- Filter filter = new GraphicsNodeRable8Bit
- (node, ctx.getGraphicsNodeRenderContext());
- Shape clip = at.createTransformedShape
- (new Rectangle2D.Float(x, y, w, h));
- result.setClip(new ClipRable8Bit(filter, clip));
- } catch (java.awt.geom.NoninvertibleTransformException ex) {}
- */
- return result;
+ node.setTransform(at);
+
+ // 'overflow' and 'clip'
+ Shape clip = null;
+ if (CSSUtilities.convertOverflow(e)) { // overflow:hidden
+ float [] offsets = CSSUtilities.convertClip(e);
+ if (offsets == null) { // clip:auto
+ clip = new Rectangle2D.Float(x, y, w, h);
+ } else { // clip:rect(<x> <y> <w> <h>)
+ // offsets[0] = top
+ // offsets[1] = right
+ // offsets[2] = bottom
+ // offsets[3] = left
+ clip = new Rectangle2D.Float(x+offsets[3],
+ y+offsets[0],
+ w-offsets[1],
+ h-offsets[2]);
+ }
+ }
+
+ if (clip != null) {
+ try {
+ at = at.createInverse(); // clip in user space
+ Filter filter = new GraphicsNodeRable8Bit
+ (node, ctx.getGraphicsNodeRenderContext());
+ clip = at.createTransformedShape(clip);
+ node.setClip(new ClipRable8Bit(filter, clip));
+ } catch (java.awt.geom.NoninvertibleTransformException ex) {}
+ }
}
/**
1.5 +5 -1
xml-batik/sources/org/apache/batik/swing/gvt/GVTTreeRenderer.java
Index: GVTTreeRenderer.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/GVTTreeRenderer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- GVTTreeRenderer.java 2001/07/05 06:07:31 1.4
+++ GVTTreeRenderer.java 2001/08/21 15:03:24 1.5
@@ -27,7 +27,7 @@
* a GVT tree.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: GVTTreeRenderer.java,v 1.4 2001/07/05 06:07:31 bella Exp $
+ * @version $Id: GVTTreeRenderer.java,v 1.5 2001/08/21 15:03:24 tkormann Exp $
*/
public class GVTTreeRenderer extends Thread {
@@ -114,6 +114,10 @@
// This error was reported to happen when the rendering
// is interrupted with JDK1.3.0rc1 Solaris.
} catch (InterruptedBridgeException e) {
+ // this sometimes happens with SVG Fonts since the glyphs are
+ // not built till the rendering stage
+ fireFailedEvent();
+ } catch (InterruptedException e) {
// this sometimes happens with SVG Fonts since the glyphs are
// not built till the rendering stage
fireFailedEvent();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]