[OpenJDK Rasterizer] Rasterizer replacement proposal

Jim Graham Jim.A.Graham at Sun.COM
Wed Jun 13 21:46:51 PDT 2007


Some preliminary thoughts in looking over the ScanlineConverter...

- It does quite a lot for such a small piece of code - very cool.

- It's also very basic in its mathematical techniques, though.  The math 
to trace the slope of a line is inefficient and inaccurate and it 
flattens everything before tracing.  There is a lot of room for 
improvement here.

- It uses a push technology - you call it with something to render, it 
then calls something else with the data to render.  This is opposite the 
designs in our pipeline which call the rasterizer and ask it to return 
the path coverage information and then hand the path coverage 
information off to a pixel pusher.  It will be hard to turn that calling 
sequence around for this code unfortunately to make it match the way we 
do things in our pipelines currently (via AATileGenerator).  Not 
impossible, it will just require slicing up the code a bit on one side 
or another.

- It ignores the winding rule of the path, shouldn't be too hard to add 
support for non-zero winding, though.

- Clipping is managed by rasterizing both the shape and the clip at the 
same time.  The advantage of rasterizing the clip along with the shape 
is that you can rasterize the clip at a higher resolution when doing AA, 
but it comes with some drawbacks:

     - It's easy for the Shape rasterizer to rasterize both at the
       same time, but other parts of the pipeline (text and imaging)
       won't be so lucky without a lot of added support code.

     - Clipping should restrict the same regardless of pipeline and
       attributes set, but this clipping will restrict AA and non-AA
       rendering differently (due to different resolutions).  It might
       also restrict rendering of text and image differently unless
       they duplicate its code.

     - There are a lot of calculations involved in rasterizing the
       clip each time something is rendered - a big performance hit.

- Since our pipelines manage clipping outside of the AATileGenerator, 
the clipping code could be ignored when adapting this code as a plugin 
for the AATG, so the above drawbacks won't have any immediate impact in 
the short term and we can discuss them for longer term use when we get 
to more extensive efforts at coming up with a new "best of breed" 
renderer.  In the end, I think we'll probably want to stick with our 
Region based clipping for performance and ease of integration, but that 
all remains TBD.

- There is little to no handling of large coordinates, the results of 
handling them are a by-product of the calculation used to convert them 
to fixed point.

- The slope calculation doesn't carry very much precision at all - it 
looks like the error can be as much as +/- 1 pixel for every 64 
samplings.  There are much better ways to manage the math there that 
provide much more accuracy.  The code in 
src/share/native/sun/java2d/pipe/ShapeSpanIterator.c traces the slope of 
flattened shapes much more accurately.

- We found some performance improvements in directly tracing the curves 
rather than flattening them.  These techniques are evidenced in the 
src/share/classes/sun/java2d/loops/ProcessPath.java code (also mirrored 
at the native level in src/share/native/sun/java2d/loops/ProcessPath.c).

I'd say for the short term, it might help get us off the ground wrt 
satisfying the AATileGenerator interface, but there are probably some 
simpler ways to achieve that end.  I have a quick and dirty prototype of 
using Region objects to generate alpha tiles that I'll try to clean up 
and throw out here for another straw man.  It performed about .1 to .5x 
of the speed of the production code, but it was small and simple and 
took Ductus out of the equation.

The one piece that neither my quick Region hack nor this Rasterizer that 
you are offering here satisfy is an alternate implementation of line 
widening...

			...jim




More information about the graphics-rasterizer-dev mailing list