From: Akihiro Sagawa Subject: [4/5] gdi32: Embolden width direction only if ppem <= 50. (resend) Message-Id: <20151106212306.5DD3.375B48EC@gmail.com> Date: Fri, 06 Nov 2015 21:25:11 +0900 In other words, avoid increasing the thickness of height direction if the size is small. This prevents distorting fonts as in Bug 34884. This feature requires newer FreeType library (2.4.10 and/or later). Signed-off-by: Akihiro Sagawa --- dlls/gdi32/freetype.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 6d0d027..b994ba8 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -166,6 +166,7 @@ MAKE_FUNCPTR(FT_Vector_Length); MAKE_FUNCPTR(FT_Vector_Transform); MAKE_FUNCPTR(FT_Vector_Unit); static FT_Error (*pFT_Outline_Embolden)(FT_Outline *, FT_Pos); +static FT_Error (*pFT_Outline_EmboldenXY)(FT_Outline *, FT_Pos, FT_Pos); static FT_TrueTypeEngineType (*pFT_Get_TrueType_Engine_Type)(FT_Library); #ifdef FT_LCD_FILTER_H static FT_Error (*pFT_Library_SetLcdFilter)(FT_Library, FT_LcdFilter); @@ -4004,6 +4005,7 @@ static BOOL init_freetype(void) #undef LOAD_FUNCPTR /* Don't warn if these ones are missing */ pFT_Outline_Embolden = wine_dlsym(ft_handle, "FT_Outline_Embolden", NULL, 0); + pFT_Outline_EmboldenXY = wine_dlsym(ft_handle, "FT_Outline_EmboldenXY", NULL, 0); pFT_Get_TrueType_Engine_Type = wine_dlsym(ft_handle, "FT_Get_TrueType_Engine_Type", NULL, 0); #ifdef FT_LCD_FILTER_H pFT_Library_SetLcdFilter = wine_dlsym(ft_handle, "FT_Library_SetLcdFilter", NULL, 0); @@ -6315,6 +6317,7 @@ static inline FT_Vector normalize_vector(FT_Vector *vec) static BOOL get_bold_glyph_outline(FT_GlyphSlot glyph, LONG ppem, FT_Glyph_Metrics *metrics) { + const LONG EMBOLDEN_X_THRESHOLD = 50; FT_Error err; FT_Pos strength; FT_BBox bbox; @@ -6324,11 +6327,20 @@ static BOOL get_bold_glyph_outline(FT_GlyphSlot glyph, LONG ppem, FT_Glyph_Metri if(!pFT_Outline_Embolden) return FALSE; - strength = MulDiv(ppem, 1 << 6, 24); - err = pFT_Outline_Embolden(&glyph->outline, strength); - if(err) { - TRACE("FT_Ouline_Embolden returns %d\n", err); - return FALSE; + if(pFT_Outline_EmboldenXY && ppem <= EMBOLDEN_X_THRESHOLD) { + err = pFT_Outline_EmboldenXY(&glyph->outline, 1 << 6, 0); + if(err) { + TRACE("FT_Ouline_EmboldenXY returns %d\n", err); + return FALSE; + } + } + else { + strength = MulDiv(ppem, 1 << 6, 24); + err = pFT_Outline_Embolden(&glyph->outline, strength); + if(err) { + TRACE("FT_Ouline_Embolden returns %d\n", err); + return FALSE; + } } pFT_Outline_Get_CBox(&glyph->outline, &bbox);