Based on a patch by Tony Wasserka.
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=24754 Signed-off-by: Sven Baars sbaars@codeweavers.com --- dlls/d3dx9_24/Makefile.in | 2 +- dlls/d3dx9_25/Makefile.in | 2 +- dlls/d3dx9_26/Makefile.in | 2 +- dlls/d3dx9_27/Makefile.in | 2 +- dlls/d3dx9_28/Makefile.in | 2 +- dlls/d3dx9_29/Makefile.in | 2 +- dlls/d3dx9_30/Makefile.in | 2 +- dlls/d3dx9_31/Makefile.in | 2 +- dlls/d3dx9_32/Makefile.in | 2 +- dlls/d3dx9_33/Makefile.in | 2 +- dlls/d3dx9_34/Makefile.in | 2 +- dlls/d3dx9_35/Makefile.in | 2 +- dlls/d3dx9_36/Makefile.in | 2 +- dlls/d3dx9_36/font.c | 392 ++++++++++++++++++++++++++++++++++++- dlls/d3dx9_36/tests/core.c | 45 ++--- dlls/d3dx9_37/Makefile.in | 2 +- dlls/d3dx9_38/Makefile.in | 2 +- dlls/d3dx9_39/Makefile.in | 2 +- dlls/d3dx9_40/Makefile.in | 2 +- dlls/d3dx9_41/Makefile.in | 2 +- dlls/d3dx9_42/Makefile.in | 2 +- dlls/d3dx9_43/Makefile.in | 2 +- 22 files changed, 427 insertions(+), 50 deletions(-)
diff --git a/dlls/d3dx9_24/Makefile.in b/dlls/d3dx9_24/Makefile.in index faad4c49ac..f80541a9aa 100644 --- a/dlls/d3dx9_24/Makefile.in +++ b/dlls/d3dx9_24/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=24 MODULE = d3dx9_24.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_25/Makefile.in b/dlls/d3dx9_25/Makefile.in index 292b33db2b..e3144f0d45 100644 --- a/dlls/d3dx9_25/Makefile.in +++ b/dlls/d3dx9_25/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=25 MODULE = d3dx9_25.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_26/Makefile.in b/dlls/d3dx9_26/Makefile.in index 22bb54a498..1b432afb21 100644 --- a/dlls/d3dx9_26/Makefile.in +++ b/dlls/d3dx9_26/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=26 MODULE = d3dx9_26.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_27/Makefile.in b/dlls/d3dx9_27/Makefile.in index 4ed104a170..65d8cad9d6 100644 --- a/dlls/d3dx9_27/Makefile.in +++ b/dlls/d3dx9_27/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=27 MODULE = d3dx9_27.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_28/Makefile.in b/dlls/d3dx9_28/Makefile.in index 94e059ae9d..ff7ba564c1 100644 --- a/dlls/d3dx9_28/Makefile.in +++ b/dlls/d3dx9_28/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=28 MODULE = d3dx9_28.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_29/Makefile.in b/dlls/d3dx9_29/Makefile.in index 94b39aee37..7e53415c43 100644 --- a/dlls/d3dx9_29/Makefile.in +++ b/dlls/d3dx9_29/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=29 MODULE = d3dx9_29.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_30/Makefile.in b/dlls/d3dx9_30/Makefile.in index 6beadbc47e..9bc955753f 100644 --- a/dlls/d3dx9_30/Makefile.in +++ b/dlls/d3dx9_30/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=30 MODULE = d3dx9_30.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_31/Makefile.in b/dlls/d3dx9_31/Makefile.in index b73f32872c..58b72c527c 100644 --- a/dlls/d3dx9_31/Makefile.in +++ b/dlls/d3dx9_31/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=31 MODULE = d3dx9_31.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_32/Makefile.in b/dlls/d3dx9_32/Makefile.in index 50bc9d0e26..88cc083bbe 100644 --- a/dlls/d3dx9_32/Makefile.in +++ b/dlls/d3dx9_32/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=32 MODULE = d3dx9_32.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_33/Makefile.in b/dlls/d3dx9_33/Makefile.in index 7be34e1d4b..f6de942ed8 100644 --- a/dlls/d3dx9_33/Makefile.in +++ b/dlls/d3dx9_33/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=33 MODULE = d3dx9_33.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_34/Makefile.in b/dlls/d3dx9_34/Makefile.in index 248735a531..5d0bc9b3a4 100644 --- a/dlls/d3dx9_34/Makefile.in +++ b/dlls/d3dx9_34/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=34 MODULE = d3dx9_34.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_35/Makefile.in b/dlls/d3dx9_35/Makefile.in index 01c809dab2..5eb00327c1 100644 --- a/dlls/d3dx9_35/Makefile.in +++ b/dlls/d3dx9_35/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=35 MODULE = d3dx9_35.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in index 825e5ddfbc..6a08c41159 100644 --- a/dlls/d3dx9_36/Makefile.in +++ b/dlls/d3dx9_36/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=36 MODULE = d3dx9_36.dll IMPORTLIB = d3dx9 IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_36/font.c b/dlls/d3dx9_36/font.c index 1037f49cd5..b91f21b671 100644 --- a/dlls/d3dx9_36/font.c +++ b/dlls/d3dx9_36/font.c @@ -20,6 +20,10 @@
#include "d3dx9_private.h"
+#include <assert.h> + +#include "usp10.h" + WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
typedef struct _GLYPH @@ -513,20 +517,396 @@ static HRESULT WINAPI ID3DXFontImpl_PreloadTextW(ID3DXFont *iface, const WCHAR * return D3D_OK; }
+/************************************************************ + * ID3DXFont_DrawText + * + * Renders the specified string to the screen + * + * PARAMS + * sprite [I] sprite object used to draw the text + * string [I] string to be drawn + * count [I] length of the string + * rect [I,O] rect which tells us where to draw the string, + * which can be computed by passing DT_CALCRECT + * format [I] format of the string + * color [I] text color + * + * RETURNS + * The height of the drawn text + * + */ static INT WINAPI ID3DXFontImpl_DrawTextA(ID3DXFont *iface, ID3DXSprite *sprite, const char *string, INT count, RECT *rect, DWORD format, D3DCOLOR color) { - FIXME("iface %p, sprite %p, string %s, count %d, rect %s, format %#x, color 0x%08x stub!\n", - iface, sprite, debugstr_a(string), count, wine_dbgstr_rect(rect), format, color); - return 1; + WCHAR *wstr; + INT ret; + + TRACE("iface %p, sprite %p, string %s, count %d, rect %s, format %#x, color 0x%08x\n", + iface, sprite, debugstr_a(string), count, wine_dbgstr_rect(rect), format, color); + + if (!string) + return 0; + + if (count < 0) + count = MultiByteToWideChar(CP_ACP, 0, string, -1, NULL, 0) - 1; + + if (count == 0) + return 0; + + wstr = heap_alloc_zero(count * sizeof(WCHAR)); + if (!wstr) + return 0; + + MultiByteToWideChar(CP_ACP, 0, string, -1, wstr, count); + + ret = ID3DXFont_DrawTextW(iface, sprite, wstr, count, rect, format, color); + + heap_free(wstr); + + return ret; +} + +/* DrawText helpers copied from user32 */ +#define TAB 9 +#define LF 10 +#define CR 13 +#define SPACE 32 +static void TEXT_WordBreak(HDC hdc, WCHAR *str, unsigned int max_str, + unsigned int *len_str, + int width, int format, unsigned int chars_fit, + unsigned int *chars_used, SIZE *size) +{ + WCHAR *p; + BOOL word_fits; + SCRIPT_LOGATTR *sla; + SCRIPT_ANALYSIS sa; + int i; + + assert(format & DT_WORDBREAK); + assert(chars_fit < *len_str); + + sla = heap_alloc(sizeof(SCRIPT_LOGATTR) * *len_str); + + memset(&sa, 0, sizeof(SCRIPT_ANALYSIS)); + sa.eScript = SCRIPT_UNDEFINED; + + ScriptBreak(str, *len_str, &sa, sla); + + /* Work back from the last character that did fit to either a space or the + * last character of a word, whichever is met first. + */ + p = str + chars_fit; /* The character that doesn't fit */ + i = chars_fit; + word_fits = TRUE; + if (!chars_fit) + word_fits = FALSE; + else if (sla[i].fSoftBreak) /* chars_fit < *len_str so this is valid */ + { + /* the word just fitted */ + p--; + } + else + { + while (i > 0 && !sla[(--i)+1].fSoftBreak) p--; + p--; + word_fits = (i != 0 || sla[i+1].fSoftBreak); + } + + /* If there was one. */ + if (word_fits) + { + BOOL next_is_space; + /* break the line before/after that character */ + if (!(format & (DT_RIGHT | DT_CENTER)) || *p != SPACE) + p++; + next_is_space = (p - str) < *len_str && *p == SPACE; + *len_str = p - str; + /* and if the next character is a space then discard it. */ + *chars_used = *len_str; + if (next_is_space) + (*chars_used)++; + } + /* Suppose there was none. */ + else + { + /* discard any trailing space. */ + const WCHAR *e = str + *len_str; + p = str + chars_fit; + while (p < e && *p != SPACE) + p++; + *chars_used = p - str; + if (p < e) /* i.e. loop failed because *p == SPACE */ + (*chars_used)++; + *len_str = p - str; + } + /* Remeasure the string */ + GetTextExtentExPointW(hdc, str, *len_str, 0, NULL, NULL, size); + heap_free(sla); +} + +static const WCHAR *TEXT_NextLineW(HDC hdc, const WCHAR *str, int *count, + WCHAR *dest, int *len, int width, DWORD format, + SIZE *retsize, int last_line, int tabwidth) +{ + int i = 0, j = 0; + int plen = 0; + SIZE size; + int maxl = *len; + int seg_i, seg_count, seg_j; + int max_seg_width; + int num_fit; + BOOL word_broken, line_fits; + unsigned int j_in_seg; + + /* For each text segment in the line */ + + retsize->cy = 0; + while (*count) + { + + /* Skip any leading tabs */ + + if (str[i] == TAB && (format & DT_EXPANDTABS)) + { + plen = ((plen/tabwidth)+1)*tabwidth; + (*count)--; if (j < maxl) dest[j++] = str[i++]; else i++; + while (*count && str[i] == TAB) + { + plen += tabwidth; + (*count)--; if (j < maxl) dest[j++] = str[i++]; else i++; + } + } + + + /* Now copy as far as the next tab or cr/lf or eos */ + + seg_i = i; + seg_count = *count; + seg_j = j; + + while (*count && (str[i] != TAB || !(format & DT_EXPANDTABS)) && ((str[i] != CR && str[i] != LF) || (format & DT_SINGLELINE))) + { + (*count)--; + if (j < maxl) dest[j++] = str[i]; + i++; + } + + /* Measure the whole text segment and possibly WordBreak */ + + j_in_seg = j - seg_j; + max_seg_width = width - plen; + GetTextExtentExPointW(hdc, dest + seg_j, j_in_seg, max_seg_width, &num_fit, NULL, &size); + + /* The Microsoft handling of various combinations of formats is weird. + * The following may very easily be incorrect if several formats are + * combined, and may differ between versions (to say nothing of the + * several bugs in the Microsoft versions). + */ + word_broken = FALSE; + line_fits = (num_fit >= j_in_seg); + if (!line_fits && (format & DT_WORDBREAK)) + { + const WCHAR *s; + unsigned int chars_used; + TEXT_WordBreak(hdc, dest+seg_j, maxl-seg_j, &j_in_seg, + max_seg_width, format, num_fit, &chars_used, &size); + line_fits = (size.cx <= max_seg_width); + /* and correct the counts */ + *count = seg_count - chars_used; + s = str + seg_i + chars_used; + i = s - str; + word_broken = TRUE; + } + + j = seg_j + j_in_seg; + + plen += size.cx; + if (size.cy > retsize->cy) + retsize->cy = size.cy; + + if (word_broken) + break; + else if (!*count) + break; + else if (str[i] == CR || str[i] == LF) + { + (*count)--, i++; + if (*count && (str[i] == CR || str[i] == LF) && str[i] != str[i-1]) + { + (*count)--, i++; + } + break; + } + /* else it was a Tab and we go around again */ + } + + retsize->cx = plen; + *len = j; + if (*count) + return (&str[i]); + else + return NULL; }
+#define MAX_BUFFER 1024 static INT WINAPI ID3DXFontImpl_DrawTextW(ID3DXFont *iface, ID3DXSprite *sprite, const WCHAR *string, INT count, RECT *rect, DWORD format, D3DCOLOR color) { - FIXME("iface %p, sprite %p, string %s, count %d, rect %s, format %#x, color 0x%08x stub!\n", - iface, sprite, debugstr_w(string), count, wine_dbgstr_rect(rect), format, color); - return 1; + struct d3dx_font *This = impl_from_ID3DXFont(iface); + ID3DXSprite *target = sprite; + + const WCHAR *strPtr; + WCHAR line[MAX_BUFFER]; + int lh; + TEXTMETRICW tm; + int x, y; + int width; + int max_width = 0; + int last_line; + int tabwidth = 0; + RECT textrect = {0}; + + TRACE("iface %p, sprite %p, string %s, count %d, rect %s, format %#x, color 0x%08x\n", + iface, sprite, debugstr_w(string), count, wine_dbgstr_rect(rect), format, color); + + if (!string) + return 0; + + if (count < 0) + count = lstrlenW(string); + + if (count == 0) + return 0; + + if (format & DT_SINGLELINE) + format &= ~DT_WORDBREAK; + if (format & DT_CALCRECT) + format |= DT_NOCLIP; + + if (!rect) + { + y = ID3DXFont_DrawTextW(iface, NULL, string, count, &textrect, format | DT_CALCRECT, 0); + + if (format & DT_CALCRECT) + return y; + } + else + textrect = *rect; + + x = textrect.left; + y = textrect.top; + width = textrect.right - textrect.left; + strPtr = string; + + ID3DXFont_GetTextMetricsW(iface, &tm); + lh = tm.tmHeight; + + if (format & DT_EXPANDTABS) + tabwidth = tm.tmAveCharWidth * 8; + + if (!(format & DT_CALCRECT) && !sprite) + { + D3DXCreateSprite(This->device, &target); + ID3DXSprite_Begin(target, 0); + } + + do { + SIZE size; + int len = ARRAY_SIZE(line); + + last_line = !(format & DT_NOCLIP) && (y + lh > textrect.bottom); + strPtr = TEXT_NextLineW(This->hdc, strPtr, &count, line, &len, width, format, &size, last_line, tabwidth); + + if (format & DT_CENTER) + x = (textrect.left + textrect.right - size.cx) / 2; + else if (format & DT_RIGHT) + x = textrect.right - size.cx; + + if (format & DT_SINGLELINE) + { + if (format & DT_VCENTER) + y = textrect.top + (textrect.bottom - textrect.top) / 2 - size.cy / 2; + else if (format & DT_BOTTOM) + y = textrect.bottom - size.cy; + } + + if (!(format & DT_CALCRECT)) + { + int xseg = x; + const WCHAR *str = line; + + while (len) + { + int len_seg; + GCP_RESULTSW results; + D3DXVECTOR3 pos; + UINT i; + + if ((format & DT_EXPANDTABS)) + { + const WCHAR *p; + p = str; while (p < str+len && *p != TAB) p++; + len_seg = p - str; + if (len_seg != len && !GetTextExtentPointW(This->hdc, str, len_seg, &size)) + return 0; + } + else + len_seg = len; + + ZeroMemory(&results, sizeof(GCP_RESULTSW)); + results.lpCaretPos = heap_alloc(len_seg * sizeof(INT)); + results.lpGlyphs = heap_alloc(len_seg * sizeof(WORD)); + results.nGlyphs = len_seg; + + GetCharacterPlacementW(This->hdc, str, len_seg, 0, &results, 0); + + for (i = 0; i < results.nGlyphs; i++) + { + LPDIRECT3DTEXTURE9 tex; + RECT bbox; + POINT cinc; + + ID3DXFont_GetGlyphData(iface, results.lpGlyphs[i], &tex, &bbox, &cinc); + + if (!tex) + continue; + + pos.x = results.lpCaretPos[i] + cinc.x + xseg; + pos.y = cinc.y + y; + + ID3DXSprite_Draw(target, tex, &bbox, NULL, &pos, color); + IDirect3DTexture9_Release(tex); + } + + len -= len_seg; + str += len_seg; + if (len) + { + assert((format & DT_EXPANDTABS) && *str == TAB); + len--; str++; + xseg += ((size.cx/tabwidth)+1)*tabwidth; + } + } + } + else if (size.cx > max_width) + max_width = size.cx; + + y += lh; + } while (strPtr && !last_line); + + textrect.right = textrect.left + max_width; + textrect.bottom = y; + + if ((format & DT_CALCRECT) && rect) + *rect = textrect; + + if (target != sprite) + { + ID3DXSprite_End(target); + ID3DXSprite_Release(target); + } + + return y - textrect.top; }
static HRESULT WINAPI ID3DXFontImpl_OnLostDevice(ID3DXFont *iface) diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c index 8a0f164259..c2c83952fb 100644 --- a/dlls/d3dx9_36/tests/core.c +++ b/dlls/d3dx9_36/tests/core.c @@ -320,20 +320,21 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) unsigned int expected_height; unsigned int expected_size; unsigned int expected_levels; + BOOL todo; } tests[] = { - { 2, 2, 32, 2 }, - { 4, 4, 64, 3 }, - { 6, 6, 128, 4 }, - { 8, 8, 128, 4 }, - { 10, 10, 256, 5 }, - { 12, 12, 256, 5 }, - { 72, 72, 256, 8 }, - { 256, 255, 256, 9 }, - { 257, 255, 256, 9 }, - { 258, 258, 512, 10 }, - { 512, 512, 512, 10 }, + { 2, 2, 32, 2, FALSE}, + { 4, 4, 64, 3, TRUE}, + { 6, 6, 128, 4, FALSE}, + { 8, 8, 128, 4, TRUE}, + { 10, 10, 256, 5, FALSE}, + { 12, 12, 256, 5, FALSE}, + { 72, 72, 256, 8, FALSE}, + { 256, 255, 256, 9, TRUE}, + { 257, 255, 256, 9, TRUE}, + { 258, 258, 512, 10, FALSE}, + { 512, 512, 512, 10, FALSE}, }; const unsigned int size = ARRAY_SIZE(testW); D3DXFONT_DESCA desc; @@ -659,26 +660,24 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) hr = ID3DXSprite_Begin(sprite, D3DXSPRITE_ALPHABLEND); ok (hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine { height = ID3DXFont_DrawTextW(font, sprite, testW, -1, &rect, DT_TOP, 0xffffffff); - ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); + todo_wine_if(tests[i].todo) ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_TOP, 0xffffffff); - ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); + todo_wine_if(tests[i].todo) ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_RIGHT, 0xffffffff); - ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); + todo_wine_if(tests[i].todo) ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_LEFT | DT_NOCLIP, 0xffffffff); - ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); - } + todo_wine_if(tests[i].todo) ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height);
SetRectEmpty(&rect); height = ID3DXFont_DrawTextW(font, sprite, testW, size, &rect, DT_LEFT | DT_CALCRECT, 0xffffffff); - todo_wine ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); + todo_wine_if(tests[i].todo) ok(height == tests[i].expected_height, "Got unexpected height %u.\n", height); ok(!rect.left, "Got unexpected rect left %d.\n", rect.left); ok(!rect.top, "Got unexpected rect top %d.\n", rect.top); - todo_wine ok(rect.right, "Got unexpected rect right %d.\n", rect.right); - todo_wine ok(rect.bottom == tests[i].expected_height, "Got unexpected rect bottom %d.\n", rect.bottom); + ok(rect.right, "Got unexpected rect right %d.\n", rect.right); + todo_wine_if(tests[i].todo) ok(rect.bottom == tests[i].expected_height, "Got unexpected rect bottom %d.\n", rect.bottom);
hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "Got unexpected hr %#x.\n", hr); @@ -694,7 +693,6 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) RECT rect; int height;
- todo_wine { SetRect(&rect, 10, 10, 200, 200);
height = ID3DXFont_DrawTextA(font, NULL, "test", -2, &rect, 0, 0xFF00FF); @@ -730,7 +728,7 @@ static void test_ID3DXFont(IDirect3DDevice9 *device) SetRect(&rect, 10, 10, 50, 50);
height = ID3DXFont_DrawTextA(font, NULL, longText, -1, &rect, DT_WORDBREAK, 0xFF00FF); - ok(height == 60, "DrawTextA returned %d, expected 60.\n", height); + todo_wine ok(height == 60, "DrawTextA returned %d, expected 60.\n", height);
height = ID3DXFont_DrawTextA(font, NULL, longText, -1, &rect, DT_WORDBREAK | DT_NOCLIP, 0xFF00FF); ok(height == 96, "DrawTextA returned %d, expected 96.\n", height); @@ -772,11 +770,10 @@ if (0) { /* Causes a lockup on Windows 7+ */ SetRect(&rect, 10, 10, 50, 50);
height = ID3DXFont_DrawTextW(font, NULL, longTextW, -1, &rect, DT_WORDBREAK, 0xFF00FF); - ok(height == 60, "DrawTextW returned %d, expected 60.\n", height); + todo_wine ok(height == 60, "DrawTextW returned %d, expected 60.\n", height);
height = ID3DXFont_DrawTextW(font, NULL, longTextW, -1, &rect, DT_WORDBREAK | DT_NOCLIP, 0xFF00FF); ok(height == 96, "DrawTextW returned %d, expected 96.\n", height); - }
ID3DXFont_Release(font); } diff --git a/dlls/d3dx9_37/Makefile.in b/dlls/d3dx9_37/Makefile.in index a0896df82e..b9dda315f2 100644 --- a/dlls/d3dx9_37/Makefile.in +++ b/dlls/d3dx9_37/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=37 MODULE = d3dx9_37.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_38/Makefile.in b/dlls/d3dx9_38/Makefile.in index 24bbc3f0cf..adeb4f245a 100644 --- a/dlls/d3dx9_38/Makefile.in +++ b/dlls/d3dx9_38/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=38 MODULE = d3dx9_38.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_39/Makefile.in b/dlls/d3dx9_39/Makefile.in index a3f7626f33..0e210488f6 100644 --- a/dlls/d3dx9_39/Makefile.in +++ b/dlls/d3dx9_39/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=39 MODULE = d3dx9_39.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_40/Makefile.in b/dlls/d3dx9_40/Makefile.in index fbbcb0c04e..05349e4b40 100644 --- a/dlls/d3dx9_40/Makefile.in +++ b/dlls/d3dx9_40/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=40 MODULE = d3dx9_40.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_41/Makefile.in b/dlls/d3dx9_41/Makefile.in index 9b44213117..587e94b7d1 100644 --- a/dlls/d3dx9_41/Makefile.in +++ b/dlls/d3dx9_41/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=41 MODULE = d3dx9_41.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_42/Makefile.in b/dlls/d3dx9_42/Makefile.in index f725e87471..bb837c4e39 100644 --- a/dlls/d3dx9_42/Makefile.in +++ b/dlls/d3dx9_42/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=42 MODULE = d3dx9_42.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/d3dx9_43/Makefile.in b/dlls/d3dx9_43/Makefile.in index dbebc51ad0..0701cde7b7 100644 --- a/dlls/d3dx9_43/Makefile.in +++ b/dlls/d3dx9_43/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -DD3DX_SDK_VERSION=43 MODULE = d3dx9_43.dll IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 ucrtbase PARENTSRC = ../d3dx9_36 -DELAYIMPORTS = windowscodecs +DELAYIMPORTS = windowscodecs usp10
EXTRADLLFLAGS = -mno-cygwin