RFR: 8354191: GTK LaF should use pre-multiplied alpha same as cairo

Maxim Kartashev mkartashev at openjdk.org
Thu Apr 10 08:26:33 UTC 2025


On Wed, 9 Apr 2025 14:42:05 GMT, Maxim Kartashev <mkartashev at openjdk.org> wrote:

> The pixels that cairo produces for GTK LaF to draw on a Swing component have their alpha components pre-multiplied as per [the documentation](https://www.cairographics.org/manual/cairo-Image-Surfaces.html?spm=a2ty_o01.29997173.0.0.540ac921z2EebT#cairo-format-t):
>> Pre-multiplied alpha is used. (That is, 50% transparent red is 0x80800000, not 0x80ff0000.)
> 
> The BufferedImage created from those pixels, however, has its constructor's argument for `isRasterPremultiplied` set to `false` in `GTKEngine.finishPainting()`. This commit corrects that.
> 
> In addition, since at least some "native" graphics color models also use pre-multiplied alpha (ex.: `GLXGraphicsConfig.getColorModel()`), `COLOR_MODELS` were modified to take advantage of that and avoid unnecessary re-calculations of image's pixels.

To illustrate the difference, here's a magnified portion of the SwingSet2 demo with GTK LaF:
![image](https://github.com/user-attachments/assets/b1ba0571-d3e4-4657-8f4c-c73abc468bf8)
"Old" is on the left and "new" (with this change) is on the right.

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

PR Comment: https://git.openjdk.org/jdk/pull/24551#issuecomment-2791958919


More information about the client-libs-dev mailing list