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 [EMAIL PROTECTED] * 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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]