public synchronized void arcTo(float rx, float ry, float angle,
			boolean largeArcFlag, boolean sweepFlag, float x, float y)
	{

		// Ensure radii are valid
		if (rx == 0 || ry == 0)
		{
			lineTo(x, y);
			return;
		}

		checkMoveTo(); // check if prev command was moveto

		// Get the current (x, y) coordinates of the path
		double x0 = cx;
		double y0 = cy;
		if (x0 == x && y0 == y)
		{
			// If the endpoints (x, y) and (x0, y0) are identical, then this
			// is equivalent to omitting the elliptical arc segment entirely.
			return;
		}

		Arc2D arc = computeArc(x0, y0, rx, ry, angle, largeArcFlag, sweepFlag,
				x, y);
		if (arc == null)
			return;

		AffineTransform t = AffineTransform.getRotateInstance(
				Math.toRadians(angle), arc.getCenterX(), arc.getCenterY());
		Shape s = t.createTransformedShape(arc);
		path.append(s, true);

		makeRoom(7);
		types[numSeg++] = ExtendedPathIterator.SEG_ARCTO;
		values[numVals++] = rx;
		values[numVals++] = ry;
		values[numVals++] = angle;
		values[numVals++] = largeArcFlag ? 1 : 0;
		values[numVals++] = sweepFlag ? 1 : 0;
		cx = values[numVals++] = x;
		cy = values[numVals++] = y;
	}