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 2002/03/08 12:12:47 UTC

cvs commit: xml-batik/sources/org/apache/batik/bridge SVGFeImageElementBridge.java

vhardy      02/03/08 03:12:46

  Modified:    sources/org/apache/batik/bridge SVGFeImageElementBridge.java
  Log:
  Fixed feImage bridge partially
  
  Revision  Changes    Path
  1.15      +52 -9     xml-batik/sources/org/apache/batik/bridge/SVGFeImageElementBridge.java
  
  Index: SVGFeImageElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGFeImageElementBridge.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- SVGFeImageElementBridge.java	23 Jan 2002 14:14:07 -0000	1.14
  +++ SVGFeImageElementBridge.java	8 Mar 2002 11:12:46 -0000	1.15
  @@ -34,7 +34,7 @@
    * Bridge class for the <feImage> element.
    *
    * @author <a href="mailto:tkormann@apache.org">Thierry Kormann</a>
  - * @version $Id: SVGFeImageElementBridge.java,v 1.14 2002/01/23 14:14:07 deweese Exp $
  + * @version $Id: SVGFeImageElementBridge.java,v 1.15 2002/03/08 11:12:46 vhardy Exp $
    */
   public class SVGFeImageElementBridge
       extends AbstractSVGFilterPrimitiveElementBridge {
  @@ -109,6 +109,7 @@
           // try to load an SVG document
           DocumentLoader loader = ctx.getDocumentLoader();
           URIResolver resolver = new URIResolver(svgDoc, loader);
  +        boolean toBBoxNeeded = false;
           try {
               Element refElement = null;
               Node n = resolver.getNode(purl.toString(), filterElement);
  @@ -116,13 +117,14 @@
                   refElement = ((SVGDocument)n).getRootElement();
               } else if (n.getNodeType() == Node.ELEMENT_NODE) {
                   refElement = (Element)n;
  +                toBBoxNeeded = true;
               } else {
                   throw new BridgeException
                       (filterElement, ERR_URI_IMAGE_INVALID,
                        new Object[] {uriStr});
               }
               filter = createSVGFeImage
  -                (ctx, primitiveRegion, refElement);
  +                (ctx, primitiveRegion, refElement, toBBoxNeeded, filterElement, filteredNode);
           } catch (BridgeException ex) {
               throw ex;
           } catch (Exception ex) { /* Nothing to do */ }
  @@ -154,20 +156,61 @@
        * @param ctx the bridge context
        * @param primitiveRegion the primitive region
        * @param Element the referenced element
  +     * @param toBBoxNeeded true if there is a need to transform to ObjectBoundingBox
  +     *        space
  +     * @param filterElement parent filter element
  +     * @param filteredNode node to which the filter applies
        */
       protected static Filter createSVGFeImage(BridgeContext ctx,
                                                Rectangle2D primitiveRegion,
  -                                             Element refElement) {
  -
  +                                             Element refElement,
  +                                             boolean toBBoxNeeded,
  +                                             Element filterElement,
  +                                             GraphicsNode filteredNode) {
  +
  +        //
  +        // <!> FIX ME
  +        // Unresolved issue on the feImage behavior when referencing an
  +        // image (PNG, JPEG or SVG image).
  +        // VH & TK, 03/08/2002
  +        // Furthermore, for feImage referencing doc fragment, should act
  +        // like a <use>, i.e., CSS cascading and the whole zing bang.
  +        //
           GraphicsNode node = ctx.getGVTBuilder().build(ctx, refElement);
           Filter filter = node.getGraphicsNodeRable(true);
   
  -        // Need to translate the image to the x, y coordinate to
  -        // have the same behavior as the <use> element
  -        // <!> FIX ME? I THINK THIS IS ONLY PARTIALLY IMPLEMENTING THE SPEC.
  -        // <!> TO DO : HANDLE TRANSFORM
           AffineTransform at = new AffineTransform();
  -        at.translate(primitiveRegion.getX(), primitiveRegion.getY());
  +
  +        if (toBBoxNeeded){
  +            // 'primitiveUnits' attribute - default is userSpaceOnUse
  +            short coordSystemType;
  +            Element filterDefElement = (Element)(filterElement.getParentNode());
  +            String s = SVGUtilities.getChainableAttributeNS
  +                (filterDefElement, null, SVG_PRIMITIVE_UNITS_ATTRIBUTE, ctx);
  +            if (s.length() == 0) {
  +                coordSystemType = SVGUtilities.USER_SPACE_ON_USE;
  +            } else {
  +                coordSystemType = SVGUtilities.parseCoordinateSystem
  +                    (filterDefElement, SVG_PRIMITIVE_UNITS_ATTRIBUTE, s);
  +            }
  +            
  +            if (coordSystemType == SVGUtilities.OBJECT_BOUNDING_BOX) {
  +                at = SVGUtilities.toObjectBBox(at, filteredNode);
  +            }
  +
  +            Rectangle2D bounds = filteredNode.getGeometryBounds();
  +            at.preConcatenate(AffineTransform.getTranslateInstance
  +                              (primitiveRegion.getX() - bounds.getX(), 
  +                               primitiveRegion.getY() - bounds.getY()));
  +            
  +        } else {
  +            
  +            // Need to translate the image to the x, y coordinate to
  +            // have the same behavior as the <use> element
  +            at.preConcatenate(AffineTransform.getTranslateInstance
  +                              (primitiveRegion.getX(), primitiveRegion.getY()));
  +        }
  +
           return new AffineRable8Bit(filter, at);
       }
   
  
  
  

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