On Thu, 10 Sep 2026 17:47:40 GMT, Martin Fox <[email protected]> wrote:

>> This PR attempts to improve LCD text rendering on Windows and Linux. Changes 
>> include:
>> 
>> - (Windows only) When setting up DirectWrite the code now uses the 
>> NATURAL_SYMMETRIC rendering mode except for very small glyphs where it uses 
>> NATURAL. Using NATURAL_SYMMETRIC avoids distorted glyphs at specific pixel 
>> sizes (see [JDK-8389632](https://bugs.openjdk.org/browse/JDK-8389632)) and 
>> retains the curves along the top and bottom of the glyphs. Using NATURAL at 
>> small sizes avoids glyphs turning very fuzzy and light.
>> 
>> - The code is now consistently converts the colors from sRGB to a linear 
>> space (more or less), composites them, and then converts the result back to 
>> sRGB.
>> 
>> - The shader applies a contrast equation to the LCD glyph mask which helps 
>> emphasize the stems. The same equation is used by Skia and probably added by 
>> Microsoft when they cleaned up text rendering for Chromium. BTW it’s just 
>> the equation for a parabola that goes through points (0, 0) and (1, 1).
>> 
>> My testing was mostly done on a 27 inch display with a resolution of 
>> 2560x1440 and a screen scale of 150%. This was low enough to notice a 
>> difference. Resolutions higher than that (like full-on Retina) tend to hide 
>> a lot of sins.
>> 
>> I recommend reading “The Raster Tragedy in Skia” which is concise but covers 
>> a lot of ground. It contains a section on the challenges of compositing text 
>> in sRGB space and also the issues getting LCD text to look dark enough 
>> without inflating the stems. I wish I had found this earlier in the process.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> Martin Fox has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Added Swing version of the cascade

The PR is split into two parts. One involves how we set up DirectWrite and is 
required to work-around some egregious glyph shaping bugs. That change alters 
the rendering mode but not the measuring mode so metrics should be the same 
(though with Microsoft one never knows).

BTW, there is already an option that sets up the rendering and measuring modes 
in exactly the same way (prism.subpixeltext=vertical) but it has other effects.

The second part is related to how we render the glyph mask that DirectWrite 
produces. This is independent of the first part.

So should we have two system properties or just one?

I am not opposed to implementing a system property or two particularly if the 
idea is presented based on an informed understanding of the source code after 
public discussion (ahem). This is a substantial change and I think it can only 
be effectively tested in the field (or by someone with twenty different 
monitors and twenty different JavaFX apps and a whole lot of time).

Implementing a property that alters the mask rendering would require adding a 
new shader. I have no experience in this area and do not currently have the 
time to dig into this. If anyone can give me some pointers I would appreciate 
it.

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

PR Comment: https://git.openjdk.org/jfx/pull/2284#issuecomment-5625269418

Reply via email to