[OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen when fontconfig.properties was used
Ichiroh Takiguchi
takiguc at linux.vnet.ibm.com
Tue Oct 15 11:33:59 UTC 2019
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(SunFontManager.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<takiguc at linux.vnet.ibm.com>
>>> Sent: Montag, 7. Oktober 2019 19:16
>>> To: Langer, Christoph<christoph.langer at sap.com>
>>> Cc: 2d-dev at openjdk.java.net; Zeller, Arno<arno.zeller at 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-bounces at openjdk.java.net> On Behalf Of Ichiroh
>>>>> Takiguchi
>>>>> Sent: Montag, 7. Oktober 2019 09:33
>>>>> To: 2d-dev at 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.
More information about the 2d-dev
mailing list