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); }
On Wed, Jun 06, 2018 at 05:24:13PM +0800, Jactry Zeng wrote:
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);
Why can't you use GetTextExtentPointW() here? This would avoid the GetClientRect() call too.
- 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};
Let's just call this 'extent';
- 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);
No need for cast.
- 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;
This is already initialised.
- 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);
}
2.17.1
Huw Davies huw@codeweavers.com 于2018年6月7日周四 下午4:54写道:
On Wed, Jun 06, 2018 at 05:24:13PM +0800, Jactry Zeng wrote:
Superseded patch 146570.
- LONG expected_width, expected_height;
- GetClientRect(WindowFromDC(hdc), &rect);
- DrawTextW(hdc, string, -1, &rect, DT_LEFT | DT_CALCRECT | DT_NOCLIP | DT_EDITCONTROL | DT_WORDBREAK);
Why can't you use GetTextExtentPointW() here? This would avoid the GetClientRect() call too.
In 0003 there are some tests about multiline support. It seems that using DrawText can make it more simple or we will need to compute a max width of it by ourselves.
Jactry Zeng jactry92@gmail.com 于2018年6月7日周四 下午5:21写道:
In 0003 there are some tests about multiline support. It seems that using DrawText can make it more simple or we will need to compute a max width of it by ourselves.
Sorry, it is in 0004.
-- Regards, Jactry Zeng
On Thu, Jun 07, 2018 at 05:21:25PM +0800, Jactry Zeng wrote:
Huw Davies huw@codeweavers.com 于2018年6月7日周四 下午4:54写道:
On Wed, Jun 06, 2018 at 05:24:13PM +0800, Jactry Zeng wrote:
Superseded patch 146570.
- LONG expected_width, expected_height;
- GetClientRect(WindowFromDC(hdc), &rect);
- DrawTextW(hdc, string, -1, &rect, DT_LEFT | DT_CALCRECT | DT_NOCLIP | DT_EDITCONTROL | DT_WORDBREAK);
Why can't you use GetTextExtentPointW() here? This would avoid the GetClientRect() call too.
In 0003 there are some tests about multiline support. It seems that using DrawText can make it more simple or we will need to compute a max width of it by ourselves.
Ok, then please pass the client rect to CHECK_TXGETNATURALSIZE so that it doesn't need to be queried from there.
Also, this patch series seems out-of-order. Perhaps move 0001 after 0002 and 0003 (or put 0004 before 0002 and 0003).
Huw.