Akihiro Sagawa : gdi32: Avoid making a DBCS character in range.

Alexandre Julliard julliard at winehq.org
Tue Dec 27 11:27:56 CST 2011


Module: wine
Branch: master
Commit: 70c222218000dda65efce325a3170c252e7c5180
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=70c222218000dda65efce325a3170c252e7c5180

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Mon Dec 26 18:27:37 2011 +0900

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 d2dfd44..71e0857 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 4d53aaf..41ceff4 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);




More information about the wine-cvs mailing list