Hi Phil, Type 1 fonts were available but got skipped.
/Christoph > -----Original Message----- > From: Phil Race <philip.r...@oracle.com> > Sent: Donnerstag, 19. Dezember 2019 20:58 > To: Langer, Christoph <christoph.lan...@sap.com>; Ichiroh Takiguchi > <taki...@linux.vnet.ibm.com> > Cc: 2d-dev@openjdk.java.net > Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen > when fontconfig.properties was used > > Hi, > > > If this can get reviewed, I intend to push this fix to JDK14. > > Not for 14. This will take some time to review and test and is too risky at > this > stage. > > You say no TrueType fonts are installed, does that mean there are no > scaleable fonts at all, > or are there Type 1 fonts we are skipping over ? > > -phil. > > > > On 12/18/19 6:31 AM, Langer, Christoph wrote: > > Hi, > > > > sorry for the long time that it took me to come back to this item. > > > > I eventually spent quite a significant amount of time analyzing what's going > wrong here. At least, I have a few AIX LPARs, where we would always > encounter this type of Exception: > > > > Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: > class sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont > (sun.font.CompositeFont and sun.font.PhysicalFont are in module > java.desktop of loader 'bootstrap') > > at > java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontMa > nager.java:1081) > > at > java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontMan > ager.java:960) > > at > java.desktop/sun.font.SunFontManager.findOtherDeferredFont(SunFontM > anager.java:898) > > at > java.desktop/sun.font.SunFontManager.findDeferredFont(SunFontManager > .java:914) > > at > java.desktop/sun.font.SunFontManager.findFont2D(SunFontManager.java:2 > 105) > > ... > > > > The problem on our systems is triggered by two factors. First is that the > font configuration file contains paths to font files that don't exist. > Secondly, > the system's fontconfig has no TrueType Fonts installed. Now, during loading > of fonts, it goes over these non-existing font files and tries to mark their > initialization in sun.font.SunFontManager::initialiseDeferredFont(String > fileNameKey) by adding the key into the initialisedFonts map. Since there is > no font handle available because the font couldn't be loaded but the map's > value must not be null, it wants to use the handle of the default physical > font. So, calling getDefaultPhysicalFont at this place triggers findFont2D and > then recursive calls into > initialiseDeferredFont/getDefaultPhysicalFont/findFont2D until a matching > default physical font was loaded. But it's quite indeterministic which font is > returned at what place in findFont2D when the recursion is unwinded, so this > ClassCastException occurs. > > > > I propose to fix this by adding a "NULL FONT HANDLE" to use in > initialisedFonts for fonts that canโt be loaded. This will remove the > recursion > during loading of fonts. And afterwards a default physical font can then still > be resolved, even if our font configuration contains less fonts (no true type > fonts). > > > > In my change I also add small improvements to the exception cases when > trying to load non-existent true type fonts and to method > getDefaultPhysicalFont. > > > > The test exercises font loading and it would demonstrate the issue without > the fix on several of our AIX systems. > > > > Here is the webrev: > http://cr.openjdk.java.net/~clanger/webrevs/8221741.0/ > > > > @Ichiroh-san: Can you test this fix in your environment and let me know if > it fixes your issue? > > > > I'll run a full platform test here at SAP, including JDK11. > > > > If this can get reviewed, I intend to push this fix to JDK14. > > > > Thanks & Best regards > > Christoph > > > >> -----Original Message----- > >> From: Phil Race <philip.r...@oracle.com> > >> Sent: Mittwoch, 30. Oktober 2019 17:07 > >> To: Langer, Christoph <christoph.lan...@sap.com>; Ichiroh Takiguchi > >> <taki...@linux.vnet.ibm.com> > >> Cc: 2d-dev@openjdk.java.net; Zeller, Arno <arno.zel...@sap.com> > >> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen > >> when fontconfig.properties was used > >> > >> Yes probably best if this is reviewed and approved by someone who > >> has access to AIX. I have no idea if the XLFDs are even correct ... > >> > >> -phil. > >> > >> On 10/30/19 8:00 AM, Langer, Christoph wrote: > >>> Hi Ichiroh, > >>> > >>> I'm currently observing a test issue on one of our AIX boxes with that > patch > >> in place. Please give me some time to have a closer look... > >>> Best regards > >>> Christoph > >>> > >>>> -----Original Message----- > >>>> From: 2d-dev <2d-dev-boun...@openjdk.java.net> On Behalf Of > Ichiroh > >>>> Takiguchi > >>>> Sent: Montag, 28. Oktober 2019 17:59 > >>>> To: Philip Race <philip.r...@oracle.com> > >>>> Cc: 2d-dev@openjdk.java.net; Zeller, Arno <arno.zel...@sap.com> > >>>> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException > happen > >>>> when fontconfig.properties was used > >>>> > >>>> Hello Phil and other reviewers. > >>>> > >>>> I appreciate if you give me your comment and suggestion. > >>>> > >>>> Thanks, > >>>> Ichiroh Takiguchi > >>>> > >>>> On 2019-10-15 20:33, Ichiroh Takiguchi wrote: > >>>>> Hello Phil. > >>>>> > >>>>> Sorry for bad response. > >>>>> > >>>>> AIX is following case, but physical font is not defined by default. > >>>>>> If you have fonts installed and have a custom fontconfig.properties > >>>>>> file for AIX > >>>>>> which references those, then you should be able to get a default > font > >>>>>> from that > >>>>>> set of known existent physical fonts. > >>>>> Please try following steps to emulate same kind this on linux (RHEL7). > >>>>> 1. Download DefaultFontTestA.java and fontconfig.properties files > >>>>> Please modify fontconfig.properties if c0419bt_.pfb is not in > >>>>> /usr/share/X11/fonts/Type1 directory. > >>>>> > >>>>> 2. Compile and run with following options and environment variable. > >>>>> $ javac --add-exports java.desktop/sun.font=ALL-UNNAMED > >>>>> DefaultFontTestA.java > >>>>> $ USE_J2D_FONTCONFIG=no java --add-opens > >>>>> java.desktop/sun.font=ALL-UNNAMED > >>>>> -Dsun.awt.fontconfigfontconfig.properties DefaultFontTestA > >>>>> defaultFontName=Dialog > >>>>> defaultFontFileName=/dialog.ttf > >>>>> Exception in thread "main" java.lang.ClassCastException: class > >>>>> sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont > >>>>> (sun.font.CompositeFont and sun.font.PhysicalFont are in module > >>>>> java.desktop of loader 'bootstrap') > >>>>> at > >>>>> > >> > java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontMa > >>>> nager.java:1081) > >>>>> at DefaultFontTestA.main(DefaultFontTestA.java:48) > >>>>> > >>>>> Font2D font2d = > >>>>> findFont2D(getDefaultFontFaceName(), Font.PLAIN, > >>>>> NO_FALLBACK); > >>>>> Note: > >>>>> USE_J2D_FONTCONFIG is defined into > >>>>> src/java.desktop/unix/native/common/awt/fontpath.c > >>>>> Dialog and /dialog.ttf are defined into > >>>>> src/java.desktop/unix/classes/sun/awt/FcFontManager.java > >>>>> > >>>>> getDefaultFontFaceName returns defaultFontName, it's "Dialog". > >>>>> findFont2D() returns Dialog CompositeFont instead of physical font. > >>>>> I think we cannot control return value for > >>>>> physicalFonts.values().iterator(); > >>>>> "defaultPhysicalFont = ((CompositeFont) font2d).getSlotFont(0);" is > >>>>> useful. > >>>>> > >>>>> Please give me your comment. > >>>>> > >>>>> Thanks, > >>>>> Ichiroh Takiguchi > >>>>> > >>>>> On 2019-10-09 01:06, Philip Race wrote: > >>>>>> I think this needs a little bit more explanation first. > >>>>>> Systems without fontconfig ... meaning without libfontconfig. > >>>>>> So does that mean you just can't find fonts or have none installed ? > >>>>>> If you have fonts installed and have a custom fontconfig.properties > >>>>>> file for AIX > >>>>>> which references those, then you should be able to get a default > font > >>>>>> from that > >>>>>> set of known existent physical fonts. > >>>>>> > >>>>>> If you have neither .. then you have a system configuration problem > >>>>>> and without > >>>>>> a physical font installed avoiding an exception here isn't really > >>>>>> going to help you > >>>>>> get much further. Perhaps we should throw InternalError a bit > earlier. > >>>>>> I see no point in trying to survive .. > >>>>>> > >>>>>> -phil > >>>>>> > >>>>>> > >>>>>> On 10/8/19, 12:35 AM, Langer, Christoph wrote: > >>>>>>> Hi Ichiroh, > >>>>>>> > >>>>>>> thanks for the update. It looks good to me. I'll run it through test > >>>>>>> system tonight and let you know if we see issues by tomorrow. > >> Should > >>>>>>> you not hear back from me, consider it as reviewed and tested ๐ > >>>>>>> > >>>>>>> Thanks > >>>>>>> Christoph > >>>>>>> > >>>>>>>> -----Original Message----- > >>>>>>>> From: Ichiroh Takiguchi<taki...@linux.vnet.ibm.com> > >>>>>>>> Sent: Montag, 7. Oktober 2019 19:16 > >>>>>>>> To: Langer, Christoph<christoph.lan...@sap.com> > >>>>>>>> Cc: 2d-dev@openjdk.java.net; Zeller, > Arno<arno.zel...@sap.com> > >>>>>>>> Subject: RE: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException > >>>> happen > >>>>>>>> when fontconfig.properties was used > >>>>>>>> > >>>>>>>> Hello Christoph. > >>>>>>>> > >>>>>>>> I appreciate your suggestion. > >>>>>>>> JTreg testcase could throw ClassCastException instead of > >>>>>>>> InvocationTargetException. > >>>>>>>> JTreg results were in JDK-8221741 > >>>>>>>> > >>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8221741 > >>>>>>>> Change: > >> https://cr.openjdk.java.net/~itakiguchi/8221741/webrev.05/ > >>>>>>>> Could you review the fix ? > >>>>>>>> > >>>>>>>> Thanks, > >>>>>>>> Ichiroh Takiguchi > >>>>>>>> IBM Japan, Ltd. > >>>>>>>> > >>>>>>>> On 2019-10-07 22:53, Langer, Christoph wrote: > >>>>>>>>> Hi Ichiroh, > >>>>>>>>> > >>>>>>>>> this is great, thanks for doing this. We regularly see this and > >>>>>>>>> just > >>>>>>>>> stumbled over it the other day where the fontconfig of our test > >>>>>>>>> user > >>>>>>>>> was corrupted somehow. > >>>>>>>>> > >>>>>>>>> As for the test, I would reduce the amount of reflection a little > >>>>>>>>> bit. > >>>>>>>>> It should not be necessary to access SunFontManager via > >>>>>>>>> Class.forName, > >>>>>>>>> you already exported it to the test via the @modules statement. > >> You > >>>>>>>>> can probably use this coding (please try as I didn't test it๐): > >>>>>>>>> > >>>>>>>>> SunFontManager sfm = SunFontManager.getInstance(); > >>>>>>>>> Field defaultFontName_fid = > >>>>>>>>> SunFontManager.class.getDeclaredField("defaultFontName"); > >>>>>>>>> defaultFontName_fid.setAccessible(true); > >>>>>>>>> defaultFontName_fid.set(sfm, "Dialog"); > >>>>>>>>> Method loadFonts_mid = > >>>>>>>>> SunFontManager.class.getDeclaredMethod("loadFonts"); > >>>>>>>>> loadFonts_mid.setAccessible(true); > >>>>>>>>> loadFonts_mid.invoke(sfm); > >>>>>>>>> PhysicalFont physicalFont = sfm.getDefaultPhysicalFont(); > >>>>>>>>> System.out.println(physicalFont); > >>>>>>>>> > >>>>>>>>> If you want, I can run your (updated) patch through our test > >>>>>>>>> system. > >>>>>>>>> > >>>>>>>>> Thanks > >>>>>>>>> Christoph > >>>>>>>>> > >>>>>>>>> > >>>>>>>>>> -----Original Message----- > >>>>>>>>>> From: 2d-dev<2d-dev-boun...@openjdk.java.net> On Behalf > Of > >>>>>>>>>> Ichiroh > >>>>>>>>>> Takiguchi > >>>>>>>>>> Sent: Montag, 7. Oktober 2019 09:33 > >>>>>>>>>> To: 2d-dev@openjdk.java.net > >>>>>>>>>> Subject: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException > >> happen > >>>>>>>> when > >>>>>>>>>> fontconfig.properties was used > >>>>>>>>>> > >>>>>>>>>> Hello. > >>>>>>>>>> > >>>>>>>>>> Could you review the fix ? > >>>>>>>>>> > >>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8221741 > >>>>>>>>>> Change: > >>>> https://cr.openjdk.java.net/~itakiguchi/8221741/webrev.04/ > >>>>>>>>>> JTreg testcase and results are including JDK-8221741 [1]. > >>>>>>>>>> > >>>>>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8221741 > >>>>>>>>>> > >>>>>>>>>> Thanks, > >>>>>>>>>> Ichiroh Takiguchi > >>>>>>>>>> IBM Japan, Ltd.