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 2003/08/20 13:31:45 UTC

cvs commit: xml-batik/sources/org/apache/batik/dom/svg SVGOMPoint.java SVGTextContentSupport.java

deweese     2003/08/20 04:31:45

  Modified:    samples/tests/spec/scripting/textcontent numberOfChars.svg
               sources/org/apache/batik/bridge SVGTextElementBridge.java
               sources/org/apache/batik/dom/svg SVGOMPoint.java
                        SVGTextContentSupport.java
  Log:
  1) Fixed a bug with getExtentOfChar().  It used to return the bounds in
     the coodinate system of the SVG element (I don't know why...)
  2) The SVGPoint returned by getStart/EndPositionOfChar now supports
     'matrixTransform'.
  
  Revision  Changes    Path
  1.3       +46 -16    xml-batik/samples/tests/spec/scripting/textcontent/numberOfChars.svg
  
  Index: numberOfChars.svg
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/tests/spec/scripting/textcontent/numberOfChars.svg,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- numberOfChars.svg	8 Aug 2003 11:39:35 -0000	1.2
  +++ numberOfChars.svg	20 Aug 2003 11:31:45 -0000	1.3
  @@ -172,22 +172,42 @@
   
           function showCharactersBBox(elt, index)
           {
  -                var doc = elt.getOwnerDocument();
  -
  -                var group = doc.getElementById('bboxGroup');
  -
  -                var r = doc.createElementNS("http://www.w3.org/2000/svg","rect");
  +          var doc = elt.getOwnerDocument();
   
  -                var box = elt.getExtentOfChar(index);
  +          var group = doc.getElementById('bboxGroup');
   
  -                r.setAttribute("x",box.getX());
  -                r.setAttribute("y",box.getY());
  -                r.setAttribute("width",box.getWidth());
  -                r.setAttribute("height",box.getHeight());
  -                r.setAttributeNS(null,"stroke","red");
  -                
  -                group.appendChild(r);
  -                        
  +          var box = elt.getExtentOfChar(index);
  +          var mat = elt.getTransformToElement(group);
  +          var root = doc.getRootElement();
  +          var pt0  = root.createSVGPoint();
  +          pt0.x = box.getX();
  +          pt0.y = box.getY();
  +          pt0 = pt0.matrixTransform(mat);
  +
  +          var pt1  = root.createSVGPoint();
  +          pt1.x = box.getX()+box.getWidth();
  +          pt1.y = box.getY();
  +          pt1 = pt1.matrixTransform(mat);
  +
  +          var pt2  = root.createSVGPoint();
  +          pt2.x = box.getX()+box.getWidth();
  +          pt2.y = box.getY()+box.getHeight();
  +          pt2 = pt2.matrixTransform(mat);
  +
  +          var pt3  = root.createSVGPoint();
  +          pt3.x = box.getX();
  +          pt3.y = box.getY()+box.getHeight();
  +          pt3 = pt3.matrixTransform(mat);
  +
  +          var p = doc.createElementNS
  +          ("http://www.w3.org/2000/svg","path");
  +          p.setAttribute("d","M" + pt0.x + "," + pt0.y + 
  +                         "L" + pt1.x + "," + pt1.y +
  +                         "L" + pt2.x + "," + pt2.y +
  +                         "L" + pt3.x + "," + pt3.y + "z");
  +          p.setAttributeNS(null,"stroke","red");
  +          group.appendChild(p);
  +          
           }
   
           function showCharactersStartPosition(elt, index)
  @@ -195,6 +215,7 @@
                   var doc = elt.getOwnerDocument();
   
                   var group = doc.getElementById('bboxGroup');
  +                var root = doc.getRootElement();
   
                   //while (group.hasChildNodes() ){
                   //   group.removeChild(group.getFirstChild());
  @@ -203,7 +224,8 @@
                   var u = doc.createElementNS("http://www.w3.org/2000/svg","use");
   
                   var point = elt.getStartPositionOfChar(index);
  -
  +                var mat = elt.getTransformToElement(group);
  +                point = point.matrixTransform(mat);
                   u.setAttributeNS(null,"transform","translate("+point.getX()+","+point.getY()+")");
                   u.setAttributeNS("http://www.w3.org/1999/xlink","href","#arrow");
                   u.setAttributeNS(null,"stroke","green");
  @@ -226,9 +248,13 @@
                   var group = doc.getElementById('bboxGroup');
   
                   var u = doc.createElementNS("http://www.w3.org/2000/svg","use");
  +                var mat = elt.getTransformToElement(group);
  +                var root = doc.getRootElement();
   
                   var point1 = elt.getStartPositionOfChar(index);
  +                point1 = point1.matrixTransform(mat);
                   var point2 = elt.getEndPositionOfChar(index);
  +                point2 = point2.matrixTransform(mat);
   
                   x = ( point1.getX() + point2.getX() )/2;
                   y = ( point1.getY() + point2.getY() )/2;
  @@ -253,6 +279,8 @@
                   var u = doc.createElementNS("http://www.w3.org/2000/svg","use");
   
                   var point = elt.getEndPositionOfChar(index);
  +                var mat = elt.getTransformToElement(group);
  +                point = point.matrixTransform(mat);
   
                   u.setAttributeNS(null,"transform","translate("+point.getX()+","+point.getY()+")");
                   u.setAttributeNS("http://www.w3.org/1999/xlink","href","#arrow");
  @@ -272,6 +300,8 @@
                   }
                   
                   var point = elt.getStartPositionOfChar(0);
  +                var mat = elt.getTransformToElement(group);
  +                point = point.matrixTransform(mat);
                   var length = elt.getSubStringLength(0,index+1);
   
                   var text = doc.getElementById("extraInfo");
  
  
  
  1.86      +28 -39    xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java
  
  Index: SVGTextElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java,v
  retrieving revision 1.85
  retrieving revision 1.86
  diff -u -r1.85 -r1.86
  --- SVGTextElementBridge.java	9 Aug 2003 16:58:37 -0000	1.85
  +++ SVGTextElementBridge.java	20 Aug 2003 11:31:45 -0000	1.86
  @@ -2334,9 +2334,8 @@
               }
   
               //get the transform for the node
  -            AffineTransform at = getCTM();
  -
  -            b = at.createTransformedShape(b);
  +            // AffineTransform at = getCTM();
  +            // b = at.createTransformedShape(b);
               
               //return the bounding box of the outline
               return b.getBounds2D();
  @@ -2381,33 +2380,28 @@
   
           Point2D b = it.getGlyphPosition(info.glyphIndexStart);
   
  -        Point2D result = new Point2D.Float();
  +        Point2D.Float result = new Point2D.Float();
               
  -        AffineTransform glyphTransform = it.getGlyphTransform(info.glyphIndexStart);
  +        AffineTransform glyphTransform;
  +        glyphTransform = it.getGlyphTransform(info.glyphIndexStart);
   
  -        double x = 0,y = 0;
  +        float x = 0,y = 0;
   
           //glyph are defined starting at position (0,0)
           if ( glyphTransform != null ){
               
               //apply the glyph transformation to the start point
               glyphTransform.transform(new Point2D.Double(x,y),result);
  -            x = result.getX();
  -            y = result.getY();
  -            
  +            x = result.x;
  +            y = result.y;
           }
  -        
  -        //apply the glyph translation to the start point
  -        AffineTransform af = AffineTransform.getTranslateInstance(b.getX(), b.getY());
   
  -        af.transform(new Point2D.Double(x,y),result);                
  -        
  -        //apply the node transformation to the start point
  -        AffineTransform at = new AffineTransform(getCTM());
  -        Point2D startPoint = new Point2D.Float();
  -        at.transform(result,startPoint);
  +        x += b.getX();
  +        y += b.getY();
           
  -        return startPoint;
  +        result.x = x;
  +        result.y = y;
  +        return result;
       }
   
       /**
  @@ -2443,35 +2437,30 @@
           
           Point2D b = it.getGlyphPosition(info.glyphIndexEnd);
           
  -        Point2D result = new Point2D.Float();
  +        Point2D.Float result = new Point2D.Float();
           
  -        AffineTransform glyphTransform = it.getGlyphTransform(info.glyphIndexEnd);
  +        AffineTransform glyphTransform;
  +        glyphTransform = it.getGlyphTransform(info.glyphIndexEnd);
           
           GVTGlyphMetrics metrics = it.getGlyphMetrics(info.glyphIndexEnd);
           
  -        double x = 0,y = 0;
  +        float x = 0,y = 0;
               
           x = metrics.getHorizontalAdvance();
               
           if ( glyphTransform != null ){
                   
  -            glyphTransform.transform(new Point2D.Double(x,y),result);
  -            x = result.getX();
  -            y = result.getY();
  -            
  -        }
  -        
  -        AffineTransform af = AffineTransform.getTranslateInstance(b.getX(), b.getY());
  -        
  -        af.transform(new Point2D.Double(x,y),result);                
  -        
  -        AffineTransform at = new AffineTransform(getCTM());
  -        Point2D endPoint = new Point2D.Float();
  -        at.transform(result,endPoint);
  -        
  -        return endPoint;
  -        
  +            glyphTransform.transform(new Point2D.Float(x,y),result);
  +            x = result.x;
  +            y = result.y;
  +        }
  +        x += b.getX();
  +        y += b.getY();
  +        result.x = x;
  +        result.y = y;
  +        return result;
       }
  +
       /**
        * Implementation of {@link
        * org.w3c.dom.svg.SVGTextContentElement#getRotationOfChar(int charnum)}.
  
  
  
  1.4       +3 -3      xml-batik/sources/org/apache/batik/dom/svg/SVGOMPoint.java
  
  Index: SVGOMPoint.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMPoint.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SVGOMPoint.java	8 Aug 2003 11:39:00 -0000	1.3
  +++ SVGOMPoint.java	20 Aug 2003 11:31:45 -0000	1.4
  @@ -75,8 +75,8 @@
       public void  setY( float y ) throws DOMException { this.y = y; }
   
       public SVGPoint matrixTransform ( SVGMatrix matrix ) {
  -        float newX = matrix.getA()*x + matrix.getC()*y + matrix.getE();
  -        float newY = matrix.getB()*x + matrix.getD()*y + matrix.getF();
  +        float newX = matrix.getA()*getX() + matrix.getC()*getY() + matrix.getE();
  +        float newY = matrix.getB()*getX() + matrix.getD()*getY() + matrix.getF();
           return new SVGOMPoint(newX, newY);
       }
   }
  
  
  
  1.4       +21 -31    xml-batik/sources/org/apache/batik/dom/svg/SVGTextContentSupport.java
  
  Index: SVGTextContentSupport.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGTextContentSupport.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SVGTextContentSupport.java	8 Aug 2003 11:39:00 -0000	1.3
  +++ SVGTextContentSupport.java	20 Aug 2003 11:31:45 -0000	1.4
  @@ -147,27 +147,13 @@
           
           final SVGTextContent context = (SVGTextContent)svgelt.getSVGContext();
   
  -        return new SVGPoint(){
  +        return new SVGTextPoint(svgelt){
                   public float getX(){
                       return (float)context.getStartPositionOfChar(charnum).getX();
                   }
                   public float getY(){
                       return (float)context.getStartPositionOfChar(charnum).getY();
                   }
  -                public void setX(float x) throws DOMException {
  -                    throw svgelt.createDOMException
  -                        (DOMException.NO_MODIFICATION_ALLOWED_ERR,
  -                         "readonly.point", null);
  -                }
  -                public void setY(float y) throws DOMException {
  -                    throw svgelt.createDOMException
  -                        (DOMException.NO_MODIFICATION_ALLOWED_ERR,
  -                         "readonly.point", null);
  -                }
  -                public SVGPoint matrixTransform(SVGMatrix matrix) {
  -                    throw new RuntimeException("!!! TODO: matrixTransform()");
  -                }
  -
               };
   
       }
  @@ -189,27 +175,13 @@
           
           final SVGTextContent context = (SVGTextContent)svgelt.getSVGContext();
   
  -        return new SVGPoint(){
  +        return new SVGTextPoint(svgelt){
                   public float getX(){
                       return (float)context.getEndPositionOfChar(charnum).getX();
                   }
                   public float getY(){
                       return (float)context.getEndPositionOfChar(charnum).getY();
                   }
  -                public void setX(float x) throws DOMException {
  -                    throw svgelt.createDOMException
  -                        (DOMException.NO_MODIFICATION_ALLOWED_ERR,
  -                         "readonly.point", null);
  -                }
  -                public void setY(float y) throws DOMException {
  -                    throw svgelt.createDOMException
  -                        (DOMException.NO_MODIFICATION_ALLOWED_ERR,
  -                         "readonly.point", null);
  -                }
  -                public SVGPoint matrixTransform(SVGMatrix matrix) {
  -                    throw new RuntimeException("!!! TODO: matrixTransform()");
  -                }
  -
               };
   
       }
  @@ -298,4 +270,22 @@
           
           return context.getCharNumAtPosition(x,y);
       }
  +
  +    public static class SVGTextPoint extends SVGOMPoint {
  +        SVGOMElement svgelt;
  +        SVGTextPoint(SVGOMElement elem) {
  +            svgelt = elem;
  +        }
  +        public void setX(float x) throws DOMException {
  +            throw svgelt.createDOMException
  +                (DOMException.NO_MODIFICATION_ALLOWED_ERR,
  +                 "readonly.point", null);
  +        }
  +        public void setY(float y) throws DOMException {
  +            throw svgelt.createDOMException
  +                (DOMException.NO_MODIFICATION_ALLOWED_ERR,
  +                 "readonly.point", null);
  +        }
  +    }
  +
   }
  
  
  

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