Akihiro Sagawa : gdi32: Implement synthesizing bold glyphs for bitmap fonts.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jan 15 10:48:55 CST 2016
Module: wine
Branch: master
Commit: a8d426e93a735a89c3116207d44b1fd4a82b2fd5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8d426e93a735a89c3116207d44b1fd4a82b2fd5
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Wed Jan 13 23:09:11 2016 +0900
gdi32: Implement synthesizing bold glyphs for bitmap fonts.
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/freetype.c | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 569dc02..ea81ee1 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -6917,8 +6917,10 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
}
metrics = ft_face->glyph->metrics;
- if(font->fake_bold)
- get_bold_glyph_outline(ft_face->glyph, font->ppem, &metrics);
+ if(font->fake_bold) {
+ if (!get_bold_glyph_outline(ft_face->glyph, font->ppem, &metrics) && metrics.width)
+ metrics.width += 1 << 6;
+ }
/* Some poorly-created fonts contain glyphs that exceed the boundaries set
* by the text metrics. The proper behavior is to clip the glyph metrics to
@@ -7068,7 +7070,17 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
INT w = min( pitch, (ft_face->glyph->bitmap.width + 7) >> 3 );
INT h = min( height, ft_face->glyph->bitmap.rows );
while(h--) {
- memcpy(dst, src, w);
+ if (!font->fake_bold)
+ memcpy(dst, src, w);
+ else {
+ INT x;
+ dst[0] = 0;
+ for (x = 0; x < w; x++) {
+ dst[x ] = (dst[x] & 0x80) | (src[x] >> 1) | src[x];
+ if (x+1 < pitch)
+ dst[x+1] = (src[x] & 0x01) << 7;
+ }
+ }
src += ft_face->glyph->bitmap.pitch;
dst += pitch;
}
@@ -7124,8 +7136,12 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
INT x;
memset( buf, 0, needed );
while(h--) {
- for(x = 0; x < pitch && x < ft_face->glyph->bitmap.width; x++)
- if (src[x / 8] & masks[x % 8]) dst[x] = max_level;
+ for(x = 0; x < pitch && x < ft_face->glyph->bitmap.width; x++) {
+ if (src[x / 8] & masks[x % 8]) {
+ dst[x] = max_level;
+ if (font->fake_bold && x+1 < pitch) dst[x+1] = max_level;
+ }
+ }
src += ft_face->glyph->bitmap.pitch;
dst += pitch;
}
@@ -7199,7 +7215,10 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
for (x = 0; x < width && x < ft_face->glyph->bitmap.width; x++)
{
if ( src[x / 8] & masks[x % 8] )
+ {
((unsigned int *)dst)[x] = ~0u;
+ if (font->fake_bold && x+1 < width) ((unsigned int *)dst)[x+1] = ~0u;
+ }
}
src += src_pitch;
dst += pitch;
More information about the wine-cvs
mailing list