<div dir="ltr"><div>Hi,<br><br></div>Please review Marlin/FX upgrades that provide an efficient path clipper in Stroker (float / double variants) fixing the bug <a class="gmail-issue-link" href="https://bugs.openjdk.java.net/browse/JDK-8184429" id="gmail-key-val" rel="4935099">JDK-8184429</a><div><div><br>Marlin2D patch (jdk10):<br><a href="http://cr.openjdk.java.net/~lbourges/marlin/marlin-080.0/">http://cr.openjdk.java.net/~lbourges/marlin/marlin-080.0/</a><br>MarlinFX patch (openjfx10):<br><a href="http://cr.openjdk.java.net/~lbourges/marlinFX/marlin-080.0/">http://cr.openjdk.java.net/~lbourges/marlinFX/marlin-080.0/</a><br></div><div><br></div><div>Path Clipper in (D)Stroker:<br></div><div>- it uses outcode computation (cohen - sutherland) for segment edges (2 for lines, 3 for quads, 4 for cubics)<br></div><div>- it opens the path when a segment is invisible ie special moveTo() and ignore invisible joins; it does not compute any intersection (line / curve), it just skips useless segment for better performance and accuracy<br></div><div>- the ClosedPathDetector is needed to infer if the path is closed or not (call to closePath) to produce caps when appropriate. It reuses the former PolyStack (moved into Helper classes) to store the forward segments<br></div><div>- the clip rectangle is adjusted either in Stroker but also in Transformer2D to take into account the mitter limit, stroker width and also the Renderer offset</div><div><br></div><div>That's why it can not be applied to closed paths (fill operations) as the path must remain closed in such case (concave polygon). <br></div><div>This could be implemented later as it needs to insert corner points when needed to avoid artefacts; so the algorithm seem more complicated to me.<br></div><div><br></div><div>Marlin2D / FX Patches are slightly different to handle the Renderer offsets.</div><div><br></div><div>I tested these patches against my MapBench test with a small clip and several affine transforms: it does not produce any artefact (0 pixel difference between clip=true/false)<br></div><div><br></div><div>PS: I also improved the accuracy of Renderer's AFD by using the kaham compensated-sum approach (later patch)</div><div><br></div><div>Cheers,</div><div>Laurent Bourg├Ęs</div></div></div>