Module: wine Branch: master Commit: 69bc0174e5dab299edd3245d7123b953063ffa2f URL: http://source.winehq.org/git/wine.git/?a=commit;h=69bc0174e5dab299edd3245d71...
Author: Hans Leidekker hans@codeweavers.com Date: Fri Jun 26 14:20:31 2009 +0200
mlang: Implement IMLangFontLink2_GetFontUnicodeRanges.
---
dlls/mlang/mlang.c | 26 ++++++++++++++++++++++++-- dlls/mlang/tests/mlang.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index 6590ea5..180e1ad 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -3357,8 +3357,30 @@ static HRESULT WINAPI fnIMLangFontLink2_MapFont(IMLangFontLink2* This, static HRESULT WINAPI fnIMLangFontLink2_GetFontUnicodeRanges(IMLangFontLink2* This, HDC hDC, UINT *puiRanges, UNICODERANGE *pUranges) { - FIXME("(%p)->%p %p %p\n",This, hDC, puiRanges, pUranges); - return E_NOTIMPL; + DWORD size; + GLYPHSET *gs; + + TRACE("(%p)->%p %p %p\n", This, hDC, puiRanges, pUranges); + + if (!puiRanges) return E_INVALIDARG; + if (!(size = GetFontUnicodeRanges(hDC, NULL))) return E_FAIL; + if (!(gs = HeapAlloc(GetProcessHeap(), 0, size))) return E_OUTOFMEMORY; + + GetFontUnicodeRanges(hDC, gs); + *puiRanges = gs->cRanges; + if (pUranges) + { + UINT i; + for (i = 0; i < gs->cRanges; i++) + { + if (i >= *puiRanges) break; + pUranges[i].wcFrom = gs->ranges[i].wcLow; + pUranges[i].wcTo = gs->ranges[i].wcLow + gs->ranges[i].cGlyphs; + } + *puiRanges = i; + } + HeapFree(GetProcessHeap(), 0, gs); + return S_OK; }
static HRESULT WINAPI fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2* This, diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index eceb3ab..bd4fd6c 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -1914,6 +1914,49 @@ static void test_CodePageToScriptID(IMLangFontLink2 *font_link) } }
+static void test_GetFontUnicodeRanges(IMLangFontLink2 *font_link) +{ + HRESULT hr; + UINT count; + HFONT hfont, old_hfont; + LOGFONTA lf; + HDC hdc; + UNICODERANGE *ur; + + hdc = CreateCompatibleDC(0); + memset(&lf, 0, sizeof(lf)); + lstrcpyA(lf.lfFaceName, "Arial"); + hfont = CreateFontIndirectA(&lf); + old_hfont = SelectObject(hdc, hfont); + + count = 0; + hr = IMLangFontLink2_GetFontUnicodeRanges(font_link, NULL, &count, NULL); + ok(hr == E_FAIL, "expected E_FAIL, got 0x%08x\n", hr); + + hr = IMLangFontLink2_GetFontUnicodeRanges(font_link, hdc, NULL, NULL); + ok(hr == E_INVALIDARG, "expected E_FAIL, got 0x%08x\n", hr); + + count = 0; + hr = IMLangFontLink2_GetFontUnicodeRanges(font_link, hdc, &count, NULL); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(count, "expected count > 0\n"); + + ur = HeapAlloc(GetProcessHeap(), 0, sizeof(*ur) * count); + + hr = IMLangFontLink2_GetFontUnicodeRanges(font_link, hdc, &count, ur); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + + count--; + hr = IMLangFontLink2_GetFontUnicodeRanges(font_link, hdc, &count, ur); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + + HeapFree(GetProcessHeap(), 0, ur); + + SelectObject(hdc, old_hfont); + DeleteObject(hfont); + DeleteDC(hdc); +} + START_TEST(mlang) { IMultiLanguage *iML = NULL; @@ -1991,6 +2034,7 @@ START_TEST(mlang) if (ret != S_OK || !iMLFL2) return;
test_GetScriptFontInfo(iMLFL2); + test_GetFontUnicodeRanges(iMLFL2); test_CodePageToScriptID(iMLFL2); IMLangFontLink2_Release(iMLFL2);