summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Kung <fkung@redhat.com>2006-12-05 20:52:05 +0000
committerFrancis Kung <fkung@redhat.com>2006-12-05 20:52:05 +0000
commit25ca7333af74365be7349b0f7577dbb416f7ab06 (patch)
tree9d5ec1e975adea891820352dd5d5793f9b9537fc
parentb79341ec0f84cba3c5eb7cd8435b57b72e3d2c4b (diff)
downloadclasspath-25ca7333af74365be7349b0f7577dbb416f7ab06.tar.gz
2006-12-05 Francis Kung <fkung@redhat.com>
* java/awt/BasicStroke.java (capEnd): Prevent division by zero. * java/awt/geom/Arc2D.java (ArcIterator.ArcIterator): Do not shift the arc to make the extent positive. (ArcIterator.currentSegment): Handle a negative extent.
-rw-r--r--ChangeLog8
-rw-r--r--java/awt/BasicStroke.java10
-rw-r--r--java/awt/geom/Arc2D.java44
3 files changed, 44 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index bcf7201f2..3025571cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2006-12-05 Francis Kung <fkung@redhat.com>
+ * java/awt/BasicStroke.java
+ (capEnd): Prevent division by zero.
+ * java/awt/geom/Arc2D.java
+ (ArcIterator.ArcIterator): Do not shift the arc to make the extent positive.
+ (ArcIterator.currentSegment): Handle a negative extent.
+
+2006-12-05 Francis Kung <fkung@redhat.com>
+
* gnu/java/awt/peer/gtk/BufferedImageGraphics.java
(constructor): Handle translated subimages properly, ie, if the image's
0,0 position is not the data buffer's first element.
diff --git a/java/awt/BasicStroke.java b/java/awt/BasicStroke.java
index e6cb87e34..ef6a7f0b7 100644
--- a/java/awt/BasicStroke.java
+++ b/java/awt/BasicStroke.java
@@ -761,9 +761,13 @@ public class BasicStroke implements Stroke
p1 = new double[]{a.last.P2.getX(), a.last.P2.getY()};
dx = p1[0] - p0[0];
dy = p1[1] - p0[1];
- l = Math.sqrt(dx * dx + dy * dy);
- dx = (2.0/3.0)*width*dx/l;
- dy = (2.0/3.0)*width*dy/l;
+ if (dx != 0 && dy != 0)
+ {
+ l = Math.sqrt(dx * dx + dy * dy);
+ dx = (2.0/3.0)*width*dx/l;
+ dy = (2.0/3.0)*width*dy/l;
+ }
+
c1 = new Point2D.Double(p1[0] + dx, p1[1] + dy);
c2 = new Point2D.Double(b.P1.getX() + dx, b.P1.getY() + dy);
a.add(new CubicSegment(a.last.P2, c1, c2, b.P1));
diff --git a/java/awt/geom/Arc2D.java b/java/awt/geom/Arc2D.java
index eff34a081..8d5b01cd5 100644
--- a/java/awt/geom/Arc2D.java
+++ b/java/awt/geom/Arc2D.java
@@ -774,14 +774,9 @@ public abstract class Arc2D extends RectangularShape
y = a.getY();
w = a.getWidth();
h = a.getHeight();
- double start = a.getAngleStart() * (Math.PI / 180);
- double extent = a.getAngleExtent() * (Math.PI / 180);
+ double start = Math.toRadians(a.getAngleStart());
+ double extent = Math.toRadians(a.getAngleExtent());
- if (extent < 0)
- {
- extent = -extent;
- start = 2 * Math.PI - extent + start;
- }
this.start = start;
this.extent = extent;
@@ -790,11 +785,11 @@ public abstract class Arc2D extends RectangularShape
limit = -1;
else if (extent == 0)
limit = type;
- else if (extent <= Math.PI / 2.0)
+ else if (Math.abs(extent) <= Math.PI / 2.0)
limit = type + 1;
- else if (extent <= Math.PI)
+ else if (Math.abs(extent) <= Math.PI)
limit = type + 2;
- else if (extent <= 3.0 * (Math.PI / 2.0))
+ else if (Math.abs(extent) <= 3.0 * (Math.PI / 2.0))
limit = type + 3;
else
limit = type + 4;
@@ -909,9 +904,20 @@ public abstract class Arc2D extends RectangularShape
double kappa = (Math.sqrt(2.0) - 1.0) * (4.0 / 3.0);
double quad = (Math.PI / 2.0);
- double curr_begin = start + (current - 1) * quad;
- double curr_extent = Math.min((start + extent) - curr_begin, quad);
- double portion_of_a_quadrant = curr_extent / quad;
+ double curr_begin;
+ double curr_extent;
+ if (extent > 0)
+ {
+ curr_begin = start + (current - 1) * quad;
+ curr_extent = Math.min((start + extent) - curr_begin, quad);
+ }
+ else
+ {
+ curr_begin = start - (current - 1) * quad;
+ curr_extent = Math.max((start + extent) - curr_begin, -quad);
+ }
+
+ double portion_of_a_quadrant = Math.abs(curr_extent / quad);
double x0 = xmid + rx * Math.cos(curr_begin);
double y0 = ymid - ry * Math.sin(curr_begin);
@@ -932,7 +938,11 @@ public abstract class Arc2D extends RectangularShape
// will *subtract* the y value of this control vector from our first
// point.
cvec[0] = 0;
- cvec[1] = len;
+ if (extent > 0)
+ cvec[1] = len;
+ else
+ cvec[1] = -len;
+
trans.scale(rx, ry);
trans.rotate(angle);
trans.transform(cvec, 0, cvec, 0, 1);
@@ -942,7 +952,11 @@ public abstract class Arc2D extends RectangularShape
// control vector #2 would, ideally, be sticking out and to the
// right, in a first quadrant arc segment. again, subtraction of y.
cvec[0] = 0;
- cvec[1] = -len;
+ if (extent > 0)
+ cvec[1] = -len;
+ else
+ cvec[1] = len;
+
trans.rotate(curr_extent);
trans.transform(cvec, 0, cvec, 0, 1);
coords[2] = x1 + cvec[0];