RFR: 8090547: Allow for transparent backgrounds in WebView [v4]

Jose Pereda jpereda at openjdk.java.net
Mon Sep 6 11:08:43 UTC 2021


On Fri, 3 Sep 2021 21:11:48 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:

>> I guess the assumption might be the other way around? Since the fill color was not transparent, there was no need to clear the area, when rendering the same solid rect at the new position?
>> 
>> If you check this [comment](https://bugs.openjdk.java.net/browse/JDK-8090547?focusedCommentId=13808421&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13808421), there is already a mention that `WCPageBackBufferImpl::copyArea` doesn't care about the alpha channel.
>> 
>> The proposed patch: 
>> 
>>  texture.createGraphics().clearQuad(x+dx, y+dy, x+dx+w, y+dy+h);
>> 
>>  could work if we could apply it conditionally only for alpha == 0 (or maybe also for alpha < 1).
>> 
>> My current approach with `clearRect` ultimately calls `clearQuad`, so both might be doing the same after all.
>
> I don't doubt that the area should be cleared. What I was questioning is whether this was the best place to do it? I'd be OK with it if you document it.

The two options I see so far to clear the area are the one I've committed (change in `WCGraphicsPrismContext::setClip`) and the one I've mentioned above (`WCPageBackBufferImpl::copyArea`).
After some more testing, I see that the latter doesn't work when there is full transparency, so I will discard it.

Back to my original commit, it could be moved up to `WebPage::paint2GC`, before the call to `gc.setClip(rq.getClip());`, and that would also remove the need of passing down the opacity level to `WCGraphicsContext`. I also see now that the `clearRect()` call is required for full transparency only.

This would be the change:

WCRectangle clip = rq.getClip();
                if (clip != null) {
                    if (isBackgroundTransparent()) {
                        // As backbuffer is enabled, new clips are drawn over the old rendered frames
                        // regardless the alpha channel. While that works fine for alpha > 0, 
                        // for alpha == 0 we need to clear the old frame or it will still be visible.
                        
                        gc.clearRect((int) clip.getX(), (int) clip.getY(), (int) clip.getWidth(), (int) clip.getHeight());
                    }
                    gc.setClip(clip);
                }

-------------

PR: https://git.openjdk.java.net/jfx/pull/563


More information about the openjfx-dev mailing list