Trying to remember some ancient reasoning (and probably failing at the memory thing), I think the original issue was that the existing non-AA rasterizer could only output spans, so rendering a tall line (one with a wide Y range) would result in a lot of rendering operations being sent to a hw rasterizer. But, those hw rasterizers could understand things like "drawLine", it's just that the SpanIterator wasn't designed to express its output as a series of drawlines for the case of thin stroked shapes. So, the ProcessPath rasterizer was created to express thin outlines as a series of drawLines. it has to deal with issues such as not duplicating shared vertices and other anomalies you get when you want a downstream line renderer to render the shape accurately. It was originally stroke-only and we still used the SSI for filling, but since the logic to break a stroked shape down into drawLine operations caused it to rasterizer slightly differently we'd end up with gaps or overruns when both filling and drawing a shape with different rasterizers - so an equivalent filling mechanism was created to be used in conjunction with the stroking pipeline.

I hope that explanation was at least 90% accurate...

                        ...jim

On 9/26/16 11:55 AM, Jim Graham wrote:
They do operate differently.  They aren't meant to be mixed and matched.

One thing that may shed some light is the STROKE_CONTROL hint.  If it is sent 
to Pure then there is no heuristic for how
to rasterize and all rasterizers should agree on how to scan convert shapes.

But, if it is set to another value, then it has some latitude to adjust the 
path for cleanliness with respect to keeping
line widths from varying depending on position and other consistency anomalies 
that can occur with a number of small
related paths rendered near each other.  The two mechanisms were written with 
different goals and by different people to
meet those consistency requirements in different ways.  The operation of one is 
more useful for a software renderer back
end and the other is more useful for a hardware renderer back end (which was 
the primary reason for creating
ProcessPath, not necessarily the distinction of how to apply the STROKE_CONTROL 
hint)...

            ...jim

On 9/25/16 4:33 AM, Clemens Eisserer wrote:
Hi,

I recently tried to track down JDK-8156100 (xrender: Subpixel drawing
bug in Java 8) -  under some circumstances paths do not align with
fills when subpixel coordinates are used.
The issue seems to be caused by ProcessPath and ShapeSpanIterator
behaving differently with regards to rounding.

I've created a small testcase to illustrate the issue:
http://pastebin.com/hy5zCkPR - where a rectangle with subpixel
coordinates is  "drawn" with bothl, SSI and ProcessPath.

The ShapeSpanIterator seems to truncate any subpixel values, whereas
ProcessPath always seems to "round up".

Is this expected behaviour? Should I avoid SSI and switch to
ProcessPath entirely?

Thank you in advance, Clemens

Reply via email to