Yes, a reliable jtreg test seems overly hard for this case. So I'll mark it noreg-hard.

-phil.

On 10/16/18, 12:00 AM, Laurent Bourgès wrote:
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 <mailto: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
    >

Reply via email to