RFR: 8185261: Font fallback sometimes doesn't work in Swing text components [v2]

Dmitry Batrak dbatrak at openjdk.java.net
Mon Feb 21 08:24:53 UTC 2022


On Sun, 6 Feb 2022 19:53:45 GMT, Phil Race <prr at openjdk.org> wrote:

>> Dmitry Batrak has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   remove 'headful' requirement from test case
>
>> As you say, one could possibly also try to compare font2DHandle-s instead,
>  > but that would require forcing the population of that field in equals method,
>> which seems to have larger potential for side effects.
> 
> Yes, I noted this would present even more problems.
> 
>> Of course, there's an alternative method to fix this - make font metrics cache distinguish such fonts explicitly,
>> ....  I believe, would just mean waiting for other trouble in future.
> 
> I was getting at this with my comment
> 
>> I do see that it would be tricky to have some private extra equality testing in the code that finds the right fall back
> 
> But it wasn't (isn't) clear to me without tracking this down if some piece of the implementation is making
> some assumptions it perhaps shouldn't. But yes, very likely not going to work exactly like that.
> 
> 
> Taking a look I think the problem starts with getCompositeFontUIResource()
> 
> So another approach is to define a subclass of FontUIResource in which it over-rides hashCode() and equals()
> and does the extra comparison needed.
> 
> It would only be equal to another  CompositeFontUIResource with the same base font
> 
> sun.font.CompositeFontUIResource extends FontUIResource { ...
> 
> public void boolean equals(Object o) {
>    return (o instanceof  CompositeFontUIResource && super.equals(o);
> }
> 
> Then in sun.font.FontUtilities we add
>       if (compFont == null) {
>             compFont = new CompositeFont(physicalFont, dialog2D);
>             compMap.put(physicalFont, compFont);
>         }
> +     fuir = new CompositeFontUIResource(font);
>         FontAccess.getFontAccess().setFont2D(fuir, compFont.handle);
> 
> Ah but this won't work if we are mixing Font and this sub-class since equals then won't be symmetric .. 
> 
> The explanation about JCK indicates that JCK could also obtain a font from Swing that has fallbacks,
> serialize it and on deserialization currently it would be equal but after this fix it would not.
> So I don't see the difference except that there (presumably) happens not to be a JCK test for this scenario ...
> However since JCK isn't part of OpenJDK I don't think we can discuss it any further here.

@prrace Any chance of looking at this?

-------------

PR: https://git.openjdk.java.net/jdk/pull/7313



More information about the client-libs-dev mailing list