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