Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
September 2018
- 70 participants
- 627 discussions
11 Sep '18
From: Rodrigo Saboya <saboya(a)gmail.com>
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45786
Signed-off-by: Rodrigo Saboya <saboya(a)gmail.com>
---
loader/wine.inf.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 4f241c0447..f10284bedc 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -2806,7 +2806,7 @@ HKLM,%CurrentVersionNT%\Time Zones\E. Australia Standard Time,"TZI",1,a8,fd,ff,f
HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time,"Display",,"America/Sao_Paulo"
HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time,"Dlt",,"E. South America Daylight Time"
HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time,"Std",,"E. South America Standard Time"
-HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time,"TZI",1,b4,00,00,00,00,00,00,00,c4,ff,ff,ff,00,00,02,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,0a,00,00,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time,"TZI",1,b4,00,00,00,00,00,00,00,c4,ff,ff,ff,00,00,02,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,0b,00,00,00,01,00,00,00,00,00,00,00,00,00
HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time\Dynamic DST,"2015",1,b4,00,00,00,00,00,00,00,c4,ff,ff,ff,df,07,02,00,00,00,16,00,00,00,00,00,00,00,00,00,df,07,0a,00,00,00,12,00,00,00,00,00,00,00,00,00
HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time\Dynamic DST,"2023",1,b4,00,00,00,00,00,00,00,c4,ff,ff,ff,e7,07,02,00,00,00,1a,00,00,00,00,00,00,00,00,00,e7,07,0a,00,00,00,0f,00,00,00,00,00,00,00,00,00
HKLM,%CurrentVersionNT%\Time Zones\E. South America Standard Time\Dynamic DST,"2026",1,b4,00,00,00,00,00,00,00,c4,ff,ff,ff,ea,07,02,00,00,00,16,00,00,00,00,00,00,00,00,00,ea,07,0a,00,00,00,12,00,00,00,00,00,00,00,00,00
--
2.16.4
1
0
11 Sep '18
Fixes bug#45731
Avoid whitespace affecting the parsing of a for loops items. The leading and trailing quote or backtick
needed removing, and it was assumed that the trailing character would be that character, which was wrong
when there was whitespace unless the parameter is trimmed.
Signed-off-by: Jason Edmeades <us(a)edmeades.me.uk>
---
programs/cmd/builtins.c | 8 +++++++-
programs/cmd/tests/test_builtins.cmd | 7 ++++++-
programs/cmd/tests/test_builtins.cmd.exp | 4 ++++
3 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 25d5be145e..1e6181ddff 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -2069,17 +2069,22 @@ static HANDLE WCMD_forf_getinputhandle(BOOL usebackq, WCHAR *itemstr, BOOL iscmd
WCHAR temp_str[MAX_PATH];
WCHAR temp_file[MAX_PATH];
WCHAR temp_cmd[MAXSTRING];
+ WCHAR *trimmed = NULL;
HANDLE hinput = INVALID_HANDLE_VALUE;
static const WCHAR redirOutW[] = {'>','%','s','\0'};
static const WCHAR cmdW[] = {'C','M','D','\0'};
static const WCHAR cmdslashcW[] = {'C','M','D','.','E','X','E',' ',
'/','C',' ','%','s','\0'};
- /* Remove leading and trailing character */
+ /* Remove leading and trailing character (but there may be trailing whitespace too) */
if ((iscmd && (itemstr[0] == '`' && usebackq)) ||
(iscmd && (itemstr[0] == '\'' && !usebackq)) ||
(!iscmd && (itemstr[0] == '"' && usebackq)))
{
+ trimmed = WCMD_strtrim(itemstr);
+ if (trimmed) {
+ itemstr = trimmed;
+ }
itemstr[strlenW(itemstr)-1] = 0x00;
itemstr++;
}
@@ -2106,6 +2111,7 @@ static HANDLE WCMD_forf_getinputhandle(BOOL usebackq, WCHAR *itemstr, BOOL iscmd
hinput = CreateFileW(itemstr, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
+ heap_free(trimmed);
return hinput;
}
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index de9c8891ab..e74d4910ed 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1702,8 +1702,11 @@ mkdir foobar & cd foobar
echo ------ string argument
rem NT4 does not support usebackq
for /F %%i in ("a b c") do echo %%i
+for /F %%i in ( "a b c" ) do echo X%%iX
for /f usebackq %%i in ('a b c') do echo %%i>output_file
if not exist output_file (echo no output) else (type output_file & del output_file)
+for /f usebackq %%i in ( 'a b c' ) do echo X%%iX>output_file
+if not exist output_file (echo no output) else (type output_file & del output_file)
for /f %%i in ("a ") do echo %%i
for /f usebackq %%i in ('a ') do echo %%i>output_file
if not exist output_file (echo no output) else (type output_file & del output_file)
@@ -1755,9 +1758,11 @@ for /f "usebackq" %%i in (`echo.Passed2`) do echo %%i
for /f usebackq %%i in (`echo.Passed3`) do echo %%i
for /f "usebackq" %%i in (`"c:\windows\system32\cmd.exe" /C echo Passed4`) do echo %%i
for /f "usebackq" %%i in (`""c:\windows\system32\cmd.exe" /C echo Passed5"`) do echo %%i
+for /f %%i in ( 'echo.Passed6' ) do echo %%i
+for /f "usebackq" %%i in ( `echo.Passed7` ) do echo %%i
goto :ContinueFORF
:SkipFORFcmdNT4
-for /l %%i in (1,1,5) do echo Missing functionality - Broken%%i
+for /l %%i in (1,1,7) do echo Missing functionality - Broken%%i
:ContinueFORF
rem FIXME: Rest not testable right now in wine: not implemented and would need
rem preliminary grep-like program implementation (e.g. like findstr or fc) even
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 3829318956..021a5b0893 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -1180,7 +1180,9 @@ WINE_bar correctly 6(a)or_broken@ERROR: WINE_bar incorrectly 5 [6]
--- for /F
------ string argument
a
+XaX
a(a)or_broken@no output
+XaX(a)or_broken@no output
a
a(a)or_broken@no output
a
@@ -1218,6 +1220,8 @@ Passed2(a)or_broken@Missing functionality - Broken2
Passed3(a)or_broken@Missing functionality - Broken3
Passed4(a)or_broken@Missing functionality - Broken4
Passed5(a)or_broken@Missing functionality - Broken5
+Passed6(a)or_broken@Missing functionality - Broken6
+Passed7(a)or_broken@Missing functionality - Broken7
------ eol option
and(a)or_broken@Broken NT4 functionality1
Line(a)or_broken@Broken NT4 functionality2
--
2.17.1
2
3
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
configure | 1 +
configure.ac | 1 +
dlls/msftedit/tests/Makefile.in | 5 +
dlls/msftedit/tests/richole.c | 165 ++++++++++++++++++++++++++++++++
4 files changed, 172 insertions(+)
create mode 100644 dlls/msftedit/tests/Makefile.in
create mode 100644 dlls/msftedit/tests/richole.c
diff --git a/configure b/configure
index a3916ee233..818cb40fce 100755
--- a/configure
+++ b/configure
@@ -19595,6 +19595,7 @@ wine_fn_config_makefile dlls/msdmo enable_msdmo
wine_fn_config_makefile dlls/msdmo/tests enable_tests
wine_fn_config_makefile dlls/msdrm enable_msdrm
wine_fn_config_makefile dlls/msftedit enable_msftedit
+wine_fn_config_makefile dlls/msftedit/tests enable_tests
wine_fn_config_makefile dlls/msg711.acm enable_msg711_acm
wine_fn_config_makefile dlls/msgsm32.acm enable_msgsm32_acm
wine_fn_config_makefile dlls/mshtml.tlb enable_mshtml_tlb
diff --git a/configure.ac b/configure.ac
index 006f7d9fc2..605ad1690d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3451,6 +3451,7 @@ WINE_CONFIG_MAKEFILE(dlls/msdmo)
WINE_CONFIG_MAKEFILE(dlls/msdmo/tests)
WINE_CONFIG_MAKEFILE(dlls/msdrm)
WINE_CONFIG_MAKEFILE(dlls/msftedit)
+WINE_CONFIG_MAKEFILE(dlls/msftedit/tests)
WINE_CONFIG_MAKEFILE(dlls/msg711.acm)
WINE_CONFIG_MAKEFILE(dlls/msgsm32.acm)
WINE_CONFIG_MAKEFILE(dlls/mshtml.tlb)
diff --git a/dlls/msftedit/tests/Makefile.in b/dlls/msftedit/tests/Makefile.in
new file mode 100644
index 0000000000..99cc46a007
--- /dev/null
+++ b/dlls/msftedit/tests/Makefile.in
@@ -0,0 +1,5 @@
+TESTDLL = msftedit.dll
+IMPORTS = ole32 oleaut32 user32
+
+C_SRCS = \
+ richole.c
diff --git a/dlls/msftedit/tests/richole.c b/dlls/msftedit/tests/richole.c
new file mode 100644
index 0000000000..6191c8ac3a
--- /dev/null
+++ b/dlls/msftedit/tests/richole.c
@@ -0,0 +1,165 @@
+/*
+ * Tests for IRichEditOle and friends.
+ *
+ * Copyright 2008 Google (Dan Hipschman)
+ * Copyright 2018 Jactry Zeng for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include <stdarg.h>
+
+#include <windef.h>
+#include <winbase.h>
+#include <initguid.h>
+#include <ole2.h>
+#include <richedit.h>
+#include <richole.h>
+#include <tom.h>
+#include <wine/test.h>
+
+static HMODULE msftedit_hmodule;
+
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
+static void _expect_ref(IUnknown* obj, ULONG ref, int line)
+{
+ ULONG rc;
+ IUnknown_AddRef(obj);
+ rc = IUnknown_Release(obj);
+ ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc);
+}
+
+static HWND new_window(LPCWSTR classname, DWORD dwstyle, HWND parent)
+{
+ HWND hwnd = CreateWindowW(classname, NULL,
+ dwstyle | WS_POPUP | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE,
+ 0, 0, 200, 60, parent, NULL, msftedit_hmodule, NULL);
+ ok(hwnd != NULL, "class: %s, error: %d\n", wine_dbgstr_w(classname), (int) GetLastError());
+ return hwnd;
+}
+
+static void test_Interfaces(void)
+{
+ IRichEditOle *reole = NULL, *reole1 = NULL;
+ ITextDocument *txtdoc = NULL;
+ ITextDocument2Old *txtdoc2Old = NULL;
+ ITextSelection *txtsel = NULL, *txtsel2;
+ IUnknown *punk;
+ HRESULT hres;
+ LRESULT res;
+ HWND hwnd;
+ ULONG refcount;
+
+ hwnd = new_window(MSFTEDIT_CLASS, ES_MULTILINE, NULL);
+ if (!hwnd)
+ {
+ skip("Couldn't create window\n");
+ return;
+ }
+
+ res = SendMessageA(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&reole);
+ ok(res, "SendMessage\n");
+ ok(reole != NULL, "EM_GETOLEINTERFACE\n");
+ EXPECT_REF(reole, 2);
+
+ res = SendMessageA(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&reole1);
+ ok(res == 1, "SendMessage\n");
+ ok(reole1 == reole, "Should not return a new IRichEditOle interface\n");
+ EXPECT_REF(reole, 3);
+
+ hres = IRichEditOle_QueryInterface(reole, &IID_ITextDocument, (void **)&txtdoc);
+ ok(hres == S_OK, "IRichEditOle_QueryInterface\n");
+ ok(txtdoc != NULL, "IRichEditOle_QueryInterface\n");
+
+ hres = ITextDocument_GetSelection(txtdoc, NULL);
+ ok(hres == E_INVALIDARG, "ITextDocument_GetSelection: 0x%x\n", hres);
+
+ EXPECT_REF(txtdoc, 4);
+
+ hres = ITextDocument_GetSelection(txtdoc, &txtsel);
+ ok(hres == S_OK, "got 0x%08x\n", hres);
+
+ EXPECT_REF(txtdoc, 4);
+ EXPECT_REF(txtsel, 2);
+
+ hres = ITextDocument_GetSelection(txtdoc, &txtsel2);
+ ok(hres == S_OK, "got 0x%08x\n", hres);
+ ok(txtsel2 == txtsel, "got %p, %p\n", txtsel, txtsel2);
+
+ EXPECT_REF(txtdoc, 4);
+ EXPECT_REF(txtsel, 3);
+
+ ITextSelection_Release(txtsel2);
+
+ punk = NULL;
+ hres = ITextSelection_QueryInterface(txtsel, &IID_ITextSelection, (void **)&punk);
+ ok(hres == S_OK, "ITextSelection_QueryInterface\n");
+ ok(punk != NULL, "ITextSelection_QueryInterface\n");
+ IUnknown_Release(punk);
+
+ punk = NULL;
+ hres = ITextSelection_QueryInterface(txtsel, &IID_ITextRange, (void **)&punk);
+ ok(hres == S_OK, "ITextSelection_QueryInterface\n");
+ ok(punk != NULL, "ITextSelection_QueryInterface\n");
+ IUnknown_Release(punk);
+
+ punk = NULL;
+ hres = ITextSelection_QueryInterface(txtsel, &IID_IDispatch, (void **)&punk);
+ ok(hres == S_OK, "ITextSelection_QueryInterface\n");
+ ok(punk != NULL, "ITextSelection_QueryInterface\n");
+ IUnknown_Release(punk);
+
+ punk = NULL;
+ hres = IRichEditOle_QueryInterface(reole, &IID_IOleClientSite, (void **)&punk);
+ ok(hres == E_NOINTERFACE, "IRichEditOle_QueryInterface\n");
+
+ punk = NULL;
+ hres = IRichEditOle_QueryInterface(reole, &IID_IOleWindow, (void **)&punk);
+ ok(hres == E_NOINTERFACE, "IRichEditOle_QueryInterface\n");
+
+ punk = NULL;
+ hres = IRichEditOle_QueryInterface(reole, &IID_IOleInPlaceSite, (void **)&punk);
+ ok(hres == E_NOINTERFACE, "IRichEditOle_QueryInterface\n");
+
+ hres = IRichEditOle_QueryInterface(reole, &IID_ITextDocument2Old, (void **)&txtdoc2Old);
+ ok(hres == S_OK, "IRichEditOle_QueryInterface\n");
+ ok(txtdoc2Old != NULL, "IRichEditOle_QueryInterface\n");
+ EXPECT_REF(txtdoc2Old, 5);
+ EXPECT_REF(reole, 5);
+ ITextDocument2Old_Release(txtdoc2Old);
+
+ ITextDocument_Release(txtdoc);
+ IRichEditOle_Release(reole);
+ refcount = IRichEditOle_Release(reole);
+ ok(refcount == 1, "got wrong ref count: %d\n", refcount);
+ DestroyWindow(hwnd);
+
+ /* Methods should return CO_E_RELEASED if the backing document has
+ been released. One test should suffice. */
+ hres = ITextSelection_CanEdit(txtsel, NULL);
+ ok(hres == CO_E_RELEASED, "ITextSelection after ITextDocument destroyed\n");
+
+ ITextSelection_Release(txtsel);
+}
+
+START_TEST(richole)
+{
+ msftedit_hmodule = LoadLibraryA("msftedit.dll");
+ ok(msftedit_hmodule != NULL, "error: %d\n", (int) GetLastError());
+
+ test_Interfaces();
+}
--
2.18.0
2
1
11 Sep '18
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/msvcrt/math.c | 2 +-
dlls/ucrtbase/tests/misc.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 8d5b687b6f..a1ba552632 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -1015,7 +1015,7 @@ double CDECL MSVCRT_ldexp(double num, MSVCRT_long exp)
if (isfinite(num) && !isfinite(z))
math_error(_OVERFLOW, "ldexp", num, exp, z);
- else if (isfinite(num) && !z)
+ else if (num && isfinite(num) && !z)
math_error(_UNDERFLOW, "ldexp", num, exp, z);
else if (z == 0 && signbit(z))
z = 0.0; /* Convert -0 -> +0 */
diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c
index 2a9648ab6e..bd8034e994 100644
--- a/dlls/ucrtbase/tests/misc.c
+++ b/dlls/ucrtbase/tests/misc.c
@@ -694,11 +694,13 @@ static void test_math_errors(void)
} testsdl[] = {
{"_scalb", -INFINITY, 1, -1, -1},
{"_scalb", -1e100, 1, -1, -1},
+ {"_scalb", 0, 1, -1, -1},
{"_scalb", 1e100, 1, -1, -1},
{"_scalb", INFINITY, 1, -1, -1},
{"_scalb", 1, 1e9, ERANGE, _OVERFLOW},
{"ldexp", -INFINITY, 1, -1, -1},
{"ldexp", -1e100, 1, -1, -1},
+ {"ldexp", 0, 1, -1, -1},
{"ldexp", 1e100, 1, -1, -1},
{"ldexp", INFINITY, 1, -1, -1},
{"ldexp", 1, -1e9, -1, _UNDERFLOW},
--
2.18.0
2
1
[PATCH 4/4] ddraw: Accept the d3d1 and d3d2 versions of D3DFINDDEVICERESULT in ddraw_find_device().
by Henri Verbeet 11 Sep '18
by Henri Verbeet 11 Sep '18
11 Sep '18
From: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
Based off a patch by Michael Müller.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/ddraw/ddraw.c | 69 ++++++++++++++++++++++++++++++++++++++++-------
dlls/ddraw/tests/ddraw1.c | 57 ++++++++++++++++++++++++++++++++++++++-
dlls/ddraw/tests/ddraw2.c | 57 ++++++++++++++++++++++++++++++++++++++-
dlls/ddraw/tests/ddraw4.c | 57 ++++++++++++++++++++++++++++++++++++++-
include/d3dhal.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 297 insertions(+), 12 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 170a5492784..c83d0ca1568 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -25,6 +25,8 @@
#include "wine/port.h"
#include "ddraw_private.h"
+#include "ddrawi.h"
+#include "d3dhal.h"
#include "wine/exception.h"
@@ -4019,20 +4021,44 @@ static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport **
}
static HRESULT ddraw_find_device(struct ddraw *ddraw, const D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr,
- unsigned int guid_count, const GUID * const *guids)
-{
+ unsigned int guid_count, const GUID * const *guids, DWORD device_desc_size)
+{
+ struct ddraw_find_device_result_v1
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V1 hw_desc;
+ D3DDEVICEDESC_V1 sw_desc;
+ } *fdr1;
+ struct ddraw_find_device_result_v2
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V2 hw_desc;
+ D3DDEVICEDESC_V2 sw_desc;
+ } *fdr2;
D3DDEVICEDESC7 desc7;
D3DDEVICEDESC desc1;
unsigned int i;
HRESULT hr;
- TRACE("ddraw %p, fds %p, fdr %p, guid_count %u, guids %p.\n", ddraw, fds, fdr, guid_count, guids);
+ TRACE("ddraw %p, fds %p, fdr %p, guid_count %u, guids %p, device_desc_size %u.\n",
+ ddraw, fds, fdr, guid_count, guids, device_desc_size);
if (!fds || !fdr)
return DDERR_INVALIDPARAMS;
- if (fds->dwSize != sizeof(*fds) || fdr->dwSize != sizeof(*fdr))
+ if (fds->dwSize != sizeof(*fds))
+ {
+ WARN("Got invalid search structure size %u.\n", fds->dwSize);
+ return DDERR_INVALIDPARAMS;
+ }
+
+ if (fdr->dwSize != sizeof(*fdr) && fdr->dwSize != sizeof(*fdr2) && fdr->dwSize != sizeof(*fdr1))
+ {
+ WARN("Got invalid result structure size %u.\n", fdr->dwSize);
return DDERR_INVALIDPARAMS;
+ }
if (fds->dwFlags & D3DFDS_COLORMODEL)
WARN("Ignoring colour model %#x.\n", fds->dcmColorModel);
@@ -4066,8 +4092,33 @@ static HRESULT ddraw_find_device(struct ddraw *ddraw, const D3DFINDDEVICESEARCH
/* Now return our own GUID */
ddraw_d3dcaps1_from_7(&desc1, &desc7);
fdr->guid = IID_D3DDEVICE_WineD3D;
- fdr->ddHwDesc = desc1;
- fdr->ddSwDesc = desc1;
+
+ /* Note that "device_desc_size" doesn't necessarily have any relation to
+ * the actual structure size. However, this matches the behaviour of
+ * Windows since at least Windows 2000. */
+ if (fdr->dwSize == sizeof(*fdr1))
+ {
+ fdr1 = (struct ddraw_find_device_result_v1 *)fdr;
+ memcpy(&fdr1->hw_desc, &desc1, sizeof(fdr1->hw_desc));
+ fdr1->hw_desc.dwSize = device_desc_size;
+ memcpy(&fdr1->sw_desc, &desc1, sizeof(fdr1->sw_desc));
+ fdr1->sw_desc.dwSize = device_desc_size;
+ }
+ else if (fdr->dwSize == sizeof(*fdr2))
+ {
+ fdr2 = (struct ddraw_find_device_result_v2 *)fdr;
+ memcpy(&fdr2->hw_desc, &desc1, sizeof(fdr2->hw_desc));
+ fdr2->hw_desc.dwSize = device_desc_size;
+ memcpy(&fdr2->sw_desc, &desc1, sizeof(fdr2->sw_desc));
+ fdr2->sw_desc.dwSize = device_desc_size;
+ }
+ else
+ {
+ fdr->ddHwDesc = desc1;
+ fdr->ddHwDesc.dwSize = device_desc_size;
+ fdr->ddSwDesc = desc1;
+ fdr->ddSwDesc.dwSize = device_desc_size;
+ }
TRACE("Returning Wine's wined3d device with (undumped) capabilities.\n");
@@ -4086,7 +4137,7 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd
TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
- return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids);
+ return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V3));
}
static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
@@ -4103,7 +4154,7 @@ static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fd
TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
- return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids);
+ return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V2));
}
static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
@@ -4119,7 +4170,7 @@ static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds
TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
- return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids);
+ return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V1));
}
/*****************************************************************************
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index ba9f128dad7..ee4fa5bfaab 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -22,7 +22,8 @@
#include "wine/test.h"
#include <limits.h>
#include <math.h>
-#include "d3d.h"
+#include "ddrawi.h"
+#include "d3dhal.h"
static BOOL is_ddraw64 = sizeof(DWORD) != sizeof(DWORD *);
static DEVMODEW registry_mode;
@@ -11724,6 +11725,22 @@ static void test_find_device(void)
HWND window;
HRESULT hr;
+ struct
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V1 hw_desc;
+ D3DDEVICEDESC_V1 sw_desc;
+ } result_v1;
+
+ struct
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V2 hw_desc;
+ D3DDEVICEDESC_V2 sw_desc;
+ } result_v2;
+
static const struct
{
const GUID *guid;
@@ -11761,6 +11778,10 @@ static void test_find_device(void)
hr = IDirect3D_FindDevice(d3d, &search, &result);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
ok(result.dwSize == sizeof(result), "Got unexpected result size %u.\n", result.dwSize);
+ ok(result.ddHwDesc.dwSize == sizeof(result_v1.hw_desc),
+ "Got unexpected HW desc size %u.\n", result.ddHwDesc.dwSize);
+ ok(result.ddSwDesc.dwSize == sizeof(result_v1.sw_desc),
+ "Got unexpected SW desc size %u.\n", result.ddSwDesc.dwSize);
memset(&search, 0, sizeof(search));
memset(&result, 0, sizeof(result));
@@ -11772,6 +11793,26 @@ static void test_find_device(void)
hr = IDirect3D_FindDevice(d3d, &search, &result);
ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr);
+ search.dwSize = sizeof(search);
+
+ memset(&result_v1, 0, sizeof(result_v1));
+ result_v1.size = sizeof(result_v1);
+ hr = IDirect3D_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v1);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(result_v1.hw_desc.dwSize == sizeof(result_v1.hw_desc),
+ "Got unexpected HW desc size %u.\n", result_v1.hw_desc.dwSize);
+ ok(result_v1.sw_desc.dwSize == sizeof(result_v1.sw_desc),
+ "Got unexpected SW desc size %u.\n", result_v1.sw_desc.dwSize);
+
+ memset(&result_v2, 0, sizeof(result_v2));
+ result_v2.size = sizeof(result_v2);
+ hr = IDirect3D_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v2);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(result_v2.hw_desc.dwSize == sizeof(result_v1.hw_desc),
+ "Got unexpected HW desc size %u.\n", result_v2.hw_desc.dwSize);
+ ok(result_v2.sw_desc.dwSize == sizeof(result_v1.sw_desc),
+ "Got unexpected SW desc size %u.\n", result_v2.sw_desc.dwSize);
+
for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
memset(&search, 0, sizeof(search));
@@ -11785,6 +11826,20 @@ static void test_find_device(void)
hr = IDirect3D_FindDevice(d3d, &search, &result);
ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr);
ok(result.dwSize == sizeof(result), "Test %u: Got unexpected result size %u.\n", i, result.dwSize);
+ if (SUCCEEDED(hr))
+ {
+ ok(result.ddHwDesc.dwSize == sizeof(result_v1.hw_desc),
+ "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize);
+ ok(result.ddSwDesc.dwSize == sizeof(result_v1.sw_desc),
+ "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize);
+ }
+ else
+ {
+ ok(!result.ddHwDesc.dwSize,
+ "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize);
+ ok(!result.ddSwDesc.dwSize,
+ "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize);
+ }
}
/* The HAL device can only be enumerated if hardware acceleration is present. */
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index b5739c3ab4d..9394705330a 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -24,7 +24,8 @@
#include "wine/test.h"
#include <limits.h>
#include <math.h>
-#include "d3d.h"
+#include "ddrawi.h"
+#include "d3dhal.h"
static BOOL is_ddraw64 = sizeof(DWORD) != sizeof(DWORD *);
static DEVMODEW registry_mode;
@@ -13006,6 +13007,22 @@ static void test_find_device(void)
HWND window;
HRESULT hr;
+ struct
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V1 hw_desc;
+ D3DDEVICEDESC_V1 sw_desc;
+ } result_v1;
+
+ struct
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V2 hw_desc;
+ D3DDEVICEDESC_V2 sw_desc;
+ } result_v2;
+
static const struct
{
const GUID *guid;
@@ -13043,6 +13060,10 @@ static void test_find_device(void)
hr = IDirect3D2_FindDevice(d3d, &search, &result);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
ok(result.dwSize == sizeof(result), "Got unexpected result size %u.\n", result.dwSize);
+ ok(result.ddHwDesc.dwSize == sizeof(result_v2.hw_desc),
+ "Got unexpected HW desc size %u.\n", result.ddHwDesc.dwSize);
+ ok(result.ddSwDesc.dwSize == sizeof(result_v2.sw_desc),
+ "Got unexpected SW desc size %u.\n", result.ddSwDesc.dwSize);
memset(&search, 0, sizeof(search));
memset(&result, 0, sizeof(result));
@@ -13054,6 +13075,26 @@ static void test_find_device(void)
hr = IDirect3D2_FindDevice(d3d, &search, &result);
ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr);
+ search.dwSize = sizeof(search);
+
+ memset(&result_v1, 0, sizeof(result_v1));
+ result_v1.size = sizeof(result_v1);
+ hr = IDirect3D2_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v1);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(result_v1.hw_desc.dwSize == sizeof(result_v2.hw_desc),
+ "Got unexpected HW desc size %u.\n", result_v1.hw_desc.dwSize);
+ ok(result_v1.sw_desc.dwSize == sizeof(result_v2.sw_desc),
+ "Got unexpected SW desc size %u.\n", result_v1.sw_desc.dwSize);
+
+ memset(&result_v2, 0, sizeof(result_v2));
+ result_v2.size = sizeof(result_v2);
+ hr = IDirect3D2_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v2);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(result_v2.hw_desc.dwSize == sizeof(result_v2.hw_desc),
+ "Got unexpected HW desc size %u.\n", result_v2.hw_desc.dwSize);
+ ok(result_v2.sw_desc.dwSize == sizeof(result_v2.sw_desc),
+ "Got unexpected SW desc size %u.\n", result_v2.sw_desc.dwSize);
+
for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
memset(&search, 0, sizeof(search));
@@ -13067,6 +13108,20 @@ static void test_find_device(void)
hr = IDirect3D2_FindDevice(d3d, &search, &result);
ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr);
ok(result.dwSize == sizeof(result), "Test %u: Got unexpected result size %u.\n", i, result.dwSize);
+ if (SUCCEEDED(hr))
+ {
+ ok(result.ddHwDesc.dwSize == sizeof(result_v2.hw_desc),
+ "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize);
+ ok(result.ddSwDesc.dwSize == sizeof(result_v2.sw_desc),
+ "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize);
+ }
+ else
+ {
+ ok(!result.ddHwDesc.dwSize,
+ "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize);
+ ok(!result.ddSwDesc.dwSize,
+ "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize);
+ }
}
/* The HAL device can only be enumerated if hardware acceleration is present. */
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 337ccb06e42..6a3630a2c0e 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -22,7 +22,8 @@
#include "wine/test.h"
#include <limits.h>
#include <math.h>
-#include "d3d.h"
+#include "ddrawi.h"
+#include "d3dhal.h"
HRESULT WINAPI GetSurfaceFromDC(HDC dc, struct IDirectDrawSurface **surface, HDC *device_dc);
@@ -15100,6 +15101,22 @@ static void test_find_device(void)
HWND window;
HRESULT hr;
+ struct
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V1 hw_desc;
+ D3DDEVICEDESC_V1 sw_desc;
+ } result_v1;
+
+ struct
+ {
+ DWORD size;
+ GUID guid;
+ D3DDEVICEDESC_V2 hw_desc;
+ D3DDEVICEDESC_V2 sw_desc;
+ } result_v2;
+
static const struct
{
const GUID *guid;
@@ -15137,6 +15154,10 @@ static void test_find_device(void)
hr = IDirect3D3_FindDevice(d3d, &search, &result);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
ok(result.dwSize == sizeof(result), "Got unexpected result size %u.\n", result.dwSize);
+ ok(result.ddHwDesc.dwSize == sizeof(result.ddHwDesc),
+ "Got unexpected HW desc size %u.\n", result.ddHwDesc.dwSize);
+ ok(result.ddSwDesc.dwSize == sizeof(result.ddSwDesc),
+ "Got unexpected SW desc size %u.\n", result.ddSwDesc.dwSize);
memset(&search, 0, sizeof(search));
memset(&result, 0, sizeof(result));
@@ -15148,6 +15169,26 @@ static void test_find_device(void)
hr = IDirect3D3_FindDevice(d3d, &search, &result);
ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr);
+ search.dwSize = sizeof(search);
+
+ memset(&result_v1, 0, sizeof(result_v1));
+ result_v1.size = sizeof(result_v1);
+ hr = IDirect3D3_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v1);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(result_v1.hw_desc.dwSize == sizeof(result.ddHwDesc),
+ "Got unexpected HW desc size %u.\n", result_v1.hw_desc.dwSize);
+ ok(result_v1.sw_desc.dwSize == sizeof(result.ddSwDesc),
+ "Got unexpected SW desc size %u.\n", result_v1.sw_desc.dwSize);
+
+ memset(&result_v2, 0, sizeof(result_v2));
+ result_v2.size = sizeof(result_v2);
+ hr = IDirect3D3_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v2);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(result_v2.hw_desc.dwSize == sizeof(result.ddHwDesc),
+ "Got unexpected HW desc size %u.\n", result_v2.hw_desc.dwSize);
+ ok(result_v2.sw_desc.dwSize == sizeof(result.ddSwDesc),
+ "Got unexpected SW desc size %u.\n", result_v2.sw_desc.dwSize);
+
for (i = 0; i < ARRAY_SIZE(tests); ++i)
{
memset(&search, 0, sizeof(search));
@@ -15161,6 +15202,20 @@ static void test_find_device(void)
hr = IDirect3D3_FindDevice(d3d, &search, &result);
ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr);
ok(result.dwSize == sizeof(result), "Test %u: Got unexpected result size %u.\n", i, result.dwSize);
+ if (SUCCEEDED(hr))
+ {
+ ok(result.ddHwDesc.dwSize == sizeof(result.ddHwDesc),
+ "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize);
+ ok(result.ddSwDesc.dwSize == sizeof(result.ddSwDesc),
+ "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize);
+ }
+ else
+ {
+ ok(!result.ddHwDesc.dwSize,
+ "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize);
+ ok(!result.ddSwDesc.dwSize,
+ "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize);
+ }
}
/* The HAL device can only be enumerated if hardware acceleration is present. */
diff --git a/include/d3dhal.h b/include/d3dhal.h
index 9d43313a00b..409cbfdf83b 100644
--- a/include/d3dhal.h
+++ b/include/d3dhal.h
@@ -47,6 +47,75 @@ typedef struct _D3DDeviceDesc_V1 {
DWORD dwMaxVertexCount;
} D3DDEVICEDESC_V1,*LPD3DDEVICEDESC_V1;
+typedef struct _D3DDeviceDesc_V2
+{
+ DWORD dwSize;
+ DWORD dwFlags;
+ D3DCOLORMODEL dcmColorModel;
+ DWORD dwDevCaps;
+ D3DTRANSFORMCAPS dtcTransformCaps;
+ BOOL bClipping;
+ D3DLIGHTINGCAPS dlcLightingCaps;
+ D3DPRIMCAPS dpcLineCaps;
+ D3DPRIMCAPS dpcTriCaps;
+ DWORD dwDeviceRenderBitDepth;
+ DWORD dwDeviceZBufferBitDepth;
+ DWORD dwMaxBufferSize;
+ DWORD dwMaxVertexCount;
+
+ /* DirectX 5 */
+ DWORD dwMinTextureWidth;
+ DWORD dwMinTextureHeight;
+ DWORD dwMaxTextureWidth;
+ DWORD dwMaxTextureHeight;
+ DWORD dwMinStippleWidth;
+ DWORD dwMaxStippleWidth;
+ DWORD dwMinStippleHeight;
+ DWORD dwMaxStippleHeight;
+} D3DDEVICEDESC_V2, *LPD3DDEVICEDESC_V2;
+
+typedef struct _D3DDeviceDesc_V3
+{
+ DWORD dwSize;
+ DWORD dwFlags;
+ D3DCOLORMODEL dcmColorModel;
+ DWORD dwDevCaps;
+ D3DTRANSFORMCAPS dtcTransformCaps;
+ BOOL bClipping;
+ D3DLIGHTINGCAPS dlcLightingCaps;
+ D3DPRIMCAPS dpcLineCaps;
+ D3DPRIMCAPS dpcTriCaps;
+ DWORD dwDeviceRenderBitDepth;
+ DWORD dwDeviceZBufferBitDepth;
+ DWORD dwMaxBufferSize;
+ DWORD dwMaxVertexCount;
+
+ /* DirectX 5 */
+ DWORD dwMinTextureWidth;
+ DWORD dwMinTextureHeight;
+ DWORD dwMaxTextureWidth;
+ DWORD dwMaxTextureHeight;
+ DWORD dwMinStippleWidth;
+ DWORD dwMaxStippleWidth;
+ DWORD dwMinStippleHeight;
+ DWORD dwMaxStippleHeight;
+
+ /* DirectX 6 */
+ DWORD dwMaxTextureRepeat;
+ DWORD dwMaxTextureAspectRatio;
+ DWORD dwMaxAnisotropy;
+ D3DVALUE dvGuardBandLeft;
+ D3DVALUE dvGuardBandTop;
+ D3DVALUE dvGuardBandRight;
+ D3DVALUE dvGuardBandBottom;
+ D3DVALUE dvExtentsAdjust;
+ DWORD dwStencilCaps;
+ DWORD dwFVFCaps;
+ DWORD dwTextureOpCaps;
+ WORD wMaxTextureBlendStages;
+ WORD wMaxSimultaneousTextures;
+} D3DDEVICEDESC_V3, *LPD3DDEVICEDESC_V3;
+
typedef struct _D3DHAL_GLOBALDRIVERDATA {
DWORD dwSize;
D3DDEVICEDESC_V1 hwCaps;
--
2.11.0
2
1
11 Sep '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/ddraw/ddraw.c | 8 ++------
dlls/ddraw/tests/ddraw1.c | 2 +-
dlls/ddraw/tests/ddraw2.c | 2 +-
dlls/ddraw/tests/ddraw4.c | 2 +-
4 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index e60c5f345af..e5f1e4f8c75 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4049,12 +4049,8 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd
|| fdr->dwSize != sizeof(D3DFINDDEVICERESULT))
return DDERR_INVALIDPARAMS;
- if ((fds->dwFlags & D3DFDS_COLORMODEL)
- && fds->dcmColorModel != D3DCOLOR_RGB)
- {
- WARN("Trying to request a non-RGB D3D color model. Not supported.\n");
- return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */
- }
+ if (fds->dwFlags & D3DFDS_COLORMODEL)
+ WARN("Ignoring colour model %#x.\n", fds->dcmColorModel);
if (fds->dwFlags & D3DFDS_GUID)
{
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 641847aa38d..b8dafdb6281 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -11812,7 +11812,7 @@ static void test_find_device(void)
search.dcmColorModel = 0xdeadbeef;
result.dwSize = sizeof(result);
hr = IDirect3D_FindDevice(d3d, &search, &result);
- todo_wine ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
IDirect3D_Release(d3d);
IDirectDraw_Release(ddraw);
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 02f430afa1a..762b4d9aba3 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -13094,7 +13094,7 @@ static void test_find_device(void)
search.dcmColorModel = 0xdeadbeef;
result.dwSize = sizeof(result);
hr = IDirect3D2_FindDevice(d3d, &search, &result);
- todo_wine ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
IDirect3D2_Release(d3d);
IDirectDraw2_Release(ddraw);
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 942d0253c46..337ccb06e42 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -15186,7 +15186,7 @@ static void test_find_device(void)
search.dcmColorModel = 0xdeadbeef;
result.dwSize = sizeof(result);
hr = IDirect3D3_FindDevice(d3d, &search, &result);
- todo_wine ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
IDirect3D3_Release(d3d);
IDirectDraw4_Release(ddraw);
--
2.11.0
2
1
[PATCH v2 3/4] riched20: Add IID_ITextDocument2Old support for ITextServices::QueryInterface().
by Jactry Zeng 11 Sep '18
by Jactry Zeng 11 Sep '18
11 Sep '18
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=20613
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
dlls/riched20/editor.h | 1 +
dlls/riched20/richole.c | 6 ++++++
dlls/riched20/tests/txtsrv.c | 34 ++++++++++++++++++++++++++++++++++
dlls/riched20/txtsrv.c | 5 ++++-
4 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 141c63aca9..0f86a07e0a 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -234,6 +234,7 @@ void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) DECLSPEC
void ME_CopyReObject(REOBJECT *dst, const REOBJECT *src, DWORD flags) DECLSPEC_HIDDEN;
void ME_DeleteReObject(struct re_object *re_object) DECLSPEC_HIDDEN;
void ME_GetITextDocumentInterface(IRichEditOle *iface, LPVOID *ppvObj) DECLSPEC_HIDDEN;
+void ME_GetITextDocument2OldInterface(IRichEditOle *iface, LPVOID *ppvObj) DECLSPEC_HIDDEN;
/* editor.c */
ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index c5d2d7c99a..889b740ed4 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -6013,3 +6013,9 @@ void ME_GetITextDocumentInterface(IRichEditOle *iface, LPVOID *ppvObj)
IRichEditOleImpl *This = impl_from_IRichEditOle(iface);
*ppvObj = &This->ITextDocument_iface;
}
+
+void ME_GetITextDocument2OldInterface(IRichEditOle *iface, LPVOID *ppvObj)
+{
+ IRichEditOleImpl *This = impl_from_IRichEditOle(iface);
+ *ppvObj = &This->ITextDocument2Old_iface;
+}
diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c
index a8cf6ff1ad..1aa08f89a4 100644
--- a/dlls/riched20/tests/txtsrv.c
+++ b/dlls/riched20/tests/txtsrv.c
@@ -904,6 +904,7 @@ static void test_QueryInterface(void)
HRESULT hres;
IRichEditOle *reole, *txtsrv_reole;
ITextDocument *txtdoc, *txtsrv_txtdoc;
+ ITextDocument2Old *txtdoc2old, *txtsrv_txtdoc2old;
ULONG refcount;
if(!init_texthost(&txtserv, &host))
@@ -930,6 +931,17 @@ static void test_QueryInterface(void)
ITextDocument_Release(txtdoc);
refcount = get_refcount((IUnknown *)txtserv);
ok(refcount == 2, "got wrong ref count: %d\n", refcount);
+
+ hres = IRichEditOle_QueryInterface(txtsrv_reole, &IID_ITextDocument2Old, (void **)&txtdoc2old);
+ ok(hres == S_OK, "IRichEditOle_QueryInterface: 0x%08x\n", hres);
+ refcount = get_refcount((IUnknown *)txtserv);
+ ok(refcount == 3, "got wrong ref count: %d\n", refcount);
+ refcount = get_refcount((IUnknown *)txtsrv_reole);
+ ok(refcount == 3, "got wrong ref count: %d\n", refcount);
+
+ ITextDocument2Old_Release(txtdoc2old);
+ refcount = get_refcount((IUnknown *)txtserv);
+ ok(refcount == 2, "got wrong ref count: %d\n", refcount);
IRichEditOle_Release(txtsrv_reole);
refcount = get_refcount((IUnknown *)txtserv);
ok(refcount == 1, "got wrong ref count: %d\n", refcount);
@@ -956,6 +968,28 @@ static void test_QueryInterface(void)
refcount = get_refcount((IUnknown *)txtserv);
ok(refcount == 1, "got wrong ref count: %d\n", refcount);
+ /* ITextDocument2Old */
+ hres = ITextServices_QueryInterface(txtserv, &IID_ITextDocument2Old, (void **)&txtsrv_txtdoc2old);
+ ok(hres == S_OK, "ITextServices_QueryInterface: 0x%08x\n", hres);
+ refcount = get_refcount((IUnknown *)txtserv);
+ ok(refcount == 2, "got wrong ref count: %d\n", refcount);
+ refcount = get_refcount((IUnknown *)txtsrv_txtdoc2old);
+ ok(refcount == 2, "got wrong ref count: %d\n", refcount);
+
+ hres = ITextDocument2Old_QueryInterface(txtsrv_txtdoc2old, &IID_IRichEditOle, (void **)&reole);
+ ok(hres == S_OK, "ITextDocument2Old_QueryInterface: 0x%08x\n", hres);
+ refcount = get_refcount((IUnknown *)txtserv);
+ ok(refcount == 3, "got wrong ref count: %d\n", refcount);
+ refcount = get_refcount((IUnknown *)txtsrv_txtdoc2old);
+ ok(refcount == 3, "got wrong ref count: %d\n", refcount);
+
+ IRichEditOle_Release(reole);
+ refcount = get_refcount((IUnknown *)txtserv);
+ ok(refcount == 2, "got wrong ref count: %d\n", refcount);
+ ITextDocument2Old_Release(txtsrv_txtdoc2old);
+ refcount = get_refcount((IUnknown *)txtserv);
+ ok(refcount == 1, "got wrong ref count: %d\n", refcount);
+
ITextServices_Release(txtserv);
ITextHost_Release(host);
}
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index ee65621b1d..090ea3490c 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -78,12 +78,15 @@ static HRESULT WINAPI ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID r
*ppv = &This->IUnknown_inner;
else if (IsEqualIID(riid, &IID_ITextServices))
*ppv = &This->ITextServices_iface;
- else if (IsEqualIID(riid, &IID_IRichEditOle) || IsEqualIID(riid, &IID_ITextDocument)) {
+ else if (IsEqualIID(riid, &IID_IRichEditOle) || IsEqualIID(riid, &IID_ITextDocument) ||
+ IsEqualIID(riid, &IID_ITextDocument2Old)) {
if (!This->editor->reOle)
if (!CreateIRichEditOle(This->outer_unk, This->editor, (void **)(&This->editor->reOle)))
return E_OUTOFMEMORY;
if (IsEqualIID(riid, &IID_ITextDocument))
ME_GetITextDocumentInterface(This->editor->reOle, ppv);
+ else if (IsEqualIID(riid, &IID_ITextDocument2Old))
+ ME_GetITextDocument2OldInterface(This->editor->reOle, ppv);
else
*ppv = This->editor->reOle;
} else {
--
2.18.0
1
0
11 Sep '18
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
dlls/riched20/richole.c | 499 ++++++++++++++++++++++++++++++++++
dlls/riched20/tests/richole.c | 8 +
2 files changed, 507 insertions(+)
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 5c7be5eaa9..c5d2d7c99a 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -46,6 +46,7 @@ DEFINE_GUID(IID_ITextServices, 0x8d33f740, 0xcf58, 0x11ce, 0xa8, 0x9d, 0x00, 0xa
DEFINE_GUID(IID_ITextHost, 0x13e670f4,0x1a5a,0x11cf,0xab,0xeb,0x00,0xaa,0x00,0xb6,0x5e,0xa1);
DEFINE_GUID(IID_ITextHost2, 0x13e670f5,0x1a5a,0x11cf,0xab,0xeb,0x00,0xaa,0x00,0xb6,0x5e,0xa1);
DEFINE_GUID(IID_ITextDocument, 0x8cc497c0, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d);
+DEFINE_GUID(IID_ITextDocument2Old, 0x01c25500, 0x4268, 0x11d1, 0x88, 0x3a, 0x3c, 0x8b, 0x00, 0xc1, 0x00, 0x00);
DEFINE_GUID(IID_ITextRange, 0x8cc497c2, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d);
DEFINE_GUID(IID_ITextSelection, 0x8cc497c1, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d);
DEFINE_GUID(IID_ITextFont, 0x8cc497c3, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d);
@@ -56,6 +57,7 @@ static ITypeLib *typelib;
enum tid_t {
NULL_tid,
ITextDocument_tid,
+ ITextDocument2Old_tid,
ITextRange_tid,
ITextSelection_tid,
ITextFont_tid,
@@ -67,6 +69,7 @@ static const IID * const tid_ids[] =
{
&IID_NULL,
&IID_ITextDocument,
+ &IID_ITextDocument2Old,
&IID_ITextRange,
&IID_ITextSelection,
&IID_ITextFont,
@@ -209,6 +212,7 @@ typedef struct IRichEditOleImpl {
IUnknown IUnknown_inner;
IRichEditOle IRichEditOle_iface;
ITextDocument ITextDocument_iface;
+ ITextDocument2Old ITextDocument2Old_iface;
IUnknown *outer_unk;
LONG ref;
@@ -272,6 +276,11 @@ static inline IRichEditOleImpl *impl_from_ITextDocument(ITextDocument *iface)
return CONTAINING_RECORD(iface, IRichEditOleImpl, ITextDocument_iface);
}
+static inline IRichEditOleImpl *impl_from_ITextDocument2Old(ITextDocument2Old *iface)
+{
+ return CONTAINING_RECORD(iface, IRichEditOleImpl, ITextDocument2Old_iface);
+}
+
static inline IRichEditOleImpl *impl_from_IUnknown(IUnknown *iface)
{
return CONTAINING_RECORD(iface, IRichEditOleImpl, IUnknown_inner);
@@ -945,6 +954,8 @@ static HRESULT WINAPI IRichEditOleImpl_inner_fnQueryInterface(IUnknown *iface, R
*ppvObj = &This->IRichEditOle_iface;
else if (IsEqualGUID(riid, &IID_ITextDocument))
*ppvObj = &This->ITextDocument_iface;
+ else if (IsEqualGUID(riid, &IID_ITextDocument2Old))
+ *ppvObj = &This->ITextDocument2Old_iface;
if (*ppvObj)
{
IUnknown_AddRef((IUnknown *)*ppvObj);
@@ -4178,6 +4189,493 @@ static const ITextDocumentVtbl tdvt = {
ITextDocument_fnRangeFromPoint
};
+/* ITextDocument2Old */
+static HRESULT WINAPI ITextDocument2Old_fnQueryInterface(ITextDocument2Old *iface,
+ REFIID riid, void **obj)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ return IRichEditOle_QueryInterface(&This->IRichEditOle_iface, riid, obj);
+}
+
+static ULONG WINAPI ITextDocument2Old_fnAddRef(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ return IRichEditOle_AddRef(&This->IRichEditOle_iface);
+}
+
+static ULONG WINAPI ITextDocument2Old_fnRelease(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ return IRichEditOle_Release(&This->IRichEditOle_iface);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetTypeInfoCount(ITextDocument2Old *iface, UINT *info)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, info);
+
+ *info = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetTypeInfo(ITextDocument2Old *iface, UINT info, LCID lcid,
+ ITypeInfo **type_info)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+ HRESULT hr;
+
+ TRACE("(%p)->(%u, %d, %p)\n", This, info, lcid, type_info);
+
+ hr = get_typeinfo(ITextDocument2Old_tid, type_info);
+ if (SUCCEEDED(hr))
+ ITypeInfo_AddRef(*type_info);
+ return hr;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetIDsOfNames(ITextDocument2Old *iface, REFIID riid, LPOLESTR *name,
+ UINT name_count, LCID lcid, DISPID *dispid)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+ ITypeInfo *ti;
+ HRESULT hr;
+
+ TRACE("(%p)->(%s, %p, %u, %d, %p)\n", This, debugstr_guid(riid), name, name_count, lcid, dispid);
+
+ hr = get_typeinfo(ITextDocument2Old_tid, &ti);
+ if (SUCCEEDED(hr))
+ hr = ITypeInfo_GetIDsOfNames(ti, name, name_count, dispid);
+ return hr;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnInvoke(ITextDocument2Old *iface, DISPID dispid, REFIID riid,
+ LCID lcid, WORD flags, DISPPARAMS *dispparams,
+ VARIANT *var_result, EXCEPINFO *excepinfo,
+ UINT *arg_err)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+ ITypeInfo *ti;
+ HRESULT hr;
+
+ TRACE("(%p)->(%d, %s, %d, %u, %p, %p, %p, %p)\n", This, dispid,
+ debugstr_guid(riid), lcid, flags, dispparams, var_result,
+ excepinfo, arg_err);
+
+ hr = get_typeinfo(ITextDocument2Old_tid, &ti);
+ if (SUCCEEDED(hr))
+ hr = ITypeInfo_Invoke(ti, iface, dispid, flags, dispparams, var_result, excepinfo, arg_err);
+ return hr;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetName(ITextDocument2Old *iface, BSTR *name)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, name);
+
+ return ITextDocument_GetName(&This->ITextDocument_iface, name);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetSelection(ITextDocument2Old *iface, ITextSelection **selection)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, selection);
+
+ return ITextDocument_GetSelection(&This->ITextDocument_iface, selection);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetStoryCount(ITextDocument2Old *iface, LONG *count)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, count);
+
+ return ITextDocument_GetStoryCount(&This->ITextDocument_iface, count);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetStoryRanges(ITextDocument2Old *iface, ITextStoryRanges **story_ranges)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, story_ranges);
+
+ return ITextDocument_GetStoryRanges(&This->ITextDocument_iface, story_ranges);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetSaved(ITextDocument2Old *iface, LONG *value)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, value);
+
+ return ITextDocument_GetSaved(&This->ITextDocument_iface, value);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSetSaved(ITextDocument2Old *iface, LONG value)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%d)\n", This, value);
+
+ return ITextDocument_SetSaved(&This->ITextDocument_iface, value);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetDefaultTabStop(ITextDocument2Old *iface, float *value)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, value);
+
+ return ITextDocument_GetDefaultTabStop(&This->ITextDocument_iface, value);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSetDefaultTabStop(ITextDocument2Old *iface, float value)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%f)\n", This, value);
+
+ return ITextDocument_SetDefaultTabStop(&This->ITextDocument_iface, value);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnNew(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)\n", This);
+
+ return ITextDocument_New(&This->ITextDocument_iface);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnOpen(ITextDocument2Old *iface, VARIANT *var, LONG flags, LONG codepage)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p, %d, %d)\n", This, var, flags, codepage);
+
+ return ITextDocument_Open(&This->ITextDocument_iface, var, flags, codepage);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSave(ITextDocument2Old *iface, VARIANT *var, LONG flags, LONG codepage)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p, %d, %d)\n", This, var, flags, codepage);
+
+ return ITextDocument_Save(&This->ITextDocument_iface, var, flags, codepage);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnFreeze(ITextDocument2Old *iface, LONG *count)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, count);
+
+ return ITextDocument_Freeze(&This->ITextDocument_iface, count);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnUnfreeze(ITextDocument2Old *iface, LONG *count)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%p)\n", This, count);
+
+ return ITextDocument_Unfreeze(&This->ITextDocument_iface, count);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnBeginEditCollection(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)\n", This);
+
+ return ITextDocument_BeginEditCollection(&This->ITextDocument_iface);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnEndEditCollection(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)\n", This);
+
+ return ITextDocument_EndEditCollection(&This->ITextDocument_iface);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnUndo(ITextDocument2Old *iface, LONG count, LONG *prop)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%d, %p)\n", This, count, prop);
+
+ return ITextDocument_Undo(&This->ITextDocument_iface, count, prop);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnRedo(ITextDocument2Old *iface, LONG count, LONG *prop)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%d, %p)\n", This, count, prop);
+
+ return ITextDocument_Redo(&This->ITextDocument_iface, count, prop);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnRange(ITextDocument2Old *iface, LONG cp_active, LONG cp_anchor,
+ ITextRange **range)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%d, %d, %p)\n", This, cp_active, cp_anchor, range);
+
+ return ITextDocument_Range(&This->ITextDocument_iface, cp_active, cp_anchor, range);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnRangeFromPoint(ITextDocument2Old *iface, LONG x, LONG y,
+ ITextRange **range)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ TRACE("(%p)->(%d, %d, %p)\n", This, x, y, range);
+
+ return ITextDocument_RangeFromPoint(&This->ITextDocument_iface, x, y, range);
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnAttachMsgFilter(ITextDocument2Old *iface, IUnknown *filter)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, filter);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSetEffectColor(ITextDocument2Old *iface, LONG index, COLORREF cr)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d, 0x%x): stub\n", This, index, cr);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetEffectColor(ITextDocument2Old *iface, LONG index, COLORREF *cr)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d, %p): stub\n", This, index, cr);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetCaretType(ITextDocument2Old *iface, LONG *type)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, type);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSetCaretType(ITextDocument2Old *iface, LONG type)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d): stub\n", This, type);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetImmContext(ITextDocument2Old *iface, LONG *context)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, context);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnReleaseImmContext(ITextDocument2Old *iface, LONG context)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d): stub\n", This, context);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetPreferredFont(ITextDocument2Old *iface, LONG cp, LONG charrep,
+ LONG options, LONG current_charrep, LONG current_fontsize,
+ BSTR *bstr, LONG *pitch_family, LONG *new_fontsize)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d, %d, %d, %d, %d, %p, %p, %p): stub\n", This, cp, charrep, options, current_charrep,
+ current_fontsize, bstr, pitch_family, new_fontsize);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetNotificationMode(ITextDocument2Old *iface, LONG *mode)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, mode);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSetNotificationMode(ITextDocument2Old *iface, LONG mode)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(0x%x): stub\n", This, mode);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetClientRect(ITextDocument2Old *iface, LONG type, LONG *left, LONG *top,
+ LONG *right, LONG *bottom)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d, %p, %p, %p, %p): stub\n", This, type, left, top, right, bottom);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetSelectionEx(ITextDocument2Old *iface, ITextSelection **selection)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, selection);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetWindow(ITextDocument2Old *iface, LONG *hwnd)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, hwnd);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnGetFEFlags(ITextDocument2Old *iface, LONG *flags)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, flags);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnUpdateWindow(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p): stub\n", This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnCheckTextLimit(ITextDocument2Old *iface, LONG cch, LONG *exceed)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d, %p): stub\n", This, cch, exceed);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnIMEInProgress(ITextDocument2Old *iface, LONG mode)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(0x%x): stub\n", This, mode);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnSysBeep(ITextDocument2Old *iface)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p): stub\n", This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnUpdate(ITextDocument2Old *iface, LONG mode)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(0x%x): stub\n", This, mode);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITextDocument2Old_fnNotify(ITextDocument2Old *iface, LONG notify)
+{
+ IRichEditOleImpl *This = impl_from_ITextDocument2Old(iface);
+
+ FIXME("(%p)->(%d): stub\n", This, notify);
+
+ return E_NOTIMPL;
+}
+
+static const ITextDocument2OldVtbl td2oldvt = {
+ ITextDocument2Old_fnQueryInterface,
+ ITextDocument2Old_fnAddRef,
+ ITextDocument2Old_fnRelease,
+ ITextDocument2Old_fnGetTypeInfoCount,
+ ITextDocument2Old_fnGetTypeInfo,
+ ITextDocument2Old_fnGetIDsOfNames,
+ ITextDocument2Old_fnInvoke,
+ ITextDocument2Old_fnGetName,
+ ITextDocument2Old_fnGetSelection,
+ ITextDocument2Old_fnGetStoryCount,
+ ITextDocument2Old_fnGetStoryRanges,
+ ITextDocument2Old_fnGetSaved,
+ ITextDocument2Old_fnSetSaved,
+ ITextDocument2Old_fnGetDefaultTabStop,
+ ITextDocument2Old_fnSetDefaultTabStop,
+ ITextDocument2Old_fnNew,
+ ITextDocument2Old_fnOpen,
+ ITextDocument2Old_fnSave,
+ ITextDocument2Old_fnFreeze,
+ ITextDocument2Old_fnUnfreeze,
+ ITextDocument2Old_fnBeginEditCollection,
+ ITextDocument2Old_fnEndEditCollection,
+ ITextDocument2Old_fnUndo,
+ ITextDocument2Old_fnRedo,
+ ITextDocument2Old_fnRange,
+ ITextDocument2Old_fnRangeFromPoint,
+ ITextDocument2Old_fnAttachMsgFilter,
+ ITextDocument2Old_fnSetEffectColor,
+ ITextDocument2Old_fnGetEffectColor,
+ ITextDocument2Old_fnGetCaretType,
+ ITextDocument2Old_fnSetCaretType,
+ ITextDocument2Old_fnGetImmContext,
+ ITextDocument2Old_fnReleaseImmContext,
+ ITextDocument2Old_fnGetPreferredFont,
+ ITextDocument2Old_fnGetNotificationMode,
+ ITextDocument2Old_fnSetNotificationMode,
+ ITextDocument2Old_fnGetClientRect,
+ ITextDocument2Old_fnGetSelectionEx,
+ ITextDocument2Old_fnGetWindow,
+ ITextDocument2Old_fnGetFEFlags,
+ ITextDocument2Old_fnUpdateWindow,
+ ITextDocument2Old_fnCheckTextLimit,
+ ITextDocument2Old_fnIMEInProgress,
+ ITextDocument2Old_fnSysBeep,
+ ITextDocument2Old_fnUpdate,
+ ITextDocument2Old_fnNotify
+};
+
/* ITextSelection */
static HRESULT WINAPI ITextSelection_fnQueryInterface(
ITextSelection *me,
@@ -5277,6 +5775,7 @@ LRESULT CreateIRichEditOle(IUnknown *outer_unk, ME_TextEditor *editor, LPVOID *p
reo->IUnknown_inner.lpVtbl = &reo_unk_vtbl;
reo->IRichEditOle_iface.lpVtbl = &revt;
reo->ITextDocument_iface.lpVtbl = &tdvt;
+ reo->ITextDocument2Old_iface.lpVtbl = &td2oldvt;
reo->ref = 1;
reo->editor = editor;
reo->txtSel = NULL;
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index aaf52bcfdd..bacf68c095 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -117,6 +117,7 @@ static void test_Interfaces(void)
{
IRichEditOle *reOle = NULL, *reOle1 = NULL;
ITextDocument *txtDoc = NULL;
+ ITextDocument2Old *txtDoc2Old = NULL;
ITextSelection *txtSel = NULL, *txtSel2;
IUnknown *punk;
HRESULT hres;
@@ -195,6 +196,13 @@ static void test_Interfaces(void)
hres = IRichEditOle_QueryInterface(reOle, &IID_IOleInPlaceSite, (void **) &punk);
ok(hres == E_NOINTERFACE, "IRichEditOle_QueryInterface\n");
+ hres = IRichEditOle_QueryInterface(reOle, &IID_ITextDocument2Old, (void **)&txtDoc2Old);
+ ok(hres == S_OK, "IRichEditOle_QueryInterface\n");
+ ok(txtDoc2Old != NULL, "IRichEditOle_QueryInterface\n");
+ EXPECT_REF(txtDoc2Old, 5);
+ EXPECT_REF(reOle, 5);
+ ITextDocument2Old_Release(txtDoc2Old);
+
ITextDocument_Release(txtDoc);
IRichEditOle_Release(reOle);
refcount = IRichEditOle_Release(reOle);
--
2.18.0
1
0
[PATCH v2 1/4] include: Add ITextDocument2Old and ITextDocument2 interface.
by Jactry Zeng 11 Sep '18
by Jactry Zeng 11 Sep '18
11 Sep '18
ITextDocument2Old was known as ITextDocument2 before win8.
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
include/tom.idl | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 91 insertions(+)
diff --git a/include/tom.idl b/include/tom.idl
index 357b0457a5..afc24ca5fb 100644
--- a/include/tom.idl
+++ b/include/tom.idl
@@ -237,6 +237,97 @@ interface ITextDocument : IDispatch
HRESULT RangeFromPoint([in]LONG x, [in]LONG y, [retval, out]ITextRange **ppRange);
}
+[
+ object,
+ uuid(01C25500-4268-11D1-883A-3C8B00C10000)
+]
+interface ITextDocument2Old : ITextDocument
+{
+ HRESULT AttachMsgFilter([in]IUnknown *filter);
+ HRESULT SetEffectColor([in]LONG index, [in]COLORREF cr);
+ HRESULT GetEffectColor([in]LONG index, [out]COLORREF *cr);
+ HRESULT GetCaretType([retval, out]LONG *type);
+ HRESULT SetCaretType([in]LONG type);
+ HRESULT GetImmContext([retval, out]LONG *context);
+ HRESULT ReleaseImmContext([in]LONG context);
+ HRESULT GetPreferredFont([in]LONG cp, [in]LONG codepage, [in]LONG option, [in]LONG current_codepage, [in]LONG current_fontsize,
+ [out]BSTR *bstr, [out]LONG *pitch_family, [out]LONG *new_fontsize);
+ HRESULT GetNotificationMode([retval, out]LONG *mode);
+ HRESULT SetNotificationMode([in]LONG mode);
+ HRESULT GetClientRect([in]LONG type, [out]LONG *left, [out]LONG *top, [out]LONG *right, [out]LONG *bottom);
+ HRESULT GetSelectionEx([retval, out]ITextSelection **selection);
+ HRESULT GetWindow([out]LONG *hwnd);
+ HRESULT GetFEFlags([out]LONG *flags);
+ HRESULT UpdateWindow();
+ HRESULT CheckTextLimit([in]LONG cch, [out]LONG *exceed);
+ HRESULT IMEInProgress([in]LONG mode);
+ HRESULT SysBeep();
+ HRESULT Update([in]LONG mode);
+ HRESULT Notify([in]LONG notify);
+}
+
+interface ITextDisplays;
+interface ITextFont2;
+interface ITextPara2;
+interface ITextRange2;
+interface ITextSelection2;
+interface ITextStory;
+interface ITextStoryRanges2;
+interface ITextStrings;
+
+[
+ object,
+ uuid(c241f5e0-7206-11d8-a2c7-00a0d1d6c6b3)
+]
+interface ITextDocument2 : ITextDocument
+{
+ HRESULT GetCaretType([retval, out]LONG *value);
+ HRESULT SetCaretType([in]LONG value);
+ HRESULT GetDisplays([retval, out]ITextDisplays **displays);
+ HRESULT GetDocumentFont([retval, out]ITextFont2 **font);
+ HRESULT SetDocumentFont([in]ITextFont2 *font);
+ HRESULT GetDocumentPara([retval, out]ITextPara2 **para);
+ HRESULT SetDocumentPara([in]ITextPara2 *para);
+ HRESULT GetEastAsianFlags([retval, out]LONG *flags);
+ HRESULT GetGenerator([retval, out]BSTR *bstr);
+ HRESULT SetIMEInProgress([in]LONG value);
+ HRESULT GetNotificationMode([retval, out]LONG *mode);
+ HRESULT SetNotificationMode([in]LONG mode);
+ HRESULT GetSelection2([retval, out]ITextSelection2 **selection);
+ HRESULT GetStoryRanges2([retval, out]ITextStoryRanges2 **stories);
+ HRESULT GetTypographyOptions([retval, out]LONG *options);
+ HRESULT GetVersion([retval, out]LONG *value);
+ HRESULT GetWindow([retval, out]LONG *hwnd);
+ HRESULT AttachMsgFilter([in]IUnknown *filter);
+ HRESULT CheckTextLimit([in]LONG cch, [out]LONG *exceed);
+ HRESULT GetCallManager([retval, out]IUnknown **manager);
+ HRESULT GetClientRect([in]LONG type, [out]LONG *left, [out]LONG *top, [out]LONG *right, [out]LONG *bottom);
+ HRESULT GetEffectColor([in]LONG index, [out]COLORREF *cr);
+ HRESULT GetImmContext([retval, out]LONG *context);
+ HRESULT GetPreferredFont([in]LONG cp, [in]LONG codepage, [in]LONG option, [in]LONG current_codepage, [in]LONG current_fontsize,
+ [out]BSTR *bstr, [out]LONG *pitch_family, [out]LONG *new_fontsize);
+ HRESULT GetProperty([in]LONG type, [out]LONG *value);
+ HRESULT GetStrings([out]ITextStrings **strings);
+ HRESULT Notify([in]LONG notify);
+ HRESULT Range2([in]LONG cp_active, [in]LONG cp_anchor, [retval, out]ITextRange2 **range);
+ HRESULT RangeFromPoint2([in]LONG x, [in]LONG y, [in]LONG type, [retval, out]ITextRange2 **range);
+ HRESULT ReleaseCallManager([in]IUnknown *manager);
+ HRESULT ReleaseImmContext([in]LONG context);
+ HRESULT SetEffectColor([in]LONG index, [in]LONG value);
+ HRESULT SetProperty([in]LONG type, [in]LONG value);
+ HRESULT SetTypographyOptions([in]LONG options, [in]LONG mask);
+ HRESULT SysBeep();
+ HRESULT Update([in]LONG value);
+ HRESULT UpdateWindow();
+ HRESULT GetMathProperties([out]LONG *options);
+ HRESULT SetMathProperties([in]LONG options, [in]LONG mask);
+ HRESULT GetActiveStory([retval, out]ITextStory **story);
+ HRESULT SetActiveStory([in]ITextStory *story);
+ HRESULT GetMainStory([retval, out]ITextStory **story);
+ HRESULT GetNewStory([retval, out]ITextStory **story);
+ HRESULT GetStory([in]LONG index, [retval, out]ITextStory **story);
+}
+
interface ITextFont;
interface ITextPara;
--
2.18.0
1
0
11 Sep '18
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
v2: call back on EndDraw/Flush.
dlls/d2d1/bitmap_render_target.c | 7 +++++-
dlls/d2d1/d2d1_private.h | 13 +++++++++--
dlls/d2d1/dc_render_target.c | 34 ++++++++++++++--------------
dlls/d2d1/device.c | 38 ++++++++++++++++++++++----------
dlls/d2d1/hwnd_render_target.c | 21 ++++++++++--------
dlls/d2d1/wic_render_target.c | 37 ++++++++++++++++---------------
6 files changed, 91 insertions(+), 59 deletions(-)
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index c106e211d6..5ae155d430 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -733,6 +733,7 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options)
{
D2D1_RENDER_TARGET_PROPERTIES dxgi_rt_desc;
+ struct outer_target_desc outer_desc;
D2D1_BITMAP_PROPERTIES bitmap_desc;
D3D10_TEXTURE2D_DESC texture_desc;
IDXGISurface *dxgi_surface;
@@ -810,8 +811,12 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
return hr;
}
+ outer_desc.outer_unknown = (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface;
+ outer_desc.data = NULL;
+ outer_desc.present = NULL;
+
if (FAILED(hr = d2d_d3d_create_render_target(parent_target->factory, dxgi_surface,
- (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface, &dxgi_rt_desc, &render_target->dxgi_target)))
+ &outer_desc, &dxgi_rt_desc, &render_target->dxgi_target)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
IDXGISurface_Release(dxgi_surface);
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index e00b942797..49d1475ed4 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -117,6 +117,15 @@ struct d2d_ps_cb
struct d2d_brush_cb opacity_brush;
};
+typedef HRESULT (*outer_target_present_func)(const void *data);
+
+struct outer_target_desc
+{
+ IUnknown *outer_unknown;
+ const void *data;
+ outer_target_present_func present;
+};
+
struct d2d_device_context
{
ID2D1DeviceContext ID2D1DeviceContext_iface;
@@ -124,7 +133,7 @@ struct d2d_device_context
IDWriteTextRenderer IDWriteTextRenderer_iface;
LONG refcount;
- IUnknown *outer_unknown;
+ struct outer_target_desc outer_target;
ID2D1Factory *factory;
ID3D10Device *device;
@@ -148,7 +157,7 @@ struct d2d_device_context
struct d2d_clip_stack clip_stack;
};
-HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, IUnknown *outer_unknown,
+HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, const struct outer_target_desc *outer,
const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target) DECLSPEC_HIDDEN;
HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *render_target, IDXGISurface1 *surface) DECLSPEC_HIDDEN;
diff --git a/dlls/d2d1/dc_render_target.c b/dlls/d2d1/dc_render_target.c
index d5e4f47e6d..f5276bfbb4 100644
--- a/dlls/d2d1/dc_render_target.c
+++ b/dlls/d2d1/dc_render_target.c
@@ -24,17 +24,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
-static void sync_bitmap(struct d2d_dc_render_target *render_target)
+static HRESULT sync_bitmap(struct d2d_dc_render_target *render_target)
{
const RECT *dst_rect = &render_target->dst_rect;
RECT empty_rect;
HDC src_hdc;
HRESULT hr;
+ if (!render_target->hdc)
+ return D2DERR_WRONG_STATE;
+
if (FAILED(hr = IDXGISurface1_GetDC(render_target->dxgi_surface, FALSE, &src_hdc)))
{
WARN("GetDC() failed, %#x.\n", hr);
- return;
+ return S_OK;
}
BitBlt(render_target->hdc, dst_rect->left, dst_rect->top, dst_rect->right - dst_rect->left,
@@ -42,6 +45,8 @@ static void sync_bitmap(struct d2d_dc_render_target *render_target)
SetRectEmpty(&empty_rect);
IDXGISurface1_ReleaseDC(render_target->dxgi_surface, &empty_rect);
+
+ return S_OK;
}
static inline struct d2d_dc_render_target *impl_from_ID2D1DCRenderTarget(ID2D1DCRenderTarget *iface)
@@ -64,7 +69,8 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_QueryInterface(ID2D1DCRend
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
+ else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget)
+ || IsEqualGUID(iid, &IID_ID2D1DeviceContext))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
@@ -524,14 +530,10 @@ static void STDMETHODCALLTYPE d2d_dc_render_target_PopLayer(ID2D1DCRenderTarget
static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_Flush(ID2D1DCRenderTarget *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
}
static void STDMETHODCALLTYPE d2d_dc_render_target_SaveDrawingState(ID2D1DCRenderTarget *iface,
@@ -595,17 +597,10 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_EndDraw(ID2D1DCRenderTarge
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- if (!render_target->hdc)
- return D2DERR_WRONG_STATE;
-
- hr = ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_dc_render_target_GetPixelFormat(ID2D1DCRenderTarget *iface,
@@ -816,6 +811,7 @@ static const struct ID2D1DCRenderTargetVtbl d2d_dc_render_target_vtbl =
HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID2D1Factory *factory,
ID3D10Device1 *device, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
+ struct outer_target_desc outer_desc;
D3D10_TEXTURE2D_DESC texture_desc;
ID3D10Texture2D *texture;
HRESULT hr;
@@ -867,8 +863,12 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
return hr;
}
+ outer_desc.outer_unknown = (IUnknown *)&render_target->ID2D1DCRenderTarget_iface;
+ outer_desc.data = render_target;
+ outer_desc.present = (outer_target_present_func)sync_bitmap;
+
if (FAILED(hr = d2d_d3d_create_render_target(factory, (IDXGISurface *)render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1DCRenderTarget_iface, desc, &render_target->dxgi_target)))
+ &outer_desc, desc, &render_target->dxgi_target)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
IDXGISurface1_Release(render_target->dxgi_surface);
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index bba4870dd4..3980e35280 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1448,8 +1448,13 @@ static void STDMETHODCALLTYPE d2d_device_context_PopLayer(ID2D1DeviceContext *if
static HRESULT STDMETHODCALLTYPE d2d_device_context_Flush(ID2D1DeviceContext *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
{
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
FIXME("iface %p, tag1 %p, tag2 %p stub!\n", iface, tag1, tag2);
+ if (context->outer_target.present)
+ context->outer_target.present(context->outer_target.data);
+
return E_NOTIMPL;
}
@@ -1615,16 +1620,23 @@ static void STDMETHODCALLTYPE d2d_device_context_BeginDraw(ID2D1DeviceContext *i
static HRESULT STDMETHODCALLTYPE d2d_device_context_EndDraw(ID2D1DeviceContext *iface,
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
- struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+ HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
if (tag1)
- *tag1 = render_target->error.tag1;
+ *tag1 = context->error.tag1;
if (tag2)
- *tag2 = render_target->error.tag2;
+ *tag2 = context->error.tag2;
- return render_target->error.code;
+ if (context->outer_target.present)
+ {
+ if (FAILED(hr = context->outer_target.present(context->outer_target.data)))
+ context->error.code = hr;
+ }
+
+ return context->error.code;
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_device_context_GetPixelFormat(ID2D1DeviceContext *iface,
@@ -2381,7 +2393,7 @@ static HRESULT STDMETHODCALLTYPE d2d_gdi_interop_render_target_QueryInterface(ID
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
- return IUnknown_QueryInterface(render_target->outer_unknown, iid, out);
+ return IUnknown_QueryInterface(render_target->outer_target.outer_unknown, iid, out);
}
static ULONG STDMETHODCALLTYPE d2d_gdi_interop_render_target_AddRef(ID2D1GdiInteropRenderTarget *iface)
@@ -2390,7 +2402,7 @@ static ULONG STDMETHODCALLTYPE d2d_gdi_interop_render_target_AddRef(ID2D1GdiInte
TRACE("iface %p.\n", iface);
- return IUnknown_AddRef(render_target->outer_unknown);
+ return IUnknown_AddRef(render_target->outer_target.outer_unknown);
}
static ULONG STDMETHODCALLTYPE d2d_gdi_interop_render_target_Release(ID2D1GdiInteropRenderTarget *iface)
@@ -2399,7 +2411,7 @@ static ULONG STDMETHODCALLTYPE d2d_gdi_interop_render_target_Release(ID2D1GdiInt
TRACE("iface %p.\n", iface);
- return IUnknown_Release(render_target->outer_unknown);
+ return IUnknown_Release(render_target->outer_target.outer_unknown);
}
static HRESULT d2d_device_context_get_surface(struct d2d_device_context *render_target, IDXGISurface1 **surface)
@@ -2469,7 +2481,7 @@ static const struct ID2D1GdiInteropRenderTargetVtbl d2d_gdi_interop_render_targe
};
static HRESULT d2d_device_context_init(struct d2d_device_context *render_target, ID2D1Factory *factory,
- IDXGISurface *surface, IUnknown *outer_unknown, const D2D1_RENDER_TARGET_PROPERTIES *desc)
+ IDXGISurface *surface, const struct outer_target_desc *outer, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_STATE_BLOCK_MASK state_mask;
@@ -3355,8 +3367,10 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
render_target->factory = factory;
ID2D1Factory_AddRef(render_target->factory);
- render_target->outer_unknown = outer_unknown ? outer_unknown :
- (IUnknown *)&render_target->ID2D1DeviceContext_iface;
+ if (outer)
+ render_target->outer_target = *outer;
+ else
+ render_target->outer_target.outer_unknown = (IUnknown *)&render_target->ID2D1DeviceContext_iface;
if (FAILED(hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&render_target->device)))
{
@@ -3554,7 +3568,7 @@ err:
return hr;
}
-HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, IUnknown *outer_unknown,
+HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, const struct outer_target_desc *outer,
const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target)
{
struct d2d_device_context *object;
@@ -3563,7 +3577,7 @@ HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surfac
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = d2d_device_context_init(object, factory, surface, outer_unknown, desc)))
+ if (FAILED(hr = d2d_device_context_init(object, factory, surface, outer, desc)))
{
WARN("Failed to initialize render target, hr %#x.\n", hr);
heap_free(object);
diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c
index 04d33536a6..112e6a98a2 100644
--- a/dlls/d2d1/hwnd_render_target.c
+++ b/dlls/d2d1/hwnd_render_target.c
@@ -24,12 +24,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
-static void render_target_present(struct d2d_hwnd_render_target *render_target)
+static HRESULT render_target_present(struct d2d_hwnd_render_target *render_target)
{
HRESULT hr;
if (FAILED(hr = IDXGISwapChain_Present(render_target->swapchain, render_target->sync_interval, 0)))
WARN("Present failed, %#x.\n", hr);
+
+ return S_OK;
}
static inline struct d2d_hwnd_render_target *impl_from_ID2D1HwndRenderTarget(ID2D1HwndRenderTarget *iface)
@@ -53,7 +55,8 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_QueryInterface(ID2D1Hwnd
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
+ else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget)
+ || IsEqualGUID(iid, &IID_ID2D1DeviceContext))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
@@ -516,14 +519,10 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_Flush(ID2D1HwndRenderTar
D2D1_TAG *tag2)
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
- render_target_present(render_target);
-
- return hr;
+ return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
}
static void STDMETHODCALLTYPE d2d_hwnd_render_target_SaveDrawingState(ID2D1HwndRenderTarget *iface,
@@ -782,6 +781,7 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target
{
D2D1_RENDER_TARGET_PROPERTIES dxgi_rt_desc;
DXGI_SWAP_CHAIN_DESC swapchain_desc;
+ struct outer_target_desc outer_desc;
IDXGIAdapter *dxgi_adapter;
IDXGIFactory *dxgi_factory;
IDXGISurface *dxgi_surface;
@@ -860,9 +860,12 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target
return hr;
}
+ outer_desc.outer_unknown = (IUnknown *)&render_target->ID2D1HwndRenderTarget_iface;
+ outer_desc.data = render_target;
+ outer_desc.present = (outer_target_present_func)render_target_present;
+
render_target->ID2D1HwndRenderTarget_iface.lpVtbl = &d2d_hwnd_render_target_vtbl;
- hr = d2d_d3d_create_render_target(factory, dxgi_surface, (IUnknown *)&render_target->ID2D1HwndRenderTarget_iface,
- &dxgi_rt_desc, &render_target->dxgi_target);
+ hr = d2d_d3d_create_render_target(factory, dxgi_surface, &outer_desc, &dxgi_rt_desc, &render_target->dxgi_target);
IDXGISurface_Release(dxgi_surface);
if (FAILED(hr))
{
diff --git a/dlls/d2d1/wic_render_target.c b/dlls/d2d1/wic_render_target.c
index 5642fd44ff..ede9d811d7 100644
--- a/dlls/d2d1/wic_render_target.c
+++ b/dlls/d2d1/wic_render_target.c
@@ -25,7 +25,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
-static void sync_bitmap(struct d2d_wic_render_target *render_target)
+static HRESULT sync_bitmap(struct d2d_wic_render_target *render_target)
{
D3D10_MAPPED_TEXTURE2D mapped_texture;
ID3D10Resource *src_resource;
@@ -41,7 +41,7 @@ static void sync_bitmap(struct d2d_wic_render_target *render_target)
&IID_ID3D10Resource, (void **)&src_resource)))
{
ERR("Failed to get source resource interface, hr %#x.\n", hr);
- return;
+ goto end;
}
ID3D10Texture2D_GetDevice(render_target->readback_texture, &device);
@@ -56,28 +56,28 @@ static void sync_bitmap(struct d2d_wic_render_target *render_target)
if (FAILED(hr = IWICBitmap_Lock(render_target->bitmap, &dst_rect, WICBitmapLockWrite, &bitmap_lock)))
{
ERR("Failed to lock destination bitmap, hr %#x.\n", hr);
- return;
+ goto end;
}
if (FAILED(hr = IWICBitmapLock_GetDataPointer(bitmap_lock, &dst_size, &dst)))
{
ERR("Failed to get data pointer, hr %#x.\n", hr);
IWICBitmapLock_Release(bitmap_lock);
- return;
+ goto end;
}
if (FAILED(hr = IWICBitmapLock_GetStride(bitmap_lock, &dst_pitch)))
{
ERR("Failed to get stride, hr %#x.\n", hr);
IWICBitmapLock_Release(bitmap_lock);
- return;
+ goto end;
}
if (FAILED(hr = ID3D10Texture2D_Map(render_target->readback_texture, 0, D3D10_MAP_READ, 0, &mapped_texture)))
{
ERR("Failed to map readback texture, hr %#x.\n", hr);
IWICBitmapLock_Release(bitmap_lock);
- return;
+ goto end;
}
src = mapped_texture.pData;
@@ -91,6 +91,9 @@ static void sync_bitmap(struct d2d_wic_render_target *render_target)
ID3D10Texture2D_Unmap(render_target->readback_texture, 0);
IWICBitmapLock_Release(bitmap_lock);
+
+end:
+ return S_OK;
}
static inline struct d2d_wic_render_target *impl_from_ID2D1RenderTarget(ID2D1RenderTarget *iface)
@@ -112,7 +115,8 @@ static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1Rende
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
+ else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget)
+ || IsEqualGUID(iid, &IID_ID2D1DeviceContext))
return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
@@ -574,14 +578,10 @@ static void STDMETHODCALLTYPE d2d_wic_render_target_PopLayer(ID2D1RenderTarget *
static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_Flush(ID2D1RenderTarget *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
}
static void STDMETHODCALLTYPE d2d_wic_render_target_SaveDrawingState(ID2D1RenderTarget *iface,
@@ -645,14 +645,10 @@ static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_EndDraw(ID2D1RenderTarget
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_wic_render_target_GetPixelFormat(ID2D1RenderTarget *iface,
@@ -788,6 +784,7 @@ static const struct ID2D1RenderTargetVtbl d2d_wic_render_target_vtbl =
HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ID2D1Factory *factory,
ID3D10Device1 *device, IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
+ struct outer_target_desc outer_desc;
D3D10_TEXTURE2D_DESC texture_desc;
ID3D10Texture2D *texture;
HRESULT hr;
@@ -874,8 +871,12 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
return hr;
}
+ outer_desc.outer_unknown = (IUnknown *)&render_target->ID2D1RenderTarget_iface;
+ outer_desc.data = render_target;
+ outer_desc.present = (outer_target_present_func)sync_bitmap;
+
if (FAILED(hr = d2d_d3d_create_render_target(factory, render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1RenderTarget_iface, desc, &render_target->dxgi_target)))
+ &outer_desc, desc, &render_target->dxgi_target)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
ID3D10Texture2D_Release(render_target->readback_texture);
--
2.18.0
2
1