[OpenJDK Rasterizer] Fwd: Re: Fwd: RFR: Marlin renderer #3
Jim Graham
james.graham at oracle.com
Tue Jul 14 18:50:07 UTC 2015
On 7/14/15 5:28 AM, Laurent Bourgès wrote:
> Jim,
>
>>> Few ideas to discuss:
>>> 1/ I wonder now if the gridding = ceil (x/y - 0.5) should be done
>>> differently: why not apply the offset to - 0.5 to points before curve
>>> decimation or adding lines: it may saves a lot of substractions:
>>> AddLine (x1,y1,x2,y2) implies 4 substractions whereas lineTo (x2,y2)
>>> only needs to adjust the last point.
>>> Idem for curve decimation, shifting points may help.
>>
>>
>> I like this idea - you can bake the translation into the transform that is applied prior to the rasterizer so there is no added work being done.
>
> Will try asap, maybe tonight. I mean I will shift coordinates early in
> tosubpixx() and tosubpixy () by -0.5f.
Good point. It could probably still be done by the same transform, but
it makes sense (and improves code independence) to keep it isolated in
the Renderer class instead.
>>> - do you know if the breakCurveAndAddLines (quad or cubic) really takes
>>> into account the supersampling scale to generate only segments needed
>>> and no more ?
>>
>> I don't remember. I'd have to read the code and figure it out.
>
> Thanks, it seems there are some thresholds BND... but I am unable to
> find out what it is related to ?
I'd have to research that as well. I briefly understood them when I
reviewed the code and I was able to fine-tune them once when we had
failures in the FX version, but they are essentially a variant of
"epsilon" but related to the adaptive subdivision algorithm so I mostly
just treated them as tuning parameters - an accuracy vs. time tradeoff.
>>> - I use fixed-point (32.32 + error) as you did but it is maybe too
>>> precise: the slope, bumpx and error could be determined from integer
>>> coordinates for starting / ending points = ceil (x1 - 0.5), ceil (y -
>>> 0.5) directly
>>
>>
>> I don't understand what you are getting at here...?
>
> I wonder if Renderer class could use 24.8 fixed point coordinates early
> in tosubpixx() and tosubpixy () to have 1/256 precision in lineTo,
> curveTo, quadTo before addLine and curve culling to get rid of
> floating-point maths early.
The problem with 1/256 precision is that you accumulate 1/256 error with
every step. With 8 levels of sub-pixel precision that means you can
accumulate a full sampling error every 32 pixels. For nearly vertical
lines where they tend to cross a whole column of samples at once that
means you are off by 8 coverage values every 32 pixels (scaled by the
256/64 coverage scale to a difference of 32 in the alpha value).
...jim
More information about the graphics-rasterizer-dev
mailing list