[OpenJDK 2D-Dev] X11 uniform scaled wide lines and dashed lines; STROKE_CONTROL in Pisces
Denis Lila
dlila at redhat.com
Thu Oct 28 22:27:32 UTC 2010
Hi Jim.
I removed the cubic and quadratic lists and am now flattening
everything as it comes in, like you suggested. I ran some AA
benchmarks and the curves test was about 15% faster.
Then I started using your insertion sort in the only edges version
and re ran the benchmarks. Curves improved from 15% better to 20-22%
and lines improved from nothing to 2-20%, depending on how vertical
the lines were.
I didn't expect that the sorting would make this much difference.
But, it does, so I think it is worth it to work more on it; therefore,
next I will implement the bucket sort you suggested.
> If we moved to a Curve class or some other way to
> consolidate the 3 lists (may be easier in native code), this might win
> in more cases...
Does that mean you no longer think we should flatten every curve as soon
as we get it?
Regards,
Denis.
----- "Jim Graham" <james.graham at oracle.com> wrote:
> Hi Denis,
>
> On 10/26/2010 6:58 AM, Denis Lila wrote:
> >> 90% (guesstimate) of the time edges do not cross each other, thus
> if
> >> you sort the crossings without reordering the active edges then you
> just
> >> end up doing the same sorting work (same swaps) on the next
> scanline. My
> >> SpanShapeIterator code actually reordered the edges on every
> sample
> >> line to match their current X coordinates in a way that involved 1
> compare
> >> per edge that was processed and only occasionally a swap of 2 edge
> >> pointers. It would basically eliminate the sort at line 149 at
> the
> >> cost of only doing a compare in the nextY processing for the very
> very
> >> common case.
> >
> > I also implemented this some time ago. I didn't keep it because it
> slowed
> > things down a bit. However, I only tested it with very complex and
> large
> > paths, and in hindsight, I shouldn't have based my decision on that,
> so I
> > will re-implement it.
>
> I tried using this new rasterizer in FX and I had a test case which
> had
> a few shapes that were essentially zig-zaggy shapes on the top and
> bottom and fills between the zigzags (kind of like a seismic chart
> with
> fills between the pen squiggles).
>
> When I added a simple sort of the linear edges the performance nearly
>
> doubled in speed. Here is the code I replaced your quad-next-edge
> loop
> with:
>
> for (int i = elo; i < ehi; i++) {
> int ptr = edgePtrs[i];
> int cross = ((int) edges[ptr+CURX]) << 1;
> if (edges[ptr+OR] > 0) {
> cross |= 1;
> }
> edges[ptr+CURY] += 1;
> edges[ptr+CURX] += edges[ptr+SLOPE];
> int j = crossingIdx;
> while (--j >= 0) {
> int jcross = crossings[j];
> if (cross >= jcross) {
> break;
> }
> crossings[j+1] = jcross;
> edgePtrs[elo+j+1] = edgePtrs[elo+j];
> }
> crossings[j+1] = cross;
> edgePtrs[elo+j+1] = ptr;
> crossingIdx++;
> }
>
> I then did a conditional sort, moved to right after the qlo->qhi and
> clo->chi loops:
>
> for (int i = qlo; i < qhi; i++) {
> // same stuff
> }
> for (int i = clo; i < chi; i++) {
> // same stuff
> }
> if (qhi > qlo || chi > clo) {
> Arrays.sort(crossings, 0, crossingIdx);
> }
>
> In the case of my test case where I only had a polygon to fill, the
> performance doubled. Obviously I didn't do much for the case where
> there were curves because this was just a quick hack to see the value
> of sorting the edges.
>
> ...jim
More information about the 2d-dev
mailing list