[OpenJDK 2D-Dev] [9] Review Request: 8167310 The graphics clip is incorrectly rounded for some fractional scales

Phil Race philip.race at oracle.com
Mon Oct 10 22:23:53 UTC 2016



On 10/10/2016 01:34 PM, Jim Graham wrote:
> [CC'ing Phil in case he has some suggestions for how the API should 
> work...]
>
> Responding just to additional questions in this email...
>
> On 10/10/16 12:45 PM, Sergey Bylokhov wrote:
>> The additional questions:
>>  - In the current fix we change behavior of the clip. Before the fix 
>> if we set the clip to the nearest areas they can
>> overlaps in the destination. Should we change the drawImage as well? 
>> Currently if I draw image to the nearest areas in
>> the user space, the images can overlap in the destination(so the 
>> actual result in destination depends on what image was
>> painted first).
>
> Yes, I think adjacent drawImage requests should not overlap.  We 
> should look into this separately.

So previously, overlapping of the clip bounds ensured adjacent images 
were not drawn
over-lapped .. but with this fix they might be ?


>
>>  - Should the clip be affected by the stroke(if it was set by the 
>> shape)? Right now if the clip was set by the shape it
>> will produce different result than if it was set via rectangle.
>
> I think we could have the clip never be affected by STROKE_NORMALIZE.  
> That might make sense because the NORMALIZE code is meant to deal with 
> aesthetic issues, not rendering math issues.  We'd have to add a 
> getClipSSI() method that hard-codes the "adjust" boolean to "false" to 
> do that, but that is an easy fix.
>
> The question is then that would meant that setClip(Shape) and 
> fill(Shape) might disagree, though.  This would argue that we should 
> have it affected by the normalization.  This is also a fairly easy 
> fix, you could have LoopPipe have a method that would return the 
> appropriate Rectangle representing which pixels are covered for a 
> given Rectangle2D depending on the normalize parameters.
>
> On the other hand, we normalize differently for AA and non-AA. Calling 
> getFillSSI() on LoopPipe basically performs normalization only for 
> non-AA fills.  Arguably, though, clipping produces non-AA results in 
> that it chooses whole pixels to include or exclude. This might mean 
> that it should never follow AA normalization. 

That last sentence sounds like the right answer in principle but I don't 
know if we'll be unpleasantly surprised
by some  consequence of "... that setClip(Shape) and fill(Shape) might 
disagree .."

-phil.

> But, it also points out the silliness of normalizing to match the 
> results of fill when it can never do that for AA mode.  (Potentially 
> we could add an AA-clip mode, but the implementation of that would 
> require capturing every rendering operation to an intermediate buffer 
> and then pixel-filtering it through a mask created by AA-filling the 
> clip shape - we do that in FX, but it would require major surgery to 
> add that to the SG2D pipeline so I don't think we would ever consider 
> that at this stage.)
>
> Any of those solutions are fairly easy to fix (except adding an AA 
> clipping mode), but the question is which is more useful and/or 
> surprises the developers the least.
>
> So we have the current case:
>
> setClip(integers or int-Rectangle) => pure coverage
> setClip(other shape) => non-AA normalized coverage
>
> If we decide that clip should normalize always to non-AA parameters 
> because it is an intrinsically non-AA type of operation then we have 
> to fix the setClip(integer rectangle) code which isn't hard.
>
> If we decide that clip should normalize to the current AA parameters 
> then it's basically the same, but we need to find a way to query the 
> right objects to perform the AA according to their chosen bias.  
> LoopPipe/ShapeSpanIterator appear to own non-AA normalization and I 
> think AA normalization is hidden behind the TileGenerator API 
> somewhere that Ductus/Pisces/Marlin all implement.
>
> If we decide that clip should not normalize then we only have to fix 
> setClip(other shape) and it's just a question of hard-coding the 
> adjust boolean in the call to instantiate the ShapeSpanIterator.
>
> Phil?
>
>                 ...jim




More information about the 2d-dev mailing list