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 de...@apache.org on 2002/11/20 13:55:42 UTC

cvs commit: xml-batik/sources/org/apache/batik/extension/svg BatikMultiImageElementBridge.java MultiResGraphicsNode.java

deweese     2002/11/20 04:55:42

  Modified:    sources/org/apache/batik/extension/svg
                        BatikMultiImageElementBridge.java
                        MultiResGraphicsNode.java
  Log:
  1) Fixed problem using percentages with multi-image element
  2) Fixed a potentially huge performace problem with multi-image element.
  3) Fixed a 'memory leak' in multi-image element
  4) Fixed a problem with pointer events on multi-image elements.
  
  Revision  Changes    Path
  1.7       +33 -3     xml-batik/sources/org/apache/batik/extension/svg/BatikMultiImageElementBridge.java
  
  Index: BatikMultiImageElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/extension/svg/BatikMultiImageElementBridge.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BatikMultiImageElementBridge.java	3 Oct 2002 18:57:15 -0000	1.6
  +++ BatikMultiImageElementBridge.java	20 Nov 2002 12:55:42 -0000	1.7
  @@ -29,6 +29,7 @@
   import org.apache.batik.bridge.SVGUtilities;
   
   import org.apache.batik.dom.svg.SVGOMDocument;
  +import org.apache.batik.dom.svg.SVGOMElement;
   import org.apache.batik.dom.svg.XMLBaseSupport;
   
   import org.apache.batik.dom.util.XLinkSupport;
  @@ -101,7 +102,7 @@
               return null;
           }
   
  -        ImageNode imgNode = (ImageNode)super.createGraphicsNode(ctx, e);
  +        ImageNode imgNode = (ImageNode)instantiateGraphicsNode();
           if (imgNode == null) {
               return null;
           }
  @@ -144,6 +145,10 @@
   
           Rectangle2D b = getImageBounds(ctx, e);
   
  +        // System.out.println("Bounds: " + bounds);
  +        // System.out.println("ImgB: " + imgBounds);
  +        
  +
           GraphicsNode node = new MultiResGraphicsNode(e, b, uary, dary);
   
           // 'transform'
  @@ -153,11 +158,36 @@
                   (SVGUtilities.convertTransform(e, SVG_TRANSFORM_ATTRIBUTE, s));
           }
           // 'visibility'
  -        node.setVisible(CSSUtilities.convertVisibility(e));
  +        imgNode.setVisible(CSSUtilities.convertVisibility(e));
   
           imgNode.setImage(node);
   
           return imgNode;
  +    }
  +
  +    /**
  +     * Returns false as shapes are not a container.
  +     */
  +    public boolean isComposite() {
  +        return false;
  +    }
  +
  +    /**
  +     * This method is invoked during the build phase if the document
  +     * is dynamic. The responsability of this method is to ensure that
  +     * any dynamic modifications of the element this bridge is
  +     * dedicated to, happen on its associated GVT product.
  +     */
  +    protected void initializeDynamicSupport(BridgeContext ctx,
  +                                            Element e,
  +                                            GraphicsNode node) {
  +        this.e = e;
  +        this.node = node;
  +        this.ctx = ctx;
  +        // HACK due to the way images are represented in GVT
  +        ImageNode imgNode = (ImageNode)node;
  +        ctx.bind(e, imgNode.getImage());
  +        ((SVGOMElement)e).setSVGContext(this);
       }
   
       protected void addInfo(Element e, Collection dims, Collection uris) {
  
  
  
  1.2       +19 -73    xml-batik/sources/org/apache/batik/extension/svg/MultiResGraphicsNode.java
  
  Index: MultiResGraphicsNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/extension/svg/MultiResGraphicsNode.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MultiResGraphicsNode.java	3 Oct 2002 18:57:15 -0000	1.1
  +++ MultiResGraphicsNode.java	20 Nov 2002 12:55:42 -0000	1.2
  @@ -71,8 +71,6 @@
       Dimension     [] sizes;
       Rectangle2D      bounds;
   
  -    GraphicsNode     lastSrc;
  -
       UserAgent      userAgent;
       DocumentLoader loader;
       BridgeContext  ctx;
  @@ -181,17 +179,17 @@
                   (srcURLs[idx].toString());
   
               GraphicsNode gn;
  -            gn = createSVGImageNode(ctx, multiImgElem, svgDoc);
  -            lastSrc = gn;
  +            gn = createSVGImageNode(ctx, multiImgElem, 
  +                                    bounds, svgDoc);
               srcs[idx] = new SoftReference(gn);
               return gn;
           } catch (Exception ex) { /* ex.printStackTrace(); */ }
   
           try {
               GraphicsNode gn;
  -            gn = createRasterImageNode(ctx, multiImgElem, srcURLs[idx]);
  +            gn = createRasterImageNode(ctx, multiImgElem, 
  +                                       bounds, srcURLs[idx]);
               srcs[idx] = new SoftReference(gn);
  -            lastSrc = gn;
               return gn;
           } catch (Exception ex) { /* ex.printStackTrace(); */ }
   
  @@ -208,7 +206,8 @@
        * @param uriStr the uri of the image
        */
       protected static GraphicsNode createRasterImageNode(BridgeContext ctx,
  -                                                        Element       e,
  +                                                        Element e,
  +                                                        Rectangle2D bounds,
                                                           ParsedURL     purl) {
   
           RasterImageNode node = new RasterImageNode();
  @@ -219,11 +218,10 @@
               (SVGBrokenLinkProvider.SVG_BROKEN_LINK_DOCUMENT_PROPERTY);
           if ((obj != null) && (obj instanceof SVGDocument)) {
               // Ok so we are dealing with a broken link.
  -            return createSVGImageNode(ctx, e, (SVGDocument)obj);
  +            return createSVGImageNode(ctx, e, bounds, (SVGDocument)obj);
           }
           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
  @@ -235,9 +233,9 @@
   
           // System.out.println("Bounds: " + bounds);
           // System.out.println("ImgB: " + imgBounds);
  -        // handles the 'preserveAspectRatio', 'overflow' and 'clip' and sets the
  -        // appropriate AffineTransform to the image node
  -        initializeViewport(ctx, e, node, vb, bounds);
  +        // handles the 'preserveAspectRatio', 'overflow' and 'clip' and 
  +        // sets the appropriate AffineTransform to the image node
  +        initializeViewport(e, node, vb, bounds);
   
           return node;
       }
  @@ -247,10 +245,12 @@
        *
        * @param ctx the bridge context
        * @param e the image element
  +     * @param bounds the bounds for this graphicsNode
        * @param imgDocument the SVG document that represents the image
        */
       protected static GraphicsNode createSVGImageNode(BridgeContext ctx,
                                                        Element e,
  +                                                     Rectangle2D bounds,
                                                        SVGDocument imgDocument) {
   
           CompositeGraphicsNode result = new CompositeGraphicsNode();
  @@ -275,12 +275,12 @@
               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);
  +        // handles the 'preserveAspectRatio', 'overflow' and 'clip' and sets 
  +        // the appropriate AffineTransform to the image node
  +
           // System.out.println("Bounds: " + bounds);
           // System.out.println("ViewBox: " + viewBox);
  -        initializeViewport(ctx, e, result, vb, bounds);
  +        initializeViewport(e, result, vb, bounds);
   
           return result;
       }
  @@ -291,14 +291,12 @@
        * '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 vb the implicit viewBox definition
        * @param bounds the bounds of the image element
        */
  -    protected static void initializeViewport(BridgeContext ctx,
  -                                             Element e,
  +    protected static void initializeViewport(Element e,
                                                GraphicsNode node,
                                                float [] vb,
                                                Rectangle2D bounds) {
  @@ -310,6 +308,7 @@
   
           AffineTransform at
               = ViewBox.getPreserveAspectRatioTransform(e, vb, w, h);
  +        // System.out.println("VP Affine: " + at);
           at.preConcatenate(AffineTransform.getTranslateInstance(x, y));
           node.setTransform(at);
   
  @@ -339,59 +338,6 @@
                   node.setClip(new ClipRable8Bit(filter, clip));
               } catch (java.awt.geom.NoninvertibleTransformException ex) {}
           }
  -    }
  -
  -
  -    /**
  -     * Returns the bounds of the specified image element.
  -     *
  -     * @param ctx the bridge context
  -     * @param element the image element
  -     */
  -    protected static
  -        Rectangle2D getImageBounds(BridgeContext ctx, Element element) {
  -
  -        UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, element);
  -
  -        // 'x' attribute - default is 0
  -        String s = element.getAttributeNS(null, SVG_X_ATTRIBUTE);
  -        float x = 0;
  -        if (s.length() != 0) {
  -            x = UnitProcessor.svgHorizontalCoordinateToUserSpace
  -                (s, SVG_X_ATTRIBUTE, uctx);
  -        }
  -
  -        // 'y' attribute - default is 0
  -        s = element.getAttributeNS(null, SVG_Y_ATTRIBUTE);
  -        float y = 0;
  -        if (s.length() != 0) {
  -            y = UnitProcessor.svgVerticalCoordinateToUserSpace
  -                (s, SVG_Y_ATTRIBUTE, uctx);
  -        }
  -
  -        // 'width' attribute - required
  -        s = element.getAttributeNS(null, SVG_WIDTH_ATTRIBUTE);
  -        float w;
  -        if (s.length() == 0) {
  -            throw new BridgeException(element, ERR_ATTRIBUTE_MISSING,
  -                                      new Object[] {SVG_WIDTH_ATTRIBUTE});
  -        } else {
  -            w = UnitProcessor.svgHorizontalLengthToUserSpace
  -                (s, SVG_WIDTH_ATTRIBUTE, uctx);
  -        }
  -
  -        // 'height' attribute - required
  -        s = element.getAttributeNS(null, SVG_HEIGHT_ATTRIBUTE);
  -        float h;
  -        if (s.length() == 0) {
  -            throw new BridgeException(element, ERR_ATTRIBUTE_MISSING,
  -                                      new Object[] {SVG_HEIGHT_ATTRIBUTE});
  -        } else {
  -            h = UnitProcessor.svgVerticalLengthToUserSpace
  -                (s, SVG_HEIGHT_ATTRIBUTE, uctx);
  -        }
  -
  -        return new Rectangle2D.Float(x, y, w, h);
       }
   }    
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org