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

Jose Pereda jpereda at openjdk.java.net
Sun Sep 12 00:34:14 UTC 2021

On Fri, 10 Sep 2021 18:15:21 GMT, Jose Pereda <jpereda at openjdk.org> wrote:

>> Currently, `WebPage` has already a public `setBackgroundColor()` method, but the class is not public. Therefore, public API is needed in `WebView` to allow developers access to it.
>> In line with the `fontSmoothingType` property, this PR provides public support for setting the background color of a WebPage, by adding a `pageFill` property, and a CSR is required.
>> The color for the background, that can be opaque, transparent or with any level of opacity, can be set via code or via CSS using `-fx-page-fill`.
>> Unit tests and a system test are provided.
> Jose Pereda has updated the pull request incrementally with one additional commit since the last revision:
>   Fix test to pass all 3 platforms

Somehow by accident I've found out that doing in `WebPage::paint2GC`:

                if (clip != null) {
                    if (isBackgroundColorTransparent()) {
+                        gc.clearRect(0, 0, 0, 0); // extra call to clear rect
                        gc.clearRect((int) clip.getX(), (int) clip.getY(), (int) clip.getWidth(), (int) clip.getHeight());

fixes the issue for the Group test (same for no container case).

Ultimately, this is the same as calling twice `ES2Graphics::clearQuad`. 

After some testing, I modified this method to get it working with the expected single call with just this change:

        CompositeMode mode = getCompositeMode();
-        // set the blend mode to CLEAR
-        context.updateCompositeMode(CompositeMode.CLEAR);
         Paint oldPaint = getPaint();
         setPaint(Color.BLACK); // any color will do...
         fillQuad(x1, y1, x2, y2);
+        // set the blend mode to CLEAR
+        context.updateCompositeMode(CompositeMode.CLEAR);

which seems to indicate that `fillQuad` requires SRC_OVER and we can use the original black color, and only before flushing we set the CLEAR mode.

Does this make sense?


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

More information about the openjfx-dev mailing list