On Fri, 7 Jun 2024 18:29:00 GMT, Martin Fox <m...@openjdk.org> wrote:

> When drawing to the screen JavaFX is producing sRGB colors but on macOS 
> that’s not necessarily what the user is seeing. Since the pixels are not 
> tagged as sRGB the OS is copying them unmodified to the frame buffer to be 
> displayed in the screen’s color space. In general Mac’s don’t default to sRGB 
> so the colors will be wrong. The fix for this is a one-liner; we just need to 
> declare that our CALayer uses the sRGB color space so the OS will convert it 
> to the screen’s space (presumably with a slight performance penalty).
> 
> In the reverse direction the Robot should be returning sRGB colors. The 
> getPixelColor calls were making no conversion. The getScreenCapture calls 
> were converting to genericRGB, not sRGB, and so the results didn’t match the 
> getPixelColor calls. This PR fixes these bugs; getPixelColor and 
> getScreenCapture both return sRGB.
> 
> Now that everything is working in the same space when JavaFX writes out a 
> pixel and then reads it back in the colors should match within a limited 
> tolerance (due to rounding issues when converting from float to int and 
> back). But that just means the various glass code paths are using the same 
> space to perform conversions, not that it’s sRGB. AWT is color space aware 
> and so the automated test employs an AWT Robot to double-check the results.
> 
> I swept through the rest of the Mac glass code and found a few places where 
> colors were being converted to deviceRGB instead of sRGB e.g. when reading 
> colors for PlatformPreferences or creating images for drag and drop. I could 
> not think of a good way of writing automated tests for these cases.
> 
> I started investigating this since Robot tests were failing unless the 
> monitor’s profile was set to sRGB. Unfortunately this PR doesn’t entirely fix 
> that. My monitor uses Display P3 and I’m still seeing failures on the 
> SwingNodeJDialogTest. The test writes out pure BLUE colors and gets back 
> colors with a surprising amount of red. I’ve verified that this has nothing 
> to do with JavaFX, it happens when I use CoreGraphics to make the sRGB => 
> Display P3 color conversions directly. I guess this is a cautionary tale 
> about what happens when you work near the edges of a color space’s gamut.

As a datapoint, we were doing some testing in the 
[jfx-sandbox:metal](https://github.com/openjdk/jfx-sandbox/tree/metal) branch, 
and had over a hundred test failures that we tracked down to the color profile 
not being set to sRGB (the test system had the default "Color LCD profile").

I applied the fix from this patch (and resolving a couple merge conflicts due 
to some Metal-specific changes in the sandbox branch), and ran one of the 
failing tests with the default "Color LCD" profile and it now passes.

Even if this PR doesn't fix all of the problems, it seems like a good fix to 
consider.

@beldenfox Can you merge in the latest master so we will see a test build on 
macOS / aarch64?

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

PR Comment: https://git.openjdk.org/jfx/pull/1473#issuecomment-2200290351
PR Comment: https://git.openjdk.org/jfx/pull/1473#issuecomment-2200295936

Reply via email to