Superseded patch 146570.
ChangeLog: v5: - Use DrawTextW for calculating expected values; - Simplify format setting with EM_SETCHARFORMAT.
Signed-off-by: Jactry Zeng jzeng@codeweavers.com --- dlls/riched20/tests/txtsrv.c | 125 +++++++++++++++++------------------ 1 file changed, 61 insertions(+), 64 deletions(-)
diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c index 88b5adf13c..6e61392dc5 100644 --- a/dlls/riched20/tests/txtsrv.c +++ b/dlls/riched20/tests/txtsrv.c @@ -697,81 +697,78 @@ static void test_TxSetText(void) ITextHost_Release(host); }
+#define CHECK_TXGETNATURALSIZE(res,width,height,hdc,string) \ + _check_txgetnaturalsize(res, width, height, hdc, string, __LINE__) +static void _check_txgetnaturalsize(HRESULT res, LONG width, LONG height, HDC hdc, LPCWSTR string, int line) +{ + RECT rect; + LONG expected_width, expected_height; + + GetClientRect(WindowFromDC(hdc), &rect); + DrawTextW(hdc, string, -1, &rect, DT_LEFT | DT_CALCRECT | DT_NOCLIP | DT_EDITCONTROL | DT_WORDBREAK); + expected_width = rect.right - rect.left; + expected_height = rect.bottom - rect.top; + ok_(__FILE__,line)(res == S_OK, "ITextServices_TxGetNaturalSize failed: 0x%08x.\n", res); + ok_(__FILE__,line)(width >= expected_width && width <= expected_width + 1, + "got wrong width: %d, expected: %d {+1}.\n", width, expected_width); + ok_(__FILE__,line)(height == expected_height, "got wrong height: %d, expected: %d.\n", + height, expected_height); +} + static void test_TxGetNaturalSize(void) { ITextServices *txtserv; ITextHost *host; HRESULT result; - BOOL ret; - - /* This value is used when calling TxGetNaturalSize. MSDN says - that this is not supported however a null pointer cannot be - used as it will cause a segmentation violation. The values in - the structure being pointed to are required to be INT_MAX - otherwise calculations can give wrong values. */ - const SIZEL psizelExtent = {INT_MAX,INT_MAX}; - - static const WCHAR oneA[] = {'A',0}; - - /* Results of measurements */ - LONG xdim, ydim; - - /* The device context to do the tests in */ + SIZEL psizelExtent = {-1,-1}; + static const WCHAR test_text[] = {'T','e','s','t','S','o','m','e','T','e','x','t',0}; + LONG width, height; HDC hdcDraw; - - /* Variables with the text metric information */ - INT charwidth_caps_text[26]; - TEXTMETRICA tmInfo_text; + HWND hwnd; + RECT rect; + CHARFORMAT2W cf; + LRESULT lresult; + HFONT hf; + LOGFONTW lf;
if (!init_texthost(&txtserv, &host)) return;
- hdcDraw = GetDC(NULL); - SaveDC(hdcDraw); - - /* Populate the metric strucs */ - SetMapMode(hdcDraw,MM_TEXT); - GetTextMetricsA(hdcDraw, &tmInfo_text); - SetLastError(0xdeadbeef); - ret = GetCharWidth32A(hdcDraw,'A','Z',charwidth_caps_text); - if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - win_skip("GetCharWidth32 is not available\n"); - goto cleanup; - } - - /* Make measurements in MM_TEXT */ + hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP | WS_VISIBLE, + 0, 0, 100, 100, 0, 0, 0, NULL); + hdcDraw = GetDC(hwnd); SetMapMode(hdcDraw,MM_TEXT); - xdim = 0; ydim = 0; - - result = ITextServices_TxSetText(txtserv, oneA); - ok(result == S_OK, "ITextServices_TxSetText failed (result = %x)\n", result); - if (result != S_OK) { - skip("Could not set text\n"); - goto cleanup; - } - - SetLastError(0xdeadbeef); - result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, - hdcDraw, NULL, NULL, - TXTNS_FITTOCONTENT, &psizelExtent, - &xdim, &ydim); - todo_wine ok(result == S_OK || broken(result == E_FAIL), /* WINXP Arabic Language */ - "TxGetNaturalSize gave unexpected return value (result = %x)\n", result); - if (result == S_OK) { - todo_wine ok(ydim == tmInfo_text.tmHeight, - "Height calculated incorrectly (expected %d, got %d)\n", - tmInfo_text.tmHeight, ydim); - /* The native DLL adds one pixel extra when calculating widths. */ - todo_wine ok(xdim >= charwidth_caps_text[0] && xdim <= charwidth_caps_text[0] + 1, - "Width calculated incorrectly (expected %d {+1}, got %d)\n", - charwidth_caps_text[0], xdim); - } else - skip("TxGetNaturalSize measurements not performed (xdim = %d, ydim = %d, result = %x, error = %x)\n", - xdim, ydim, result, GetLastError()); - -cleanup: - RestoreDC(hdcDraw,1); - ReleaseDC(NULL,hdcDraw); + GetClientRect(hwnd, &rect); + + memset(&cf, 0, sizeof(cf)); + cf.cbSize = sizeof(cf); + cf.dwMask = CFM_ALL2; + hf = (HFONT)GetStockObject(DEFAULT_GUI_FONT); + GetObjectW(hf, sizeof(LOGFONTW), &lf); + lstrcpyW(cf.szFaceName, lf.lfFaceName); + cf.yHeight = MulDiv(abs(lf.lfHeight), 1440, GetDeviceCaps(GetDC(NULL), LOGPIXELSY)); + if (lf.lfWeight > FW_NORMAL) cf.dwEffects |= CFE_BOLD; + if (lf.lfItalic) cf.dwEffects |= CFE_ITALIC; + if (lf.lfUnderline) cf.dwEffects |= CFE_UNDERLINE; + if (lf.lfStrikeOut) cf.dwEffects |= CFE_SUBSCRIPT; + cf.bPitchAndFamily = lf.lfPitchAndFamily; + cf.bCharSet = lf.lfCharSet; + result = ITextServices_TxSendMessage(txtserv, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cf, &lresult); + ok(result == S_OK, "ITextServices_TxSendMessage failed: 0x%08x.\n", result); + SelectObject(hdcDraw, hf); + + result = ITextServices_TxSetText(txtserv, test_text); + ok(result == S_OK, "ITextServices_TxSetText failed: 0x%08x.\n", result); + + psizelExtent.cx = -1; psizelExtent.cy = -1; + width = rect.right - rect.left; + height = 0; + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, &width, &height); + todo_wine CHECK_TXGETNATURALSIZE(result, width, height, hdcDraw, test_text); + + ReleaseDC(hwnd, hdcDraw); + DestroyWindow(hwnd); ITextServices_Release(txtserv); ITextHost_Release(host); }