Akihiro Sagawa : gdi32: Improve fixed-pitch advance calculation as well as outline text metrics.
Alexandre Julliard
julliard at winehq.org
Thu Apr 4 13:54:16 CDT 2013
Module: wine
Branch: master
Commit: e5f1508031eefb4f71f5fc6a3acaf71308003b3e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e5f1508031eefb4f71f5fc6a3acaf71308003b3e
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Thu Mar 14 20:08:16 2013 +0900
gdi32: Improve fixed-pitch advance calculation as well as outline text metrics.
---
dlls/gdi32/freetype.c | 20 +++++++++++---------
1 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 7bc4366..96c94e4 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -5881,7 +5881,8 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
BOOL needsTransform = FALSE;
BOOL tategaki = (font->GSUB_Table != NULL);
UINT original_index;
- FT_Fixed avgAdvance = 0;
+ LONG avgAdvance = 0;
+ FT_Fixed em_scale;
TRACE("%p, %04x, %08x, %p, %08x, %p, %p\n", font, glyph, format, lpgm,
buflen, buf, lpmat);
@@ -6022,9 +6023,10 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
TEXTMETRICW tm;
if (get_text_metrics(incoming_font, &tm) &&
!(tm.tmPitchAndFamily & TMPF_FIXED_PITCH)) {
- avgAdvance = pFT_MulFix(incoming_font->ntmAvgWidth,
- incoming_font->ft_face->size->metrics.x_scale);
- if (avgAdvance && (ft_face->glyph->metrics.horiAdvance+63) >> 6 == (avgAdvance*2+63) >> 6)
+ em_scale = MulDiv(incoming_font->ppem, 1 << 16, incoming_font->ft_face->units_per_EM);
+ avgAdvance = pFT_MulFix(incoming_font->ntmAvgWidth, em_scale);
+ if (avgAdvance &&
+ (ft_face->glyph->metrics.horiAdvance+63) >> 6 == pFT_MulFix(incoming_font->ntmAvgWidth*2, em_scale))
TRACE("Fixed-pitch full-width character detected\n");
else
avgAdvance = 0; /* cancel this feature */
@@ -6037,7 +6039,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
if (!avgAdvance)
adv = (INT)(ft_face->glyph->metrics.horiAdvance + 63) >> 6;
else
- adv = (INT)((avgAdvance + 32) >> 6) * 2;
+ adv = (INT)avgAdvance * 2;
top = (ft_face->glyph->metrics.horiBearingY + 63) & -64;
bottom = (ft_face->glyph->metrics.horiBearingY -
@@ -6082,10 +6084,10 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
if (!avgAdvance || vec.y)
lpgm->gmCellIncX = (vec.x+63) >> 6;
else {
- vec.x = avgAdvance;
+ vec.x = incoming_font->ntmAvgWidth;
vec.y = 0;
pFT_Vector_Transform(&vec, &transMat);
- lpgm->gmCellIncX = ((vec.x+32) >> 6) * 2;
+ lpgm->gmCellIncX = pFT_MulFix(vec.x, em_scale) * 2;
}
vec.x = ft_face->glyph->metrics.horiAdvance;
@@ -6094,10 +6096,10 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
if (!avgAdvance || vec.y)
adv = (vec.x+63) >> 6;
else {
- vec.x = avgAdvance;
+ vec.x = incoming_font->ntmAvgWidth;
vec.y = 0;
pFT_Vector_Transform(&vec, &transMatUnrotated);
- adv = ((vec.x+32) >> 6) * 2;
+ adv = pFT_MulFix(vec.x, em_scale) * 2;
}
}
More information about the wine-cvs
mailing list