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

Alexey Ivanov alexey.ivanov at oracle.com
Wed Jun 1 10:22:56 UTC 2016


Hi Sergey,

On 31.05.2016 19:43, Sergey Bylokhov wrote:
> 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;
>             }
>         }
>

Good catch!
The discussion is in progress…


Regards,
Alexey

>>
>> -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
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
>




More information about the 2d-dev mailing list