RFR: 8218973: SVG with masking is not rendering image with mask effect
Kevin Rushforth
kcr at openjdk.java.net
Fri May 8 23:50:47 UTC 2020
On Thu, 7 May 2020 09:19:28 GMT, Bhawesh Choudhary <github.com+4208131+bhaweshkc at openjdk.org> wrote:
> Root cause of issue is Specifying a image mask from GraphicsContextJava.cpp in WebKit was not implemented, so masking
> doesn't take place at all while rendering SVGRect. to fix this issue add implementation of function clipToImageBuffer()
> in GraphicsContextJava.cpp and send clip image to WCGraphicsPrismContext.java While rendering in
> WCGraphicsPrismContext.java if image clip mask is available, use it for rendering using MaskTextureGraphics interface
> otherwise use usual way of rendering.
I verified that this does fix the bug, although there is a resource issue you will need to address. When I run a simple
test (the one attached to the bug report) I get the following warning messages:
Outstanding resource locks detected:
D3D Vram Pool: 21,073,412 used (3.9%), 67,108,864 target (12.5%), 536,870,912 max
13 total resources being managed
average resource age is 0.6 frames
0 resources at maximum supported age (0.0%)
5 resources marked permanent (38.5%)
3 resources have had mismatched locks (23.1%)
3 resources locked (23.1%)
8 resources contain interesting data (61.5%)
0 resources disappeared (0.0%)
You need to `unlock()` and `dispose()` the temporary RTTs when you are done with them. You should also `dispose()` the
temporary Texture.
I left a couple inline comments as well, the main question being about whether we really need a second RTT for the mask
texture.
modules/javafx.web/src/main/java/com/sun/javafx/webkit/prism/WCGraphicsPrismContext.java line 549:
> 548: Texture.WrapMode.CLAMP_NOT_NEEDED);
> 549: RTTexture maskRtTexture = g.getResourceFactory().createRTTexture(nativeMaskImage.getWidth(),
> 550: nativeMaskImage.getHeight(), Texture.WrapMode.CLAMP_NOT_NEEDED);
Why do you need to create a second RTT here? I would have thought you could use the mask texture directly (you may need
to scale the image in order to do that).
modules/javafx.web/src/main/java/com/sun/javafx/webkit/prism/WCGraphicsPrismContext.java line 566:
> 565: filterContext = PrFilterContext.getInstance(screen);
> 566: }
> 567: PrDrawable imagePrDrawable = PrDrawable.create(filterContext, paintRtTexture);
Did you test both the SW pipeline and printing paths?
-------------
PR: https://git.openjdk.java.net/jfx/pull/213
More information about the openjfx-dev
mailing list