Font bug with minimal fonts installed

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Font bug with minimal fonts installed

Mario Torre-6
I have a weird issue with fonts in RHEL (and that means likely means
all derivative, like CentOS and Oracle Linux), although it appears
that the same issue can be replicated on a Fedora 26.

The issue is this one, in case you want to see more details:

https://bugzilla.redhat.com/show_bug.cgi?id=1484079

From what I can see, basically in this weird setting with no fonts
installed except the bare minimum required and this STIX font package,
the font subsystem fails to initialise properly. STIX fonts are open
type but are CFF format, so they are skipped during the first round of
initialisation.

What I can't fully get though is why they are still used by default
when simply asking for a SanSerif font:

Font font = new Font("SansSerif", Font.PLAIN, 12);

I can see the font code (in fontpath.c) reading this font information
and then skipping it, at the end it still creates an array with 0
elements (the native method is created with includeFallbacks true, but
there's no fallback, so the array is 0 length), which causes the
exception in the original report (or some variation of it, but they
are basically all the same):

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75)
    at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93)
    at sun.font.Font2D.getFontMetrics(Font2D.java:415)
    at java.awt.Font.defaultLineMetrics(Font.java:2176)
    at java.awt.Font.getLineMetrics(Font.java:2283)
    at java.awt.font.TextLayout.fastInit(TextLayout.java:598)
    at java.awt.font.TextLayout.<init>(TextLayout.java:393)
    at TestJava.main(TestJava.java:15)

I suspect there's an actual bug in this logic and we shouldn't try to
access the font (perhaps in the java side) if fontCount, is 0, but I'm
not entirely sure.

A quick workaround is to just scan also CFF, it seems correct to me
anyway, although maybe the correct check should go after TrueType and
not after Type1, but I left this Linux specific.

I would like some comment before I go ahead and create an OpenJDK bug
report, perhaps I'm just confused and I'm looking in the wrong place.
The following patch was taken from a 8u-dev in case you want to try
it, and I suggest using a throwaway VM since uninstalling all the
fonts is guaranteed to mess your setup :)

There is a full attached test case in the bug report, but I can paste
it in the email if you can't look at the link.

diff -r e96c4a40fdf9 src/solaris/native/sun/awt/fontpath.c
--- a/src/solaris/native/sun/awt/fontpath.c     Wed Aug 23 14:14:49 2017 -0400
+++ b/src/solaris/native/sun/awt/fontpath.c     Thu Aug 24 12:14:41 2017 -0400
@@ -1239,6 +1239,7 @@
                 && (strcmp((char*)fontformat, "TrueType") != 0)
 #if defined(__linux__) || defined(_AIX)
                 && (strcmp((char*)fontformat, "Type 1") != 0)
+                && (strcmp((char*)fontformat, "CFF") != 0)
 #endif
              ) {
                 continue;

Cheers,
Mario
Reply | Threaded
Open this post in threaded view
|

Re: Font bug with minimal fonts installed

Mario Torre-6
Any ideas or suggestion?

Mario

On Thu, Aug 31, 2017 at 1:54 PM, Mario Torre <[hidden email]> wrote:

> I have a weird issue with fonts in RHEL (and that means likely means
> all derivative, like CentOS and Oracle Linux), although it appears
> that the same issue can be replicated on a Fedora 26.
>
> The issue is this one, in case you want to see more details:
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1484079
>
> From what I can see, basically in this weird setting with no fonts
> installed except the bare minimum required and this STIX font package,
> the font subsystem fails to initialise properly. STIX fonts are open
> type but are CFF format, so they are skipped during the first round of
> initialisation.
>
> What I can't fully get though is why they are still used by default
> when simply asking for a SanSerif font:
>
> Font font = new Font("SansSerif", Font.PLAIN, 12);
>
> I can see the font code (in fontpath.c) reading this font information
> and then skipping it, at the end it still creates an array with 0
> elements (the native method is created with includeFallbacks true, but
> there's no fallback, so the array is 0 length), which causes the
> exception in the original report (or some variation of it, but they
> are basically all the same):
>
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
>     at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75)
>     at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93)
>     at sun.font.Font2D.getFontMetrics(Font2D.java:415)
>     at java.awt.Font.defaultLineMetrics(Font.java:2176)
>     at java.awt.Font.getLineMetrics(Font.java:2283)
>     at java.awt.font.TextLayout.fastInit(TextLayout.java:598)
>     at java.awt.font.TextLayout.<init>(TextLayout.java:393)
>     at TestJava.main(TestJava.java:15)
>
> I suspect there's an actual bug in this logic and we shouldn't try to
> access the font (perhaps in the java side) if fontCount, is 0, but I'm
> not entirely sure.
>
> A quick workaround is to just scan also CFF, it seems correct to me
> anyway, although maybe the correct check should go after TrueType and
> not after Type1, but I left this Linux specific.
>
> I would like some comment before I go ahead and create an OpenJDK bug
> report, perhaps I'm just confused and I'm looking in the wrong place.
> The following patch was taken from a 8u-dev in case you want to try
> it, and I suggest using a throwaway VM since uninstalling all the
> fonts is guaranteed to mess your setup :)
>
> There is a full attached test case in the bug report, but I can paste
> it in the email if you can't look at the link.
>
> diff -r e96c4a40fdf9 src/solaris/native/sun/awt/fontpath.c
> --- a/src/solaris/native/sun/awt/fontpath.c     Wed Aug 23 14:14:49 2017 -0400
> +++ b/src/solaris/native/sun/awt/fontpath.c     Thu Aug 24 12:14:41 2017 -0400
> @@ -1239,6 +1239,7 @@
>                  && (strcmp((char*)fontformat, "TrueType") != 0)
>  #if defined(__linux__) || defined(_AIX)
>                  && (strcmp((char*)fontformat, "Type 1") != 0)
> +                && (strcmp((char*)fontformat, "CFF") != 0)
>  #endif
>               ) {
>                  continue;
>
> Cheers,
> Mario