Hi again. I just thought of this: if we're really concerned about the accuracy of the edgeMinX edgeMaxX variables, we could find the curves' critical points and use them to compute the min/max X values. After all, we're creating (or rather "setting") the Curve objects anyway. This isn't as fast as using the bounding boxes, but it's close and much more accurate.
Regards, Denis. ----- "Denis Lila" <dl...@redhat.com> wrote: > Hi Jim. > > > All lines generated from a given "allegedly monotonic" curve are > > recorded with the same "or" (orientation) value. But, if the curves > > are not truly monotonic then it might be theoretically possible to > > generate a line that is backwards with respect to the expected > orientation. It > > would then get recorded in the edges array with the wrong > orientation > > and slope and then rasterization might unravel. > > I see. In that case, I think it's a good idea if we don't make curves > "monotonic". I already did this, by moving the edgeMin/axX/Y handling > and orientation computations in addLine. This did make it slower > compared > to the file you sent me, but only by very, very little. Curves were > affected the most, and they were only 1% slower. I think we can handle > this, especially since lines were about 1% faster. The code is also 70 > lines shorter. > > The edgeM* members are used only so we don't have to iterate through > every > scanline if this is not necessary, and so that we can tell PiscesCache > that the bounding box is smaller than what Renderer is given. However, > now > that we keep the bucket list, I think it would be more efficient if we > got rid if EdgeM[in|ax]Y and simply computed the y bounds by looking > at the > head and tail of the bucket list. > Also, perhaps we can keep track of edgeM[in|ax]X using the bounding > boxes > of curves, instead of the lines in the flattened curves. This would > not > be accurate, but I don't think it would affect rendering. It would > simply > result in a few more alpha boxes than necessary. I don't think these > would > be too bad, because mostly they're just going to be all 0 so they will > be skipped because getTypicalAlpha() is now implemented. > How do you think we should handle these 4 variables? > > Thank you, > Denis. > > ----- "Jim Graham" <james.gra...@oracle.com> wrote: > > > Hi Denis, > > > > On 11/8/2010 2:39 PM, Denis Lila wrote: > > >> Finally, I discovered (while testing for other problems) that the > > >> curves are not truly monotonic after slicing them. I realized > this > > years ago > > >> when I was writing my Area code (see sun.awt.geom.Curve) and put > > in > > >> tweaking code to make them monotonic after they were split. They > > are > > >> never off by more than a few bits, but you can't trust the curve > > >> splitting math to generate purely monotonic segments based on a t > > >> generated by some unrelated math. Sometimes the truly horizontal > > or > > >> vertical t value requires more precision than a float (or even a > > >> double) can provide and splitting at the highest representable > > float less than > > >> the t value produces a pair of curves on one side of the hill and > > >> splitting at the next float value (which is greater than the true > > t > > >> value) produces curves on the other side of the hill. Also, when > > the > > >> curve has been split a few times already, the t values loose > > accuracy > > >> with each split. This will all be moot if I can eliminate the > > >> splitting code from the renderer, but it may also play a factor > in > > the > > >> stroke/dash > > >> code... > > > > > > Making curves monotonic is only used for optimization purposes, > > > so it can't see how it would affect rendering correctness. > > > > Fortunately, the non-monotonicity is limited to a few bits of > > precision > > so this may never generate an errant edge in practice unless > > flattening > > gets really fine-grained... > > > > ...jim