gdi32: Fix ABC metrics for rotated font.
This commit is contained in:
parent
b8f22f4755
commit
f6bc356860
|
@ -6438,6 +6438,8 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
|
||||||
gm.gmCellIncY = 0;
|
gm.gmCellIncY = 0;
|
||||||
origin_x = left;
|
origin_x = left;
|
||||||
origin_y = top;
|
origin_y = top;
|
||||||
|
abc->abcA = origin_x >> 6;
|
||||||
|
abc->abcB = metrics.width >> 6;
|
||||||
} else {
|
} else {
|
||||||
INT xc, yc;
|
INT xc, yc;
|
||||||
FT_Vector vec;
|
FT_Vector vec;
|
||||||
|
@ -6534,6 +6536,19 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
|
||||||
pFT_Vector_Transform(&vec, &transMatUnrotated);
|
pFT_Vector_Transform(&vec, &transMatUnrotated);
|
||||||
adv = pFT_MulFix(vec.x, em_scale) * 2;
|
adv = pFT_MulFix(vec.x, em_scale) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec.x = metrics.horiBearingX;
|
||||||
|
vec.y = 0;
|
||||||
|
pFT_Vector_Transform(&vec, &transMatUnrotated);
|
||||||
|
abc->abcA = vec.x >> 6;
|
||||||
|
|
||||||
|
vec.x = metrics.width;
|
||||||
|
vec.y = 0;
|
||||||
|
pFT_Vector_Transform(&vec, &transMatUnrotated);
|
||||||
|
if (vec.x >= 0)
|
||||||
|
abc->abcB = vec.x >> 6;
|
||||||
|
else
|
||||||
|
abc->abcB = -vec.x >> 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
width = (right - left) >> 6;
|
width = (right - left) >> 6;
|
||||||
|
@ -6542,8 +6557,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
|
||||||
gm.gmBlackBoxY = height ? height : 1;
|
gm.gmBlackBoxY = height ? height : 1;
|
||||||
gm.gmptGlyphOrigin.x = origin_x >> 6;
|
gm.gmptGlyphOrigin.x = origin_x >> 6;
|
||||||
gm.gmptGlyphOrigin.y = origin_y >> 6;
|
gm.gmptGlyphOrigin.y = origin_y >> 6;
|
||||||
abc->abcA = left >> 6;
|
if (!abc->abcB) abc->abcB = 1;
|
||||||
abc->abcB = gm.gmBlackBoxX;
|
|
||||||
abc->abcC = adv - abc->abcA - abc->abcB;
|
abc->abcC = adv - abc->abcA - abc->abcB;
|
||||||
|
|
||||||
TRACE("%u,%u,%s,%d,%d\n", gm.gmBlackBoxX, gm.gmBlackBoxY,
|
TRACE("%u,%u,%s,%d,%d\n", gm.gmBlackBoxX, gm.gmBlackBoxY,
|
||||||
|
|
|
@ -1325,14 +1325,12 @@ static void test_GetCharABCWidths(void)
|
||||||
ok(ret, "GetCharABCWidthsW should have succeeded\n");
|
ok(ret, "GetCharABCWidthsW should have succeeded\n");
|
||||||
|
|
||||||
/* 3) compare ABC results */
|
/* 3) compare ABC results */
|
||||||
todo_wine {
|
|
||||||
ok(match_off_by_1(abcw[0].abcA, abc[0].abcA, FALSE),
|
ok(match_off_by_1(abcw[0].abcA, abc[0].abcA, FALSE),
|
||||||
"got %d, expected %d (A)\n", abc[0].abcA, abcw[0].abcA);
|
"got %d, expected %d (A)\n", abc[0].abcA, abcw[0].abcA);
|
||||||
ok(match_off_by_1(abcw[0].abcB, abc[0].abcB, FALSE),
|
ok(match_off_by_1(abcw[0].abcB, abc[0].abcB, FALSE),
|
||||||
"got %d, expected %d (B)\n", abc[0].abcB, abcw[0].abcB);
|
"got %d, expected %d (B)\n", abc[0].abcB, abcw[0].abcB);
|
||||||
ok(match_off_by_1(abcw[0].abcC, abc[0].abcC, FALSE),
|
ok(match_off_by_1(abcw[0].abcC, abc[0].abcC, FALSE),
|
||||||
"got %d, expected %d (C)\n", abc[0].abcC, abcw[0].abcC);
|
"got %d, expected %d (C)\n", abc[0].abcC, abcw[0].abcC);
|
||||||
}
|
|
||||||
|
|
||||||
DeleteObject(SelectObject(hdc, hfont));
|
DeleteObject(SelectObject(hdc, hfont));
|
||||||
ReleaseDC(NULL, hdc);
|
ReleaseDC(NULL, hdc);
|
||||||
|
|
Loading…
Reference in New Issue