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).

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

Commit messages:
 - Upped contrast and adjusted it for white-on-black text
 - Merge remote-tracking branch 'upstream/master' into fontwork
 - Slight tweak to natural/symmetric choice
 - LCD text rendering is sharper and on Windows less likely to create distorted 
glyphs

Changes: https://git.openjdk.org/jfx/pull/2284/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2284&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8090503
  Stats: 73 lines in 3 files changed: 50 ins; 1 del; 22 mod
  Patch: https://git.openjdk.org/jfx/pull/2284.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2284/head:pull/2284

PR: https://git.openjdk.org/jfx/pull/2284

Reply via email to