On Thu, 24 Sep 2026 16:33:09 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: > > LCD rendering option is now increasecontrast modules/javafx.graphics/src/main/java/com/sun/javafx/font/PrismFontFactory.java line 135: > 133: lcdEnabled = lcdProp.equals("true"); > 134: String lcdRenderProp = System.getProperty("prism.lcdrendering", > "default"); > 135: contrastLCDRendering = lcdEnabled && > lcdRenderProp.equals("increasecontrast"); Please update the description to explain how this feature can be enabled (and the fact that `prism.lcdrendering=increasecontrast` also requires `prism.lcdtext=true`. Should we start documenting the system properties in the `/doc-files` ? modules/javafx.graphics/src/main/java/com/sun/prism/impl/ps/BaseShaderGraphics.java line 2123: > 2121: (float)Math.pow(selectColor.getGreen(), > invgamma), > 2122: (float)Math.pow(selectColor.getBlue(), > invgamma), > 2123: (float)selectColor.getAlpha()); the existing shader still applies inverse gamma at PaintTextureSecondPassLCD.jsl L116. also, this change seems to ignore `useContrast` logic modules/javafx.graphics/src/main/jsl-prism/PaintTextureSecondPassLCDNew.jsl line 70: > 68: float3 w = float3(0.21, 0.72, 0.07); > 69: float srcLightness = dot(c.rgb, w); > 70: float dstLightness = dot(dstClr.rgb, w); `dstClr.rgb` is linearized later on L128 - could this adjust the contrast incorrectly? ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/2284#discussion_r4406957180 PR Review Comment: https://git.openjdk.org/jfx/pull/2284#discussion_r4406798351 PR Review Comment: https://git.openjdk.org/jfx/pull/2284#discussion_r4406896272
