-- v2: mlang: Fix GetStrCodePages for characters with different codepages. mlang/tests: Test GetStrCodePages with different codepages character.
From: Santino Mazza smazza@codeweavers.com
--- dlls/mlang/tests/mlang.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index da0b87ed729..8e55b07b021 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -1163,7 +1163,7 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) DWORD dwCodePages, dwManyCodePages; DWORD dwCmpCodePages; UINT CodePage; - static const WCHAR str[] = { 'd', 0x0436, 0xff90 }; + static const WCHAR str[] = { 'd', 0x0436, 0xff90, 0x0160 }; LONG processed; HRESULT ret;
@@ -1220,6 +1220,19 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); ok(processed == 1, "expected 1, got %ld\n", processed);
+ /* Latin 2 */ + dwCmpCodePages = FS_LATIN1 | FS_LATIN2 | FS_TURKISH | FS_BALTIC; + ret = IMLangFontLink_GetCharCodePages(iMLFL, 0x0160, &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_GetCharCodePages error %lx\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); + + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[3], 1, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %lx\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); + ok(processed == 1, "expected 1, got %ld\n", processed); + /* Cyrillic */ dwCmpCodePages = FS_CYRILLIC | FS_JISJAPAN | FS_CHINESESIMP | FS_WANSUNG; ret = IMLangFontLink_GetCharCodePages(iMLFL, 0x0436, &dwCodePages); @@ -1262,6 +1275,14 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); ok(processed == 3, "expected 3, got %ld\n", processed);
+ dwCmpCodePages = FS_JISJAPAN; + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, str, 4, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %lx\n", ret); + todo_wine ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); + todo_wine ok(processed == 3, "expected 3, got %ld\n", processed); + dwCodePages = 0xffff; processed = -1; ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[2], 1, 0, &dwCodePages, &processed);
From: Santino Mazza smazza@codeweavers.com
--- dlls/mlang/mlang.c | 7 ++++++- dlls/mlang/tests/mlang.c | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index add0dd0a104..8c1c89d3035 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -3340,7 +3340,12 @@ static HRESULT WINAPI fnIMLangFontLink2_GetStrCodePages( IMLangFontLink2* iface, if (ret != S_OK) return E_FAIL;
if (!cps) cps = cp; - else cps &= cp; + else if ((cps & cp) != 0) cps &= cp; + else + { + i--; + break; + };
/* FIXME: not tested */ if (priority_cp & cps) break; diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index 8e55b07b021..3240d945245 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -1280,8 +1280,8 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) processed = 0; ret = IMLangFontLink_GetStrCodePages(iMLFL, str, 4, 0, &dwCodePages, &processed); ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %lx\n", ret); - todo_wine ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); - todo_wine ok(processed == 3, "expected 3, got %ld\n", processed); + ok(dwCodePages == dwCmpCodePages, "expected %lx, got %lx\n", dwCmpCodePages, dwCodePages); + ok(processed == 3, "expected 3, got %ld\n", processed);
dwCodePages = 0xffff; processed = -1;