Phil, I tested John's patch sucessfully, it is complicated to write a jtreg Test...
OK for me as it is. Laurent Le mar. 16 oct. 2018 à 08:40, Philip Race <philip.r...@oracle.com> a écrit : > I intend to push this with myself & Laurent as reviewers. > > OK by all ? > > -phil. > > On 10/11/18, 12:22 PM, Phil Race wrote: > > Very well done analysis of the options and very thorough testing of > > the effects > > on the different libraries/platforms. > > > > > > > There are some alternatives to setting the filter: > > > • Bundle the FreeType library by default > > > > Although the build makes this easy to set as an option, we decided we > > prefer to > > use the platform library on Linux - and Solaris for that matter - in > > our releases. > > > > So setting this option is going to be needed for some years to come, > > until > > even a Linux current release like Ubuntu 18.04 is obsolete. > > > > We can't re-use the OpenJavaFX bug ID, and surprisingly I can't find > > an open > > bug on this for 2D. So I've submitted > > https://bugs.openjdk.java.net/browse/JDK-8212071 > > > > And I've attached John's images to the bug report and pasted his email > > in there. > > > > > > > > -phil. > > > > > > On 10/11/2018 10:56 AM, John Neffenger wrote: > >> On 10/10/2018 11:15 AM, Laurent Bourgès wrote: > >>> It looks awesome & promising. > >> > >> Thank you, Laurent, for looking into it so quickly! > >> > >>> PS: It is better to send plain text (long) email than sending > >>> external links (github). > >> > >> Thanks for the tip. Right, Web pages and repositories can be deleted, > >> so here it is, for the record ... > >> > >> The symptoms of the problem are the same as in the link below, but > >> they appear in AWT and Swing applications instead of JavaFX > >> applications. > >> > >> JDK-8188810: Fonts are blurry on Ubuntu 16.04 and Debian 9 > >> https://bugs.openjdk.java.net/browse/JDK-8188810 > >> > >> The description of the problem on the Java side follows. > >> > >> Synopsis: Reduce color fringes in FreeType subpixel rendering > >> > >> The text in Java applications often has severe color fringes when > >> using OpenJDK on Ubuntu and other Debian-based distributions because > >> the JDK fails to set the LCD filter. Adding two lines of code to the > >> file freetypeScaler.c fixed the problem in my tests, without any > >> regression errors for other Linux distributions. The patch is > >> attached to this message as the file freetypeScaler.diff. > >> > >> There are some alternatives to setting the filter: > >> > >> • Bundle the FreeType library by default and always use the new > >> Harmony subpixel rendering technique. This option removes the > >> uncertainty in the library at the expense of an additional 4.6 > >> megabytes to the installed size — an increase of less than one > >> percent. OpenJDK 12 even includes the latest FreeType 2.9.1, a newer > >> version than the one found on most systems. > >> > >> • Wait another year and see what changes are made to FreeType, if > >> any, when the ClearType patents expire. This option, though, doesn’t > >> solve the problem that users of Ubuntu and other Debian-based > >> distributions have now. > >> > >> The problem originates in decisions made by the developers of > >> FreeType, Debian, Fedora, and OpenJDK concerning the Microsoft > >> ClearType patents [1]. > >> > >> • In 2007, FreeType 2.3.0 added a compiler configuration macro to > >> the file ftoption.h named FT_CONFIG_OPTION_SUBPIXEL_RENDERING. If > >> defined, the FreeType library includes patented ClearType techniques > >> in its subpixel rendering. > >> > >> But there’s a catch. When the ClearType methods are enabled, the > >> subpixel rendering is not filtered, which results in severe color > >> fringes. Clients of the FreeType library must make an explicit call > >> to the function FT_Library_SetLcdFilter to apply color filtering. The > >> filter was disabled by default, explained one of its authors, “to > >> avoid major surprises to existing clients, including libXft and Cairo > >> which already perform some wacky color filtering on top of FreeType.” > >> > >> • In 2009, Debian created a patch to FreeType 2.3.9, named > >> enable-subpixel-rendering.patch, that defines the macro and enables > >> ClearType-style rendering. The change log states, “This is considered > >> no more or less evil than the bytecode interpreter which we also > >> enable.” Ubuntu, based on Debian, applies the patch as well. Fedora > >> created the same patch in 2007, named > >> freetype-2.3.0-enable-spr.patch, but does not apply the patch by > >> default. > >> > >> • In 2017, FreeType 2.8.1 included a new subpixel rendering > >> technique, called Harmony, that is nearly identical in output to the > >> ClearType technique but uses a different algorithm, avoiding the > >> patents. FreeType now uses Harmony subpixel rendering when the > >> ClearType methods are disabled, with no need for clients to set the > >> LCD filter. (This would have been a good time for Debian to remove > >> its subpixel rendering patch.) The latest Fedora Workstation 28 runs > >> FreeType 2.8.0, which does not include Harmony. > >> > >> • In 2019, the Microsoft ClearType patents expire. > >> > >> So now we have two variants of the FreeType library: one that > >> requires a function call to set the LCD filter in Ubuntu and other > >> distributions based on Debian, and another that doesn’t require the > >> function call in Red Hat Enterprise Linux, Oracle Linux, and other > >> distributions based on Fedora. > >> > >> To demonstrate the problem, I built four versions of the JDK from the > >> latest OpenJDK sources. I built a version that uses the system > >> FreeType library and another that uses the bundled FreeType library. > >> Then I changed the OpenJDK code to set the default LCD filter and > >> built the two versions again. The four builds were named: > >> > >> jdk-12-system-lcdnone > >> jdk-12-system-lcddefault > >> jdk-12-bundled-lcdnone > >> jdk-12-bundled-lcddefault > >> > >> The system library is FreeType 2.8.1 in Ubuntu 18.04.1 LTS, which has > >> the Debian patch applied (ClearType methods enabled), while the > >> bundled library is FreeType 2.9.1 in OpenJDK 12, which uses the > >> library default (ClearType methods disabled). I wrote a simple Java > >> Swing application called FontDemo [2] that displays two text areas > >> with the Adobe Source Code Pro font [3] in TTF and OTF formats (the > >> latest non-variable download). > >> > >> The results are shown in the two images attached to this message: > >> > >> fontdemo.png > >> Three screenshots of the FontDemo program > >> > >> fontdemo-detail.png > >> Details from the screenshots scaled by 800 percent > >> > >> When using the Ubuntu system FreeType library, setting the LCD filter > >> is critical. The screenshots show the ClearType-style rendering > >> without setting the LCD filter, and after adding the change to set > >> the filter. The ClearType configuration macro is defined in the > >> Ubuntu build of FreeType, so the function to set the filter returns > >> success (0) when called and applies color filtering. > >> > >> When using the OpenJDK bundled FreeType library, setting the LCD > >> filter does nothing. The screenshots show the FreeType Harmony > >> rendering, which is the same whether or not the LCD filter is set. > >> The ClearType configuration macro is not defined in the OpenJDK build > >> of FreeType, so the function to set the filter returns > >> FT_Err_Unimplemented_Feature (7) when called and does nothing. > >> > >> The test system I used is a QEMU/KVM guest virtual machine running > >> Ubuntu 18.04.1 LTS (Bionic Beaver) with the details shown below. The > >> display is a 27-inch Dell UltraSharp U2717D monitor with a resolution > >> of 2560 × 1440 pixels at 109 pixels per inch. > >> > >> ubuntu@bionic:~$ uname -a > >> Linux bionic 4.15.0-36-generic #39-Ubuntu SMP > >> Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux > >> > >> ubuntu@bionic:~$ ldd --version > >> ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27 > >> > >> ubuntu@bionic:~$ getconf GNU_LIBPTHREAD_VERSION > >> NPTL 2.27 > >> > >> ubuntu@bionic:~$ $HOME/opt/jdk-12-system-lcdnone/bin/java -version > >> openjdk version "12-internal" 2019-03-19 > >> OpenJDK Runtime Environment (build 12-internal+0-adhoc.ubuntu.jdk) > >> OpenJDK 64-Bit Server VM (build 12-internal+0-adhoc.ubuntu.jdk, mixed > >> mode) > >> > >> Below are the full test results using five versions of FreeType built > >> first with the ClearType methods disabled (the default) and then > >> again with them enabled. I ran all 10 libraries under OpenJDK 12, > >> first with no LCD filter and then again after adding the code to set > >> the default LCD filter. > >> > >> No LCD Filter > >> > >> 2008 FreeType 2.3.5 (libfreetype.so.6.3.16) in Ubuntu 8.04 LTS > >> ClearType Off: Grayscale, ClearType On: Mild fringes > >> > >> 2014 FreeType 2.5.2 (libfreetype.so.6.11.1) in Ubuntu 14.04 LTS > >> ClearType Off: Grayscale, ClearType On: Severe fringes > >> > >> 2016 FreeType 2.6.1 (libfreetype.so.6.12.1) in Ubuntu 16.04 LTS > >> ClearType Off: Grayscale, ClearType On: Severe fringes > >> > >> 2018 FreeType 2.8.1 (libfreetype.so.6.15.0) in Ubuntu 18.04 LTS > >> ClearType Off: Harmony, ClearType On: Severe fringes > >> > >> 2019 FreeType 2.9.1 (libfreetype.so.6.16.1) in OpenJDK 12 > >> ClearType Off: Harmony, ClearType On: Severe fringes > >> > >> The OpenJDK does not set the FreeType LCD filter, so there are severe > >> color fringes when using a FreeType library built with the ClearType > >> methods enabled. The only reason the older FreeType 2.3.5 shows mild > >> color fringes is because it uses full hinting, so the glyphs are > >> simply too skinny to see their colors. > >> > >> Default LCD Filter > >> > >> 2008 FreeType 2.3.5 (libfreetype.so.6.3.16) in Ubuntu 8.04 LTS > >> ClearType Off: Grayscale, ClearType On: ClearType filtered > >> > >> 2014 FreeType 2.5.2 (libfreetype.so.6.11.1) in Ubuntu 14.04 LTS > >> ClearType Off: Grayscale, ClearType On: ClearType filtered > >> > >> 2016 FreeType 2.6.1 (libfreetype.so.6.12.1) in Ubuntu 16.04 LTS > >> ClearType Off: Grayscale, ClearType On: ClearType filtered > >> > >> 2018 FreeType 2.8.1 (libfreetype.so.6.15.0) in Ubuntu 18.04 LTS > >> ClearType Off: Harmony, ClearType On: ClearType filtered > >> > >> 2019 FreeType 2.9.1 (libfreetype.so.6.16.1) in OpenJDK 12 > >> ClearType Off: Harmony, ClearType On: ClearType filtered > >> > >> After changing the OpenJDK to set the default LCD filter, there is no > >> version of the FreeType library that shows the severe color fringes. > >> Note that Fedora Workstation 28 includes FreeType 2.8.0 with the > >> ClearType methods disabled, so it displays grayscale anti-aliasing > >> for the OpenJDK whether it sets the LCD filter or not. (FreeType > >> 2.8.0 does not include Harmony.) > >> > >> For background information on LCD filters see Section 2.2.1 [4] of > >> The Raster Tragedy at Low-Resolution, which has an interactive > >> demonstration of the filters used in ClearType (Microsoft), CoolType > >> (Adobe), FreeType (open source), and Quartz 2D (Apple). Hover your > >> mouse over each of the samples in the illustration to remove the filter. > >> > >> Below is the relevant section of the file ftoption.h in FreeType > >> 2.9.1 bundled with OpenJDK 12, edited for formatting: > >> > >> java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h > >> > >> /* > >> Uncomment the line below if you want to activate LCD rendering > >> technology similar to ClearType in this build of the library. This > >> technology triples the resolution in the direction color subpixels. > >> To mitigate color fringes inherent to this technology, you also need > >> to explicitly set up LCD filtering. > >> > >> Note that this feature is covered by several Microsoft patents > >> and should not be activated in any default build of the library. > >> When this macro is not defined, FreeType offers alternative LCD > >> rendering technology that produces excellent output without LCD > >> filtering. > >> */ > >> /* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ > >> > >> [1] http://david.freetype.org/cleartype-patents.html > >> [2] > >> > https://github.com/jgneff/openjdk-freetype/blob/master/src/org/status6/FontDemo.java > >> [3] https://github.com/adobe-fonts/source-code-pro > >> [4] http://rastertragedy.com/RTRCh2.htm#Sec21 > > >