deweese     2004/11/29 19:23:58

  Modified:    samples/solitaire/script util.js
               samples/tests/spec/scripting rectResizeOnClick.svg
                        zeroSize.svg
               samples/tests/spec12/text flowText.svg
               sources/org/apache/batik/bridge
                        AbstractGraphicsNodeBridge.java
                        SVGUseElementBridge.java
               sources/org/apache/batik/dom/svg SVGLocatableSupport.java
               sources/org/apache/batik/ext/awt/geom SegmentList.java
               sources/org/apache/batik/gvt CompositeGraphicsNode.java
                        ShapeNode.java
               sources/org/apache/batik/gvt/flow LineInfo.java
               sources/org/apache/batik/swing/gvt JGVTComponent.java
               test-references/samples/tests/spec/scripting
                        text_content.png zeroSize.png
               test-resources/org/apache/batik/test samplesRendering.xml
  Added:       samples/tests/spec/scripting bbox.svg
               test-references/samples/tests/spec/scripting bbox.png
  Log:
  1) getBBox should now work per the specification.
     a) fill="none" will still give bbox
     b) It is now the tight bounds of the geometry
     c) It does not include the stroke anymore.
     d) When called on 'undisplayed' elements returns null (not sure
        what the spec really says about this).
  2) Modification of use element's width/height now works.
  3) Some fixes for flowText with soft-hyphens and the like.
  
  Revision  Changes    Path
  1.3       +3 -1      xml-batik/samples/solitaire/script/util.js
  
  Index: util.js
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/solitaire/script/util.js,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- util.js   23 Oct 2004 17:11:03 -0000      1.2
  +++ util.js   30 Nov 2004 03:23:57 -0000      1.3
  @@ -52,7 +52,9 @@
       if (elem.getScreenCTM)
         return elem.getScreenCTM();
   
  -    if (elem == root) {
  +    // This is to handle ASV 3.0, this depends on
  +    // a number of bugs in the ASV implementation.
  +    if (elem.currentScale) {
         var scale = root.currentScale;
         var trans = root.currentTranslate;
         var ret = root.createSVGMatrix();
  
  
  
  1.5       +2 -2      
xml-batik/samples/tests/spec/scripting/rectResizeOnClick.svg
  
  Index: rectResizeOnClick.svg
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/samples/tests/spec/scripting/rectResizeOnClick.svg,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- rectResizeOnClick.svg     18 Aug 2004 07:12:05 -0000      1.4
  +++ rectResizeOnClick.svg     30 Nov 2004 03:23:58 -0000      1.5
  @@ -44,7 +44,7 @@
       // This function is only called if test is run from regard.
       function regardStart() {
          setRect('targetRect', '5', '5', '440', '490');
  -       regardTestInstance.scriptDone();
  +       setTimeout('regardTestInstance.scriptDone()', 100);
       }
      </script>
   
  
  
  
  1.5       +3 -1      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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- zeroSize.svg      8 Oct 2004 16:12:01 -0000       1.4
  +++ zeroSize.svg      30 Nov 2004 03:23:58 -0000      1.5
  @@ -74,6 +74,8 @@
         if (!doShowBounds) return;
         var bbox = shape.getBBox();
         var elem;
  +//      System.err.println("XXX: [" + bbox.x + ", " +bbox.y + ", " + 
  +//                         bbox.width + ", " + bbox.height + "]");
         if (bbox.width == 0) {
            if (bbox.height == 0) {
              elem = document.createElementNS(svgns, "circle");
  
  
  
  1.1                  xml-batik/samples/tests/spec/scripting/bbox.svg
  
  Index: bbox.svg
  ===================================================================
  <?xml version="1.0" standalone="no"?>
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000802//EN"
  "http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd";>
  
  <!--
  
     Copyright 2003  The Apache Software Foundation 
  
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
         http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
  
  -->
  
  <!-- ====================================================================== 
-->
  <!-- Test of getBBox interface for various elements with various property   
-->
  <!-- values (fill, stroke, visibility, display).                            
-->
  <!--                                                                        
-->
  <!-- @author [EMAIL PROTECTED]                                             -->
  <!-- @version $Id: bbox.svg,v 1.1 2004/11/30 03:23:58 deweese Exp $ -->
  <!-- ====================================================================== 
-->
  
  <?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?>  
  
  <svg id="body" width="450" height="500" viewBox="0 0 450 500"
       onload="start()">
    <title>Test getBBox interface</title>
    <text x="50%" y="45" class="title">Test getBBox interface</text>
  
    <script type="text/ecmascript"><![CDATA[
       var svgns = "http://www.w3.org/2000/svg";;
       var root;
       var pref       = new Array("n", "v", "d" );
       var fillStroke = new Array("-", "f", "s", "fs" );
       var elemT      = new Array("p", "t", "u", "i" );
       var xLoc       = new Array(35, 115, 195, 275);
       var yLoc       = 10;
  
       function start() { 
         root = document.getRootElement();
         for (i=0; i<pref.length; i++) {
           for (j=0; j<fillStroke.length; j++) {
             for (k=0; k<elemT.length; k++) {
                doBBox(pref[i]+fillStroke[j]+elemT[k], xLoc[k], yLoc);
             }
           }
         }
  
        updatePath("u-p");
        updatePath("ufsp");
  
        updateText("u-t");
        updateText("ufst");
  
        updateG("u-u");
        updateG("ufsu");
  
        updateImg("u-i");
        updateImg("ufsi");
  
  
       }
  
       function updatePath(id) {
         doBBox(id, xLoc[0], yLoc);
         var elem = root.getElementById(id);
         elem.setAttribute("d", "M 10,25 c 0,-40 60,20 60,-20z");
         doBBox(id, xLoc[0], yLoc);
       }
  
       function updateText(id) {
         doBBox(id, xLoc[1], yLoc);
         var elem = root.getElementById(id);
         var txt = document.createTextNode("getBBox");
         elem.replaceChild(txt,elem.firstChild);
         doBBox(id, xLoc[1], yLoc);
       }
  
       function updateG(id) {
         doBBox(id, xLoc[2], yLoc);
         var elem = root.getElementById(id);
         var use  = elem.firstChild;
         use.setAttribute("x",      "190");
         use.setAttribute("y",      "5");
         use.setAttribute("width",  "20");
         use.setAttribute("height", "20");
  
         doBBox(id, xLoc[1], yLoc);
       }
  
       function updateImg(id) {
         doBBox(id, xLoc[2], yLoc);
         var elem = root.getElementById(id);
         elem.setAttribute("x",      "261");
         elem.setAttribute("y",      "5");
         elem.setAttribute("width",  "43");
         elem.setAttribute("height", "20");
  
         doBBox(id, xLoc[1], yLoc);
       }
  
       function doBBox(id, locX, locY) {
         var elem = root.getElementById(id);
         var bbox;
         if (elem) bbox = elem.getBBox();
         var rect = document.createElementNS(svgns, "rect");
         if (!bbox) {
           // No BBox undisplayed etc...  use small crimson rect.
           rect.setAttribute("x",      ""+locX);
           rect.setAttribute("y",      ""+locY);
           rect.setAttribute("width",  "10");
           rect.setAttribute("height", "10");
           rect.setAttribute("fill",   "crimson");
         } else {
           rect.setAttribute("x",      ""+bbox.x);
           rect.setAttribute("y",      ""+bbox.y);
           rect.setAttribute("width",  ""+bbox.width);
           rect.setAttribute("height", ""+bbox.height);
           rect.setAttribute("fill", "none");
           rect.setAttribute("stroke", "black");
           rect.setAttribute("stroke-width", "2");
           rect.setAttribute("stroke-opacity", "0.5");
         }
  
         elem.getParentNode().getParentNode().appendChild(rect);
       }
      ]]></script>
    <defs>
       <symbol id="Batik_Squiggle" viewBox="0 0 540 570">
          <path id="Batik_Squiggle_Blue" 
           d="M172,44C137,60,31,135,11,199c-8,27,22,48,44,33
              C14,306-1,332,0,356c0,14,13,42,44,27c8-4,35-25,52-41
              c14-1,24-11,42-28c17,14,36,10,52-7c22,2,82-78,44-108
              c-3-24-30-37-53-18c-6-2-13-1-18,1c22-35,43-82,49-105
              C219,47,188,36,172,44z"/>
          <path id="Batik_Squiggle_Red" 
           d="M400,0c-18,3-49,31-49,31c-29,23-43,58-28,95
              c-13,14-29,44-29,67c0,28,20,52,50,29c7,8,21,16,37,5
              c-5,29,3,48,26,49c1,10,13,31,36,17c16-10,58-39,79-56
              c25-23,25-94-18-89c33-59-3-96-27-84c-10,4-46,25-52,30
              c-1-7-5-12-11-14C436,45,436-5,401,0z"/>
          <path id="Batik_Squiggle_Green"
           d="M275,353c-46,12-88,43-114,91c-9,16,6,37,25,33
              c-14,24-40,67-15,81c28,16,52-8,60-15c18,21,50,10,81-17
              c41,14,68-2,103-53c8-12,30-43,30-65c0-16-15-30-35-21
              c-1-12-9-38-53-19c-10-6-31-5-54,17
              C308,375,300,347,275,353z"/>
       </symbol>
    </defs>
  
    <g id="test-content" transform="translate(0, 60)" >
       <g> <!-- The test grid -->
          <g stroke="#000">
             <rect x="10" y="0"   width="20" height="120" fill="#eee"/>
             <rect x="10" y="120" width="20" height="120" fill="#ddd"/>
             <rect x="10" y="240" width="20" height="120" fill="#eee"/>
             <rect x="10" y="360" width="20" height="60" fill="#ddd"/>
  
  
             <rect x="30" y="0"  width="410" height="30" fill="#f8f8f8"/>
             <rect x="30" y="30" width="410" height="30" fill="#f0f0f0"/>
             <rect x="30" y="60" width="410" height="30" fill="#f8f8f8"/>
             <rect x="30" y="90" width="410" height="30" fill="#f0f0f0"/>
  
             <rect x="30" y="120" width="410" height="30" fill="#e0e0e0"/>
             <rect x="30" y="150" width="410" height="30" fill="#d0d0d0"/>
             <rect x="30" y="180" width="410" height="30" fill="#e0e0e0"/>
             <rect x="30" y="210" width="410" height="30" fill="#d0d0d0"/>
  
             <rect x="30" y="240" width="410" height="30" fill="#f8f8f8"/>
             <rect x="30" y="270" width="410" height="30" fill="#f0f0f0"/>
             <rect x="30" y="300" width="410" height="30" fill="#f8f8f8"/>
             <rect x="30" y="330" width="410" height="30" fill="#f0f0f0"/>
  
             <rect x="30" y="360" width="410" height="30" fill="#e0e0e0"/>
             <rect x="30" y="390" width="410" height="30" fill="#d0d0d0"/>
  
             <line x1="120" x2="120" y1="0" y2="420"/>
             <line x1="200" x2="200" y1="0" y2="420"/>
             <line x1="280" x2="280" y1="0" y2="420"/>
             <line x1="360" x2="360" y1="0" y2="420"/>
             <line x1="10" x2="440" y1="120" y2="120" stroke-width="3"/>
             <line x1="10" x2="440" y1="240" y2="240" stroke-width="3"/>
             <line x1="10" x2="440" y1="360" y2="360" stroke-width="3"/>
          </g>
          <text transform="rotate(-90,25,60)" x="25" y="60" 
text-anchor="middle">Normal</text>
          <text transform="rotate(-90,25,180)" x="25" y="180" 
text-anchor="middle">visiblilty="hidden"</text>
          <text transform="rotate(-90,25,300)" x="25" y="300" 
text-anchor="middle">display="none"</text>
          <text transform="rotate(-90,25,390)" x="25" y="390" 
text-anchor="middle">Update</text>
          <g font-size="15">
          <text x="110" y="22" text-anchor="end">none</text>
          <text x="110" y="52" text-anchor="end">fill</text>
          <text x="110" y="82" text-anchor="end">stroke</text>
          <text x="110" y="112" text-anchor="end">fill+stroke</text>
  
          <text x="110" y="142" text-anchor="end">none</text>
          <text x="110" y="172" text-anchor="end">fill</text>
          <text x="110" y="202" text-anchor="end">stroke</text>
          <text x="110" y="232" text-anchor="end">fill+stroke</text>
  
          <text x="110" y="262" text-anchor="end">none</text>
          <text x="110" y="292" text-anchor="end">fill</text>
          <text x="110" y="322" text-anchor="end">stroke</text>
          <text x="110" y="352" text-anchor="end">fill+stroke</text>
  
          <text x="110" y="382" text-anchor="end">none</text>
          <text x="110" y="412" text-anchor="end">fill+stroke</text>
          </g>
       </g>
  
       <g font-size="18" text-anchor="middle">
          <g transform="translate(120,0)">
             <g fill="none" stroke="none" stroke-width="3">
                <path id="n-p" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="n-t" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="n-u">
                  <use x="190" y="5" width="20" height="20" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="n-i" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,30)">
             <g fill="crimson" stroke="none" stroke-width="3">
                <path id="nfp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="nft" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="nfu">
                  <use x="190" y="5" width="20" height="20" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="nfi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,60)">
             <g fill="none" stroke="gold" stroke-width="3" >
                <path id="nsp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="nst" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="nsu">
                   <use x="190" y="5" width="20" height="20" stroke-width="20"
                        xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="nsi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,90)">
             <g fill="crimson" stroke="gold" stroke-width="3">
                <path id="nfsp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="nfst" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="nfsu">
                   <use x="190" y="5" width="20" height="20" stroke-width="20"
                        xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="nfsi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
       </g>
  
       <g transform="translate(0, 120)" font-size="18" text-anchor="middle">
          <g transform="translate(120,0)" >
             <g fill="none" stroke="none" stroke-width="3" visibility="hidden">
                <path id="v-p" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="v-t" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="v-u">
                  <use x="190" y="5" width="20" height="20" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="v-i" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,30)">
             <g fill="crimson" stroke="none" stroke-width="3" 
                visibility="hidden">
                <path id="vfp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="vft" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="vfu">
                  <use x="190" y="5" width="20" height="20" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="vfi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,60)">
             <g fill="none" stroke="gold" stroke-width="3" visibility="hidden">
                <path id="vsp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="vst" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="vsu">
                   <use x="190" y="5" width="20" height="20" stroke-width="20"
                        xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="vsi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,90)">
             <g fill="crimson" stroke="gold" stroke-width="3" 
                visibility="hidden">
                <path id="vfsp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="vfst" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="vfsu">
                   <use x="190" y="5" width="20" height="20" stroke-width="20"
                        xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="vfsi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
       </g>
  
       <g transform="translate(0, 240)" font-size="18" text-anchor="middle">
          <g transform="translate(120,0)" >
             <g fill="none" stroke="none" stroke-width="3" display="none">
                <path id="d-p" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="d-t" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="d-u">
                  <use x="190" y="5" width="20" height="20" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="d-i" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,30)">
             <g fill="crimson" stroke="none" stroke-width="3" display="none">
                <path id="dfp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="dft" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="dfu">
                  <use x="190" y="5" width="20" height="20" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="dfi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,60)">
             <g fill="none" stroke="gold" stroke-width="3" display="none">
                <path id="dsp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="dst" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="dsu">
                   <use x="190" y="5" width="20" height="20" stroke-width="20"
                        xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="dsi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,90)">
             <g fill="crimson" stroke="gold" stroke-width="3" display="none">
                <path id="dfsp" d="M 10,25 c 0,-40 60,20 60,-20z"/>
                <text id="dfst" x="120" y="20" stroke-width=".5">getBBox</text>
                <g id="dfsu">
                   <use x="190" y="5" width="20" height="20" stroke-width="20"
                        xlink:href="#Batik_Squiggle"/>
                </g>
                <image id="dfsi" x="261" y="5" width="43" height="20"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
       </g>
  
       <g transform="translate(0, 360)" font-size="18" text-anchor="middle">
          <g transform="translate(120,0)">
             <g fill="none" stroke="none" stroke-width="3">
                <path id="u-p" d="M 40,25 l-10,-10 l10,-10 l10,10 z"/>
                <text id="u-t" x="120" y="20" stroke-width=".5">sm</text>
                <g id="u-u"
                   ><use x="195" y="10" width="10" height="10" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/></g>
                <image id="u-i" x="271.75" y="10" width="21.5" height="10"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
          <g transform="translate(120,30)">
             <g fill="crimson" stroke="gold" stroke-width="3">
                <path id="ufsp" d="M 40,25 l-10,-10 l10,-10 l10,10 z"/>
                <text id="ufst" x="120" y="20" stroke-width=".5">sm</text>
                <g id="ufsu"
                   ><use x="195" y="10" width="10" height="10" stroke-width="20"
                       xlink:href="#Batik_Squiggle"/></g>
                <image id="ufsi" x="271.75" y="10" width="21.5" height="10"
                       xlink:href="../../resources/images/tde.jpg"/>
             </g>
          </g>
       </g>
    </g>
  
  </svg>
  
  
  
  
  
  1.2       +5 -5      xml-batik/samples/tests/spec12/text/flowText.svg
  
  Index: flowText.svg
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/tests/spec12/text/flowText.svg,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- flowText.svg      18 Nov 2004 01:46:52 -0000      1.1
  +++ flowText.svg      30 Nov 2004 03:23:58 -0000      1.2
  @@ -53,10 +53,10 @@
            </flowRegion>
   
            <flowDiv>
  -         <flowPara indent="20" bottom-margin="10" >This is an <flowSpan 
font-size="40" fill="crimson">ex&#x00AD;ample</flowSpan> of a very long string 
that is split &#x200D;across multi&#x00AD;ple lines via text 
wrap&#x0AD;ping.</flowPara>
  -         <flowPara justification="middle" top-margin="10" left-margin="10" 
right-margin="10" bottom-margin="10"><flowLine>Now check if text wrapping 
handles a number of tricky</flowLine> situations: 
averylongrunonwordthatspansmultiplelines<flowSpan 
font-weight="bold">with<flowSpan 
fill="crimson">embedded</flowSpan>span</flowSpan>elements &amp; <flowSpan 
fill="green" dy="-.3em" font-size="80%">super</flowSpan><flowSpan dy=".3em"> or 
</flowSpan><flowSpan fill="darkgreen" dy=".3em" 
font-size="80%">sub</flowSpan><flowSpan dy="-.3em"> 
scripts.</flowSpan></flowPara>
  -         <flowPara top-margin="10" justification="end">Now we are just 
<flowSpan font-size="30" fill="blue">about</flowSpan> to go to the next flow 
rect <flowSpan font-size="10">(note if the 'about' were included on the last 
line of the previous flow rect the line would not have fit and the whole line 
would have moved here).</flowSpan></flowPara>
  -         <flowPara margin="10" justification="full">     I'll keep going 
because I want to make sure that it properly stops when it hits the end of all 
of the the flow regions defined. Also the last line includes text in a larger 
font size so it will not fit. Thus the end of this sentence will be cut off 
because the line size gets <flowSpan font-size="35">tall</flowSpan>er</flowPara>
  +         <flowPara indent="20" margin-bottom="10" >This is an <flowSpan 
font-size="40" fill="crimson">ex&#x00AD;ample</flowSpan> of a very long string 
that is split &#x200D;across multi&#x00AD;ple lines via text 
wrap&#x0AD;ping.</flowPara>
  +         <flowPara text-align="full" margin-top="10" margin-left="10" 
margin-right="10" margin-bottom="10">Now check if text wrapping handles some 
tricky stuff: 
a&#x00AD;very&#x00AD;long&#x00AD;runon&#x00AD;word&#x00AD;that&#x00AD;spans&#x00AD;multiple&#x00AD;lines&#x00AD;<flowSpan
 font-weight="bold">with&#x00AD;<flowSpan 
fill="crimson">embed&#x00AD;</flowSpan>span</flowSpan>&#x00AD;elements &amp; 
<flowSpan fill="green" dy="-.3em" font-size="80%">super</flowSpan><flowSpan 
dy=".3em"> or </flowSpan><flowSpan fill="darkgreen" dy=".3em" 
font-size="80%">sub</flowSpan><flowSpan dy="-.3em"> 
scripts.</flowSpan></flowPara>
  +         <flowPara margin-top="10pt" text-align="end">We are just <flowSpan 
font-size="30" fill="blue">about</flowSpan> to go to the next flow rect 
<flowSpan font-size="10">(NOTE: if the 'about' were included on the last line 
of the previous flow the line would not have fit in the region, so it is moved 
to this flowRegion).</flowSpan></flowPara>
  +         <flowPara margin="10px" text-align="middle">     I want to make 
sure that it stops when it hits the end of all of the flowRegions defined. Also 
the last line includes text in a larger font size so it will not fit. The end 
of this sentence will be cut off because the line size gets <flowSpan 
font-size="35">tall</flowSpan>er</flowPara>
            </flowDiv>
         </flowRoot>
      </g>
  
  
  
  1.39      +19 -2     
xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java
  
  Index: AbstractGraphicsNodeBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- AbstractGraphicsNodeBridge.java   14 Oct 2004 09:42:00 -0000      1.38
  +++ AbstractGraphicsNodeBridge.java   30 Nov 2004 03:23:58 -0000      1.39
  @@ -17,16 +17,20 @@
    */
   package org.apache.batik.bridge;
   
  +import java.awt.Shape;
   import java.awt.geom.AffineTransform;
   import java.awt.geom.Rectangle2D;
  +import java.lang.ref.SoftReference;
   
   import org.apache.batik.css.engine.CSSEngineEvent;
   import org.apache.batik.css.engine.SVGCSSEngine;
   import org.apache.batik.dom.svg.SVGContext;
   import org.apache.batik.dom.svg.SVGOMElement;
  +import org.apache.batik.ext.awt.geom.SegmentList;
   import org.apache.batik.gvt.CanvasGraphicsNode;
   import org.apache.batik.gvt.CompositeGraphicsNode;
   import org.apache.batik.gvt.GraphicsNode;
  +
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
   import org.w3c.dom.events.MutationEvent;
  @@ -312,6 +316,9 @@
               
       }
   
  +    protected SoftReference bboxShape = null;
  +    protected Rectangle2D bbox = null;
  +
       /**
        * Returns the tight bounding box in current user space (i.e.,
        * after application of the transform attribute, if any) on the
  @@ -319,7 +326,17 @@
        * stroke-width and filter effects).
        */
       public Rectangle2D getBBox() {
  -        return node.getPrimitiveBounds();
  +        Shape s = node.getOutline();
  +        
  +        if ((bboxShape != null) && (s == bboxShape.get())) return bbox;
  +        bboxShape = new SoftReference(s); // don't keep this live.
  +        bbox = null;
  +        if (s == null) return bbox;
  +
  +        // SegmentList.getBounds2D gives tight BBox.
  +        SegmentList sl = new SegmentList(s);
  +        bbox = sl.getBounds2D();
  +        return bbox;
       }
   
       /**
  
  
  
  1.45      +11 -7     
xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java
  
  Index: SVGUseElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- SVGUseElementBridge.java  20 Aug 2004 19:29:46 -0000      1.44
  +++ SVGUseElementBridge.java  30 Nov 2004 03:23:58 -0000      1.45
  @@ -405,14 +405,18 @@
           String attrName = evt.getAttrName();
           Node evtNode = evt.getRelatedNode();
   
  -        if (attrName.equals(SVG_X_ATTRIBUTE) ||
  -            attrName.equals(SVG_Y_ATTRIBUTE) ||
  -            attrName.equals(SVG_TRANSFORM_ATTRIBUTE)) {
  +        if ((evtNode.getNamespaceURI() == null) &&
  +            (attrName.equals(SVG_X_ATTRIBUTE) ||
  +             attrName.equals(SVG_Y_ATTRIBUTE) ||
  +             attrName.equals(SVG_TRANSFORM_ATTRIBUTE))) {
               node.setTransform(computeTransform(e, ctx));
               handleGeometryChanged();
  -        } else if (( XLinkSupport.XLINK_NAMESPACE_URI.equals
  -                     (evtNode.getNamespaceURI()) ) 
  -                   && SVG_HREF_ATTRIBUTE.equals(evtNode.getLocalName()) ){
  +        } else if (((evtNode.getNamespaceURI() == null) && 
  +                   (attrName.equals(SVG_WIDTH_ATTRIBUTE) ||
  +                    attrName.equals(SVG_HEIGHT_ATTRIBUTE))) ||
  +                   (( XLinkSupport.XLINK_NAMESPACE_URI.equals
  +                     (evtNode.getNamespaceURI()) ) &&  
  +                    SVG_HREF_ATTRIBUTE.equals(evtNode.getLocalName()))) {
               buildCompositeGraphicsNode(ctx, e, (CompositeGraphicsNode)node);
           }
       }
  
  
  
  1.10      +5 -1      
xml-batik/sources/org/apache/batik/dom/svg/SVGLocatableSupport.java
  
  Index: SVGLocatableSupport.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGLocatableSupport.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SVGLocatableSupport.java  18 Aug 2004 07:13:14 -0000      1.9
  +++ SVGLocatableSupport.java  30 Nov 2004 03:23:58 -0000      1.10
  @@ -71,6 +71,10 @@
        */
       public static SVGRect getBBox(Element elt) {
           final SVGOMElement svgelt = (SVGOMElement)elt;
  +        SVGContext svgctx = svgelt.getSVGContext();
  +        if (svgctx == null) return null;
  +        if (svgctx.getBBox() == null) return null;
  +
           return new SVGRect() {
                   public float getX() {
                       return (float)svgelt.getSVGContext().getBBox().getX();
  
  
  
  1.2       +14 -0     
xml-batik/sources/org/apache/batik/ext/awt/geom/SegmentList.java
  
  Index: SegmentList.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/ext/awt/geom/SegmentList.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SegmentList.java  18 Nov 2004 01:46:58 -0000      1.1
  +++ SegmentList.java  30 Nov 2004 03:23:58 -0000      1.2
  @@ -67,6 +67,20 @@
           }
       }
   
  +    public Rectangle2D getBounds2D() {
  +        Iterator iter = iterator();
  +        if (!iter.hasNext()) return null;
  +
  +        Rectangle2D ret;
  +        ret = (Rectangle2D)((Segment)iter.next()).getBounds2D().clone();
  +        while (iter.hasNext()) {
  +            Segment seg = (Segment)iter.next();
  +            Rectangle2D segB = seg.getBounds2D();
  +            Rectangle2D.union(segB, ret, ret);
  +        }
  +        return ret;
  +    }
  +
       public void add(Segment s) {
           segments.add(s);
       }
  
  
  
  1.40      +13 -12    
xml-batik/sources/org/apache/batik/gvt/CompositeGraphicsNode.java
  
  Index: CompositeGraphicsNode.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/gvt/CompositeGraphicsNode.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- CompositeGraphicsNode.java        23 Oct 2004 17:11:03 -0000      1.39
  +++ CompositeGraphicsNode.java        30 Nov 2004 03:23:58 -0000      1.40
  @@ -446,17 +446,18 @@
        * Returns the outline of this node.
        */
       public Shape getOutline() {
  -        if (outline == null) {
  -            outline = new GeneralPath();
  -            for (int i = 0; i < count; i++) {
  -                Shape childOutline = children[i].getOutline();
  -                if (childOutline != null) {
  -                    AffineTransform tr = children[i].getTransform();
  -                    if (tr != null) {
  -                        
((GeneralPath)outline).append(tr.createTransformedShape(childOutline), false);
  -                    } else {
  -                        ((GeneralPath)outline).append(childOutline, false);
  -                    }
  +        if (outline != null) 
  +            return outline;
  +
  +        outline = new GeneralPath();
  +        for (int i = 0; i < count; i++) {
  +            Shape childOutline = children[i].getOutline();
  +            if (childOutline != null) {
  +                AffineTransform tr = children[i].getTransform();
  +                if (tr != null) {
  +                    
((GeneralPath)outline).append(tr.createTransformedShape(childOutline), false);
  +                } else {
  +                    ((GeneralPath)outline).append(childOutline, false);
                   }
               }
           }
  
  
  
  1.30      +17 -16    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.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- ShapeNode.java    21 Nov 2004 21:20:23 -0000      1.29
  +++ ShapeNode.java    30 Nov 2004 03:23:58 -0000      1.30
  @@ -226,21 +226,22 @@
        * Returns the bounds of the area covered by this node's primitive paint.
        */
       public Rectangle2D getPrimitiveBounds() {
  -        if (primitiveBounds == null) {
  -            if (shape == null)
  -                return null;
  +        if (!isVisible)    return null;
  +        if (shape == null) return null;
  +        if (primitiveBounds != null) 
  +            return primitiveBounds;
   
  -            if (shapePainter == null)
  -                primitiveBounds = shape.getBounds2D();
  -            else
  -                primitiveBounds = shapePainter.getPaintedBounds2D();
  -
  -            // Check If we should halt early.
  -            if (HaltingThread.hasBeenHalted()) {
  -                // The Thread has been halted. 
  -                // Invalidate any cached values and proceed.
  -                invalidateGeometryCache();
  -            }
  +        if (shapePainter == null)
  +            primitiveBounds = shape.getBounds2D();
  +        else
  +            primitiveBounds = shapePainter.getPaintedBounds2D();
  +        
  +        // Check If we should halt early.
  +        if (HaltingThread.hasBeenHalted()) {
  +            // The Thread has been halted. 
  +            // Invalidate any cached values and proceed (this
  +            // sets primitiveBounds to null).
  +            invalidateGeometryCache();
           }
           return primitiveBounds;
       }
  
  
  
  1.2       +13 -10    xml-batik/sources/org/apache/batik/gvt/flow/LineInfo.java
  
  Index: LineInfo.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/gvt/flow/LineInfo.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LineInfo.java     18 Nov 2004 01:46:59 -0000      1.1
  +++ LineInfo.java     30 Nov 2004 03:23:58 -0000      1.2
  @@ -140,7 +140,6 @@
                   if (delta < 0) break;
                   
                   i++;
  -
                   rangeAdvance += adv;
               }
   
  @@ -334,6 +333,7 @@
           // of glpyhs in each range for use with full justification.
           int []rangeGG = new int[numRanges];
           int []rangeG  = new int[numRanges];
  +        GlyphGroupInfo []rangeLastGGI = new GlyphGroupInfo[numRanges];
           GlyphGroupInfo ggi  = ggis[0];
           int r = ggi.getRange();
           rangeGG[r]++;
  @@ -341,8 +341,10 @@
           for (int i=1; i<size; i++) {
               ggi  = ggis[i];
               r = ggi.getRange();
  -            if (!ggi.getHideLast())
  +            if ((rangeLastGGI[r]==null) || !rangeLastGGI[r].getHideLast())
                   rangeGG[r]++;
  +            rangeLastGGI[r] = ggi;
  +
               rangeG [r] += ggi.getGlyphCount();
   
               GlyphGroupInfo pggi = ggis[i-1];
  @@ -355,7 +357,7 @@
           int currRange = -1;
           double         locX=0, range=0, rAdv=0;
           r=-1;
  -        ggi = ggis[0];
  +        ggi = null;
           for (int i=0; i<size; i++) {
               GlyphGroupInfo pggi = ggi;
               int prevRange = currRange;
  @@ -388,10 +390,10 @@
                   case BlockInfo.ALIGN_MIDDLE: locX += (range-rAdv)/2; break;
                   case BlockInfo.ALIGN_END:    locX += (range-rAdv);   break;
                   }
  -            } else if (pggi.getHideLast()) {
  +            } else if ((pggi!= null) && pggi.getHideLast()) {
                   // Hide last glyph from prev glyph group (soft hyphen etc).
  -                gv.setGlyphVisible(pggi.getEnd(), false);
  -            }
  +                gv.setGlyphVisible(pggi.getEnd(), false); 
  +           }
   
               int        start  = ggi.getStart();
               int        end    = ggi.getEnd();
  @@ -413,9 +415,10 @@
                   p2d = np2d;
                   advAdj -= gAdv;
               }
  -            locX += ggi.getAdvance()-advAdj+ggAdv;
  -            prevRange = currRange;
  -            pggi = ggi;
  +            if (ggi.getHideLast()) 
  +                locX += ggi.getAdvance()-advAdj;
  +            else
  +                locX += ggi.getAdvance()-advAdj+ggAdv;
           }
       }
   
  
  
  
  1.47      +2 -2      
xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java
  
  Index: JGVTComponent.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- JGVTComponent.java        20 Nov 2004 19:27:10 -0000      1.46
  +++ JGVTComponent.java        30 Nov 2004 03:23:58 -0000      1.47
  @@ -670,7 +670,7 @@
        */
       protected boolean computeRenderingTransform() {
           initialTransform = new AffineTransform();
  -        if (initialTransform != renderingTransform) {
  +        if (!initialTransform.equals(renderingTransform)) {
               setRenderingTransform(initialTransform, false);
               return true;
           }
  
  
  
  1.4       +227 -205  
xml-batik/test-references/samples/tests/spec/scripting/text_content.png
  
        <<Binary file>>
  
  
  1.3       +39 -44    
xml-batik/test-references/samples/tests/spec/scripting/zeroSize.png
  
        <<Binary file>>
  
  
  1.1                  
xml-batik/test-references/samples/tests/spec/scripting/bbox.png
  
        <<Binary file>>
  
  
  1.121     +2 -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.120
  retrieving revision 1.121
  diff -u -r1.120 -r1.121
  --- samplesRendering.xml      21 Nov 2004 21:20:23 -0000      1.120
  +++ samplesRendering.xml      30 Nov 2004 03:23:58 -0000      1.121
  @@ -347,6 +347,7 @@
   
       <testGroup id="tests.spec.scripting">
           <test id="samples/tests/spec/scripting/add.svg" />
  +        <test id="samples/tests/spec/scripting/bbox.svg" />
           <test id="samples/tests/spec/scripting/circle.svg" />
           <test id="samples/tests/spec/scripting/display.svg" />
           <test id="samples/tests/spec/scripting/ellipse.svg" />
  
  
  

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

Reply via email to