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