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.

Reply via email to