The code is broken because in the else case of VisitNextEdgeBetweenRect we
assume that r2->x1 < r1->x1. This is not always the case.
The fix is to have VisitNextEdgeBetweenRect return whether there's an overlap.
The calling code can than adjust x1 appropriately if r1 != r1_end && r2 != r2_end.
This fixes reading unitialized data during texture filtering.
It's complicated because we can have regions of initialized data
and padding out a region is much harder than a rectangle.
We currently only take this path for tiled things because of
the artifacts that show up during the sampling that helps
in overscroll. It's also not a great long term solution because
it only works for software backends.
Previously our region code was just a simple y,x sorted list of
non-intersecting rectangles. This can cause us to have simple regions
represented in a complex unoptimizable way.
Switching to pixman regions gives us a canonical region implementation.
There are some cases when this can cause performance regressions.
For example, with the old region code we end up with this region:
http://people.mozilla.org/~jmuizelaar/region-pre.html
which is represented like this:
http://people.mozilla.org/~jmuizelaar/region-post.html
with the new code.
We call SimplifyOutward(4) on this. With old regions we can't simplify it so we
end up taking the bounds and get 1 rect. With the new regions we have only 3
rects to start and so we do nothing. The difference between 3 rects and 1 rect
cause D2D to do a PushLayer() instead of a ClipRect() and that seems to be the
causes for the regression.
--HG--
extra : rebase_source : 65e0d29d67b51a3780448eaecfde33dbcb6b99b1