2d1f9ff7a3
The old method of handling soft masks had a number of issues where the temporary drawing canvas and the suspended main canvas could get out of sync (e.g. mismatched save/restores or clip state) or we could end up compositing at the wrong time. A good example of things getting out sync is the reduced test case in #9017. To fix this I've changed two big things: 1) Duplicate all the needed graphics state from the temporary canvas to the suspended main canvas. This ensure the canvases stay in sync so that when we switch back to the main canvas the graphics state stack is the same (e.g. transforms, clip paths). 2) Immediately composite after each drawing operation. This ensures that if there's an active clip region that we'll still be able to composite the correct portions of the canvas. Note: This solution could be avoided by using getImageData and putImageData since those ignore clipping region, but this is very very slow. Note2: I also think the old way of only compositing at the end of the soft mask is incorrect and can lead to wrong colors if drawing over the same region, but in practice this doesn't seem to matter much. Fixes: #5781 Fixes: #5853 Fixes: #7267 Fixes: #7891 Fixes: #8403 Fixes: #8624 Fixes: #12798 Fixes: #13891 Fixes: #9017 (reduced test case) Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1703683
6.0 KiB
6.0 KiB