diff --git a/dlls/d3dx9_36/font.c b/dlls/d3dx9_36/font.c index 54aef71913c..6914fd1bb7c 100644 --- a/dlls/d3dx9_36/font.c +++ b/dlls/d3dx9_36/font.c @@ -518,6 +518,9 @@ static void word_break(HDC hdc, const WCHAR *str, unsigned int *str_len, SCRIPT_ANALYSIS sa; unsigned int i; + TRACE("hdc %p, str %s, str_len %u, chars_fit %u, chars_used %p, format %#x, size %p.\n", + hdc, debugstr_w(str), *str_len, chars_fit, chars_used, format, size); + *chars_used = 0; sla = heap_alloc(*str_len * sizeof(*sla)); @@ -555,21 +558,42 @@ static void word_break(HDC hdc, const WCHAR *str, unsigned int *str_len, static const WCHAR *read_line(HDC hdc, const WCHAR *str, int *count, WCHAR *dest, unsigned int *dest_len, int width, DWORD format, SIZE *size) { - unsigned int i = 0; int orig_count = *count; - int num_fit; + BOOL found_tabs = FALSE; + unsigned int i = 0; + int num_fit = 0; + DWORD dim; + + TRACE("hdc %p, str %s, count %u, dest %p, dest_len %p, width %u, format %#x, size %p.\n", + hdc, debugstr_w(str), *count, dest, dest_len, width, format, size); + if (width < 0) + width = INT_MAX; *dest_len = 0; while (*count && (str[i] != '\n' || (format & DT_SINGLELINE))) { + if ((format & DT_EXPANDTABS) && str[i] == '\t') + found_tabs = TRUE; + --(*count); - if (str[i] != '\r' && str[i] != '\n') + if (str[i] != '\r' && str[i] != '\n' && (str[i] != '\t' || format & DT_EXPANDTABS)) dest[(*dest_len)++] = str[i]; ++i; + + if (found_tabs) + { + dim = GetTabbedTextExtentW(hdc, dest, *dest_len, 0, NULL); + TRACE("dest_len %u.\n", *dest_len); + if (!(format & (DT_SINGLELINE | DT_CALCRECT)) && LOWORD(dim) >= width) + break; + else + num_fit = *dest_len; + } } - num_fit = 0; - GetTextExtentExPointW(hdc, dest, *dest_len, width, &num_fit, NULL, size); + if (!found_tabs) + GetTextExtentExPointW(hdc, dest, *dest_len, width, &num_fit, NULL, size); + TRACE("dest_len %u, num_fit %u.\n", *dest_len, num_fit); if (num_fit < *dest_len) { diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c index 020f18e622c..9b942e15353 100644 --- a/dlls/d3dx9_36/tests/core.c +++ b/dlls/d3dx9_36/tests/core.c @@ -807,10 +807,10 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) todo_wine ok(height == 0, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"\t\t\t\t\t\t\t\t\t\ta", -1, &rect, DT_WORDBREAK, 0xff00ff); - todo_wine ok(height == 12, "Got unexpected height %d.\n", height); + ok(height == 12, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"\taaaaaaaaaa", -1, &rect, DT_WORDBREAK, 0xff00ff); - todo_wine ok(height == 24, "Got unexpected height %d.\n", height); + ok(height == 24, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"\taaaaaaaaaa", -1, &rect, DT_EXPANDTABS | DT_WORDBREAK, 0xff00ff); ok(height == 36, "Got unexpected height %d.\n", height); @@ -819,7 +819,7 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) ok(height == 24, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"\taaa\taaa\taaa", -1, &rect, DT_EXPANDTABS | DT_WORDBREAK, 0xff00ff); - todo_wine ok(height == 48, "Got unexpected height %d.\n", height); + ok(height == 48, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"\t\t\t\t\t\t\t\t\t\t", -1, &rect, DT_EXPANDTABS | DT_WORDBREAK, 0xff00ff); todo_wine ok(height == 60, "Got unexpected height %d.\n", height); @@ -828,7 +828,7 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) ok(height == 12, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"a\ta\ta", -1, &rect, DT_EXPANDTABS | DT_WORDBREAK, 0xff00ff); - todo_wine ok(height == 24, "Got unexpected height %d.\n", height); + ok(height == 24, "Got unexpected height %d.\n", height); height = ID3DXFont_DrawTextW(font, NULL, L"aaaaaaaaaaaaaaaaaaaa", -1, &rect, DT_WORDBREAK, 0xff00ff); ok(height == 36, "Got unexpected height %d.\n", height);