tkormann 01/09/13 07:22:45 Modified: sources/org/apache/batik/gvt CompositeShapePainter.java FillShapePainter.java MarkerShapePainter.java ShapePainter.java StrokeShapePainter.java Log: Still some javadoc and source code cleanup. Lazy computation of the CompositeGraphicsNode that is used to display markers. In case of multiple markers (start + middle + end), the CompositeGraphicsNode is built once instead of 3 times. Revision Changes Path 1.7 +26 -17 xml-batik/sources/org/apache/batik/gvt/CompositeShapePainter.java Index: CompositeShapePainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/CompositeShapePainter.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- CompositeShapePainter.java 2001/03/16 18:31:48 1.6 +++ CompositeShapePainter.java 2001/09/13 14:22:45 1.7 @@ -20,39 +20,45 @@ * A shape painter which consists of multiple shape painters. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: CompositeShapePainter.java,v 1.6 2001/03/16 18:31:48 tkormann Exp $ + * @version $Id: CompositeShapePainter.java,v 1.7 2001/09/13 14:22:45 tkormann Exp $ */ public class CompositeShapePainter implements ShapePainter { + /** * The shape associated with this painter */ protected Shape shape; - /** The enclosed <tt>ShapePainter</tt>s of this composite shape painter. */ + /** + * The enclosed <tt>ShapePainter</tt>s of this composite shape painter. + */ protected ShapePainter [] painters; - /** The number of shape painter. */ + + /** + * The number of shape painter. + */ protected int count; /** * Constructs a new empty <tt>CompositeShapePainter</tt>. */ public CompositeShapePainter(Shape shape) { - if(shape == null){ + if (shape == null) { throw new IllegalArgumentException(); } - this.shape = shape; } /** - * Adds the specified shape painter. + * Adds the specified shape painter to the shape painter.. + * * @param shapePainter the shape painter to add */ public void addShapePainter(ShapePainter shapePainter) { if (shapePainter == null) { return; } - if(this.shape != shapePainter.getShape()){ + if (this.shape != shapePainter.getShape()) { shapePainter.setShape(shape); } if (painters == null) { @@ -67,12 +73,11 @@ } /** - * Paints the specified shape using the specified Graphics2D and context. + * Paints the specified shape using the specified Graphics2D. + * * @param g2d the Graphics2D to use - * @param ctx the render context to use */ - public void paint(Graphics2D g2d, - GraphicsNodeRenderContext ctx) { + public void paint(Graphics2D g2d, GraphicsNodeRenderContext ctx) { if (painters != null) { for (int i=0; i < count; ++i) { painters[i].paint(g2d, ctx); @@ -81,7 +86,7 @@ } /** - * Returns the area painted by this painter + * Returns the area painted by this shape painter. */ public Shape getPaintedArea(GraphicsNodeRenderContext rc){ // <!> FIX ME: Use of GeneralPath is a work around Area problems. @@ -98,13 +103,17 @@ return null; } } - + /** - * Sets the Shape this painter is associated with. + * Sets the Shape this shape painter is associated with. + * * @param shape new shape this painter should be associated with. - * should not be null. + * Should not be null. */ public void setShape(Shape shape){ + if (shape == null) { + throw new IllegalArgumentException(); + } if (painters != null) { for (int i=0; i < count; ++i) { painters[i].setShape(shape); @@ -114,9 +123,9 @@ } /** - * Gets the Shape this painter is associated with. + * Gets the Shape this shape painter is associated with. * - * @return shape associated with this Painter. + * @return shape associated with this painter */ public Shape getShape(){ return shape; 1.5 +22 -16 xml-batik/sources/org/apache/batik/gvt/FillShapePainter.java Index: FillShapePainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/FillShapePainter.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- FillShapePainter.java 2001/02/06 01:56:38 1.4 +++ FillShapePainter.java 2001/09/13 14:22:45 1.5 @@ -16,25 +16,32 @@ * A shape painter that can be used to fill a shape. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: FillShapePainter.java,v 1.4 2001/02/06 01:56:38 vhardy Exp $ + * @version $Id: FillShapePainter.java,v 1.5 2001/09/13 14:22:45 tkormann Exp $ */ public class FillShapePainter implements ShapePainter { - /** The Shape to be painted */ + + /** + * The Shape to be painted. + */ protected Shape shape; - /** The paint attribute used to fill the shape. */ + /** + * The paint attribute used to fill the shape. + */ protected Paint paint; /** * Constructs a new <tt>FillShapePainter</tt> that can be used to fill * a <tt>Shape</tt>. * - * @param shape Shape to be painted by this painter. Should not be null + * @param shape Shape to be painted by this painter + * Should not be null. */ public FillShapePainter(Shape shape) { - if(shape == null){ + if (shape == null) { throw new IllegalArgumentException(); } + this.shape = shape; } /** @@ -47,14 +54,11 @@ } /** - * Paints the specified shape using the specified Graphics2D and context. + * Paints the specified shape using the specified Graphics2D. * - * @param shape the shape to paint * @param g2d the Graphics2D to use - * @param ctx the render context to use */ - public void paint(Graphics2D g2d, - GraphicsNodeRenderContext ctx) { + public void paint(Graphics2D g2d, GraphicsNodeRenderContext ctx) { if (paint != null) { g2d.setPaint(paint); g2d.fill(shape); @@ -62,25 +66,27 @@ } /** - * Returns the area painted by this painter for a given input shape - * - * @param shape the shape to paint + * Returns the area painted by this shape painter. */ public Shape getPaintedArea(GraphicsNodeRenderContext rc){ return shape; } /** - * Sets the Shape this painter is associated with. + * Sets the Shape this shape painter is associated with. + * * @param shape new shape this painter should be associated with. - * should not be null. + * Should not be null. */ public void setShape(Shape shape){ + if (shape == null) { + throw new IllegalArgumentException(); + } this.shape = shape; } /** - * Gets the Shape this painter is associated with. + * Gets the Shape this shape painter is associated with. * * @return shape associated with this Painter. */ 1.3 +256 -221 xml-batik/sources/org/apache/batik/gvt/MarkerShapePainter.java Index: MarkerShapePainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/MarkerShapePainter.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- MarkerShapePainter.java 2001/03/05 22:07:01 1.2 +++ MarkerShapePainter.java 2001/09/13 14:22:45 1.3 @@ -10,6 +10,7 @@ import java.awt.Shape; import java.awt.Graphics2D; + import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -22,57 +23,51 @@ * A shape painter that can be used to paint markers on a shape. * * @author <a href="[EMAIL PROTECTED]">Vincent Hardy</a> - * @version $Id: MarkerShapePainter.java,v 1.2 2001/03/05 22:07:01 vhardy Exp $ + * @version $Id: MarkerShapePainter.java,v 1.3 2001/09/13 14:22:45 tkormann Exp $ */ public class MarkerShapePainter implements ShapePainter { - /** The Shape to be painted */ - protected Shape shape; - /** - * Constructs a new <tt>FillShapePainter</tt> that can be used to fill - * a <tt>Shape</tt>. - * - * @param shape Shape to be painted by this painter. Should not be null + /** + * The Shape to be painted. */ - public MarkerShapePainter(Shape shape) { - if(shape == null){ - throw new IllegalArgumentException(); - } - - this.shape = shape; - } + protected Shape shape; /** * Start Marker */ - private Marker startMarker; + protected Marker startMarker; /** - * Start Marker Proxy + * Middle Marker */ - private ProxyGraphicsNode startMarkerProxy; + protected Marker middleMarker; /** - * Middle Marker + * End Marker */ - private Marker middleMarker; + protected Marker endMarker; /** - * Middle Marker Proxy + * Start marker proxy. */ - private ProxyGraphicsNode middleMarkerProxies[]; + private ProxyGraphicsNode startMarkerProxy; /** - * End Marker + * Middle marker proxy. */ - private Marker endMarker; + private ProxyGraphicsNode middleMarkerProxies[]; /** - * End Marker Proxy + * End marker proxy. */ private ProxyGraphicsNode endMarkerProxy; /** + * Contains the various marker proxies. + */ + private CompositeGraphicsNode markerGroup; + + /** * Internal Cache: Primitive bounds */ private Rectangle2D dPrimitiveBounds; @@ -82,71 +77,164 @@ */ private Rectangle2D dGeometryBounds; + /** + * Constructs a new <tt>MarkerShapePainter</tt> that can be used to markers + * on top of a shape. + * + * @param shape Shape to be painted by this painter. + * Should not be null + */ + public MarkerShapePainter(Shape shape) { + if (shape == null) { + throw new IllegalArgumentException(); + } + this.shape = shape; + } + /** - * Contains the various marker proxies + * Paints the specified shape using the specified Graphics2D. + * + * @param shape the shape to paint + * @param g2d the Graphics2D to use */ - private CompositeGraphicsNode markerGroup = new CompositeGraphicsNode(); + public void paint(Graphics2D g2d, GraphicsNodeRenderContext ctx) { + if (markerGroup == null) { + buildMarkerGroup(); + } + if (markerGroup.getChildren().size() > 0) { + markerGroup.paint(g2d, ctx); + } + } - public void setStartMarker(Marker startMarker){ - this.startMarker = startMarker; - this.startMarkerProxy = null; - buildMarkerGroup(); + /** + * Returns the area painted by this shape painter. + */ + public Shape getPaintedArea(GraphicsNodeRenderContext rc){ + if (markerGroup == null) { + buildMarkerGroup(); + } + return markerGroup.getBounds(rc); } - public void setMiddleMarker(Marker middleMarker){ - this.middleMarker = middleMarker; + /** + * Sets the Shape this shape painter is associated with. + * + * @param shape new shape this painter should be associated with. + * Should not be null. + */ + public void setShape(Shape shape){ + if (shape == null) { + throw new IllegalArgumentException(); + } + this.shape = shape; + this.startMarkerProxy = null; this.middleMarkerProxies = null; - buildMarkerGroup(); + this.endMarkerProxy = null; + this.markerGroup = null; } - public void setEndMarker(Marker endMarker){ - this.endMarker = endMarker; - this.endMarkerProxy = null; - buildMarkerGroup(); + /** + * Gets the Shape this shape painter is associated with. + * + * @return shape associated with this painter + */ + public Shape getShape(){ + return shape; } + /** + * Returns the marker that shall be drawn at the first vertex of the given + * shape. + */ public Marker getStartMarker(){ return startMarker; } + /** + * Sets the marker that shall be drawn at the first vertex of the given + * shape. + * + * @param startMarker the start marker + */ + public void setStartMarker(Marker startMarker){ + this.startMarker = startMarker; + this.startMarkerProxy = null; + this.markerGroup = null; + } + + /** + * Returns the marker that shall be drawn at every other vertex (not the + * first or the last one) of the given shape. + */ public Marker getMiddleMarker(){ return middleMarker; } + /** + * Sets the marker that shall be drawn at every other vertex (not the first + * or the last one) of the given shape. + * + * @param middleMarker the middle marker + */ + public void setMiddleMarker(Marker middleMarker){ + this.middleMarker = middleMarker; + this.middleMarkerProxies = null; + this.markerGroup = null; + } + + /** + * Returns the marker that shall be drawn at the last vertex of the given + * shape. + */ public Marker getEndMarker(){ return endMarker; } + /** + * Sets the marker that shall be drawn at the last vertex of the given + * shape. + * + * @param endMarker the end marker + */ + public void setEndMarker(Marker endMarker){ + this.endMarker = endMarker; + this.endMarkerProxy = null; + this.markerGroup = null; + } + + // --------------------------------------------------------------------- + // Internal methods to build GraphicsNode according to the Marker + // --------------------------------------------------------------------- + /** - * Builds a new marker group with the current set of - * markers + * Builds a new marker group with the current set of markers. */ - private void buildMarkerGroup(){ - if(startMarker != null && startMarkerProxy == null){ + protected void buildMarkerGroup(){ + if (startMarker != null && startMarkerProxy == null) { startMarkerProxy = buildStartMarkerProxy(); } - if(middleMarker != null && middleMarkerProxies == null){ + if (middleMarker != null && middleMarkerProxies == null) { middleMarkerProxies = buildMiddleMarkerProxies(); } - if(endMarker != null && endMarkerProxy == null){ + if (endMarker != null && endMarkerProxy == null) { endMarkerProxy = buildEndMarkerProxy(); } CompositeGraphicsNode group = new CompositeGraphicsNode(); List children = group.getChildren(); - if(startMarkerProxy != null){ + if (startMarkerProxy != null) { children.add(startMarkerProxy); } - - if(middleMarkerProxies != null){ + + if (middleMarkerProxies != null) { for(int i=0; i<middleMarkerProxies.length; i++){ children.add(middleMarkerProxies[i]); } } - - if(endMarkerProxy != null){ + + if (endMarkerProxy != null) { children.add(endMarkerProxy); } @@ -154,35 +242,34 @@ } /** - * Builds a proxy <tt>GraphicsNode</tt> for the input - * <tt>Marker</tt> to be drawn at the start position + * Builds a proxy <tt>GraphicsNode</tt> for the input <tt>Marker</tt> to be + * drawn at the start position */ - public ProxyGraphicsNode buildStartMarkerProxy(){ + protected ProxyGraphicsNode buildStartMarkerProxy() { + PathIterator iter = getShape().getPathIterator(null); // Get initial point on the path double coords[] = new double[6]; int segType = 0; - if(iter.isDone()){ + if (iter.isDone()) { return null; } segType = iter.currentSegment(coords); - if(segType != iter.SEG_MOVETO){ + if (segType != iter.SEG_MOVETO) { return null; } iter.next(); - Point2D markerPosition - = new Point2D.Double(coords[0], - coords[1]); + Point2D markerPosition = new Point2D.Double(coords[0], coords[1]); // If the marker's orient property is NaN, // the slope needs to be computed double rotation = startMarker.getOrient(); - if(Double.isNaN(rotation)){ - if(!iter.isDone()){ + if (Double.isNaN(rotation)) { + if (!iter.isDone()) { double next[] = new double[6]; int nextSegType = 0; nextSegType = iter.currentSegment(next); @@ -199,40 +286,39 @@ } // Now, compute the marker's proxy transform - AffineTransform markerTxf = - computeMarkerTransform(startMarker, - markerPosition, - rotation); + AffineTransform markerTxf = computeMarkerTransform(startMarker, + markerPosition, + rotation); - ProxyGraphicsNode gn - = new ProxyGraphicsNode(); + ProxyGraphicsNode gn = new ProxyGraphicsNode(); gn.setSource(startMarker.getMarkerNode()); gn.setTransform(markerTxf); - + return gn; } /** - * Builds a proxy <tt>GraphicsNode</tt> for the input - * <tt>Marker</tt> to be drawn at the end position + * Builds a proxy <tt>GraphicsNode</tt> for the input <tt>Marker</tt> to be + * drawn at the end position. */ - public ProxyGraphicsNode buildEndMarkerProxy(){ + protected ProxyGraphicsNode buildEndMarkerProxy() { + PathIterator iter = getShape().getPathIterator(null); int nPoints = 0; // Get first point, in case the last segment on the // path is a close - if(iter.isDone()){ + if (iter.isDone()) { return null; } - + double coords[] = new double[6]; double moveTo[] = new double[2]; int segType = 0; segType = iter.currentSegment(coords); - if(segType != iter.SEG_MOVETO){ + if (segType != iter.SEG_MOVETO) { return null; } nPoints++; @@ -247,7 +333,8 @@ coords[3], coords[4], coords[5] }, tmp = null; int lastSegType = segType; int lastButOneSegType = 0; - while(!iter.isDone()){ + + while (!iter.isDone()) { tmp = lastButOne; lastButOne = last; last = tmp; @@ -255,10 +342,10 @@ lastSegType = iter.currentSegment(last); - if(lastSegType == PathIterator.SEG_MOVETO){ + if (lastSegType == PathIterator.SEG_MOVETO) { moveTo[0] = last[0]; moveTo[1] = last[1]; - } else if(lastSegType == PathIterator.SEG_CLOSE){ + } else if (lastSegType == PathIterator.SEG_CLOSE) { lastSegType = PathIterator.SEG_LINETO; last[0] = moveTo[0]; last[1] = moveTo[1]; @@ -268,18 +355,17 @@ nPoints++; } - if (nPoints < 2){ + if (nPoints < 2) { return null; } // Turn the last segment into a position - Point2D markerPosition = - getSegmentTerminatingPoint(last, lastSegType); + Point2D markerPosition = getSegmentTerminatingPoint(last, lastSegType); // If the marker's orient property is NaN, // the slope needs to be computed double rotation = endMarker.getOrient(); - if(Double.isNaN(rotation)){ + if (Double.isNaN(rotation)) { rotation = computeRotation(lastButOne, lastButOneSegType, last, lastSegType, @@ -287,13 +373,11 @@ } // Now, compute the marker's proxy transform - AffineTransform markerTxf = - computeMarkerTransform(endMarker, - markerPosition, - rotation); + AffineTransform markerTxf = computeMarkerTransform(endMarker, + markerPosition, + rotation); - ProxyGraphicsNode gn - = new ProxyGraphicsNode(); + ProxyGraphicsNode gn = new ProxyGraphicsNode(); gn.setSource(endMarker.getMarkerNode()); gn.setTransform(markerTxf); @@ -302,31 +386,11 @@ } /** - * Extracts the terminating point, depending on the segment type. + * Builds a proxy <tt>GraphicsNode</tt> for the input <tt>Marker</tt> to be + * drawn at the middle positions */ - private final Point2D getSegmentTerminatingPoint(double coords[], int segType){ - switch(segType){ - case PathIterator.SEG_CUBICTO: - return new Point2D.Double(coords[4], coords[5]); - case PathIterator.SEG_LINETO: - return new Point2D.Double(coords[0], coords[1]); - case PathIterator.SEG_MOVETO: - return new Point2D.Double(coords[0], coords[1]); - case PathIterator.SEG_QUADTO: - return new Point2D.Double(coords[2], coords[3]); - case PathIterator.SEG_CLOSE: - default: - throw new Error(); - // Should never happen: close segments are - // replaced with lineTo - } - } + protected ProxyGraphicsNode[] buildMiddleMarkerProxies() { - /** - * Builds a proxy <tt>GraphicsNode</tt> for the input - * <tt>Marker</tt> to be drawn at the middle positions - */ - public ProxyGraphicsNode[] buildMiddleMarkerProxies(){ PathIterator iter = getShape().getPathIterator(null); double[] prev = new double[6]; @@ -335,33 +399,31 @@ int prevSegType = 0, curSegType = 0, nextSegType = 0; // Get the first three points on the path - if(iter.isDone()){ + if (iter.isDone()) { return null; } prevSegType = iter.currentSegment(prev); - double[] moveTo = new double[2]; - if(prevSegType != PathIterator.SEG_MOVETO){ + if (prevSegType != PathIterator.SEG_MOVETO) { return null; } moveTo[0] = prev[0]; moveTo[1] = prev[1]; - iter.next(); - if(iter.isDone()){ + if (iter.isDone()) { return null; } - + curSegType = iter.currentSegment(cur); - if(curSegType == PathIterator.SEG_MOVETO){ + if (curSegType == PathIterator.SEG_MOVETO) { moveTo[0] = cur[0]; moveTo[1] = cur[1]; - } else if(curSegType == PathIterator.SEG_CLOSE){ + } else if (curSegType == PathIterator.SEG_CLOSE) { curSegType = PathIterator.SEG_LINETO; cur[0] = moveTo[0]; cur[1] = moveTo[1]; @@ -370,18 +432,18 @@ iter.next(); Vector proxies = new Vector(); - while(!iter.isDone()){ + while (!iter.isDone()) { nextSegType = iter.currentSegment(next); - if(nextSegType == PathIterator.SEG_MOVETO){ + if (nextSegType == PathIterator.SEG_MOVETO) { moveTo[0] = next[0]; moveTo[1] = next[1]; - } else if(nextSegType == PathIterator.SEG_CLOSE){ + } else if (nextSegType == PathIterator.SEG_CLOSE) { nextSegType = PathIterator.SEG_LINETO; next[0] = moveTo[0]; next[1] = moveTo[1]; } - + proxies.addElement(createMiddleMarker(prev, prevSegType, cur, curSegType, next, nextSegType)); @@ -396,20 +458,21 @@ iter.next(); } - ProxyGraphicsNode gn[] - = new ProxyGraphicsNode[proxies.size()]; - + ProxyGraphicsNode [] gn = new ProxyGraphicsNode[proxies.size()]; proxies.copyInto(gn); return gn; } + /** + * Creates a ProxyGraphicsNode for a middle marker. + */ private ProxyGraphicsNode createMiddleMarker(double[] prev, - int prevSegType, - double[] cur, - int curSegType, - double[] next, - int nextSegType){ + int prevSegType, + double[] cur, + int curSegType, + double[] next, + int nextSegType){ // Turn the cur segment into a position Point2D markerPosition = getSegmentTerminatingPoint(cur, curSegType); @@ -417,20 +480,18 @@ // If the marker's orient property is NaN, // the slope needs to be computed double rotation = middleMarker.getOrient(); - if(Double.isNaN(rotation)){ + if (Double.isNaN(rotation)) { rotation = computeRotation(prev, prevSegType, cur, curSegType, next, nextSegType); } - + // Now, compute the marker's proxy transform - AffineTransform markerTxf = - computeMarkerTransform(middleMarker, - markerPosition, - rotation); + AffineTransform markerTxf = computeMarkerTransform(middleMarker, + markerPosition, + rotation); - ProxyGraphicsNode gn - = new ProxyGraphicsNode(); + ProxyGraphicsNode gn = new ProxyGraphicsNode(); gn.setSource(middleMarker.getMarkerNode()); gn.setTransform(markerTxf); @@ -438,12 +499,16 @@ return gn; } + /** + * Returns the rotation according to the specified parameters. + */ private double computeRotation(double[] prev, int prevSegType, double[] cur, int curSegType, double[] next, int nextSegType){ + // Compute in slope, i.e., the slope of the segment // going into the current point double[] inSlope = computeInSlope(prev, prevSegType, @@ -454,59 +519,59 @@ double[] outSlope = computeOutSlope(cur, curSegType, next, nextSegType); - if(inSlope == null){ + if (inSlope == null) { inSlope = outSlope; } - if(outSlope == null){ + if (outSlope == null) { outSlope = inSlope; } - if(inSlope == null){ + if (inSlope == null) { return 0; } - double rotationIn = Math.atan2(inSlope[1], inSlope[0])*180./Math.PI; double rotationOut = Math.atan2(outSlope[1], outSlope[0])*180./Math.PI; double rotation = (rotationIn + rotationOut)/2; - + return rotation; } /** - * @return dx/dy for the in slope + * Returns dx/dy for the in slope. */ private double[] computeInSlope(double[] prev, int prevSegType, double[] cur, int curSegType){ + // Compute point into which the slope runs Point2D curEndPoint = getSegmentTerminatingPoint(cur, curSegType); - double dx = 0, dy = 0; + double dx = 0; + double dy = 0; + switch(curSegType){ case PathIterator.SEG_QUADTO: - // If the current segment is a line, quad or cubic curve. - // the slope is about equal to that of the - // line from the last control point and the curEndPoint + // If the current segment is a line, quad or cubic curve. the slope + // is about equal to that of the line from the last control point + // and the curEndPoint dx = curEndPoint.getX() - cur[0]; dy = curEndPoint.getY() - cur[1]; break; case PathIterator.SEG_LINETO: - // - // This is equivalent to a line from the previous - // segment's terminating point and the current end - // point. - Point2D prevEndPoint = getSegmentTerminatingPoint(prev, prevSegType); - + // This is equivalent to a line from the previous segment's + // terminating point and the current end point. + Point2D prevEndPoint = + getSegmentTerminatingPoint(prev, prevSegType); dx = curEndPoint.getX() - prevEndPoint.getX(); dy = curEndPoint.getY() - prevEndPoint.getY(); break; case PathIterator.SEG_CUBICTO: - // If the current segment is a line, quad or cubic curve. - // the slope is about equal to that of the - // line from the last control point and the curEndPoint + // If the current segment is a line, quad or cubic curve. the slope + // is about equal to that of the line from the last control point + // and the curEndPoint dx = curEndPoint.getX() - cur[2]; dy = curEndPoint.getY() - cur[3]; break; @@ -519,7 +584,7 @@ return null; } - if(dx == 0 && dy == 0){ + if (dx == 0 && dy == 0) { return null; } @@ -527,28 +592,28 @@ } /** - * @return dx/dy for the out slope + * Returns dx/dy for the out slope. */ private double[] computeOutSlope(double[] cur, int curSegType, double[] next, int nextSegType){ + Point2D curEndPoint = getSegmentTerminatingPoint(cur, curSegType); double dx = 0, dy = 0; switch(nextSegType){ case PathIterator.SEG_CLOSE: - // Should not happen at this point, because all close - // segments have been replaced by lineTo segments. + // Should not happen at this point, because all close segments have + // been replaced by lineTo segments. break; case PathIterator.SEG_CUBICTO: case PathIterator.SEG_LINETO: case PathIterator.SEG_QUADTO: - // If the next segment is a line, quad or cubic curve. - // the slope is about equal to that of the - // line from curEndPoint and the first control - // point + // If the next segment is a line, quad or cubic curve. the slope is + // about equal to that of the line from curEndPoint and the first + // control point dx = next[0] - curEndPoint.getX(); dy = next[1] - curEndPoint.getY(); break; @@ -558,7 +623,7 @@ return null; } - if(dx == 0 && dy == 0){ + if (dx == 0 && dy == 0) { return null; } @@ -566,14 +631,12 @@ } /** - * Computes the transform for the input marker, so that - * it is positioned at the given position with the specified - * rotation - */ - private AffineTransform - computeMarkerTransform(Marker marker, - Point2D markerPosition, - double rotation){ + * Computes the transform for the input marker, so that it is positioned at + * the given position with the specified rotation + */ + private AffineTransform computeMarkerTransform(Marker marker, + Point2D markerPosition, + double rotation) { Point2D ref = marker.getRef(); /*AffineTransform txf = AffineTransform.getTranslateInstance(markerPosition.getX() @@ -581,62 +644,34 @@ markerPosition.getY() - ref.getY());*/ AffineTransform txf = new AffineTransform(); + + txf.translate(markerPosition.getX() - ref.getX(), + markerPosition.getY() - ref.getY()); - txf.translate(markerPosition.getX() - - ref.getX(), - markerPosition.getY() - - ref.getY()); - - if(!Double.isNaN(rotation)){ - txf.rotate(rotation*Math.PI/180., - ref.getX(), - ref.getY()); + if (!Double.isNaN(rotation)) { + txf.rotate(rotation*Math.PI/180., ref.getX(), ref.getY()); } return txf; } - /** - * Paints the specified shape using the specified Graphics2D and context. - * - * @param shape the shape to paint - * @param g2d the Graphics2D to use - * @param ctx the render context to use - */ - - public void paint(Graphics2D g2d, - GraphicsNodeRenderContext ctx) { - if(markerGroup.getChildren().size() > 0){ - markerGroup.paint(g2d, ctx); - } - } - /** - * Returns the area painted by this painter - */ - public Shape getPaintedArea(GraphicsNodeRenderContext rc){ - return markerGroup.getBounds(rc); - } - - /** - * Sets the Shape this painter is associated with. - * @param shape new shape this painter should be associated with. - * should not be null. - */ - public void setShape(Shape shape){ - this.shape = shape; - this.startMarkerProxy = null; - this.middleMarkerProxies = null; - this.endMarkerProxy = null; - buildMarkerGroup(); - } - - /** - * Gets the Shape this painter is associated with. - * - * @return shape associated with this Painter. + * Extracts the terminating point, depending on the segment type. */ - public Shape getShape(){ - return shape; + protected Point2D getSegmentTerminatingPoint(double coords[], int segType) { + switch(segType){ + case PathIterator.SEG_CUBICTO: + return new Point2D.Double(coords[4], coords[5]); + case PathIterator.SEG_LINETO: + return new Point2D.Double(coords[0], coords[1]); + case PathIterator.SEG_MOVETO: + return new Point2D.Double(coords[0], coords[1]); + case PathIterator.SEG_QUADTO: + return new Point2D.Double(coords[2], coords[3]); + case PathIterator.SEG_CLOSE: + default: + throw new Error(); + // Should never happen: close segments are replaced with lineTo + } } } 1.6 +11 -11 xml-batik/sources/org/apache/batik/gvt/ShapePainter.java Index: ShapePainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/ShapePainter.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ShapePainter.java 2001/02/06 01:56:39 1.5 +++ ShapePainter.java 2001/09/13 14:22:45 1.6 @@ -15,34 +15,34 @@ * Renders the shape of a <tt>ShapeNode</tt>. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: ShapePainter.java,v 1.5 2001/02/06 01:56:39 vhardy Exp $ + * @version $Id: ShapePainter.java,v 1.6 2001/09/13 14:22:45 tkormann Exp $ */ public interface ShapePainter { /** - * Paints the specified shape using the specified Graphics2D and context. + * Paints the specified shape using the specified Graphics2D. + * * @param g2d the Graphics2D to use - * @param ctx the render context to use */ void paint(Graphics2D g2d, GraphicsNodeRenderContext ctx); /** - * Returns the area painted by this painter - * + * Returns the area painted by this shape painter. */ Shape getPaintedArea(GraphicsNodeRenderContext rc); /** - * Sets the Shape this painter is associated with. + * Sets the Shape this shape painter is associated with. + * * @param shape new shape this painter should be associated with. - * should not be null. + * Should not be null. */ - public void setShape(Shape shape); + void setShape(Shape shape); /** - * Gets the Shape this painter is associated with. + * Gets the shape this shape painter is associated with. * - * @return shape associated with this Painter. + * @return shape associated with this painter */ - public Shape getShape(); + Shape getShape(); } 1.6 +23 -23 xml-batik/sources/org/apache/batik/gvt/StrokeShapePainter.java Index: StrokeShapePainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/StrokeShapePainter.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- StrokeShapePainter.java 2001/03/16 18:31:49 1.5 +++ StrokeShapePainter.java 2001/09/13 14:22:45 1.6 @@ -17,10 +17,13 @@ * A shape painter that can be used to draw the outline of a shape. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: StrokeShapePainter.java,v 1.5 2001/03/16 18:31:49 tkormann Exp $ + * @version $Id: StrokeShapePainter.java,v 1.6 2001/09/13 14:22:45 tkormann Exp $ */ public class StrokeShapePainter implements ShapePainter { - /** Shape painted by this painter */ + + /** + * Shape painted by this painter. + */ protected Shape shape; /** @@ -34,16 +37,16 @@ protected Paint paint; /** - * Constructs a new <tt>ShapePainter</tt> that can be used to draw - * the outline of a <tt>Shape</tt>. + * Constructs a new <tt>ShapePainter</tt> that can be used to draw the + * outline of a <tt>Shape</tt>. * - * @param shape shape to be painted by this painter. Should not be null. + * @param shape shape to be painted by this painter. + * Should not be null. */ public StrokeShapePainter(Shape shape) { - if(shape == null){ + if (shape == null) { throw new IllegalArgumentException(); } - this.shape = shape; } @@ -66,15 +69,11 @@ } /** - * Paints the outline of the specified shape using the specified - * Graphics2D and context. + * Paints the outline of the specified shape using the specified Graphics2D. * - * @param shape the shape to paint - * @param g2d the Graphics2D to use - * @param ctx the render context to use + * @param g2d the Graphics2D to use */ - public void paint(Graphics2D g2d, - GraphicsNodeRenderContext ctx) { + public void paint(Graphics2D g2d, GraphicsNodeRenderContext ctx) { if (stroke != null && paint != null) { g2d.setPaint(paint); g2d.setStroke(stroke); @@ -83,12 +82,10 @@ } /** - * Returns the area painted by this painter for a given input shape - * - * @param shape the shape to paint + * Returns the area painted by this shape painter. */ public Shape getPaintedArea(GraphicsNodeRenderContext rc){ - if(paint != null && stroke != null){ + if (paint != null && stroke != null) { return stroke.createStrokedShape(shape); } else { return null; @@ -96,21 +93,24 @@ } /** - * Sets the Shape this painter is associated with. + * Sets the Shape this shape painter is associated with. + * * @param shape new shape this painter should be associated with. - * should not be null. + * Should not be null. */ public void setShape(Shape shape){ + if (shape == null) { + throw new IllegalArgumentException(); + } this.shape = shape; } /** - * Gets the Shape this painter is associated with. + * Gets the Shape this shape painter is associated with. * - * @return shape associated with this Painter. + * @return shape associated with this painter. */ public Shape getShape(){ return shape; } - } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]