Bug 94836

Summary: Wrong text size when using HFONT with appropriate size
Product: cairo Reporter: Fred <fredbca21>
Component: win32 backendAssignee: cairo-bugs mailing list <cairo-bugs>
Status: RESOLVED MOVED QA Contact: cairo-bugs mailing list <cairo-bugs>
Severity: major    
Priority: medium    
Version: 1.12.14   
Hardware: All   
OS: Windows (All)   
Whiteboard:
i915 platform: i915 features:
Bug Depends on:    
Bug Blocks: 84197    

Description Fred 2016-04-06 08:23:41 UTC
I have noticed a bug in the win32 font backend. When setting the font on a win32 surface with the code below and using the same size as the original HFONT for drawing, the resulting font size is extremely small (text is almost invisible).

// assuming my_hfont was created with -12 for LOGFONT.lfHeight
cairo_font_face_t* font_face=cairo_win32_font_face_create_for_hfont(my_hfont);
cairo_set_font_face(ctx,font_face);
cairo_set_font_size(ctx,12);

The reason is that in _cairo_win32_font_face_scaled_font_create, the font matrix is checked against -font_face->logfont.lfHeight whereas if you look in _win32_scaled_font_get_scaled_hfont, the expected height should be multiplied by WIN32_FONT_LOGICAL_SCALE (scaled HFONT created by cairo uses logfont.lfHeight = -scaled_font->logical_size)

This means that using anything else than 1 for WIN32_FONT_LOGICAL_SCALE will result in a downscaled font when using a HFONT that was created with the right size.

However, if the check mentioned above is fixed, in order to have cairo use the original HFONT, it should be created with a much larger size (-WIN32_FONT_LOGICAL_SCALE*size). So this defeats the purpose of being able to mix native win32 fonts with cairo because of this scaling factor (mixing native and cairo code would require extra scaling everywhere).

After reading older discussions about the WIN32_FONT_LOGICAL_SCALE factor, it seems to me that the actual problem lies in the fact that the win32 backend uses fonts that are expected to be created with the logical scale, instead of using fonts with the appropriate size and applying the logical scale to the World Transform only.

See scaled font creation here:
static cairo_status_t
_win32_scaled_font_get_scaled_hfont (cairo_win32_scaled_font_t *scaled_font,
    HFONT *hfont_out)
{
    if (!scaled_font->scaled_hfont) {
LOGFONTW logfont = scaled_font->logfont;
logfont.lfHeight = -scaled_font->logical_size; // using the logical
size to create the font - why not use the actual size and scale in the world transform?
Comment 1 GitLab Migration User 2018-08-25 13:25:53 UTC
-- GitLab Migration Automatic Message --

This bug has been migrated to freedesktop.org's GitLab instance and has been closed from further activity.

You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.freedesktop.org/cairo/cairo/issues/3.

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.