From 70c222218000dda65efce325a3170c252e7c5180 Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Mon, 26 Dec 2011 18:27:37 +0900 Subject: [PATCH] gdi32: Avoid making a DBCS character in range. --- dlls/gdi32/font.c | 18 ++++++++++++++---- dlls/gdi32/tests/font.c | 30 +++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index d2dfd449f77..71e08578458 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -1596,13 +1596,15 @@ UINT WINAPI GetOutlineTextMetricsW( static LPSTR FONT_GetCharsByRangeA(HDC hdc, UINT firstChar, UINT lastChar, PINT pByteLen) { INT i, count = lastChar - firstChar + 1; + UINT mbcp; UINT c; LPSTR str; if (count <= 0) return NULL; - switch (GdiGetCodePage(hdc)) + mbcp = GdiGetCodePage(hdc); + switch (mbcp) { case 932: case 936: @@ -1617,6 +1619,7 @@ static LPSTR FONT_GetCharsByRangeA(HDC hdc, UINT firstChar, UINT lastChar, PINT default: if (lastChar > 0xff) return NULL; + mbcp = 0; break; } @@ -1626,9 +1629,16 @@ static LPSTR FONT_GetCharsByRangeA(HDC hdc, UINT firstChar, UINT lastChar, PINT for(i = 0, c = firstChar; c <= lastChar; i++, c++) { - if (c > 0xff) - str[i++] = (BYTE)(c >> 8); - str[i] = (BYTE)c; + if (mbcp) { + if (c > 0xff) + str[i++] = (BYTE)(c >> 8); + if (c <= 0xff && IsDBCSLeadByteEx(mbcp, c)) + str[i] = 0x1f; /* FIXME: use default character */ + else + str[i] = (BYTE)c; + } + else + str[i] = (BYTE)c; } str[i] = '\0'; diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index 4d53aafe303..41ceff4747b 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -957,7 +957,8 @@ static void test_GetCharABCWidths(void) {0xffffff, 0xffffff}, {0x1000000, 0x1000000}, {0xffffff, 0x1000000}, - {0xffffffff, 0xffffffff} + {0xffffffff, 0xffffffff}, + {0x00, 0xff} }; static const struct { @@ -967,12 +968,18 @@ static void test_GetCharABCWidths(void) BOOL r[sizeof range / sizeof range[0]]; } c[] = { - {ANSI_CHARSET, 0x30, 0x30, {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}}, - {SHIFTJIS_CHARSET, 0x82a0, 0x3042, {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}}, - {HANGEUL_CHARSET, 0x8141, 0xac02, {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}}, - {JOHAB_CHARSET, 0x8446, 0x3135, {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}}, - {GB2312_CHARSET, 0x8141, 0x4e04, {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}}, - {CHINESEBIG5_CHARSET, 0xa142, 0x3001, {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}} + {ANSI_CHARSET, 0x30, 0x30, + {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE}}, + {SHIFTJIS_CHARSET, 0x82a0, 0x3042, + {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE}}, + {HANGEUL_CHARSET, 0x8141, 0xac02, + {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE}}, + {JOHAB_CHARSET, 0x8446, 0x3135, + {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE}}, + {GB2312_CHARSET, 0x8141, 0x4e04, + {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE}}, + {CHINESEBIG5_CHARSET, 0xa142, 0x3001, + {TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE}} }; UINT i; @@ -1057,9 +1064,18 @@ static void test_GetCharABCWidths(void) for (j = 0; j < sizeof range / sizeof range[0]; ++j) { + memset(full, 0xdd, sizeof full); ret = pGetCharABCWidthsA(hdc, range[j].first, range[j].last, full); ok(ret == c[i].r[j], "GetCharABCWidthsA %x - %x should have %s\n", range[j].first, range[j].last, c[i].r[j] ? "succeeded" : "failed"); + if (ret) + { + UINT last = range[j].last - range[j].first; + ret = pGetCharABCWidthsA(hdc, range[j].last, range[j].last, a); + ok(ret && memcmp(&full[last], &a[0], sizeof(ABC)) == 0, + "GetCharABCWidthsA %x should match. codepage = %u\n", + range[j].last, c[i].cs); + } } hfont = SelectObject(hdc, hfont);