vhardy      2002/11/25 08:14:16

  Modified:    sources/org/apache/batik/bridge SVGUtilities.java
               sources/org/apache/batik/extension/svg
                        BatikExtConstants.java
               test-resources/org/apache/batik/test samplesRendering.xml
  Added:       samples/extensions filterRegion.svg filterRegionDetailed.svg
               test-references/samples/extensions filterRegion.png
                        filterRegionDetailed.png
  Log:
  Added and complemented Philipe Converset (Qarbon)'s contribution of an extension to 
define margins in filter regions
  
  Revision  Changes    Path
  1.22      +238 -61   xml-batik/sources/org/apache/batik/bridge/SVGUtilities.java
  
  Index: SVGUtilities.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGUtilities.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- SVGUtilities.java 13 Jun 2002 11:19:37 -0000      1.21
  +++ SVGUtilities.java 25 Nov 2002 16:14:15 -0000      1.22
  @@ -36,6 +36,8 @@
   import org.apache.batik.parser.PreserveAspectRatioParser;
   import org.apache.batik.parser.PreserveAspectRatioParser;
   
  +import org.apache.batik.extension.svg.BatikExtConstants;
  +
   import org.apache.batik.util.SVGConstants;
   import org.apache.batik.util.ParsedURL;
   
  @@ -535,69 +537,182 @@
           return filterRes;
       }
   
  -    /**
  -     * Returns the filter region according to the x, y, width, height,
  -     * and filterUnits attributes.
  -     *
  -     * @param filterElement the filter element that defines the attributes
  -     * @param filteredElement the element referencing the filter
  -     * @param filteredNode the graphics node to filter (objectBoundingBox)
  -     * @param uctx the unit processor context (userSpaceOnUse)
  -     * @param ctx the bridge context
  -     */
  -    public static
  -        Rectangle2D convertFilterChainRegion(Element filterElement,
  -                                             Element filteredElement,
  -                                             GraphicsNode filteredNode,
  -                                             BridgeContext ctx) {
  -
  -        // 'x' attribute - default is -10%
  -        String xStr = getChainableAttributeNS
  -            (filterElement, null, SVG_X_ATTRIBUTE, ctx);
  -        if (xStr.length() == 0) {
  -            xStr = SVG_FILTER_X_DEFAULT_VALUE;
  -        }
  -        // 'y' attribute - default is -10%
  -        String yStr = getChainableAttributeNS
  -            (filterElement, null, SVG_Y_ATTRIBUTE, ctx);
  -        if (yStr.length() == 0) {
  -            yStr = SVG_FILTER_Y_DEFAULT_VALUE;
  -        }
  -        // 'width' attribute - default is 120%
  -        String wStr = getChainableAttributeNS
  -            (filterElement, null, SVG_WIDTH_ATTRIBUTE, ctx);
  -        if (wStr.length() == 0) {
  -            wStr = SVG_FILTER_WIDTH_DEFAULT_VALUE;
  -        }
  -        // 'height' attribute - default is 120%
  -        String hStr = getChainableAttributeNS
  -            (filterElement, null, SVG_HEIGHT_ATTRIBUTE, ctx);
  -        if (hStr.length() == 0) {
  -            hStr = SVG_FILTER_HEIGHT_DEFAULT_VALUE;
  -        }
  -        // 'filterUnits' attribute - default is 'objectBoundingBox'
  -        short unitsType;
  -        String units = getChainableAttributeNS
  -            (filterElement, null, SVG_FILTER_UNITS_ATTRIBUTE, ctx);
  -        if (units.length() == 0) {
  -            unitsType = OBJECT_BOUNDING_BOX;
  -        } else {
  -            unitsType = parseCoordinateSystem
  -                (filterElement, SVG_FILTER_UNITS_ATTRIBUTE, units);
  +   /**
  +    * Returns the filter region according to the x, y, width, height,
  +    * dx, dy, dw, dh and filterUnits attributes.
  +    *
  +    * @param filterElement the filter element that defines the attributes
  +    * @param filteredElement the element referencing the filter
  +    * @param filteredNode the graphics node to filter (objectBoundingBox)
  +    * @param uctx the unit processor context (userSpaceOnUse)
  +    * @param ctx the bridge context
  +    */
  +   public static
  +       Rectangle2D convertFilterChainRegion(Element filterElement,
  +                                            Element filteredElement,
  +                                            GraphicsNode filteredNode,
  +                                            BridgeContext ctx) {
  +
  +       // 'x' attribute - default is -10%
  +       String xStr = getChainableAttributeNS
  +           (filterElement, null, SVG_X_ATTRIBUTE, ctx);
  +       if (xStr.length() == 0) {
  +           xStr = SVG_FILTER_X_DEFAULT_VALUE;
  +       }
  +       // 'y' attribute - default is -10%
  +       String yStr = getChainableAttributeNS
  +           (filterElement, null, SVG_Y_ATTRIBUTE, ctx);
  +       if (yStr.length() == 0) {
  +           yStr = SVG_FILTER_Y_DEFAULT_VALUE;
  +       }
  +       // 'width' attribute - default is 120%
  +       String wStr = getChainableAttributeNS
  +           (filterElement, null, SVG_WIDTH_ATTRIBUTE, ctx);
  +       if (wStr.length() == 0) {
  +           wStr = SVG_FILTER_WIDTH_DEFAULT_VALUE;
  +       }
  +       // 'height' attribute - default is 120%
  +       String hStr = getChainableAttributeNS
  +           (filterElement, null, SVG_HEIGHT_ATTRIBUTE, ctx);
  +       if (hStr.length() == 0) {
  +           hStr = SVG_FILTER_HEIGHT_DEFAULT_VALUE;
  +       }
  +       // 'filterUnits' attribute - default is 'objectBoundingBox'
  +       short unitsType;
  +       String units = getChainableAttributeNS
  +           (filterElement, null, SVG_FILTER_UNITS_ATTRIBUTE, ctx);
  +       if (units.length() == 0) {
  +           unitsType = OBJECT_BOUNDING_BOX;
  +       } else {
  +           unitsType = parseCoordinateSystem
  +               (filterElement, SVG_FILTER_UNITS_ATTRIBUTE, units);
  +       }
  +
  +       // resolve units in the (referenced) filteredElement's
  +       // coordinate system
  +       UnitProcessor.Context uctx
  +           = UnitProcessor.createContext(ctx, filteredElement);
  +
  +       Rectangle2D region = convertRegion(xStr,
  +                                          yStr,
  +                                          wStr,
  +                                          hStr,
  +                                          unitsType,
  +                                          filteredNode,
  +                                          uctx);
  +       
  +       //
  +       // Account for region padding
  +       //
  +       units = getChainableAttributeNS
  +           (filterElement, null, 
  +            BatikExtConstants.BATIK_EXT_FILTER_MARGINS_UNITS_ATTRIBUTE, ctx);
  +       if (units.length() == 0) {
  +           // Default to user space on use for margins, not objectBoundingBox
  +           unitsType = USER_SPACE_ON_USE;
  +       } else {
  +           unitsType = parseCoordinateSystem
  +               (filterElement, 
  +                BatikExtConstants.BATIK_EXT_FILTER_MARGINS_UNITS_ATTRIBUTE, units);
  +       }
  +
  +       // 'batik:dx' attribute - default is 0
  +       String dxStr = 
filterElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                   
BatikExtConstants.BATIK_EXT_DX_ATRIBUTE);
  +       if (dxStr.length() == 0) {
  +           dxStr = BatikExtConstants.SVG_FILTER_DX_DEFAULT_VALUE;
  +       }
  +       // 'batik:dy' attribute - default is 0
  +       String dyStr = 
filterElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                   
BatikExtConstants.BATIK_EXT_DY_ATRIBUTE);
  +       if (dyStr.length() == 0) {
  +           dyStr = BatikExtConstants.SVG_FILTER_DY_DEFAULT_VALUE;
  +       }
  +       // 'batik:dw' attribute - default is 0
  +       String dwStr = 
filterElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                   
BatikExtConstants.BATIK_EXT_DW_ATRIBUTE);
  +       if (dwStr.length() == 0) {
  +           dwStr = BatikExtConstants.SVG_FILTER_DW_DEFAULT_VALUE;
  +       }
  +       // 'batik:dh' attribute - default is 0
  +       String dhStr = 
filterElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                   
BatikExtConstants.BATIK_EXT_DH_ATRIBUTE);
  +       if (dhStr.length() == 0) {
  +           dhStr = BatikExtConstants.SVG_FILTER_DH_DEFAULT_VALUE;
  +       }
  +       
  +       return extendRegion(dxStr,
  +                           dyStr,
  +                           dwStr,
  +                           dhStr,
  +                           unitsType,
  +                           filteredNode,
  +                           region,
  +                           uctx);
  +   }
  +    
  +   /**
  +    * Returns a rectangle that represents the region extended by the
  +    * specified differential coordinates. 
  +    *
  +    * @param dxStr the differential x coordinate of the region
  +    * @param dyStr the differential y coordinate of the region
  +    * @param dwStr the differential width of the region
  +    * @param dhStr the differential height of the region
  +    * @param unitsType specifies whether the values are in userSpaceOnUse
  +    *        or objectBoundingBox space
  +    * @param region the region to extend
  +    * @param uctx the unit processor context (needed for userSpaceOnUse)
  +    */
  +    protected static Rectangle2D extendRegion(String dxStr,
  +                                              String dyStr,
  +                                              String dwStr,
  +                                              String dhStr,
  +                                              short unitsType,
  +                                              GraphicsNode filteredNode,
  +                                              Rectangle2D region,
  +                                              UnitProcessor.Context uctx) {
  +        
  +        float dx,dy,dw,dh;
  +        switch (unitsType) {
  +        case USER_SPACE_ON_USE:
  +            dx = UnitProcessor.svgHorizontalCoordinateToUserSpace
  +                (dxStr, BatikExtConstants.BATIK_EXT_DX_ATRIBUTE, uctx);
  +            dy = UnitProcessor.svgVerticalCoordinateToUserSpace
  +                (dyStr, BatikExtConstants.BATIK_EXT_DY_ATRIBUTE, uctx);
  +            dw = UnitProcessor.svgHorizontalCoordinateToUserSpace
  +                (dwStr, BatikExtConstants.BATIK_EXT_DW_ATRIBUTE, uctx);
  +            dh = UnitProcessor.svgVerticalCoordinateToUserSpace
  +                (dhStr, BatikExtConstants.BATIK_EXT_DH_ATRIBUTE, uctx);
  +            break;
  +        case OBJECT_BOUNDING_BOX:
  +            Rectangle2D bounds = filteredNode.getGeometryBounds();
  +            dx = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox
  +                (dxStr, BatikExtConstants.BATIK_EXT_DX_ATRIBUTE, uctx);
  +            dx *= bounds.getWidth();
  +
  +            dy = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox
  +                (dyStr, BatikExtConstants.BATIK_EXT_DY_ATRIBUTE, uctx);
  +            dy *= bounds.getHeight();
  +
  +            dw = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox
  +                (dwStr, BatikExtConstants.BATIK_EXT_DW_ATRIBUTE, uctx);
  +            dw *= bounds.getWidth();
  +
  +            dh = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox
  +                (dhStr, BatikExtConstants.BATIK_EXT_DH_ATRIBUTE, uctx);
  +            dh *= bounds.getHeight();
  +            break;
  +        default:
  +            throw new Error(); // can't be reached
           }
   
  -        // resolve units in the (referenced) filteredElement's
  -        // coordinate system
  -        UnitProcessor.Context uctx
  -            = UnitProcessor.createContext(ctx, filteredElement);
  +        region.setRect(region.getX() + dx,
  +                       region.getY() + dy,
  +                       region.getWidth() + dw,
  +                       region.getHeight() + dh);
   
  -        return convertRegion(xStr,
  -                             yStr,
  -                             wStr,
  -                             hStr,
  -                             unitsType,
  -                             filteredNode,
  -                             uctx);
  +        return region;
       }
   
       /**
  @@ -711,7 +826,69 @@
           }
   
           Rectangle2D region = new Rectangle2D.Double(x, y, w, h);
  +
  +        // Now, extend filter primitive region with dx/dy/dw/dh
  +        // settings (Batik extension). The dx/dy/dw/dh padding is
  +        // *always* in userSpaceOnUse space. 
  +
  +        units = "";
  +        if ((parentNode != null) &&
  +            (parentNode.getNodeType() == parentNode.ELEMENT_NODE)) {
  +            Element parent = (Element)parentNode;
  +            units = getChainableAttributeNS
  +                (parent,
  +                 BatikExtConstants.BATIK_EXT_NAMESPACE_URI,
  +                 
BatikExtConstants.BATIK_EXT_FILTER_PRIMITIVE_MARGINS_UNITS_ATTRIBUTE,
  +                 ctx);
  +        }
  +
  +        if (units.length() == 0) {
  +            unitsType = USER_SPACE_ON_USE;
  +        } else {
  +            unitsType = parseCoordinateSystem
  +                (filterPrimitiveElement, 
  +                 
BatikExtConstants.BATIK_EXT_FILTER_PRIMITIVE_MARGINS_UNITS_ATTRIBUTE, units);
  +        }
  +
  +        // 'batik:dx' attribute - default is 0
  +        String dxStr = 
filterPrimitiveElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                             
BatikExtConstants.BATIK_EXT_DX_ATRIBUTE);
  +        if (dxStr.length() == 0) {
  +            dxStr = BatikExtConstants.SVG_FILTER_DX_DEFAULT_VALUE;
  +        }
  +
  +        // 'batik:dy' attribute - default is 0
  +        String dyStr = 
filterPrimitiveElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                             
BatikExtConstants.BATIK_EXT_DY_ATRIBUTE);
  +        if (dyStr.length() == 0) {
  +            dyStr = BatikExtConstants.SVG_FILTER_DY_DEFAULT_VALUE;
  +        }
  +
  +        // 'batik:dw' attribute - default is 0
  +        String dwStr = 
filterPrimitiveElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                             
BatikExtConstants.BATIK_EXT_DW_ATRIBUTE);
  +        if (dwStr.length() == 0) {
  +            dwStr = BatikExtConstants.SVG_FILTER_DW_DEFAULT_VALUE;
  +        }
  +
  +        // 'batik:dh' attribute - default is 0
  +        String dhStr = 
filterPrimitiveElement.getAttributeNS(BatikExtConstants.BATIK_EXT_NAMESPACE_URI, 
  +                                                             
BatikExtConstants.BATIK_EXT_DH_ATRIBUTE);
  +        if (dhStr.length() == 0) {
  +            dhStr = BatikExtConstants.SVG_FILTER_DH_DEFAULT_VALUE;
  +        }
  +        
  +        region = extendRegion(dxStr,
  +                              dyStr,
  +                              dwStr,
  +                              dhStr,
  +                              unitsType,
  +                              filteredNode,
  +                              region,
  +                              uctx);
  +        
           region.intersect(region, filterRegion, region);
  +
           return region;
       }
   
  
  
  
  1.14      +35 -1     
xml-batik/sources/org/apache/batik/extension/svg/BatikExtConstants.java
  
  Index: BatikExtConstants.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/extension/svg/BatikExtConstants.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- BatikExtConstants.java    15 Nov 2002 15:46:50 -0000      1.13
  +++ BatikExtConstants.java    25 Nov 2002 16:14:15 -0000      1.14
  @@ -34,6 +34,30 @@
       public static final String BATIK_EXT_FLOW_REGION_TAG = 
           "flowRegion";
   
  +    /** Attribute name for dx attribute */
  +    public static final String BATIK_EXT_DX_ATRIBUTE =
  +        "dx";
  +    
  +    /** Attribute name for dy attribute */
  +    public static final String BATIK_EXT_DY_ATRIBUTE =
  +        "dy";
  +    
  +    /** Attribute name for dw attribute */
  +    public static final String BATIK_EXT_DW_ATRIBUTE =
  +        "dw";
  +    
  +    /** Attribute name for dh attribute */
  +    public static final String BATIK_EXT_DH_ATRIBUTE =
  +        "dh";
  +
  +    /** Attribute name for filterPrimitiveMarginsUnits */
  +    public static final String BATIK_EXT_FILTER_PRIMITIVE_MARGINS_UNITS_ATTRIBUTE
  +        = "filterPrimitiveMarginsUnits";
  +
  +    /** Attribute name for filterMarginsUnits */
  +    public static final String BATIK_EXT_FILTER_MARGINS_UNITS_ATTRIBUTE
  +        = "filterMarginsUnits";
  +
       /** Attribute name for x attribute */
       public static final String BATIK_EXT_X_ATTRIBUTE = 
           "x";
  @@ -75,7 +99,6 @@
       public static final String BATIK_EXT_PREFORMATTED_ATTRIBUTE = 
           "preformatted";
   
  -
       /** Tag name for Batik's flowText extension div element SVG 1.1). */
       public static final String BATIK_EXT_FLOW_DIV_TAG = 
           "flowDiv";
  @@ -145,4 +168,15 @@
       public static final String BATIK_EXT_SOLID_OPACITY_PROPERTY = 
           "solid-opacity";
   
  +    /** Default value for filter dx */
  +    public static final String SVG_FILTER_DX_DEFAULT_VALUE = "0";
  +
  +    /** Default value for filter dy */
  +    public static final String SVG_FILTER_DY_DEFAULT_VALUE = "0";
  +
  +    /** Default value for filter dw */
  +    public static final String SVG_FILTER_DW_DEFAULT_VALUE = "0";
  +
  +    /** Default value for filter dh */
  +    public static final String SVG_FILTER_DH_DEFAULT_VALUE = "0";
   }
  
  
  
  1.1                  xml-batik/samples/extensions/filterRegion.svg
  
  Index: filterRegion.svg
  ===================================================================
  <?xml version="1.0" standalone="no"?>
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd";>
  
  <!-- ====================================================================== -->
  <!-- Copyright (C) The Apache Software Foundation. All rights reserved.     -->
  <!--                                                                        -->
  <!-- This software is published under the terms of the Apache Software      -->
  <!-- License version 1.1, a copy of which has been included with this       -->
  <!-- distribution in  the LICENSE file.                                     -->
  <!-- ====================================================================== -->
  
  <!-- ====================================================================== -->
  <!-- Filter extension attributes                                            -->
  <!--                                                                        -->
  <!-- @author                                                                -->
  <!-- @version $Id: filterRegion.svg,v 1.1 2002/11/25 16:14:15 vhardy Exp $           
                                            -->
  <!-- ====================================================================== -->
  
  <?xml-stylesheet type="text/css" href="extension.css" ?>
  
  <svg xmlns="http://www.w3.org/2000/svg"; xmlns:xlink="http://www.w3.org/1999/xlink"; 
id="body" width="450" height="500" xml:space="preserve" 
       viewBox="0 0 450 500"
       xmlns:batik="http://xml.apache.org/batik/ext";>
  
      <title>Filter Extension Attributes</title>
      <defs>
        <filter id="DropShadow" x="-20%" y="-20%" width="250%" height="250%">
          <feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blurredAlpha"/>
          <feOffset in="blurredAlpha" dx="3" dy="3" result="offsetBlurredAlpha"/>
          <feFlood result="flooded" 
style="flood-color:rgb(0,0,0);flood-opacity:0.65"/>
          <feComposite in="flooded" operator="in" in2="offsetBlurredAlpha"
            result="coloredShadow"/>
          <feComposite in="SourceGraphic" in2="coloredShadow" operator="over"/>
        </filter>
        <filter id="DropShadowExtended"
          batik:dx="-12" batik:dy="-12" batik:dw="24" batik:dh="24">
          <feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blurredAlpha"/>
          <feOffset in="blurredAlpha" dx="3" dy="3" result="offsetBlurredAlpha"/>
          <feFlood result="flooded" 
style="flood-color:rgb(0,0,0);flood-opacity:0.65"/>
          <feComposite in="flooded" operator="in" in2="offsetBlurredAlpha"
            result="coloredShadow"/>
          <feComposite in="SourceGraphic" in2="coloredShadow" operator="over"/>
        </filter>
      </defs>
    
      <!-- ============================================================= -->
      <!-- Test content                                                  -->
      <!-- ============================================================= -->
      <g id="testContent" class="legend" style="text-anchor:middle">
          <text x="220" y="40" class="title">
              Filter Extension Attributes
          </text>
          <g transform="translate(150 40)">
            <g style="fill:#DAA;stroke:black">
              <rect x="0" y="40" width="48" height="58" filter="url(#DropShadow)"/>
              <rect x="0" y="110" width="48" height="2" filter="url(#DropShadow)"/>
              <line x1="0" y1="130" x2="48" y2="130" filter="url(#DropShadow)"/>
              <line x1="20" y1="140" x2="20" y2="170" filter="url(#DropShadow)"/>
            </g>
            <text x="20" y="195" text-anchor="middle">Without</text>
          </g>
          <g transform="translate(250 40)">
            <g style="fill:#ADA;stroke:black;">
              <rect x="0" y="40" width="48" height="58" 
filter="url(#DropShadowExtended)"/>
              <rect x="0" y="110" width="48" height="2" 
filter="url(#DropShadowExtended)"/>
              <line x1="0" y1="130" x2="48" y2="130" 
filter="url(#DropShadowExtended)"/>
              <line x1="20" y1="140" x2="20" y2="170" 
filter="url(#DropShadowExtended)"/>
            </g>
            <text x="20" y="195" text-anchor="middle">With</text>
          </g>
      </g>
  
      <!-- ============================================================= -->
      <!-- Batik sample mark                                             -->
      <!-- ============================================================= -->
      <use xlink:href="../batikLogo.svg#Batik_Tag_Box" />
  </svg>
  
  
  
  
  1.1                  xml-batik/samples/extensions/filterRegionDetailed.svg
  
  Index: filterRegionDetailed.svg
  ===================================================================
  <?xml version="1.0" standalone="no"?>
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd";>
  
  <!-- ========================================================================= -->
  <!-- Copyright (C) The Apache Software Foundation. All rights reserved.        -->
  <!--                                                                           -->
  <!-- This software is published under the terms of the Apache Software License -->
  <!-- version 1.1, a copy of which has been included with this distribution in  -->
  <!-- the LICENSE file.                                                         -->
  <!-- ========================================================================= -->
  
  <!-- ========================================================================= -->
  <!--                                                                           -->
  <!-- @author [EMAIL PROTECTED]                                         -->
  <!-- @version $Id: filterRegionDetailed.svg,v 1.1 2002/11/25 16:14:15 vhardy Exp $   
 -->
  <!-- ========================================================================= -->
  
  <?xml-stylesheet type="text/css" href="extension.css" ?>
  
  <svg xmlns="http://www.w3.org/2000/svg"; xmlns:xlink="http://www.w3.org/1999/xlink"; 
        xmlns:b="http://xml.apache.org/batik/ext";
       id="body" width="450" height="500" viewBox="0 0 450 500">
  <title>FilterRegions test</title>
  
      <text x="225" y="40" class="title">
          Filter Regions with padding
       </text>
  
      <style type="text/css">
          <![CDATA[
              .filterRegionControl {
                  fill: none;
                  stroke: black;
                  stroke-opacity: 1;
                  stroke-width: 1;
                  shape-rendering: crispEdges;
              }
  
              .bbox {
                  fill: none;
                  stroke: black;
                  stroke-opacity: 1;
                  stroke-width: 1;
                  shape-rendering: crispEdges;
                  stroke-dasharray: 3 3;
              }
  
              .filterRegionControlLabel {
                  fill: black;
                  font-size: 10;
                  text-anchor: middle;
                  shape-rendering: crispEdges;
              }
          ]]>
      </style>
  
      <defs>
          <!-- ======================================================== -->
          <!-- filterRegion_0                                           -->
          <!--   chain padding: [userSpaceOnUse], undefined             -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (0, 0, 60, 40) in user space       -->
          <!-- ======================================================== -->
          <filter id="filterRegion_0" x="0" y="0" width="1" height="1">
              <feFlood flood-color="crimson"
                       result="crimson"/>
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_1                                           -->
          <!--   chain padding: [userSpaceOnUse], -5,-5,10,10           -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (-5, -5, 70, 50) in user space     -->
          <!-- ======================================================== -->
          <filter id="filterRegion_1" x="0" y="0" width="1" height="1"
                  b:dx="-5" b:dy="-5" b:dw="10" b:dh="10">
              <feFlood flood-color="gold"
                       result="gold"/>
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_2                                           -->
          <!--   chain padding: [userSpaceOnUse], 5,5,-10,-10           -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (5, 5, 50, 30) in user space     -->
          <!-- ======================================================== -->
          <filter id="filterRegion_2" x="0" y="0" width="1" height="1"
                  b:dx="5" b:dy="5" b:dw="-10" b:dh="-10">
              <feFlood flood-color="orange"
                       result="orange"/>
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_3                                           -->
          <!--   chain padding: [userSpaceOnUse], -5,-5,10,10           -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (-5, -5, 70, 50) in user space     -->
          <!-- ======================================================== -->
          <filter id="filterRegion_3" x="0" y="0" width="1" height="1"
                  filterMarginsUnits="userSpaceOnUse" 
                  b:dx="-5" b:dy="-5" b:dw="10" b:dh="10">
              <feFlood flood-color="gold" />
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_4                                           -->
          <!--   chain padding: [userSpaceOnUse], 5, 5, -10, -10        -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (5, 5, 50, 30) in user space       -->
          <!-- ======================================================== -->
          <filter id="filterRegion_4" x="0" y="0" width="1" height="1"
                  filterMarginsUnits="userSpaceOnUse"
                  b:dx="5" b:dy="5" b:dw="-10" b:dh="-10">
              <feFlood flood-color="orange" />
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_5                                           -->
          <!--   chain padding: [objectBoundingBox], -.1, -.1, .2, .2   -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (-6, -4, 72, 48) in user space     -->
          <!-- ======================================================== -->
          <filter id="filterRegion_5" x="0" y="0" width="1" height="1"
                  filterMarginsUnits="objectBoundingBox" 
                  b:dx="-.1" b:dy="-.1" b:dw=".2" b:dh=".2">
              <feFlood flood-color="gold" />
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_6                                           -->
          <!--   chain padding: [objectBoundingBox], .1, .1, -.2, -.2   -->
          <!--   flood padding:  [userSpaceOnUse], undefined            -->
          <!--                                                          -->
          <!-- Expected fill region: (6, 4, 48, 32) in user space       -->
          <!-- ======================================================== -->
          <filter id="filterRegion_6" x="0" y="0" width="1" height="1"
                  filterMarginsUnits="objectBoundingBox"
                  b:dx=".1" b:dy=".1" b:dw="-.2" b:dh="-.2">
              <feFlood flood-color="orange" />
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_7                                           -->
          <!--   chain padding: [userSpaceOnUse], undefined             -->
          <!--   flood padding:  [default], 5, 5, -10, -10       -->
          <!--                                                          -->
          <!-- Expected fill region: (5, 5, 50, 30) in user space     -->
          <!-- ======================================================== -->
          <filter id="filterRegion_7" x="0" y="0" width="1" height="1">
              <feFlood flood-color="crimson" result="crimson"/>
              <feFlood flood-color="gold"
                       result="gold" b:dx="5" b:dy="5" b:dw="-10" b:dh="-10"/>
              <feMerge>
                  <feMergeNode in="crimson" />
                  <feMergeNode in="gold" />
              </feMerge>
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_8                                           -->
          <!--   chain padding: [userSpaceOnUse], undefined             -->
          <!--   flood padding:  [userSpaceOnUse], 5, 5, -10, -10       -->
          <!--                                                          -->
          <!-- Expected fill region: (5, 5, 50, 30) in user space     -->
          <!-- ======================================================== -->
          <filter id="filterRegion_8" x="0" y="0" width="1" height="1"
                  b:filterPrimitiveMarginsUnits="userSpaceOnUse">
              <feFlood flood-color="gold" result="gold"/>
              <feFlood flood-color="crimson"
                       result="crimson" b:dx="5" b:dy="5" b:dw="-10" b:dh="-10"/>
              <feMerge>
                  <feMergeNode in="gold" />
                  <feMergeNode in="crimson" />
              </feMerge>
          </filter>
  
          <!-- ======================================================== -->
          <!-- filterRegion_9                                           -->
          <!--   chain padding: [userSpaceOnUse], undefined             -->
          <!--   flood padding:  [objectBoundingBox], .1, .1, -.2, -.2  -->
          <!--                                                          -->
          <!-- Expected fill region: (6, 4, 48, 32) in user space       -->
          <!-- ======================================================== -->
          <filter id="filterRegion_9" x="0" y="0" width="1" height="1"
                  b:filterPrimitiveMarginsUnits="objectBoundingBox">
              <feFlood flood-color="gold" result="gold"/>
              <feFlood flood-color="crimson"
                       result="crimson" b:dx=".1" b:dy=".1" b:dw="-.2" b:dh="-.2"/>
              <feMerge>
                  <feMergeNode in="gold" />
                  <feMergeNode in="crimson" />
              </feMerge>
          </filter>
  
  
      </defs>
  
      <!-- ============================ -->
      <!-- filterRegion_0 : No padding  -->
      <!-- ============================ -->
      <g transform="translate(20, 100)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_0)" /> 
          <rect class="filterRegionControl" x="0" y="0" width="60" height="40" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">No padding</text>
      </g>
  
      <!-- ========================================== -->
      <!-- filterRegion_1 : User Space chain padding  -->
      <!-- ========================================== -->
      <g transform="translate(120, 100)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_1)" /> 
          <rect class="filterRegionControl" x="-5" y="-5" width="70" height="50" /> 
          <rect class="bbox" x="0" y="0" width="60" height="40" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Chain Padding A</text>
      </g>
  
      <!-- ============================================== -->
      <!-- filterRegion_2 : User Space chain padding      -->
      <!-- ============================================== -->
      <g transform="translate(220, 100)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_2)" /> 
          <rect class="filterRegionControl" x="5" y="5" width="50" height="30" /> 
          <rect class="bbox" width="60" height="40" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Chain Padding B</text>
      </g>
  
      <!-- ========================================== -->
      <!-- filterRegion_3 : User Space chain padding  -->
      <!-- ========================================== -->
      <g transform="translate(120, 200)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_3)" /> 
          <rect class="filterRegionControl" x="-5" y="-5" width="70" height="50" /> 
          <rect class="bbox" width="60" height="40" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Chain Padding C</text>
      </g>
  
      <!-- ============================================== -->
      <!-- filterRegion_4 : Use Space chain padding       -->
      <!-- ============================================== -->
      <g transform="translate(220, 200)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_4)" /> 
          <rect class="filterRegionControl" x="5" y="5" width="50" height="30" /> 
          <rect class="bbox" width="60" height="40" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Chain Padding D</text>
      </g>
  
      <!-- ========================================== -->
      <!-- filterRegion_5 : object BB chain padding   -->
      <!-- ========================================== -->
      <g transform="translate(120, 300)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_5)" /> 
          <rect class="bbox" width="60" height="40" /> 
          <rect class="filterRegionControl" x="-6" y="-4" width="72" height="48" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Chain Padding E</text>
      </g>
  
      <!-- ============================================== -->
      <!-- filterRegion_6 : object BB chain padding       -->
      <!-- ============================================== -->
      <g transform="translate(220, 300)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_6)" /> 
          <rect class="bbox" width="60" height="40" /> 
          <rect class="filterRegionControl" x="6" y="4" width="48" height="32" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Chain Padding F</text>
      </g>
  
      <!-- =================================================== -->
      <!-- filterRegion_7 : user space primitive padding       -->
      <!-- =================================================== -->
      <g transform="translate(320, 100)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_7)" /> 
          <rect class="bbox" width="60" height="40" /> 
          <rect class="filterRegionControl" x="5" y="5" width="50" height="30" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Primitive Padding 
A</text>
      </g>
  
      <!-- =================================================== -->
      <!-- filterRegion_8 : user space primitive padding       -->
      <!-- =================================================== -->
      <g transform="translate(320, 200)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_8)" /> 
          <rect class="bbox" width="60" height="40" /> 
          <rect class="filterRegionControl" x="5" y="5" width="50" height="30" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Primitive Padding 
B</text>
      </g>
  
      <!-- =================================================== -->
      <!-- filterRegion_9 : object BB primitive padding        -->
      <!-- =================================================== -->
      <g transform="translate(320, 300)">
          <rect x="0" y="0" width="60" height="40" filter="url(#filterRegion_9)" /> 
          <rect class="bbox" width="60" height="40" /> 
          <rect class="filterRegionControl" x="6" y="4" width="48" height="32" /> 
          <text x="30" y="-10" class="filterRegionControlLabel">Primitive Padding 
C</text>
      </g>
  
  
      <!-- ============================================================= -->
      <!-- Batik sample mark                                             -->
      <!-- ============================================================= -->
      <use xlink:href="../batikLogo.svg#Batik_Tag_Box" />
  
  </svg>
  
  
  
  1.88      +7 -1      
xml-batik/test-resources/org/apache/batik/test/samplesRendering.xml
  
  Index: samplesRendering.xml
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/test-resources/org/apache/batik/test/samplesRendering.xml,v
  retrieving revision 1.87
  retrieving revision 1.88
  diff -u -r1.87 -r1.88
  --- samplesRendering.xml      19 Nov 2002 17:03:54 -0000      1.87
  +++ samplesRendering.xml      25 Nov 2002 16:14:15 -0000      1.88
  @@ -71,6 +71,12 @@
           <test id="samples/extensions/star.svg" >
               <property name="Validating" class="java.lang.Boolean" value="false" />
        </test>
  +        <test id="samples/extensions/filterRegion.svg" >
  +            <property name="Validating" class="java.lang.Boolean" value="false" />
  +     </test>
  +        <test id="samples/extensions/filterRegionDetailed.svg" >
  +            <property name="Validating" class="java.lang.Boolean" value="false" />
  +     </test>
       </testGroup>
   
       <!-- ======================================================================= -->
  
  
  
  1.1                  xml-batik/test-references/samples/extensions/filterRegion.png
  
        <<Binary file>>
  
  
  1.1                  
xml-batik/test-references/samples/extensions/filterRegionDetailed.png
  
        <<Binary file>>
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to