I don't understand - why do we generate sample points based on the size
of the cap? Why not generate a pair of bezier quarter-circles and let
the rasterizer deal with sampling?
...jim
Denis Lila wrote:
Hello.
I think I have a fix for this bug:
http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=506
Basically, the problem is that if there is a magnifying affine transformation set on the
graphics object and one tries to draw a line with small thickness and round end caps, the
end caps appear jagged. This is because the computation of the length of the array that
contains the points on the "pen" with which the decoration is drawn does not
take into account the size of the pen after the magnification of the affine
transformation. So, for example, if the line length was set to 1, and the transformation
was a scaling by 10, the resulting pen would have a diameter of 10, but only 3 pen points
would be computed (pi*untransformedLineWidth), so the end cap looks like a triangle.
My fix computes an approximation of the circumference of the transformed pen
(which is an ellipse) and uses that as the number of points on the pen. The
approximation is crude, but it is simple, faster than alternatives
(http://en.wikipedia.org/wiki/Ellipse#Circumference), and I can say from
observations that it works fairly well.
There is also icing on the cake, in the form of slight improvements in
performance when the scaling is a zooming out. Example: if the original line
width was 100, but g2d.scale(0.1,0.1) was set, then the resulting line would
have a width of 10, so only ~31 points are necessary for the decoration to look
like a circle, but without this patch, about 314 points are computed (and a
line is emitted to each one of them).
I appreciate any feedback.
Regards,
Denis Lila.