Lila Tran wrote:
Actually, I am using batik 1.6, just downloaded about three weeks ago.
In the forum, I stated that I also tried batik 1.5, but that didn't
do any changes. Do you have any other suggestions? Below is the
method that I use to save the chart as svg file.
There is a bug in 1.6 when drawing certain arcs. This may or may
not be your problem (it looks suspiciously similar). You can try
applying the attached patch and rebuilding Batik.
-Archie
__________________________________________________________________________
Archie Cobbs * CTO, Awarix * http://www.awarix.com
--- sources/org/apache/batik/svggen/SVGArc.java.orig 2005-06-20
10:35:30.191343072 -0500
+++ sources/org/apache/batik/svggen/SVGArc.java 2005-06-20 10:46:41.765248320
-0500
@@ -18,6 +18,7 @@
package org.apache.batik.svggen;
import java.awt.geom.Arc2D;
+import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
@@ -38,6 +39,11 @@
private SVGLine svgLine;
/**
+ * Ellipse converter for 360 degree arcs.
+ */
+ private SVGEllipse svgEllipse;
+
+ /**
* @param generatorContext used to build Elements
*/
public SVGArc(SVGGeneratorContext generatorContext) {
@@ -48,23 +54,36 @@
* @param arc the Arc2D object to be converted
*/
public Element toSVG(Arc2D arc) {
- if ((arc.getWidth() == 0) || (arc.getHeight() == 0)) {
+ double ext = arc.getAngleExtent();
+ double width = arc.getWidth();
+ double height = arc.getHeight();
+
+ if (width == 0 || height == 0) {
Line2D line = new Line2D.Double
(arc.getX(), arc.getY(),
- arc.getX() + arc.getWidth(),
- arc.getY() + arc.getHeight());
- if (svgLine == null)
+ arc.getX() + width,
+ arc.getY() + height);
+ if (svgLine == null) {
svgLine = new SVGLine(generatorContext);
+ }
return svgLine.toSVG(line);
}
+ if (ext >= 360 || ext <= -360) {
+ Ellipse2D ellipse = new Ellipse2D.Double
+ (arc.getX(), arc.getY(), width, height);
+ if (svgEllipse == null) {
+ svgEllipse = new SVGEllipse(generatorContext);
+ }
+ return svgEllipse.toSVG(ellipse);
+ }
+
Element svgPath = generatorContext.domFactory.createElementNS
(SVG_NAMESPACE_URI, SVG_PATH_TAG);
StringBuffer d = new StringBuffer("");
Point2D startPt = arc.getStartPoint();
Point2D endPt = arc.getEndPoint();
- double ext = arc.getAngleExtent();
int type = arc.getArcType();
d.append(PATH_MOVE);
@@ -74,17 +93,25 @@
d.append(SPACE);
d.append(PATH_ARC);
- d.append(doubleString(arc.getWidth()/2));
+ d.append(doubleString(width / 2));
d.append(SPACE);
- d.append(doubleString(arc.getHeight()/2));
+ d.append(doubleString(height / 2));
d.append(SPACE);
d.append("0"); // no rotation with J2D arc.
d.append(SPACE);
- if (ext > 180) d.append("1"); // use large arc.
- else d.append("0"); // use small arc.
- d.append(SPACE);
- if (ext > 0) d.append("0"); // sweep ccw
- else d.append("1"); // sweep cw
+ if (ext > 0) {
+ // CCW sweep case, ext > 0
+ if (ext > 180) d.append("1"); // use large arc.
+ else d.append("0"); // use small arc.
+ d.append(SPACE);
+ d.append("0"); //sweep ccw
+ } else {
+ // CW sweep case, ext < 0
+ if (ext < -180) d.append("1"); // use large arc
+ else d.append("0"); // use small arc
+ d.append(SPACE);
+ d.append("1");
+ }
d.append(SPACE);
d.append(doubleString(endPt.getX()));
@@ -94,8 +121,8 @@
if (type == Arc2D.CHORD) {
d.append(PATH_CLOSE);
} else if (type == Arc2D.PIE) {
- double cx = arc.getX()+arc.getWidth()/2;
- double cy = arc.getY()+arc.getHeight()/2;
+ double cx = arc.getX() + width / 2;
+ double cy = arc.getY() + height / 2;
d.append(PATH_LINE_TO);
d.append(SPACE);
d.append(doubleString(cx));
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]