[OpenJDK 2D-Dev] [9] request for review: 8078382: Wrong glyph is displayed for a derived font

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Tue May 31 16:43:30 UTC 2016

On 31.05.16 19:30, Phil Race wrote:
>> The patch changes the order of font selection: bold will be used, if
>> possible, as the base for bold-italic instead of italic which is the
>> current default. It also fixes the issue where italic is returned
>> instead of bold.
> OK. +1

I am not sure but should FontFamily.getClosestStyle() be updated also?:
         case Font.BOLD|Font.ITALIC:
             if (italic != null) {
                 return italic;
             } else if (bold != null) {
                 return bold;
             } else {
                 return plain;

> -phil.
>> Thank you in advance,
>> Alexey
>> On 22.07.2015 19:33, Alexey Ivanov wrote:
>>> Hi Phil,
>>> On 16.07.2015 21:38, Phil Race wrote:
>>>> On 07/16/2015 06:08 AM, Andrew Brygin wrote:
>>>>> Hi Phil,
>>>>>  another option to avoid the problem is to be a bit more specific
>>>>> regarding the
>>>>>  required font when we obtaining  lcd glyph from GDI.
>>>>>  If we specify a particular name of the font which we used to
>>>>> construct the
>>>>>  glyph vector, then we will get glyphs exactly for desired characters:
>>>>> http://cr.openjdk.java.net/~bae/8078382/9/webrev.01/
>>>>>  This change affects only the case of lcd glyphs on windows,
>>>>>  it reduces the scope of required testing.
>>>> This is heading in the direction I was thinking of but since GDI is
>>>> excepting a face name
>>>> (what we call a family name), I am not sure if this will always work
>>>> as is.
>>>> There are possible issues with using a localized name and the length
>>>> of the full name exceeding what Windows allows here.
>>>> And there may be unintended consequences that are not immediately
>>>> obvious.
>>>> I would like to try limit this to the case where we can positively
>>>> identify that the
>>>> font is not the one we expected. And do it cheaply too.
>>>> I do not have a quick answer here but roughly the algorithm might be
>>>> - specify family, check (somehow) if GDI selects the same base font
>>>> - if not, try the facename approach (if the name fits). Did we
>>>> succeed and get the same base font ?
>>>> - if not, bail on GDI for this case and do the rasterisation ourselves.
>>>> "cheaply" might depend on caching a success value on the first
>>>> attempt, so
>>>> that we only do it once, ever, for a font. Then the problem becomes
>>>> how to
>>>> do the verification. One approach might be to call GetFontData() which
>>>> will give us some chunk of the font file and we can see if the name
>>>> (or something
>>>> else we can quickly and reliably parse) is exactly that we expect ..
>>> It looks there's no easy way to detect whether GDI selected the same
>>> base font or not. GetTextFace function doesn't help it: it always
>>> returns the face name passed in LOGFONT except in the cases where
>>> there's no such font.
>>> I haven't found any other API which could tell us what font GDI
>>> selected. So the only alternative is to use GetFontData and parse the
>>> font file itself. Yet I can't find any example how to use this
>>> function. I'll keep searching in that direction.
>>> Regards,
>>> Alexey
>>>> Leaving aside the 'wrong glyph' case, I have to suppose it is
>>>> possible that
>>>> there are other un-noticed cases where we use a different base font
>>>> than
>>>> that selected by GDI. The algorithms are not defined anywhere I can
>>>> locate.
>>>>>  However, there seems to be a copy&paste error in FontFamily.java:
>>>>>  on lines 340 - 341 we check that bold font fits our needs but use
>>>>> italic
>>>>>  anyway. Was it done by purpose, or this is really an error?
>>>> That is  a copy/paste mistake. It should be fixed.
>>>> -phil.
>>>>> Thanks,
>>>>> Andrew
>>>>> On 7/15/2015 7:25 PM, Phil Race wrote:
>>>>>> This probably needs more examination and perhaps a more complex fix.
>>>>>> The observation that GDI bases bold-italic on the bold version not
>>>>>> the
>>>>>> italic version is an implementation choice just as we had done the
>>>>>> opposite. It is possible some other time it does the opposite or some
>>>>>> other platform does the opposite. I have supposed it is harder to
>>>>>> synthesise italic than to do 'over-strike'. And this GDI usage
>>>>>> applies only to LCD glyphs.
>>>>>> Maybe what we need to do is see if we can detect the cases when
>>>>>> GDI and JDK  disagree on the actual font and remap the glyph id.
>>>>>> -phil.
>>>>>> On 7/15/15 4:12 AM, Andrew Brygin wrote:
>>>>>>> Hello,
>>>>>>>  could you please review a fix for 8078382?
>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8078382
>>>>>>> webrev: http://cr.openjdk.java.net/~bae/8078382/9/webrev.00/
>>>>>>>  The problem is caused by following peculiarity of the Code New
>>>>>>>  Roman font: this font provides plain, italic and bold variants.
>>>>>>>  In bold and italic variants of the font, different glyphs
>>>>>>>  correspond to the apostrophe character (0039):
>>>>>>> bold: 0039 -> 0x250 (592)
>>>>>>> italic: 0039 -> 0x256 (598)
>>>>>>>  So, we translate character to glyphs using italic variant
>>>>>>>  of the font, and then request glyph images from GDI.
>>>>>>>  However, GDI uses the bold variant of the font in order
>>>>>>>  to compose glyph images for artificial bold-italic variant,
>>>>>>>  and we have got a glyph image for ® instead of apostrophe.
>>>>>>>  Suggested fix is to select bold variant (if possible) as a
>>>>>>>  base for artificial bold-italic.
>>>>>>>  There is no regression test because it requires a specific font
>>>>>>>  to be installed on a test system. The font can be found here:
>>>>>>>  http://www.dafont.com/code-new-roman.font
>>>>>>> Please take a look.
>>>>>>> Thanks,
>>>>>>> Andrew

Best regards, Sergey.

More information about the 2d-dev mailing list