On Fri, 28 Aug 2026 18:15:32 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). Hi, I did several experiments in marlin-2d renderer btw 2019 & 2021 to implement proper alpha blending (srgb -> L a b or oklab -> linear and back), only java code (hack). https://github.com/bourgesl/marlin-renderer/blob/unsafe-dev/src%2Fmain%2Fjava%2Forg%2Fmarlin%2Fpipe%2FBlendingContextIntARGBExact.java See my visual comparisons somewhat related to gamma correction vs small detail sharpening... https://bourgesl.github.io/gamma-correction/GRID_FONT.final/index.html PS: As both java2D & javaFX are using (fake) srgb blending that is incorrect for years, all pipelines (sw, d3d, ogl, mtl, vk) are all wrong to match srgb blending! PS2: I can provide math or review your approach... PS3: my color code to make srgb, luma, lab conversions (gpl2): https://github.com/JMMC-OpenDev/jmcs/blob/d6cdde92ccb2dafd9c7a97837491e85e6252102a/src/main/java/fr/jmmc/jmcs/util/ColorUtils.java#L392 Good luck, Laurent ------------- PR Comment: https://git.openjdk.org/jfx/pull/2284#issuecomment-5461080289
