tkormann 01/12/10 06:20:12 Modified: sources/org/apache/batik/bridge SVGClipPathElementBridge.java sources/org/apache/batik/gvt AbstractGraphicsNode.java GraphicsNode.java sources/org/apache/batik/gvt/text GlyphLayout.java test-resources/org/apache/batik/test samplesRendering.xml Log: - fix bug in GlyphLayout (combining x and dx didn't work) - fix bug in clipPath (transform attribute is taken into account) - 2 new tests added for GlyphLayout (including regard) - test for clipPath is comming Revision Changes Path 1.13 +3 -2 xml-batik/sources/org/apache/batik/bridge/SVGClipPathElementBridge.java Index: SVGClipPathElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGClipPathElementBridge.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- SVGClipPathElementBridge.java 2001/09/18 21:18:59 1.12 +++ SVGClipPathElementBridge.java 2001/12/10 14:20:11 1.13 @@ -27,7 +27,7 @@ * Bridge class for the <clipPath> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGClipPathElementBridge.java,v 1.12 2001/09/18 21:18:59 deweese Exp $ + * @version $Id: SVGClipPathElementBridge.java,v 1.13 2001/12/10 14:20:11 tkormann Exp $ */ public class SVGClipPathElementBridge extends AbstractSVGBridge implements ClipBridge { @@ -114,7 +114,8 @@ // compute the outline of the current clipPath's child int wr = CSSUtilities.convertClipRule(child); - GeneralPath path = new GeneralPath(clipNode.getOutline()); + GeneralPath path = + new GeneralPath(clipNode.getTransformedOutline()); path.setWindingRule(wr); Shape outline = Tx.createTransformedShape(path); 1.27 +28 -17 xml-batik/sources/org/apache/batik/gvt/AbstractGraphicsNode.java Index: AbstractGraphicsNode.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/AbstractGraphicsNode.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- AbstractGraphicsNode.java 2001/09/18 21:18:59 1.26 +++ AbstractGraphicsNode.java 2001/12/10 14:20:11 1.27 @@ -51,7 +51,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> * @author <a href="mailto:[EMAIL PROTECTED]">Emmanuel Tissandier</a> * @author <a href="mailto:[EMAIL PROTECTED]">Thomas DeWeese</a> - * @version $Id: AbstractGraphicsNode.java,v 1.26 2001/09/18 21:18:59 deweese Exp $ + * @version $Id: AbstractGraphicsNode.java,v 1.27 2001/12/10 14:20:11 tkormann Exp $ */ public abstract class AbstractGraphicsNode implements GraphicsNode { @@ -241,7 +241,7 @@ * * @param key the key of the hint to be set * @param value the value indicating preferences for the specified - * hint category. + * hint category. */ public void setRenderingHint(RenderingHints.Key key, Object value) { if (this.hints == null) { @@ -479,7 +479,7 @@ /** * Returns true of an offscreen buffer is needed to render this node, false - * otherwise. + * otherwise. */ protected boolean isOffscreenBufferNeeded() { return ((filter != null) || @@ -555,7 +555,7 @@ * Adds the specified graphics node mouse listener to receive graphics node * mouse events from this node. * - * @param l the graphics node mouse listener to add + * @param l the graphics node mouse listener to add */ public void addGraphicsNodeMouseListener(GraphicsNodeMouseListener l) { if (listeners == null) { @@ -568,7 +568,7 @@ * Removes the specified graphics node mouse listener so that it no longer * receives graphics node mouse events from this node. * - * @param l the graphics node mouse listener to remove + * @param l the graphics node mouse listener to remove */ public void removeGraphicsNodeMouseListener(GraphicsNodeMouseListener l) { if (listeners != null) { @@ -580,7 +580,7 @@ * Adds the specified graphics node key listener to receive graphics node * key events from this node. * - * @param l the graphics node key listener to add + * @param l the graphics node key listener to add */ public void addGraphicsNodeKeyListener(GraphicsNodeKeyListener l) { if (listeners == null) { @@ -593,7 +593,7 @@ * Removes the specified graphics node key listener so that it no longer * receives graphics node key events from this node. * - * @param l the graphics node key listener to remove + * @param l the graphics node key listener to remove */ public void removeGraphicsNodeKeyListener(GraphicsNodeKeyListener l) { if (listeners != null) { @@ -709,7 +709,7 @@ * Returns an array of listeners that were added to this node and of the * specified type. * - * @param listenerType the type of the listeners to return + * @param listenerType the type of the listeners to return */ public EventListener [] getListeners(Class listenerType) { return listeners.getListeners(listenerType); @@ -738,7 +738,7 @@ /** * Returns the root of the GVT tree or null if the node is not part of a GVT - * tree. + * tree. */ public RootGraphicsNode getRoot() { return root; @@ -839,27 +839,27 @@ // filter. Rectangle2D tBounds = null; if (filter == null) { - // Use txf, not t + // Use txf, not t tBounds = getTransformedPrimitiveBounds(txf); } else { tBounds = t.createTransformedShape - (filter.getBounds2D()).getBounds2D(); + (filter.getBounds2D()).getBounds2D(); } // Factor in the clipping area, if any if (tBounds != null) { if (clip != null) { tBounds.intersect - (tBounds, - t.createTransformedShape(clip.getClipPath()).getBounds2D(), - tBounds); + (tBounds, + t.createTransformedShape(clip.getClipPath()).getBounds2D(), + tBounds); } // Factor in the mask, if any if(mask != null) { tBounds.intersect - (tBounds, - t.createTransformedShape(mask.getBounds2D()).getBounds2D(), - tBounds); + (tBounds, + t.createTransformedShape(mask.getBounds2D()).getBounds2D(), + tBounds); } } @@ -924,6 +924,17 @@ */ public boolean intersects(Rectangle2D r) { return getBounds().intersects(r); + } + + /** + * Returns the transformed outline of this node. + */ + public Shape getTransformedOutline() { + if (transform != null) { + return transform.createTransformedShape(getOutline()); + } else { + return getOutline(); + } } /** 1.29 +14 -8 xml-batik/sources/org/apache/batik/gvt/GraphicsNode.java Index: GraphicsNode.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/GraphicsNode.java,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- GraphicsNode.java 2001/09/18 21:18:59 1.28 +++ GraphicsNode.java 2001/12/10 14:20:12 1.29 @@ -34,7 +34,7 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> * @author <a href="mailto:[EMAIL PROTECTED]">Emmanuel Tissandier</a> - * @version $Id: GraphicsNode.java,v 1.28 2001/09/18 21:18:59 deweese Exp $ + * @version $Id: GraphicsNode.java,v 1.29 2001/12/10 14:20:12 tkormann Exp $ */ public interface GraphicsNode { @@ -112,7 +112,7 @@ * * @param key the key of the hint to be set * @param value the value indicating preferences for the specified - * hint category. + * hint category. */ void setRenderingHint(RenderingHints.Key key, Object value); @@ -199,7 +199,7 @@ * Adds the specified graphics node mouse listener to receive graphics node * mouse events from this node. * - * @param l the graphics node mouse listener to add + * @param l the graphics node mouse listener to add */ void addGraphicsNodeMouseListener(GraphicsNodeMouseListener l); @@ -207,7 +207,7 @@ * Removes the specified graphics node mouse listener so that it no longer * receives graphics node mouse events from this node. * - * @param l the graphics node mouse listener to remove + * @param l the graphics node mouse listener to remove */ void removeGraphicsNodeMouseListener(GraphicsNodeMouseListener l); @@ -215,7 +215,7 @@ * Adds the specified graphics node key listener to receive graphics node * key events from this node. * - * @param l the graphics node key listener to add + * @param l the graphics node key listener to add */ void addGraphicsNodeKeyListener(GraphicsNodeKeyListener l); @@ -223,7 +223,7 @@ * Removes the specified graphics node key listener so that it no longer * receives graphics node key events from this node. * - * @param l the graphics node key listener to remove + * @param l the graphics node key listener to remove */ void removeGraphicsNodeKeyListener(GraphicsNodeKeyListener l); @@ -257,7 +257,7 @@ * Returns an array of listeners that were added to this node and of the * specified type. * - * @param listenerType the type of the listeners to return + * @param listenerType the type of the listeners to return */ EventListener [] getListeners(Class listenerType); @@ -272,7 +272,7 @@ /** * Returns the root of the GVT tree or null if the node is not part of a GVT - * tree. + * tree. */ RootGraphicsNode getRoot(); @@ -356,4 +356,10 @@ * Returns the outline of this node. */ Shape getOutline(); + + /** + * Returns the transformed outline of this node. + */ + Shape getTransformedOutline(); + } 1.30 +47 -45 xml-batik/sources/org/apache/batik/gvt/text/GlyphLayout.java Index: GlyphLayout.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/GlyphLayout.java,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- GlyphLayout.java 2001/11/29 23:11:02 1.29 +++ GlyphLayout.java 2001/12/10 14:20:12 1.30 @@ -42,7 +42,7 @@ * @see org.apache.batik.gvt.text.TextSpanLayout * * @author <a href="[EMAIL PROTECTED]>Bill Haneman</a> - * @version $Id: GlyphLayout.java,v 1.29 2001/11/29 23:11:02 deweese Exp $ + * @version $Id: GlyphLayout.java,v 1.30 2001/12/10 14:20:12 tkormann Exp $ */ public class GlyphLayout implements TextSpanLayout { @@ -108,7 +108,7 @@ * @param offset The offset position of this text layout * @param frc the FontRenderContext to use for generating glyphs. */ - public GlyphLayout(AttributedCharacterIterator aci, + public GlyphLayout(AttributedCharacterIterator aci, int [] charMap, Point2D offset, FontRenderContext frc) { @@ -122,7 +122,7 @@ this.metrics = font.getLineMetrics (aci, aci.getBeginIndex(), aci.getEndIndex(), frc); - + // create the glyph vector this.gv = null; this.aci.first(); @@ -279,7 +279,7 @@ int count = getCharacterCount(i, i); for (int n=0; n<count; n++) { int glyphCharIndex = charMap[j++]; - if (charIndex == glyphCharIndex) + if (charIndex == glyphCharIndex) return i; if (j >= charMap.length) return -1; @@ -322,7 +322,7 @@ for (int i = 0; i < numGlyphs; i++) { char ch = aci.setIndex(currentChar); int glyphCharIndex = charMap[currentChar-start]; - if ((glyphCharIndex >= beginCharIndex) && + if ((glyphCharIndex >= beginCharIndex) && (glyphCharIndex <= endCharIndex)) { Shape gbounds = gv.getGlyphLogicalBounds(i); if (gbounds != null) { @@ -462,7 +462,7 @@ } // System.out.println("Sorted"); - + Point2D.Float pt0 = pts[0]; Point2D.Float pt1 = pts[numPts-1]; Point2D.Float dxdy = new Point2D.Float(pt1.x-pt0.x, pt1.y-pt0.y); @@ -471,7 +471,7 @@ Point2D.Float [] topList = new Point2D.Float[numPts]; Point2D.Float [] botList = new Point2D.Float[numPts]; botList[0] = topList[0] = pts[0]; - int nTopPts=1; + int nTopPts=1; int nBotPts=1; for (int i=1; i<numPts-1; i++) { Point2D.Float pt = pts[i]; @@ -530,7 +530,7 @@ float dy = pt1.y-pt0.y; float c0 = dy*pt0.x-dx*pt0.y; soln = dx*pt.y-dy*pt.x+c0; - if (soln > eps) + if (soln > eps) // Left turn add and we are done.. break; if (soln > -eps) { @@ -549,7 +549,7 @@ float dy = pt1.y-pt0.y; float c0 = dy*pt0.x-dx*pt0.y; soln = dx*pt.y-dy*pt.x+c0; - if (soln < -eps) + if (soln < -eps) // Right turn done... break; if (soln < eps) { @@ -575,7 +575,7 @@ // System.out.println("CHull has " + i + " pts"); return i; } - + public static void addPtsToPath(GeneralPath shape, Point2D.Float [] topPts, Point2D.Float [] botPts, @@ -628,7 +628,7 @@ delta = boxes[6].y-boxes[4].y; dist += delta*delta; sz += (float)Math.sqrt(dist); - + delta = ((boxes[0].x+boxes[1].x+boxes[2].x+boxes[3].x)- (boxes[4].x+boxes[5].x+boxes[6].x+boxes[7].x))/4; dist = delta*delta; @@ -659,7 +659,7 @@ // Merge all previous areas mergeAreas(shape, areas, nAreas); nAreas = 0; // Start fresh... - + // Then just add box (add the previous char box if first pts) if (i==2) { gp.moveTo(boxes[0].x, boxes[0].y); @@ -682,7 +682,7 @@ mergeAreas(shape, areas, nAreas); } - public static void mergeAreas(GeneralPath shape, + public static void mergeAreas(GeneralPath shape, Area []shapes, int nShapes) { // Merge areas hierarchically, this means that while there are // the same number of Area.add calls (n-1) the great majority @@ -871,12 +871,12 @@ protected GVTFont getFont(AttributedCharacterIterator aci) { aci.first(); GVTFont gvtFont = (GVTFont)aci.getAttributes().get - (GVTAttributedCharacterIterator.TextAttribute.GVT_FONT); - if (gvtFont != null) + (GVTAttributedCharacterIterator.TextAttribute.GVT_FONT); + if (gvtFont != null) return gvtFont; - // shouldn't get here - return new AWTGVTFont(aci.getAttributes()); + // shouldn't get here + return new AWTGVTFont(aci.getAttributes()); } /** @@ -890,7 +890,7 @@ aci.first(); textPath = (TextPath) aci.getAttribute - (GVTAttributedCharacterIterator.TextAttribute.TEXTPATH); + (GVTAttributedCharacterIterator.TextAttribute.TEXTPATH); // if doesn't have an attached text path, just return if (textPath == null) { @@ -969,15 +969,15 @@ Point2D nextGlyphPosition = gv.getGlyphPosition(i+1); if (horizontal) { - glyphAdvance = (float)(nextGlyphPosition.getX() - - currentGlyphPosition.getX()); - nextGlyphOffset = (float)(nextGlyphPosition.getY() - - currentGlyphPosition.getY()); + glyphAdvance = (float)(nextGlyphPosition.getX() - + currentGlyphPosition.getX()); + nextGlyphOffset = (float)(nextGlyphPosition.getY() - + currentGlyphPosition.getY()); } else { - glyphAdvance = (float)(nextGlyphPosition.getY() - - currentGlyphPosition.getY()); - nextGlyphOffset = (float)(nextGlyphPosition.getX() - - currentGlyphPosition.getX()); + glyphAdvance = (float)(nextGlyphPosition.getY() - + currentGlyphPosition.getY()); + nextGlyphOffset = (float)(nextGlyphPosition.getX() - + currentGlyphPosition.getX()); } } else { // last glyph, use the glyph metrics @@ -992,8 +992,8 @@ glyphAdvance = gm.getVerticalAdvance(); } } else { - if ((glyphOrientationAngle == 0) || - (glyphOrientationAngle == 180)) { + if ((glyphOrientationAngle == 0) || + (glyphOrientationAngle == 180)) { glyphAdvance = gm.getVerticalAdvance(); } else { // 90 || 270 glyphAdvance = gm.getHorizontalAdvance(); @@ -1081,8 +1081,8 @@ currentPosition += glyphAdvance; glyphOffset += nextGlyphOffset; currentChar += gv.getCharacterCount(i,i); - ch = aci.setIndex(aci.getBeginIndex() + i + - gv.getCharacterCount(i,i)); + ch = aci.setIndex(aci.getBeginIndex() + i + + gv.getCharacterCount(i,i)); } // store the position where a following glyph should be drawn, @@ -1092,12 +1092,12 @@ Point2D lastGlyphPos = gv.getGlyphPosition(lastGlyphDrawn); if (horizontal) { textPathAdvance = new Point2D.Double - (lastGlyphPos.getX()+lastGlyphAdvance, - lastGlyphPos.getY()); + (lastGlyphPos.getX()+lastGlyphAdvance, + lastGlyphPos.getY()); } else { textPathAdvance = new Point2D.Double - (lastGlyphPos.getX(), - lastGlyphPos.getY()+lastGlyphAdvance); + (lastGlyphPos.getX(), + lastGlyphPos.getY()+lastGlyphAdvance); } } else { textPathAdvance = new Point2D.Double(0,0); @@ -1152,7 +1152,7 @@ // transform the glyph position Point2D glyphPos = gv.getGlyphPosition(i); AffineTransform t = AffineTransform.getTranslateInstance - (startPos.getX(), startPos.getY()); + (startPos.getX(), startPos.getY()); t.scale(xscale,yscale); t.translate(-startPos.getX(), -startPos.getY()); Point2D newGlyphPos = new Point2D.Float(); @@ -1163,11 +1163,11 @@ AffineTransform glyphTransform = gv.getGlyphTransform(i); if (glyphTransform != null) { glyphTransform.preConcatenate - (AffineTransform.getScaleInstance(xscale, yscale)); + (AffineTransform.getScaleInstance(xscale, yscale)); gv.setGlyphTransform(i, glyphTransform); } else { gv.setGlyphTransform - (i, AffineTransform.getScaleInstance(xscale, yscale)); + (i, AffineTransform.getScaleInstance(xscale, yscale)); } } } @@ -1581,7 +1581,7 @@ float oy = 0f; float verticalGlyphRotation = 0f; float glyphRotation = 0f; - + if (ch != CharacterIterator.DONE) { if (vertical) { @@ -1611,11 +1611,11 @@ if (rotation == null || rotation.isNaN()) { glyphRotation = verticalGlyphRotation; } else { - glyphRotation = (rotation.floatValue() + + glyphRotation = (rotation.floatValue() + verticalGlyphRotation); } - if (x!= null && !x.isNaN()) { + if (x != null && !x.isNaN()) { if (i==0) { if (applyOffset) { curr_x_pos = (float) offset.getX(); @@ -1626,7 +1626,8 @@ } else { curr_x_pos = x.floatValue(); } - } else if (dx != null && !dx.isNaN()) { + } + if (dx != null && !dx.isNaN()) { curr_x_pos += dx.floatValue(); } @@ -1641,9 +1642,10 @@ } else { curr_y_pos = y.floatValue(); } - } else if (dy != null && !dy.isNaN()) { + } + if (dy != null && !dy.isNaN()) { curr_y_pos += dy.floatValue(); - } else if (i>0) { + } else if (i > 0) { curr_y_pos += gp[i*2 + 1]-gp[i*2 - 1]; } @@ -1709,7 +1711,7 @@ advanceY = gm.getVerticalAdvance(); } } else { - if ((glyphOrientationAngle == 0) || + if ((glyphOrientationAngle == 0) || (glyphOrientationAngle == 180)) { advanceY = gm.getVerticalAdvance(); } else if (glyphOrientationAngle == 90) { @@ -1736,7 +1738,7 @@ glyphTransform.rotate(glyphRotation); gv.setGlyphTransform(i, glyphTransform); } - + aciIndex += gv.getCharacterCount(i,i); ch = aci.setIndex(aciIndex); i++; 1.57 +3 -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.56 retrieving revision 1.57 diff -u -r1.56 -r1.57 --- samplesRendering.xml 2001/12/06 08:13:47 1.56 +++ samplesRendering.xml 2001/12/10 14:20:12 1.57 @@ -8,7 +8,7 @@ <!-- ========================================================================= --> <!-- @author [EMAIL PROTECTED] --> -<!-- @version $Id: samplesRendering.xml,v 1.56 2001/12/06 08:13:47 vhardy Exp $ --> +<!-- @version $Id: samplesRendering.xml,v 1.57 2001/12/10 14:20:12 tkormann Exp $ --> <!-- ========================================================================= --> <testSuite id="samplesRendering" name="samples and samples/test Rendering" class="org.apache.batik.test.svg.SamplesRenderingTest"> @@ -246,6 +246,8 @@ <test id="samples/tests/spec/text/textStyles.svg" /> <test id="samples/tests/spec/text/verticalText.svg" /> <test id="samples/tests/spec/text/verticalTextOnPath.svg" /> + <test id="samples/tests/spec/text/textPosition.svg" /> + <test id="samples/tests/spec/text/textPosition2.svg" /> </testGroup> </testSuite>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]