[OpenJDK 2D-Dev] Setting the FreeType LCD filter
Phil Race
philip.race at oracle.com
Thu Oct 11 19:22:03 UTC 2018
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 at 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 at bionic:~$ ldd --version
> ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
>
> ubuntu at bionic:~$ getconf GNU_LIBPTHREAD_VERSION
> NPTL 2.27
>
> ubuntu at 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
More information about the 2d-dev
mailing list