From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Jacek Caban : msi: Fixed varg0 leak in InstallerImpl_SummaryInformation. Message-ID: Module: wine Branch: master Commit: d8f79a037cfb29104a960c4e6422e4718e3ecf43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d8f79a037cfb29104a960c4e6422e4718e3ecf43 Author: Jacek Caban Date: Mon Aug 31 20:11:53 2015 +0200 msi: Fixed varg0 leak in InstallerImpl_SummaryInformation. --- dlls/msi/automation.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c index e974387..56823ee 100644 --- a/dlls/msi/automation.c +++ b/dlls/msi/automation.c @@ -1841,32 +1841,28 @@ static HRESULT InstallerImpl_SummaryInformation(WORD wFlags, if (!(wFlags & DISPATCH_PROPERTYGET)) return DISP_E_MEMBERNOTFOUND; - VariantInit(&varg0); - hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr); - if (FAILED(hr)) - return hr; - VariantInit(&varg1); hr = DispGetParam(pDispParams, 1, VT_I4, &varg1, puArgErr); if (FAILED(hr)) return hr; - V_VT(pVarResult) = VT_DISPATCH; + VariantInit(&varg0); + hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr); + if (FAILED(hr)) + return hr; ret = MsiGetSummaryInformationW(0, V_BSTR(&varg0), V_I4(&varg1), &hsuminfo); + VariantClear(&varg0); if (ret != ERROR_SUCCESS) - { - hr = DISP_E_EXCEPTION; - goto done; - } + return DISP_E_EXCEPTION; hr = create_summaryinfo(hsuminfo, &dispatch); - if (SUCCEEDED(hr)) - V_DISPATCH(pVarResult) = dispatch; + if (FAILED(hr)) + return hr; -done: - VariantClear(&varg0); - return hr; + V_VT(pVarResult) = VT_DISPATCH; + V_DISPATCH(pVarResult) = dispatch; + return S_OK; } static HRESULT InstallerImpl_UILevel(WORD wFlags, From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Vincent Povirk : advapi32: RegOpenKeyEx can return special roots when asked for empty subkey. Message-ID: Module: wine Branch: master Commit: 997484964a30d7d1b95aa0456d20710d9941d2df URL: http://source.winehq.org/git/wine.git/?a=commit;h=997484964a30d7d1b95aa0456d20710d9941d2df Author: Vincent Povirk Date: Mon Aug 31 15:29:37 2015 -0500 advapi32: RegOpenKeyEx can return special roots when asked for empty subkey. --- dlls/advapi32/registry.c | 16 ++++++++++++++++ dlls/advapi32/tests/registry.c | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c index cf5a1ac..2482b85 100644 --- a/dlls/advapi32/registry.c +++ b/dlls/advapi32/registry.c @@ -476,6 +476,14 @@ LSTATUS WINAPI RegOpenKeyExW( HKEY hkey, LPCWSTR name, DWORD options, REGSAM acc OBJECT_ATTRIBUTES attr; UNICODE_STRING nameW; + if (retkey && (!name || !name[0]) && + (HandleToUlong(hkey) >= HandleToUlong(HKEY_SPECIAL_ROOT_FIRST)) && + (HandleToUlong(hkey) <= HandleToUlong(HKEY_SPECIAL_ROOT_LAST))) + { + *retkey = hkey; + return ERROR_SUCCESS; + } + /* NT+ allows beginning backslash for HKEY_CLASSES_ROOT */ if (HandleToUlong(hkey) == HandleToUlong(HKEY_CLASSES_ROOT) && name && *name == '\\') name++; @@ -520,6 +528,14 @@ LSTATUS WINAPI RegOpenKeyExA( HKEY hkey, LPCSTR name, DWORD options, REGSAM acce STRING nameA; NTSTATUS status; + if (retkey && (!name || !name[0]) && + (HandleToUlong(hkey) >= HandleToUlong(HKEY_SPECIAL_ROOT_FIRST)) && + (HandleToUlong(hkey) <= HandleToUlong(HKEY_SPECIAL_ROOT_LAST))) + { + *retkey = hkey; + return ERROR_SUCCESS; + } + if (!is_version_nt()) access = MAXIMUM_ALLOWED; /* Win95 ignores the access mask */ else { diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index b8b7e1c..a8e783c 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1075,7 +1075,6 @@ static void test_reg_open_key(void) ok(ret == ERROR_INVALID_HANDLE || ret == ERROR_BADKEY, /* Windows 95 returns BADKEY */ "expected ERROR_INVALID_HANDLE or ERROR_BADKEY, got %d\n", ret); ok(hkResult == hkPreserve, "expected hkResult == hkPreserve\n"); - RegCloseKey(hkResult); /* send in NULL hkResult */ ret = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Test", NULL); @@ -1101,6 +1100,45 @@ static void test_reg_open_key(void) "expected ERROR_SUCCESS, ERROR_BAD_PATHNAME or ERROR_FILE_NOT_FOUND, got %d\n", ret); RegCloseKey(hkResult); + /* NULL or empty subkey of special root */ + hkResult = NULL; + ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, NULL, 0, KEY_QUERY_VALUE, &hkResult); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret); + ok(hkResult == HKEY_CLASSES_ROOT, "expected hkResult == HKEY_CLASSES_ROOT\n"); + + hkResult = NULL; + ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, "", 0, KEY_QUERY_VALUE, &hkResult); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret); + ok(hkResult == HKEY_CLASSES_ROOT, "expected hkResult == HKEY_CLASSES_ROOT\n"); + + hkResult = NULL; + ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, "\\", 0, KEY_QUERY_VALUE, &hkResult); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret); + ok(hkResult != HKEY_CLASSES_ROOT, "expected hkResult to be a new key\n"); + ok(!RegCloseKey(hkResult), "got invalid hkey\n"); + + /* empty subkey of existing handle */ + hkResult = hkPreserve; + ret = RegOpenKeyExA(hkPreserve, "", 0, KEY_QUERY_VALUE, &hkResult); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret); + ok(hkResult != hkPreserve, "expected hkResult != hkPreserve\n"); + ok(!RegCloseKey(hkResult), "got invalid hkey\n"); + + /* NULL subkey of existing handle */ + hkResult = hkPreserve; + ret = RegOpenKeyExA(hkPreserve, NULL, 0, KEY_QUERY_VALUE, &hkResult); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret); + ok(hkResult != hkPreserve, "expected hkResult != hkPreserve\n"); + ok(!RegCloseKey(hkResult), "got invalid hkey\n"); + + /* empty subkey of NULL */ + hkResult = hkPreserve; + ret = RegOpenKeyExA(NULL, "", 0, KEY_QUERY_VALUE, &hkResult); + ok(ret == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", ret); + ok(hkResult == hkPreserve, "expected hkResult == hkPreserve\n"); + + RegCloseKey(hkPreserve); + /* WOW64 flags */ hkResult = NULL; ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software", 0, KEY_READ|KEY_WOW64_32KEY, &hkResult); From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Thomas Faber : access.idl: Do not use annotation attribute on remote method (MIDL). Message-ID: Module: wine Branch: master Commit: d2d64bd74c9babfedecfb05b66de6fe9a6e7309d URL: http://source.winehq.org/git/wine.git/?a=commit;h=d2d64bd74c9babfedecfb05b66de6fe9a6e7309d Author: Thomas Faber Date: Tue Sep 1 08:52:27 2015 +0200 access.idl: Do not use annotation attribute on remote method (MIDL). --- include/access.idl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/access.idl b/include/access.idl index eaca1f6..e7beb99 100644 --- a/include/access.idl +++ b/include/access.idl @@ -34,7 +34,7 @@ interface IAccessor : IUnknown [call_as(AddRefAccessor)] HRESULT RemoteAddRefAccessor([in] HACCESSOR hAccessor, - [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount, + [in, out, unique] DBREFCOUNT *pcRefCount, [out] IErrorInfo **ppErrorInfoRem); [local] From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Nikolay Sivov : dwrite: Force reported English family/ face names to resolved values. Message-ID: Module: wine Branch: master Commit: a22d5ed9489bb38bcb1ffd75a21cb2f0f0275e75 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a22d5ed9489bb38bcb1ffd75a21cb2f0f0275e75 Author: Nikolay Sivov Date: Tue Sep 1 12:09:24 2015 +0300 dwrite: Force reported English family/face names to resolved values. --- dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/font.c | 32 ++++++++++++++++++++++---------- dlls/dwrite/main.c | 17 ++++++++++++++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index a7b8c46..70aadcc 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -122,6 +122,7 @@ extern void release_gdiinterop(IDWriteGdiInterop*) DECLSPEC_HIDDEN; extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN; extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN; extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN; +extern void set_en_localizedstring(IDWriteLocalizedStrings*,const WCHAR*) DECLSPEC_HIDDEN; extern HRESULT get_system_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN; extern HRESULT get_eudc_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN; extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 63ad277..928222d 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -1985,7 +1985,8 @@ static int trim_spaces(WCHAR *in, WCHAR *ret) struct name_token { struct list entry; const WCHAR *ptr; - INT len; + INT len; /* token length */ + INT fulllen; /* full length including following separators */ }; static inline BOOL is_name_separator_char(WCHAR ch) @@ -2406,7 +2407,7 @@ static inline void font_name_token_to_str(const struct name_token *name, WCHAR * strW[name->len] = 0; } -static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHAR *familyW, WCHAR *faceW) +static BOOL font_apply_differentiation_rules(struct dwrite_font_data *font, WCHAR *familyW, WCHAR *faceW) { static const WCHAR bookW[] = {'B','o','o','k',0}; static const WCHAR normalW[] = {'N','o','r','m','a','l',0}; @@ -2473,15 +2474,19 @@ static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHA struct name_token *token = heap_alloc(sizeof(*token)); token->ptr = ptr; token->len = 0; + token->fulllen = 0; while (*ptr && !is_name_separator_char(*ptr)) { token->len++; + token->fulllen++; ptr++; } /* skip separators */ - while (is_name_separator_char(*ptr)) + while (is_name_separator_char(*ptr)) { + token->fulllen++; ptr++; + } list_add_head(&tokens, &token->entry); } @@ -2526,19 +2531,22 @@ static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHA /* get final combined string from what's left in token list, list is released */ ptrW = finalW; - *ptrW = 0; LIST_FOR_EACH_ENTRY_SAFE_REV(token, token2, &tokens, struct name_token, entry) { - if (*finalW) - *(ptrW++) = ' '; - memcpy(ptrW, token->ptr, token->len * sizeof(WCHAR)); - ptrW += token->len; + int len; + list_remove(&token->entry); + + /* don't include last separator */ + len = list_empty(&tokens) ? token->len : token->fulllen; + memcpy(ptrW, token->ptr, len * sizeof(WCHAR)); + ptrW += len; + heap_free(token); } *ptrW = 0; if (!strcmpW(familyW, finalW)) - return; + return FALSE; /* construct face name */ strcpyW(familyW, finalW); @@ -2620,6 +2628,7 @@ static void font_apply_differentiation_rules(struct dwrite_font_data *font, WCHA } TRACE("resolved family %s, face %s\n", debugstr_w(familyW), debugstr_w(faceW)); + return TRUE; } static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, DWRITE_FONT_FACE_TYPE face_type, UINT32 face_index, @@ -2670,7 +2679,10 @@ static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, D fontstrings_get_en_string(*family_name, familyW, sizeof(familyW)/sizeof(WCHAR)); fontstrings_get_en_string(data->names, faceW, sizeof(faceW)/sizeof(WCHAR)); - font_apply_differentiation_rules(data, familyW, faceW); + if (font_apply_differentiation_rules(data, familyW, faceW)) { + set_en_localizedstring(*family_name, familyW); + set_en_localizedstring(data->names, faceW); + } init_font_prop_vec(data->weight, data->stretch, data->style, &data->propvec); diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index 01a4012..ce4299c 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -438,7 +438,7 @@ HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, } HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **ret) - { +{ struct localizedstrings *strings, *strings_clone; int i; @@ -471,6 +471,21 @@ HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedSt return S_OK; } +void set_en_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *string) +{ + static const WCHAR enusW[] = {'e','n','-','U','S',0}; + struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface); + UINT32 i; + + for (i = 0; i < This->count; i++) { + if (!strcmpiW(This->data[i].locale, enusW)) { + heap_free(This->data[i].string); + This->data[i].string = heap_strdupW(string); + break; + } + } +} + struct collectionloader { struct list entry; From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Nikolay Sivov : gdi32/tests: Add names to data structure GetFontRealizationInfo returns, explicitly test with older variant fields. Message-ID: Module: wine Branch: master Commit: adb0f582e03c63ce194868fbf3ea5355641e655f URL: http://source.winehq.org/git/wine.git/?a=commit;h=adb0f582e03c63ce194868fbf3ea5355641e655f Author: Nikolay Sivov Date: Sat Aug 29 19:53:40 2015 +0300 gdi32/tests: Add names to data structure GetFontRealizationInfo returns, explicitly test with older variant fields. --- dlls/gdi32/tests/font.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index 65685ac..fb603a4 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -4114,6 +4114,22 @@ todo_wine static void test_RealizationInfo(void) { + struct font_realization_info { + DWORD size; + DWORD flags; + DWORD cache_num; + DWORD instance_id; + DWORD unk; + DWORD face_index; + }; + + struct realization_info_t + { + DWORD flags; + DWORD cache_num; + DWORD instance_id; + }; + HDC hdc; DWORD info[4], info2[10]; BOOL r, have_file = FALSE; @@ -4166,6 +4182,9 @@ static void test_RealizationInfo(void) if (pGetFontRealizationInfo) { + struct font_realization_info *fri = (struct font_realization_info*)info2; + struct realization_info_t *ri = (struct realization_info_t*)info; + /* The first DWORD represents a struct size. On a newly rebooted system setting this to < 16 results in GetFontRealizationInfo failing. However there @@ -4180,9 +4199,11 @@ static void test_RealizationInfo(void) ok(r != 0, "ret 0\n"); /* We may get the '24' version here if that has been previously requested. */ - ok(info2[0] == 16 || info2[0] == 24, "got %d\n", info2[0]); - ok(!memcmp(info2 + 1, info, 3 * sizeof(DWORD)), "mismatch\n"); - ok(info2[6] == 0xcccccccc, "structure longer than 6 dwords\n"); + ok(fri->size == 16 || fri->size == 24, "got %d\n", info2[0]); + ok(fri->flags == ri->flags, "flags mismatch\n"); + ok(fri->cache_num == ri->cache_num, "cache_num mismatch\n"); + ok(fri->instance_id == ri->instance_id, "instance id mismatch\n"); + ok(info2[6] == 0xcccccccc, "got wrong dword 6, 0x%08x\n", info2[6]); memset(info2, 0xcc, sizeof(info2)); info2[0] = 28; @@ -4193,12 +4214,15 @@ static void test_RealizationInfo(void) info2[0] = 24; r = pGetFontRealizationInfo(hdc, info2); ok(r != 0, "ret 0\n"); - ok(info2[0] == 24, "got %d\n", info2[0]); - ok(!memcmp(info2 + 1, info, 3 * sizeof(DWORD)), "mismatch\n"); + ok(fri->size == 24, "got %d\n", fri->size); + ok(fri->flags == ri->flags, "flags mismatch\n"); + ok(fri->cache_num == ri->cache_num, "cache_num mismatch\n"); + ok(fri->instance_id == ri->instance_id, "instance id mismatch\n"); + ok(fri->face_index == 0, "got wrong face index %u\n", fri->face_index); ok(info2[6] == 0xcccccccc, "structure longer than 6 dwords\n"); /* Test GetFontFileInfo() */ - r = pGetFontFileInfo(info2[3], 0, &file_info, sizeof(file_info), &needed); + r = pGetFontFileInfo(fri->instance_id, 0, &file_info, sizeof(file_info), &needed); ok(r != 0 || GetLastError() == ERROR_NOACCESS, "ret %d gle %d\n", r, GetLastError()); if (r) @@ -4218,11 +4242,13 @@ static void test_RealizationInfo(void) } /* Get bytes 2 - 16 using GetFontFileData */ - r = pGetFontFileData(info2[3], 0, 2, data, sizeof(data)); + r = pGetFontFileData(fri->instance_id, 0, 2, data, sizeof(data)); ok(r != 0, "ret 0 gle %d\n", GetLastError()); if (have_file) ok(!memcmp(data, file + 2, sizeof(data)), "mismatch\n"); + else + win_skip("GetFontFileInfo() failed, skipping\n"); } DeleteObject(SelectObject(hdc, hfont_old)); From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Nikolay Sivov : gdi32: Added GetFontRealizationInfo() export. Message-ID: Module: wine Branch: master Commit: 7889b17425d77f92af40bd53f80870ac024ed492 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7889b17425d77f92af40bd53f80870ac024ed492 Author: Nikolay Sivov Date: Sat Aug 29 19:54:17 2015 +0300 gdi32: Added GetFontRealizationInfo() export. --- dlls/gdi32/dibdrv/dc.c | 4 ++-- dlls/gdi32/driver.c | 12 ++++++------ dlls/gdi32/enhmfdrv/init.c | 2 +- dlls/gdi32/font.c | 46 +++++++++++++++++++++++++++++++++++++++------- dlls/gdi32/freetype.c | 18 ++++++++++++------ dlls/gdi32/gdi32.spec | 1 + dlls/gdi32/gdi_private.h | 10 ++++++---- dlls/gdi32/mfdrv/init.c | 2 +- dlls/gdi32/path.c | 2 +- dlls/gdi32/tests/font.c | 2 ++ dlls/winemac.drv/gdi.c | 2 +- dlls/wineps.drv/init.c | 2 +- dlls/winex11.drv/init.c | 2 +- dlls/winex11.drv/xrender.c | 2 +- include/wine/gdi_driver.h | 4 ++-- 15 files changed, 77 insertions(+), 34 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=7889b17425d77f92af40bd53f80870ac024ed492 From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d10core/tests: Port test_texture2d_interfaces() from d3d11. Message-ID: Module: wine Branch: master Commit: f9ecce38efd22c8bf67e43a15e5891d1cad265f1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f9ecce38efd22c8bf67e43a15e5891d1cad265f1 Author: J?zef Kucia Date: Tue Sep 1 00:27:31 2015 +0200 d3d10core/tests: Port test_texture2d_interfaces() from d3d11. --- dlls/d3d10core/tests/device.c | 141 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index 5e12f14..847abd1 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -297,6 +297,146 @@ static void test_create_texture2d(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_texture2d_interfaces(void) +{ + ID3D11Texture2D *d3d11_texture; + D3D10_TEXTURE2D_DESC desc; + ID3D10Texture2D *texture; + IDXGISurface *surface; + ID3D10Device *device; + unsigned int i; + ULONG refcount; + HRESULT hr; + + static const struct test + { + UINT bind_flags; + UINT misc_flags; + UINT expected_bind_flags; + UINT expected_misc_flags; + } + desc_conversion_tests[] = + { + { + D3D10_BIND_RENDER_TARGET, 0, + D3D11_BIND_RENDER_TARGET, 0 + }, + { + 0, D3D10_RESOURCE_MISC_SHARED, + 0, D3D11_RESOURCE_MISC_SHARED + }, + }; + + if (!(device = create_device())) + { + skip("Failed to create device, skipping tests.\n"); + return; + } + + desc.Width = 512; + desc.Height = 512; + desc.MipLevels = 0; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_RENDER_TARGET; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x.\n", hr); + + hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(hr == E_NOINTERFACE, "Texture should not implement IDXGISurface.\n"); + + hr = ID3D10Texture2D_QueryInterface(texture, &IID_ID3D11Texture2D, (void **)&d3d11_texture); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Texture should implement ID3D11Texture2D.\n"); + if (SUCCEEDED(hr)) ID3D11Texture2D_Release(d3d11_texture); + ID3D10Texture2D_Release(texture); + + if (FAILED(hr)) + { + win_skip("D3D11 is not available, skipping tests.\n"); + ID3D10Device_Release(device); + return; + } + + for (i = 0; i < sizeof(desc_conversion_tests) / sizeof(*desc_conversion_tests); ++i) + { + const struct test *current = &desc_conversion_tests[i]; + D3D11_TEXTURE2D_DESC d3d11_desc; + ID3D11Device *d3d11_device; + + desc.Width = 512; + desc.Height = 512; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D10_USAGE_DEFAULT; + desc.BindFlags = current->bind_flags; + desc.CPUAccessFlags = 0; + desc.MiscFlags = current->misc_flags; + + hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture); + /* Shared resources are not supported by REF and WARP devices. */ + ok(SUCCEEDED(hr) || broken(hr == E_OUTOFMEMORY), + "Test %u: Failed to create a 2d texture, hr %#x.\n", i, hr); + if (FAILED(hr)) + { + win_skip("Failed to create ID3D10Texture2D, skipping test %u.\n", i); + continue; + } + + hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(SUCCEEDED(hr), "Test %u: Texture should implement IDXGISurface.\n", i); + IDXGISurface_Release(surface); + + hr = ID3D10Texture2D_QueryInterface(texture, &IID_ID3D11Texture2D, (void **)&d3d11_texture); + ok(SUCCEEDED(hr), "Test %u: Texture should implement ID3D11Texture2D.\n", i); + ID3D10Texture2D_Release(texture); + + ID3D11Texture2D_GetDesc(d3d11_texture, &d3d11_desc); + + ok(d3d11_desc.Width == desc.Width, + "Test %u: Got unexpected Width %u.\n", i, d3d11_desc.Width); + ok(d3d11_desc.Height == desc.Height, + "Test %u: Got unexpected Height %u.\n", i, d3d11_desc.Height); + ok(d3d11_desc.MipLevels == desc.MipLevels, + "Test %u: Got unexpected MipLevels %u.\n", i, d3d11_desc.MipLevels); + ok(d3d11_desc.ArraySize == desc.ArraySize, + "Test %u: Got unexpected ArraySize %u.\n", i, d3d11_desc.ArraySize); + ok(d3d11_desc.Format == desc.Format, + "Test %u: Got unexpected Format %u.\n", i, d3d11_desc.Format); + ok(d3d11_desc.SampleDesc.Count == desc.SampleDesc.Count, + "Test %u: Got unexpected SampleDesc.Count %u.\n", i, d3d11_desc.SampleDesc.Count); + ok(d3d11_desc.SampleDesc.Quality == desc.SampleDesc.Quality, + "Test %u: Got unexpected SampleDesc.Quality %u.\n", i, d3d11_desc.SampleDesc.Quality); + ok(d3d11_desc.Usage == (D3D11_USAGE)desc.Usage, + "Test %u: Got unexpected Usage %u.\n", i, d3d11_desc.Usage); + ok(d3d11_desc.BindFlags == current->expected_bind_flags, + "Test %u: Got unexpected BindFlags %#x.\n", i, d3d11_desc.BindFlags); + ok(d3d11_desc.CPUAccessFlags == desc.CPUAccessFlags, + "Test %u: Got unexpected CPUAccessFlags %#x.\n", i, d3d11_desc.CPUAccessFlags); + ok(d3d11_desc.MiscFlags == current->expected_misc_flags, + "Test %u: Got unexpected MiscFlags %#x.\n", i, d3d11_desc.MiscFlags); + + d3d11_device = NULL; + ID3D11Texture2D_GetDevice(d3d11_texture, &d3d11_device); + ok(!!d3d11_device, "Test %u: Got NULL, expected device pointer.\n", i); + ID3D11Device_Release(d3d11_device); + + ID3D11Texture2D_Release(d3d11_texture); + } + + refcount = ID3D10Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + static void test_create_texture3d(void) { ULONG refcount, expected_refcount; @@ -3465,6 +3605,7 @@ START_TEST(device) { test_feature_level(); test_create_texture2d(); + test_texture2d_interfaces(); test_create_texture3d(); test_create_depthstencil_view(); test_create_rendertarget_view(); From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_texture3d to d3d_texture3d. Message-ID: Module: wine Branch: master Commit: 0707fa19129d32c4fa07546e6ffd85624d3a0588 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0707fa19129d32c4fa07546e6ffd85624d3a0588 Author: J?zef Kucia Date: Tue Sep 1 00:27:32 2015 +0200 d3d11: Rename d3d10_texture3d to d3d_texture3d. --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 4 ++-- dlls/d3d11/texture.c | 34 +++++++++++++++++----------------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 8adf6a3..1da39d2 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -117,7 +117,7 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE struct d3d_texture2d *unsafe_impl_from_ID3D10Texture2D(ID3D10Texture2D *iface) DECLSPEC_HIDDEN; /* ID3D10Texture3D */ -struct d3d10_texture3d +struct d3d_texture3d { ID3D10Texture3D ID3D10Texture3D_iface; LONG refcount; @@ -128,7 +128,7 @@ struct d3d10_texture3d ID3D10Device1 *device; }; -HRESULT d3d10_texture3d_init(struct d3d10_texture3d *texture, struct d3d_device *device, +HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, const D3D10_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; /* ID3D10Buffer */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index b722280..7aef1f7 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2044,7 +2044,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device1 *ifa ID3D10Texture3D **texture) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_texture3d *object; + struct d3d_texture3d *object; HRESULT hr; TRACE("iface %p, desc %p, data %p, texture %p.\n", iface, desc, data, texture); @@ -2053,7 +2053,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device1 *ifa if (!object) return E_OUTOFMEMORY; - if (FAILED(hr = d3d10_texture3d_init(object, device, desc, data))) + if (FAILED(hr = d3d_texture3d_init(object, device, desc, data))) { WARN("Failed to initialize texture, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index 8e9fa2f..31df894 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -542,9 +542,9 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE return S_OK; } -static inline struct d3d10_texture3d *impl_from_ID3D10Texture3D(ID3D10Texture3D *iface) +static inline struct d3d_texture3d *impl_from_ID3D10Texture3D(ID3D10Texture3D *iface) { - return CONTAINING_RECORD(iface, struct d3d10_texture3d, ID3D10Texture3D_iface); + return CONTAINING_RECORD(iface, struct d3d_texture3d, ID3D10Texture3D_iface); } static HRESULT STDMETHODCALLTYPE d3d10_texture3d_QueryInterface(ID3D10Texture3D *iface, REFIID riid, void **object) @@ -569,7 +569,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_texture3d_QueryInterface(ID3D10Texture3D static ULONG STDMETHODCALLTYPE d3d10_texture3d_AddRef(ID3D10Texture3D *iface) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); ULONG refcount = InterlockedIncrement(&texture->refcount); TRACE("%p increasing refcount to %u.\n", texture, refcount); @@ -585,9 +585,9 @@ static ULONG STDMETHODCALLTYPE d3d10_texture3d_AddRef(ID3D10Texture3D *iface) return refcount; } -static void STDMETHODCALLTYPE d3d10_texture3d_wined3d_object_released(void *parent) +static void STDMETHODCALLTYPE d3d_texture3d_wined3d_object_released(void *parent) { - struct d3d10_texture3d *texture = parent; + struct d3d_texture3d *texture = parent; wined3d_private_store_cleanup(&texture->private_store); HeapFree(GetProcessHeap(), 0, parent); @@ -595,7 +595,7 @@ static void STDMETHODCALLTYPE d3d10_texture3d_wined3d_object_released(void *pare static ULONG STDMETHODCALLTYPE d3d10_texture3d_Release(ID3D10Texture3D *iface) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); ULONG refcount = InterlockedDecrement(&texture->refcount); TRACE("%p decreasing refcount to %u.\n", texture, refcount); @@ -617,7 +617,7 @@ static ULONG STDMETHODCALLTYPE d3d10_texture3d_Release(ID3D10Texture3D *iface) static void STDMETHODCALLTYPE d3d10_texture3d_GetDevice(ID3D10Texture3D *iface, ID3D10Device **device) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); TRACE("iface %p, device %p.\n", iface, device); @@ -628,7 +628,7 @@ static void STDMETHODCALLTYPE d3d10_texture3d_GetDevice(ID3D10Texture3D *iface, static HRESULT STDMETHODCALLTYPE d3d10_texture3d_GetPrivateData(ID3D10Texture3D *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -639,7 +639,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_texture3d_GetPrivateData(ID3D10Texture3D static HRESULT STDMETHODCALLTYPE d3d10_texture3d_SetPrivateData(ID3D10Texture3D *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -650,7 +650,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_texture3d_SetPrivateData(ID3D10Texture3D static HRESULT STDMETHODCALLTYPE d3d10_texture3d_SetPrivateDataInterface(ID3D10Texture3D *iface, REFGUID guid, const IUnknown *data) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); @@ -680,7 +680,7 @@ static UINT STDMETHODCALLTYPE d3d10_texture3d_GetEvictionPriority(ID3D10Texture3 static HRESULT STDMETHODCALLTYPE d3d10_texture3d_Map(ID3D10Texture3D *iface, UINT sub_resource_idx, D3D10_MAP map_type, UINT map_flags, D3D10_MAPPED_TEXTURE3D *mapped_texture) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); struct wined3d_map_desc wined3d_map_desc; struct wined3d_resource *sub_resource; HRESULT hr; @@ -708,7 +708,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_texture3d_Map(ID3D10Texture3D *iface, UIN static void STDMETHODCALLTYPE d3d10_texture3d_Unmap(ID3D10Texture3D *iface, UINT sub_resource_idx) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); struct wined3d_resource *sub_resource; TRACE("iface %p, sub_resource_idx %u.\n", iface, sub_resource_idx); @@ -726,7 +726,7 @@ static void STDMETHODCALLTYPE d3d10_texture3d_Unmap(ID3D10Texture3D *iface, UINT static void STDMETHODCALLTYPE d3d10_texture3d_GetDesc(ID3D10Texture3D *iface, D3D10_TEXTURE3D_DESC *desc) { - struct d3d10_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); TRACE("iface %p, desc %p.\n", iface, desc); @@ -754,12 +754,12 @@ static const struct ID3D10Texture3DVtbl d3d10_texture3d_vtbl = d3d10_texture3d_GetDesc, }; -static const struct wined3d_parent_ops d3d10_texture3d_wined3d_parent_ops = +static const struct wined3d_parent_ops d3d_texture3d_wined3d_parent_ops = { - d3d10_texture3d_wined3d_object_released, + d3d_texture3d_wined3d_object_released, }; -HRESULT d3d10_texture3d_init(struct d3d10_texture3d *texture, struct d3d_device *device, +HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, const D3D10_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) { struct wined3d_resource_desc wined3d_desc; @@ -787,7 +787,7 @@ HRESULT d3d10_texture3d_init(struct d3d10_texture3d *texture, struct d3d_device if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc, levels, 0, (struct wined3d_sub_resource_data *)data, texture, - &d3d10_texture3d_wined3d_parent_ops, &texture->wined3d_texture))) + &d3d_texture3d_wined3d_parent_ops, &texture->wined3d_texture))) { WARN("Failed to create wined3d texture, hr %#x.\n", hr); wined3d_private_store_cleanup(&texture->private_store); From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Add ID3D11Texture3D interface stub. Message-ID: Module: wine Branch: master Commit: 4665ae626013c6aa19c643ea7f94af5b5f392cb2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4665ae626013c6aa19c643ea7f94af5b5f392cb2 Author: J?zef Kucia Date: Tue Sep 1 00:27:33 2015 +0200 d3d11: Add ID3D11Texture3D interface stub. --- dlls/d3d11/d3d11_private.h | 3 +- dlls/d3d11/texture.c | 140 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 132 insertions(+), 11 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 1da39d2..c0513a8 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -116,9 +116,10 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture2d **texture) DECLSPEC_HIDDEN; struct d3d_texture2d *unsafe_impl_from_ID3D10Texture2D(ID3D10Texture2D *iface) DECLSPEC_HIDDEN; -/* ID3D10Texture3D */ +/* ID3D11Texture3D, ID3D10Texture3D */ struct d3d_texture3d { + ID3D11Texture3D ID3D11Texture3D_iface; ID3D10Texture3D ID3D10Texture3D_iface; LONG refcount; diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index 31df894..adb7474 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -542,24 +542,36 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE return S_OK; } -static inline struct d3d_texture3d *impl_from_ID3D10Texture3D(ID3D10Texture3D *iface) +/* ID3D11Texture3D methods */ + +static inline struct d3d_texture3d *impl_from_ID3D11Texture3D(ID3D11Texture3D *iface) { - return CONTAINING_RECORD(iface, struct d3d_texture3d, ID3D10Texture3D_iface); + return CONTAINING_RECORD(iface, struct d3d_texture3d, ID3D11Texture3D_iface); } -static HRESULT STDMETHODCALLTYPE d3d10_texture3d_QueryInterface(ID3D10Texture3D *iface, REFIID riid, void **object) +static HRESULT STDMETHODCALLTYPE d3d11_texture3d_QueryInterface(ID3D11Texture3D *iface, REFIID riid, void **object) { + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - if (IsEqualGUID(riid, &IID_ID3D10Texture3D) - || IsEqualGUID(riid, &IID_ID3D10Resource) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + if (IsEqualGUID(riid, &IID_ID3D11Texture3D) + || IsEqualGUID(riid, &IID_ID3D11Resource) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { IUnknown_AddRef(iface); *object = iface; return S_OK; } + else if (IsEqualGUID(riid, &IID_ID3D10Texture3D) + || IsEqualGUID(riid, &IID_ID3D10Resource) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + IUnknown_AddRef(iface); + *object = &texture->ID3D10Texture3D_iface; + return S_OK; + } WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); @@ -567,9 +579,9 @@ static HRESULT STDMETHODCALLTYPE d3d10_texture3d_QueryInterface(ID3D10Texture3D return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_texture3d_AddRef(ID3D10Texture3D *iface) +static ULONG STDMETHODCALLTYPE d3d11_texture3d_AddRef(ID3D11Texture3D *iface) { - struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); ULONG refcount = InterlockedIncrement(&texture->refcount); TRACE("%p increasing refcount to %u.\n", texture, refcount); @@ -593,9 +605,9 @@ static void STDMETHODCALLTYPE d3d_texture3d_wined3d_object_released(void *parent HeapFree(GetProcessHeap(), 0, parent); } -static ULONG STDMETHODCALLTYPE d3d10_texture3d_Release(ID3D10Texture3D *iface) +static ULONG STDMETHODCALLTYPE d3d11_texture3d_Release(ID3D11Texture3D *iface) { - struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); ULONG refcount = InterlockedDecrement(&texture->refcount); TRACE("%p decreasing refcount to %u.\n", texture, refcount); @@ -615,6 +627,113 @@ static ULONG STDMETHODCALLTYPE d3d10_texture3d_Release(ID3D10Texture3D *iface) return refcount; } +static void STDMETHODCALLTYPE d3d11_texture3d_GetDevice(ID3D11Texture3D *iface, ID3D11Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_texture3d_GetPrivateData(ID3D11Texture3D *iface, + REFGUID guid, UINT *data_size, void *data) +{ + FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_texture3d_SetPrivateData(ID3D11Texture3D *iface, + REFGUID guid, UINT data_size, const void *data) +{ + FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_texture3d_SetPrivateDataInterface(ID3D11Texture3D *iface, + REFGUID guid, const IUnknown *data) +{ + FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data); + + return E_NOTIMPL; +} + +static void STDMETHODCALLTYPE d3d11_texture3d_GetType(ID3D11Texture3D *iface, + D3D11_RESOURCE_DIMENSION *resource_dimension) +{ + TRACE("iface %p, resource_dimension %p.\n", iface, resource_dimension); + + *resource_dimension = D3D11_RESOURCE_DIMENSION_TEXTURE3D; +} + +static void STDMETHODCALLTYPE d3d11_texture3d_SetEvictionPriority(ID3D11Texture3D *iface, UINT eviction_priority) +{ + FIXME("iface %p, eviction_priority %#x stub!\n", iface, eviction_priority); +} + +static UINT STDMETHODCALLTYPE d3d11_texture3d_GetEvictionPriority(ID3D11Texture3D *iface) +{ + FIXME("iface %p stub!\n", iface); + + return 0; +} + +static void STDMETHODCALLTYPE d3d11_texture3d_GetDesc(ID3D11Texture3D *iface, D3D11_TEXTURE3D_DESC *desc) +{ + FIXME("iface %p, desc %p stub!\n", iface, desc); +} + +static const struct ID3D11Texture3DVtbl d3d11_texture3d_vtbl = +{ + /* IUnknown methods */ + d3d11_texture3d_QueryInterface, + d3d11_texture3d_AddRef, + d3d11_texture3d_Release, + /* ID3D11DeviceChild methods */ + d3d11_texture3d_GetDevice, + d3d11_texture3d_GetPrivateData, + d3d11_texture3d_SetPrivateData, + d3d11_texture3d_SetPrivateDataInterface, + /* ID3D11Resource methods */ + d3d11_texture3d_GetType, + d3d11_texture3d_SetEvictionPriority, + d3d11_texture3d_GetEvictionPriority, + /* ID3D11Texture3D methods */ + d3d11_texture3d_GetDesc, +}; + +/* ID3D10Texture3D methods */ + +static inline struct d3d_texture3d *impl_from_ID3D10Texture3D(ID3D10Texture3D *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_texture3d, ID3D10Texture3D_iface); +} + +static HRESULT STDMETHODCALLTYPE d3d10_texture3d_QueryInterface(ID3D10Texture3D *iface, REFIID riid, void **object) +{ + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_texture3d_QueryInterface(&texture->ID3D11Texture3D_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_texture3d_AddRef(ID3D10Texture3D *iface) +{ + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_texture3d_AddRef(&texture->ID3D11Texture3D_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_texture3d_Release(ID3D10Texture3D *iface) +{ + struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_texture3d_Release(&texture->ID3D11Texture3D_iface); +} + static void STDMETHODCALLTYPE d3d10_texture3d_GetDevice(ID3D10Texture3D *iface, ID3D10Device **device) { struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); @@ -766,6 +885,7 @@ HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *dev unsigned int levels; HRESULT hr; + texture->ID3D11Texture3D_iface.lpVtbl = &d3d11_texture3d_vtbl; texture->ID3D10Texture3D_iface.lpVtbl = &d3d10_texture3d_vtbl; texture->refcount = 1; wined3d_mutex_lock(); From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_texture3d_GetDevice(). Message-ID: Module: wine Branch: master Commit: fc844029eeab1d622242dd1c5200040c13a14ffa URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc844029eeab1d622242dd1c5200040c13a14ffa Author: J?zef Kucia Date: Tue Sep 1 00:27:34 2015 +0200 d3d11: Implement d3d11_texture3d_GetDevice(). --- dlls/d3d11/d3d11_private.h | 2 +- dlls/d3d11/texture.c | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index c0513a8..c5379ed 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -126,7 +126,7 @@ struct d3d_texture3d struct wined3d_private_store private_store; struct wined3d_texture *wined3d_texture; D3D10_TEXTURE3D_DESC desc; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index adb7474..55f5d49 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -588,7 +588,7 @@ static ULONG STDMETHODCALLTYPE d3d11_texture3d_AddRef(ID3D11Texture3D *iface) if (refcount == 1) { - ID3D10Device1_AddRef(texture->device); + ID3D11Device_AddRef(texture->device); wined3d_mutex_lock(); wined3d_texture_incref(texture->wined3d_texture); wined3d_mutex_unlock(); @@ -614,14 +614,14 @@ static ULONG STDMETHODCALLTYPE d3d11_texture3d_Release(ID3D11Texture3D *iface) if (!refcount) { - ID3D10Device1 *device = texture->device; + ID3D11Device *device = texture->device; wined3d_mutex_lock(); wined3d_texture_decref(texture->wined3d_texture); wined3d_mutex_unlock(); /* Release the device last, it may cause the wined3d device to be * destroyed. */ - ID3D10Device1_Release(device); + ID3D11Device_Release(device); } return refcount; @@ -629,7 +629,12 @@ static ULONG STDMETHODCALLTYPE d3d11_texture3d_Release(ID3D11Texture3D *iface) static void STDMETHODCALLTYPE d3d11_texture3d_GetDevice(ID3D11Texture3D *iface, ID3D11Device **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = texture->device; + ID3D11Device_AddRef(*device); } static HRESULT STDMETHODCALLTYPE d3d11_texture3d_GetPrivateData(ID3D11Texture3D *iface, @@ -740,8 +745,7 @@ static void STDMETHODCALLTYPE d3d10_texture3d_GetDevice(ID3D10Texture3D *iface, TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)texture->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(texture->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_texture3d_GetPrivateData(ID3D10Texture3D *iface, @@ -917,8 +921,8 @@ HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *dev wined3d_mutex_unlock(); texture->desc.MipLevels = levels; - texture->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(texture->device); + texture->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(texture->device); return S_OK; } From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_texture3d_GetDesc(). Message-ID: Module: wine Branch: master Commit: 11cd2dd897bcec3852b7c2a87b45c86577639ec6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=11cd2dd897bcec3852b7c2a87b45c86577639ec6 Author: J?zef Kucia Date: Tue Sep 1 00:27:35 2015 +0200 d3d11: Implement d3d11_texture3d_GetDesc(). --- dlls/d3d11/d3d11_private.h | 5 +++-- dlls/d3d11/device.c | 13 ++++++++++++- dlls/d3d11/texture.c | 25 ++++++++++++++++++++----- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index c5379ed..6724a07 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -62,6 +62,7 @@ const char *debug_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN; DXGI_FORMAT dxgi_format_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; enum wined3d_format_id wined3dformat_from_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN; +DWORD wined3d_usage_from_d3d11(UINT bind_flags, enum D3D11_USAGE usage) DECLSPEC_HIDDEN; DWORD wined3d_usage_from_d3d10core(UINT bind_flags, enum D3D10_USAGE usage) DECLSPEC_HIDDEN; struct wined3d_resource *wined3d_resource_from_resource(ID3D10Resource *resource) DECLSPEC_HIDDEN; DWORD wined3d_map_flags_from_d3d10_map_type(D3D10_MAP map_type) DECLSPEC_HIDDEN; @@ -125,12 +126,12 @@ struct d3d_texture3d struct wined3d_private_store private_store; struct wined3d_texture *wined3d_texture; - D3D10_TEXTURE3D_DESC desc; + D3D11_TEXTURE3D_DESC desc; ID3D11Device *device; }; HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, - const D3D10_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; + const D3D11_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; /* ID3D10Buffer */ struct d3d10_buffer diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 7aef1f7..5f54795 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2044,6 +2044,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device1 *ifa ID3D10Texture3D **texture) { struct d3d_device *device = impl_from_ID3D10Device(iface); + D3D11_TEXTURE3D_DESC d3d11_desc; struct d3d_texture3d *object; HRESULT hr; @@ -2053,7 +2054,17 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device1 *ifa if (!object) return E_OUTOFMEMORY; - if (FAILED(hr = d3d_texture3d_init(object, device, desc, data))) + d3d11_desc.Width = desc->Width; + d3d11_desc.Height = desc->Height; + d3d11_desc.Depth = desc->Depth; + d3d11_desc.MipLevels = desc->MipLevels; + d3d11_desc.Format = desc->Format; + d3d11_desc.Usage = d3d11_usage_from_d3d10_usage(desc->Usage); + d3d11_desc.BindFlags = d3d11_bind_flags_from_d3d10_bind_flags(desc->BindFlags); + d3d11_desc.CPUAccessFlags = d3d11_cpu_access_flags_from_d3d10_cpu_access_flags(desc->CPUAccessFlags); + d3d11_desc.MiscFlags = d3d11_resource_misc_flags_from_d3d10_resource_misc_flags(desc->MiscFlags); + + if (FAILED(hr = d3d_texture3d_init(object, device, &d3d11_desc, data))) { WARN("Failed to initialize texture, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index 55f5d49..52c3dba 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -467,7 +467,7 @@ static HRESULT d3d_texture2d_init(struct d3d_texture2d *texture, struct d3d_devi wined3d_desc.format = wined3dformat_from_dxgi_format(desc->Format); wined3d_desc.multisample_type = desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE; wined3d_desc.multisample_quality = desc->SampleDesc.Quality; - wined3d_desc.usage = wined3d_usage_from_d3d10core(desc->BindFlags, desc->Usage); + wined3d_desc.usage = wined3d_usage_from_d3d11(desc->BindFlags, desc->Usage); wined3d_desc.pool = WINED3D_POOL_DEFAULT; wined3d_desc.width = desc->Width; wined3d_desc.height = desc->Height; @@ -683,7 +683,11 @@ static UINT STDMETHODCALLTYPE d3d11_texture3d_GetEvictionPriority(ID3D11Texture3 static void STDMETHODCALLTYPE d3d11_texture3d_GetDesc(ID3D11Texture3D *iface, D3D11_TEXTURE3D_DESC *desc) { - FIXME("iface %p, desc %p stub!\n", iface, desc); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); + + TRACE("iface %p, desc %p.\n", iface, desc); + + *desc = texture->desc; } static const struct ID3D11Texture3DVtbl d3d11_texture3d_vtbl = @@ -850,10 +854,21 @@ static void STDMETHODCALLTYPE d3d10_texture3d_Unmap(ID3D10Texture3D *iface, UINT static void STDMETHODCALLTYPE d3d10_texture3d_GetDesc(ID3D10Texture3D *iface, D3D10_TEXTURE3D_DESC *desc) { struct d3d_texture3d *texture = impl_from_ID3D10Texture3D(iface); + D3D11_TEXTURE3D_DESC d3d11_desc; TRACE("iface %p, desc %p.\n", iface, desc); - *desc = texture->desc; + d3d11_texture3d_GetDesc(&texture->ID3D11Texture3D_iface, &d3d11_desc); + + desc->Width = d3d11_desc.Width; + desc->Height = d3d11_desc.Height; + desc->Depth = d3d11_desc.Depth; + desc->MipLevels = d3d11_desc.MipLevels; + desc->Format = d3d11_desc.Format; + desc->Usage = d3d10_usage_from_d3d11_usage(d3d11_desc.Usage); + desc->BindFlags = d3d10_bind_flags_from_d3d11_bind_flags(d3d11_desc.BindFlags); + desc->CPUAccessFlags = d3d10_cpu_access_flags_from_d3d11_cpu_access_flags(d3d11_desc.CPUAccessFlags); + desc->MiscFlags = d3d10_resource_misc_flags_from_d3d11_resource_misc_flags(d3d11_desc.MiscFlags); } static const struct ID3D10Texture3DVtbl d3d10_texture3d_vtbl = @@ -883,7 +898,7 @@ static const struct wined3d_parent_ops d3d_texture3d_wined3d_parent_ops = }; HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, - const D3D10_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) + const D3D11_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) { struct wined3d_resource_desc wined3d_desc; unsigned int levels; @@ -900,7 +915,7 @@ HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *dev wined3d_desc.format = wined3dformat_from_dxgi_format(desc->Format); wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE; wined3d_desc.multisample_quality = 0; - wined3d_desc.usage = wined3d_usage_from_d3d10core(desc->BindFlags, desc->Usage); + wined3d_desc.usage = wined3d_usage_from_d3d11(desc->BindFlags, desc->Usage); wined3d_desc.pool = WINED3D_POOL_DEFAULT; wined3d_desc.width = desc->Width; wined3d_desc.height = desc->Height; From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateTexture3D(). Message-ID: Module: wine Branch: master Commit: 9a2b73d315c2cee253e61a1faee8a9da24cf38fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a2b73d315c2cee253e61a1faee8a9da24cf38fe Author: J?zef Kucia Date: Tue Sep 1 00:27:36 2015 +0200 d3d11: Implement d3d11_device_CreateTexture3D(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 24 ++++++++++++------------ dlls/d3d11/texture.c | 26 ++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 6724a07..cbdfdfa 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -130,8 +130,8 @@ struct d3d_texture3d ID3D11Device *device; }; -HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, - const D3D11_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; +HRESULT d3d_texture3d_create(struct d3d_device *device, const D3D11_TEXTURE3D_DESC *desc, + const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture3d **texture) DECLSPEC_HIDDEN; /* ID3D10Buffer */ struct d3d10_buffer diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 5f54795..c301dcc 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -92,9 +92,18 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateTexture2D(ID3D11Device *ifac static HRESULT STDMETHODCALLTYPE d3d11_device_CreateTexture3D(ID3D11Device *iface, const D3D11_TEXTURE3D_DESC *desc, const D3D11_SUBRESOURCE_DATA *data, ID3D11Texture3D **texture) { - FIXME("iface %p, desc %p, data %p, texture %p stub!\n", iface, desc, data, texture); + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_texture3d *object; + HRESULT hr; - return E_NOTIMPL; + TRACE("iface %p, desc %p, data %p, texture %p.\n", iface, desc, data, texture); + + if (FAILED(hr = d3d_texture3d_create(device, desc, data, &object))) + return hr; + + *texture = &object->ID3D11Texture3D_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateShaderResourceView(ID3D11Device *iface, @@ -2050,10 +2059,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device1 *ifa TRACE("iface %p, desc %p, data %p, texture %p.\n", iface, desc, data, texture); - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) - return E_OUTOFMEMORY; - d3d11_desc.Width = desc->Width; d3d11_desc.Height = desc->Height; d3d11_desc.Depth = desc->Depth; @@ -2064,14 +2069,9 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device1 *ifa d3d11_desc.CPUAccessFlags = d3d11_cpu_access_flags_from_d3d10_cpu_access_flags(desc->CPUAccessFlags); d3d11_desc.MiscFlags = d3d11_resource_misc_flags_from_d3d10_resource_misc_flags(desc->MiscFlags); - if (FAILED(hr = d3d_texture3d_init(object, device, &d3d11_desc, data))) - { - WARN("Failed to initialize texture, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); + if (FAILED(hr = d3d_texture3d_create(device, &d3d11_desc, (const D3D11_SUBRESOURCE_DATA *)data, &object))) return hr; - } - TRACE("Created 3D texture %p.\n", object); *texture = &object->ID3D10Texture3D_iface; return S_OK; diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index 52c3dba..db99a9b 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -897,8 +897,8 @@ static const struct wined3d_parent_ops d3d_texture3d_wined3d_parent_ops = d3d_texture3d_wined3d_object_released, }; -HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, - const D3D11_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) +static HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *device, + const D3D11_TEXTURE3D_DESC *desc, const D3D11_SUBRESOURCE_DATA *data) { struct wined3d_resource_desc wined3d_desc; unsigned int levels; @@ -941,3 +941,25 @@ HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_device *dev return S_OK; } + +HRESULT d3d_texture3d_create(struct d3d_device *device, const D3D11_TEXTURE3D_DESC *desc, + const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture3d **texture) +{ + struct d3d_texture3d *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_texture3d_init(object, device, desc, data))) + { + WARN("Failed to initialize texture, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created texture %p.\n", object); + *texture = object; + + return S_OK; +} From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Port test_create_texture3d () from d3d10core. Message-ID: Module: wine Branch: master Commit: 0fcfb8a08231de80eaa61ad79bc014c576315005 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0fcfb8a08231de80eaa61ad79bc014c576315005 Author: J?zef Kucia Date: Tue Sep 1 00:27:37 2015 +0200 d3d11/tests: Port test_create_texture3d() from d3d10core. --- dlls/d3d11/tests/d3d11.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 6cb1516..6a9d710 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -409,10 +409,90 @@ static void test_texture2d_interfaces(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_create_texture3d(void) +{ + ULONG refcount, expected_refcount; + D3D11_SUBRESOURCE_DATA data = {0}; + ID3D11Device *device, *tmp; + D3D11_TEXTURE3D_DESC desc; + ID3D11Texture3D *texture; + IDXGISurface *surface; + HRESULT hr; + + if (!(device = create_device(NULL))) + { + skip("Failed to create ID3D11Device, skipping tests.\n"); + return; + } + + desc.Width = 64; + desc.Height = 64; + desc.Depth = 64; + desc.MipLevels = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_RENDER_TARGET; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + hr = ID3D11Device_CreateTexture3D(device, &desc, &data, &texture); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + + expected_refcount = get_refcount((IUnknown *)device) + 1; + hr = ID3D11Device_CreateTexture3D(device, &desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 3d texture, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)device); + ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n", refcount, expected_refcount); + tmp = NULL; + expected_refcount = refcount + 1; + ID3D11Texture3D_GetDevice(texture, &tmp); + ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device); + refcount = get_refcount((IUnknown *)device); + ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); + ID3D11Device_Release(tmp); + + hr = ID3D11Texture3D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(FAILED(hr), "Texture should not implement IDXGISurface.\n"); + ID3D11Texture3D_Release(texture); + + desc.MipLevels = 0; + expected_refcount = get_refcount((IUnknown *)device) + 1; + hr = ID3D11Device_CreateTexture3D(device, &desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 3d texture, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)device); + ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n", refcount, expected_refcount); + tmp = NULL; + expected_refcount = refcount + 1; + ID3D11Texture3D_GetDevice(texture, &tmp); + ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device); + refcount = get_refcount((IUnknown *)device); + ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); + ID3D11Device_Release(tmp); + + ID3D11Texture3D_GetDesc(texture, &desc); + ok(desc.Width == 64, "Got unexpected Width %u.\n", desc.Width); + ok(desc.Height == 64, "Got unexpected Height %u.\n", desc.Height); + ok(desc.Depth == 64, "Got unexpected Depth %u.\n", desc.Depth); + ok(desc.MipLevels == 7, "Got unexpected MipLevels %u.\n", desc.MipLevels); + ok(desc.Format == DXGI_FORMAT_R8G8B8A8_UNORM, "Got unexpected Format %#x.\n", desc.Format); + ok(desc.Usage == D3D11_USAGE_DEFAULT, "Got unexpected Usage %u.\n", desc.Usage); + ok(desc.BindFlags == D3D11_BIND_RENDER_TARGET, "Got unexpected BindFlags %u.\n", desc.BindFlags); + ok(desc.CPUAccessFlags == 0, "Got unexpected CPUAccessFlags %u.\n", desc.CPUAccessFlags); + ok(desc.MiscFlags == 0, "Got unexpected MiscFlags %u.\n", desc.MiscFlags); + + hr = ID3D11Texture3D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(FAILED(hr), "Texture should not implement IDXGISurface.\n"); + ID3D11Texture3D_Release(texture); + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(d3d11) { test_create_device(); test_device_interfaces(); test_create_texture2d(); test_texture2d_interfaces(); + test_create_texture3d(); } From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Zhenbo Li : shell32: Fix return type for helper functions of SHFileOption. Message-ID: Module: wine Branch: master Commit: 637bcd5de91bb1265b58c41af660749cc4d66994 URL: http://source.winehq.org/git/wine.git/?a=commit;h=637bcd5de91bb1265b58c41af660749cc4d66994 Author: Zhenbo Li Date: Mon Aug 31 21:07:32 2015 +0800 shell32: Fix return type for helper functions of SHFileOption. --- dlls/shell32/shlfileop.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c index 0b096b1..c843dd7 100644 --- a/dlls/shell32/shlfileop.c +++ b/dlls/shell32/shlfileop.c @@ -1180,7 +1180,7 @@ static void create_dest_dirs(LPCWSTR szDestDir) } /* the FO_COPY operation */ -static DWORD copy_files(FILE_OPERATION *op, const FILE_LIST *flFrom, FILE_LIST *flTo) +static int copy_files(FILE_OPERATION *op, const FILE_LIST *flFrom, FILE_LIST *flTo) { DWORD i; const FILE_ENTRY *entryToCopy; @@ -1328,10 +1328,11 @@ static BOOL confirm_delete_list(HWND hWnd, DWORD fFlags, BOOL fTrash, const FILE } /* the FO_DELETE operation */ -static DWORD delete_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom) +static int delete_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom) { const FILE_ENTRY *fileEntry; - DWORD i, ret; + DWORD i; + int ret; BOOL bTrash; if (!flFrom->dwNumFiles) @@ -1399,7 +1400,7 @@ static void move_to_dir(LPSHFILEOPSTRUCTW lpFileOp, const FILE_ENTRY *feFrom, co } /* the FO_MOVE operation */ -static DWORD move_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom, const FILE_LIST *flTo) +static int move_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom, const FILE_LIST *flTo) { DWORD i; INT mismatched = 0; @@ -1470,7 +1471,7 @@ static DWORD move_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom, con } /* the FO_RENAME files */ -static DWORD rename_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom, const FILE_LIST *flTo) +static int rename_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom, const FILE_LIST *flTo) { const FILE_ENTRY *feFrom; const FILE_ENTRY *feTo; From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Thomas Faber : netapi32: Correctly reallocate buffer in NetWkstaUserGetInfo. Message-ID: Module: wine Branch: master Commit: 7164fde439211b0b9c66e15cb9db4af41d815d4e URL: http://source.winehq.org/git/wine.git/?a=commit;h=7164fde439211b0b9c66e15cb9db4af41d815d4e Author: Thomas Faber Date: Mon Aug 31 20:31:26 2015 +0200 netapi32: Correctly reallocate buffer in NetWkstaUserGetInfo. --- dlls/netapi32/netapi32.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c index 785a8d6..d7af2e0 100644 --- a/dlls/netapi32/netapi32.c +++ b/dlls/netapi32/netapi32.c @@ -1627,7 +1627,12 @@ NET_API_STATUS WINAPI NetWkstaUserGetInfo(LMSTR reserved, DWORD level, (lstrlenW(ui->wkui0_username) + 1) * sizeof(WCHAR), (LPVOID *) bufptr); if (nastatus != NERR_Success) + { + NetApiBufferFree(ui); return nastatus; + } + ui = (PWKSTA_USER_INFO_0) *bufptr; + ui->wkui0_username = (LMSTR) (*bufptr + sizeof(WKSTA_USER_INFO_0)); } break; } From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Gerald Pfeifer : quartz: Replace four occurrences of 1 << 31 by 1u << 31 to avoid shift overflow. Message-ID: Module: wine Branch: master Commit: 2127f72f79ea3be59bddf369427b4e448e31f9b7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2127f72f79ea3be59bddf369427b4e448e31f9b7 Author: Gerald Pfeifer Date: Mon Aug 31 18:05:57 2015 +0200 quartz: Replace four occurrences of 1 << 31 by 1u << 31 to avoid shift overflow. --- dlls/quartz/avisplit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index ccb4cec..6059511 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -203,7 +203,7 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe ++stream->index_next; } - rtSampleStop = rtSampleStart + MEDIATIME_FROM_BYTES(entry->dwSize & ~(1 << 31)); + rtSampleStop = rtSampleStart + MEDIATIME_FROM_BYTES(entry->dwSize & ~(1u << 31)); TRACE("offset(%u) size(%u)\n", (DWORD)BYTES_FROM_MEDIATIME(rtSampleStart), (DWORD)BYTES_FROM_MEDIATIME(rtSampleStop - rtSampleStart)); } @@ -596,7 +596,7 @@ static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, AVISTDINDEX **ind BOOL keyframe = !(pIndex->aIndex[x].dwSize >> 31); DWORDLONG offset = pIndex->qwBaseOffset + pIndex->aIndex[x].dwOffset; TRACE("dwOffset: %x%08x\n", (DWORD)(offset >> 32), (DWORD)offset); - TRACE("dwSize: %u\n", (pIndex->aIndex[x].dwSize & ~(1<<31))); + TRACE("dwSize: %u\n", (pIndex->aIndex[x].dwSize & ~(1u << 31))); TRACE("Frame is a keyframe: %s\n", keyframe ? "yes" : "no"); } @@ -994,7 +994,7 @@ static HRESULT AVISplitter_InitializeStreams(AVISplitterImpl *This) for (z = 0; z < stream->stdindex[y]->nEntriesInUse; ++z) { - UINT len = stream->stdindex[y]->aIndex[z].dwSize & ~(1 << 31); + UINT len = stream->stdindex[y]->aIndex[z].dwSize & ~(1u << 31); frames += len / stream->streamheader.dwSampleSize + !!(len % stream->streamheader.dwSampleSize); } } @@ -1342,7 +1342,7 @@ static HRESULT WINAPI AVISplitter_seek(IMediaSeeking *iface) { if (stream->streamheader.dwSampleSize) { - ULONG len = stream->stdindex[y]->aIndex[z].dwSize & ~(1 << 31); + ULONG len = stream->stdindex[y]->aIndex[z].dwSize & ~(1u << 31); ULONG size = stream->streamheader.dwSampleSize; pin->dwSamplesProcessed += len / size; From julliard at wine.codeweavers.com Tue Sep 1 08:56:04 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 01 Sep 2015 08:56:04 -0500 Subject: Alistair Leslie-Hughes : gdi32/tests: Add enhanced metafile GetPath test. Message-ID: Module: wine Branch: master Commit: 8348c0ebe00752af2afbabc78315f9e07e43ee09 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8348c0ebe00752af2afbabc78315f9e07e43ee09 Author: Alistair Leslie-Hughes Date: Tue Sep 1 14:00:56 2015 +1000 gdi32/tests: Add enhanced metafile GetPath test. --- dlls/gdi32/tests/metafile.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c index 1b0d34b..6804a96 100644 --- a/dlls/gdi32/tests/metafile.c +++ b/dlls/gdi32/tests/metafile.c @@ -3361,6 +3361,39 @@ static void test_emf_polybezier(void) DeleteEnhMetaFile(hemf); } +static void test_emf_GetPath(void) +{ + HDC hdcMetafile; + HENHMETAFILE hemf; + BOOL ret; + int size; + + SetLastError(0xdeadbeef); + hdcMetafile = CreateEnhMetaFileA(GetDC(0), NULL, NULL, NULL); + ok(hdcMetafile != 0, "CreateEnhMetaFileA error %d\n", GetLastError()); + + BeginPath(hdcMetafile); + ret = MoveToEx(hdcMetafile, 50, 50, NULL); + ok( ret, "MoveToEx error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 50, 150); + ok( ret, "LineTo error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 150, 150); + ok( ret, "LineTo error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 150, 50); + ok( ret, "LineTo error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 50, 50); + ok( ret, "LineTo error %d.\n", GetLastError()); + EndPath(hdcMetafile); + + size = GetPath(hdcMetafile, NULL, NULL, 0); + todo_wine ok( size == 5, "GetPath returned %d.\n", size); + + hemf = CloseEnhMetaFile(hdcMetafile); + ok(hemf != 0, "CloseEnhMetaFile error %d\n", GetLastError()); + + DeleteEnhMetaFile(hemf); +} + START_TEST(metafile) { init_function_pointers(); @@ -3374,6 +3407,7 @@ START_TEST(metafile) test_emf_ExtTextOut_on_path(); test_emf_clipping(); test_emf_polybezier(); + test_emf_GetPath(); /* For win-format metafiles (mfdrv) */ test_mf_SaveDC(); From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Thomas Faller : msxml3: Fix invalid read. Message-ID: Module: wine Branch: master Commit: f259ba33bb4b7f2a4a0bbf70063c4bef3d605709 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f259ba33bb4b7f2a4a0bbf70063c4bef3d605709 Author: Thomas Faller Date: Tue Sep 1 14:25:51 2015 +0200 msxml3: Fix invalid read. --- dlls/msxml3/saxreader.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 3b5bd7c..2b087bc 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -690,12 +690,13 @@ static void format_error_message_from_id(saxlocator *This, HRESULT hr) static void update_position(saxlocator *This, BOOL fix_column) { const xmlChar *p = This->pParserCtxt->input->cur-1; + const xmlChar *baseP = This->pParserCtxt->input->base; This->line = xmlSAX2GetLineNumber(This->pParserCtxt); if(fix_column) { This->column = 1; - for(; *p!='\n' && *p!='\r' && p>=This->pParserCtxt->input->base; p--) + for(;p>=baseP && *p!='\n' && *p!='\r'; p--) This->column++; } else From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Sebastian Lackner : include: Fix copy and paste errors in wine_dbgstr_vt. Message-ID: Module: wine Branch: master Commit: 615ef9855561200678e541ec43d8afac026810ad URL: http://source.winehq.org/git/wine.git/?a=commit;h=615ef9855561200678e541ec43d8afac026810ad Author: Sebastian Lackner Date: Tue Sep 1 14:59:38 2015 +0200 include: Fix copy and paste errors in wine_dbgstr_vt. --- include/wine/debug.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/wine/debug.h b/include/wine/debug.h index 95d74d3..241e79b 100644 --- a/include/wine/debug.h +++ b/include/wine/debug.h @@ -244,7 +244,7 @@ static inline const char *wine_dbgstr_vt( VARTYPE vt ) "|VT_ARRAY", "|VT_VECTOR|VT_ARRAY", "|VT_BYREF", - "|VT_VECTOR|VT_ARRAY", + "|VT_VECTOR|VT_BYREF", "|VT_ARRAY|VT_BYREF", "|VT_VECTOR|VT_ARRAY|VT_BYREF", "|VT_RESERVED", @@ -252,7 +252,7 @@ static inline const char *wine_dbgstr_vt( VARTYPE vt ) "|VT_ARRAY|VT_RESERVED", "|VT_VECTOR|VT_ARRAY|VT_RESERVED", "|VT_BYREF|VT_RESERVED", - "|VT_VECTOR|VT_ARRAY|VT_RESERVED", + "|VT_VECTOR|VT_BYREF|VT_RESERVED", "|VT_ARRAY|VT_BYREF|VT_RESERVED", "|VT_VECTOR|VT_ARRAY|VT_BYREF|VT_RESERVED", }; From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Thomas Faber : kernel32/tests: Run test_thread_fpu_cw on x86 MSVC builds. Message-ID: Module: wine Branch: master Commit: 9165dbbffcffc959e148be633d2b4693cec006b2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9165dbbffcffc959e148be633d2b4693cec006b2 Author: Thomas Faber Date: Tue Sep 1 16:14:54 2015 +0200 kernel32/tests: Run test_thread_fpu_cw on x86 MSVC builds. --- dlls/kernel32/tests/thread.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index 2e1614c..d0fbfa4 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -1408,16 +1408,25 @@ static void test_ThreadErrorMode(void) pSetThreadErrorMode(oldmode, NULL); } -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#if (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) || (defined(_MSC_VER) && defined(__i386__)) static inline void set_fpu_cw(WORD cw) { +#ifdef _MSC_VER + __asm { fnclex } + __asm { fldcw [cw] } +#else __asm__ volatile ("fnclex; fldcw %0" : : "m" (cw)); +#endif } static inline WORD get_fpu_cw(void) { WORD cw = 0; +#ifdef _MSC_VER + __asm { fnstcw [cw] } +#else __asm__ volatile ("fnstcw %0" : "=m" (cw)); +#endif return cw; } @@ -1888,7 +1897,7 @@ START_TEST(thread) test_RegisterWaitForSingleObject(); test_TLS(); test_ThreadErrorMode(); -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#if (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) || (defined(_MSC_VER) && defined(__i386__)) test_thread_fpu_cw(); #endif test_thread_actctx(); From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hugh McMaster : regsvr32: /n and /u /n should be handled as invalid flags. Message-ID: Module: wine Branch: master Commit: b09e98da785a1da44f5a74a2ce426baa62d74ae2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b09e98da785a1da44f5a74a2ce426baa62d74ae2 Author: Hugh McMaster Date: Wed Sep 2 15:32:07 2015 +1000 regsvr32: /n and /u /n should be handled as invalid flags. --- programs/regsvr32/regsvr32.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index 8d1ab17..f75825b 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -272,6 +272,9 @@ int wmain(int argc, WCHAR* argv[]) } } + if (!CallInstall && !CallRegister) /* flags: /n or /u /n */ + return 1; + for (i = 1; i < argc; i++) { if (argv[i]) From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Add a stub implementation of INetwork. Message-ID: Module: wine Branch: master Commit: 6defcbe3d9fc641e38908adac563540494f1b084 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6defcbe3d9fc641e38908adac563540494f1b084 Author: Hans Leidekker Date: Wed Sep 2 10:42:08 2015 +0200 netprofm: Add a stub implementation of INetwork. --- dlls/netprofm/list.c | 292 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index b39856d..6afe13e 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -51,6 +51,16 @@ static inline BOOL heap_free( void *mem ) return HeapFree( GetProcessHeap(), 0, mem ); } +struct network +{ + INetwork INetwork_iface; + LONG refs; + struct list entry; + GUID id; + VARIANT_BOOL connected_to_internet; + VARIANT_BOOL connected; +}; + struct connection { INetworkConnection INetworkConnection_iface; @@ -67,6 +77,7 @@ struct list_manager INetworkCostManager INetworkCostManager_iface; IConnectionPointContainer IConnectionPointContainer_iface; LONG refs; + struct list networks; struct list connections; }; @@ -235,6 +246,271 @@ static HRESULT connection_point_create( return S_OK; } +static inline struct network *impl_from_INetwork( + INetwork *iface ) +{ + return CONTAINING_RECORD( iface, struct network, INetwork_iface ); +} + +static HRESULT WINAPI network_QueryInterface( + INetwork *iface, REFIID riid, void **obj ) +{ + struct network *network = impl_from_INetwork( iface ); + + TRACE( "%p, %s, %p\n", network, debugstr_guid(riid), obj ); + + if (IsEqualIID( riid, &IID_INetwork ) || + IsEqualIID( riid, &IID_IDispatch ) || + IsEqualIID( riid, &IID_IUnknown )) + { + *obj = iface; + INetwork_AddRef( iface ); + return S_OK; + } + else + { + WARN( "interface not supported %s\n", debugstr_guid(riid) ); + *obj = NULL; + return E_NOINTERFACE; + } +} + +static ULONG WINAPI network_AddRef( + INetwork *iface ) +{ + struct network *network = impl_from_INetwork( iface ); + + TRACE( "%p\n", network ); + return InterlockedIncrement( &network->refs ); +} + +static ULONG WINAPI network_Release( + INetwork *iface ) +{ + struct network *network = impl_from_INetwork( iface ); + LONG refs; + + TRACE( "%p\n", network ); + + if (!(refs = InterlockedDecrement( &network->refs ))) + { + list_remove( &network->entry ); + heap_free( network ); + } + return refs; +} + +static HRESULT WINAPI network_GetTypeInfoCount( + INetwork *iface, + UINT *count ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_GetTypeInfo( + INetwork *iface, + UINT index, + LCID lcid, + ITypeInfo **info ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_GetIDsOfNames( + INetwork *iface, + REFIID riid, + LPOLESTR *names, + UINT count, + LCID lcid, + DISPID *dispid ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_Invoke( + INetwork *iface, + DISPID member, + REFIID riid, + LCID lcid, + WORD flags, + DISPPARAMS *params, + VARIANT *result, + EXCEPINFO *excep_info, + UINT *arg_err ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_GetName( + INetwork *iface, + BSTR *pszNetworkName ) +{ + FIXME( "%p, %p\n", iface, pszNetworkName ); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_SetName( + INetwork *iface, + BSTR szNetworkNewName ) +{ + FIXME( "%p, %s\n", iface, debugstr_w(szNetworkNewName) ); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_GetDescription( + INetwork *iface, + BSTR *pszDescription ) +{ + FIXME( "%p, %p\n", iface, pszDescription ); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_SetDescription( + INetwork *iface, + BSTR szDescription ) +{ + FIXME( "%p, %s\n", iface, debugstr_w(szDescription) ); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_GetNetworkId( + INetwork *iface, + GUID *pgdGuidNetworkId ) +{ + struct network *network = impl_from_INetwork( iface ); + + TRACE( "%p, %p\n", iface, pgdGuidNetworkId ); + + *pgdGuidNetworkId = network->id; + return S_OK; +} + +static HRESULT WINAPI network_GetDomainType( + INetwork *iface, + NLM_DOMAIN_TYPE *pDomainType ) +{ + FIXME( "%p, %p\n", iface, pDomainType ); + + *pDomainType = NLM_DOMAIN_TYPE_NON_DOMAIN_NETWORK; + return S_OK; +} + +static HRESULT WINAPI network_GetNetworkConnections( + INetwork *iface, + IEnumNetworkConnections **ppEnumNetworkConnection ) +{ + FIXME( "%p, %p\n", iface, ppEnumNetworkConnection ); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_GetTimeCreatedAndConnected( + INetwork *iface, + DWORD *pdwLowDateTimeCreated, + DWORD *pdwHighDateTimeCreated, + DWORD *pdwLowDateTimeConnected, + DWORD *pdwHighDateTimeConnected ) +{ + FIXME( "%p, %p, %p, %p, %p\n", iface, pdwLowDateTimeCreated, pdwHighDateTimeCreated, + pdwLowDateTimeConnected, pdwHighDateTimeConnected ); + return E_NOTIMPL; +} + +static HRESULT WINAPI network_get_IsConnectedToInternet( + INetwork *iface, + VARIANT_BOOL *pbIsConnected ) +{ + struct network *network = impl_from_INetwork( iface ); + + TRACE( "%p, %p\n", iface, pbIsConnected ); + + *pbIsConnected = network->connected_to_internet; + return S_OK; +} + +static HRESULT WINAPI network_get_IsConnected( + INetwork *iface, + VARIANT_BOOL *pbIsConnected ) +{ + struct network *network = impl_from_INetwork( iface ); + + TRACE( "%p, %p\n", iface, pbIsConnected ); + + *pbIsConnected = network->connected; + return S_OK; +} + +static HRESULT WINAPI network_GetConnectivity( + INetwork *iface, + NLM_CONNECTIVITY *pConnectivity ) +{ + FIXME( "%p, %p\n", iface, pConnectivity ); + + *pConnectivity = NLM_CONNECTIVITY_IPV4_INTERNET; + return S_OK; +} + +static HRESULT WINAPI network_GetCategory( + INetwork *iface, + NLM_NETWORK_CATEGORY *pCategory ) +{ + FIXME( "%p, %p\n", iface, pCategory ); + + *pCategory = NLM_NETWORK_CATEGORY_PUBLIC; + return S_OK; +} + +static HRESULT WINAPI network_SetCategory( + INetwork *iface, + NLM_NETWORK_CATEGORY NewCategory ) +{ + FIXME( "%p, %u\n", iface, NewCategory ); + return E_NOTIMPL; +} + +static const struct INetworkVtbl network_vtbl = +{ + network_QueryInterface, + network_AddRef, + network_Release, + network_GetTypeInfoCount, + network_GetTypeInfo, + network_GetIDsOfNames, + network_Invoke, + network_GetName, + network_SetName, + network_GetDescription, + network_SetDescription, + network_GetNetworkId, + network_GetDomainType, + network_GetNetworkConnections, + network_GetTimeCreatedAndConnected, + network_get_IsConnectedToInternet, + network_get_IsConnected, + network_GetConnectivity, + network_GetCategory, + network_SetCategory +}; + +static struct network *create_network( const GUID *id ) +{ + struct network *ret; + + if (!(ret = heap_alloc( sizeof(*ret) ))) return NULL; + + ret->INetwork_iface.lpVtbl = &network_vtbl; + ret->refs = 1; + ret->id = *id; + ret->connected = VARIANT_FALSE; + ret->connected_to_internet = VARIANT_FALSE; + list_init( &ret->entry ); + + return ret; +} + static HRESULT WINAPI cost_manager_QueryInterface( INetworkCostManager *iface, REFIID riid, @@ -374,6 +650,12 @@ static ULONG WINAPI list_manager_Release( TRACE( "destroying %p\n", mgr ); + while ((ptr = list_head( &mgr->networks ))) + { + struct network *network = LIST_ENTRY( ptr, struct network, entry ); + list_remove( &network->entry ); + INetwork_Release( &network->INetwork_iface ); + } while ((ptr = list_head( &mgr->connections ))) { struct connection *connection = LIST_ENTRY( ptr, struct connection, entry ); @@ -821,6 +1103,7 @@ static void init_networks( struct list_manager *mgr ) ULONG ret, flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_ALL_GATEWAYS; + list_init( &mgr->networks ); list_init( &mgr->connections ); ret = GetAdaptersAddresses( WS_AF_UNSPEC, flags, NULL, NULL, &size ); @@ -832,22 +1115,31 @@ static void init_networks( struct list_manager *mgr ) memset( &id, 0, sizeof(id) ); for (aa = buf; aa; aa = aa->Next) { + struct network *network; struct connection *connection; id.Data1 = aa->IfIndex; + /* assume a one-to-one mapping between networks and connections */ + if (!(network = create_network( &id ))) goto done; if (!(connection = create_connection( &id ))) + { + INetwork_Release( &network->INetwork_iface ); goto done; + } if (aa->FirstUnicastAddress) { + network->connected = VARIANT_TRUE; connection->connected = VARIANT_TRUE; } if (aa->FirstGatewayAddress) { + network->connected_to_internet = VARIANT_TRUE; connection->connected_to_internet = VARIANT_TRUE; } + list_add_tail( &mgr->networks, &network->entry ); list_add_tail( &mgr->connections, &connection->entry ); } From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Implement INetworkConnection::GetNetwork. Message-ID: Module: wine Branch: master Commit: 91835d94e9ee5cfc1e29f7354cd331f19d6c3788 URL: http://source.winehq.org/git/wine.git/?a=commit;h=91835d94e9ee5cfc1e29f7354cd331f19d6c3788 Author: Hans Leidekker Date: Wed Sep 2 10:42:29 2015 +0200 netprofm: Implement INetworkConnection::GetNetwork. --- dlls/netprofm/list.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index 6afe13e..0aaeff8 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -67,6 +67,7 @@ struct connection LONG refs; struct list entry; GUID id; + INetwork *network; VARIANT_BOOL connected_to_internet; VARIANT_BOOL connected; }; @@ -934,6 +935,7 @@ static ULONG WINAPI connection_Release( if (!(refs = InterlockedDecrement( &connection->refs ))) { + INetwork_Release( connection->network ); list_remove( &connection->entry ); heap_free( connection ); } @@ -989,8 +991,13 @@ static HRESULT WINAPI connection_GetNetwork( INetworkConnection *iface, INetwork **ppNetwork ) { - FIXME( "%p, %p\n", iface, ppNetwork ); - return E_NOTIMPL; + struct connection *connection = impl_from_INetworkConnection( iface ); + + TRACE( "%p, %p\n", iface, ppNetwork ); + + *ppNetwork = connection->network; + INetwork_AddRef( *ppNetwork ); + return S_OK; } static HRESULT WINAPI connection_get_IsConnectedToInternet( @@ -1088,6 +1095,7 @@ static struct connection *create_connection( const GUID *id ) ret->INetworkConnection_iface.lpVtbl = &connection_vtbl; ret->refs = 1; ret->id = *id; + ret->network = NULL; ret->connected = VARIANT_FALSE; ret->connected_to_internet = VARIANT_FALSE; list_init( &ret->entry ); @@ -1139,6 +1147,9 @@ static void init_networks( struct list_manager *mgr ) connection->connected_to_internet = VARIANT_TRUE; } + connection->network = &network->INetwork_iface; + INetwork_AddRef( connection->network ); + list_add_tail( &mgr->networks, &network->entry ); list_add_tail( &mgr->connections, &connection->entry ); } From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Add a stub implementation of INetworkConnectionCost. Message-ID: Module: wine Branch: master Commit: 4cbf0882477de6edf1cfbe1b8400368a35846a5f URL: http://source.winehq.org/git/wine.git/?a=commit;h=4cbf0882477de6edf1cfbe1b8400368a35846a5f Author: Hans Leidekker Date: Wed Sep 2 10:42:49 2015 +0200 netprofm: Add a stub implementation of INetworkConnectionCost. --- dlls/netprofm/list.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index 0aaeff8..3909cf2 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -64,6 +64,7 @@ struct network struct connection { INetworkConnection INetworkConnection_iface; + INetworkConnectionCost INetworkConnectionCost_iface; LONG refs; struct list entry; GUID id; @@ -906,6 +907,10 @@ static HRESULT WINAPI connection_QueryInterface( { *obj = iface; } + else if (IsEqualIID( riid, &IID_INetworkConnectionCost )) + { + *obj = &connection->INetworkConnectionCost_iface; + } else { WARN( "interface not supported %s\n", debugstr_guid(riid) ); @@ -1086,6 +1091,77 @@ static const struct INetworkConnectionVtbl connection_vtbl = connection_GetDomainType }; +static inline struct connection *impl_from_INetworkConnectionCost( + INetworkConnectionCost *iface ) +{ + return CONTAINING_RECORD( iface, struct connection, INetworkConnectionCost_iface ); +} + +static HRESULT WINAPI connection_cost_QueryInterface( + INetworkConnectionCost *iface, + REFIID riid, + void **obj ) +{ + struct connection *conn = impl_from_INetworkConnectionCost( iface ); + return INetworkConnection_QueryInterface( &conn->INetworkConnection_iface, riid, obj ); +} + +static ULONG WINAPI connection_cost_AddRef( + INetworkConnectionCost *iface ) +{ + struct connection *conn = impl_from_INetworkConnectionCost( iface ); + return INetworkConnection_AddRef( &conn->INetworkConnection_iface ); +} + +static ULONG WINAPI connection_cost_Release( + INetworkConnectionCost *iface ) +{ + struct connection *conn = impl_from_INetworkConnectionCost( iface ); + return INetworkConnection_Release( &conn->INetworkConnection_iface ); +} + +static HRESULT WINAPI connection_cost_GetCost( + INetworkConnectionCost *iface, DWORD *pCost ) +{ + FIXME( "%p, %p\n", iface, pCost ); + + if (!pCost) return E_POINTER; + + *pCost = NLM_CONNECTION_COST_UNRESTRICTED; + return S_OK; +} + +static HRESULT WINAPI connection_cost_GetDataPlanStatus( + INetworkConnectionCost *iface, NLM_DATAPLAN_STATUS *pDataPlanStatus ) +{ + struct connection *conn = impl_from_INetworkConnectionCost( iface ); + + FIXME( "%p, %p\n", iface, pDataPlanStatus ); + + if (!pDataPlanStatus) return E_POINTER; + + memcpy( &pDataPlanStatus->InterfaceGuid, &conn->id, sizeof(conn->id) ); + pDataPlanStatus->UsageData.UsageInMegabytes = NLM_UNKNOWN_DATAPLAN_STATUS; + memset( &pDataPlanStatus->UsageData.LastSyncTime, 0, sizeof(pDataPlanStatus->UsageData.LastSyncTime) ); + pDataPlanStatus->DataLimitInMegabytes = NLM_UNKNOWN_DATAPLAN_STATUS; + pDataPlanStatus->InboundBandwidthInKbps = NLM_UNKNOWN_DATAPLAN_STATUS; + pDataPlanStatus->OutboundBandwidthInKbps = NLM_UNKNOWN_DATAPLAN_STATUS; + memset( &pDataPlanStatus->NextBillingCycle, 0, sizeof(pDataPlanStatus->NextBillingCycle) ); + pDataPlanStatus->MaxTransferSizeInMegabytes = NLM_UNKNOWN_DATAPLAN_STATUS; + pDataPlanStatus->Reserved = 0; + + return S_OK; +} + +static const INetworkConnectionCostVtbl connection_cost_vtbl = +{ + connection_cost_QueryInterface, + connection_cost_AddRef, + connection_cost_Release, + connection_cost_GetCost, + connection_cost_GetDataPlanStatus +}; + static struct connection *create_connection( const GUID *id ) { struct connection *ret; @@ -1093,6 +1169,7 @@ static struct connection *create_connection( const GUID *id ) if (!(ret = heap_alloc( sizeof(*ret) ))) return NULL; ret->INetworkConnection_iface.lpVtbl = &connection_vtbl; + ret->INetworkConnectionCost_iface.lpVtbl = &connection_cost_vtbl; ret->refs = 1; ret->id = *id; ret->network = NULL; From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Implement IEnumNetworks. Message-ID: Module: wine Branch: master Commit: 861cd5a3a7062e197ac636e2f17f327996a99608 URL: http://source.winehq.org/git/wine.git/?a=commit;h=861cd5a3a7062e197ac636e2f17f327996a99608 Author: Hans Leidekker Date: Wed Sep 2 10:43:09 2015 +0200 netprofm: Implement IEnumNetworks. --- dlls/netprofm/list.c | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 220 insertions(+), 2 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index 3909cf2..42f361f 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -628,6 +628,220 @@ static const INetworkCostManagerVtbl cost_manager_vtbl = cost_manager_SetDestinationAddresses }; +struct networks_enum +{ + IEnumNetworks IEnumNetworks_iface; + LONG refs; + struct list_manager *mgr; + struct list *cursor; +}; + +static inline struct networks_enum *impl_from_IEnumNetworks( + IEnumNetworks *iface ) +{ + return CONTAINING_RECORD( iface, struct networks_enum, IEnumNetworks_iface ); +} + +static HRESULT WINAPI networks_enum_QueryInterface( + IEnumNetworks *iface, REFIID riid, void **obj ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + + TRACE( "%p, %s, %p\n", iter, debugstr_guid(riid), obj ); + + if (IsEqualIID( riid, &IID_IEnumNetworks ) || + IsEqualIID( riid, &IID_IDispatch ) || + IsEqualIID( riid, &IID_IUnknown )) + { + *obj = iface; + IEnumNetworks_AddRef( iface ); + return S_OK; + } + else + { + WARN( "interface not supported %s\n", debugstr_guid(riid) ); + *obj = NULL; + return E_NOINTERFACE; + } +} + +static ULONG WINAPI networks_enum_AddRef( + IEnumNetworks *iface ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + + TRACE( "%p\n", iter ); + return InterlockedIncrement( &iter->refs ); +} + +static ULONG WINAPI networks_enum_Release( + IEnumNetworks *iface ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + LONG refs; + + TRACE( "%p\n", iter ); + + if (!(refs = InterlockedDecrement( &iter->refs ))) + { + INetworkListManager_Release( &iter->mgr->INetworkListManager_iface ); + heap_free( iter ); + } + return refs; +} + +static HRESULT WINAPI networks_enum_GetTypeInfoCount( + IEnumNetworks *iface, + UINT *count ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI networks_enum_GetTypeInfo( + IEnumNetworks *iface, + UINT index, + LCID lcid, + ITypeInfo **info ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI networks_enum_GetIDsOfNames( + IEnumNetworks *iface, + REFIID riid, + LPOLESTR *names, + UINT count, + LCID lcid, + DISPID *dispid ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI networks_enum_Invoke( + IEnumNetworks *iface, + DISPID member, + REFIID riid, + LCID lcid, + WORD flags, + DISPPARAMS *params, + VARIANT *result, + EXCEPINFO *excep_info, + UINT *arg_err ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI networks_enum_get__NewEnum( + IEnumNetworks *iface, IEnumVARIANT **ppEnumVar ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI networks_enum_Next( + IEnumNetworks *iface, ULONG count, INetwork **ret, ULONG *fetched ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + ULONG i = 0; + + TRACE( "%p, %u %p %p\n", iter, count, ret, fetched ); + + if (fetched) *fetched = 0; + if (!count) return S_OK; + + while (iter->cursor && i < count) + { + struct network *network = LIST_ENTRY( iter->cursor, struct network, entry ); + ret[i] = &network->INetwork_iface; + INetwork_AddRef( ret[i] ); + iter->cursor = list_next( &iter->mgr->networks, iter->cursor ); + i++; + } + if (fetched) *fetched = i; + + return i < count ? S_FALSE : S_OK; +} + +static HRESULT WINAPI networks_enum_Skip( + IEnumNetworks *iface, ULONG count ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + + TRACE( "%p, %u\n", iter, count); + + if (!count) return S_OK; + if (!iter->cursor) return S_FALSE; + + while (count--) + { + iter->cursor = list_next( &iter->mgr->networks, iter->cursor ); + if (!iter->cursor) break; + } + + return count ? S_FALSE : S_OK; +} + +static HRESULT WINAPI networks_enum_Reset( + IEnumNetworks *iface ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + + TRACE( "%p\n", iter ); + + iter->cursor = list_head( &iter->mgr->networks ); + return S_OK; +} + +static HRESULT create_networks_enum( + struct list_manager *, IEnumNetworks** ); + +static HRESULT WINAPI networks_enum_Clone( + IEnumNetworks *iface, IEnumNetworks **ret ) +{ + struct networks_enum *iter = impl_from_IEnumNetworks( iface ); + + TRACE( "%p, %p\n", iter, ret ); + return create_networks_enum( iter->mgr, ret ); +} + +static const IEnumNetworksVtbl networks_enum_vtbl = +{ + networks_enum_QueryInterface, + networks_enum_AddRef, + networks_enum_Release, + networks_enum_GetTypeInfoCount, + networks_enum_GetTypeInfo, + networks_enum_GetIDsOfNames, + networks_enum_Invoke, + networks_enum_get__NewEnum, + networks_enum_Next, + networks_enum_Skip, + networks_enum_Reset, + networks_enum_Clone +}; + +static HRESULT create_networks_enum( + struct list_manager *mgr, IEnumNetworks **ret ) +{ + struct networks_enum *iter; + + *ret = NULL; + if (!(iter = heap_alloc( sizeof(*iter) ))) return E_OUTOFMEMORY; + + iter->IEnumNetworks_iface.lpVtbl = &networks_enum_vtbl; + iter->cursor = list_head( &mgr->networks ); + iter->mgr = mgr; + INetworkListManager_AddRef( &mgr->INetworkListManager_iface ); + iter->refs = 1; + + *ret = &iter->IEnumNetworks_iface; + return S_OK; +} + static inline struct list_manager *impl_from_INetworkListManager( INetworkListManager *iface ) { @@ -752,8 +966,12 @@ static HRESULT WINAPI list_manager_GetNetworks( NLM_ENUM_NETWORK Flags, IEnumNetworks **ppEnumNetwork ) { - FIXME( "%p, %x, %p\n", iface, Flags, ppEnumNetwork ); - return E_NOTIMPL; + struct list_manager *mgr = impl_from_INetworkListManager( iface ); + + TRACE( "%p, %x, %p\n", iface, Flags, ppEnumNetwork ); + if (Flags) FIXME( "flags %08x not supported\n", Flags ); + + return create_networks_enum( mgr, ppEnumNetwork ); } static HRESULT WINAPI list_manager_GetNetwork( From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Implement IEnumNetworkConnections. Message-ID: Module: wine Branch: master Commit: fd557984fb9bff7392c0bbc9f18a9d9fd1798904 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd557984fb9bff7392c0bbc9f18a9d9fd1798904 Author: Hans Leidekker Date: Wed Sep 2 10:43:30 2015 +0200 netprofm: Implement IEnumNetworkConnections. --- dlls/netprofm/list.c | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 218 insertions(+), 2 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index 42f361f..d3b536d 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -848,6 +848,220 @@ static inline struct list_manager *impl_from_INetworkListManager( return CONTAINING_RECORD( iface, struct list_manager, INetworkListManager_iface ); } +struct connections_enum +{ + IEnumNetworkConnections IEnumNetworkConnections_iface; + LONG refs; + struct list_manager *mgr; + struct list *cursor; +}; + +static inline struct connections_enum *impl_from_IEnumNetworkConnections( + IEnumNetworkConnections *iface ) +{ + return CONTAINING_RECORD( iface, struct connections_enum, IEnumNetworkConnections_iface ); +} + +static HRESULT WINAPI connections_enum_QueryInterface( + IEnumNetworkConnections *iface, REFIID riid, void **obj ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + + TRACE( "%p, %s, %p\n", iter, debugstr_guid(riid), obj ); + + if (IsEqualIID( riid, &IID_IEnumNetworkConnections ) || + IsEqualIID( riid, &IID_IDispatch ) || + IsEqualIID( riid, &IID_IUnknown )) + { + *obj = iface; + IEnumNetworkConnections_AddRef( iface ); + return S_OK; + } + else + { + WARN( "interface not supported %s\n", debugstr_guid(riid) ); + *obj = NULL; + return E_NOINTERFACE; + } +} + +static ULONG WINAPI connections_enum_AddRef( + IEnumNetworkConnections *iface ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + + TRACE( "%p\n", iter ); + return InterlockedIncrement( &iter->refs ); +} + +static ULONG WINAPI connections_enum_Release( + IEnumNetworkConnections *iface ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + LONG refs; + + TRACE( "%p\n", iter ); + + if (!(refs = InterlockedDecrement( &iter->refs ))) + { + INetworkListManager_Release( &iter->mgr->INetworkListManager_iface ); + heap_free( iter ); + } + return refs; +} + +static HRESULT WINAPI connections_enum_GetTypeInfoCount( + IEnumNetworkConnections *iface, + UINT *count ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI connections_enum_GetTypeInfo( + IEnumNetworkConnections *iface, + UINT index, + LCID lcid, + ITypeInfo **info ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI connections_enum_GetIDsOfNames( + IEnumNetworkConnections *iface, + REFIID riid, + LPOLESTR *names, + UINT count, + LCID lcid, + DISPID *dispid ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI connections_enum_Invoke( + IEnumNetworkConnections *iface, + DISPID member, + REFIID riid, + LCID lcid, + WORD flags, + DISPPARAMS *params, + VARIANT *result, + EXCEPINFO *excep_info, + UINT *arg_err ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI connections_enum_get__NewEnum( + IEnumNetworkConnections *iface, IEnumVARIANT **ppEnumVar ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI connections_enum_Next( + IEnumNetworkConnections *iface, ULONG count, INetworkConnection **ret, ULONG *fetched ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + ULONG i = 0; + + TRACE( "%p, %u %p %p\n", iter, count, ret, fetched ); + + if (fetched) *fetched = 0; + if (!count) return S_OK; + + while (iter->cursor && i < count) + { + struct connection *connection = LIST_ENTRY( iter->cursor, struct connection, entry ); + ret[i] = &connection->INetworkConnection_iface; + INetworkConnection_AddRef( ret[i] ); + iter->cursor = list_next( &iter->mgr->connections, iter->cursor ); + i++; + } + if (fetched) *fetched = i; + + return i < count ? S_FALSE : S_OK; +} + +static HRESULT WINAPI connections_enum_Skip( + IEnumNetworkConnections *iface, ULONG count ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + + TRACE( "%p, %u\n", iter, count); + + if (!count) return S_OK; + if (!iter->cursor) return S_FALSE; + + while (count--) + { + iter->cursor = list_next( &iter->mgr->connections, iter->cursor ); + if (!iter->cursor) break; + } + + return count ? S_FALSE : S_OK; +} + +static HRESULT WINAPI connections_enum_Reset( + IEnumNetworkConnections *iface ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + + TRACE( "%p\n", iter ); + + iter->cursor = list_head( &iter->mgr->connections ); + return S_OK; +} + +static HRESULT create_connections_enum( + struct list_manager *, IEnumNetworkConnections** ); + +static HRESULT WINAPI connections_enum_Clone( + IEnumNetworkConnections *iface, IEnumNetworkConnections **ret ) +{ + struct connections_enum *iter = impl_from_IEnumNetworkConnections( iface ); + + TRACE( "%p, %p\n", iter, ret ); + return create_connections_enum( iter->mgr, ret ); +} + +static const IEnumNetworkConnectionsVtbl connections_enum_vtbl = +{ + connections_enum_QueryInterface, + connections_enum_AddRef, + connections_enum_Release, + connections_enum_GetTypeInfoCount, + connections_enum_GetTypeInfo, + connections_enum_GetIDsOfNames, + connections_enum_Invoke, + connections_enum_get__NewEnum, + connections_enum_Next, + connections_enum_Skip, + connections_enum_Reset, + connections_enum_Clone +}; + +static HRESULT create_connections_enum( + struct list_manager *mgr, IEnumNetworkConnections **ret ) +{ + struct connections_enum *iter; + + *ret = NULL; + if (!(iter = heap_alloc( sizeof(*iter) ))) return E_OUTOFMEMORY; + + iter->IEnumNetworkConnections_iface.lpVtbl = &connections_enum_vtbl; + iter->mgr = mgr; + INetworkListManager_AddRef( &mgr->INetworkListManager_iface ); + iter->cursor = list_head( &iter->mgr->connections ); + iter->refs = 1; + + *ret = &iter->IEnumNetworkConnections_iface; + return S_OK; +} + static ULONG WINAPI list_manager_AddRef( INetworkListManager *iface ) { @@ -987,8 +1201,10 @@ static HRESULT WINAPI list_manager_GetNetworkConnections( INetworkListManager *iface, IEnumNetworkConnections **ppEnum ) { - FIXME( "%p, %p\n", iface, ppEnum ); - return E_NOTIMPL; + struct list_manager *mgr = impl_from_INetworkListManager( iface ); + + TRACE( "%p, %p\n", iface, ppEnum ); + return create_connections_enum( mgr, ppEnum ); } static HRESULT WINAPI list_manager_GetNetworkConnection( From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Implement INetworkListManager::GetNetwork. Message-ID: Module: wine Branch: master Commit: 25886fa827c78d84c2d8629fc7bc0eeabde135e3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=25886fa827c78d84c2d8629fc7bc0eeabde135e3 Author: Hans Leidekker Date: Wed Sep 2 10:43:50 2015 +0200 netprofm: Implement INetworkListManager::GetNetwork. --- dlls/netprofm/list.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index d3b536d..1871bd9 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -1193,8 +1193,22 @@ static HRESULT WINAPI list_manager_GetNetwork( GUID gdNetworkId, INetwork **ppNetwork ) { - FIXME( "%p, %s, %p\n", iface, debugstr_guid(&gdNetworkId), ppNetwork ); - return E_NOTIMPL; + struct list_manager *mgr = impl_from_INetworkListManager( iface ); + struct network *network; + + TRACE( "%p, %s, %p\n", iface, debugstr_guid(&gdNetworkId), ppNetwork ); + + LIST_FOR_EACH_ENTRY( network, &mgr->networks, struct network, entry ) + { + if (IsEqualGUID( &network->id, &gdNetworkId )) + { + *ppNetwork = &network->INetwork_iface; + INetwork_AddRef( *ppNetwork ); + return S_OK; + } + } + + return S_FALSE; } static HRESULT WINAPI list_manager_GetNetworkConnections( From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Implement INetworkListManager:: GetNetworkConnection. Message-ID: Module: wine Branch: master Commit: a0085f70a4cdac8a1943c16cc80b584a5eee269f URL: http://source.winehq.org/git/wine.git/?a=commit;h=a0085f70a4cdac8a1943c16cc80b584a5eee269f Author: Hans Leidekker Date: Wed Sep 2 10:44:11 2015 +0200 netprofm: Implement INetworkListManager::GetNetworkConnection. --- dlls/netprofm/list.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index 1871bd9..e7d8264 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -1226,9 +1226,23 @@ static HRESULT WINAPI list_manager_GetNetworkConnection( GUID gdNetworkConnectionId, INetworkConnection **ppNetworkConnection ) { - FIXME( "%p, %s, %p\n", iface, debugstr_guid(&gdNetworkConnectionId), + struct list_manager *mgr = impl_from_INetworkListManager( iface ); + struct connection *connection; + + TRACE( "%p, %s, %p\n", iface, debugstr_guid(&gdNetworkConnectionId), ppNetworkConnection ); - return E_NOTIMPL; + + LIST_FOR_EACH_ENTRY( connection, &mgr->connections, struct connection, entry ) + { + if (IsEqualGUID( &connection->id, &gdNetworkConnectionId )) + { + *ppNetworkConnection = &connection->INetworkConnection_iface; + INetworkConnection_AddRef( *ppNetworkConnection ); + return S_OK; + } + } + + return S_FALSE; } static HRESULT WINAPI list_manager_IsConnectedToInternet( From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm: Implement INetworkListManager:: IsConnectedToInternet and INetworkListManager::IsConnected. Message-ID: Module: wine Branch: master Commit: c1c434d11521fd7ed79864c69d235e18624fc502 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c1c434d11521fd7ed79864c69d235e18624fc502 Author: Hans Leidekker Date: Wed Sep 2 10:44:34 2015 +0200 netprofm: Implement INetworkListManager::IsConnectedToInternet and INetworkListManager::IsConnected. --- dlls/netprofm/list.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index e7d8264..197ef68 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -1249,9 +1249,21 @@ static HRESULT WINAPI list_manager_IsConnectedToInternet( INetworkListManager *iface, VARIANT_BOOL *pbIsConnected ) { - FIXME( "%p, %p\n", iface, pbIsConnected ); + struct list_manager *mgr = impl_from_INetworkListManager( iface ); + struct network *network; + + TRACE( "%p, %p\n", iface, pbIsConnected ); + + LIST_FOR_EACH_ENTRY( network, &mgr->networks, struct network, entry ) + { + if (network->connected_to_internet) + { + *pbIsConnected = VARIANT_TRUE; + return S_OK; + } + } - *pbIsConnected = VARIANT_TRUE; + *pbIsConnected = VARIANT_FALSE; return S_OK; } @@ -1259,9 +1271,21 @@ static HRESULT WINAPI list_manager_IsConnected( INetworkListManager *iface, VARIANT_BOOL *pbIsConnected ) { - FIXME( "%p, %p\n", iface, pbIsConnected ); + struct list_manager *mgr = impl_from_INetworkListManager( iface ); + struct network *network; + + TRACE( "%p, %p\n", iface, pbIsConnected ); + + LIST_FOR_EACH_ENTRY( network, &mgr->networks, struct network, entry ) + { + if (network->connected) + { + *pbIsConnected = VARIANT_TRUE; + return S_OK; + } + } - *pbIsConnected = VARIANT_TRUE; + *pbIsConnected = VARIANT_FALSE; return S_OK; } From julliard at wine.codeweavers.com Wed Sep 2 10:23:15 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:15 -0500 Subject: Hans Leidekker : netprofm/tests: Add tests. Message-ID: Module: wine Branch: master Commit: d3857726a0c0e323dbb259a8ff928b68b3a0d6e6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d3857726a0c0e323dbb259a8ff928b68b3a0d6e6 Author: Hans Leidekker Date: Wed Sep 2 10:44:59 2015 +0200 netprofm/tests: Add tests. --- dlls/netprofm/tests/Makefile.in | 2 +- dlls/netprofm/tests/list.c | 166 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 165 insertions(+), 3 deletions(-) diff --git a/dlls/netprofm/tests/Makefile.in b/dlls/netprofm/tests/Makefile.in index 45b8809..3b5be5c 100644 --- a/dlls/netprofm/tests/Makefile.in +++ b/dlls/netprofm/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = netprofm.dll -IMPORTS = ole32 +IMPORTS = oleaut32 ole32 C_SRCS = \ list.c diff --git a/dlls/netprofm/tests/list.c b/dlls/netprofm/tests/list.c index 1e1ba82..eb8477c 100644 --- a/dlls/netprofm/tests/list.c +++ b/dlls/netprofm/tests/list.c @@ -25,6 +25,138 @@ #include "netlistmgr.h" #include "wine/test.h" +static void test_INetwork( INetwork *network ) +{ + NLM_NETWORK_CATEGORY category; + NLM_CONNECTIVITY connectivity; + NLM_DOMAIN_TYPE domain_type; + VARIANT_BOOL connected; + GUID id; + BSTR str; + HRESULT hr; + + str = NULL; + hr = INetwork_GetName( network, &str ); + todo_wine ok( hr == S_OK, "got %08x\n", hr ); + todo_wine ok( str != NULL, "str not set\n" ); + if (str) trace( "name %s\n", wine_dbgstr_w(str) ); + SysFreeString( str ); + + str = NULL; + hr = INetwork_GetDescription( network, &str ); + todo_wine ok( hr == S_OK, "got %08x\n", hr ); + todo_wine ok( str != NULL, "str not set\n" ); + if (str) trace( "description %s\n", wine_dbgstr_w(str) ); + SysFreeString( str ); + + memset( &id, 0, sizeof(id) ); + hr = INetwork_GetNetworkId( network, &id ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("network id %s\n", wine_dbgstr_guid(&id)); + + domain_type = 0xdeadbeef; + hr = INetwork_GetDomainType( network, &domain_type ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( domain_type != 0xdeadbeef, "domain_type not set\n" ); + trace( "domain type %08x\n", domain_type ); + + category = 0xdeadbeef; + hr = INetwork_GetCategory( network, &category ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( category != 0xdeadbeef, "category not set\n" ); + trace( "category %08x\n", category ); + + connectivity = 0xdeadbeef; + hr = INetwork_GetConnectivity( network, &connectivity ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( connectivity != 0xdeadbeef, "connectivity not set\n" ); + trace( "connectivity %08x\n", connectivity ); + + connected = 0xdead; + hr = INetwork_get_IsConnected( network, &connected ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("connected %d\n", connected); + + connected = 0xdead; + hr = INetwork_get_IsConnectedToInternet( network, &connected ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("connected to internet %d\n", connected); +} + +static void test_INetworkConnection( INetworkConnection *conn ) +{ + INetwork *network; + INetworkConnectionCost *conn_cost; + NLM_CONNECTIVITY connectivity; + NLM_DOMAIN_TYPE domain_type; + VARIANT_BOOL connected; + GUID id; + HRESULT hr; + + memset( &id, 0, sizeof(id) ); + hr = INetworkConnection_GetAdapterId( conn, &id ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("adapter id %s\n", wine_dbgstr_guid(&id)); + + memset( &id, 0, sizeof(id) ); + hr = INetworkConnection_GetConnectionId( conn, &id ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("connection id %s\n", wine_dbgstr_guid(&id)); + + connectivity = 0xdeadbeef; + hr = INetworkConnection_GetConnectivity( conn, &connectivity ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( connectivity != 0xdeadbeef, "connectivity not set\n" ); + trace( "connectivity %08x\n", connectivity ); + + domain_type = 0xdeadbeef; + hr = INetworkConnection_GetDomainType( conn, &domain_type ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( domain_type != 0xdeadbeef, "domain_type not set\n" ); + trace( "domain type %08x\n", domain_type ); + + connected = 0xdead; + hr = INetworkConnection_get_IsConnected( conn, &connected ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("connected %d\n", connected); + + connected = 0xdead; + hr = INetworkConnection_get_IsConnectedToInternet( conn, &connected ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("connected to internet %d\n", connected); + + network = NULL; + hr = INetworkConnection_GetNetwork( conn, &network ); + ok( hr == S_OK, "got %08x\n", hr ); + if (network) + { + test_INetwork( network ); + INetwork_Release( network ); + } + + conn_cost = NULL; + hr = INetworkConnection_QueryInterface( conn, &IID_INetworkConnectionCost, (void **)&conn_cost ); + ok( hr == S_OK || broken(hr == E_NOINTERFACE), "got %08x\n", hr ); + if (conn_cost) + { + DWORD cost; + NLM_DATAPLAN_STATUS status; + + cost = 0xdeadbeef; + hr = INetworkConnectionCost_GetCost( conn_cost, &cost ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( cost != 0xdeadbeef, "cost not set\n" ); + trace("cost %08x\n", cost); + + memset( &status, 0,sizeof(status) ); + hr = INetworkConnectionCost_GetDataPlanStatus( conn_cost, &status ); + ok( hr == S_OK, "got %08x\n", hr ); + trace("InterfaceGuid %s\n", wine_dbgstr_guid(&status.InterfaceGuid)); + + INetworkConnectionCost_Release( conn_cost ); + } +} + static void test_INetworkListManager( void ) { IConnectionPointContainer *cpc, *cpc2; @@ -33,6 +165,10 @@ static void test_INetworkListManager( void ) NLM_CONNECTIVITY connectivity; VARIANT_BOOL connected; IConnectionPoint *pt; + IEnumNetworks *network_iter; + INetwork *network; + IEnumNetworkConnections *conn_iter; + INetworkConnection *conn; HRESULT hr; ULONG ref1, ref2; IID iid; @@ -62,9 +198,10 @@ static void test_INetworkListManager( void ) ok( connected == VARIANT_TRUE || connected == VARIANT_FALSE, "expected boolean value\n" ); /* INetworkCostManager is supported starting Win8 */ + cost_mgr = NULL; hr = INetworkListManager_QueryInterface( mgr, &IID_INetworkCostManager, (void **)&cost_mgr ); ok( hr == S_OK || broken(hr == E_NOINTERFACE), "got %08x\n", hr ); - if (hr == S_OK) + if (cost_mgr) { DWORD cost; NLM_DATAPLAN_STATUS status; @@ -119,8 +256,33 @@ static void test_INetworkListManager( void ) hr = IConnectionPointContainer_FindConnectionPoint( cpc, &IID_INetworkConnectionEvents, &pt ); ok( hr == S_OK || hr == CO_E_FAILEDTOIMPERSONATE, "got %08x\n", hr ); if (hr == S_OK) IConnectionPoint_Release( pt ); - IConnectionPointContainer_Release( cpc ); + + network_iter = NULL; + hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_ALL, &network_iter ); + ok( hr == S_OK, "got %08x\n", hr ); + if (network_iter) + { + while ((hr = IEnumNetworks_Next( network_iter, 1, &network, NULL )) == S_OK) + { + test_INetwork( network ); + INetwork_Release( network ); + } + IEnumNetworks_Release( network_iter ); + } + + conn_iter = NULL; + hr = INetworkListManager_GetNetworkConnections( mgr, &conn_iter ); + ok( hr == S_OK, "got %08x\n", hr ); + if (conn_iter) + { + while ((hr = IEnumNetworkConnections_Next( conn_iter, 1, &conn, NULL )) == S_OK) + { + test_INetworkConnection( conn ); + INetworkConnection_Release( conn ); + } + IEnumNetworkConnections_Release( conn_iter ); + } INetworkListManager_Release( mgr ); } From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Dmitry Timoshkov : winhttp/tests: Add more IWinHttpRequest_Invoke tests. Message-ID: Module: wine Branch: master Commit: 25c78aac08b0c2f4d360290512f858b284d7c5cb URL: http://source.winehq.org/git/wine.git/?a=commit;h=25c78aac08b0c2f4d360290512f858b284d7c5cb Author: Dmitry Timoshkov Date: Wed Sep 2 13:44:50 2015 +0800 winhttp/tests: Add more IWinHttpRequest_Invoke tests. --- dlls/winhttp/tests/winhttp.c | 203 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 2 deletions(-) diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index c3a3f11..05993f0 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -2,6 +2,7 @@ * WinHTTP - tests * * Copyright 2008 Google (Zac Brown) + * Copyright 2015 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -3542,6 +3543,27 @@ static void test_IWinHttpRequest(void) CoUninitialize(); } +static void request_get_property(IWinHttpRequest *request, int property, VARIANT *ret) +{ + DISPPARAMS params; + VARIANT arg; + HRESULT hr; + + memset(¶ms, 0, sizeof(params)); + params.cNamedArgs = 0; + params.rgdispidNamedArgs = NULL; + params.cArgs = 1; + params.rgvarg = &arg; + VariantInit(&arg); + V_VT(&arg) = VT_I4; + V_I4(&arg) = property; + VariantInit(ret); + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, + DISPATCH_PROPERTYGET, ¶ms, ret, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); +} + static void test_IWinHttpRequest_Invoke(void) { static const WCHAR utf8W[] = {'U','T','F','-','8',0}; @@ -3582,6 +3604,72 @@ static void test_IWinHttpRequest_Invoke(void) ok(hr == S_OK, "error %#x\n", hr); ok(id == DISPID_HTTPREQUEST_OPTION, "expected DISPID_HTTPREQUEST_OPTION, got %u\n", id); + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret)); + + memset(¶ms, 0, sizeof(params)); + params.cArgs = 2; + params.cNamedArgs = 0; + params.rgvarg = arg; + V_VT(&arg[0]) = VT_I4; + V_I4(&arg[0]) = 1252; + V_VT(&arg[1]) = VT_R8; + V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */ + VariantInit(&ret); + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, + DISPATCH_METHOD, ¶ms, NULL, NULL, &err); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret)); + + memset(¶ms, 0, sizeof(params)); + params.cArgs = 2; + params.cNamedArgs = 0; + params.rgvarg = arg; + V_VT(&arg[0]) = VT_I4; + V_I4(&arg[0]) = 1252; + V_VT(&arg[1]) = VT_R8; + V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */ + VariantInit(&ret); + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, + DISPATCH_METHOD | DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, &err); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret)); + + memset(¶ms, 0, sizeof(params)); + params.cArgs = 2; + params.cNamedArgs = 0; + params.rgvarg = arg; + V_VT(&arg[0]) = VT_I4; + V_I4(&arg[0]) = 1252; + V_VT(&arg[1]) = VT_R8; + V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */ + VariantInit(&ret); + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, + DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, &err); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == 1252, "expected 1252, got %d\n", V_I4(&ret)); + memset(¶ms, 0, sizeof(params)); params.cArgs = 2; params.cNamedArgs = 0; @@ -3590,17 +3678,128 @@ static void test_IWinHttpRequest_Invoke(void) utf8 = SysAllocString(utf8W); V_BSTR(&arg[0]) = utf8; V_VT(&arg[1]) = VT_R8; - V_R8(&arg[1]) = 2.0; - VariantInit(&ret); + V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */ hr = IWinHttpRequest_Invoke(request, id, &IID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, &err); todo_wine ok(hr == S_OK, "error %#x\n", hr); + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == 1252, "expected 1252, got %d\n", V_I4(&ret)); + VariantInit(&ret); hr = IWinHttpRequest_Invoke(request, id, &IID_NULL, 0, DISPATCH_METHOD, ¶ms, &ret, NULL, &err); todo_wine ok(hr == S_OK, "error %#x\n", hr); + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == 1252, "expected 1252, got %d\n", V_I4(&ret)); + + VariantInit(&ret); + hr = IWinHttpRequest_Invoke(request, id, &IID_NULL, 0, DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, &err); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + request_get_property(request, WinHttpRequestOption_URLCodePage, &ret); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret)); + + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + hr = IWinHttpRequest_Invoke(request, 255, &IID_NULL, 0, DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, NULL); + ok(hr == DISP_E_MEMBERNOTFOUND, "error %#x\n", hr); + + VariantInit(&ret); + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_IUnknown, 0, DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, &err); +todo_wine + ok(hr == DISP_E_UNKNOWNINTERFACE, "error %#x\n", hr); + + VariantInit(&ret); +if (0) /* crashes */ + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, NULL, &ret, NULL, &err); + + params.cArgs = 1; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, &err); +todo_wine + ok(hr == DISP_E_TYPEMISMATCH, "error %#x\n", hr); + + VariantInit(&arg[2]); + params.cArgs = 3; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, ¶ms, &ret, NULL, &err); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + VariantInit(&arg[0]); + VariantInit(&arg[1]); + VariantInit(&arg[2]); + + params.cArgs = 1; + V_VT(&arg[0]) = VT_I4; + V_I4(&arg[0]) = WinHttpRequestOption_URLCodePage; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYGET, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + V_VT(&ret) = 0xdead; + V_I4(&ret) = 0xbeef; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_METHOD|DISPATCH_PROPERTYGET, ¶ms, &ret, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret)); + + V_VT(&ret) = 0xdead; + V_I4(&ret) = 0xbeef; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_METHOD, ¶ms, &ret, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); +todo_wine + ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret)); +todo_wine + ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret)); + + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_METHOD|DISPATCH_PROPERTYGET, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + V_VT(&ret) = 0xdead; + V_I4(&ret) = 0xbeef; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, 0, ¶ms, &ret, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); +todo_wine + ok(V_VT(&ret) == VT_EMPTY, "expected VT_EMPTY, got %d\n", V_VT(&ret)); + ok(V_I4(&ret) == 0xbeef || V_I4(&ret) == 0 /* Win8 */, "expected 0xdead, got %d\n", V_I4(&ret)); + + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, 0, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_IUnknown, 0, DISPATCH_PROPERTYGET, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == DISP_E_UNKNOWNINTERFACE, "error %#x\n", hr); + + params.cArgs = 2; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYGET, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == S_OK, "error %#x\n", hr); + + params.cArgs = 0; + hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYGET, ¶ms, NULL, NULL, NULL); +todo_wine + ok(hr == DISP_E_PARAMNOTFOUND, "error %#x\n", hr); + SysFreeString(utf8); IWinHttpRequest_Release(request); From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Gerald Pfeifer : winex11: Make a constant unsigned to avoid shift overflow in get_locale_kbd_layout. Message-ID: Module: wine Branch: master Commit: 2b42ddf68a98ae5cbff5d05d1b064d299f7a03de URL: http://source.winehq.org/git/wine.git/?a=commit;h=2b42ddf68a98ae5cbff5d05d1b064d299f7a03de Author: Gerald Pfeifer Date: Mon Aug 31 16:55:57 2015 +0200 winex11: Make a constant unsigned to avoid shift overflow in get_locale_kbd_layout. --- dlls/winex11.drv/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index bd24961..3d68d66 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1592,7 +1592,7 @@ static HKL get_locale_kbd_layout(void) */ langid = PRIMARYLANGID(LANGIDFROMLCID(layout)); if (langid == LANG_CHINESE || langid == LANG_JAPANESE || langid == LANG_KOREAN) - layout |= 0xe001 << 16; /* IME */ + layout = MAKELONG( layout, 0xe001 ); /* IME */ else layout |= layout << 16; From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: wpcap: Partially implement pcap_parsesrcstr. Message-ID: Module: wine Branch: master Commit: 04d72a3e47c3fa70bd128fa1c9dd8a150a891326 URL: http://source.winehq.org/git/wine.git/?a=commit;h=04d72a3e47c3fa70bd128fa1c9dd8a150a891326 Author: Andr? Hentschel Date: Mon Aug 31 20:52:13 2015 +0200 wpcap: Partially implement pcap_parsesrcstr. --- dlls/wpcap/wpcap.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ dlls/wpcap/wpcap.spec | 2 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c index da545a8..ae9e482 100644 --- a/dlls/wpcap/wpcap.c +++ b/dlls/wpcap/wpcap.c @@ -27,6 +27,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(wpcap); WINE_DECLARE_DEBUG_CHANNEL(winediag); +#ifndef PCAP_SRC_FILE_STRING +#define PCAP_SRC_FILE_STRING "file://" +#endif +#ifndef PCAP_SRC_FILE +#define PCAP_SRC_FILE 2 +#endif +#ifndef PCAP_SRC_IF_STRING +#define PCAP_SRC_IF_STRING "rpcap://" +#endif +#ifndef PCAP_SRC_IFLOCAL +#define PCAP_SRC_IFLOCAL 3 +#endif + void CDECL wine_pcap_breakloop(pcap_t *p) { TRACE("(%p)\n", p); @@ -239,6 +252,44 @@ pcap_t* CDECL wine_pcap_open_live(const char *source, int snaplen, int promisc, return pcap_open_live(source, snaplen, promisc, to_ms, errbuf); } +int CDECL wine_pcap_parsesrcstr(const char *source, int *type, char *host, char *port, char *name, char *errbuf) +{ + int t = PCAP_SRC_IFLOCAL; + const char *p = source; + + FIXME("(%s %p %p %p %p %p): partial stub\n", debugstr_a(source), type, host, port, name, errbuf); + + if (host) + *host = '\0'; + if (port) + *port = '\0'; + if (name) + *name = '\0'; + + if (!strncmp(p, PCAP_SRC_IF_STRING, strlen(PCAP_SRC_IF_STRING))) + p += strlen(PCAP_SRC_IF_STRING); + else if (!strncmp(p, PCAP_SRC_FILE_STRING, strlen(PCAP_SRC_FILE_STRING))) + { + p += strlen(PCAP_SRC_FILE_STRING); + t = PCAP_SRC_FILE; + } + + if (type) + *type = t; + + if (!*p) + { + if (errbuf) + sprintf(errbuf, "The name has not been specified in the source string."); + return -1; + } + + if (name) + strcpy(name, p); + + return 0; +} + int CDECL wine_pcap_sendpacket(pcap_t *p, const unsigned char *buf, int size) { TRACE("(%p %p %i)\n", p, buf, size); diff --git a/dlls/wpcap/wpcap.spec b/dlls/wpcap/wpcap.spec index c7d2cd1..0e1e208 100644 --- a/dlls/wpcap/wpcap.spec +++ b/dlls/wpcap/wpcap.spec @@ -51,7 +51,7 @@ @ stub pcap_open_dead @ cdecl pcap_open_live(str long long long ptr) wine_pcap_open_live @ stub pcap_open_offline -@ stub pcap_parsesrcstr +@ cdecl pcap_parsesrcstr(str ptr ptr ptr ptr ptr) wine_pcap_parsesrcstr @ stub pcap_perror @ stub pcap_read @ stub pcap_remoteact_accept From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Jacek Caban : ole32: Quote executable name in CreateProcess call. Message-ID: Module: wine Branch: master Commit: c784e346936b3e8f227615dd0348f5d4f5cec5ce URL: http://source.winehq.org/git/wine.git/?a=commit;h=c784e346936b3e8f227615dd0348f5d4f5cec5ce Author: Jacek Caban Date: Wed Sep 2 11:20:08 2015 +0200 ole32: Quote executable name in CreateProcess call. Fixes tests on VMs that have spaces in executable path. --- dlls/ole32/tests/marshal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index d0f9c71..a4006d0 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -2969,7 +2969,7 @@ static HANDLE create_target_process(const char *arg) pi.hThread = NULL; pi.hProcess = NULL; winetest_get_mainargs( &argv ); - sprintf(cmdline, "%s %s %s", argv[0], argv[1], arg); + sprintf(cmdline, "\"%s\" %s %s", argv[0], argv[1], arg); ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ok(ret, "CreateProcess failed with error: %u\n", GetLastError()); if (pi.hThread) CloseHandle(pi.hThread); From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Jacek Caban : ole32: Catch crashes in stub object destructors when destroying stub manager. Message-ID: Module: wine Branch: master Commit: cb183688bb0fc0bd52e0ca94edcadd41bb15c686 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cb183688bb0fc0bd52e0ca94edcadd41bb15c686 Author: Jacek Caban Date: Wed Sep 2 11:21:16 2015 +0200 ole32: Catch crashes in stub object destructors when destroying stub manager. --- dlls/ole32/stubmanager.c | 15 ++++++++- dlls/ole32/tests/marshal.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c index 3b9086d..668d46f 100644 --- a/dlls/ole32/stubmanager.c +++ b/dlls/ole32/stubmanager.c @@ -36,6 +36,8 @@ #include "rpc.h" #include "wine/debug.h" +#include "wine/exception.h" + #include "compobj_private.h" WINE_DEFAULT_DEBUG_CHANNEL(ole); @@ -254,7 +256,18 @@ static void stub_manager_delete(struct stub_manager *m) IExternalConnection_Release(m->extern_conn); CoTaskMemFree(m->oxid_info.psa); - IUnknown_Release(m->object); + + /* Some broken apps crash in object destructors. We have a test showing + * that on winxp+ those crashes are caught and ignored. */ + __TRY + { + IUnknown_Release(m->object); + } + __EXCEPT_PAGE_FAULT + { + ERR("Got page fault when releasing stub!\n"); + } + __ENDTRY DEBUG_CLEAR_CRITSEC_NAME(&m->lock); DeleteCriticalSection(&m->lock); diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index a4006d0..55c32d6 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -195,6 +195,24 @@ static const IUnknownVtbl TestUnknown_Vtbl = static IUnknown Test_Unknown = { &TestUnknown_Vtbl }; +static ULONG WINAPI TestCrash_IUnknown_Release(LPUNKNOWN iface) +{ + UnlockModule(); + if(!cLocks) { + trace("crashing...\n"); + *(int**)0xc = 0; + } + return 1; /* non-heap-based object */ +} + +static const IUnknownVtbl TestCrashUnknown_Vtbl = +{ + Test_IUnknown_QueryInterface, + Test_IUnknown_AddRef, + TestCrash_IUnknown_Release, +}; + +static IUnknown TestCrash_Unknown = { &TestCrashUnknown_Vtbl }; static HRESULT WINAPI Test_IClassFactory_QueryInterface( LPCLASSFACTORY iface, @@ -1082,6 +1100,63 @@ static void test_no_couninitialize_client(void) end_host_object(host_tid, host_thread); } +static BOOL crash_thread_success; + +static DWORD CALLBACK crash_couninitialize_proc(void *p) +{ + IStream *stream; + HRESULT hr; + + cLocks = 0; + + CoInitialize(NULL); + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok_ole_success(hr, CreateStreamOnHGlobal); + + hr = CoMarshalInterface(stream, &IID_IUnknown, &TestCrash_Unknown, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok_ole_success(hr, CoMarshalInterface); + + IStream_Seek(stream, ullZero, STREAM_SEEK_SET, NULL); + + hr = CoReleaseMarshalData(stream); + ok_ole_success(hr, CoReleaseMarshalData); + + ok_no_locks(); + + hr = CoMarshalInterface(stream, &IID_IUnknown, &TestCrash_Unknown, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok_ole_success(hr, CoMarshalInterface); + + ok_more_than_one_lock(); + + trace("CoUninitialize >>>\n"); + CoUninitialize(); + trace("CoUninitialize <<<\n"); + + ok_no_locks(); + + IStream_Release(stream); + crash_thread_success = TRUE; + return 0; +} + +static void test_crash_couninitialize(void) +{ + HANDLE thread; + DWORD tid; + + if(!GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateActCtxW")) { + win_skip("Skipping crash tests on win2k.\n"); + return; + } + + crash_thread_success = FALSE; + thread = CreateThread(NULL, 0, crash_couninitialize_proc, NULL, 0, &tid); + ok(!WaitForSingleObject(thread, 10000), "wait timed out\n"); + CloseHandle(thread); + ok(crash_thread_success, "Crash thread failed\n"); +} + /* tests success case of a same-thread table-weak marshal, unmarshal, unmarshal */ static void test_tableweak_marshal_and_unmarshal_twice(void) { @@ -3549,6 +3624,7 @@ START_TEST(marshal) test_globalinterfacetable(); test_manualresetevent(); + test_crash_couninitialize(); /* must be last test as channel hooks can't be unregistered */ test_channel_hook(); From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Hugh McMaster : regsvr32: Use correct exit code when GetProcAddress fails. Message-ID: Module: wine Branch: master Commit: 68a5642d5c9fce440aa8679614771af93b62034f URL: http://source.winehq.org/git/wine.git/?a=commit;h=68a5642d5c9fce440aa8679614771af93b62034f Author: Hugh McMaster Date: Wed Sep 2 21:12:26 2015 +1000 regsvr32: Use correct exit code when GetProcAddress fails. --- programs/regsvr32/regsvr32.c | 6 +++--- programs/regsvr32/regsvr32.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index f75825b..68cb949 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -127,7 +127,7 @@ static int RegisterDll(const WCHAR* strDll) pfRegister = LoadProc(strDll, "DllRegisterServer", &DllHandle); if (!pfRegister) - return 0; + return GETPROCADDRESS_FAILED; hr = pfRegister(); if(FAILED(hr)) @@ -150,7 +150,7 @@ static int UnregisterDll(const WCHAR* strDll) pfUnregister = LoadProc(strDll, "DllUnregisterServer", &DllHandle); if (!pfUnregister) - return 0; + return GETPROCADDRESS_FAILED; hr = pfUnregister(); if(FAILED(hr)) @@ -173,7 +173,7 @@ static int InstallDll(BOOL install, const WCHAR *strDll, const WCHAR *command_li pfInstall = LoadProc(strDll, "DllInstall", &DllHandle); if (!pfInstall) - return 0; + return GETPROCADDRESS_FAILED; hr = pfInstall(install, command_line); if(FAILED(hr)) diff --git a/programs/regsvr32/regsvr32.h b/programs/regsvr32/regsvr32.h index e3b50eb..c021c55 100644 --- a/programs/regsvr32/regsvr32.h +++ b/programs/regsvr32/regsvr32.h @@ -18,6 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Exit codes */ +#define GETPROCADDRESS_FAILED 4 + /* Resource strings */ #define STRING_HEADER 1000 #define STRING_USAGE 1001 From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Hugh McMaster : regsvr32: Use correct exit code when LoadLibraryEx fails. Message-ID: Module: wine Branch: master Commit: 4a4baf2566c595c0a79ef4cb4b6a0a4dbe1cc483 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a4baf2566c595c0a79ef4cb4b6a0a4dbe1cc483 Author: Hugh McMaster Date: Wed Sep 2 21:12:27 2015 +1000 regsvr32: Use correct exit code when LoadLibraryEx fails. --- programs/regsvr32/regsvr32.c | 2 +- programs/regsvr32/regsvr32.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index 68cb949..c0a9e13 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -107,7 +107,7 @@ static VOID *LoadProc(const WCHAR* strDll, const char* procName, HMODULE* DllHan if(!*DllHandle) { output_write(STRING_DLL_LOAD_FAILED, strDll); - ExitProcess(1); + ExitProcess(LOADLIBRARY_FAILED); } proc = (VOID *) GetProcAddress(*DllHandle, procName); if(!proc) diff --git a/programs/regsvr32/regsvr32.h b/programs/regsvr32/regsvr32.h index c021c55..85b4a72 100644 --- a/programs/regsvr32/regsvr32.h +++ b/programs/regsvr32/regsvr32.h @@ -19,6 +19,7 @@ */ /* Exit codes */ +#define LOADLIBRARY_FAILED 3 #define GETPROCADDRESS_FAILED 4 /* Resource strings */ From julliard at wine.codeweavers.com Wed Sep 2 10:23:16 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 02 Sep 2015 10:23:16 -0500 Subject: Hugh McMaster : regsvr32: Use INVALID_ARG define instead of magic 1. Message-ID: Module: wine Branch: master Commit: 99ecebe90de9ca502c43fbf62d0fbdd09c416b6b URL: http://source.winehq.org/git/wine.git/?a=commit;h=99ecebe90de9ca502c43fbf62d0fbdd09c416b6b Author: Hugh McMaster Date: Wed Sep 2 21:12:28 2015 +1000 regsvr32: Use INVALID_ARG define instead of magic 1. --- programs/regsvr32/regsvr32.c | 6 +++--- programs/regsvr32/regsvr32.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index c0a9e13..9f4764c 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -266,14 +266,14 @@ int wmain(int argc, WCHAR* argv[]) default: output_write(STRING_UNRECOGNIZED_SWITCH, argv[i]); output_write(STRING_USAGE); - return 1; + return INVALID_ARG; } argv[i] = NULL; } } if (!CallInstall && !CallRegister) /* flags: /n or /u /n */ - return 1; + return INVALID_ARG; for (i = 1; i < argc; i++) { @@ -309,7 +309,7 @@ int wmain(int argc, WCHAR* argv[]) { output_write(STRING_HEADER); output_write(STRING_USAGE); - return 1; + return INVALID_ARG; } OleUninitialize(); diff --git a/programs/regsvr32/regsvr32.h b/programs/regsvr32/regsvr32.h index 85b4a72..949d282 100644 --- a/programs/regsvr32/regsvr32.h +++ b/programs/regsvr32/regsvr32.h @@ -19,6 +19,7 @@ */ /* Exit codes */ +#define INVALID_ARG 1 #define LOADLIBRARY_FAILED 3 #define GETPROCADDRESS_FAILED 4 From julliard at wine.codeweavers.com Thu Sep 3 07:34:27 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:27 -0500 Subject: Nikolay Sivov : dwrite: Add simulated bold faces for each family when appropriate. Message-ID: Module: wine Branch: master Commit: e38d9bc68e5ab7a436ca52dc8154af84b4b56147 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e38d9bc68e5ab7a436ca52dc8154af84b4b56147 Author: Nikolay Sivov Date: Thu Sep 3 07:35:35 2015 +0300 dwrite: Add simulated bold faces for each family when appropriate. --- dlls/dwrite/font.c | 231 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 183 insertions(+), 48 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=e38d9bc68e5ab7a436ca52dc8154af84b4b56147 From julliard at wine.codeweavers.com Thu Sep 3 07:34:27 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:27 -0500 Subject: Nikolay Sivov : dwrite: Add simulated oblique faces. Message-ID: Module: wine Branch: master Commit: a10d75e597df5484c8d62e5832190ab6d02c187c URL: http://source.winehq.org/git/wine.git/?a=commit;h=a10d75e597df5484c8d62e5832190ab6d02c187c Author: Nikolay Sivov Date: Thu Sep 3 07:36:01 2015 +0300 dwrite: Add simulated oblique faces. --- dlls/dwrite/font.c | 116 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 87 insertions(+), 29 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=a10d75e597df5484c8d62e5832190ab6d02c187c From julliard at wine.codeweavers.com Thu Sep 3 07:34:27 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:27 -0500 Subject: Nikolay Sivov : dwrite: Remove GetFaceNames() hack for simulated case. Message-ID: Module: wine Branch: master Commit: 7581b11d2b01fd01c4f56778218e98bafa74358f URL: http://source.winehq.org/git/wine.git/?a=commit;h=7581b11d2b01fd01c4f56778218e98bafa74358f Author: Nikolay Sivov Date: Thu Sep 3 07:36:25 2015 +0300 dwrite: Remove GetFaceNames() hack for simulated case. --- dlls/dwrite/font.c | 40 +--------------------------------------- 1 file changed, 1 insertion(+), 39 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 3daab79..0970f3a 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -1240,47 +1240,9 @@ static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont2 *iface) static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont2 *iface, IDWriteLocalizedStrings **names) { - static const WCHAR boldobliqueW[] = {'B','o','l','d',' ','O','b','l','i','q','u','e',0}; - struct dwrite_font *This = impl_from_IDWriteFont2(iface); - IDWriteLocalizedStrings *strings; - const WCHAR *name; - HRESULT hr; - TRACE("(%p)->(%p)\n", This, names); - - *names = NULL; - - if (This->data->simulations == DWRITE_FONT_SIMULATIONS_NONE) - return clone_localizedstring(This->data->names, names); - - switch (This->data->simulations) { - case DWRITE_FONT_SIMULATIONS_BOLD|DWRITE_FONT_SIMULATIONS_OBLIQUE: - name = boldobliqueW; - break; - case DWRITE_FONT_SIMULATIONS_BOLD: - name = boldW; - break; - case DWRITE_FONT_SIMULATIONS_OBLIQUE: - name = obliqueW; - break; - default: - ERR("unknown simulations %d\n", This->data->simulations); - return E_FAIL; - } - - hr = create_localizedstrings(&strings); - if (FAILED(hr)) return hr; - - hr = add_localizedstring(strings, enusW, name); - if (FAILED(hr)) { - IDWriteLocalizedStrings_Release(strings); - return hr; - } - - *names = strings; - - return S_OK; + return clone_localizedstring(This->data->names, names); } static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont2 *iface, From julliard at wine.codeweavers.com Thu Sep 3 07:34:27 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:27 -0500 Subject: Nikolay Sivov : dwrite: Increase a number of allocated family slots for system collection. Message-ID: Module: wine Branch: master Commit: 30108c730e9d38c1af7d253bad764136615db2ed URL: http://source.winehq.org/git/wine.git/?a=commit;h=30108c730e9d38c1af7d253bad764136615db2ed Author: Nikolay Sivov Date: Thu Sep 3 07:36:55 2015 +0300 dwrite: Increase a number of allocated family slots for system collection. --- dlls/dwrite/font.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 0970f3a..baa5ace 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -1866,10 +1866,10 @@ static HRESULT init_font_collection(struct dwrite_fontcollection *collection, BO collection->IDWriteFontCollection_iface.lpVtbl = &fontcollectionvtbl; collection->ref = 1; collection->family_count = 0; - collection->family_alloc = 2; + collection->family_alloc = is_system ? 30 : 5; collection->is_system = is_system; - collection->family_data = heap_alloc(sizeof(*collection->family_data)*2); + collection->family_data = heap_alloc(sizeof(*collection->family_data) * collection->family_alloc); if (!collection->family_data) return E_OUTOFMEMORY; From julliard at wine.codeweavers.com Thu Sep 3 07:34:27 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:27 -0500 Subject: Florian Pelz : po: German translation: Fix grammar errors. Message-ID: Module: wine Branch: master Commit: 9a52351f9b3acebd9f188b54c492fc14a3a97dda URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a52351f9b3acebd9f188b54c492fc14a3a97dda Author: Florian Pelz Date: Wed Sep 2 15:40:11 2015 +0200 po: German translation: Fix grammar errors. --- po/de.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/po/de.po b/po/de.po index 806eff2..091c77f 100644 --- a/po/de.po +++ b/po/de.po @@ -9494,7 +9494,7 @@ msgstr "Kann nicht zum LDAP-Server verbinden" #: wldap32.rc:122 msgid "Operation not supported by this version of the LDAP protocol" -msgstr "Operation durch diese Version des LDAP-Protokoll nicht unterst?tzt" +msgstr "Operation durch diese Version des LDAP-Protokolls nicht unterst?tzt" #: wldap32.rc:123 msgid "Specified control was not found in message" @@ -11200,7 +11200,7 @@ msgstr "Wine-Registrierungs-Editor ausf?hren" #: oleview.rc:110 msgid "Quit the application. Prompts to save changes" -msgstr "Anwendung beenden. Frag ob ?nderungen zu speichern sind" +msgstr "Anwendung beenden. Fragt ob ?nderungen zu speichern sind" #: oleview.rc:111 msgid "Create an instance of the selected object" @@ -12266,7 +12266,7 @@ msgstr "&Neuer Task..." #: taskmgr.rc:364 msgid "&Show processes from all users" -msgstr "P&rozesse aller Benutzern anzeigen" +msgstr "P&rozesse aller Benutzer anzeigen" #: taskmgr.rc:372 msgid "CPU usage" @@ -12719,7 +12719,7 @@ msgstr "Wechselt den Fokus zu dem Prozess des ausgew?hlten Tasks" #: taskmgr.rc:229 msgid "Restores the Task Manager from its hidden state" -msgstr "Stellt den Task-Manager von seiner versteckten Status wieder her" +msgstr "Stellt den Task-Manager aus seinem versteckten Status wieder her" #: taskmgr.rc:230 msgid "Removes the process from the system" @@ -13779,7 +13779,7 @@ msgstr "Dies ist ein Test" #: wineconsole.rc:44 msgid "wineconsole: Couldn't parse event id\n" -msgstr "wineconsole: Ereignis-ID konnte nicht geparsed werden\n" +msgstr "wineconsole: Ereignis-ID konnte nicht geparset werden\n" #: wineconsole.rc:45 msgid "wineconsole: Invalid backend\n" From julliard at wine.codeweavers.com Thu Sep 3 07:34:27 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:27 -0500 Subject: Florian Pelz : po: German translation: Fix capitalization. Message-ID: Module: wine Branch: master Commit: 1cc73b990fb39cd26be54ada7b574e4144693f83 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1cc73b990fb39cd26be54ada7b574e4144693f83 Author: Florian Pelz Date: Wed Sep 2 15:40:09 2015 +0200 po: German translation: Fix capitalization. --- po/de.po | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/po/de.po b/po/de.po index 091c77f..2be3703 100644 --- a/po/de.po +++ b/po/de.po @@ -187,7 +187,7 @@ msgstr "Software" msgid "" "Allows you to install new software, or remove existing software from your " "computer." -msgstr "Erlaubt es ihnen, neue Software hinzuzuf?gen oder zu entfernen." +msgstr "Erlaubt es Ihnen, neue Software hinzuzuf?gen oder zu entfernen." #: appwiz.rc:33 taskmgr.rc:262 winecfg.rc:33 msgid "Applications" @@ -806,7 +806,7 @@ msgstr "Datei nicht gefunden" #: comdlg32.rc:33 msgid "Please verify that the correct file name was given" -msgstr "Bitte ?berpr?fen sie, ob der korrekte Dateiname angegeben wurde" +msgstr "Bitte ?berpr?fen Sie, ob der korrekte Dateiname angegeben wurde" #: comdlg32.rc:34 msgid "" @@ -958,7 +958,7 @@ msgid "" "Please enter a value between %1!d! and %2!d!." msgstr "" "Dieser Wert liegt nicht auf der Seite.\n" -"Bitte geben sie einen Wert zwischen %1!d! und %2!d! an." +"Bitte geben Sie einen Wert zwischen %1!d! und %2!d! an." #: comdlg32.rc:60 msgid "The 'from' entry cannot exceed the 'to' entry." @@ -2184,10 +2184,10 @@ msgid "" "\n" "To continue, click Next." msgstr "" -"Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und " +"Dieser Assistent hilft Ihnen Zertifikate, Zertifikatssperrlisten und " "Zertifikatsvertrauenslisten aus einer Datei zu importieren.\n" "\n" -"Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es " +"Ein Zertifikat dient zur Identifikation von Ihnen oder Ihrem Computer. Es " "kann auch f?r die Authentifizierung und zum Unterzeichnen genutzt werden. " "Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten " "und Zertifikatsvertrauenslisten.\n" @@ -2319,10 +2319,10 @@ msgid "" "\n" "To continue, click Next." msgstr "" -"Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und " +"Dieser Assistent hilft Ihnen Zertifikate, Zertifikatssperrlisten und " "Zertifikatsvertrauenslisten in eine Datei zu exportieren.\n" "\n" -"Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es " +"Ein Zertifikat dient zur Identifikation von Ihnen oder Ihrem Computer. Es " "kann auch f?r die Authentifizierung und zum Unterzeichnen genutzt werden. " "Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten " "und Zertifikatsvertrauenslisten.\n" @@ -2913,7 +2913,7 @@ msgstr "Passwort eingeben" #: cryptui.rc:173 msgid "You may password-protect a private key." -msgstr "Der private Schl?ssel sollte Passwortgesch?tzt sein." +msgstr "Der private Schl?ssel sollte passwortgesch?tzt sein." #: cryptui.rc:174 msgid "The passwords do not match." @@ -8350,7 +8350,7 @@ msgstr "" "\n" "Wenn Dateien im Zielordner die gleichen Namen haben,\n" "werden diese durch Inhalte des Quellordners ersetzt.\n" -"M?chten sie trotzdem fortfahren?" +"M?chten Sie trotzdem fortfahren?" #: shell32.rc:238 msgid "New Folder" @@ -8499,7 +8499,7 @@ msgid "" "When installed, an ActiveX component has full access to your computer. Do " "not click install unless you have absolute trust in the above source." msgstr "" -"Eine installierte ActiveX-Komponente hat Vollzugriff auf ihren Computer. " +"Eine installierte ActiveX-Komponente hat Vollzugriff auf Ihren Computer. " "Klicken Sie nicht auf Installieren, wenn Sie der obigen Quelle nicht absolut " "vertrauen." @@ -8769,7 +8769,7 @@ msgid "" "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the " "Windows SYSTEM directory, and then try again." msgstr "" -"Das aktuelle MIDI-Setup ist besch?digt. Kopieren sie die urspr?ngliche Datei " +"Das aktuelle MIDI-Setup ist besch?digt. Kopieren Sie die urspr?ngliche Datei " "MIDIMAP.CFG in das Windows-Systemverzeichnis und versuchen Sie es erneut." #: winmm.rc:60 @@ -9646,7 +9646,7 @@ msgstr "COPY kopiert eine Datei.\n" #: cmd.rc:56 msgid "CTTY changes the input/output device.\n" -msgstr "CTTY ?ndert das Eingabe/Ausgabe - Ger?t.\n" +msgstr "CTTY ?ndert das Eingabe/Ausgabe - Ger?t.\n" #: cmd.rc:59 msgid "DATE shows or changes the system date.\n" @@ -10008,7 +10008,7 @@ msgstr "" #: cmd.rc:237 msgid "TIME sets or shows the current system time.\n" -msgstr "TIME Setzt oder zeigt die aktuelle Systemzeit an.\n" +msgstr "TIME setzt oder zeigt die aktuelle Systemzeit an.\n" #: cmd.rc:240 msgid "TITLE sets the window title for the cmd window.\n" @@ -10238,7 +10238,7 @@ msgstr "" #: cmd.rc:353 msgid "Are you sure?" -msgstr "Sind sie sicher?" +msgstr "Sind Sie sicher?" #: cmd.rc:354 xcopy.rc:43 msgctxt "Yes key" @@ -12098,11 +12098,11 @@ msgstr "" #: taskkill.rc:38 msgid "Process with PID %1!u! was forcibly terminated.\n" -msgstr "Prozess mit der PID %1!u! wurde zum beenden gezwungen.\n" +msgstr "Prozess mit der PID %1!u! wurde zum Beenden gezwungen.\n" #: taskkill.rc:39 msgid "Process \"%1\" with PID %2!u! was forcibly terminated.\n" -msgstr "Prozess \"%1\" mit der PID %2!u! wurde zum beenden gezwungen.\n" +msgstr "Prozess \"%1\" mit der PID %2!u! wurde zum Beenden gezwungen.\n" #: taskkill.rc:40 msgid "Error: Could not find process \"%1\".\n" @@ -12110,7 +12110,7 @@ msgstr "Fehler: Konnte Prozess \"%1\" nicht finden.\n" #: taskkill.rc:41 msgid "Error: Unable to enumerate the process list.\n" -msgstr "Fehler: Konnte die Prozessliste nicht Enumerieren.\n" +msgstr "Fehler: Konnte die Prozessliste nicht enumerieren.\n" #: taskkill.rc:42 msgid "Error: Unable to terminate process \"%1\".\n" From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Florian Pelz : po: German translation: Fix punctuation. Message-ID: Module: wine Branch: master Commit: 2fb98b2db3081c96f96c939d2455add0f0b67a0c URL: http://source.winehq.org/git/wine.git/?a=commit;h=2fb98b2db3081c96f96c939d2455add0f0b67a0c Author: Florian Pelz Date: Wed Sep 2 15:40:12 2015 +0200 po: German translation: Fix punctuation. --- po/de.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/de.po b/po/de.po index 2be3703..4faf46e 100644 --- a/po/de.po +++ b/po/de.po @@ -10397,7 +10397,7 @@ msgstr " (Ja|Nein|Alle)" msgid "" "Can't recognize '%1' as an internal or external command, or batch script.\n" msgstr "" -"'%1' konnte nicht als interner oder externer Befehl,\n" +"'%1' konnte nicht als interner oder externer Befehl\n" "oder als Batch-Skript erkannt werden.\n" #: cmd.rc:393 From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Florian Pelz : po: German translation: Fix hyphenation. Message-ID: Module: wine Branch: master Commit: 1970014d8411b8b97f5908d504fd39e2a8cd9ddb URL: http://source.winehq.org/git/wine.git/?a=commit;h=1970014d8411b8b97f5908d504fd39e2a8cd9ddb Author: Florian Pelz Date: Wed Sep 2 15:40:08 2015 +0200 po: German translation: Fix hyphenation. --- po/de.po | 352 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 176 insertions(+), 176 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=1970014d8411b8b97f5908d504fd39e2a8cd9ddb From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Florian Pelz : po: German translation: Fix mistranslations. Message-ID: Module: wine Branch: master Commit: 10fcf17934b253df10533985e05f4837ea38a7b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=10fcf17934b253df10533985e05f4837ea38a7b8 Author: Florian Pelz Date: Wed Sep 2 15:40:10 2015 +0200 po: German translation: Fix mistranslations. --- po/de.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/po/de.po b/po/de.po index 1b2ee6d..da790ce 100644 --- a/po/de.po +++ b/po/de.po @@ -3972,15 +3972,15 @@ msgstr "Keine Prozess-Slots.\n" #: winerror.mc:376 msgid "Too many semaphores.\n" -msgstr "Zu viele Semaphoren.\n" +msgstr "Zu viele Semaphore.\n" #: winerror.mc:381 msgid "Exclusive semaphore already owned.\n" -msgstr "Exklusive Semaphore bereits zugewiesen.\n" +msgstr "Exklusiver Semaphor bereits zugewiesen.\n" #: winerror.mc:386 msgid "Semaphore is set.\n" -msgstr "Semaphore ist gesetzt.\n" +msgstr "Semaphor ist gesetzt.\n" #: winerror.mc:391 msgid "Too many semaphore requests.\n" @@ -4420,7 +4420,7 @@ msgstr "Mutex nicht im Besitz des Aufrufers.\n" #: winerror.mc:946 msgid "Too many posts to semaphore.\n" -msgstr "Zu viele Posts an Semaphore.\n" +msgstr "Zu viele Posts an Semaphor.\n" #: winerror.mc:951 msgid "Read/WriteProcessMemory partially completed.\n" @@ -7862,11 +7862,11 @@ msgstr "Runterscrollen" #: shdoclc.rc:235 msgid "Left Edge" -msgstr "Linke Ecke" +msgstr "Linker Rand" #: shdoclc.rc:236 msgid "Right Edge" -msgstr "Rechte Ecke" +msgstr "Rechter Rand" #: shdoclc.rc:238 msgid "Page Left" @@ -9860,7 +9860,7 @@ msgstr "" "unmittelbar danach), erscheint am Zeilenanfang, wenn cmd auf Eingabe\n" "wartet.\n" "\n" -"Die folgenden Zeichen haben eine besondere Bedeutung:\n" +"Die folgenden Zeichenketten haben eine besondere Bedeutung:\n" "\n" "$$ Dollarzeichen $_ Zeilenvorschub $b Pipe-Zeichen (|)\n" "$d aktuelles Datum $e Escape $g Gr??erzeichen (>)\n" @@ -10048,7 +10048,7 @@ msgstr "VER zeigt die aktuelle Version von CMD an.\n" #: cmd.rc:259 msgid "VOL shows the volume label of a disk device.\n" -msgstr "VOL zeigt die Datentr?gernummer an.\n" +msgstr "VOL zeigt die Datentr?gerbezeichnung an.\n" #: cmd.rc:263 msgid "" From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Gerald Pfeifer : include: Define HIDP_STATUS constants via unsigned parameters. Message-ID: Module: wine Branch: master Commit: 4349b3c16d0005e00b56a94ad04bc5ec5a8df429 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4349b3c16d0005e00b56a94ad04bc5ec5a8df429 Author: Gerald Pfeifer Date: Thu Aug 27 23:26:46 2015 +0200 include: Define HIDP_STATUS constants via unsigned parameters. --- include/ddk/hidpi.h | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/include/ddk/hidpi.h b/include/ddk/hidpi.h index 527a966..4cfac61 100644 --- a/include/ddk/hidpi.h +++ b/include/ddk/hidpi.h @@ -151,24 +151,24 @@ NTSTATUS WINAPI HidP_GetScaledUsageValue(HIDP_REPORT_TYPE ReportType, USAGE Usag #define HIDP_ERROR_CODES(sev, code) ((NTSTATUS)(((sev) << 28) | (FACILITY_HID_ERROR_CODE << 16) | (code))) -#define HIDP_STATUS_SUCCESS (HIDP_ERROR_CODES(0x0,0x00)) -#define HIDP_STATUS_NULL (HIDP_ERROR_CODES(0x8,0x01)) -#define HIDP_STATUS_INVALID_PREPARSED_DATA (HIDP_ERROR_CODES(0xc,0x01)) -#define HIDP_STATUS_INVALID_REPORT_TYPE (HIDP_ERROR_CODES(0xc,0x02)) -#define HIDP_STATUS_INVALID_REPORT_LENGTH (HIDP_ERROR_CODES(0xc,0x03)) -#define HIDP_STATUS_USAGE_NOT_FOUND (HIDP_ERROR_CODES(0xc,0x04)) -#define HIDP_STATUS_VALUE_OUT_OF_RANGE (HIDP_ERROR_CODES(0xc,0x05)) -#define HIDP_STATUS_BAD_LOG_PHY_VALUES (HIDP_ERROR_CODES(0xc,0x06)) -#define HIDP_STATUS_BUFFER_TOO_SMALL (HIDP_ERROR_CODES(0xc,0x07)) -#define HIDP_STATUS_INTERNAL_ERROR (HIDP_ERROR_CODES(0xc,0x08)) -#define HIDP_STATUS_I8242_TRANS_UNKNOWN (HIDP_ERROR_CODES(0xc,0x09)) -#define HIDP_STATUS_INCOMPATIBLE_REPORT_ID (HIDP_ERROR_CODES(0xc,0x0a)) -#define HIDP_STATUS_NOT_VALUE_ARRAY (HIDP_ERROR_CODES(0xc,0x0b)) -#define HIDP_STATUS_IS_VALUE_ARRAY (HIDP_ERROR_CODES(0xc,0x0c)) -#define HIDP_STATUS_DATA_INDEX_NOT_FOUND (HIDP_ERROR_CODES(0xc,0x0d)) -#define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE (HIDP_ERROR_CODES(0xc,0x0e)) -#define HIDP_STATUS_BUTTON_NOT_PRESSED (HIDP_ERROR_CODES(0xc,0x0f)) -#define HIDP_STATUS_REPORT_DOES_NOT_EXIST (HIDP_ERROR_CODES(0xc,0x10)) -#define HIDP_STATUS_NOT_IMPLEMENTED (HIDP_ERROR_CODES(0xc,0x20)) +#define HIDP_STATUS_SUCCESS (HIDP_ERROR_CODES(0x0u,0x00)) +#define HIDP_STATUS_NULL (HIDP_ERROR_CODES(0x8u,0x01)) +#define HIDP_STATUS_INVALID_PREPARSED_DATA (HIDP_ERROR_CODES(0xcu,0x01)) +#define HIDP_STATUS_INVALID_REPORT_TYPE (HIDP_ERROR_CODES(0xcu,0x02)) +#define HIDP_STATUS_INVALID_REPORT_LENGTH (HIDP_ERROR_CODES(0xcu,0x03)) +#define HIDP_STATUS_USAGE_NOT_FOUND (HIDP_ERROR_CODES(0xcu,0x04)) +#define HIDP_STATUS_VALUE_OUT_OF_RANGE (HIDP_ERROR_CODES(0xcu,0x05)) +#define HIDP_STATUS_BAD_LOG_PHY_VALUES (HIDP_ERROR_CODES(0xcu,0x06)) +#define HIDP_STATUS_BUFFER_TOO_SMALL (HIDP_ERROR_CODES(0xcu,0x07)) +#define HIDP_STATUS_INTERNAL_ERROR (HIDP_ERROR_CODES(0xcu,0x08)) +#define HIDP_STATUS_I8242_TRANS_UNKNOWN (HIDP_ERROR_CODES(0xcu,0x09)) +#define HIDP_STATUS_INCOMPATIBLE_REPORT_ID (HIDP_ERROR_CODES(0xcu,0x0a)) +#define HIDP_STATUS_NOT_VALUE_ARRAY (HIDP_ERROR_CODES(0xcu,0x0b)) +#define HIDP_STATUS_IS_VALUE_ARRAY (HIDP_ERROR_CODES(0xcu,0x0c)) +#define HIDP_STATUS_DATA_INDEX_NOT_FOUND (HIDP_ERROR_CODES(0xcu,0x0d)) +#define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE (HIDP_ERROR_CODES(0xcu,0x0e)) +#define HIDP_STATUS_BUTTON_NOT_PRESSED (HIDP_ERROR_CODES(0xcu,0x0f)) +#define HIDP_STATUS_REPORT_DOES_NOT_EXIST (HIDP_ERROR_CODES(0xcu,0x10)) +#define HIDP_STATUS_NOT_IMPLEMENTED (HIDP_ERROR_CODES(0xcu,0x20)) #endif /* __HIDPI_H__ */ From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Hugh McMaster : regsvr32: Use correct exit code when DllRegisterServer, DllUnregisterServer and DllInstall fail. Message-ID: Module: wine Branch: master Commit: 76162a4ea8519b1ea1396c2164bcd9098bdd52ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=76162a4ea8519b1ea1396c2164bcd9098bdd52ae Author: Hugh McMaster Date: Thu Sep 3 19:29:42 2015 +1000 regsvr32: Use correct exit code when DllRegisterServer, DllUnregisterServer and DllInstall fail. --- programs/regsvr32/regsvr32.c | 6 +++--- programs/regsvr32/regsvr32.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index 9f4764c..e560d32 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -133,7 +133,7 @@ static int RegisterDll(const WCHAR* strDll) if(FAILED(hr)) { output_write(STRING_REGISTER_FAILED, strDll); - return -1; + return DLLSERVER_FAILED; } output_write(STRING_REGISTER_SUCCESSFUL, strDll); @@ -156,7 +156,7 @@ static int UnregisterDll(const WCHAR* strDll) if(FAILED(hr)) { output_write(STRING_UNREGISTER_FAILED, strDll); - return -1; + return DLLSERVER_FAILED; } output_write(STRING_UNREGISTER_SUCCESSFUL, strDll); @@ -182,7 +182,7 @@ static int InstallDll(BOOL install, const WCHAR *strDll, const WCHAR *command_li output_write(STRING_INSTALL_FAILED, strDll); else output_write(STRING_UNINSTALL_FAILED, strDll); - return -1; + return DLLSERVER_FAILED; } if (install) output_write(STRING_INSTALL_SUCCESSFUL, strDll); diff --git a/programs/regsvr32/regsvr32.h b/programs/regsvr32/regsvr32.h index 949d282..82a14ca 100644 --- a/programs/regsvr32/regsvr32.h +++ b/programs/regsvr32/regsvr32.h @@ -22,6 +22,7 @@ #define INVALID_ARG 1 #define LOADLIBRARY_FAILED 3 #define GETPROCADDRESS_FAILED 4 +#define DLLSERVER_FAILED 5 /* Resource strings */ #define STRING_HEADER 1000 From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Hugh McMaster : regsvr32: Do not attempt to register '/' or '-'. Message-ID: Module: wine Branch: master Commit: 80c3fca05694871972ed609bf845ac459042ae76 URL: http://source.winehq.org/git/wine.git/?a=commit;h=80c3fca05694871972ed609bf845ac459042ae76 Author: Hugh McMaster Date: Thu Sep 3 21:29:23 2015 +1000 regsvr32: Do not attempt to register '/' or '-'. --- programs/regsvr32/regsvr32.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index e560d32..a2d83a1 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -241,8 +241,14 @@ int wmain(int argc, WCHAR* argv[]) */ for(i = 1; i < argc; i++) { - if ((argv[i][0] == '/' || argv[i][0] == '-') && (!argv[i][2] || argv[i][2] == ':')) + if (argv[i][0] == '/' || argv[i][0] == '-') { + if (!argv[i][1]) + return INVALID_ARG; + + if (argv[i][2] && argv[i][2] != ':') + continue; + switch (tolowerW(argv[i][1])) { case 'u': From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: Thomas Faller : usp10: Fix invalid read. Message-ID: Module: wine Branch: master Commit: f1334dbb8d1d6f3678590d38124f1c265bab385a URL: http://source.winehq.org/git/wine.git/?a=commit;h=f1334dbb8d1d6f3678590d38124f1c265bab385a Author: Thomas Faller Date: Thu Sep 3 11:50:36 2015 +0200 usp10: Fix invalid read. --- dlls/usp10/usp10.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index fa4dc79..f3fb369 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -1477,7 +1477,8 @@ static HRESULT _ItemizeInternal(const WCHAR *pwcInChars, int cInChars, } } - while ((!levels || (levels && levels[cnt+1] == levels[0])) && (pwcInChars[cnt] == Numeric_space) && cnt < cInChars) + while ((!levels || (levels && cnt+1 < cInChars && levels[cnt+1] == levels[0])) + && (cnt < cInChars && pwcInChars[cnt] == Numeric_space)) cnt++; if (cnt == cInChars) /* All Spaces */ From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Add test for 3D texture interfaces. Message-ID: Module: wine Branch: master Commit: 8821a1462ba50ff5b94aa5c06398d436988b464f URL: http://source.winehq.org/git/wine.git/?a=commit;h=8821a1462ba50ff5b94aa5c06398d436988b464f Author: J?zef Kucia Date: Thu Sep 3 00:06:49 2015 +0200 d3d11/tests: Add test for 3D texture interfaces. --- dlls/d3d11/tests/d3d11.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 6a9d710..a5e6945 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -488,6 +488,160 @@ static void test_create_texture3d(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_texture3d_interfaces(void) +{ + ID3D10Texture3D *d3d10_texture; + D3D11_TEXTURE3D_DESC desc; + ID3D11Texture3D *texture; + IDXGISurface *surface; + ID3D11Device *device; + unsigned int i; + ULONG refcount; + HRESULT hr; + + static const struct test + { + BOOL implements_d3d10_interfaces; + UINT bind_flags; + UINT misc_flags; + UINT expected_bind_flags; + UINT expected_misc_flags; + } + desc_conversion_tests[] = + { + { + TRUE, + D3D11_BIND_SHADER_RESOURCE, 0, + D3D10_BIND_SHADER_RESOURCE, 0 + }, + { + TRUE, + D3D11_BIND_UNORDERED_ACCESS, 0, + D3D11_BIND_UNORDERED_ACCESS, 0 + }, + { + FALSE, + 0, D3D11_RESOURCE_MISC_RESOURCE_CLAMP, + 0, 0 + }, + { + TRUE, + 0, D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX, + 0, D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX + }, + }; + + if (!(device = create_device(NULL))) + { + skip("Failed to create ID3D11Device.\n"); + return; + } + + desc.Width = 64; + desc.Height = 64; + desc.Depth = 64; + desc.MipLevels = 0; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_RENDER_TARGET; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + hr = ID3D11Device_CreateTexture3D(device, &desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 3d texture, hr %#x.\n", hr); + + hr = ID3D11Texture3D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(hr == E_NOINTERFACE, "Texture should not implement IDXGISurface.\n"); + + hr = ID3D11Texture3D_QueryInterface(texture, &IID_ID3D10Texture3D, (void **)&d3d10_texture); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Texture should implement ID3D10Texture3D.\n"); + if (SUCCEEDED(hr)) ID3D10Texture3D_Release(d3d10_texture); + ID3D11Texture3D_Release(texture); + + if (FAILED(hr)) + { + win_skip("3D textures do not implement ID3D10Texture3D.\n"); + ID3D11Device_Release(device); + return; + } + + for (i = 0; i < sizeof(desc_conversion_tests) / sizeof(*desc_conversion_tests); ++i) + { + const struct test *current = &desc_conversion_tests[i]; + D3D10_TEXTURE3D_DESC d3d10_desc; + ID3D10Device *d3d10_device; + + desc.Width = 64; + desc.Height = 64; + desc.Depth = 64; + desc.MipLevels = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = current->bind_flags; + desc.CPUAccessFlags = 0; + desc.MiscFlags = current->misc_flags; + + hr = ID3D11Device_CreateTexture3D(device, &desc, NULL, &texture); + /* Shared resources are not supported by REF and WARP devices. */ + ok(SUCCEEDED(hr) || broken(hr == E_OUTOFMEMORY), + "Test %u: Failed to create a 3d texture, hr %#x.\n", i, hr); + if (FAILED(hr)) + { + win_skip("Failed to create ID3D11Texture3D, skipping test %u.\n", i); + continue; + } + + hr = ID3D11Texture3D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(hr == E_NOINTERFACE, "Texture should not implement IDXGISurface.\n"); + + hr = ID3D11Texture3D_QueryInterface(texture, &IID_ID3D10Texture3D, (void **)&d3d10_texture); + ID3D11Texture3D_Release(texture); + + if (current->implements_d3d10_interfaces) + { + ok(SUCCEEDED(hr), "Test %u: Texture should implement ID3D10Texture3D.\n", i); + } + else + { + todo_wine ok(hr == E_NOINTERFACE, "Test %u: Texture should not implement ID3D10Texture3D.\n", i); + if (SUCCEEDED(hr)) ID3D10Texture3D_Release(d3d10_texture); + continue; + } + + ID3D10Texture3D_GetDesc(d3d10_texture, &d3d10_desc); + + ok(d3d10_desc.Width == desc.Width, + "Test %u: Got unexpected Width %u.\n", i, d3d10_desc.Width); + ok(d3d10_desc.Height == desc.Height, + "Test %u: Got unexpected Height %u.\n", i, d3d10_desc.Height); + ok(d3d10_desc.Depth == desc.Depth, + "Test %u: Got unexpected Depth %u.\n", i, d3d10_desc.Depth); + ok(d3d10_desc.MipLevels == desc.MipLevels, + "Test %u: Got unexpected MipLevels %u.\n", i, d3d10_desc.MipLevels); + ok(d3d10_desc.Format == desc.Format, + "Test %u: Got unexpected Format %u.\n", i, d3d10_desc.Format); + ok(d3d10_desc.Usage == (D3D10_USAGE)desc.Usage, + "Test %u: Got unexpected Usage %u.\n", i, d3d10_desc.Usage); + ok(d3d10_desc.BindFlags == current->expected_bind_flags, + "Test %u: Got unexpected BindFlags %#x.\n", i, d3d10_desc.BindFlags); + ok(d3d10_desc.CPUAccessFlags == desc.CPUAccessFlags, + "Test %u: Got unexpected CPUAccessFlags %#x.\n", i, d3d10_desc.CPUAccessFlags); + ok(d3d10_desc.MiscFlags == current->expected_misc_flags, + "Test %u: Got unexpected MiscFlags %#x.\n", i, d3d10_desc.MiscFlags); + + d3d10_device = (ID3D10Device *)0xdeadbeef; + ID3D10Texture3D_GetDevice(d3d10_texture, &d3d10_device); + todo_wine ok(!d3d10_device, "Test %u: Got unexpected device pointer %p, expected NULL.\n", i, d3d10_device); + if (d3d10_device) ID3D10Device_Release(d3d10_device); + + ID3D10Texture3D_Release(d3d10_texture); + } + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(d3d11) { test_create_device(); @@ -495,4 +649,5 @@ START_TEST(d3d11) test_create_texture2d(); test_texture2d_interfaces(); test_create_texture3d(); + test_texture3d_interfaces(); } From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_{get, set}_private_data functions to d3d_{get, set}_private_data. Message-ID: Module: wine Branch: master Commit: 1bc74139468e51f527a941a42c5e352b5f34a090 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1bc74139468e51f527a941a42c5e352b5f34a090 Author: J?zef Kucia Date: Thu Sep 3 00:06:50 2015 +0200 d3d11: Rename d3d10_{get, set}_private_data functions to d3d_{get, set}_private_data. --- dlls/d3d11/async.c | 6 +++--- dlls/d3d11/buffer.c | 6 +++--- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/inputlayout.c | 6 +++--- dlls/d3d11/shader.c | 18 +++++++++--------- dlls/d3d11/state.c | 24 ++++++++++++------------ dlls/d3d11/texture.c | 12 ++++++------ dlls/d3d11/utils.c | 8 ++++---- dlls/d3d11/view.c | 18 +++++++++--------- 9 files changed, 52 insertions(+), 52 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=1bc74139468e51f527a941a42c5e352b5f34a090 From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement private data methods for ID3D11Texture3D. Message-ID: Module: wine Branch: master Commit: 3f5d0fab9c298576dffeddde49275f3133985329 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3f5d0fab9c298576dffeddde49275f3133985329 Author: J?zef Kucia Date: Thu Sep 3 00:06:51 2015 +0200 d3d11: Implement private data methods for ID3D11Texture3D. --- dlls/d3d11/texture.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index aa4beaf..dbb9a27 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -1,5 +1,6 @@ /* * Copyright 2009 Henri Verbeet for CodeWeavers + * Copyright 2015 J?zef Kucia for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -640,25 +641,31 @@ static void STDMETHODCALLTYPE d3d11_texture3d_GetDevice(ID3D11Texture3D *iface, static HRESULT STDMETHODCALLTYPE d3d11_texture3d_GetPrivateData(ID3D11Texture3D *iface, REFGUID guid, UINT *data_size, void *data) { - FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return E_NOTIMPL; + return d3d_get_private_data(&texture->private_store, guid, data_size, data); } static HRESULT STDMETHODCALLTYPE d3d11_texture3d_SetPrivateData(ID3D11Texture3D *iface, REFGUID guid, UINT data_size, const void *data) { - FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return E_NOTIMPL; + return d3d_set_private_data(&texture->private_store, guid, data_size, data); } static HRESULT STDMETHODCALLTYPE d3d11_texture3d_SetPrivateDataInterface(ID3D11Texture3D *iface, REFGUID guid, const IUnknown *data) { - FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data); + struct d3d_texture3d *texture = impl_from_ID3D11Texture3D(iface); - return E_NOTIMPL; + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&texture->private_store, guid, data); } static void STDMETHODCALLTYPE d3d11_texture3d_GetType(ID3D11Texture3D *iface, From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_buffer to d3d_buffer. Message-ID: Module: wine Branch: master Commit: 9c907997f002ccd83b40944d70d0b3d814c8e674 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9c907997f002ccd83b40944d70d0b3d814c8e674 Author: J?zef Kucia Date: Thu Sep 3 00:06:52 2015 +0200 d3d11: Rename d3d10_buffer to d3d_buffer. --- dlls/d3d11/buffer.c | 28 ++++++++++++++-------------- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 28 ++++++++++++++-------------- 3 files changed, 31 insertions(+), 31 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=9c907997f002ccd83b40944d70d0b3d814c8e674 From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Add ID3D11Buffer interface stub. Message-ID: Module: wine Branch: master Commit: 9abc17dcce2283ab4e59a1aac44b5b6a80bcda10 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9abc17dcce2283ab4e59a1aac44b5b6a80bcda10 Author: J?zef Kucia Date: Thu Sep 3 00:06:53 2015 +0200 d3d11: Add ID3D11Buffer interface stub. --- dlls/d3d11/buffer.c | 149 ++++++++++++++++++++++++++++++++++++++++----- dlls/d3d11/d3d11_private.h | 3 +- 2 files changed, 137 insertions(+), 15 deletions(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index cf97712..d0655a2 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -24,36 +24,47 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d11); -static inline struct d3d_buffer *impl_from_ID3D10Buffer(ID3D10Buffer *iface) +/* ID3D11Buffer methods */ + +static inline struct d3d_buffer *impl_from_ID3D11Buffer(ID3D11Buffer *iface) { - return CONTAINING_RECORD(iface, struct d3d_buffer, ID3D10Buffer_iface); + return CONTAINING_RECORD(iface, struct d3d_buffer, ID3D11Buffer_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_buffer_QueryInterface(ID3D10Buffer *iface, REFIID riid, void **out) +static HRESULT STDMETHODCALLTYPE d3d11_buffer_QueryInterface(ID3D11Buffer *iface, REFIID riid, void **out) { + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); - if (IsEqualGUID(riid, &IID_ID3D10Buffer) - || IsEqualGUID(riid, &IID_ID3D10Resource) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + if (IsEqualGUID(riid, &IID_ID3D11Buffer) + || IsEqualGUID(riid, &IID_ID3D11Resource) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11Buffer_AddRef(iface); *out = iface; return S_OK; } - WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + if (IsEqualGUID(riid, &IID_ID3D10Buffer) + || IsEqualGUID(riid, &IID_ID3D10Resource) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + ID3D10Buffer_AddRef(&buffer->ID3D10Buffer_iface); + *out = &buffer->ID3D10Buffer_iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *out = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_buffer_AddRef(ID3D10Buffer *iface) +static ULONG STDMETHODCALLTYPE d3d11_buffer_AddRef(ID3D11Buffer *iface) { - struct d3d_buffer *buffer = impl_from_ID3D10Buffer(iface); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); ULONG refcount = InterlockedIncrement(&buffer->refcount); TRACE("%p increasing refcount to %u.\n", buffer, refcount); @@ -69,9 +80,9 @@ static ULONG STDMETHODCALLTYPE d3d10_buffer_AddRef(ID3D10Buffer *iface) return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_buffer_Release(ID3D10Buffer *iface) +static ULONG STDMETHODCALLTYPE d3d11_buffer_Release(ID3D11Buffer *iface) { - struct d3d_buffer *buffer = impl_from_ID3D10Buffer(iface); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); ULONG refcount = InterlockedDecrement(&buffer->refcount); TRACE("%p decreasing refcount to %u.\n", buffer, refcount); @@ -91,6 +102,115 @@ static ULONG STDMETHODCALLTYPE d3d10_buffer_Release(ID3D10Buffer *iface) return refcount; } +static void STDMETHODCALLTYPE d3d11_buffer_GetDevice(ID3D11Buffer *iface, ID3D11Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_buffer_GetPrivateData(ID3D11Buffer *iface, + REFGUID guid, UINT *data_size, void *data) +{ + FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_buffer_SetPrivateData(ID3D11Buffer *iface, + REFGUID guid, UINT data_size, const void *data) +{ + FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_buffer_SetPrivateDataInterface(ID3D11Buffer *iface, + REFGUID guid, const IUnknown *data) +{ + FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data); + + return E_NOTIMPL; +} + +static void STDMETHODCALLTYPE d3d11_buffer_GetType(ID3D11Buffer *iface, + D3D11_RESOURCE_DIMENSION *resource_dimension) +{ + TRACE("iface %p, resource_dimension %p.\n", iface, resource_dimension); + + *resource_dimension = D3D11_RESOURCE_DIMENSION_BUFFER; +} + +static void STDMETHODCALLTYPE d3d11_buffer_SetEvictionPriority(ID3D11Buffer *iface, UINT eviction_priority) +{ + FIXME("iface %p, eviction_priority %#x stub!\n", iface, eviction_priority); +} + +static UINT STDMETHODCALLTYPE d3d11_buffer_GetEvictionPriority(ID3D11Buffer *iface) +{ + FIXME("iface %p stub!\n", iface); + + return 0; +} + +static void STDMETHODCALLTYPE d3d11_buffer_GetDesc(ID3D11Buffer *iface, D3D11_BUFFER_DESC *desc) +{ + FIXME("iface %p, desc %p stub!\n", iface, desc); +} + +static const struct ID3D11BufferVtbl d3d11_buffer_vtbl = +{ + /* IUnknown methods */ + d3d11_buffer_QueryInterface, + d3d11_buffer_AddRef, + d3d11_buffer_Release, + /* ID3D11DeviceChild methods */ + d3d11_buffer_GetDevice, + d3d11_buffer_GetPrivateData, + d3d11_buffer_SetPrivateData, + d3d11_buffer_SetPrivateDataInterface, + /* ID3D11Resource methods */ + d3d11_buffer_GetType, + d3d11_buffer_SetEvictionPriority, + d3d11_buffer_GetEvictionPriority, + /* ID3D11Buffer methods */ + d3d11_buffer_GetDesc, +}; + +/* ID3D10Buffer methods */ + +static inline struct d3d_buffer *impl_from_ID3D10Buffer(ID3D10Buffer *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_buffer, ID3D10Buffer_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_buffer_QueryInterface(ID3D10Buffer *iface, REFIID riid, void **out) +{ + struct d3d_buffer *buffer = impl_from_ID3D10Buffer(iface); + + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + return d3d11_buffer_QueryInterface(&buffer->ID3D11Buffer_iface, riid, out); +} + +static ULONG STDMETHODCALLTYPE d3d10_buffer_AddRef(ID3D10Buffer *iface) +{ + struct d3d_buffer *buffer = impl_from_ID3D10Buffer(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_buffer_AddRef(&buffer->ID3D11Buffer_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_buffer_Release(ID3D10Buffer *iface) +{ + struct d3d_buffer *buffer = impl_from_ID3D10Buffer(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_buffer_Release(&buffer->ID3D11Buffer_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_buffer_GetDevice(ID3D10Buffer *iface, ID3D10Device **device) @@ -240,6 +360,7 @@ HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, struct wined3d_buffer_desc wined3d_desc; HRESULT hr; + buffer->ID3D11Buffer_iface.lpVtbl = &d3d11_buffer_vtbl; buffer->ID3D10Buffer_iface.lpVtbl = &d3d10_buffer_vtbl; buffer->refcount = 1; wined3d_mutex_lock(); diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 8d2224b..12e4df2 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -133,9 +133,10 @@ struct d3d_texture3d HRESULT d3d_texture3d_create(struct d3d_device *device, const D3D11_TEXTURE3D_DESC *desc, const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture3d **texture) DECLSPEC_HIDDEN; -/* ID3D10Buffer */ +/* ID3D11Buffer, ID3D10Buffer */ struct d3d_buffer { + ID3D11Buffer ID3D11Buffer_iface; ID3D10Buffer ID3D10Buffer_iface; LONG refcount; From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement private data methods for ID3D11Buffer. Message-ID: Module: wine Branch: master Commit: c05e8d14606c2fd1860618bab5314f67b77f7fc2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c05e8d14606c2fd1860618bab5314f67b77f7fc2 Author: J?zef Kucia Date: Thu Sep 3 00:06:54 2015 +0200 d3d11: Implement private data methods for ID3D11Buffer. --- dlls/d3d11/buffer.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index d0655a2..6fec784 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -110,25 +110,31 @@ static void STDMETHODCALLTYPE d3d11_buffer_GetDevice(ID3D11Buffer *iface, ID3D11 static HRESULT STDMETHODCALLTYPE d3d11_buffer_GetPrivateData(ID3D11Buffer *iface, REFGUID guid, UINT *data_size, void *data) { - FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return E_NOTIMPL; + return d3d_get_private_data(&buffer->private_store, guid, data_size, data); } static HRESULT STDMETHODCALLTYPE d3d11_buffer_SetPrivateData(ID3D11Buffer *iface, REFGUID guid, UINT data_size, const void *data) { - FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); - return E_NOTIMPL; + return d3d_set_private_data(&buffer->private_store, guid, data_size, data); } static HRESULT STDMETHODCALLTYPE d3d11_buffer_SetPrivateDataInterface(ID3D11Buffer *iface, REFGUID guid, const IUnknown *data) { - FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); - return E_NOTIMPL; + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&buffer->private_store, guid, data); } static void STDMETHODCALLTYPE d3d11_buffer_GetType(ID3D11Buffer *iface, From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_buffer_GetDevice (). Message-ID: Module: wine Branch: master Commit: ba9d80bacd7d96ef7469a62f53a0072a5c384646 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ba9d80bacd7d96ef7469a62f53a0072a5c384646 Author: J?zef Kucia Date: Thu Sep 3 00:06:55 2015 +0200 d3d11: Implement d3d11_buffer_GetDevice(). --- dlls/d3d11/buffer.c | 19 +++++++++++-------- dlls/d3d11/d3d11_private.h | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index 6fec784..d2e3156 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -71,7 +71,7 @@ static ULONG STDMETHODCALLTYPE d3d11_buffer_AddRef(ID3D11Buffer *iface) if (refcount == 1) { - ID3D10Device1_AddRef(buffer->device); + ID3D11Device_AddRef(buffer->device); wined3d_mutex_lock(); wined3d_buffer_incref(buffer->wined3d_buffer); wined3d_mutex_unlock(); @@ -89,14 +89,14 @@ static ULONG STDMETHODCALLTYPE d3d11_buffer_Release(ID3D11Buffer *iface) if (!refcount) { - ID3D10Device1 *device = buffer->device; + ID3D11Device *device = buffer->device; wined3d_mutex_lock(); wined3d_buffer_decref(buffer->wined3d_buffer); wined3d_mutex_unlock(); /* Release the device last, it may cause the wined3d device to be * destroyed. */ - ID3D10Device1_Release(device); + ID3D11Device_Release(device); } return refcount; @@ -104,7 +104,11 @@ static ULONG STDMETHODCALLTYPE d3d11_buffer_Release(ID3D11Buffer *iface) static void STDMETHODCALLTYPE d3d11_buffer_GetDevice(ID3D11Buffer *iface, ID3D11Device **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = buffer->device; } static HRESULT STDMETHODCALLTYPE d3d11_buffer_GetPrivateData(ID3D11Buffer *iface, @@ -225,8 +229,7 @@ static void STDMETHODCALLTYPE d3d10_buffer_GetDevice(ID3D10Buffer *iface, ID3D10 TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)buffer->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(buffer->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_buffer_GetPrivateData(ID3D10Buffer *iface, @@ -389,8 +392,8 @@ HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, } wined3d_mutex_unlock(); - buffer->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(buffer->device); + buffer->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(buffer->device); return S_OK; } diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 12e4df2..2f56a5a 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -142,7 +142,7 @@ struct d3d_buffer struct wined3d_private_store private_store; struct wined3d_buffer *wined3d_buffer; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Return a texture from wined3d_swapchain_get_back_buffer. Message-ID: Module: wine Branch: master Commit: f010e5d88a91f0c6a66ff51d9b26930f1fa0753d URL: http://source.winehq.org/git/wine.git/?a=commit;h=f010e5d88a91f0c6a66ff51d9b26930f1fa0753d Author: Stefan D?singer Date: Thu Sep 3 12:52:52 2015 +0200 wined3d: Return a texture from wined3d_swapchain_get_back_buffer. --- dlls/d3d8/swapchain.c | 15 ++++++++++++--- dlls/d3d9/swapchain.c | 19 ++++++++++++++----- dlls/dxgi/swapchain.c | 12 ++++++------ dlls/wined3d/device.c | 6 +++++- dlls/wined3d/swapchain.c | 4 ++-- include/wine/wined3d.h | 2 +- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c index 44fc02a..70b7fb0 100644 --- a/dlls/d3d8/swapchain.c +++ b/dlls/d3d8/swapchain.c @@ -112,23 +112,32 @@ static HRESULT WINAPI d3d8_swapchain_GetBackBuffer(IDirect3DSwapChain8 *iface, UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface8 **backbuffer) { struct d3d8_swapchain *swapchain = impl_from_IDirect3DSwapChain8(iface); - struct wined3d_surface *wined3d_surface = NULL; + struct wined3d_resource *wined3d_resource; + struct wined3d_texture *wined3d_texture; struct d3d8_surface *surface_impl; HRESULT hr = D3D_OK; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + if (!backbuffer) + { + WARN("The output pointer is NULL, returning D3DERR_INVALIDCALL.\n"); + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); - if ((wined3d_surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, + if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) { - surface_impl = wined3d_surface_get_parent(wined3d_surface); + wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); + surface_impl = wined3d_resource_get_parent(wined3d_resource); *backbuffer = &surface_impl->IDirect3DSurface8_iface; IDirect3DSurface8_AddRef(*backbuffer); } else { + /* Do not set *backbuffer = NULL, see tests/device.c, test_swapchain(). */ hr = D3DERR_INVALIDCALL; } wined3d_mutex_unlock(); diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c index 5cf56d2..b26a482 100644 --- a/dlls/d3d9/swapchain.c +++ b/dlls/d3d9/swapchain.c @@ -152,23 +152,32 @@ static HRESULT WINAPI d3d9_swapchain_GetBackBuffer(IDirect3DSwapChain9Ex *iface, UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface9 **backbuffer) { struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9Ex(iface); - struct wined3d_surface *wined3d_surface = NULL; + struct wined3d_resource *wined3d_resource; + struct wined3d_texture *wined3d_texture; struct d3d9_surface *surface_impl; HRESULT hr = D3D_OK; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + if (!backbuffer) + { + WARN("The output pointer is NULL, returning D3DERR_INVALIDCALL.\n"); + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); - if ((wined3d_surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, + if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) { - surface_impl = wined3d_surface_get_parent(wined3d_surface); - *backbuffer = &surface_impl->IDirect3DSurface9_iface; - IDirect3DSurface9_AddRef(*backbuffer); + wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); + surface_impl = wined3d_resource_get_parent(wined3d_resource); + *backbuffer = &surface_impl->IDirect3DSurface9_iface; + IDirect3DSurface9_AddRef(*backbuffer); } else { + /* Do not set *backbuffer = NULL, see tests/device.c, test_swapchain(). */ hr = D3DERR_INVALIDCALL; } wined3d_mutex_unlock(); diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index ce09450..10ae26d 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -143,7 +143,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, UINT buffer_idx, REFIID riid, void **surface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); - struct wined3d_surface *backbuffer; + struct wined3d_texture *texture; IUnknown *parent; HRESULT hr; @@ -152,14 +152,14 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, EnterCriticalSection(&dxgi_cs); - if (!(backbuffer = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, + if (!(texture = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, buffer_idx, WINED3D_BACKBUFFER_TYPE_MONO))) { LeaveCriticalSection(&dxgi_cs); return DXGI_ERROR_INVALID_CALL; } - parent = wined3d_surface_get_parent(backbuffer); + parent = wined3d_texture_get_parent(texture); hr = IUnknown_QueryInterface(parent, riid, surface); LeaveCriticalSection(&dxgi_cs); @@ -220,7 +220,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *if { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface); struct wined3d_swapchain_desc wined3d_desc; - struct wined3d_surface *surface; + struct wined3d_texture *texture; IUnknown *parent; unsigned int i; HRESULT hr; @@ -235,9 +235,9 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *if wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); for (i = 0; i < wined3d_desc.backbuffer_count; ++i) { - surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, + texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, i, WINED3D_BACKBUFFER_TYPE_MONO); - parent = wined3d_surface_get_parent(surface); + parent = wined3d_texture_get_parent(texture); IUnknown_AddRef(parent); if (IUnknown_Release(parent)) { diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f8b9666..dcc5d37 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3186,6 +3186,8 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d HRESULT CDECL wined3d_device_get_back_buffer(const struct wined3d_device *device, UINT swapchain_idx, UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type, struct wined3d_surface **backbuffer) { + struct wined3d_texture *texture; + struct wined3d_resource *resource; struct wined3d_swapchain *swapchain; TRACE("device %p, swapchain_idx %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", @@ -3194,8 +3196,10 @@ HRESULT CDECL wined3d_device_get_back_buffer(const struct wined3d_device *device if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx))) return WINED3DERR_INVALIDCALL; - if (!(*backbuffer = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type))) + if (!(texture = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type))) return WINED3DERR_INVALIDCALL; + resource = wined3d_texture_get_sub_resource(texture, 0); + *backbuffer = wined3d_surface_from_resource(resource); return WINED3D_OK; } diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 70f5d5c..600c9bd 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -177,7 +177,7 @@ HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapc return wined3d_surface_blt(dst_surface, &dst_rect, src_surface, &src_rect, 0, NULL, WINED3D_TEXF_POINT); } -struct wined3d_surface * CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, +struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT back_buffer_idx, enum wined3d_backbuffer_type type) { TRACE("swapchain %p, back_buffer_idx %u, type %#x.\n", @@ -198,7 +198,7 @@ struct wined3d_surface * CDECL wined3d_swapchain_get_back_buffer(const struct wi TRACE("Returning back buffer %p.\n", swapchain->back_buffers[back_buffer_idx]); - return surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[back_buffer_idx], 0)); + return swapchain->back_buffers[back_buffer_idx]; } HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 8970cd5..41384b5 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2513,7 +2513,7 @@ HRESULT __cdecl wined3d_surface_update_overlay_z_order(struct wined3d_surface *s HRESULT __cdecl wined3d_swapchain_create(struct wined3d_device *device, struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain); ULONG __cdecl wined3d_swapchain_decref(struct wined3d_swapchain *swapchain); -struct wined3d_surface * __cdecl wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, +struct wined3d_texture * __cdecl wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type); struct wined3d_device * __cdecl wined3d_swapchain_get_device(const struct wined3d_swapchain *swapchain); HRESULT __cdecl wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain, From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Remove wined3d_device_get_back_buffer. Message-ID: Module: wine Branch: master Commit: feb35006f514c48fbda6b0609d1ac36e889746a4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=feb35006f514c48fbda6b0609d1ac36e889746a4 Author: Stefan D?singer Date: Thu Sep 3 12:52:53 2015 +0200 wined3d: Remove wined3d_device_get_back_buffer. --- dlls/d3d8/device.c | 33 +++++++++++++++++++++++---------- dlls/d3d9/device.c | 35 +++++++++++++++++++++++++---------- dlls/wined3d/device.c | 20 -------------------- dlls/wined3d/wined3d.spec | 1 - include/wine/wined3d.h | 2 -- 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 8200119..336a07c 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -724,25 +724,38 @@ static HRESULT WINAPI d3d8_device_GetBackBuffer(IDirect3DDevice8 *iface, UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface8 **backbuffer) { struct d3d8_device *device = impl_from_IDirect3DDevice8(iface); - struct wined3d_surface *wined3d_surface = NULL; + struct wined3d_swapchain *swapchain; + struct wined3d_resource *wined3d_resource; + struct wined3d_texture *wined3d_texture; struct d3d8_surface *surface_impl; - HRESULT hr; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + /* No need to check for backbuffer == NULL, Windows crashes in that case. */ wined3d_mutex_lock(); - hr = wined3d_device_get_back_buffer(device->wined3d_device, 0, backbuffer_idx, - (enum wined3d_backbuffer_type)backbuffer_type, &wined3d_surface); - if (SUCCEEDED(hr) && wined3d_surface && backbuffer) + if (!(swapchain = wined3d_device_get_swapchain(device->wined3d_device, 0))) { - surface_impl = wined3d_surface_get_parent(wined3d_surface); - *backbuffer = &surface_impl->IDirect3DSurface8_iface; - IDirect3DSurface8_AddRef(*backbuffer); + wined3d_mutex_unlock(); + *backbuffer = NULL; + return D3DERR_INVALIDCALL; } - wined3d_mutex_unlock(); - return hr; + if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain, + backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) + { + wined3d_mutex_unlock(); + *backbuffer = NULL; + return D3DERR_INVALIDCALL; + } + + wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); + surface_impl = wined3d_resource_get_parent(wined3d_resource); + *backbuffer = &surface_impl->IDirect3DSurface8_iface; + IDirect3DSurface8_AddRef(*backbuffer); + + wined3d_mutex_unlock(); + return D3D_OK; } static HRESULT WINAPI d3d8_device_GetRasterStatus(IDirect3DDevice8 *iface, D3DRASTER_STATUS *raster_status) diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 95d1e02..5640bdd 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -746,26 +746,41 @@ static HRESULT WINAPI d3d9_device_GetBackBuffer(IDirect3DDevice9Ex *iface, UINT UINT backbuffer_idx, D3DBACKBUFFER_TYPE backbuffer_type, IDirect3DSurface9 **backbuffer) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); - struct wined3d_surface *wined3d_surface = NULL; + struct wined3d_swapchain *wined3d_swapchain; + struct wined3d_resource *wined3d_resource; + struct wined3d_texture *wined3d_texture; struct d3d9_surface *surface_impl; - HRESULT hr; TRACE("iface %p, swapchain %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, swapchain, backbuffer_idx, backbuffer_type, backbuffer); + /* No need to check for backbuffer == NULL, Windows crashes in that case. */ wined3d_mutex_lock(); - hr = wined3d_device_get_back_buffer(device->wined3d_device, swapchain, - backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type, &wined3d_surface); - if (SUCCEEDED(hr) && wined3d_surface && backbuffer) + + if (!(wined3d_swapchain = wined3d_device_get_swapchain(device->wined3d_device, swapchain))) { - surface_impl = wined3d_surface_get_parent(wined3d_surface); - *backbuffer = &surface_impl->IDirect3DSurface9_iface; - IDirect3DSurface9_AddRef(*backbuffer); + wined3d_mutex_unlock(); + *backbuffer = NULL; + return D3DERR_INVALIDCALL; } - wined3d_mutex_unlock(); - return hr; + if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(wined3d_swapchain, + backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) + { + wined3d_mutex_unlock(); + *backbuffer = NULL; + return D3DERR_INVALIDCALL; + } + + wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); + surface_impl = wined3d_resource_get_parent(wined3d_resource); + *backbuffer = &surface_impl->IDirect3DSurface9_iface; + IDirect3DSurface9_AddRef(*backbuffer); + + wined3d_mutex_unlock(); + return D3D_OK; } + static HRESULT WINAPI d3d9_device_GetRasterStatus(IDirect3DDevice9Ex *iface, UINT swapchain, D3DRASTER_STATUS *raster_status) { diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index dcc5d37..765af0d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3183,26 +3183,6 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d return device->state.textures[stage]; } -HRESULT CDECL wined3d_device_get_back_buffer(const struct wined3d_device *device, UINT swapchain_idx, - UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type, struct wined3d_surface **backbuffer) -{ - struct wined3d_texture *texture; - struct wined3d_resource *resource; - struct wined3d_swapchain *swapchain; - - TRACE("device %p, swapchain_idx %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", - device, swapchain_idx, backbuffer_idx, backbuffer_type, backbuffer); - - if (!(swapchain = wined3d_device_get_swapchain(device, swapchain_idx))) - return WINED3DERR_INVALIDCALL; - - if (!(texture = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx, backbuffer_type))) - return WINED3DERR_INVALIDCALL; - resource = wined3d_texture_get_sub_resource(texture, 0); - *backbuffer = wined3d_surface_from_resource(resource); - return WINED3D_OK; -} - HRESULT CDECL wined3d_device_get_device_caps(const struct wined3d_device *device, WINED3DCAPS *caps) { TRACE("device %p, caps %p.\n", device, caps); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 4710f51..9f714ef 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -49,7 +49,6 @@ @ cdecl wined3d_device_end_stateblock(ptr ptr) @ cdecl wined3d_device_evict_managed_resources(ptr) @ cdecl wined3d_device_get_available_texture_mem(ptr) -@ cdecl wined3d_device_get_back_buffer(ptr long long long ptr) @ cdecl wined3d_device_get_base_vertex_index(ptr) @ cdecl wined3d_device_get_clip_plane(ptr long ptr) @ cdecl wined3d_device_get_clip_status(ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 41384b5..72a41b2 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2154,8 +2154,6 @@ HRESULT __cdecl wined3d_device_end_scene(struct wined3d_device *device); HRESULT __cdecl wined3d_device_end_stateblock(struct wined3d_device *device, struct wined3d_stateblock **stateblock); void __cdecl wined3d_device_evict_managed_resources(struct wined3d_device *device); UINT __cdecl wined3d_device_get_available_texture_mem(const struct wined3d_device *device); -HRESULT __cdecl wined3d_device_get_back_buffer(const struct wined3d_device *device, UINT swapchain_idx, - UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type, struct wined3d_surface **backbuffer); INT __cdecl wined3d_device_get_base_vertex_index(const struct wined3d_device *device); HRESULT __cdecl wined3d_device_get_clip_plane(const struct wined3d_device *device, UINT plane_idx, struct wined3d_vec4 *plane); From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d9/tests: Add more GetBackBuffer error handling tests. Message-ID: Module: wine Branch: master Commit: fc987aaaf6ceac1f66c5e41255d7fd425413a705 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc987aaaf6ceac1f66c5e41255d7fd425413a705 Author: Stefan D?singer Date: Thu Sep 3 12:52:54 2015 +0200 d3d9/tests: Add more GetBackBuffer error handling tests. --- dlls/d3d9/tests/device.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index d1a8d37..c41a5e6 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -1085,6 +1085,18 @@ static void test_swapchain(void) ok(d3dpp.BackBufferCount == 1, "Got unexpected back buffer count %u.\n", d3dpp.BackBufferCount); IDirect3DSwapChain9_Release(swapchain0); + hr = IDirect3DSwapChain9_GetBackBuffer(swapchain0, 0, D3DBACKBUFFER_TYPE_MONO, NULL); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + /* IDirect3DDevice9::GetBackBuffer crashes if a NULL output pointer is passed. */ + backbuffer = (void *)0xdeadbeef; + hr = IDirect3DDevice9_GetBackBuffer(device, 1, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + ok(!backbuffer, "The back buffer pointer is %p, expected NULL.\n", backbuffer); + backbuffer = (void *)0xdeadbeef; + hr = IDirect3DDevice9_GetBackBuffer(device, 0, 1, D3DBACKBUFFER_TYPE_MONO, &backbuffer); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + ok(!backbuffer, "The back buffer pointer is %p, expected NULL.\n", backbuffer); + /* Check if there is a back buffer */ hr = IDirect3DSwapChain9_GetBackBuffer(swapchain0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer); ok(SUCCEEDED(hr), "Failed to get the back buffer (%08x)\n", hr); From julliard at wine.codeweavers.com Thu Sep 3 07:34:28 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 03 Sep 2015 07:34:28 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d8/tests: Add more GetBackBuffer error handling tests. Message-ID: Module: wine Branch: master Commit: 76c43d817746bb9c81b36e0d0bec4bb0b2ffbdbb URL: http://source.winehq.org/git/wine.git/?a=commit;h=76c43d817746bb9c81b36e0d0bec4bb0b2ffbdbb Author: Stefan D?singer Date: Thu Sep 3 12:52:55 2015 +0200 d3d8/tests: Add more GetBackBuffer error handling tests. --- dlls/d3d8/tests/device.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 660e202..47326b5 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -280,6 +280,12 @@ static void test_swapchain(void) goto cleanup; } + backbuffer = (void *)0xdeadbeef; + /* IDirect3DDevice8::GetBackBuffer crashes if a NULL output pointer is passed. */ + hr = IDirect3DDevice8_GetBackBuffer(device, 1, D3DBACKBUFFER_TYPE_MONO, &backbuffer); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + ok(!backbuffer, "The back buffer pointer is %p, expected NULL.\n", backbuffer); + memset(&d3dpp, 0, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; @@ -300,6 +306,9 @@ static void test_swapchain(void) ok(SUCCEEDED(hr), "Failed to create a swapchain (%#08x)\n", hr); if(SUCCEEDED(hr)) { /* Swapchain 3, created with backbuffercount 2 */ + hr = IDirect3DSwapChain8_GetBackBuffer(swapchain3, 0, 0, NULL); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + backbuffer = (void *) 0xdeadbeef; hr = IDirect3DSwapChain8_GetBackBuffer(swapchain3, 0, 0, &backbuffer); ok(SUCCEEDED(hr), "Failed to get the 1st back buffer (%#08x)\n", hr); From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: =?UTF-8?Q?Lauri=20Kentt=C3=A4=20?=: po: Update Finnish translation. Message-ID: Module: wine Branch: master Commit: 4e82a2ea1c9c3d07bba7301af4392647803d81dc URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e82a2ea1c9c3d07bba7301af4392647803d81dc Author: Lauri Kentt? Date: Thu Sep 3 22:55:49 2015 +0300 po: Update Finnish translation. --- po/fi.po | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/po/fi.po b/po/fi.po index 213ba69..0c7fb6a 100644 --- a/po/fi.po +++ b/po/fi.po @@ -9904,14 +9904,12 @@ msgstr "" "/i K?ynnist? ohjelma tuoreilla ymp?rist?muuttujilla.\n" "/min K?ynnist? ohjelma pienennettyn?.\n" "/max K?ynnist? ohjelma suurennettuna.\n" -"/low K?ynnist? ohjelma matalassa prioriteettiluokassa.\n" -"/normal K?ynnist? ohjelma normaalissa prioriteettiluokassa.\n" -"/high K?ynnist? ohjelma korkeassa prioriteettiluokassa.\n" -"/realtime K?ynnist? ohjelma reaaliaikaisessa prioriteettiluokassa.\n" -"/abovenormal K?ynnist? ohjelma normaalia korkeammassa\n" -" prioriteettiluokassa.\n" -"/belownormal K?ynnist? ohjelma normaalia matalammassa\n" -" prioriteettiluokassa.\n" +"/low K?ynnist? ohjelma prioriteetilla 'matala'.\n" +"/normal K?ynnist? ohjelma prioriteetilla 'normaali'.\n" +"/high K?ynnist? ohjelma prioriteetilla 'korkea'.\n" +"/realtime K?ynnist? ohjelma prioriteetilla 'reaaliaikainen'.\n" +"/abovenormal K?ynnist? ohjelma prioriteetilla 'normaalia korkeampi'.\n" +"/belownormal K?ynnist? ohjelma prioriteetilla 'normaalia matalampi'.\n" "/node n K?ynnist? ohjelma m??r?tyll? NUMA-solmulla.\n" "/affinity peite K?ynnist? ohjelma m??r?tyll? affiniteettipeitteell?.\n" "/wait Odota, ett? ohjelma sulkeutuu, ja palauta sen paluuarvo.\n" @@ -12829,18 +12827,16 @@ msgstr "" #: uninstaller.rc:31 msgid "uninstaller: The application with GUID '%1' was not found\n" -msgstr "" +msgstr "uninstaller: Ei l?ydy ohjelmaa, jonka GUID olisi '%1'\n" #: uninstaller.rc:32 msgid "" "uninstaller: The option '--remove' must be followed by an application GUID\n" -msgstr "" +msgstr "uninstaller: Valitsinta '--remove' t?ytyy seurata ohjelman GUID\n" #: uninstaller.rc:33 -#, fuzzy -#| msgid "Error: Invalid option '%c'.\n" msgid "uninstaller: Invalid option [%1]\n" -msgstr "Virhe: Viallinen vaihtoehto '%c'.\n" +msgstr "uninstaller: Virheellinen valitsin [%1]\n" #: uninstaller.rc:35 msgid "" @@ -12849,6 +12845,10 @@ msgid "" "Uninstall applications from the current Wine prefix.\n" "\n" msgstr "" +"Winen ohjelmanpoistaja\n" +"\n" +"Poista ohjelmia nykyisest? Wine-prefiksist?.\n" +"\n" #: uninstaller.rc:43 msgid "" @@ -12863,6 +12863,16 @@ msgid "" " [no option] Launch the graphical version of this program.\n" "\n" msgstr "" +"K?ytt?:\n" +" uninstaller [valitsimet]\n" +"\n" +"Valitsimet:\n" +" --help\t N?yt? t?m? viesti.\n" +" --list\t Listaa t?h?n Wine-prefiksiin asennetut ohjelmat.\n" +" --remove {GUID} Poista valittu ohjelma.\n" +"\t\t K?yt? valitsinta '--list' GUIDin l?yt?miseen.\n" +" [ei valitsinta] K?ynnist? t?m?n ohjelman graafinen versio.\n" +"\n" #: view.rc:36 msgid "&Pan" From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Vincent Povirk : mscoree: Don't modify the PATH environment variable. Message-ID: Module: wine Branch: master Commit: 6df7366e4e4a0342ba347be054bc66565b13ca64 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6df7366e4e4a0342ba347be054bc66565b13ca64 Author: Vincent Povirk Date: Thu Sep 3 15:44:24 2015 -0500 mscoree: Don't modify the PATH environment variable. Wine Mono 4.5.4 eliminated the need for this. --- dlls/mscoree/metahost.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index fb0068d..5e32ecb 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -111,21 +111,6 @@ static MonoAssembly* mono_assembly_preload_hook_fn(MonoAssemblyName *aname, char static void mono_shutdown_callback_fn(MonoProfiler *prof); -static void set_environment(LPCWSTR bin_path) -{ - WCHAR path_env[MAX_PATH]; - int len; - - static const WCHAR pathW[] = {'P','A','T','H',0}; - - /* We have to modify PATH as Mono loads other DLLs from this directory. */ - GetEnvironmentVariableW(pathW, path_env, sizeof(path_env)/sizeof(WCHAR)); - len = strlenW(path_env); - path_env[len++] = ';'; - strcpyW(path_env+len, bin_path); - SetEnvironmentVariableW(pathW, path_env); -} - static MonoImage* CDECL image_open_module_handle_dummy(HMODULE module_handle, char* fname, UINT has_entry_point, MonoImageOpenStatus* status) { @@ -139,10 +124,9 @@ static void missing_runtime_message(void) static HRESULT load_mono(LPCWSTR mono_path) { - static const WCHAR bin[] = {'\\','b','i','n',0}; static const WCHAR lib[] = {'\\','l','i','b',0}; static const WCHAR etc[] = {'\\','e','t','c',0}; - WCHAR mono_dll_path[MAX_PATH+16], mono_bin_path[MAX_PATH+4]; + WCHAR mono_dll_path[MAX_PATH+16]; WCHAR mono_lib_path[MAX_PATH+4], mono_etc_path[MAX_PATH+4]; char mono_lib_path_a[MAX_PATH], mono_etc_path_a[MAX_PATH]; int trace_size; @@ -158,10 +142,6 @@ static HRESULT load_mono(LPCWSTR mono_path) if (!mono_handle) { - strcpyW(mono_bin_path, mono_path); - strcatW(mono_bin_path, bin); - set_environment(mono_bin_path); - strcpyW(mono_lib_path, mono_path); strcatW(mono_lib_path, lib); WideCharToMultiByte(CP_UTF8, 0, mono_lib_path, -1, mono_lib_path_a, MAX_PATH, NULL, NULL); From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Nikolay Sivov : dwrite: Make sure same files are scanned once when building font collection. Message-ID: Module: wine Branch: master Commit: b4ce95c1ab06ec57dd240d3501974db97ae73684 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4ce95c1ab06ec57dd240d3501974db97ae73684 Author: Nikolay Sivov Date: Thu Sep 3 23:52:22 2015 +0300 dwrite: Make sure same files are scanned once when building font collection. --- dlls/dwrite/font.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index baa5ace..a181395 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -2866,7 +2866,13 @@ static void fontfamily_add_oblique_simulated_face(struct dwrite_fontfamily_data HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system, IDWriteFontCollection **ret) { + struct fontfile_enum { + struct list entry; + IDWriteFontFile *file; + }; + struct fontfile_enum *fileenum, *fileenum2; struct dwrite_fontcollection *collection; + struct list scannedfiles; BOOL current = FALSE; HRESULT hr = S_OK; UINT32 i; @@ -2886,12 +2892,13 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat TRACE("building font collection:\n"); + list_init(&scannedfiles); while (hr == S_OK) { DWRITE_FONT_FACE_TYPE face_type; DWRITE_FONT_FILE_TYPE file_type; + BOOL supported, same = FALSE; IDWriteFontFile *file; UINT32 face_count; - BOOL supported; current = FALSE; hr = IDWriteFontFileEnumerator_MoveNext(enumerator, ¤t); @@ -2902,6 +2909,17 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat if (FAILED(hr)) break; + /* check if we've scanned this file already */ + LIST_FOR_EACH_ENTRY(fileenum, &scannedfiles, struct fontfile_enum, entry) { + if ((same = is_same_fontfile(fileenum->file, file))) + break; + } + + if (same) { + IDWriteFontFile_Release(file); + continue; + } + /* failed font files are skipped */ hr = IDWriteFontFile_Analyze(file, &supported, &file_type, &face_type, &face_count); if (FAILED(hr) || !supported || face_count == 0) { @@ -2911,6 +2929,11 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat continue; } + /* add to scanned list */ + fileenum = heap_alloc(sizeof(*fileenum)); + fileenum->file = file; + list_add_tail(&scannedfiles, &fileenum->entry); + for (i = 0; i < face_count; i++) { IDWriteLocalizedStrings *family_name = NULL; struct dwrite_font_data *font_data; @@ -2948,8 +2971,12 @@ HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerat if (FAILED(hr)) break; } + } - IDWriteFontFile_Release(file); + LIST_FOR_EACH_ENTRY_SAFE(fileenum, fileenum2, &scannedfiles, struct fontfile_enum, entry) { + IDWriteFontFile_Release(fileenum->file); + list_remove(&fileenum->entry); + heap_free(fileenum); } for (i = 0; i < collection->family_count; i++) { From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Bruno Jesus : quartz: Skip AVI bad chunks while looking for the LIST chunk. Message-ID: Module: wine Branch: master Commit: c49e9d085d905cdb2aac021dfefad7bc3f409b7e URL: http://source.winehq.org/git/wine.git/?a=commit;h=c49e9d085d905cdb2aac021dfefad7bc3f409b7e Author: Bruno Jesus <00cpxxx at gmail.com> Date: Thu Sep 3 23:12:58 2015 +0800 quartz: Skip AVI bad chunks while looking for the LIST chunk. --- dlls/quartz/avisplit.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index 6059511..d62ec2b 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -1109,24 +1109,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin, return E_FAIL; } - pos += sizeof(RIFFCHUNK) + list.cb; - hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); - - while (list.fcc == ckidAVIPADDING || (list.fcc == FOURCC_LIST && list.fccListType != listtypeAVIMOVIE)) + /* Skip any chunks until we find the LIST chunk */ + do { pos += sizeof(RIFFCHUNK) + list.cb; - hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); } + while (hr == S_OK && (list.fcc != FOURCC_LIST || + (list.fcc == FOURCC_LIST && list.fccListType != listtypeAVIMOVIE))); - if (list.fcc != FOURCC_LIST) - { - ERR("Expected LIST, but got %.04s\n", (LPSTR)&list.fcc); - return E_FAIL; - } - if (list.fccListType != listtypeAVIMOVIE) + if (hr != S_OK) { - ERR("Expected AVI movie list, but got %.04s\n", (LPSTR)&list.fccListType); + ERR("Failed to find LIST chunk from AVI file\n"); return E_FAIL; } @@ -1134,21 +1128,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin, /* FIXME: AVIX files are extended beyond the FOURCC chunk "AVI ", and thus won't be played here, * once I get one of the files I'll try to fix it */ - if (hr == S_OK) - { - This->rtStart = pAviSplit->CurrentChunkOffset = MEDIATIME_FROM_BYTES(pos + sizeof(RIFFLIST)); - pos += list.cb + sizeof(RIFFCHUNK); - - pAviSplit->EndOfFile = This->rtStop = MEDIATIME_FROM_BYTES(pos); - if (pos > total) - { - ERR("File smaller (%x%08x) then EndOfFile (%x%08x)\n", (DWORD)(total >> 32), (DWORD)total, (DWORD)(pAviSplit->EndOfFile >> 32), (DWORD)pAviSplit->EndOfFile); - return E_FAIL; - } + This->rtStart = pAviSplit->CurrentChunkOffset = MEDIATIME_FROM_BYTES(pos + sizeof(RIFFLIST)); + pos += list.cb + sizeof(RIFFCHUNK); - hr = IAsyncReader_SyncRead(This->pReader, BYTES_FROM_MEDIATIME(pAviSplit->CurrentChunkOffset), sizeof(pAviSplit->CurrentChunk), (BYTE *)&pAviSplit->CurrentChunk); + pAviSplit->EndOfFile = This->rtStop = MEDIATIME_FROM_BYTES(pos); + if (pos > total) + { + ERR("File smaller (%x%08x) then EndOfFile (%x%08x)\n", (DWORD)(total >> 32), (DWORD)total, (DWORD)(pAviSplit->EndOfFile >> 32), (DWORD)pAviSplit->EndOfFile); + return E_FAIL; } + hr = IAsyncReader_SyncRead(This->pReader, BYTES_FROM_MEDIATIME(pAviSplit->CurrentChunkOffset), sizeof(pAviSplit->CurrentChunk), (BYTE *)&pAviSplit->CurrentChunk); + props->cbAlign = 1; props->cbPrefix = 0; /* Comrades, prevent shortage of buffers, or you will feel the consequences! DA! */ From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Gerald Pfeifer : rpcrt4/tests: Cast to ULONGLONG instead of LONGLONG to avoid shift overflow. Message-ID: Module: wine Branch: master Commit: e6ca322fb15e09e9a4fcc37db86d21f4257e2fff URL: http://source.winehq.org/git/wine.git/?a=commit;h=e6ca322fb15e09e9a4fcc37db86d21f4257e2fff Author: Gerald Pfeifer Date: Fri Sep 4 00:39:24 2015 +0200 rpcrt4/tests: Cast to ULONGLONG instead of LONGLONG to avoid shift overflow. --- dlls/rpcrt4/tests/ndr_marshall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c index d6befe5..aeecf8c 100644 --- a/dlls/rpcrt4/tests/ndr_marshall.c +++ b/dlls/rpcrt4/tests/ndr_marshall.c @@ -965,7 +965,7 @@ static void test_simple_struct(void) s1.c = 0xa5; s1.l1 = 0xdeadbeef; s1.l2 = 0xcafebabe; - s1.ll = ((LONGLONG) 0xbadefeed << 32) | 0x2468ace0; + s1.ll = ((ULONGLONG) 0xbadefeed << 32) | 0x2468ace0; wiredatalen = 24; memcpy(wiredata, &s1, wiredatalen); From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Dmitry Timoshkov : msscript.ocx: Add missing 'vararg' attribute to the Run () methods. Message-ID: Module: wine Branch: master Commit: b6520ef6e7135c34a221c9efa88f09441a12c60b URL: http://source.winehq.org/git/wine.git/?a=commit;h=b6520ef6e7135c34a221c9efa88f09441a12c60b Author: Dmitry Timoshkov Date: Fri Sep 4 15:24:17 2015 +0800 msscript.ocx: Add missing 'vararg' attribute to the Run() methods. --- dlls/msscript.ocx/msscript.idl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/msscript.ocx/msscript.idl b/dlls/msscript.ocx/msscript.idl index 5090c8f..efc00ff 100644 --- a/dlls/msscript.ocx/msscript.idl +++ b/dlls/msscript.ocx/msscript.idl @@ -103,7 +103,7 @@ library MSScriptControl [id(0x07d2)] HRESULT ExecuteStatement([in] BSTR Statement); - [id(0x07d3)] + [id(0x07d3), vararg] HRESULT Run( [in] BSTR ProcedureName, [in] SAFEARRAY(VARIANT) *Parameters, @@ -234,7 +234,7 @@ library MSScriptControl [id(0x07d2)] HRESULT ExecuteStatement([in] BSTR Statement); - [id(0x07d3)] + [id(0x07d3), vararg] HRESULT Run( [in] BSTR ProcedureName, [in] SAFEARRAY(VARIANT) *Parameters, From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Dmitry Timoshkov : oleaut32/tests: Avoid using a reserved keyword ' _restrict' in an idl. Message-ID: Module: wine Branch: master Commit: 2952822effc71fd423e402c87aade7bcc1379f72 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2952822effc71fd423e402c87aade7bcc1379f72 Author: Dmitry Timoshkov Date: Fri Sep 4 15:24:28 2015 +0800 oleaut32/tests: Avoid using a reserved keyword '_restrict' in an idl. --- dlls/oleaut32/tests/tmarshal.c | 4 ++-- dlls/oleaut32/tests/tmarshal.idl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index a2fa6e8..e8d5e64 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -825,7 +825,7 @@ static HRESULT WINAPI Widget_put_prop_req_arg( return S_OK; } -static HRESULT WINAPI Widget__restrict(IWidget* iface, INT *i) +static HRESULT WINAPI Widget_pos_restrict(IWidget* iface, INT *i) { trace("restrict\n"); *i = DISPID_TM_RESTRICTED; @@ -875,7 +875,7 @@ static const struct IWidgetVtbl Widget_VTable = Widget_ByRefUInt, Widget_put_prop_opt_arg, Widget_put_prop_req_arg, - Widget__restrict, + Widget_pos_restrict, Widget_neg_restrict }; diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index bf90384..33a4df9 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -175,7 +175,7 @@ library TestTypelib HRESULT prop_req_arg([in] INT req, [in] INT i); [id(DISPID_TM_RESTRICTED), restricted] - HRESULT _restrict([out, retval] INT *i); + HRESULT pos_restrict([out, retval] INT *i); [id(DISPID_TM_NEG_RESTRICTED), restricted] HRESULT neg_restrict([out, retval] INT *i); From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Dmitry Timoshkov : oleaut32/tests: Add a test for calling a varargs method using typelib marshaller. Message-ID: Module: wine Branch: master Commit: c28244a92ed52649a876180115c817a590c324ca URL: http://source.winehq.org/git/wine.git/?a=commit;h=c28244a92ed52649a876180115c817a590c324ca Author: Dmitry Timoshkov Date: Fri Sep 4 15:24:34 2015 +0800 oleaut32/tests: Add a test for calling a varargs method using typelib marshaller. --- dlls/oleaut32/tests/tmarshal.c | 29 +++++++++++++++++++++++++++-- dlls/oleaut32/tests/tmarshal.idl | 3 +++ dlls/oleaut32/tests/tmarshal_dispids.h | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index e8d5e64..1893534 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -839,6 +839,13 @@ static HRESULT WINAPI Widget_neg_restrict(IWidget* iface, INT *i) return S_OK; } +static HRESULT WINAPI Widget_VarArg_Run( + IWidget *iface, BSTR name, SAFEARRAY *params, VARIANT *result) +{ + trace("VarArg_Run(%p,%p,%p)\n", name, params, result); + return S_OK; +} + static const struct IWidgetVtbl Widget_VTable = { Widget_QueryInterface, @@ -876,7 +883,8 @@ static const struct IWidgetVtbl Widget_VTable = Widget_put_prop_opt_arg, Widget_put_prop_req_arg, Widget_pos_restrict, - Widget_neg_restrict + Widget_neg_restrict, + Widget_VarArg_Run }; static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject) @@ -1492,7 +1500,7 @@ static void test_typelibmarshal(void) dispparams.rgdispidNamedArgs = NULL; dispparams.rgvarg = vararg; hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); - ok_ole_success(hr, ITypeInfo_Invoke); + ok_ole_success(hr, IDispatch_Invoke); /* call VarArg, even one (non-optional, non-safearray) named argument is not allowed */ dispidNamed = 0; @@ -1502,6 +1510,23 @@ static void test_typelibmarshal(void) ok(hr == DISP_E_NONAMEDARGS, "IDispatch_Invoke should have returned DISP_E_NONAMEDARGS instead of 0x%08x\n", hr); dispidNamed = DISPID_PROPERTYPUT; + /* call VarArg_Run */ + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(szCat); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_BSTR; + V_BSTR(&vararg[0]) = SysAllocString(NULL); + dispparams.cNamedArgs = 0; + dispparams.cArgs = 2; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = vararg; + hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); +todo_wine + ok_ole_success(hr, IDispatch_Invoke); + SysFreeString(V_BSTR(&vararg[1])); + SysFreeString(V_BSTR(&vararg[0])); + /* call Error */ dispparams.cNamedArgs = 0; dispparams.cArgs = 0; diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index 33a4df9..ff9cac3 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -179,6 +179,9 @@ library TestTypelib [id(DISPID_TM_NEG_RESTRICTED), restricted] HRESULT neg_restrict([out, retval] INT *i); + + [id(DISPID_TM_VARARG_RUN), vararg] + HRESULT VarArg_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) params, [out, retval] VARIANT *result); } [ diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h index 879d974..d603a56 100644 --- a/dlls/oleaut32/tests/tmarshal_dispids.h +++ b/dlls/oleaut32/tests/tmarshal_dispids.h @@ -44,6 +44,7 @@ #define DISPID_TM_RESTRICTED 25 #define DISPID_TM_NEG_RESTRICTED -26 #define DISPID_TM_TESTSECONDIFACE 27 +#define DISPID_TM_VARARG_RUN 28 #define DISPID_NOA_BSTRRET 1 #define DISPID_NOA_ERROR 2 From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Jactry Zeng : riched20: Repaint paragraph after undo format setting of the paragraph. Message-ID: Module: wine Branch: master Commit: 515b4a972561827cd954ee7ca34aaeb5a3621a74 URL: http://source.winehq.org/git/wine.git/?a=commit;h=515b4a972561827cd954ee7ca34aaeb5a3621a74 Author: Jactry Zeng Date: Fri Sep 4 15:54:18 2015 +0800 riched20: Repaint paragraph after undo format setting of the paragraph. --- dlls/riched20/undo.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/riched20/undo.c b/dlls/riched20/undo.c index 9db690e..7b22e6d 100644 --- a/dlls/riched20/undo.c +++ b/dlls/riched20/undo.c @@ -341,6 +341,7 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, struct undo_item *undo) add_undo_set_para_fmt( editor, ¶->member.para ); *para->member.para.pFmt = undo->u.set_para_fmt.fmt; para->member.para.border = undo->u.set_para_fmt.border; + para->member.para.nFlags |= MEPF_REWRAP; break; } case undo_set_char_fmt: From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Aric Stewart : hidclass.sys: Implement creating/destroying HID devices. Message-ID: Module: wine Branch: master Commit: 0aca2d7dc9d8b981422c7c2846301666d4b8d610 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0aca2d7dc9d8b981422c7c2846301666d4b8d610 Author: Aric Stewart Date: Tue Sep 1 15:02:13 2015 -0500 hidclass.sys: Implement creating/destroying HID devices. --- dlls/hidclass.sys/Makefile.in | 1 + dlls/hidclass.sys/device.c | 196 ++++++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 30 +++++++ dlls/hidclass.sys/parse.h | 72 ++++++++++++++++ include/ddk/hidport.h | 43 +++++++++ 5 files changed, 342 insertions(+) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=0aca2d7dc9d8b981422c7c2846301666d4b8d610 From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Nikolay Sivov : dwrite: Make CreateFontFace() fail with DWRITE_E_FILEFORMAT for supported types in case of type mismatch. Message-ID: Module: wine Branch: master Commit: fe848b26c7504b2178c02d1212a2172bfba798c6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fe848b26c7504b2178c02d1212a2172bfba798c6 Author: Nikolay Sivov Date: Fri Sep 4 12:15:41 2015 +0300 dwrite: Make CreateFontFace() fail with DWRITE_E_FILEFORMAT for supported types in case of type mismatch. --- dlls/dwrite/main.c | 5 ++++- dlls/dwrite/tests/font.c | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index ce4299c..c996827 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -818,9 +818,12 @@ static HRESULT WINAPI dwritefactory_CreateFontFace(IDWriteFactory2 *iface, if (FAILED(hr)) return hr; - if (!is_supported || (face_type != req_facetype)) + if (!is_supported) return E_FAIL; + if (face_type != req_facetype) + return DWRITE_E_FILEFORMAT; + hr = IDWriteFontFile_GetReferenceKey(*font_files, &key, &key_size); if (FAILED(hr)) return hr; diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 7617dbb..2a625d5 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -1307,12 +1307,11 @@ if (0) /* crashes on native */ /* try mismatching face type, the one that's not supported */ hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_CFF, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); -todo_wine ok(hr == DWRITE_E_FILEFORMAT, "got 0x%08x\n", hr); hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); - ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(hr == DWRITE_E_FILEFORMAT || broken(hr == E_FAIL) /* < win10 */, "got 0x%08x\n", hr); hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_RAW_CFF, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); todo_wine From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Nikolay Sivov : dwrite/tests: Fix some test failures on Win10. Message-ID: Module: wine Branch: master Commit: 8747fa2b9f6ca9546aec5817d95974100101ae55 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8747fa2b9f6ca9546aec5817d95974100101ae55 Author: Nikolay Sivov Date: Fri Sep 4 12:16:08 2015 +0300 dwrite/tests: Fix some test failures on Win10. --- dlls/dwrite/tests/font.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 2a625d5..dfe782d 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -1327,7 +1327,14 @@ todo_wine ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_UNKNOWN, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); - ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); +todo_wine + ok(hr == S_OK || broken(hr == E_INVALIDARG) /* < win10 */, "got 0x%08x\n", hr); + if (hr == S_OK) { + ok(fontface != NULL, "got %p\n", fontface); + face_type = IDWriteFontFace_GetType(fontface); + ok(face_type == DWRITE_FONT_FACE_TYPE_TRUETYPE, "got %d\n", face_type); + IDWriteFontFace_Release(fontface); + } IDWriteFontFile_Release(file); IDWriteFactory_Release(factory); @@ -1953,8 +1960,10 @@ static void test_CreateCustomFontFileReference(void) factory = create_factory(); factory2 = create_factory(); +if (0) { /* crashes on win10 */ hr = IDWriteFactory_RegisterFontFileLoader(factory, NULL); ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); +} hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IDWriteFactory_RegisterFontFileLoader(factory, &floader2); From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Jacek Caban : oleaut32: Ensure that we' re using the right interface in CreateStub implementation. Message-ID: Module: wine Branch: master Commit: af944cefdfb912eba0d17134f019b0be5b5f1729 URL: http://source.winehq.org/git/wine.git/?a=commit;h=af944cefdfb912eba0d17134f019b0be5b5f1729 Author: Jacek Caban Date: Fri Sep 4 11:49:30 2015 +0200 oleaut32: Ensure that we're using the right interface in CreateStub implementation. --- dlls/oleaut32/tmarshal.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c index a2d1ea1..6608aed 100644 --- a/dlls/oleaut32/tmarshal.c +++ b/dlls/oleaut32/tmarshal.c @@ -2282,6 +2282,7 @@ PSFacBuf_CreateStub( ITypeInfo *tinfo; TMStubImpl *stub; TYPEATTR *typeattr; + IUnknown *obj; TRACE("(%s,%p,%p)\n",debugstr_guid(riid),pUnkServer,ppStub); @@ -2291,16 +2292,26 @@ PSFacBuf_CreateStub( return hres; } + /* FIXME: This is not exactly right. We should probably call QI later. */ + hres = IUnknown_QueryInterface(pUnkServer, riid, (void**)&obj); + if (FAILED(hres)) { + WARN("Could not get %s iface: %08x\n", debugstr_guid(riid), hres); + obj = pUnkServer; + IUnknown_AddRef(obj); + } + stub = CoTaskMemAlloc(sizeof(TMStubImpl)); - if (!stub) + if (!stub) { + IUnknown_Release(obj); return E_OUTOFMEMORY; + } stub->IRpcStubBuffer_iface.lpVtbl = &tmstubvtbl; stub->ref = 1; stub->tinfo = tinfo; stub->dispatch_stub = NULL; stub->dispatch_derivative = FALSE; stub->iid = *riid; - hres = IRpcStubBuffer_Connect(&stub->IRpcStubBuffer_iface,pUnkServer); + hres = IRpcStubBuffer_Connect(&stub->IRpcStubBuffer_iface, obj); *ppStub = &stub->IRpcStubBuffer_iface; TRACE("IRpcStubBuffer: %p\n", stub); if (hres) @@ -2315,6 +2326,7 @@ PSFacBuf_CreateStub( ITypeInfo_ReleaseTypeAttr(tinfo, typeattr); } + IUnknown_Release(obj); return hres; } From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Jacek Caban : ole32: Use get_stub_manager_from_object in CoDisconnectObject. Message-ID: Module: wine Branch: master Commit: 38a9a232f7c079280a285cc50a3c18d18188e210 URL: http://source.winehq.org/git/wine.git/?a=commit;h=38a9a232f7c079280a285cc50a3c18d18188e210 Author: Jacek Caban Date: Fri Sep 4 11:50:19 2015 +0200 ole32: Use get_stub_manager_from_object in CoDisconnectObject. --- dlls/ole32/compobj.c | 8 +++++++- dlls/ole32/compobj_private.h | 1 - dlls/ole32/stubmanager.c | 25 ------------------------- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 23c825a..0d0459a 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -2019,6 +2019,7 @@ void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void) */ HRESULT WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved ) { + struct stub_manager *manager; HRESULT hr; IMarshal *marshal; APARTMENT *apt; @@ -2039,7 +2040,12 @@ HRESULT WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved ) if (!apt) return CO_E_NOTINITIALIZED; - apartment_disconnectobject(apt, lpUnk); + manager = get_stub_manager_from_object(apt, lpUnk, FALSE); + if (manager) { + /* Release stub manager twice, to remove the apartment reference. */ + stub_manager_int_release(manager); + stub_manager_int_release(manager); + } /* Note: native is pretty broken here because it just silently * fails, without returning an appropriate error code if the object was diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h index 9f56d47..c63d645 100644 --- a/dlls/ole32/compobj_private.h +++ b/dlls/ole32/compobj_private.h @@ -235,7 +235,6 @@ APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref) DECLSPEC_HIDDEN; APARTMENT *apartment_findfromtid(DWORD tid) DECLSPEC_HIDDEN; DWORD apartment_release(struct apartment *apt) DECLSPEC_HIDDEN; HRESULT apartment_disconnectproxies(struct apartment *apt) DECLSPEC_HIDDEN; -void apartment_disconnectobject(struct apartment *apt, void *object) DECLSPEC_HIDDEN; static inline HRESULT apartment_getoxid(const struct apartment *apt, OXID *oxid) { *oxid = apt->oxid; diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c index 668d46f..30e2054 100644 --- a/dlls/ole32/stubmanager.c +++ b/dlls/ole32/stubmanager.c @@ -356,31 +356,6 @@ struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, IUnknown *obj, return result; } -/* removes the apartment reference to an object, destroying it when no other - * threads have a reference to it */ -void apartment_disconnectobject(struct apartment *apt, void *object) -{ - BOOL found = FALSE; - struct stub_manager *stubmgr; - - EnterCriticalSection(&apt->cs); - LIST_FOR_EACH_ENTRY( stubmgr, &apt->stubmgrs, struct stub_manager, entry ) - { - if (stubmgr->object == object) - { - found = TRUE; - stub_manager_int_release(stubmgr); - break; - } - } - LeaveCriticalSection(&apt->cs); - - if (found) - TRACE("disconnect object %p\n", object); - else - WARN("couldn't find object %p\n", object); -} - /* gets the stub manager associated with an object id - caller must have * a reference to the apartment while a reference to the stub manager is held. * it must also call release on the stub manager when it is no longer needed */ From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Return a texture from the swapchain resource creation callback. Message-ID: Module: wine Branch: master Commit: fa0041954f600ff92cf485d0cb7acd2590c0ea98 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fa0041954f600ff92cf485d0cb7acd2590c0ea98 Author: Stefan D?singer Date: Thu Sep 3 20:56:26 2015 +0200 wined3d: Return a texture from the swapchain resource creation callback. --- dlls/d3d11/device.c | 19 ++++++++------- dlls/d3d8/device.c | 24 +++++++------------ dlls/d3d9/device.c | 24 +++++++------------ dlls/ddraw/ddraw.c | 23 +++++++------------ dlls/dxgi/device.c | 10 ++++---- dlls/wined3d/device.c | 39 +++++++++++++++++-------------- dlls/wined3d/swapchain.c | 60 +++++++++++++++++++++++++----------------------- include/wine/wined3d.h | 4 ++-- 8 files changed, 93 insertions(+), 110 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=fa0041954f600ff92cf485d0cb7acd2590c0ea98 From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d11: Set surface and volume parents to NULL. Message-ID: Module: wine Branch: master Commit: b486a23bac8bd25da5dcf8d809e0ce8fabb0ca64 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b486a23bac8bd25da5dcf8d809e0ce8fabb0ca64 Author: Stefan D?singer Date: Thu Sep 3 20:56:27 2015 +0200 d3d11: Set surface and volume parents to NULL. --- dlls/d3d11/device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 4dd528e..dee3c57 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2885,7 +2885,7 @@ static HRESULT CDECL device_parent_surface_created(struct wined3d_device_parent TRACE("device_parent %p, container_parent %p, surface %p, parent %p, parent_ops %p.\n", device_parent, container_parent, surface, parent, parent_ops); - *parent = container_parent; + *parent = NULL; *parent_ops = &d3d10_null_wined3d_parent_ops; return S_OK; @@ -2898,7 +2898,7 @@ static HRESULT CDECL device_parent_volume_created(struct wined3d_device_parent * TRACE("device_parent %p, container_parent %p, volume %p, parent %p, parent_ops %p.\n", device_parent, container_parent, volume, parent, parent_ops); - *parent = container_parent; + *parent = NULL; *parent_ops = &d3d10_null_wined3d_parent_ops; return S_OK; From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Alexandre Julliard : Release 1.7.51. Message-ID: Module: wine Branch: master Commit: 253a587e471a653e1b5ed590280452f43679aa6d URL: http://source.winehq.org/git/wine.git/?a=commit;h=253a587e471a653e1b5ed590280452f43679aa6d Author: Alexandre Julliard Date: Fri Sep 4 21:01:51 2015 +0900 Release 1.7.51. --- ANNOUNCE | 671 +++++++++++++++++++++++++++++++------------------------------- AUTHORS | 2 + VERSION | 2 +- configure | 18 +- 4 files changed, 353 insertions(+), 340 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=253a587e471a653e1b5ed590280452f43679aa6d From julliard at wine.codeweavers.com Fri Sep 4 07:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:43 -0500 Subject: Tag wine-1.7.51 : Alexandre Julliard : Release 1.7.51 Message-ID: Module: wine Branch: refs/tags/wine-1.7.51 Tag: c65ea800c1efe89665aff81249a7e5145cba1f6a URL: http://source.winehq.org/git/wine.git/?a=tag;h=c65ea800c1efe89665aff81249a7e5145cba1f6a Tagger: Alexandre Julliard Date: Fri Sep 4 21:01:52 2015 +0900 Release 1.7.51 From julliard at wine.codeweavers.com Fri Sep 4 07:03:56 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 04 Sep 2015 07:03:56 -0500 Subject: Alexandre Julliard : Wine release 1.7.51 Message-ID: Module: website Branch: master Commit: adc93baca06c1a47d6a32ef1896fa39442d0ba85 URL: http://source.winehq.org/git/website.git/?a=commit;h=adc93baca06c1a47d6a32ef1896fa39442d0ba85 Author: Alexandre Julliard Date: Fri Sep 4 21:03:52 2015 +0900 Wine release 1.7.51 --- news/en/2015090401.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/news/en/2015090401.xml b/news/en/2015090401.xml new file mode 100644 index 0000000..10420c4 --- /dev/null +++ b/news/en/2015090401.xml @@ -0,0 +1,16 @@ + +September 4, 2015 +Wine 1.7.51 Released + +

The Wine development release 1.7.51 is now available.

+

What's new in this release: +

    +
  • XAudio2 implementation using OpenAL Soft.
  • +
  • Support for the new Universal C Runtime DLL.
  • +
  • Dropdown menu support in the standard Open Dialog.
  • +
  • Grayscale rendering mode in DirectWrite.
  • +
  • Various bug fixes.
  • +
+

The source is available now. +Binary packages are in the process of being built, and will appear soon at their respective download locations. +

From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Bruno Jesus : quartz: Ensure pSample is NULL before calling IAsyncReader_WaitForNext. Message-ID: Module: wine Branch: master Commit: 29a9ea18bc3fa8148f1203e08ec276cb56720817 URL: http://source.winehq.org/git/wine.git/?a=commit;h=29a9ea18bc3fa8148f1203e08ec276cb56720817 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Sat Sep 5 00:25:43 2015 +0800 quartz: Ensure pSample is NULL before calling IAsyncReader_WaitForNext. --- dlls/quartz/pin.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/quartz/pin.c b/dlls/quartz/pin.c index 8377be5..52a3970 100644 --- a/dlls/quartz/pin.c +++ b/dlls/quartz/pin.c @@ -415,6 +415,7 @@ static void PullPin_Flush(PullPin *This) { DWORD_PTR dwUser; + pSample = NULL; IAsyncReader_WaitForNext(This->pReader, 0, &pSample, &dwUser); if (!pSample) From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Vincent Povirk : mscoree: Send Mono's debug output to Unix stderr. Message-ID: Module: wine Branch: master Commit: 2ecd3772e3805992f48bb806fd6a595048441011 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2ecd3772e3805992f48bb806fd6a595048441011 Author: Vincent Povirk Date: Fri Sep 4 14:05:00 2015 -0500 mscoree: Send Mono's debug output to Unix stderr. --- dlls/mscoree/metahost.c | 18 ++++++++++++++++++ dlls/mscoree/mscoree_private.h | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index 5e32ecb..6b53cde 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -102,6 +102,8 @@ static char* (CDECL *mono_stringify_assembly_name)(MonoAssemblyName *aname); MonoThread* (CDECL *mono_thread_attach)(MonoDomain *domain); void (CDECL *mono_thread_manage)(void); void (CDECL *mono_trace_set_assembly)(MonoAssembly *assembly); +void (CDECL *mono_trace_set_print_handler)(MonoPrintCallback callback); +void (CDECL *mono_trace_set_printerr_handler)(MonoPrintCallback callback); static BOOL get_mono_path(LPWSTR path); @@ -111,12 +113,18 @@ static MonoAssembly* mono_assembly_preload_hook_fn(MonoAssemblyName *aname, char static void mono_shutdown_callback_fn(MonoProfiler *prof); +static void mono_print_handler_fn(const char *string, INT is_stdout); + static MonoImage* CDECL image_open_module_handle_dummy(HMODULE module_handle, char* fname, UINT has_entry_point, MonoImageOpenStatus* status) { return mono_image_open(fname, status); } +static void CDECL set_print_handler_dummy(MonoPrintCallback callback) +{ +} + static void missing_runtime_message(void) { MESSAGE("wine: Install Mono for Windows to run .NET applications.\n"); @@ -204,11 +212,16 @@ static HRESULT load_mono(LPCWSTR mono_path) } while (0); LOAD_OPT_MONO_FUNCTION(mono_image_open_from_module_handle, image_open_module_handle_dummy); + LOAD_OPT_MONO_FUNCTION(mono_trace_set_print_handler, set_print_handler_dummy); + LOAD_OPT_MONO_FUNCTION(mono_trace_set_printerr_handler, set_print_handler_dummy); #undef LOAD_OPT_MONO_FUNCTION mono_profiler_install(NULL, mono_shutdown_callback_fn); + mono_trace_set_print_handler(mono_print_handler_fn); + mono_trace_set_printerr_handler(mono_print_handler_fn); + mono_set_dirs(mono_lib_path_a, mono_etc_path_a); mono_config_parse(NULL); @@ -244,6 +257,11 @@ static void mono_shutdown_callback_fn(MonoProfiler *prof) is_mono_shutdown = TRUE; } +static void mono_print_handler_fn(const char *string, INT is_stdout) +{ + wine_dbg_printf("%s", string); +} + static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost **result) { HRESULT hr = S_OK; diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h index 0fbbff6..9a7678d 100644 --- a/dlls/mscoree/mscoree_private.h +++ b/dlls/mscoree/mscoree_private.h @@ -132,6 +132,8 @@ typedef MonoAssembly* (*MonoAssemblyPreLoadFunc)(MonoAssemblyName *aname, char * typedef void (*MonoProfileFunc)(MonoProfiler *prof); +typedef void (*MonoPrintCallback) (const char *string, INT is_stdout); + extern BOOL is_mono_started DECLSPEC_HIDDEN; extern MonoImage* (CDECL *mono_assembly_get_image)(MonoAssembly *assembly) DECLSPEC_HIDDEN; @@ -156,6 +158,8 @@ extern MonoString* (CDECL *mono_string_new)(MonoDomain *domain, const char *str) extern MonoThread* (CDECL *mono_thread_attach)(MonoDomain *domain) DECLSPEC_HIDDEN; extern void (CDECL *mono_thread_manage)(void) DECLSPEC_HIDDEN; extern void (CDECL *mono_trace_set_assembly)(MonoAssembly *assembly) DECLSPEC_HIDDEN; +extern void (CDECL *mono_trace_set_print_handler)(MonoPrintCallback callback) DECLSPEC_HIDDEN; +extern void (CDECL *mono_trace_set_printerr_handler)(MonoPrintCallback callback) DECLSPEC_HIDDEN; /* loaded runtime interfaces */ extern void expect_no_runtimes(void) DECLSPEC_HIDDEN; From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Gerald Pfeifer : server: Replace 1 << 31 by 1u << 31 to avoid shift overflow in in get_active_hooks. Message-ID: Module: wine Branch: master Commit: 509d0f06cece4668a04f35f0ca6e924947673c31 URL: http://source.winehq.org/git/wine.git/?a=commit;h=509d0f06cece4668a04f35f0ca6e924947673c31 Author: Gerald Pfeifer Date: Fri Sep 4 16:07:31 2015 +0200 server: Replace 1 << 31 by 1u << 31 to avoid shift overflow in in get_active_hooks. --- server/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/hook.c b/server/hook.c index 3abd8d9..a8e6ab9 100644 --- a/server/hook.c +++ b/server/hook.c @@ -356,7 +356,7 @@ unsigned int get_active_hooks(void) { struct hook_table *table = get_queue_hooks( current ); struct hook_table *global_hooks = get_global_hooks( current ); - unsigned int ret = 1 << 31; /* set high bit to indicate that the bitmap is valid */ + unsigned int ret = 1u << 31; /* set high bit to indicate that the bitmap is valid */ int id; for (id = WH_MINHOOK; id <= WH_WINEVENT; id++) From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Gerald Pfeifer : propsys: Cast to ULONGLONG instead of LONGLONG in test_intconversions test_intconversions to avoid shift overflow. Message-ID: Module: wine Branch: master Commit: 519ad57cb5ebdb142bd755f924e8487985801315 URL: http://source.winehq.org/git/wine.git/?a=commit;h=519ad57cb5ebdb142bd755f924e8487985801315 Author: Gerald Pfeifer Date: Fri Sep 4 21:47:36 2015 +0200 propsys: Cast to ULONGLONG instead of LONGLONG in test_intconversions test_intconversions to avoid shift overflow. --- dlls/propsys/tests/propsys.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index 99d1c460..0dd052c 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -765,11 +765,11 @@ static void test_intconversions(void) PropVariantClear(&propvar); propvar.vt = VT_I8; - propvar.u.hVal.QuadPart = (LONGLONG)1 << 63; + propvar.u.hVal.QuadPart = (ULONGLONG)1 << 63; hr = PropVariantToInt64(&propvar, &llval); ok(hr == S_OK, "hr=%x\n", hr); - ok(llval == (LONGLONG)1 << 63, "got wrong value %s\n", debugstr_longlong(llval)); + ok(llval == (ULONGLONG)1 << 63, "got wrong value %s\n", debugstr_longlong(llval)); hr = PropVariantToUInt64(&propvar, &ullval); ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Bruno Jesus : shlwapi: Reject NULL key on SHRegCloseUSKey with tests. Message-ID: Module: wine Branch: master Commit: ffb4d151174be47b728099e0d203474e5e6d1b5a URL: http://source.winehq.org/git/wine.git/?a=commit;h=ffb4d151174be47b728099e0d203474e5e6d1b5a Author: Bruno Jesus <00cpxxx at gmail.com> Date: Sun Sep 6 08:34:12 2015 +0800 shlwapi: Reject NULL key on SHRegCloseUSKey with tests. --- dlls/shlwapi/reg.c | 3 +++ dlls/shlwapi/tests/shreg.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/dlls/shlwapi/reg.c b/dlls/shlwapi/reg.c index 1653b80..a72f4c2 100644 --- a/dlls/shlwapi/reg.c +++ b/dlls/shlwapi/reg.c @@ -193,6 +193,9 @@ LONG WINAPI SHRegCloseUSKey( LPSHUSKEY hKey = hUSKey; LONG ret = ERROR_SUCCESS; + if (!hKey) + return ERROR_INVALID_PARAMETER; + if (hKey->HKCUkey) ret = RegCloseKey(hKey->HKCUkey); if (hKey->HKCUstart && hKey->HKCUstart != HKEY_CURRENT_USER) diff --git a/dlls/shlwapi/tests/shreg.c b/dlls/shlwapi/tests/shreg.c index dfc8c3e..ca7fbad 100644 --- a/dlls/shlwapi/tests/shreg.c +++ b/dlls/shlwapi/tests/shreg.c @@ -38,6 +38,8 @@ static DWORD (WINAPI *pSHCopyKeyA)(HKEY,LPCSTR,HKEY,DWORD); static DWORD (WINAPI *pSHRegGetPathA)(HKEY,LPCSTR,LPCSTR,LPSTR,DWORD); static LSTATUS (WINAPI *pSHRegGetValueA)(HKEY,LPCSTR,LPCSTR,SRRF,LPDWORD,LPVOID,LPDWORD); static LSTATUS (WINAPI *pSHRegCreateUSKeyW)(LPCWSTR,REGSAM,HUSKEY,PHUSKEY,DWORD); +static LSTATUS (WINAPI *pSHRegOpenUSKeyW)(LPCWSTR,REGSAM,HUSKEY,PHUSKEY,BOOL); +static LSTATUS (WINAPI *pSHRegCloseUSKey)(HUSKEY); static const char sTestpath1[] = "%LONGSYSTEMVAR%\\subdir1"; static const char sTestpath2[] = "%FOO%\\subdir1"; @@ -458,6 +460,35 @@ static void test_SHRegCreateUSKeyW(void) ok(ret == ERROR_INVALID_PARAMETER, "got %d\n", ret); } +static void test_SHRegCloseUSKey(void) +{ + static const WCHAR localW[] = {'S','o','f','t','w','a','r','e',0}; + LONG ret; + HUSKEY key; + + if (!pSHRegOpenUSKeyW || !pSHRegCloseUSKey) + { + win_skip("SHRegOpenUSKeyW or SHRegCloseUSKey not available\n"); + return; + } + + ret = pSHRegCloseUSKey(NULL); + ok(ret == ERROR_INVALID_PARAMETER, "got %d\n", ret); + + ret = pSHRegOpenUSKeyW(localW, KEY_ALL_ACCESS, NULL, &key, FALSE); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + + ret = pSHRegCloseUSKey(key); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + + /* Test with limited rights, specially without KEY_SET_VALUE */ + ret = pSHRegOpenUSKeyW(localW, KEY_QUERY_VALUE, NULL, &key, FALSE); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + + ret = pSHRegCloseUSKey(key); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); +} + START_TEST(shreg) { HKEY hkey = create_test_entries(); @@ -476,6 +507,8 @@ START_TEST(shreg) pSHRegGetPathA = (void*)GetProcAddress(hshlwapi,"SHRegGetPathA"); pSHRegGetValueA = (void*)GetProcAddress(hshlwapi,"SHRegGetValueA"); pSHRegCreateUSKeyW = (void*)GetProcAddress(hshlwapi, "SHRegCreateUSKeyW"); + pSHRegOpenUSKeyW = (void*)GetProcAddress(hshlwapi, "SHRegOpenUSKeyW"); + pSHRegCloseUSKey = (void*)GetProcAddress(hshlwapi, "SHRegCloseUSKey"); test_SHGetValue(); test_SHRegGetValue(); @@ -484,6 +517,7 @@ START_TEST(shreg) test_SHCopyKey(); test_SHDeleteKey(); test_SHRegCreateUSKeyW(); + test_SHRegCloseUSKey(); delete_key( hkey, "Software\\Wine", "Test" ); } From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Thomas Faller : reg: Implement binary data add operation. Message-ID: Module: wine Branch: master Commit: 5c9526cb6c6151d0f9093c1ac6bb3b7333c64feb URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c9526cb6c6151d0f9093c1ac6bb3b7333c64feb Author: Thomas Faller Date: Sun Sep 6 16:07:18 2015 +0200 reg: Implement binary data add operation. --- programs/reg/reg.c | 43 +++++++++++++++++++++++++++++++++++++++++++ programs/reg/tests/reg.c | 6 +++--- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 4ec25bc..e4d121c 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -158,6 +158,19 @@ static DWORD wchar_get_type(const WCHAR *type_name) return ~0u; } +/* hexchar_to_byte from programs/regedit/hexedit.c */ +static inline BYTE hexchar_to_byte(WCHAR ch) +{ + if (ch >= '0' && ch <= '9') + return ch - '0'; + else if (ch >= 'a' && ch <= 'f') + return ch - 'a' + 10; + else if (ch >= 'A' && ch <= 'F') + return ch - 'A' + 10; + else + return -1; +} + static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *reg_count) { LPBYTE out_data = NULL; @@ -187,6 +200,36 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r ((LPDWORD)out_data)[0] = val; break; } + case REG_BINARY: + { + static const WCHAR nohex[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','h','e','x',' ','d','a','t','a','.','\n',0}; + BYTE hex0, hex1; + int i = 0, destByteIndex = 0, datalen = lstrlenW(data); + *reg_count = ((datalen + datalen % 2) / 2) * sizeof(BYTE); + out_data = HeapAlloc(GetProcessHeap(), 0, *reg_count); + if(datalen % 2) + { + hex1 = hexchar_to_byte(data[i++]); + if(hex1 == 0xFF) + goto no_hex_data; + out_data[destByteIndex++] = hex1; + } + for(;i + 1 < datalen;i += 2) + { + hex0 = hexchar_to_byte(data[i]); + hex1 = hexchar_to_byte(data[i + 1]); + if(hex0 == 0xFF || hex1 == 0xFF) + goto no_hex_data; + out_data[destByteIndex++] = (hex0 << 4) | hex1; + } + break; + no_hex_data: + /* cleanup, print error */ + HeapFree(GetProcessHeap(), 0, out_data); + reg_printfW(nohex); + out_data = NULL; + break; + } default: { static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0}; diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c index dbfce89..2880d37 100644 --- a/programs/reg/tests/reg.c +++ b/programs/reg/tests/reg.c @@ -214,7 +214,7 @@ static void test_add(void) run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE " /ve /t REG_BINARY /d deadbeef /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r); dword = 0xefbeadde; - verify_reg(hkey, "", REG_BINARY, &dword, sizeof(DWORD), TODO_REG_SIZE); + verify_reg(hkey, "", REG_BINARY, &dword, sizeof(DWORD), 0); run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin1 /f /d 0xDeAdBeEf", &r); todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r); @@ -235,8 +235,8 @@ static void test_add(void) err = RegQueryValueExA(hkey, "bin4", NULL, &type, (void *) (buffer+12), &size); ok(err == ERROR_SUCCESS, "RegQueryValueEx failed: got %d\n", err); ok(type == REG_BINARY, "got wrong type %u\n", type); - todo_wine ok(size == 6, "got wrong size %u\n", size); - todo_wine ok(memcmp(buffer, buffer+12, 6) == 0 || + ok(size == 6, "got wrong size %u\n", size); + ok(memcmp(buffer, buffer+12, 6) == 0 || broken(memcmp(buffer+6, buffer+12, 6) == 0 /* WinXP */), "got wrong data\n"); run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin5 /d \"\" /f", &r); From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Dmitry Timoshkov : oleaut32/tests: Add parameter checking to the typelib varargs marshalling test. Message-ID: Module: wine Branch: master Commit: f05930f0ce3785369031ba823989d80eb0715151 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f05930f0ce3785369031ba823989d80eb0715151 Author: Dmitry Timoshkov Date: Mon Sep 7 12:30:19 2015 +0800 oleaut32/tests: Add parameter checking to the typelib varargs marshalling test. --- dlls/oleaut32/tests/tmarshal.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index 1893534..2d6e5f2 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -842,7 +842,35 @@ static HRESULT WINAPI Widget_neg_restrict(IWidget* iface, INT *i) static HRESULT WINAPI Widget_VarArg_Run( IWidget *iface, BSTR name, SAFEARRAY *params, VARIANT *result) { + static const WCHAR catW[] = { 'C','a','t',0 }; + static const WCHAR supermanW[] = { 'S','u','p','e','r','m','a','n',0 }; + LONG bound; + VARIANT *var; + BSTR bstr; + HRESULT hr; + trace("VarArg_Run(%p,%p,%p)\n", name, params, result); + + ok(!lstrcmpW(name, catW), "got %s\n", wine_dbgstr_w(name)); + + hr = SafeArrayGetLBound(params, 1, &bound); + ok(hr == S_OK, "SafeArrayGetLBound error %#x\n", hr); + ok(bound == 0, "expected 0, got %d\n", bound); + + hr = SafeArrayGetUBound(params, 1, &bound); + ok(hr == S_OK, "SafeArrayGetUBound error %#x\n", hr); + ok(bound == 0, "expected 0, got %d\n", bound); + + hr = SafeArrayAccessData(params, (void **)&var); + ok(hr == S_OK, "SafeArrayAccessData failed with %x\n", hr); + + ok(V_VT(&var[0]) == VT_BSTR, "expected VT_BSTR, got %d\n", V_VT(&var[0])); + bstr = V_BSTR(&var[0]); + ok(!lstrcmpW(bstr, supermanW), "got %s\n", wine_dbgstr_w(bstr)); + + hr = SafeArrayUnaccessData(params); + ok(hr == S_OK, "SafeArrayUnaccessData error %#x\n", hr); + return S_OK; } @@ -1516,7 +1544,7 @@ static void test_typelibmarshal(void) V_BSTR(&vararg[1]) = SysAllocString(szCat); VariantInit(&vararg[0]); V_VT(&vararg[0]) = VT_BSTR; - V_BSTR(&vararg[0]) = SysAllocString(NULL); + V_BSTR(&vararg[0]) = SysAllocString(szSuperman); dispparams.cNamedArgs = 0; dispparams.cArgs = 2; dispparams.rgdispidNamedArgs = NULL; From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Dmitry Timoshkov : oleaut32: Don' t assume that SAFEARRAY is the last parameter in an varargs method. Message-ID: Module: wine Branch: master Commit: 755feaca394d647191028bda8b1584b9eb145a78 URL: http://source.winehq.org/git/wine.git/?a=commit;h=755feaca394d647191028bda8b1584b9eb145a78 Author: Dmitry Timoshkov Date: Mon Sep 7 12:30:24 2015 +0800 oleaut32: Don't assume that SAFEARRAY is the last parameter in an varargs method. --- dlls/oleaut32/tests/tmarshal.c | 1 - dlls/oleaut32/typelib.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index 2d6e5f2..f18aecc 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -1550,7 +1550,6 @@ static void test_typelibmarshal(void) dispparams.rgdispidNamedArgs = NULL; dispparams.rgvarg = vararg; hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); -todo_wine ok_ole_success(hr, IDispatch_Invoke); SysFreeString(V_BSTR(&vararg[1])); SysFreeString(V_BSTR(&vararg[0])); diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 29bab33..f4bba71 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -7078,7 +7078,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( } V_VT(&rgvarg[i]) = rgvt[i]; } - else if (rgvt[i] == (VT_VARIANT | VT_ARRAY) && func_desc->cParamsOpt < 0 && i == func_desc->cParams-1) + else if (rgvt[i] == (VT_VARIANT | VT_ARRAY) && func_desc->cParamsOpt < 0) { SAFEARRAY *a; SAFEARRAYBOUND bound; From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Gerald Pfeifer : d3dcompiler_43: Replace 14 instances of 1 << 31 by 1u << 31 to avoid shift shift overflow. Message-ID: Module: wine Branch: master Commit: d04324f0fa449947743e8f00bee0267ba988f93d URL: http://source.winehq.org/git/wine.git/?a=commit;h=d04324f0fa449947743e8f00bee0267ba988f93d Author: Gerald Pfeifer Date: Sun Sep 6 21:05:23 2015 +0200 d3dcompiler_43: Replace 14 instances of 1 << 31 by 1u << 31 to avoid shift shift overflow. --- dlls/d3dcompiler_43/bytecodewriter.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c index aa3b80d..a3e6f63 100644 --- a/dlls/d3dcompiler_43/bytecodewriter.c +++ b/dlls/d3dcompiler_43/bytecodewriter.c @@ -602,7 +602,7 @@ static void write_declarations(struct bc_writer *This, put_dword(buffer, instr_dcl); /* Write the usage and index */ - token = (1 << 31); /* Bit 31 of non-instruction opcodes is 1 */ + token = (1u << 31); /* Bit 31 of non-instruction opcodes is 1 */ token |= (decls[i].usage << D3DSP_DCL_USAGE_SHIFT) & D3DSP_DCL_USAGE_MASK; token |= (decls[i].usage_idx << D3DSP_DCL_USAGEINDEX_SHIFT) & D3DSP_DCL_USAGEINDEX_MASK; put_dword(buffer, token); @@ -618,7 +618,7 @@ static void write_declarations(struct bc_writer *This, static void write_const(struct constant **consts, int num, DWORD opcode, DWORD reg_type, struct bytecode_buffer *buffer, BOOL len) { int i; DWORD instr_def = opcode; - const DWORD reg = (1<<31) | d3dsp_register( reg_type, 0 ) | D3DSP_WRITEMASK_ALL; + const DWORD reg = (1u << 31) | d3dsp_register( reg_type, 0 ) | D3DSP_WRITEMASK_ALL; if(len) { if(opcode == D3DSIO_DEFB) @@ -889,7 +889,7 @@ static DWORD map_vs_output(struct bc_writer *This, DWORD regnum, DWORD mask, DWO static void vs_12_dstreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer, DWORD shift, DWORD mod) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD has_wmask; if(reg->rel_reg) { @@ -963,7 +963,7 @@ static void vs_12_dstreg(struct bc_writer *This, const struct shader_reg *reg, static void vs_1_x_srcreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD has_swizzle; DWORD component; @@ -1074,7 +1074,7 @@ static DWORD map_ps_input(struct bc_writer *This, static void ps_1_0123_srcreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ if(reg->rel_reg) { WARN("Relative addressing not supported in <= ps_3_0\n"); This->state = E_INVALIDARG; @@ -1120,7 +1120,7 @@ static void ps_1_0123_srcreg(struct bc_writer *This, const struct shader_reg *re static void ps_1_0123_dstreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer, DWORD shift, DWORD mod) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ if(reg->rel_reg) { WARN("Relative addressing not supported for destination registers\n"); @@ -1382,7 +1382,7 @@ static const struct bytecode_backend ps_1_0123_backend = { static void ps_1_4_srcreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ if(reg->rel_reg) { WARN("Relative addressing not supported in <= ps_3_0\n"); This->state = E_INVALIDARG; @@ -1421,7 +1421,7 @@ static void ps_1_4_srcreg(struct bc_writer *This, const struct shader_reg *reg, static void ps_1_4_dstreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer, DWORD shift, DWORD mod) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ if(reg->rel_reg) { WARN("Relative addressing not supported for destination registers\n"); @@ -1568,7 +1568,7 @@ static void vs_2_header(struct bc_writer *This, static void vs_2_srcreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD has_swizzle; DWORD component; DWORD d3d9reg; @@ -1803,12 +1803,12 @@ static void write_samplers(const struct bwriter_shader *shader, struct bytecode_ DWORD i; DWORD instr_dcl = D3DSIO_DCL | (2 << D3DSI_INSTLENGTH_SHIFT); DWORD token; - const DWORD reg = (1<<31) | d3dsp_register( D3DSPR_SAMPLER, 0 ) | D3DSP_WRITEMASK_ALL; + const DWORD reg = (1u << 31) | d3dsp_register( D3DSPR_SAMPLER, 0 ) | D3DSP_WRITEMASK_ALL; for(i = 0; i < shader->num_samplers; i++) { /* Write the DCL instruction */ put_dword(buffer, instr_dcl); - token = (1<<31); + token = (1u << 31); /* Already shifted */ token |= (d3d9_sampler(shader->samplers[i].type)) & D3DSP_TEXTURETYPE_MASK; put_dword(buffer, token); @@ -1835,7 +1835,7 @@ static void ps_2_header(struct bc_writer *This, const struct bwriter_shader *sha static void ps_2_srcreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD d3d9reg; if(reg->rel_reg) { WARN("Relative addressing not supported in <= ps_3_0\n"); @@ -1890,7 +1890,7 @@ static void ps_2_0_dstreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer, DWORD shift, DWORD mod) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD d3d9reg; if(reg->rel_reg) { @@ -2063,7 +2063,7 @@ static void sm_3_header(struct bc_writer *This, const struct bwriter_shader *sha static void sm_3_srcreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD d3d9reg; d3d9reg = d3d9_register(reg->type); @@ -2102,7 +2102,7 @@ static void sm_3_dstreg(struct bc_writer *This, const struct shader_reg *reg, struct bytecode_buffer *buffer, DWORD shift, DWORD mod) { - DWORD token = (1 << 31); /* Bit 31 of registers is 1 */ + DWORD token = (1u << 31); /* Bit 31 of registers is 1 */ DWORD d3d9reg; if(reg->rel_reg) { From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Marcus Meissner : netprofm: fix memleak in error exit (Coverity). Message-ID: Module: wine Branch: master Commit: faa14ba1b1c4d389725af4beefaec88da81c1418 URL: http://source.winehq.org/git/wine.git/?a=commit;h=faa14ba1b1c4d389725af4beefaec88da81c1418 Author: Marcus Meissner Date: Mon Sep 7 09:07:56 2015 +0200 netprofm: fix memleak in error exit (Coverity). --- dlls/netprofm/list.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index 197ef68..33b2fa6 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -1681,7 +1681,11 @@ static void init_networks( struct list_manager *mgr ) if (ret != ERROR_BUFFER_OVERFLOW) return; if (!(buf = heap_alloc( size ))) return; - if (GetAdaptersAddresses( WS_AF_UNSPEC, flags, NULL, buf, &size )) return; + if (GetAdaptersAddresses( WS_AF_UNSPEC, flags, NULL, buf, &size )) + { + heap_free( buf ); + return; + } memset( &id, 0, sizeof(id) ); for (aa = buf; aa; aa = aa->Next) From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Thomas Faber : user32: Use float literals for float operation. Message-ID: Module: wine Branch: master Commit: 8a718259d37c0db1fe0b4710e0b21c1886174617 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a718259d37c0db1fe0b4710e0b21c1886174617 Author: Thomas Faber Date: Mon Sep 7 10:14:02 2015 +0200 user32: Use float literals for float operation. --- dlls/user32/edit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c index 67adefb..084bbff 100644 --- a/dlls/user32/edit.c +++ b/dlls/user32/edit.c @@ -631,7 +631,7 @@ static void EDIT_BuildLineDefs_ML(EDITSTATE *es, INT istart, INT iend, INT delta prev = current_line->net_length - 1; w = current_line->net_length; d = (float)current_line->width/(float)fw; - if (d > 1.2) d -= 0.2; + if (d > 1.2f) d -= 0.2f; next = prev/d; if (next >= prev) next = prev-1; do { From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Hans Leidekker : msi/tests: Avoid test failures when running as an unprivileged user. Message-ID: Module: wine Branch: master Commit: fca92ae67cb1339fed9785a0e915bfdec8becb8a URL: http://source.winehq.org/git/wine.git/?a=commit;h=fca92ae67cb1339fed9785a0e915bfdec8becb8a Author: Hans Leidekker Date: Mon Sep 7 11:35:32 2015 +0200 msi/tests: Avoid test failures when running as an unprivileged user. --- dlls/msi/tests/install.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 1aefa9f..86ad561 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -3159,6 +3159,11 @@ static void test_samesequence(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_FAILURE) + { + win_skip("unprivileged user?\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); if (r == ERROR_SUCCESS) { @@ -3167,6 +3172,8 @@ static void test_samesequence(void) ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n"); } + +error: delete_cab_files(); DeleteFileA(msifile); } @@ -3181,6 +3188,12 @@ static void test_uiLevelFlags(void) MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_FAILURE) + { + win_skip("unprivileged user?\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); if (r == ERROR_SUCCESS) { @@ -3189,6 +3202,8 @@ static void test_uiLevelFlags(void) ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n"); } + +error: delete_cab_files(); DeleteFileA(msifile); } From julliard at wine.codeweavers.com Mon Sep 7 09:20:13 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:13 -0500 Subject: Hans Leidekker : advapi32/tests: Avoid test failures when running as an unprivileged user. Message-ID: Module: wine Branch: master Commit: b368cd1b713f5ee17186bc4589863c636f71ac37 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b368cd1b713f5ee17186bc4589863c636f71ac37 Author: Hans Leidekker Date: Mon Sep 7 11:36:04 2015 +0200 advapi32/tests: Avoid test failures when running as an unprivileged user. --- dlls/advapi32/tests/security.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 46db49c..c48ffc9 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -5886,6 +5886,12 @@ static void test_system_security_access(void) /* ACCESS_SYSTEM_SECURITY requires special privilege */ res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ|ACCESS_SYSTEM_SECURITY, NULL, &hkey, NULL ); todo_wine ok( res == ERROR_PRIVILEGE_NOT_HELD, "got %d\n", res ); + if (res == ERROR_ACCESS_DENIED) + { + skip( "unprivileged user\n" ); + CloseHandle( token ); + return; + } priv.PrivilegeCount = 1; priv.Privileges[0].Luid = luid; @@ -5897,6 +5903,13 @@ static void test_system_security_access(void) res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ|ACCESS_SYSTEM_SECURITY, NULL, &hkey, NULL ); ok( !res, "got %d\n", res ); + if (res == ERROR_PRIVILEGE_NOT_HELD) + { + win_skip( "privilege not held\n" ); + HeapFree( GetProcessHeap(), 0, priv_prev ); + CloseHandle( token ); + return; + } /* restore privileges */ ret = AdjustTokenPrivileges( token, FALSE, priv_prev, 0, NULL, NULL ); From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: Hans Leidekker : advapi32/tests: Perform a case-insensitive match on domain names. Message-ID: Module: wine Branch: master Commit: ca32deb0d231d38cf1df874976cfc013c9def3a0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ca32deb0d231d38cf1df874976cfc013c9def3a0 Author: Hans Leidekker Date: Mon Sep 7 11:36:31 2015 +0200 advapi32/tests: Perform a case-insensitive match on domain names. --- dlls/advapi32/tests/security.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index c48ffc9..ae9dd92 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -2249,7 +2249,7 @@ static void test_LookupAccountName(void) ok(ret, "Failed to lookup account name\n"); ok(sid_size == GetLengthSid(psid), "Expected %d, got %d\n", GetLengthSid(psid), sid_size); ok(!lstrcmpA(account, user_name), "Expected %s, got %s\n", user_name, account); - ok(!lstrcmpA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain); + ok(!lstrcmpiA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain); ok(domain_size == domain_save - 1, "Expected %d, got %d\n", domain_save - 1, domain_size); ok(strlen(domain) == domain_size, "Expected %d, got %d\n", lstrlenA(domain), domain_size); ok(sid_use == SidTypeUser, "Expected SidTypeUser (%d), got %d\n", SidTypeUser, sid_use); @@ -2267,7 +2267,7 @@ static void test_LookupAccountName(void) ok(ret, "Failed to lookup account name\n"); ok(sid_size != 0, "sid_size was zero\n"); ok(!lstrcmpA(account, "Everyone"), "Expected Everyone, got %s\n", account); - ok(!lstrcmpA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain); + ok(!lstrcmpiA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain); ok(domain_size == 0, "Expected 0, got %d\n", domain_size); ok(strlen(domain) == domain_size, "Expected %d, got %d\n", lstrlenA(domain), domain_size); ok(sid_use == SidTypeWellKnownGroup, "Expected SidTypeWellKnownGroup (%d), got %d\n", SidTypeWellKnownGroup, sid_use); @@ -2332,9 +2332,8 @@ static void test_LookupAccountName(void) get_sid_info(psid, &account, &sid_dom); ok(ret, "Failed to lookup account name\n"); /* Using a fixed string will not work on different locales */ - ok(!lstrcmpA(account, domain), - "Got %s for account and %s for domain, these should be the same\n", - account, domain); + ok(!lstrcmpiA(account, domain), + "Got %s for account and %s for domain, these should be the same\n", account, domain); ok(sid_use == SidTypeDomain, "Expected SidTypeDomain (%d), got %d\n", SidTypeDomain, sid_use); HeapFree(GetProcessHeap(), 0, psid); From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_buffer_GetDesc() . Message-ID: Module: wine Branch: master Commit: 378bec23ef06707f65d131d7eda1aab0fab0902c URL: http://source.winehq.org/git/wine.git/?a=commit;h=378bec23ef06707f65d131d7eda1aab0fab0902c Author: J?zef Kucia Date: Sun Sep 6 16:45:46 2015 +0200 d3d11: Implement d3d11_buffer_GetDesc(). --- dlls/d3d11/buffer.c | 14 +++++++++++--- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 10 +++++++++- dlls/d3d11/utils.c | 7 ------- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index d2e3156..02dfd9a 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -163,7 +163,11 @@ static UINT STDMETHODCALLTYPE d3d11_buffer_GetEvictionPriority(ID3D11Buffer *ifa static void STDMETHODCALLTYPE d3d11_buffer_GetDesc(ID3D11Buffer *iface, D3D11_BUFFER_DESC *desc) { - FIXME("iface %p, desc %p stub!\n", iface, desc); + struct d3d_buffer *buffer = impl_from_ID3D11Buffer(iface); + + TRACE("iface %p, desc %p.\n", iface, desc); + + *desc = buffer->desc; } static const struct ID3D11BufferVtbl d3d11_buffer_vtbl = @@ -364,7 +368,7 @@ static const struct wined3d_parent_ops d3d10_buffer_wined3d_parent_ops = }; HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, - const D3D10_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) + const D3D11_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) { struct wined3d_buffer_desc wined3d_desc; HRESULT hr; @@ -374,13 +378,17 @@ HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, buffer->refcount = 1; wined3d_mutex_lock(); wined3d_private_store_init(&buffer->private_store); + buffer->desc = *desc; wined3d_desc.byte_width = desc->ByteWidth; - wined3d_desc.usage = wined3d_usage_from_d3d10core(0, desc->Usage); + wined3d_desc.usage = wined3d_usage_from_d3d11(0, desc->Usage); wined3d_desc.bind_flags = desc->BindFlags; wined3d_desc.cpu_access_flags = desc->CPUAccessFlags; wined3d_desc.misc_flags = desc->MiscFlags; + if (desc->StructureByteStride) + FIXME("Ignoring structure byte stride %u.\n", desc->StructureByteStride); + if (FAILED(hr = wined3d_buffer_create(device->wined3d_device, &wined3d_desc, (const struct wined3d_sub_resource_data *)data, buffer, &d3d10_buffer_wined3d_parent_ops, &buffer->wined3d_buffer))) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 2f56a5a..eaf89af 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -63,7 +63,6 @@ const char *debug_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN; DXGI_FORMAT dxgi_format_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; enum wined3d_format_id wined3dformat_from_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN; DWORD wined3d_usage_from_d3d11(UINT bind_flags, enum D3D11_USAGE usage) DECLSPEC_HIDDEN; -DWORD wined3d_usage_from_d3d10core(UINT bind_flags, enum D3D10_USAGE usage) DECLSPEC_HIDDEN; struct wined3d_resource *wined3d_resource_from_resource(ID3D10Resource *resource) DECLSPEC_HIDDEN; DWORD wined3d_map_flags_from_d3d10_map_type(D3D10_MAP map_type) DECLSPEC_HIDDEN; @@ -142,11 +141,12 @@ struct d3d_buffer struct wined3d_private_store private_store; struct wined3d_buffer *wined3d_buffer; + D3D11_BUFFER_DESC desc; ID3D11Device *device; }; HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, - const D3D10_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; + const D3D11_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; struct d3d_buffer *unsafe_impl_from_ID3D10Buffer(ID3D10Buffer *iface) DECLSPEC_HIDDEN; /* ID3D10DepthStencilView */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index dee3c57..6194815 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -1986,16 +1986,24 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateBuffer(ID3D10Device1 *iface, const D3D10_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data, ID3D10Buffer **buffer) { struct d3d_device *This = impl_from_ID3D10Device(iface); + D3D11_BUFFER_DESC d3d11_desc; struct d3d_buffer *object; HRESULT hr; TRACE("iface %p, desc %p, data %p, buffer %p.\n", iface, desc, data, buffer); + d3d11_desc.ByteWidth = desc->ByteWidth; + d3d11_desc.Usage = d3d11_usage_from_d3d10_usage(desc->Usage); + d3d11_desc.BindFlags = d3d11_bind_flags_from_d3d10_bind_flags(desc->BindFlags); + d3d11_desc.CPUAccessFlags = d3d11_cpu_access_flags_from_d3d10_cpu_access_flags(desc->CPUAccessFlags); + d3d11_desc.MiscFlags = d3d11_resource_misc_flags_from_d3d10_resource_misc_flags(desc->MiscFlags); + d3d11_desc.StructureByteStride = 0; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) return E_OUTOFMEMORY; - hr = d3d_buffer_init(object, This, desc, data); + hr = d3d_buffer_init(object, This, &d3d11_desc, data); if (FAILED(hr)) { WARN("Failed to initialize buffer, hr %#x.\n", hr); diff --git a/dlls/d3d11/utils.c b/dlls/d3d11/utils.c index 8e89c32..3d1da1f 100644 --- a/dlls/d3d11/utils.c +++ b/dlls/d3d11/utils.c @@ -367,13 +367,6 @@ DWORD wined3d_usage_from_d3d11(UINT bind_flags, enum D3D11_USAGE usage) return wined3d_usage; } -DWORD wined3d_usage_from_d3d10core(UINT bind_flags, enum D3D10_USAGE usage) -{ - UINT d3d11_bind_flags = d3d11_bind_flags_from_d3d10_bind_flags(bind_flags); - enum D3D11_USAGE d3d11_usage = d3d11_usage_from_d3d10_usage(usage); - return wined3d_usage_from_d3d11(d3d11_bind_flags, d3d11_usage); -} - enum D3D11_USAGE d3d11_usage_from_d3d10_usage(enum D3D10_USAGE usage) { switch (usage) From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d10_buffer_GetDesc() . Message-ID: Module: wine Branch: master Commit: 4444917f1a769a8c16d33c9bd81e39e17ab23017 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4444917f1a769a8c16d33c9bd81e39e17ab23017 Author: J?zef Kucia Date: Sun Sep 6 16:45:47 2015 +0200 d3d11: Implement d3d10_buffer_GetDesc(). --- dlls/d3d11/buffer.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index 02dfd9a..fba2b06 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -322,7 +322,16 @@ static void STDMETHODCALLTYPE d3d10_buffer_Unmap(ID3D10Buffer *iface) static void STDMETHODCALLTYPE d3d10_buffer_GetDesc(ID3D10Buffer *iface, D3D10_BUFFER_DESC *desc) { - FIXME("iface %p, desc %p stub!\n", iface, desc); + struct d3d_buffer *buffer = impl_from_ID3D10Buffer(iface); + const D3D11_BUFFER_DESC *d3d11_desc = &buffer->desc; + + TRACE("iface %p, desc %p.\n", iface, desc); + + desc->ByteWidth = d3d11_desc->ByteWidth; + desc->Usage = d3d10_usage_from_d3d11_usage(d3d11_desc->Usage); + desc->BindFlags = d3d10_bind_flags_from_d3d11_bind_flags(d3d11_desc->BindFlags); + desc->CPUAccessFlags = d3d10_cpu_access_flags_from_d3d11_cpu_access_flags(d3d11_desc->CPUAccessFlags); + desc->MiscFlags = d3d10_resource_misc_flags_from_d3d11_resource_misc_flags(d3d11_desc->MiscFlags); } static const struct ID3D10BufferVtbl d3d10_buffer_vtbl = From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateBuffer(). Message-ID: Module: wine Branch: master Commit: b500ae04b48db0ffe20bfefa121f69c6e675ead5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b500ae04b48db0ffe20bfefa121f69c6e675ead5 Author: J?zef Kucia Date: Sun Sep 6 16:45:48 2015 +0200 d3d11: Implement d3d11_device_CreateBuffer(). --- dlls/d3d11/buffer.c | 26 ++++++++++++++++++++++++-- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 28 +++++++++++++--------------- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index fba2b06..0245b52 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -376,8 +376,8 @@ static const struct wined3d_parent_ops d3d10_buffer_wined3d_parent_ops = d3d10_buffer_wined3d_object_released, }; -HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, - const D3D11_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) +static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, + const D3D11_BUFFER_DESC *desc, const D3D11_SUBRESOURCE_DATA *data) { struct wined3d_buffer_desc wined3d_desc; HRESULT hr; @@ -414,3 +414,25 @@ HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, return S_OK; } + +HRESULT d3d_buffer_create(struct d3d_device *device, const D3D11_BUFFER_DESC *desc, + const D3D11_SUBRESOURCE_DATA *data, struct d3d_buffer **buffer) +{ + struct d3d_buffer *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_buffer_init(object, device, desc, data))) + { + WARN("Failed to initialize buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created buffer %p.\n", object); + *buffer = object; + + return S_OK; +} diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index eaf89af..49e40ea 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -145,8 +145,8 @@ struct d3d_buffer ID3D11Device *device; }; -HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device, - const D3D11_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data) DECLSPEC_HIDDEN; +HRESULT d3d_buffer_create(struct d3d_device *device, const D3D11_BUFFER_DESC *desc, + const D3D11_SUBRESOURCE_DATA *data, struct d3d_buffer **buffer) DECLSPEC_HIDDEN; struct d3d_buffer *unsafe_impl_from_ID3D10Buffer(ID3D10Buffer *iface) DECLSPEC_HIDDEN; /* ID3D10DepthStencilView */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 6194815..97a3404 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -59,9 +59,18 @@ static ULONG STDMETHODCALLTYPE d3d11_device_Release(ID3D11Device *iface) static HRESULT STDMETHODCALLTYPE d3d11_device_CreateBuffer(ID3D11Device *iface, const D3D11_BUFFER_DESC *desc, const D3D11_SUBRESOURCE_DATA *data, ID3D11Buffer **buffer) { - FIXME("iface %p, desc %p, data %p, buffer %p stub!\n", iface, desc, data, buffer); + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_buffer *object; + HRESULT hr; - return E_NOTIMPL; + TRACE("iface %p, desc %p, data %p, buffer %p.\n", iface, desc, data, buffer); + + if (FAILED(hr = d3d_buffer_create(device, desc, data, &object))) + return hr; + + *buffer = &object->ID3D11Buffer_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateTexture1D(ID3D11Device *iface, @@ -1985,7 +1994,7 @@ static void STDMETHODCALLTYPE d3d10_device_Flush(ID3D10Device1 *iface) static HRESULT STDMETHODCALLTYPE d3d10_device_CreateBuffer(ID3D10Device1 *iface, const D3D10_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data, ID3D10Buffer **buffer) { - struct d3d_device *This = impl_from_ID3D10Device(iface); + struct d3d_device *device = impl_from_ID3D10Device(iface); D3D11_BUFFER_DESC d3d11_desc; struct d3d_buffer *object; HRESULT hr; @@ -1999,22 +2008,11 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateBuffer(ID3D10Device1 *iface, d3d11_desc.MiscFlags = d3d11_resource_misc_flags_from_d3d10_resource_misc_flags(desc->MiscFlags); d3d11_desc.StructureByteStride = 0; - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) - return E_OUTOFMEMORY; - - hr = d3d_buffer_init(object, This, &d3d11_desc, data); - if (FAILED(hr)) - { - WARN("Failed to initialize buffer, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); + if (FAILED(hr = d3d_buffer_create(device, &d3d11_desc, (const D3D11_SUBRESOURCE_DATA *)data, &object))) return hr; - } *buffer = &object->ID3D10Buffer_iface; - TRACE("Created ID3D10Buffer %p\n", object); - return S_OK; } From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: AddRef device returned from d3d11_buffer_GetDevice(). Message-ID: Module: wine Branch: master Commit: ae2b1539a9676a85baf97216c73a19d2b8b69954 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae2b1539a9676a85baf97216c73a19d2b8b69954 Author: J?zef Kucia Date: Sun Sep 6 16:45:49 2015 +0200 d3d11: AddRef device returned from d3d11_buffer_GetDevice(). --- dlls/d3d11/buffer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index 0245b52..26123e8 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -109,6 +109,7 @@ static void STDMETHODCALLTYPE d3d11_buffer_GetDevice(ID3D11Buffer *iface, ID3D11 TRACE("iface %p, device %p.\n", iface, device); *device = buffer->device; + ID3D11Device_AddRef(*device); } static HRESULT STDMETHODCALLTYPE d3d11_buffer_GetPrivateData(ID3D11Buffer *iface, From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Add test for buffer interfaces. Message-ID: Module: wine Branch: master Commit: b9747d77f1710f26cf85a6183d0a5b17f7010584 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b9747d77f1710f26cf85a6183d0a5b17f7010584 Author: J?zef Kucia Date: Sun Sep 6 16:45:50 2015 +0200 d3d11/tests: Add test for buffer interfaces. --- dlls/d3d11/tests/d3d11.c | 174 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index a5e6945..817ca9c 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -642,6 +642,179 @@ static void test_texture3d_interfaces(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_buffer_interfaces(void) +{ + ID3D10Buffer *d3d10_buffer; + D3D11_BUFFER_DESC desc; + ID3D11Buffer *buffer; + ID3D11Device *device; + unsigned int i; + ULONG refcount; + HRESULT hr; + + static const struct test + { + BOOL implements_d3d10_interfaces; + UINT bind_flags; + UINT misc_flags; + UINT structure_stride; + UINT expected_bind_flags; + UINT expected_misc_flags; + } + desc_conversion_tests[] = + { + { + TRUE, + D3D11_BIND_VERTEX_BUFFER, 0, 0, + D3D10_BIND_VERTEX_BUFFER, 0 + }, + { + TRUE, + D3D11_BIND_INDEX_BUFFER, 0, 0, + D3D10_BIND_INDEX_BUFFER, 0 + }, + { + TRUE, + D3D11_BIND_CONSTANT_BUFFER, 0, 0, + D3D10_BIND_CONSTANT_BUFFER, 0 + }, + { + TRUE, + D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D10_BIND_SHADER_RESOURCE, 0 + }, + { + TRUE, + D3D11_BIND_STREAM_OUTPUT, 0, 0, + D3D10_BIND_STREAM_OUTPUT, 0 + }, + { + TRUE, + D3D11_BIND_RENDER_TARGET, 0, 0, + D3D10_BIND_RENDER_TARGET, 0 + }, + { + TRUE, + D3D11_BIND_UNORDERED_ACCESS, 0, 0, + D3D11_BIND_UNORDERED_ACCESS, 0 + }, + { + TRUE, + 0, D3D11_RESOURCE_MISC_SHARED, 0, + 0, D3D10_RESOURCE_MISC_SHARED + }, + { + TRUE, + 0, D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS, 0, + 0, 0 + }, + { + TRUE, + D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, 0, + D3D10_BIND_SHADER_RESOURCE, 0 + }, + { + FALSE /* Structured buffers do not implement ID3D10Buffer. */, + 0, D3D11_RESOURCE_MISC_BUFFER_STRUCTURED, 16, + 0, 0 + }, + { + TRUE, + 0, D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX, 0, + 0, D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX + }, + }; + + if (!(device = create_device(NULL))) + { + skip("Failed to create ID3D11Device.\n"); + return; + } + + desc.ByteWidth = 1024; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + desc.StructureByteStride = 0; + + hr = ID3D11Device_CreateBuffer(device, &desc, NULL, &buffer); + ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr); + + hr = ID3D11Buffer_QueryInterface(buffer, &IID_ID3D10Buffer, (void **)&d3d10_buffer); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Buffer should implement ID3D10Buffer.\n"); + if (SUCCEEDED(hr)) ID3D10Buffer_Release(d3d10_buffer); + ID3D11Buffer_Release(buffer); + + if (FAILED(hr)) + { + win_skip("Buffers do not implement ID3D10Buffer.\n"); + ID3D11Device_Release(device); + return; + } + + for (i = 0; i < sizeof(desc_conversion_tests) / sizeof(*desc_conversion_tests); ++i) + { + const struct test *current = &desc_conversion_tests[i]; + D3D10_BUFFER_DESC d3d10_desc; + ID3D10Device *d3d10_device; + + desc.ByteWidth = 1024; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = current->bind_flags; + desc.CPUAccessFlags = 0; + desc.MiscFlags = current->misc_flags; + desc.StructureByteStride = current->structure_stride; + + hr = ID3D11Device_CreateBuffer(device, &desc, NULL, &buffer); + /* Shared resources are not supported by REF and WARP devices. */ + ok(SUCCEEDED(hr) || broken(hr == E_OUTOFMEMORY), "Test %u: Failed to create a buffer, hr %#x.\n", i, hr); + if (FAILED(hr)) + { + win_skip("Failed to create a buffer, skipping test %u.\n", i); + continue; + } + + hr = ID3D11Buffer_QueryInterface(buffer, &IID_ID3D10Buffer, (void **)&d3d10_buffer); + ID3D11Buffer_Release(buffer); + + if (current->implements_d3d10_interfaces) + { + ok(SUCCEEDED(hr), "Test %u: Buffer should implement ID3D10Buffer.\n", i); + } + else + { + todo_wine ok(hr == E_NOINTERFACE, "Test %u: Buffer should not implement ID3D10Buffer.\n", i); + if (SUCCEEDED(hr)) ID3D10Buffer_Release(d3d10_buffer); + continue; + } + + ID3D10Buffer_GetDesc(d3d10_buffer, &d3d10_desc); + + ok(d3d10_desc.ByteWidth == desc.ByteWidth, + "Test %u: Got unexpected ByteWidth %u.\n", i, d3d10_desc.ByteWidth); + ok(d3d10_desc.Usage == (D3D10_USAGE)desc.Usage, + "Test %u: Got unexpected Usage %u.\n", i, d3d10_desc.Usage); + ok(d3d10_desc.BindFlags == current->expected_bind_flags, + "Test %u: Got unexpected BindFlags %#x.\n", i, d3d10_desc.BindFlags); + ok(d3d10_desc.CPUAccessFlags == desc.CPUAccessFlags, + "Test %u: Got unexpected CPUAccessFlags %#x.\n", i, d3d10_desc.CPUAccessFlags); + ok(d3d10_desc.MiscFlags == current->expected_misc_flags, + "Test %u: Got unexpected MiscFlags %#x.\n", i, d3d10_desc.MiscFlags); + + d3d10_device = (ID3D10Device *)0xdeadbeef; + ID3D10Buffer_GetDevice(d3d10_buffer, &d3d10_device); + todo_wine ok(!d3d10_device, "Test %u: Got unexpected device pointer %p, expected NULL.\n", i, d3d10_device); + if (d3d10_device) ID3D10Device_Release(d3d10_device); + + ID3D10Buffer_Release(d3d10_buffer); + } + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(d3d11) { test_create_device(); @@ -650,4 +823,5 @@ START_TEST(d3d11) test_texture2d_interfaces(); test_create_texture3d(); test_texture3d_interfaces(); + test_buffer_interfaces(); } From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d10core/tests: Port test_buffer_interfaces() from d3d11. Message-ID: Module: wine Branch: master Commit: d7af6664ac931f63507a4d22b2d1231cfa73965d URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7af6664ac931f63507a4d22b2d1231cfa73965d Author: J?zef Kucia Date: Sun Sep 6 16:45:51 2015 +0200 d3d10core/tests: Port test_buffer_interfaces() from d3d11. --- dlls/d3d10core/tests/device.c | 130 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index 847abd1..ebe50cc 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -518,6 +518,135 @@ static void test_create_texture3d(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_buffer_interfaces(void) +{ + ID3D11Buffer *d3d11_buffer; + D3D10_BUFFER_DESC desc; + ID3D10Buffer *buffer; + ID3D10Device *device; + unsigned int i; + ULONG refcount; + HRESULT hr; + + static const struct test + { + UINT bind_flags; + UINT misc_flags; + UINT expected_bind_flags; + UINT expected_misc_flags; + } + desc_conversion_tests[] = + { + { + D3D10_BIND_VERTEX_BUFFER, 0, + D3D11_BIND_VERTEX_BUFFER, 0 + }, + { + D3D10_BIND_INDEX_BUFFER, 0, + D3D11_BIND_INDEX_BUFFER, 0 + }, + { + D3D10_BIND_CONSTANT_BUFFER, 0, + D3D11_BIND_CONSTANT_BUFFER, 0 + }, + { + D3D10_BIND_SHADER_RESOURCE, 0, + D3D11_BIND_SHADER_RESOURCE, 0 + }, + { + D3D10_BIND_STREAM_OUTPUT, 0, + D3D11_BIND_STREAM_OUTPUT, 0 + }, + { + D3D10_BIND_RENDER_TARGET, 0, + D3D11_BIND_RENDER_TARGET, 0 + }, + { + 0, D3D10_RESOURCE_MISC_SHARED, + 0, D3D11_RESOURCE_MISC_SHARED + }, + }; + + if (!(device = create_device())) + { + skip("Failed to create device.\n"); + return; + } + + desc.ByteWidth = 1024; + desc.Usage = D3D10_USAGE_DEFAULT; + desc.BindFlags = D3D10_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + hr = ID3D10Device_CreateBuffer(device, &desc, NULL, &buffer); + ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr); + + hr = ID3D10Buffer_QueryInterface(buffer, &IID_ID3D11Buffer, (void **)&d3d11_buffer); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Buffer should implement ID3D11Buffer.\n"); + if (SUCCEEDED(hr)) ID3D11Buffer_Release(d3d11_buffer); + ID3D10Buffer_Release(buffer); + + if (FAILED(hr)) + { + win_skip("D3D11 is not available.\n"); + ID3D10Device_Release(device); + return; + } + + for (i = 0; i < sizeof(desc_conversion_tests) / sizeof(*desc_conversion_tests); ++i) + { + const struct test *current = &desc_conversion_tests[i]; + D3D11_BUFFER_DESC d3d11_desc; + ID3D11Device *d3d11_device; + + desc.ByteWidth = 1024; + desc.Usage = D3D10_USAGE_DEFAULT; + desc.BindFlags = current->bind_flags; + desc.CPUAccessFlags = 0; + desc.MiscFlags = current->misc_flags; + + hr = ID3D10Device_CreateBuffer(device, &desc, NULL, &buffer); + /* Shared resources are not supported by REF and WARP devices. */ + ok(SUCCEEDED(hr) || broken(hr == E_OUTOFMEMORY), "Test %u: Failed to create a buffer, hr %#x.\n", i, hr); + if (FAILED(hr)) + { + win_skip("Failed to create a buffer, skipping test %u.\n", i); + continue; + } + + hr = ID3D10Buffer_QueryInterface(buffer, &IID_ID3D11Buffer, (void **)&d3d11_buffer); + ok(SUCCEEDED(hr), "Test %u: Buffer should implement ID3D11Buffer.\n", i); + ID3D10Buffer_Release(buffer); + + ID3D11Buffer_GetDesc(d3d11_buffer, &d3d11_desc); + + ok(d3d11_desc.ByteWidth == desc.ByteWidth, + "Test %u: Got unexpected ByteWidth %u.\n", i, d3d11_desc.ByteWidth); + ok(d3d11_desc.Usage == (D3D11_USAGE)desc.Usage, + "Test %u: Got unexpected Usage %u.\n", i, d3d11_desc.Usage); + ok(d3d11_desc.BindFlags == current->expected_bind_flags, + "Test %u: Got unexpected BindFlags %#x.\n", i, d3d11_desc.BindFlags); + ok(d3d11_desc.CPUAccessFlags == desc.CPUAccessFlags, + "Test %u: Got unexpected CPUAccessFlags %#x.\n", i, d3d11_desc.CPUAccessFlags); + ok(d3d11_desc.MiscFlags == current->expected_misc_flags, + "Test %u: Got unexpected MiscFlags %#x.\n", i, d3d11_desc.MiscFlags); + ok(d3d11_desc.StructureByteStride == 0, + "Test %u: Got unexpected StructureByteStride %u.\n", i, d3d11_desc.StructureByteStride); + + d3d11_device = NULL; + ID3D11Buffer_GetDevice(d3d11_buffer, &d3d11_device); + ok(!!d3d11_device, "Test %u: Got NULL, expected device pointer.\n", i); + ID3D11Device_Release(d3d11_device); + + ID3D11Buffer_Release(d3d11_buffer); + } + + refcount = ID3D10Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + static void test_create_depthstencil_view(void) { D3D10_DEPTH_STENCIL_VIEW_DESC dsv_desc; @@ -3607,6 +3736,7 @@ START_TEST(device) test_create_texture2d(); test_texture2d_interfaces(); test_create_texture3d(); + test_buffer_interfaces(); test_create_depthstencil_view(); test_create_rendertarget_view(); test_create_shader_resource_view(); From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: Jacek Caban : oleaut32: Clean up IPSFactoryBuffer instance. Message-ID: Module: wine Branch: master Commit: 91bd7ffaa80bafa712aaba2d4fe51a9c91f41495 URL: http://source.winehq.org/git/wine.git/?a=commit;h=91bd7ffaa80bafa712aaba2d4fe51a9c91f41495 Author: Jacek Caban Date: Mon Sep 7 13:38:32 2015 +0200 oleaut32: Clean up IPSFactoryBuffer instance. --- dlls/oleaut32/tmarshal.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c index 6608aed..f4ce311 100644 --- a/dlls/oleaut32/tmarshal.c +++ b/dlls/oleaut32/tmarshal.c @@ -2338,17 +2338,12 @@ static const IPSFactoryBufferVtbl psfacbufvtbl = { PSFacBuf_CreateStub }; -/* This is the whole PSFactoryBuffer object, just the vtableptr */ -static const IPSFactoryBufferVtbl *lppsfac = &psfacbufvtbl; +static IPSFactoryBuffer psfac = { &psfacbufvtbl }; /*********************************************************************** * TMARSHAL_DllGetClassObject */ -HRESULT TMARSHAL_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) +HRESULT TMARSHAL_DllGetClassObject(REFCLSID rclsid, REFIID iid, void **ppv) { - if (IsEqualIID(iid,&IID_IPSFactoryBuffer)) { - *ppv = &lppsfac; - return S_OK; - } - return E_NOINTERFACE; + return IPSFactoryBuffer_QueryInterface(&psfac, iid, ppv); } From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: Hugh McMaster : regsvr32: Call InstallDll before UnregisterDll when using /u /i. Message-ID: Module: wine Branch: master Commit: 48c7a3f4d7ffcbe62b70f6b0eab1bc8c79e2e5aa URL: http://source.winehq.org/git/wine.git/?a=commit;h=48c7a3f4d7ffcbe62b70f6b0eab1bc8c79e2e5aa Author: Hugh McMaster Date: Mon Sep 7 20:08:10 2015 +1000 regsvr32: Call InstallDll before UnregisterDll when using /u /i. --- programs/regsvr32/regsvr32.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index a2d83a1..ff6a3ae 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -289,6 +289,12 @@ int wmain(int argc, WCHAR* argv[]) int res = 0; DllFound = TRUE; + if (CallInstall && Unregister) + res = InstallDll(!Unregister, DllName, wsCommandLine); + + if (res) + return res; + if (!CallInstall || (CallInstall && CallRegister)) { if(Unregister) @@ -301,10 +307,8 @@ int wmain(int argc, WCHAR* argv[]) return res; /* Confirmed. The Windows version stops on the first error. */ - if (CallInstall) - { + if (CallInstall && !Unregister) res = InstallDll(!Unregister, DllName, wsCommandLine); - } if (res) return res; From julliard at wine.codeweavers.com Mon Sep 7 09:20:14 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 07 Sep 2015 09:20:14 -0500 Subject: Hugh McMaster : regsvr32: Process the next file in the array if an error occurs. Message-ID: Module: wine Branch: master Commit: 07cc9a34a87cd08c87ae198e4aeb8c9bb7f55175 URL: http://source.winehq.org/git/wine.git/?a=commit;h=07cc9a34a87cd08c87ae198e4aeb8c9bb7f55175 Author: Hugh McMaster Date: Mon Sep 7 20:38:04 2015 +1000 regsvr32: Process the next file in the array if an error occurs. The Windows version stops processing the current file and moves to the next file on the first error. --- programs/regsvr32/regsvr32.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index ff6a3ae..a1b55a3 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -292,8 +292,9 @@ int wmain(int argc, WCHAR* argv[]) if (CallInstall && Unregister) res = InstallDll(!Unregister, DllName, wsCommandLine); + /* The Windows version stops processing the current file on the first error. */ if (res) - return res; + continue; if (!CallInstall || (CallInstall && CallRegister)) { @@ -304,14 +305,13 @@ int wmain(int argc, WCHAR* argv[]) } if (res) - return res; - /* Confirmed. The Windows version stops on the first error. */ + continue; if (CallInstall && !Unregister) res = InstallDll(!Unregister, DllName, wsCommandLine); if (res) - return res; + continue; } } From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Huw Davies : comctl32: Set the item size after LISTVIEW_ScrollColumns(). Message-ID: Module: wine Branch: master Commit: 4f06425a0314103ff5653e6f93a6551a08c39f56 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4f06425a0314103ff5653e6f93a6551a08c39f56 Author: Huw Davies Date: Mon Sep 7 13:51:11 2015 +0100 comctl32: Set the item size after LISTVIEW_ScrollColumns(). LISTVIEW_ScrollColumns() increments the item width by the scroll delta, so we need the original width to still be present. --- dlls/comctl32/listview.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index e1c7cea..e3fad51 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -5674,11 +5674,11 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn) } /* update the other column info */ - LISTVIEW_UpdateItemSize(infoPtr); if(DPA_GetPtrCount(infoPtr->hdpaColumns) == 0) LISTVIEW_InvalidateList(infoPtr); else LISTVIEW_ScrollColumns(infoPtr, nColumn, -(rcCol.right - rcCol.left)); + LISTVIEW_UpdateItemSize(infoPtr); return TRUE; } From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Thomas Faller : kernel32/tests: Fix uninitialized memory of a test case. Message-ID: Module: wine Branch: master Commit: 98aa8528d53365f497b9b6ef9b471aec420b1177 URL: http://source.winehq.org/git/wine.git/?a=commit;h=98aa8528d53365f497b9b6ef9b471aec420b1177 Author: Thomas Faller Date: Mon Sep 7 15:09:35 2015 +0200 kernel32/tests: Fix uninitialized memory of a test case. --- dlls/kernel32/tests/time.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/time.c b/dlls/kernel32/tests/time.c index 838d79c..c4de194 100644 --- a/dlls/kernel32/tests/time.c +++ b/dlls/kernel32/tests/time.c @@ -851,7 +851,8 @@ static void test_GetSystemTimes(void) sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * sbi.NumberOfProcessors); ok( !NtQuerySystemInformation( SystemProcessorPerformanceInformation, sppi, - sizeof(*sppi), &ReturnLength), + sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * sbi.NumberOfProcessors, + &ReturnLength), "NtQuerySystemInformation failed\n" ); for (i = 0; i < sbi.NumberOfProcessors; i++) From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Piotr Caban : rpcrt4: Free server side arguments with MustFree flag first so other arguments may be used to determine its size. Message-ID: Module: wine Branch: master Commit: 614afcefa33c727f31d566c3d7ee05d74afc363f URL: http://source.winehq.org/git/wine.git/?a=commit;h=614afcefa33c727f31d566c3d7ee05d74afc363f Author: Piotr Caban Date: Mon Sep 7 18:45:10 2015 +0200 rpcrt4: Free server side arguments with MustFree flag first so other arguments may be used to determine its size. This also fixes a leak when both MustFree and ServerAllocSize flags are specified. --- dlls/rpcrt4/ndr_stubless.c | 7 +++++-- dlls/rpcrt4/ndr_stubless.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c index 033c650..f5a6bab 100644 --- a/dlls/rpcrt4/ndr_stubless.c +++ b/dlls/rpcrt4/ndr_stubless.c @@ -1161,12 +1161,14 @@ static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg, if (params[i].attr.IsOut || params[i].attr.IsReturn) call_marshaller(pStubMsg, pArg, ¶ms[i]); break; - case STUBLESS_FREE: + case STUBLESS_MUSTFREE: if (params[i].attr.MustFree) { call_freer(pStubMsg, pArg, ¶ms[i]); } - else if (params[i].attr.ServerAllocSize) + break; + case STUBLESS_FREE: + if (params[i].attr.ServerAllocSize) { HeapFree(GetProcessHeap(), 0, *(void **)pArg); } @@ -1455,6 +1457,7 @@ LONG WINAPI NdrStubCall2( case STUBLESS_INITOUT: case STUBLESS_CALCSIZE: case STUBLESS_MARSHAL: + case STUBLESS_MUSTFREE: case STUBLESS_FREE: retval_ptr = stub_do_args(&stubMsg, pFormat, phase, number_of_params); break; diff --git a/dlls/rpcrt4/ndr_stubless.h b/dlls/rpcrt4/ndr_stubless.h index 5b0add0..2e7beba 100644 --- a/dlls/rpcrt4/ndr_stubless.h +++ b/dlls/rpcrt4/ndr_stubless.h @@ -234,6 +234,7 @@ enum stubless_phase STUBLESS_CALCSIZE, STUBLESS_GETBUFFER, STUBLESS_MARSHAL, + STUBLESS_MUSTFREE, STUBLESS_FREE }; From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Bruno Jesus : ws2_32: Try harder to get the host name address in getaddrinfo. Message-ID: Module: wine Branch: master Commit: 18a02d8f41013aa8bf3cdd03750eb706ce52e58c URL: http://source.winehq.org/git/wine.git/?a=commit;h=18a02d8f41013aa8bf3cdd03750eb706ce52e58c Author: Bruno Jesus <00cpxxx at gmail.com> Date: Tue Sep 8 11:14:32 2015 +0800 ws2_32: Try harder to get the host name address in getaddrinfo. --- dlls/ws2_32/socket.c | 18 +++++++++++----- dlls/ws2_32/tests/sock.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index ca82ec9..5cf3e0f 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -5996,7 +5996,7 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr struct addrinfo *unixaires = NULL; int result; struct addrinfo unixhints, *punixhints = NULL; - char *hostname = NULL; + char *hostname; const char *node; *res = NULL; @@ -6006,13 +6006,13 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr return WSAHOST_NOT_FOUND; } + hostname = get_hostname(); + if (!hostname) return WSA_NOT_ENOUGH_MEMORY; + if (!nodename) node = NULL; else if (!nodename[0]) - { - node = hostname = get_hostname(); - if (!node) return WSA_NOT_ENOUGH_MEMORY; - } + node = hostname; else node = nodename; @@ -6056,6 +6056,14 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr /* getaddrinfo(3) is thread safe, no need to wrap in CS */ result = getaddrinfo(node, servname, punixhints, &unixaires); + if (result && !strcmp(hostname, node)) + { + /* If it didn't work it means the host name IP is not in /etc/hosts, try again + * by sending a NULL host and avoid sending a NULL servname too because that + * is invalid */ + ERR_(winediag)("Failed to resolve your host name IP\n"); + result = getaddrinfo(NULL, servname ? servname : "0", punixhints, &unixaires); + } TRACE("%s, %s %p -> %p %d\n", debugstr_a(nodename), debugstr_a(servname), hints, res, result); HeapFree(GetProcessHeap(), 0, hostname); diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 2d14496..03e1627 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -6313,6 +6313,8 @@ static void test_GetAddrInfoW(void) static const WCHAR zero[] = {'0',0}; int i, ret; ADDRINFOW *result, *result2, *p, hint; + WCHAR name[256]; + DWORD size = sizeof(name); if (!pGetAddrInfoW || !pFreeAddrInfoW) { @@ -6320,6 +6322,8 @@ static void test_GetAddrInfoW(void) return; } memset(&hint, 0, sizeof(ADDRINFOW)); + name[0] = 0; + GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size ); result = (ADDRINFOW *)0xdeadbeef; WSASetLastError(0xdeadbeef); @@ -6395,6 +6399,30 @@ static void test_GetAddrInfoW(void) ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); pFreeAddrInfoW(result); + /* try to get information from the computer name, result is the same + * as if requesting with an empty host name. */ + ret = pGetAddrInfoW(name, NULL, NULL, &result); + ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + + ret = pGetAddrInfoW(empty, NULL, NULL, &result2); + ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + compare_addrinfow(result, result2); + pFreeAddrInfoW(result); + pFreeAddrInfoW(result2); + + ret = pGetAddrInfoW(name, empty, NULL, &result); + ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + + ret = pGetAddrInfoW(empty, empty, NULL, &result2); + ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + compare_addrinfow(result, result2); + pFreeAddrInfoW(result); + pFreeAddrInfoW(result2); + result = (ADDRINFOW *)0xdeadbeef; WSASetLastError(0xdeadbeef); ret = pGetAddrInfoW(NULL, NULL, NULL, &result); @@ -6475,6 +6503,8 @@ static void test_getaddrinfo(void) { int i, ret; ADDRINFOA *result, *result2, *p, hint; + CHAR name[256]; + DWORD size = sizeof(name); if (!pgetaddrinfo || !pfreeaddrinfo) { @@ -6482,6 +6512,7 @@ static void test_getaddrinfo(void) return; } memset(&hint, 0, sizeof(ADDRINFOA)); + GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size ); result = (ADDRINFOA *)0xdeadbeef; WSASetLastError(0xdeadbeef); @@ -6558,6 +6589,30 @@ static void test_getaddrinfo(void) ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); pfreeaddrinfo(result); + /* try to get information from the computer name, result is the same + * as if requesting with an empty host name. */ + ret = pgetaddrinfo(name, NULL, NULL, &result); + ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + + ret = pgetaddrinfo("", NULL, NULL, &result2); + ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + compare_addrinfo(result, result2); + pfreeaddrinfo(result); + pfreeaddrinfo(result2); + + ret = pgetaddrinfo(name, "", NULL, &result); + ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + + ret = pgetaddrinfo("", "", NULL, &result2); + ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); + ok(result != NULL, "GetAddrInfoW failed\n"); + compare_addrinfo(result, result2); + pfreeaddrinfo(result); + pfreeaddrinfo(result2); + result = (ADDRINFOA *)0xdeadbeef; WSASetLastError(0xdeadbeef); ret = pgetaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result); From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Gerald Pfeifer : gdi32: Avoid two cases of shift overflow in get_glyph_indices. Message-ID: Module: wine Branch: master Commit: 775de7922ef363d665b1cb19dc7c00269779030d URL: http://source.winehq.org/git/wine.git/?a=commit;h=775de7922ef363d665b1cb19dc7c00269779030d Author: Gerald Pfeifer Date: Mon Sep 7 23:52:55 2015 +0200 gdi32: Avoid two cases of shift overflow in get_glyph_indices. --- dlls/gdi32/tests/font.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index 3757a8d..6b0da1f 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -2391,12 +2391,12 @@ static BOOL get_glyph_indices(INT charset, UINT code_page, WORD *idx, UINT count if (charset == SYMBOL_CHARSET) { ok(strcmp("Arial", name), "face name should NOT be Arial\n"); - ok(fs.fsCsb[0] & (1 << 31), "symbol encoding should be available\n"); + ok(fs.fsCsb[0] & (1u << 31), "symbol encoding should be available\n"); } else { ok(!strcmp("Arial", name), "face name should be Arial, not %s\n", name); - ok(!(fs.fsCsb[0] & (1 << 31)), "symbol encoding should NOT be available\n"); + ok(!(fs.fsCsb[0] & (1u << 31)), "symbol encoding should NOT be available\n"); } if (!TranslateCharsetInfo((DWORD *)(INT_PTR)cs, &csi, TCI_SRCCHARSET)) From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Gerald Pfeifer : mshtml: Adjust NS_ERROR_GENERATE_FAILURE to avoid shift overflow. Message-ID: Module: wine Branch: master Commit: a0da827d61640e91302d96492ce5f0ce9f06948a URL: http://source.winehq.org/git/wine.git/?a=commit;h=a0da827d61640e91302d96492ce5f0ce9f06948a Author: Gerald Pfeifer Date: Mon Sep 7 23:51:57 2015 +0200 mshtml: Adjust NS_ERROR_GENERATE_FAILURE to avoid shift overflow. --- dlls/mshtml/mshtml_private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 58ef423..55375d4 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -40,7 +40,7 @@ #include "nsiface.h" #define NS_ERROR_GENERATE_FAILURE(module,code) \ - ((nsresult) (((UINT32)(1<<31)) | ((UINT32)(module+0x45)<<16) | ((UINT32)(code)))) + ((nsresult) (((UINT32)(1u<<31)) | ((UINT32)(module+0x45)<<16) | ((UINT32)(code)))) #define NS_OK ((nsresult)0x00000000L) #define NS_ERROR_FAILURE ((nsresult)0x80004005L) From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Nikolay Sivov : dwrite: Return stub IDWriteFontList from GetMatchingFonts( ). Message-ID: Module: wine Branch: master Commit: 6dd9cdca4b2cae8aba317b1f8fb374dcf5e15481 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6dd9cdca4b2cae8aba317b1f8fb374dcf5e15481 Author: Nikolay Sivov Date: Tue Sep 8 11:40:25 2015 +0300 dwrite: Return stub IDWriteFontList from GetMatchingFonts(). --- dlls/dwrite/font.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 3 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index a181395..4689075 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -94,6 +94,11 @@ struct dwrite_font_data { BOOL oblique_sim_tested : 1; }; +struct dwrite_fontlist { + IDWriteFontList IDWriteFontList_iface; + LONG ref; +}; + struct dwrite_fontfamily_data { LONG ref; @@ -241,6 +246,11 @@ static inline struct dwrite_colorglyphenum *impl_from_IDWriteColorGlyphRunEnumer return CONTAINING_RECORD(iface, struct dwrite_colorglyphenum, IDWriteColorGlyphRunEnumerator_iface); } +static inline struct dwrite_fontlist *impl_from_IDWriteFontList(IDWriteFontList *iface) +{ + return CONTAINING_RECORD(iface, struct dwrite_fontlist, IDWriteFontList_iface); +} + static inline const char *debugstr_tag(UINT32 tag) { return wine_dbg_sprintf("%c%c%c%c", tag & 0xff, (tag >> 8) & 0xff, (tag >> 16) & 0xff, tag >> 24); @@ -1447,6 +1457,83 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam return S_OK; } +/* IDWriteFontList */ +static HRESULT WINAPI dwritefontlist_QueryInterface(IDWriteFontList *iface, REFIID riid, void **obj) +{ + struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IDWriteFontList) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IDWriteFontList_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI dwritefontlist_AddRef(IDWriteFontList *iface) +{ + struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); + ULONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p)->(%d)\n", This, ref); + return ref; +} + +static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface) +{ + struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%d)\n", This, ref); + + if (!ref) { + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, IDWriteFontCollection **collection) +{ + struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); + + FIXME("(%p)->(%p): stub\n", This, collection); + + return E_NOTIMPL; +} + +static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList *iface) +{ + struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); + FIXME("(%p): stub\n", This); + return 0; +} + +static HRESULT WINAPI dwritefontlist_GetFont(IDWriteFontList *iface, UINT32 index, IDWriteFont **font) +{ + struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); + + FIXME("(%p)->(%u %p): stub\n", This, index, font); + + *font = NULL; + + return E_NOTIMPL; +} + +static const IDWriteFontListVtbl dwritefontlistvtbl = { + dwritefontlist_QueryInterface, + dwritefontlist_AddRef, + dwritefontlist_Release, + dwritefontlist_GetFontCollection, + dwritefontlist_GetFontCount, + dwritefontlist_GetFont +}; + static HRESULT WINAPI dwritefontfamily_QueryInterface(IDWriteFontFamily *iface, REFIID riid, void **obj) { struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface); @@ -1598,11 +1685,23 @@ static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily *i } static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface, DWRITE_FONT_WEIGHT weight, - DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFontList **fonts) + DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFontList **ret) { struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface); - FIXME("(%p)->(%d %d %d %p): stub\n", This, weight, stretch, style, fonts); - return E_NOTIMPL; + struct dwrite_fontlist *fonts; + + TRACE("(%p)->(%d %d %d %p)\n", This, weight, stretch, style, ret); + + *ret = NULL; + + fonts = heap_alloc(sizeof(*fonts)); + if (!fonts) + return E_OUTOFMEMORY; + fonts->IDWriteFontList_iface.lpVtbl = &dwritefontlistvtbl; + fonts->ref = 1; + + *ret = &fonts->IDWriteFontList_iface; + return S_OK; } static const IDWriteFontFamilyVtbl fontfamilyvtbl = { From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Nikolay Sivov : dwrite: Track face styles added to a family. Message-ID: Module: wine Branch: master Commit: 42a99a8de596f8f399038cb956bea78bd0f3dc4b URL: http://source.winehq.org/git/wine.git/?a=commit;h=42a99a8de596f8f399038cb956bea78bd0f3dc4b Author: Nikolay Sivov Date: Tue Sep 8 11:40:54 2015 +0300 dwrite: Track face styles added to a family. --- dlls/dwrite/font.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 4689075..2129094 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -107,6 +107,9 @@ struct dwrite_fontfamily_data { struct dwrite_font_data **fonts; UINT32 font_count; UINT32 font_alloc; + BOOL has_normal_face : 1; + BOOL has_oblique_face : 1; + BOOL has_italic_face : 1; }; struct dwrite_fontcollection { @@ -1936,6 +1939,12 @@ static HRESULT fontfamily_add_font(struct dwrite_fontfamily_data *family_data, s family_data->fonts[family_data->font_count] = font_data; family_data->font_count++; + if (font_data->style == DWRITE_FONT_STYLE_NORMAL) + family_data->has_normal_face = TRUE; + else if (font_data->style == DWRITE_FONT_STYLE_OBLIQUE) + family_data->has_oblique_face = TRUE; + else + family_data->has_italic_face = TRUE; return S_OK; } @@ -2815,6 +2824,9 @@ static HRESULT init_fontfamily_data(IDWriteLocalizedStrings *familyname, struct data->ref = 1; data->font_count = 0; data->font_alloc = 2; + data->has_normal_face = FALSE; + data->has_oblique_face = FALSE; + data->has_italic_face = FALSE; data->fonts = heap_alloc(sizeof(*data->fonts)*data->font_alloc); if (!data->fonts) { From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Nikolay Sivov : dwrite: Implement GetFont() for matching list. Message-ID: Module: wine Branch: master Commit: 9c198982174d30e7fc933aeb526d8e508ba39940 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9c198982174d30e7fc933aeb526d8e508ba39940 Author: Nikolay Sivov Date: Tue Sep 8 11:41:28 2015 +0300 dwrite: Implement GetFont() for matching list. --- dlls/dwrite/font.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 4 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 2129094..aea35c9 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -97,6 +97,10 @@ struct dwrite_font_data { struct dwrite_fontlist { IDWriteFontList IDWriteFontList_iface; LONG ref; + + IDWriteFontFamily *family; + struct dwrite_font_data **fonts; + UINT32 font_count; }; struct dwrite_fontfamily_data { @@ -1495,6 +1499,11 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface) TRACE("(%p)->(%d)\n", This, ref); if (!ref) { + UINT32 i; + + for (i = 0; i < This->font_count; i++) + release_font_data(This->fonts[i]); + IDWriteFontFamily_Release(This->family); heap_free(This); } @@ -1513,19 +1522,25 @@ static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, I static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList *iface) { struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); - FIXME("(%p): stub\n", This); - return 0; + TRACE("(%p)\n", This); + return This->font_count; } static HRESULT WINAPI dwritefontlist_GetFont(IDWriteFontList *iface, UINT32 index, IDWriteFont **font) { struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); - FIXME("(%p)->(%u %p): stub\n", This, index, font); + TRACE("(%p)->(%u %p)\n", This, index, font); *font = NULL; - return E_NOTIMPL; + if (This->font_count == 0) + return S_FALSE; + + if (index >= This->font_count) + return E_INVALIDARG; + + return create_font(This->fonts[index], This->family, font); } static const IDWriteFontListVtbl dwritefontlistvtbl = { @@ -1687,11 +1702,48 @@ static HRESULT WINAPI dwritefontfamily_GetFirstMatchingFont(IDWriteFontFamily *i return create_font(match, iface, font); } +typedef BOOL (*matching_filter_func)(const struct dwrite_font_data*); + +static BOOL is_font_acceptable_for_normal(const struct dwrite_font_data *font) +{ + return font->style == DWRITE_FONT_STYLE_NORMAL || font->style == DWRITE_FONT_STYLE_ITALIC; +} + +static BOOL is_font_acceptable_for_oblique_italic(const struct dwrite_font_data *font) +{ + return font->style == DWRITE_FONT_STYLE_OBLIQUE || font->style == DWRITE_FONT_STYLE_ITALIC; +} + +static void matchingfonts_sort(struct dwrite_fontlist *fonts, const struct dwrite_font_propvec *req) +{ + UINT32 b = fonts->font_count - 1, j, t; + + while (1) { + t = b; + + for (j = 0; j < b; j++) { + if (is_better_font_match(&fonts->fonts[j+1]->propvec, &fonts->fonts[j]->propvec, req)) { + struct dwrite_font_data *s = fonts->fonts[j]; + fonts->fonts[j] = fonts->fonts[j+1]; + fonts->fonts[j+1] = s; + t = j; + } + } + + if (t == b) + break; + b = t; + }; +} + static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STRETCH stretch, DWRITE_FONT_STYLE style, IDWriteFontList **ret) { struct dwrite_fontfamily *This = impl_from_IDWriteFontFamily(iface); + matching_filter_func func = NULL; + struct dwrite_font_propvec req; struct dwrite_fontlist *fonts; + UINT32 i; TRACE("(%p)->(%d %d %d %p)\n", This, weight, stretch, style, ret); @@ -1700,8 +1752,41 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily *iface fonts = heap_alloc(sizeof(*fonts)); if (!fonts) return E_OUTOFMEMORY; + + /* Allocate as many as family has, not all of them will be necessary used. */ + fonts->fonts = heap_alloc(sizeof(*fonts->fonts) * This->data->font_count); + if (!fonts->fonts) { + heap_free(fonts); + return E_OUTOFMEMORY; + } + fonts->IDWriteFontList_iface.lpVtbl = &dwritefontlistvtbl; fonts->ref = 1; + fonts->family = iface; + IDWriteFontFamily_AddRef(fonts->family); + fonts->font_count = 0; + + /* Normal style accepts Normal or Italic, Oblique and Italic - both Oblique and Italic styles */ + if (style == DWRITE_FONT_STYLE_NORMAL) { + if (This->data->has_normal_face || This->data->has_italic_face) + func = is_font_acceptable_for_normal; + } + else /* requested oblique or italic */ { + if (This->data->has_oblique_face || This->data->has_italic_face) + func = is_font_acceptable_for_oblique_italic; + } + + for (i = 0; i < This->data->font_count; i++) { + if (!func || func(This->data->fonts[i])) { + fonts->fonts[fonts->font_count] = This->data->fonts[i]; + InterlockedIncrement(&This->data->fonts[i]->ref); + fonts->font_count++; + } + } + + /* now potential matches are sorted using same criteria GetFirstMatchingFont uses */ + init_font_prop_vec(weight, stretch, style, &req); + matchingfonts_sort(fonts, &req); *ret = &fonts->IDWriteFontList_iface; return S_OK; From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: Nikolay Sivov : dwrite: Implement GetFontCollection() for matching list. Message-ID: Module: wine Branch: master Commit: b55e599a4d1f4c8055f802c4e3109d3337e0a42e URL: http://source.winehq.org/git/wine.git/?a=commit;h=b55e599a4d1f4c8055f802c4e3109d3337e0a42e Author: Nikolay Sivov Date: Tue Sep 8 11:41:59 2015 +0300 dwrite: Implement GetFontCollection() for matching list. --- dlls/dwrite/font.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index aea35c9..6a46a1a 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -1513,10 +1513,7 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList *iface) static HRESULT WINAPI dwritefontlist_GetFontCollection(IDWriteFontList *iface, IDWriteFontCollection **collection) { struct dwrite_fontlist *This = impl_from_IDWriteFontList(iface); - - FIXME("(%p)->(%p): stub\n", This, collection); - - return E_NOTIMPL; + return IDWriteFontFamily_GetFontCollection(This->family, collection); } static UINT32 WINAPI dwritefontlist_GetFontCount(IDWriteFontList *iface) From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d9/tests: Test D3DBACKBUFFER_TYPE. Message-ID: Module: wine Branch: master Commit: 2e8e2da5ee22779eb77e04bc851ccbfb83749d62 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e8e2da5ee22779eb77e04bc851ccbfb83749d62 Author: Stefan D?singer Date: Tue Sep 8 10:24:48 2015 +0200 d3d9/tests: Test D3DBACKBUFFER_TYPE. --- dlls/d3d9/tests/device.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index c41a5e6..3bf0ff2 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -1053,7 +1053,7 @@ static void test_swapchain(void) IDirect3DSwapChain9 *swapchain2; IDirect3DSwapChain9 *swapchain3; IDirect3DSwapChain9 *swapchainX; - IDirect3DSurface9 *backbuffer; + IDirect3DSurface9 *backbuffer, *stereo_buffer; D3DPRESENT_PARAMETERS d3dpp; IDirect3DDevice9 *device; IDirect3D9 *d3d; @@ -1103,6 +1103,33 @@ static void test_swapchain(void) ok(backbuffer != NULL, "The back buffer is NULL\n"); if(backbuffer) IDirect3DSurface9_Release(backbuffer); + /* The back buffer type value is ignored. */ + hr = IDirect3DSwapChain9_GetBackBuffer(swapchain0, 0, D3DBACKBUFFER_TYPE_LEFT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected left back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface9_Release(stereo_buffer); + hr = IDirect3DSwapChain9_GetBackBuffer(swapchain0, 0, D3DBACKBUFFER_TYPE_RIGHT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected right back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface9_Release(stereo_buffer); + hr = IDirect3DSwapChain9_GetBackBuffer(swapchain0, 0, (D3DBACKBUFFER_TYPE)0xdeadbeef, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected unknown buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface9_Release(stereo_buffer); + + hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, D3DBACKBUFFER_TYPE_LEFT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected left back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface9_Release(stereo_buffer); + hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, D3DBACKBUFFER_TYPE_RIGHT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected right back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface9_Release(stereo_buffer); + hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, (D3DBACKBUFFER_TYPE)0xdeadbeef, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected unknown buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface9_Release(stereo_buffer); + /* Try to get a nonexistent swapchain */ hr = IDirect3DDevice9_GetSwapChain(device, 1, &swapchainX); ok(hr == D3DERR_INVALIDCALL, "GetSwapChain on an nonexistent swapchain returned (%08x)\n", hr); From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d8/tests: Test D3DBACKBUFFER_TYPE. Message-ID: Module: wine Branch: master Commit: 9d29be28006fa8befa8dcee7cdab76f2dcab24c6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d29be28006fa8befa8dcee7cdab76f2dcab24c6 Author: Stefan D?singer Date: Mon Sep 7 23:50:33 2015 +0200 d3d8/tests: Test D3DBACKBUFFER_TYPE. --- dlls/d3d8/tests/device.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 47326b5..cb7f5e1 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -257,7 +257,7 @@ static void test_swapchain(void) IDirect3DSwapChain8 *swapchain1; IDirect3DSwapChain8 *swapchain2; IDirect3DSwapChain8 *swapchain3; - IDirect3DSurface8 *backbuffer; + IDirect3DSurface8 *backbuffer, *stereo_buffer; D3DPRESENT_PARAMETERS d3dpp; IDirect3DDevice8 *device; IDirect3D8 *d3d; @@ -286,6 +286,24 @@ static void test_swapchain(void) ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); ok(!backbuffer, "The back buffer pointer is %p, expected NULL.\n", backbuffer); + hr = IDirect3DDevice8_GetBackBuffer(device, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer); + ok(SUCCEEDED(hr), "Failed to get back buffer, hr %#x.\n", hr); + IDirect3DSurface8_Release(backbuffer); + + /* The back buffer type value is ignored. */ + hr = IDirect3DDevice8_GetBackBuffer(device, 0, D3DBACKBUFFER_TYPE_LEFT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected left back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface8_Release(stereo_buffer); + hr = IDirect3DDevice8_GetBackBuffer(device, 0, D3DBACKBUFFER_TYPE_RIGHT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected right back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface8_Release(stereo_buffer); + hr = IDirect3DDevice8_GetBackBuffer(device, 0, (D3DBACKBUFFER_TYPE)0xdeadbeef, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected unknown buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface8_Release(stereo_buffer); + memset(&d3dpp, 0, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; @@ -315,6 +333,20 @@ static void test_swapchain(void) ok(backbuffer != NULL && backbuffer != (void *) 0xdeadbeef, "The back buffer is %p\n", backbuffer); if(backbuffer && backbuffer != (void *) 0xdeadbeef) IDirect3DSurface8_Release(backbuffer); + /* The back buffer type value is ignored. */ + hr = IDirect3DSwapChain8_GetBackBuffer(swapchain3, 0, D3DBACKBUFFER_TYPE_LEFT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected left back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface8_Release(stereo_buffer); + hr = IDirect3DSwapChain8_GetBackBuffer(swapchain3, 0, D3DBACKBUFFER_TYPE_RIGHT, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected right back buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface8_Release(stereo_buffer); + hr = IDirect3DSwapChain8_GetBackBuffer(swapchain3, 0, (D3DBACKBUFFER_TYPE)0xdeadbeef, &stereo_buffer); + ok(SUCCEEDED(hr), "Failed to get the back buffer, hr %#x.\n", hr); + ok(stereo_buffer == backbuffer, "Expected unknown buffer = %p, got %p.\n", backbuffer, stereo_buffer); + IDirect3DSurface8_Release(stereo_buffer); + backbuffer = (void *) 0xdeadbeef; hr = IDirect3DSwapChain8_GetBackBuffer(swapchain3, 1, 0, &backbuffer); ok(SUCCEEDED(hr), "Failed to get the 2nd back buffer (%#08x)\n", hr); From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Remove wined3d_backbuffer_type. Message-ID: Module: wine Branch: master Commit: 2936e4ac54b14cc09c5b20b06b17fdb0545374b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2936e4ac54b14cc09c5b20b06b17fdb0545374b8 Author: Stefan D?singer Date: Mon Sep 7 23:50:34 2015 +0200 wined3d: Remove wined3d_backbuffer_type. --- dlls/d3d8/device.c | 5 +++-- dlls/d3d8/swapchain.c | 5 +++-- dlls/d3d9/device.c | 5 +++-- dlls/d3d9/swapchain.c | 5 +++-- dlls/dxgi/swapchain.c | 6 ++---- dlls/wined3d/swapchain.c | 6 +++--- include/wine/wined3d.h | 9 +-------- 7 files changed, 18 insertions(+), 23 deletions(-) diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 455c764..e899b34 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -732,6 +732,8 @@ static HRESULT WINAPI d3d8_device_GetBackBuffer(IDirect3DDevice8 *iface, TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + /* backbuffer_type is ignored by native. */ + /* No need to check for backbuffer == NULL, Windows crashes in that case. */ wined3d_mutex_lock(); if (!(swapchain = wined3d_device_get_swapchain(device->wined3d_device, 0))) @@ -741,8 +743,7 @@ static HRESULT WINAPI d3d8_device_GetBackBuffer(IDirect3DDevice8 *iface, return D3DERR_INVALIDCALL; } - if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain, - backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) + if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain, backbuffer_idx))) { wined3d_mutex_unlock(); *backbuffer = NULL; diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c index 70b7fb0..8efdd0a 100644 --- a/dlls/d3d8/swapchain.c +++ b/dlls/d3d8/swapchain.c @@ -120,6 +120,8 @@ static HRESULT WINAPI d3d8_swapchain_GetBackBuffer(IDirect3DSwapChain8 *iface, TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + /* backbuffer_type is ignored by native. */ + if (!backbuffer) { WARN("The output pointer is NULL, returning D3DERR_INVALIDCALL.\n"); @@ -127,8 +129,7 @@ static HRESULT WINAPI d3d8_swapchain_GetBackBuffer(IDirect3DSwapChain8 *iface, } wined3d_mutex_lock(); - if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, - backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) + if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, backbuffer_idx))) { wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); surface_impl = wined3d_resource_get_parent(wined3d_resource); diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 01a6d9e..3a0376d 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -754,6 +754,8 @@ static HRESULT WINAPI d3d9_device_GetBackBuffer(IDirect3DDevice9Ex *iface, UINT TRACE("iface %p, swapchain %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, swapchain, backbuffer_idx, backbuffer_type, backbuffer); + /* backbuffer_type is ignored by native. */ + /* No need to check for backbuffer == NULL, Windows crashes in that case. */ wined3d_mutex_lock(); @@ -764,8 +766,7 @@ static HRESULT WINAPI d3d9_device_GetBackBuffer(IDirect3DDevice9Ex *iface, UINT return D3DERR_INVALIDCALL; } - if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(wined3d_swapchain, - backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) + if (!(wined3d_texture = wined3d_swapchain_get_back_buffer(wined3d_swapchain, backbuffer_idx))) { wined3d_mutex_unlock(); *backbuffer = NULL; diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c index b26a482..c995afb 100644 --- a/dlls/d3d9/swapchain.c +++ b/dlls/d3d9/swapchain.c @@ -160,6 +160,8 @@ static HRESULT WINAPI d3d9_swapchain_GetBackBuffer(IDirect3DSwapChain9Ex *iface, TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, backbuffer_idx, backbuffer_type, backbuffer); + /* backbuffer_type is ignored by native. */ + if (!backbuffer) { WARN("The output pointer is NULL, returning D3DERR_INVALIDCALL.\n"); @@ -167,8 +169,7 @@ static HRESULT WINAPI d3d9_swapchain_GetBackBuffer(IDirect3DSwapChain9Ex *iface, } wined3d_mutex_lock(); - if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, - backbuffer_idx, (enum wined3d_backbuffer_type)backbuffer_type))) + if ((wined3d_texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, backbuffer_idx))) { wined3d_resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); surface_impl = wined3d_resource_get_parent(wined3d_resource); diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 10ae26d..366bdb9 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -152,8 +152,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, EnterCriticalSection(&dxgi_cs); - if (!(texture = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, - buffer_idx, WINED3D_BACKBUFFER_TYPE_MONO))) + if (!(texture = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, buffer_idx))) { LeaveCriticalSection(&dxgi_cs); return DXGI_ERROR_INVALID_CALL; @@ -235,8 +234,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *if wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); for (i = 0; i < wined3d_desc.backbuffer_count; ++i) { - texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, - i, WINED3D_BACKBUFFER_TYPE_MONO); + texture = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, i); parent = wined3d_texture_get_parent(texture); IUnknown_AddRef(parent); if (IUnknown_Release(parent)) diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 8fb9f6a..b37bbb9 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -178,10 +178,10 @@ HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapc } struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, - UINT back_buffer_idx, enum wined3d_backbuffer_type type) + UINT back_buffer_idx) { - TRACE("swapchain %p, back_buffer_idx %u, type %#x.\n", - swapchain, back_buffer_idx, type); + TRACE("swapchain %p, back_buffer_idx %u.\n", + swapchain, back_buffer_idx); /* Return invalid if there is no backbuffer array, otherwise it will * crash when ddraw is used (there swapchain->back_buffers is always diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 9c77cfe..7d4e5a0 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -503,13 +503,6 @@ enum wined3d_patch_edge_style WINED3D_PATCH_EDGE_CONTINUOUS = 1, }; -enum wined3d_backbuffer_type -{ - WINED3D_BACKBUFFER_TYPE_MONO = 0, - WINED3D_BACKBUFFER_TYPE_LEFT = 1, - WINED3D_BACKBUFFER_TYPE_RIGHT = 2, -}; - enum wined3d_swap_effect { WINED3D_SWAP_EFFECT_DISCARD = 1, @@ -2512,7 +2505,7 @@ HRESULT __cdecl wined3d_swapchain_create(struct wined3d_device *device, struct w void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain); ULONG __cdecl wined3d_swapchain_decref(struct wined3d_swapchain *swapchain); struct wined3d_texture * __cdecl wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, - UINT backbuffer_idx, enum wined3d_backbuffer_type backbuffer_type); + UINT backbuffer_idx); struct wined3d_device * __cdecl wined3d_swapchain_get_device(const struct wined3d_swapchain *swapchain); HRESULT __cdecl wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain, struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation); From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Remove old surface flipping hacks. Message-ID: Module: wine Branch: master Commit: ebd6bf7f7a3493284b2aaa21ce3ab982336e3835 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ebd6bf7f7a3493284b2aaa21ce3ab982336e3835 Author: Stefan D?singer Date: Mon Sep 7 23:50:35 2015 +0200 wined3d: Remove old surface flipping hacks. They're non-functional these days anyway. --- dlls/wined3d/surface.c | 77 ------------------------------------------ dlls/wined3d/swapchain.c | 47 +++++--------------------- dlls/wined3d/wined3d_private.h | 1 - 3 files changed, 9 insertions(+), 116 deletions(-) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index f303d90..f01260c 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -2881,83 +2881,6 @@ void surface_prepare_rb(struct wined3d_surface *surface, const struct wined3d_gl } } -void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) -{ - if (front->container->level_count != 1 || front->container->layer_count != 1 - || back->container->level_count != 1 || back->container->layer_count != 1) - ERR("Flip between surfaces %p and %p not supported.\n", front, back); - - /* Flip the surface contents */ - /* Flip the DC */ - { - HDC tmp; - tmp = front->hDC; - front->hDC = back->hDC; - back->hDC = tmp; - } - - /* Flip the DIBsection */ - { - HBITMAP tmp = front->dib.DIBsection; - front->dib.DIBsection = back->dib.DIBsection; - back->dib.DIBsection = tmp; - } - - /* Flip the surface data */ - { - void* tmp; - - tmp = front->dib.bitmap_data; - front->dib.bitmap_data = back->dib.bitmap_data; - back->dib.bitmap_data = tmp; - - tmp = front->resource.heap_memory; - front->resource.heap_memory = back->resource.heap_memory; - back->resource.heap_memory = tmp; - } - - /* Flip the PBO */ - { - GLuint tmp_pbo = front->pbo; - front->pbo = back->pbo; - back->pbo = tmp_pbo; - } - - /* Flip the opengl texture */ - { - GLuint tmp; - - tmp = back->container->texture_rgb.name; - back->container->texture_rgb.name = front->container->texture_rgb.name; - front->container->texture_rgb.name = tmp; - - tmp = back->container->texture_srgb.name; - back->container->texture_srgb.name = front->container->texture_srgb.name; - front->container->texture_srgb.name = tmp; - - tmp = back->rb_multisample; - back->rb_multisample = front->rb_multisample; - front->rb_multisample = tmp; - - tmp = back->rb_resolved; - back->rb_resolved = front->rb_resolved; - front->rb_resolved = tmp; - - resource_unload(&back->resource); - resource_unload(&front->resource); - } - - { - DWORD tmp_flags = back->flags; - back->flags = front->flags; - front->flags = tmp_flags; - - tmp_flags = back->locations; - back->locations = front->locations; - front->locations = tmp_flags; - } -} - /* Does a direct frame buffer -> texture copy. Stretching is done with single * pixel copy calls. */ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struct wined3d_surface *src_surface, diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index b37bbb9..0a1373f 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -555,45 +555,16 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT } front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); - if (!swapchain->render_to_fbo && ((front->locations & WINED3D_LOCATION_SYSMEM) - || (back_buffer->locations & WINED3D_LOCATION_SYSMEM))) - { - /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying - * Doesn't work with render_to_fbo because we're not flipping - */ - - if (front->resource.size == back_buffer->resource.size) - { - flip_surface(front, back_buffer); - /* Tell the front buffer surface that is has been modified. However, - * the other locations were preserved during that, so keep the flags. - * This serves to update the emulated overlay, if any. */ - surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); - } - else - { - surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); - surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); - surface_validate_location(back_buffer, WINED3D_LOCATION_DRAWABLE); - surface_invalidate_location(back_buffer, ~WINED3D_LOCATION_DRAWABLE); - } - } - else - { - surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); - surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); - /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM - * and INTEXTURE copies can keep their old content if they have any defined content. - * If the swapeffect is COPY, the content remains the same. If it is FLIP however, - * the texture / sysmem copy needs to be reloaded from the drawable - */ - if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) - { - surface_validate_location(back_buffer, back_buffer->container->resource.draw_binding); - surface_invalidate_location(back_buffer, ~back_buffer->container->resource.draw_binding); - } - } + surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); + surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); + /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM + * and INTEXTURE copies can keep their old content if they have any defined content. + * If the swapeffect is COPY, the content remains the same. + * + * The FLIP swap effect is not implemented yet. We could mark WINED3D_LOCATION_DRAWABLE + * up to date and hope WGL flipped front and back buffers and read this data into + * the FBO. Don't bother about this for now. */ if (fb->depth_stencil) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index d1ba5e4..758af54 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2456,7 +2456,6 @@ void wined3d_surface_upload_data(struct wined3d_surface *surface, const struct w void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; -void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN; /* Surface flags: */ #define SFLAG_DIBSECTION 0x00000001 /* Has a DIB section attached for GetDC. */ From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_depthstencil_view to d3d_depthstencil_view. Message-ID: Module: wine Branch: master Commit: 185f9bb35157f1e6de94213e0f2b2b508539ae86 URL: http://source.winehq.org/git/wine.git/?a=commit;h=185f9bb35157f1e6de94213e0f2b2b508539ae86 Author: J?zef Kucia Date: Tue Sep 8 01:12:41 2015 +0200 d3d11: Rename d3d10_depthstencil_view to d3d_depthstencil_view. --- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 8 ++++---- dlls/d3d11/view.c | 24 ++++++++++++------------ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 49e40ea..e702b41 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -150,7 +150,7 @@ HRESULT d3d_buffer_create(struct d3d_device *device, const D3D11_BUFFER_DESC *de struct d3d_buffer *unsafe_impl_from_ID3D10Buffer(ID3D10Buffer *iface) DECLSPEC_HIDDEN; /* ID3D10DepthStencilView */ -struct d3d10_depthstencil_view +struct d3d_depthstencil_view { ID3D10DepthStencilView ID3D10DepthStencilView_iface; LONG refcount; @@ -162,9 +162,9 @@ struct d3d10_depthstencil_view ID3D10Device1 *device; }; -HRESULT d3d10_depthstencil_view_init(struct d3d10_depthstencil_view *view, struct d3d_device *device, +HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3d_device *device, ID3D10Resource *resource, const D3D10_DEPTH_STENCIL_VIEW_DESC *desc) DECLSPEC_HIDDEN; -struct d3d10_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) DECLSPEC_HIDDEN; +struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) DECLSPEC_HIDDEN; /* ID3D10RenderTargetView */ struct d3d10_rendertarget_view diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 97a3404..e62e3e9 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -921,7 +921,7 @@ static void STDMETHODCALLTYPE d3d10_device_OMSetRenderTargets(ID3D10Device1 *ifa ID3D10DepthStencilView *depth_stencil_view) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_depthstencil_view *dsv; + struct d3d_depthstencil_view *dsv; unsigned int i; TRACE("iface %p, render_target_view_count %u, render_target_views %p, depth_stencil_view %p.\n", @@ -1701,7 +1701,7 @@ static void STDMETHODCALLTYPE d3d10_device_OMGetRenderTargets(ID3D10Device1 *ifa if (depth_stencil_view) { - struct d3d10_depthstencil_view *view_impl; + struct d3d_depthstencil_view *view_impl; if (!(wined3d_view = wined3d_device_get_depth_stencil_view(device->wined3d_device)) || !(view_impl = wined3d_rendertarget_view_get_parent(wined3d_view))) @@ -2137,7 +2137,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateDepthStencilView(ID3D10Devic ID3D10Resource *resource, const D3D10_DEPTH_STENCIL_VIEW_DESC *desc, ID3D10DepthStencilView **view) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_depthstencil_view *object; + struct d3d_depthstencil_view *object; HRESULT hr; TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); @@ -2145,7 +2145,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateDepthStencilView(ID3D10Devic if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; - if (FAILED(hr = d3d10_depthstencil_view_init(object, device, resource, desc))) + if (FAILED(hr = d3d_depthstencil_view_init(object, device, resource, desc))) { WARN("Failed to initialize depthstencil view, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index c6b0906..eaf34a3 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -357,9 +357,9 @@ static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, I } } -static inline struct d3d10_depthstencil_view *impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) +static inline struct d3d_depthstencil_view *impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) { - return CONTAINING_RECORD(iface, struct d3d10_depthstencil_view, ID3D10DepthStencilView_iface); + return CONTAINING_RECORD(iface, struct d3d_depthstencil_view, ID3D10DepthStencilView_iface); } /* IUnknown methods */ @@ -387,7 +387,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_QueryInterface(ID3D10De static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_AddRef(ID3D10DepthStencilView *iface) { - struct d3d10_depthstencil_view *This = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *This = impl_from_ID3D10DepthStencilView(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u.\n", This, refcount); @@ -397,7 +397,7 @@ static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_AddRef(ID3D10DepthStencil static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_Release(ID3D10DepthStencilView *iface) { - struct d3d10_depthstencil_view *This = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *This = impl_from_ID3D10DepthStencilView(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u.\n", This, refcount); @@ -420,7 +420,7 @@ static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_Release(ID3D10DepthStenci static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDevice(ID3D10DepthStencilView *iface, ID3D10Device **device) { - struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); TRACE("iface %p, device %p.\n", iface, device); @@ -431,7 +431,7 @@ static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDevice(ID3D10DepthStenc static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_GetPrivateData(ID3D10DepthStencilView *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -442,7 +442,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_GetPrivateData(ID3D10De static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_SetPrivateData(ID3D10DepthStencilView *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -453,7 +453,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_SetPrivateData(ID3D10De static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_SetPrivateDataInterface(ID3D10DepthStencilView *iface, REFGUID guid, const IUnknown *data) { - struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); @@ -465,7 +465,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_SetPrivateDataInterface static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetResource(ID3D10DepthStencilView *iface, ID3D10Resource **resource) { - struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); TRACE("iface %p, resource %p.\n", iface, resource); @@ -478,7 +478,7 @@ static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetResource(ID3D10DepthSte static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDesc(ID3D10DepthStencilView *iface, D3D10_DEPTH_STENCIL_VIEW_DESC *desc) { - struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); TRACE("iface %p, desc %p.\n", iface, desc); @@ -554,7 +554,7 @@ static void wined3d_depth_stencil_view_desc_from_d3d10core(struct wined3d_render } } -HRESULT d3d10_depthstencil_view_init(struct d3d10_depthstencil_view *view, struct d3d_device *device, +HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3d_device *device, ID3D10Resource *resource, const D3D10_DEPTH_STENCIL_VIEW_DESC *desc) { struct wined3d_rendertarget_view_desc wined3d_desc; @@ -601,7 +601,7 @@ HRESULT d3d10_depthstencil_view_init(struct d3d10_depthstencil_view *view, struc return S_OK; } -struct d3d10_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) +struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) { if (!iface) return NULL; From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Add ID3D11DepthStencilView interface stub. Message-ID: Module: wine Branch: master Commit: ca4017d2d1de57ab8e220f094359e39f03f69cd9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ca4017d2d1de57ab8e220f094359e39f03f69cd9 Author: J?zef Kucia Date: Tue Sep 8 01:12:42 2015 +0200 d3d11: Add ID3D11DepthStencilView interface stub. --- dlls/d3d11/d3d11_private.h | 3 +- dlls/d3d11/view.c | 158 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 138 insertions(+), 23 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index e702b41..c737273 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -149,9 +149,10 @@ HRESULT d3d_buffer_create(struct d3d_device *device, const D3D11_BUFFER_DESC *de const D3D11_SUBRESOURCE_DATA *data, struct d3d_buffer **buffer) DECLSPEC_HIDDEN; struct d3d_buffer *unsafe_impl_from_ID3D10Buffer(ID3D10Buffer *iface) DECLSPEC_HIDDEN; -/* ID3D10DepthStencilView */ +/* ID3D11DepthStencilView, ID3D10DepthStencilView */ struct d3d_depthstencil_view { + ID3D11DepthStencilView ID3D11DepthStencilView_iface; ID3D10DepthStencilView ID3D10DepthStencilView_iface; LONG refcount; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index eaf34a3..2d9e5d8 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -357,65 +357,178 @@ static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, I } } -static inline struct d3d_depthstencil_view *impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) +/* ID3D11DepthStencilView methods */ + +static inline struct d3d_depthstencil_view *impl_from_ID3D11DepthStencilView(ID3D11DepthStencilView *iface) { - return CONTAINING_RECORD(iface, struct d3d_depthstencil_view, ID3D10DepthStencilView_iface); + return CONTAINING_RECORD(iface, struct d3d_depthstencil_view, ID3D11DepthStencilView_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_QueryInterface(ID3D10DepthStencilView *iface, +static HRESULT STDMETHODCALLTYPE d3d11_depthstencil_view_QueryInterface(ID3D11DepthStencilView *iface, REFIID riid, void **object) { + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - if (IsEqualGUID(riid, &IID_ID3D10DepthStencilView) - || IsEqualGUID(riid, &IID_ID3D10View) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + if (IsEqualGUID(riid, &IID_ID3D11DepthStencilView) + || IsEqualGUID(riid, &IID_ID3D11View) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11DepthStencilView_AddRef(iface); *object = iface; return S_OK; } + if (IsEqualGUID(riid, &IID_ID3D10DepthStencilView) + || IsEqualGUID(riid, &IID_ID3D10View) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + ID3D10DepthStencilView_AddRef(&view->ID3D10DepthStencilView_iface); + *object = &view->ID3D10DepthStencilView_iface; + return S_OK; + } + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *object = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_AddRef(ID3D10DepthStencilView *iface) +static ULONG STDMETHODCALLTYPE d3d11_depthstencil_view_AddRef(ID3D11DepthStencilView *iface) { - struct d3d_depthstencil_view *This = impl_from_ID3D10DepthStencilView(iface); - ULONG refcount = InterlockedIncrement(&This->refcount); + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + ULONG refcount = InterlockedIncrement(&view->refcount); - TRACE("%p increasing refcount to %u.\n", This, refcount); + TRACE("%p increasing refcount to %u.\n", view, refcount); return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_Release(ID3D10DepthStencilView *iface) +static ULONG STDMETHODCALLTYPE d3d11_depthstencil_view_Release(ID3D11DepthStencilView *iface) { - struct d3d_depthstencil_view *This = impl_from_ID3D10DepthStencilView(iface); - ULONG refcount = InterlockedDecrement(&This->refcount); + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + ULONG refcount = InterlockedDecrement(&view->refcount); - TRACE("%p decreasing refcount to %u.\n", This, refcount); + TRACE("%p decreasing refcount to %u.\n", view, refcount); if (!refcount) { wined3d_mutex_lock(); - wined3d_rendertarget_view_decref(This->wined3d_view); - ID3D10Resource_Release(This->resource); - ID3D10Device1_Release(This->device); - wined3d_private_store_cleanup(&This->private_store); + wined3d_rendertarget_view_decref(view->wined3d_view); + ID3D10Resource_Release(view->resource); + ID3D10Device1_Release(view->device); + wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); - HeapFree(GetProcessHeap(), 0, This); + HeapFree(GetProcessHeap(), 0, view); } return refcount; } +static void STDMETHODCALLTYPE d3d11_depthstencil_view_GetDevice(ID3D11DepthStencilView *iface, + ID3D11Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_depthstencil_view_GetPrivateData(ID3D11DepthStencilView *iface, + REFGUID guid, UINT *data_size, void *data) +{ + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_get_private_data(&view->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_depthstencil_view_SetPrivateData(ID3D11DepthStencilView *iface, + REFGUID guid, UINT data_size, const void *data) +{ + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_set_private_data(&view->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_depthstencil_view_SetPrivateDataInterface(ID3D11DepthStencilView *iface, + REFGUID guid, const IUnknown *data) +{ + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&view->private_store, guid, data); +} + +static void STDMETHODCALLTYPE d3d11_depthstencil_view_GetResource(ID3D11DepthStencilView *iface, + ID3D11Resource **resource) +{ + FIXME("iface %p, resource %p stub!\n", iface, resource); +} + +static void STDMETHODCALLTYPE d3d11_depthstencil_view_GetDesc(ID3D11DepthStencilView *iface, + D3D11_DEPTH_STENCIL_VIEW_DESC *desc) +{ + FIXME("iface %p, desc %p stub!\n", iface, desc); +} + +static const struct ID3D11DepthStencilViewVtbl d3d11_depthstencil_view_vtbl = +{ + /* IUnknown methods */ + d3d11_depthstencil_view_QueryInterface, + d3d11_depthstencil_view_AddRef, + d3d11_depthstencil_view_Release, + /* ID3D11DeviceChild methods */ + d3d11_depthstencil_view_GetDevice, + d3d11_depthstencil_view_GetPrivateData, + d3d11_depthstencil_view_SetPrivateData, + d3d11_depthstencil_view_SetPrivateDataInterface, + /* ID3D11View methods */ + d3d11_depthstencil_view_GetResource, + /* ID3D11DepthStencilView methods */ + d3d11_depthstencil_view_GetDesc, +}; + +/* ID3D10DepthStencilView methods */ + +static inline struct d3d_depthstencil_view *impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_depthstencil_view, ID3D10DepthStencilView_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_QueryInterface(ID3D10DepthStencilView *iface, + REFIID riid, void **object) +{ + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_depthstencil_view_QueryInterface(&view->ID3D11DepthStencilView_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_AddRef(ID3D10DepthStencilView *iface) +{ + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_depthstencil_view_AddRef(&view->ID3D11DepthStencilView_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_depthstencil_view_Release(ID3D10DepthStencilView *iface) +{ + struct d3d_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_depthstencil_view_Release(&view->ID3D11DepthStencilView_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDevice(ID3D10DepthStencilView *iface, ID3D10Device **device) @@ -561,6 +674,7 @@ HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3 struct wined3d_resource *wined3d_resource; HRESULT hr; + view->ID3D11DepthStencilView_iface.lpVtbl = &d3d11_depthstencil_view_vtbl; view->ID3D10DepthStencilView_iface.lpVtbl = &d3d10_depthstencil_view_vtbl; view->refcount = 1; From julliard at wine.codeweavers.com Tue Sep 8 08:15:46 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:46 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_depthstencil_view_GetDevice(). Message-ID: Module: wine Branch: master Commit: 41740bec89f8fbc1796e8aa07eea763b34e631cd URL: http://source.winehq.org/git/wine.git/?a=commit;h=41740bec89f8fbc1796e8aa07eea763b34e631cd Author: J?zef Kucia Date: Tue Sep 8 01:12:43 2015 +0200 d3d11: Implement d3d11_depthstencil_view_GetDevice(). --- dlls/d3d11/d3d11_private.h | 2 +- dlls/d3d11/view.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index c737273..5549c9c 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -160,7 +160,7 @@ struct d3d_depthstencil_view struct wined3d_rendertarget_view *wined3d_view; D3D10_DEPTH_STENCIL_VIEW_DESC desc; ID3D10Resource *resource; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3d_device *device, diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 2d9e5d8..331808b 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -418,7 +418,7 @@ static ULONG STDMETHODCALLTYPE d3d11_depthstencil_view_Release(ID3D11DepthStenci wined3d_mutex_lock(); wined3d_rendertarget_view_decref(view->wined3d_view); ID3D10Resource_Release(view->resource); - ID3D10Device1_Release(view->device); + ID3D11Device_Release(view->device); wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); HeapFree(GetProcessHeap(), 0, view); @@ -430,7 +430,12 @@ static ULONG STDMETHODCALLTYPE d3d11_depthstencil_view_Release(ID3D11DepthStenci static void STDMETHODCALLTYPE d3d11_depthstencil_view_GetDevice(ID3D11DepthStencilView *iface, ID3D11Device **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3d_depthstencil_view *view = impl_from_ID3D11DepthStencilView(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = view->device; + ID3D11Device_AddRef(*device); } static HRESULT STDMETHODCALLTYPE d3d11_depthstencil_view_GetPrivateData(ID3D11DepthStencilView *iface, @@ -537,8 +542,7 @@ static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDevice(ID3D10DepthStenc TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)view->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(view->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_GetPrivateData(ID3D10DepthStencilView *iface, @@ -709,8 +713,8 @@ HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3 wined3d_mutex_unlock(); view->resource = resource; ID3D10Resource_AddRef(resource); - view->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(view->device); + view->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(view->device); return S_OK; } From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename wined3d_resource_from_resource() to wined3d_resource_from_d3d10_resource(). Message-ID: Module: wine Branch: master Commit: 916b1564d3e17304e3e1f4a6fc9c4eea96b142c3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=916b1564d3e17304e3e1f4a6fc9c4eea96b142c3 Author: J?zef Kucia Date: Tue Sep 8 01:12:44 2015 +0200 d3d11: Rename wined3d_resource_from_resource() to wined3d_resource_from_d3d10_resource(). --- dlls/d3d11/d3d11_private.h | 2 +- dlls/d3d11/device.c | 10 +++++----- dlls/d3d11/utils.c | 2 +- dlls/d3d11/view.c | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 5549c9c..6c88747 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -63,7 +63,7 @@ const char *debug_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN; DXGI_FORMAT dxgi_format_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; enum wined3d_format_id wined3dformat_from_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN; DWORD wined3d_usage_from_d3d11(UINT bind_flags, enum D3D11_USAGE usage) DECLSPEC_HIDDEN; -struct wined3d_resource *wined3d_resource_from_resource(ID3D10Resource *resource) DECLSPEC_HIDDEN; +struct wined3d_resource *wined3d_resource_from_d3d10_resource(ID3D10Resource *resource) DECLSPEC_HIDDEN; DWORD wined3d_map_flags_from_d3d10_map_type(D3D10_MAP map_type) DECLSPEC_HIDDEN; enum D3D11_USAGE d3d11_usage_from_d3d10_usage(enum D3D10_USAGE usage) DECLSPEC_HIDDEN; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index e62e3e9..069c565 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -1139,8 +1139,8 @@ static void STDMETHODCALLTYPE d3d10_device_CopySubresourceRegion(ID3D10Device1 * iface, dst_resource, dst_subresource_idx, dst_x, dst_y, dst_z, src_resource, src_subresource_idx, src_box); - wined3d_dst_resource = wined3d_resource_from_resource(dst_resource); - wined3d_src_resource = wined3d_resource_from_resource(src_resource); + wined3d_dst_resource = wined3d_resource_from_d3d10_resource(dst_resource); + wined3d_src_resource = wined3d_resource_from_d3d10_resource(src_resource); wined3d_src_box.left = src_box->left; wined3d_src_box.top = src_box->top; wined3d_src_box.front = src_box->front; @@ -1161,8 +1161,8 @@ static void STDMETHODCALLTYPE d3d10_device_CopyResource(ID3D10Device1 *iface, TRACE("iface %p, dst_resource %p, src_resource %p.\n", iface, dst_resource, src_resource); - wined3d_dst_resource = wined3d_resource_from_resource(dst_resource); - wined3d_src_resource = wined3d_resource_from_resource(src_resource); + wined3d_dst_resource = wined3d_resource_from_d3d10_resource(dst_resource); + wined3d_src_resource = wined3d_resource_from_d3d10_resource(src_resource); wined3d_mutex_lock(); wined3d_device_copy_resource(device->wined3d_device, wined3d_dst_resource, wined3d_src_resource); wined3d_mutex_unlock(); @@ -1189,7 +1189,7 @@ static void STDMETHODCALLTYPE d3d10_device_UpdateSubresource(ID3D10Device1 *ifac wined3d_box.back = box->back; } - wined3d_resource = wined3d_resource_from_resource(resource); + wined3d_resource = wined3d_resource_from_d3d10_resource(resource); wined3d_mutex_lock(); wined3d_device_update_sub_resource(device->wined3d_device, wined3d_resource, subresource_idx, box ? &wined3d_box : NULL, data, row_pitch, depth_pitch); diff --git a/dlls/d3d11/utils.c b/dlls/d3d11/utils.c index 3d1da1f..514b147 100644 --- a/dlls/d3d11/utils.c +++ b/dlls/d3d11/utils.c @@ -502,7 +502,7 @@ UINT d3d10_resource_misc_flags_from_d3d11_resource_misc_flags(UINT resource_misc return d3d10_resource_misc_flags; } -struct wined3d_resource *wined3d_resource_from_resource(ID3D10Resource *resource) +struct wined3d_resource *wined3d_resource_from_d3d10_resource(ID3D10Resource *resource) { D3D10_RESOURCE_DIMENSION dimension; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 331808b..0d20314 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -693,7 +693,7 @@ HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3 } wined3d_mutex_lock(); - if (!(wined3d_resource = wined3d_resource_from_resource(resource))) + if (!(wined3d_resource = wined3d_resource_from_d3d10_resource(resource))) { wined3d_mutex_unlock(); ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource); @@ -957,7 +957,7 @@ HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view, struc } wined3d_mutex_lock(); - if (!(wined3d_resource = wined3d_resource_from_resource(resource))) + if (!(wined3d_resource = wined3d_resource_from_d3d10_resource(resource))) { wined3d_mutex_unlock(); ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource); @@ -1158,7 +1158,7 @@ HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view, } wined3d_mutex_lock(); - if (!(wined3d_resource = wined3d_resource_from_resource(resource))) + if (!(wined3d_resource = wined3d_resource_from_d3d10_resource(resource))) { ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource); return E_FAIL; From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_depthstencil_view_GetResource(). Message-ID: Module: wine Branch: master Commit: 07ce357505cccc0e9d97fd908e5db4ebb7af03e3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=07ce357505cccc0e9d97fd908e5db4ebb7af03e3 Author: J?zef Kucia Date: Tue Sep 8 01:12:45 2015 +0200 d3d11: Implement d3d11_depthstencil_view_GetResource(). The intent is to eventually eliminate wined3d_resource_from_d3d10_resource(). --- dlls/d3d11/buffer.c | 8 ++++++++ dlls/d3d11/d3d11_private.h | 7 +++++-- dlls/d3d11/device.c | 13 ++++++++++++- dlls/d3d11/texture.c | 8 ++++++++ dlls/d3d11/utils.c | 22 ++++++++++++++++++++++ dlls/d3d11/view.c | 38 +++++++++++++++++++++----------------- 6 files changed, 76 insertions(+), 20 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=07ce357505cccc0e9d97fd908e5db4ebb7af03e3 From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_depthstencil_view_GetDesc(). Message-ID: Module: wine Branch: master Commit: f7c923b1cb557698896db84f80ef5aa661af3369 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f7c923b1cb557698896db84f80ef5aa661af3369 Author: J?zef Kucia Date: Tue Sep 8 01:12:46 2015 +0200 d3d11: Implement d3d11_depthstencil_view_GetDesc(). --- dlls/d3d11/d3d11_private.h | 4 +-- dlls/d3d11/device.c | 12 +++++++- dlls/d3d11/view.c | 74 +++++++++++++++++++++++++++------------------- 3 files changed, 56 insertions(+), 34 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=f7c923b1cb557698896db84f80ef5aa661af3369 From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateDepthStencilView(). Message-ID: Module: wine Branch: master Commit: c003e94371fab17b3e2da9b580816529d0dc1610 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c003e94371fab17b3e2da9b580816529d0dc1610 Author: J?zef Kucia Date: Tue Sep 8 01:12:47 2015 +0200 d3d11: Implement d3d11_device_CreateDepthStencilView(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 29 ++++++++++++++--------------- dlls/d3d11/view.c | 24 +++++++++++++++++++++++- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 6a134a3..c5593d7 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -166,8 +166,8 @@ struct d3d_depthstencil_view ID3D11Device *device; }; -HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3d_device *device, - ID3D11Resource *resource, const D3D11_DEPTH_STENCIL_VIEW_DESC *desc) DECLSPEC_HIDDEN; +HRESULT d3d_depthstencil_view_create(struct d3d_device *device, ID3D11Resource *resource, + const D3D11_DEPTH_STENCIL_VIEW_DESC *desc, struct d3d_depthstencil_view **view) DECLSPEC_HIDDEN; struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) DECLSPEC_HIDDEN; /* ID3D10RenderTargetView */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index fad8fa3..d6065b4 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -143,9 +143,18 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateRenderTargetView(ID3D11Devic static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDepthStencilView(ID3D11Device *iface, ID3D11Resource *resource, const D3D11_DEPTH_STENCIL_VIEW_DESC *desc, ID3D11DepthStencilView **view) { - FIXME("iface %p, resource %p, desc %p, view %p stub!\n", iface, resource, desc, view); + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_depthstencil_view *object; + HRESULT hr; - return E_NOTIMPL; + TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); + + if (FAILED(hr = d3d_depthstencil_view_create(device, resource, desc, &object))) + return hr; + + *view = &object->ID3D11DepthStencilView_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateInputLayout(ID3D11Device *iface, @@ -2153,27 +2162,17 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateDepthStencilView(ID3D10Devic memcpy(&d3d11_desc.u, &desc->u, sizeof(d3d11_desc.u)); } - if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) - return E_OUTOFMEMORY; - if (FAILED(hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D11Resource, (void **)&d3d11_resource))) { ERR("Resource does not implement ID3D11Resource.\n"); - HeapFree(GetProcessHeap(), 0, object); return E_FAIL; } - if (FAILED(hr = d3d_depthstencil_view_init(object, device, d3d11_resource, desc ? &d3d11_desc : NULL))) - { - WARN("Failed to initialize depthstencil view, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); - ID3D11Resource_Release(d3d11_resource); - return hr; - } - + hr = d3d_depthstencil_view_create(device, d3d11_resource, desc ? &d3d11_desc : NULL, &object); ID3D11Resource_Release(d3d11_resource); + if (FAILED(hr)) + return hr; - TRACE("Created depthstencil view %p.\n", object); *view = &object->ID3D10DepthStencilView_iface; return S_OK; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 12db8e9..cff0948 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -687,7 +687,7 @@ static void wined3d_depth_stencil_view_desc_from_d3d11(struct wined3d_rendertarg } } -HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3d_device *device, +static HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3d_device *device, ID3D11Resource *resource, const D3D11_DEPTH_STENCIL_VIEW_DESC *desc) { struct wined3d_rendertarget_view_desc wined3d_desc; @@ -735,6 +735,28 @@ HRESULT d3d_depthstencil_view_init(struct d3d_depthstencil_view *view, struct d3 return S_OK; } +HRESULT d3d_depthstencil_view_create(struct d3d_device *device, ID3D11Resource *resource, + const D3D11_DEPTH_STENCIL_VIEW_DESC *desc, struct d3d_depthstencil_view **view) +{ + struct d3d_depthstencil_view *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_depthstencil_view_init(object, device, resource, desc))) + { + WARN("Failed to initialize depthstencil view, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created depthstencil view %p.\n", object); + *view = object; + + return S_OK; +} + struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) { if (!iface) From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Add test for depth stencil view interfaces. Message-ID: Module: wine Branch: master Commit: f5e7018dbfa473f9507cd14846e97b82ccb70b10 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f5e7018dbfa473f9507cd14846e97b82ccb70b10 Author: J?zef Kucia Date: Tue Sep 8 01:12:48 2015 +0200 d3d11/tests: Add test for depth stencil view interfaces. --- dlls/d3d11/tests/d3d11.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 817ca9c..960bd75 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -815,6 +815,74 @@ static void test_buffer_interfaces(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_depthstencil_view_interfaces(void) +{ + D3D10_DEPTH_STENCIL_VIEW_DESC d3d10_dsv_desc; + D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc; + ID3D10DepthStencilView *d3d10_dsview; + D3D11_TEXTURE2D_DESC texture_desc; + ID3D11DepthStencilView *dsview; + ID3D11Texture2D *texture; + ID3D11Device *device; + ULONG refcount; + HRESULT hr; + + if (!(device = create_device(NULL))) + { + skip("Failed to create device.\n"); + return; + } + + texture_desc.Width = 512; + texture_desc.Height = 512; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Quality = 0; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + + hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x.\n", hr); + + dsv_desc.Format = texture_desc.Format; + dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + dsv_desc.Flags = 0; + U(dsv_desc).Texture2D.MipSlice = 0; + + hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)texture, &dsv_desc, &dsview); + ok(SUCCEEDED(hr), "Failed to create a depthstencil view, hr %#x.\n", hr); + + hr = ID3D11DepthStencilView_QueryInterface(dsview, &IID_ID3D10DepthStencilView, (void **)&d3d10_dsview); + ID3D11DepthStencilView_Release(dsview); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Depth stencil view should implement ID3D10DepthStencilView.\n"); + + if (FAILED(hr)) + { + win_skip("Depth stencil view does not implement ID3D10DepthStencilView.\n"); + goto done; + } + + ID3D10DepthStencilView_GetDesc(d3d10_dsview, &d3d10_dsv_desc); + ok(d3d10_dsv_desc.Format == dsv_desc.Format, "Got unexpected format %#x.\n", d3d10_dsv_desc.Format); + ok(d3d10_dsv_desc.ViewDimension == (D3D10_DSV_DIMENSION)dsv_desc.ViewDimension, + "Got unexpected view dimension %u.\n", d3d10_dsv_desc.ViewDimension); + ok(U(d3d10_dsv_desc).Texture2D.MipSlice == U(dsv_desc).Texture2D.MipSlice, + "Got unexpected mip slice %u.\n", U(d3d10_dsv_desc).Texture2D.MipSlice); + + ID3D10DepthStencilView_Release(d3d10_dsview); + +done: + ID3D11Texture2D_Release(texture); + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(d3d11) { test_create_device(); @@ -824,4 +892,5 @@ START_TEST(d3d11) test_create_texture3d(); test_texture3d_interfaces(); test_buffer_interfaces(); + test_depthstencil_view_interfaces(); } From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: Gerald Pfeifer : d3d8: Avoid shift overflow in render_state_test_data_init. Message-ID: Module: wine Branch: master Commit: 604c2c1da0498a3e4c2bf5fcbd071c8ea5541b2a URL: http://source.winehq.org/git/wine.git/?a=commit;h=604c2c1da0498a3e4c2bf5fcbd071c8ea5541b2a Author: Gerald Pfeifer Date: Mon Sep 7 23:08:41 2015 +0200 d3d8: Avoid shift overflow in render_state_test_data_init. --- dlls/d3d8/tests/stateblock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/d3d8/tests/stateblock.c b/dlls/d3d8/tests/stateblock.c index e09ae6d..3ad9c1c 100644 --- a/dlls/d3d8/tests/stateblock.c +++ b/dlls/d3d8/tests/stateblock.c @@ -1270,7 +1270,7 @@ static void render_state_test_data_init(struct render_state_data *data) data->states[idx++] = TRUE; /* ALPHABLENDENABLE */ data->states[idx++] = TRUE; /* FOGENABLE */ data->states[idx++] = TRUE; /* SPECULARENABLE */ - data->states[idx++] = 1 << 31; /* FOGCOLOR */ + data->states[idx++] = 1u << 31; /* FOGCOLOR */ data->states[idx++] = D3DFOG_EXP; /* FOGTABLEMODE */ data->states[idx++] = to_dword(0.1f); /* FOGSTART */ data->states[idx++] = to_dword(0.8f); /* FOGEND */ From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: Gerald Pfeifer : d3d9: Avoid shift overflow in render_state_test_data_init. Message-ID: Module: wine Branch: master Commit: 601aa570f143d17a514dd7e21a53546fd14a71f7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=601aa570f143d17a514dd7e21a53546fd14a71f7 Author: Gerald Pfeifer Date: Mon Sep 7 23:09:50 2015 +0200 d3d9: Avoid shift overflow in render_state_test_data_init. Same patch as just a minute ago, alas fro d3d9 instead of d3d8. Gerald --- dlls/d3d9/tests/stateblock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/d3d9/tests/stateblock.c b/dlls/d3d9/tests/stateblock.c index 1d033de..bb89ba0 100644 --- a/dlls/d3d9/tests/stateblock.c +++ b/dlls/d3d9/tests/stateblock.c @@ -1384,7 +1384,7 @@ static void render_state_test_data_init(struct render_state_data *data) data->states[idx++] = TRUE; /* ALPHABLENDENABLE */ data->states[idx++] = TRUE; /* FOGENABLE */ data->states[idx++] = TRUE; /* SPECULARENABLE */ - data->states[idx++] = 1 << 31; /* FOGCOLOR */ + data->states[idx++] = 1u << 31; /* FOGCOLOR */ data->states[idx++] = D3DFOG_EXP; /* FOGTABLEMODE */ data->states[idx++] = to_dword(0.1f); /* FOGSTART */ data->states[idx++] = to_dword(0.8f); /* FOGEND */ From julliard at wine.codeweavers.com Tue Sep 8 08:15:47 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 08 Sep 2015 08:15:47 -0500 Subject: Alistair Leslie-Hughes : dwmapi: Add DwmUpdateThumbnailProperties stub. Message-ID: Module: wine Branch: master Commit: e28d6b2fb099795d2472a97d7ab0bfe868e90421 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e28d6b2fb099795d2472a97d7ab0bfe868e90421 Author: Alistair Leslie-Hughes Date: Wed Sep 2 11:20:24 2015 +1000 dwmapi: Add DwmUpdateThumbnailProperties stub. --- dlls/dwmapi/dwmapi.spec | 2 +- dlls/dwmapi/dwmapi_main.c | 9 +++++++++ include/dwmapi.h | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/dlls/dwmapi/dwmapi.spec b/dlls/dwmapi/dwmapi.spec index e83ee22..531f279 100644 --- a/dlls/dwmapi/dwmapi.spec +++ b/dlls/dwmapi/dwmapi.spec @@ -42,4 +42,4 @@ @ stub DwmSetPresentParameters @ stdcall DwmSetWindowAttribute(long long ptr long) @ stdcall DwmUnregisterThumbnail(long) -@ stub DwmUpdateThumbnailProperties +@ stdcall DwmUpdateThumbnailProperties(ptr ptr) diff --git a/dlls/dwmapi/dwmapi_main.c b/dlls/dwmapi/dwmapi_main.c index 08373b9..a776cfe 100644 --- a/dlls/dwmapi/dwmapi_main.c +++ b/dlls/dwmapi/dwmapi_main.c @@ -250,3 +250,12 @@ HRESULT WINAPI DwmDetachMilContent(HWND hwnd) FIXME("(%p) stub\n", hwnd); return E_NOTIMPL; } + +/********************************************************************** + * DwmUpdateThumbnailProperties (DWMAPI.@) + */ +HRESULT WINAPI DwmUpdateThumbnailProperties(HTHUMBNAIL thumbnail, const DWM_THUMBNAIL_PROPERTIES *props) +{ + FIXME("(%p, %p) stub\n", thumbnail, props); + return E_NOTIMPL; +} diff --git a/include/dwmapi.h b/include/dwmapi.h index 3c5ed8f..035c831 100644 --- a/include/dwmapi.h +++ b/include/dwmapi.h @@ -107,6 +107,16 @@ typedef struct _DWM_BLURBEHIND BOOL fTransitionOnMaximized; } DWM_BLURBEHIND, *PDWM_BLURBEHIND; +typedef struct _DWM_THUMBNAIL_PROPERTIES +{ + DWORD dwFlags; + RECT rcDestination; + RECT rcSource; + BYTE opacity; + BOOL fVisible; + BOOL fSourceClientAreaOnly; +} DWM_THUMBNAIL_PROPERTIES, *PDWM_THUMBNAIL_PROPERTIES; + #include DWMAPI DwmDefWindowProc(HWND, UINT, WPARAM, LPARAM, LRESULT*); @@ -121,6 +131,7 @@ DWMAPI DwmIsCompositionEnabled(BOOL*); DWMAPI DwmRegisterThumbnail(HWND, HWND, PHTHUMBNAIL); DWMAPI DwmSetWindowAttribute(HWND, DWORD, LPCVOID, DWORD); DWMAPI DwmUnregisterThumbnail(HTHUMBNAIL); +DWMAPI DwmUpdateThumbnailProperties(HTHUMBNAIL, const DWM_THUMBNAIL_PROPERTIES *); #ifdef __cplusplus } From jnewman at wine.codeweavers.com Tue Sep 8 11:31:30 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Tue, 08 Sep 2015 11:31:30 -0500 Subject: =?UTF-8?Q?Julian=20R=C3=BCger=20?=: German translation for release 1.7.51 Message-ID: Module: website Branch: master Commit: 28721c9a56eb63c9548b00eb9ab5e194eff41a98 URL: http://source.winehq.org/git/website.git/?a=commit;h=28721c9a56eb63c9548b00eb9ab5e194eff41a98 Author: Julian R?ger Date: Sat Sep 5 17:28:34 2015 +0200 German translation for release 1.7.51 --- news/de/2015090401.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/news/de/2015090401.xml b/news/de/2015090401.xml new file mode 100644 index 0000000..d6e6774 --- /dev/null +++ b/news/de/2015090401.xml @@ -0,0 +1,16 @@ + +4. September 2015 +Wine 1.7.51 freigegeben + +

Die Entwicklungsversion 1.7.51 von Wine ist jetzt verf?gbar.

+

Neuerungen (en) in dieser Version:

+
    +
  • XAudio2-Implementierung ?ber OpenAL-Soft.
  • +
  • Unterst?tzung der neuen Universal-C-Laufzeit-DLL.
  • +
  • Dropdownmen?-Unterst?tzung im standard ?ffnen-Dialog.
  • +
  • Graustufen-Rendermodus in DirectWrite.
  • +
  • Diverse Fehlerkorrekturen.
  • +
+

Der Quelltext ist ab sofort verf?gbar. +Bin?rpakete werden gerade erstellt und stehen bald auf den jeweiligen Downloadseiten zur Verf?gung. +

From jnewman at wine.codeweavers.com Tue Sep 8 11:31:30 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Tue, 08 Sep 2015 11:31:30 -0500 Subject: =?UTF-8?Q?=C5=81ukasz=20Wojni=C5=82owicz=20?=: Polish translation for release 1.7.51 Message-ID: Module: website Branch: master Commit: 5bbe9a58820402ea9062d3e820d0942830dae33d URL: http://source.winehq.org/git/website.git/?a=commit;h=5bbe9a58820402ea9062d3e820d0942830dae33d Author: ?ukasz Wojni?owicz Date: Sat Sep 5 07:20:57 2015 +0200 Polish translation for release 1.7.51 --- news/pl/2015090401.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/news/pl/2015090401.xml b/news/pl/2015090401.xml new file mode 100644 index 0000000..1fae45b --- /dev/null +++ b/news/pl/2015090401.xml @@ -0,0 +1,16 @@ + +Wrzesie? 4, 2015 +Wydano Wine 1.7.51 + +

Wydanie rozwojowe Wine 1.7.51 jest ju? dost?pne.

+

Co nowego w tym wydaniu: +

    +
  • Implementacja XAudio2 przy u?yciu oprogramowania OpenAL.
  • +
  • Wsparcie dla nowej, uniwersalnej biblioteki uruchomieniowej DLL dla C.
  • +
  • Wsparcie dla menu rozwijanego w standardowym oknie dialogowym otwierania.
  • +
  • Tryb wy?wietlania w odcieniach szaro?ci w DirectWrite.
  • +
  • Rozmaite poprawki b??d?w.
  • +
+

?r?d?o jest ju? dost?pne. +Paczki binarne s? w trakcie budowy i uka?? si? wkr?tce w przeznaczonych dla nich pobieralniach. +

From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Andrew Eikum : x3daudio1_7: Stub X3DAudioCalculate. Message-ID: Module: wine Branch: master Commit: 0f4b16aa340f3a02a103efbf1ea44529b83f5b15 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f4b16aa340f3a02a103efbf1ea44529b83f5b15 Author: Andrew Eikum Date: Tue Sep 8 14:02:13 2015 -0500 x3daudio1_7: Stub X3DAudioCalculate. --- dlls/x3daudio1_7/main.c | 24 +++++++++- dlls/x3daudio1_7/x3daudio1_7.spec | 2 +- include/Makefile.in | 1 + include/x3daudio.h | 97 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 2 deletions(-) diff --git a/dlls/x3daudio1_7/main.c b/dlls/x3daudio1_7/main.c index 2488e03..eece4fc 100644 --- a/dlls/x3daudio1_7/main.c +++ b/dlls/x3daudio1_7/main.c @@ -20,6 +20,7 @@ #include "windef.h" #include "winbase.h" +#include "x3daudio.h" #include "wine/debug.h" @@ -39,8 +40,29 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) return TRUE; } -HRESULT CDECL X3DAudioInitialize(UINT32 chanmask, float speedofsound, void *handle) +HRESULT CDECL X3DAudioInitialize(UINT32 chanmask, float speedofsound, + X3DAUDIO_HANDLE handle) { FIXME("0x%x, %f, %p: Stub!\n", chanmask, speedofsound, handle); return S_OK; } + +void CDECL X3DAudioCalculate(const X3DAUDIO_HANDLE handle, + const X3DAUDIO_LISTENER *listener, const X3DAUDIO_EMITTER *emitter, + UINT32 flags, X3DAUDIO_DSP_SETTINGS *out) +{ + static int once = 0; + if(!once){ + FIXME("%p %p %p 0x%x %p: Stub!\n", handle, listener, emitter, flags, out); + ++once; + } + + out->LPFDirectCoefficient = 0; + out->LPFReverbCoefficient = 0; + out->ReverbLevel = 0; + out->DopplerFactor = 1; + out->EmitterToListenerAngle = 0; + out->EmitterToListenerDistance = 0; + out->EmitterVelocityComponent = 0; + out->ListenerVelocityComponent = 0; +} diff --git a/dlls/x3daudio1_7/x3daudio1_7.spec b/dlls/x3daudio1_7/x3daudio1_7.spec index 2b93838..7432b84 100644 --- a/dlls/x3daudio1_7/x3daudio1_7.spec +++ b/dlls/x3daudio1_7/x3daudio1_7.spec @@ -1,2 +1,2 @@ -@ stub X3DAudioCalculate +@ cdecl X3DAudioCalculate(ptr ptr ptr long ptr) @ cdecl X3DAudioInitialize(long float ptr) diff --git a/include/Makefile.in b/include/Makefile.in index 1dc912b..f4d853e 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -663,6 +663,7 @@ SRCDIR_INCLUDES = \ wsipx.h \ wsnwlink.h \ wtsapi32.h \ + x3daudio.h \ xcmc.h \ xinput.h \ xmldom.h \ diff --git a/include/x3daudio.h b/include/x3daudio.h new file mode 100644 index 0000000..a503507 --- /dev/null +++ b/include/x3daudio.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2015 Andrew Eikum 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 + */ + +#ifndef _X3DAUDIO_H +#define _X3DAUDIO_H + +typedef struct X3DAUDIO_VECTOR { + float x, y, z; +} X3DAUDIO_VECTOR; + +typedef struct X3DAUDIO_CONE { + float InnerAngle; + float OuterAngle; + float InnerVolume; + float OuterVolume; + float InnerLPF; + float OuterLPF; + float InnerReverb; + float OuterReverb; +} X3DAUDIO_CONE; + +typedef struct X3DAUDIO_DISTANCE_CURVE_POINT { + float Distance; + float DSPSetting; +} X3DAUDIO_DISTANCE_CURVE_POINT; + +typedef struct X3DAUDIO_DISTANCE_CURVE { + X3DAUDIO_DISTANCE_CURVE_POINT *pPoints; + UINT32 PointCount; +} X3DAUDIO_DISTANCE_CURVE; + +typedef struct X3DAUDIO_LISTENER { + X3DAUDIO_VECTOR OrientFront; + X3DAUDIO_VECTOR OrientTop; + X3DAUDIO_VECTOR Position; + X3DAUDIO_VECTOR Velocity; + X3DAUDIO_CONE *pCone; +} X3DAUDIO_LISTENER; + +typedef struct X3DAUDIO_EMITTER { + X3DAUDIO_CONE *pCone; + X3DAUDIO_VECTOR OrientFront; + X3DAUDIO_VECTOR OrientTop; + X3DAUDIO_VECTOR Position; + X3DAUDIO_VECTOR Velocity; + float InnerRadius; + float InnerRadiusAngle; + UINT32 ChannelCount; + float ChannelRadius; + float *pChannelAzimuths; + X3DAUDIO_DISTANCE_CURVE *pVolumeCurve; + X3DAUDIO_DISTANCE_CURVE *pLFECurve; + X3DAUDIO_DISTANCE_CURVE *pLPFDirectCurve; + X3DAUDIO_DISTANCE_CURVE *pLPFReverbCurve; + X3DAUDIO_DISTANCE_CURVE *pReverbCurve; + float CurveDistanceScalar; + float DopplerScalar; +} X3DAUDIO_EMITTER; + +typedef struct X3DAUDIO_DSP_SETTINGS { + float *pMatrixCoefficients; + float *pDelayTimes; + UINT32 SrcChannelCount; + UINT32 DstChannelCount; + float LPFDirectCoefficient; + float LPFReverbCoefficient; + float ReverbLevel; + float DopplerFactor; + float EmitterToListenerAngle; + float EmitterToListenerDistance; + float EmitterVelocityComponent; + float ListenerVelocityComponent; +} X3DAUDIO_DSP_SETTINGS; + +#define X3DAUDIO_HANDLE_BYTESIZE 20 +typedef BYTE X3DAUDIO_HANDLE[X3DAUDIO_HANDLE_BYTESIZE]; + +HRESULT CDECL X3DAudioInitialize(UINT32, float, X3DAUDIO_HANDLE); +void CDECL X3DAudioCalculate(const X3DAUDIO_HANDLE, const X3DAUDIO_LISTENER *, + const X3DAUDIO_EMITTER *, UINT32, X3DAUDIO_DSP_SETTINGS *); + +#endif From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Bruno Jesus : ws2_32/tests: Remove a dead assignment. Message-ID: Module: wine Branch: master Commit: 4e01388a3257c6b5bd3f0748a9c2f4d4fd312a40 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e01388a3257c6b5bd3f0748a9c2f4d4fd312a40 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Wed Sep 9 12:13:19 2015 +0800 ws2_32/tests: Remove a dead assignment. --- dlls/ws2_32/tests/sock.c | 1 - 1 file changed, 1 deletion(-) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 03e1627..fa1236e 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -4423,7 +4423,6 @@ static void test_gethostbyname_hack(void) return; } - he = NULL; he = gethostbyname(name); ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, h_errno); if(he) From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Bruno Jesus : msadp32.acm: Ensure we have enough memory before memcopying data. Message-ID: Module: wine Branch: master Commit: f5d183e20eefc041e118da4c37e3465a6ba9583f URL: http://source.winehq.org/git/wine.git/?a=commit;h=f5d183e20eefc041e118da4c37e3465a6ba9583f Author: Bruno Jesus <00cpxxx at gmail.com> Date: Wed Sep 9 12:10:21 2015 +0800 msadp32.acm: Ensure we have enough memory before memcopying data. --- dlls/msadp32.acm/msadp32.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/msadp32.acm/msadp32.c b/dlls/msadp32.acm/msadp32.c index 83d1b46..2c61575 100644 --- a/dlls/msadp32.acm/msadp32.c +++ b/dlls/msadp32.acm/msadp32.c @@ -542,6 +542,8 @@ static LRESULT ADPCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs) if (ADPCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; break; case WAVE_FORMAT_ADPCM: + if (adfs->cbwfxDst < sizeof(ADPCMWAVEFORMAT) + (7 - 1) * sizeof(ADPCMCOEFSET)) + return ACMERR_NOTPOSSIBLE; init_wfx_adpcm((ADPCMWAVEFORMAT*)adfs->pwfxDst); /* check if result is ok */ if (ADPCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Bruno Jesus : msacm32: Catch NULL parameters in acmFormatSuggest(). Message-ID: Module: wine Branch: master Commit: d08197f92aab2c52f257488d134f3bfc3a1a2ff6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d08197f92aab2c52f257488d134f3bfc3a1a2ff6 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Wed Sep 9 12:10:32 2015 +0800 msacm32: Catch NULL parameters in acmFormatSuggest(). --- dlls/msacm32/format.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c index f7f0fa4..1ab05ae 100644 --- a/dlls/msacm32/format.c +++ b/dlls/msacm32/format.c @@ -676,6 +676,9 @@ MMRESULT WINAPI acmFormatSuggest(HACMDRIVER had, PWAVEFORMATEX pwfxSrc, TRACE("(%p, %p, %p, %d, %d)\n", had, pwfxSrc, pwfxDst, cbwfxDst, fdwSuggest); + if (!pwfxSrc || !pwfxDst) + return MMSYSERR_INVALPARAM; + if (fdwSuggest & ~(ACM_FORMATSUGGESTF_NCHANNELS|ACM_FORMATSUGGESTF_NSAMPLESPERSEC| ACM_FORMATSUGGESTF_WBITSPERSAMPLE|ACM_FORMATSUGGESTF_WFORMATTAG)) return MMSYSERR_INVALFLAG; From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Bruno Jesus : msacm32/tests: Add tests for acmFormatSuggest(). Message-ID: Module: wine Branch: master Commit: af8760e6e5a4c0dc8e93ce76d19f9121dfa9afb2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=af8760e6e5a4c0dc8e93ce76d19f9121dfa9afb2 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Wed Sep 9 12:10:39 2015 +0800 msacm32/tests: Add tests for acmFormatSuggest(). --- dlls/msacm32/tests/msacm.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ include/mmreg.h | 1 + 2 files changed, 109 insertions(+) diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index 747c5fe..e897fc9 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -594,8 +594,116 @@ static void test_prepareheader(void) ok(mr == MMSYSERR_NOERROR, "close failed: 0x%x\n", mr); } +static void test_acmFormatSuggest(void) +{ + WAVEFORMATEX src, dst; + DWORD suggest; + MMRESULT rc; + + /* Test a valid PCM format */ + src.wFormatTag = WAVE_FORMAT_PCM; + src.nChannels = 1; + src.nSamplesPerSec = 8000; + src.nAvgBytesPerSec = 16000; + src.nBlockAlign = 2; + src.wBitsPerSample = 16; + src.cbSize = 0; + suggest = 0; + memset(&dst, 0, sizeof(dst)); + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst), suggest); + ok(rc == MMSYSERR_NOERROR, "failed with error 0x%x\n", rc); +todo_wine + ok(src.wFormatTag == dst.wFormatTag, "expected %d, got %d\n", src.wFormatTag, dst.wFormatTag); + ok(src.nChannels == dst.nChannels, "expected %d, got %d\n", src.nChannels, dst.nChannels); + ok(src.nSamplesPerSec == dst.nSamplesPerSec, "expected %d, got %d\n", src.nSamplesPerSec, dst.nSamplesPerSec); +todo_wine + ok(src.nAvgBytesPerSec == dst.nAvgBytesPerSec, "expected %d, got %d\n", src.nAvgBytesPerSec, dst.nAvgBytesPerSec); +todo_wine + ok(src.nBlockAlign == dst.nBlockAlign, "expected %d, got %d\n", src.nBlockAlign, dst.nBlockAlign); +todo_wine + ok(src.wBitsPerSample == dst.wBitsPerSample, "expected %d, got %d\n", src.wBitsPerSample, dst.wBitsPerSample); + + /* All parameters from destination are valid */ + suggest = ACM_FORMATSUGGESTF_NCHANNELS + | ACM_FORMATSUGGESTF_NSAMPLESPERSEC + | ACM_FORMATSUGGESTF_WBITSPERSAMPLE + | ACM_FORMATSUGGESTF_WFORMATTAG; + dst = src; + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst), suggest); + ok(rc == MMSYSERR_NOERROR, "failed with error 0x%x\n", rc); + ok(src.wFormatTag == dst.wFormatTag, "expected %d, got %d\n", src.wFormatTag, dst.wFormatTag); + ok(src.nChannels == dst.nChannels, "expected %d, got %d\n", src.nChannels, dst.nChannels); + ok(src.nSamplesPerSec == dst.nSamplesPerSec, "expected %d, got %d\n", src.nSamplesPerSec, dst.nSamplesPerSec); + ok(src.nAvgBytesPerSec == dst.nAvgBytesPerSec, "expected %d, got %d\n", src.nAvgBytesPerSec, dst.nAvgBytesPerSec); + ok(src.nBlockAlign == dst.nBlockAlign, "expected %d, got %d\n", src.nBlockAlign, dst.nBlockAlign); + ok(src.wBitsPerSample == dst.wBitsPerSample, "expected %d, got %d\n", src.wBitsPerSample, dst.wBitsPerSample); + + /* Test for WAVE_FORMAT_MSRT24 used in Monster Truck Madness 2 */ + src.wFormatTag = WAVE_FORMAT_MSRT24; + src.nChannels = 1; + src.nSamplesPerSec = 8000; + src.nAvgBytesPerSec = 16000; + src.nBlockAlign = 2; + src.wBitsPerSample = 16; + src.cbSize = 0; + dst = src; + suggest = ACM_FORMATSUGGESTF_NCHANNELS + | ACM_FORMATSUGGESTF_NSAMPLESPERSEC + | ACM_FORMATSUGGESTF_WBITSPERSAMPLE + | ACM_FORMATSUGGESTF_WFORMATTAG; + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst), suggest); +todo_wine + ok(rc == ACMERR_NOTPOSSIBLE, "failed with error 0x%x\n", rc); + memset(&dst, 0, sizeof(dst)); + suggest = 0; + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst), suggest); +todo_wine + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + + /* Invalid struct size */ + src.wFormatTag = WAVE_FORMAT_PCM; + rc = acmFormatSuggest(NULL, &src, &dst, 0, suggest); +todo_wine + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst) / 2, suggest); +todo_wine + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + /* cbSize is the last parameter and not required for PCM */ + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst) - 1, suggest); + ok(rc == MMSYSERR_NOERROR, "failed with error 0x%x\n", rc); + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst) - sizeof(dst.cbSize), suggest); + ok(rc == MMSYSERR_NOERROR, "failed with error 0x%x\n", rc); + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst) - sizeof(dst.cbSize) - 1, suggest); +todo_wine + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + /* cbSize is required for others */ + src.wFormatTag = WAVE_FORMAT_ADPCM; + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst) - sizeof(dst.cbSize), suggest); +todo_wine + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst) - 1, suggest); +todo_wine + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + + /* Invalid suggest flags */ + src.wFormatTag = WAVE_FORMAT_PCM; + suggest = 0xFFFFFFFF; + rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst), suggest); + ok(rc == MMSYSERR_INVALFLAG, "failed with error 0x%x\n", rc); + + /* Invalid source and destination */ + suggest = 0; + rc = acmFormatSuggest(NULL, NULL, &dst, sizeof(dst), suggest); + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + rc = acmFormatSuggest(NULL, &src, NULL, sizeof(dst), suggest); + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); + rc = acmFormatSuggest(NULL, NULL, NULL, sizeof(dst), suggest); + ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc); +} + START_TEST(msacm) { driver_tests(); test_prepareheader(); + test_acmFormatSuggest(); } diff --git a/include/mmreg.h b/include/mmreg.h index 55bfd35..e0b1dd0 100644 --- a/include/mmreg.h +++ b/include/mmreg.h @@ -107,6 +107,7 @@ typedef struct _WAVEFORMATEX { #define WAVE_FORMAT_G721_ADPCM 0x0040 /* Antex Electronics Corporation */ #define WAVE_FORMAT_MPEG 0x0050 /* Microsoft Corporation */ #define WAVE_FORMAT_MPEGLAYER3 0x0055 +#define WAVE_FORMAT_MSRT24 0x0082 /* Microsoft Corporation */ #define WAVE_FORMAT_CREATIVE_ADPCM 0x0200 /* Creative Labs, Inc */ #define WAVE_FORMAT_CREATIVE_FASTSPEECH8 0x0202 /* Creative Labs, Inc */ #define WAVE_FORMAT_CREATIVE_FASTSPEECH10 0x0203 /* Creative Labs, Inc */ From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Bruno Jesus : msacm32: Quit on unsupported destination format in PCM_FormatSuggest. Message-ID: Module: wine Branch: master Commit: c6afba8979500af43cb48fee1c33eae5fb544d03 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6afba8979500af43cb48fee1c33eae5fb544d03 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Wed Sep 9 12:10:55 2015 +0800 msacm32: Quit on unsupported destination format in PCM_FormatSuggest. --- dlls/msacm32/pcmconverter.c | 21 +++++++++++++-------- dlls/msacm32/tests/msacm.c | 1 - 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/dlls/msacm32/pcmconverter.c b/dlls/msacm32/pcmconverter.c index cf92d93..f56d155 100644 --- a/dlls/msacm32/pcmconverter.c +++ b/dlls/msacm32/pcmconverter.c @@ -839,28 +839,33 @@ static LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs) /* some tests ... */ if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) || - adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) || - PCM_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) { + adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) || + PCM_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) { WARN("not possible\n"); return ACMERR_NOTPOSSIBLE; } /* is no suggestion for destination, then copy source value */ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS)) { - adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels; + adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels; } if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC)) { - adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec; + adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec; } if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE)) { - adfs->pwfxDst->wBitsPerSample = adfs->pwfxSrc->wBitsPerSample; + adfs->pwfxDst->wBitsPerSample = adfs->pwfxSrc->wBitsPerSample; } if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) { - if (adfs->pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) { - WARN("not possible\n"); + if (adfs->pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) { + WARN("source format 0x%x not supported\n", adfs->pwfxSrc->wFormatTag); + return ACMERR_NOTPOSSIBLE; + } + adfs->pwfxDst->wFormatTag = adfs->pwfxSrc->wFormatTag; + } else { + if (adfs->pwfxDst->wFormatTag != WAVE_FORMAT_PCM) { + WARN("destination format 0x%x not supported\n", adfs->pwfxDst->wFormatTag); return ACMERR_NOTPOSSIBLE; } - adfs->pwfxDst->wFormatTag = adfs->pwfxSrc->wFormatTag; } /* check if result is ok */ if (PCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) { diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index e897fc9..88ad330 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -652,7 +652,6 @@ todo_wine | ACM_FORMATSUGGESTF_WBITSPERSAMPLE | ACM_FORMATSUGGESTF_WFORMATTAG; rc = acmFormatSuggest(NULL, &src, &dst, sizeof(dst), suggest); -todo_wine ok(rc == ACMERR_NOTPOSSIBLE, "failed with error 0x%x\n", rc); memset(&dst, 0, sizeof(dst)); suggest = 0; From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Thomas Faller : ntdll: Fix invalid use of uninitialized memory. Message-ID: Module: wine Branch: master Commit: d90f25156c09c374554cd799b0076e1bc938c002 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d90f25156c09c374554cd799b0076e1bc938c002 Author: Thomas Faller Date: Tue Sep 8 16:32:12 2015 +0200 ntdll: Fix invalid use of uninitialized memory. --- dlls/ntdll/path.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c index 8b7cbaa..feaac9e 100644 --- a/dlls/ntdll/path.c +++ b/dlls/ntdll/path.c @@ -869,7 +869,7 @@ BOOLEAN WINAPI RtlIsNameLegalDOS8Dot3( const UNICODE_STRING *unicode, if (oem->Length > 12) return FALSE; /* a starting . is invalid, except for . and .. */ - if (oem->Buffer[0] == '.') + if (oem->Length > 0 && oem->Buffer[0] == '.') { if (oem->Length != 1 && (oem->Length != 2 || oem->Buffer[1] != '.')) return FALSE; if (spaces) *spaces = FALSE; From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Nikolay Sivov : oledlg: Improve menu items localization for OleUIAddVerbMenuW(). Message-ID: Module: wine Branch: master Commit: 2a761320db4c8d4b5f1d4c0230a790b986778582 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a761320db4c8d4b5f1d4c0230a790b986778582 Author: Nikolay Sivov Date: Tue Sep 8 16:45:18 2015 +0300 oledlg: Improve menu items localization for OleUIAddVerbMenuW(). --- dlls/oledlg/oledlg.rc | 2 + dlls/oledlg/oledlg_main.c | 36 +++++++++------- dlls/oledlg/resource.h | 2 + po/ar.po | 103 +++++++++++++++++++++++++--------------------- po/bg.po | 99 +++++++++++++++++++++++--------------------- po/ca.po | 103 +++++++++++++++++++++++++--------------------- po/cs.po | 103 +++++++++++++++++++++++++--------------------- po/da.po | 103 +++++++++++++++++++++++++--------------------- po/de.po | 103 +++++++++++++++++++++++++--------------------- po/el.po | 99 +++++++++++++++++++++++--------------------- po/en.po | 99 +++++++++++++++++++++++--------------------- po/en_US.po | 99 +++++++++++++++++++++++--------------------- po/eo.po | 99 +++++++++++++++++++++++--------------------- po/es.po | 103 +++++++++++++++++++++++++--------------------- po/fa.po | 99 +++++++++++++++++++++++--------------------- po/fi.po | 103 +++++++++++++++++++++++++--------------------- po/fr.po | 103 +++++++++++++++++++++++++--------------------- po/he.po | 103 +++++++++++++++++++++++++--------------------- po/hi.po | 99 +++++++++++++++++++++++--------------------- po/hr.po | 103 +++++++++++++++++++++++++--------------------- po/hu.po | 103 +++++++++++++++++++++++++--------------------- po/it.po | 103 +++++++++++++++++++++++++--------------------- po/ja.po | 103 +++++++++++++++++++++++++--------------------- po/ko.po | 103 +++++++++++++++++++++++++--------------------- po/lt.po | 103 +++++++++++++++++++++++++--------------------- po/ml.po | 99 +++++++++++++++++++++++--------------------- po/nb_NO.po | 103 +++++++++++++++++++++++++--------------------- po/nl.po | 103 +++++++++++++++++++++++++--------------------- po/or.po | 99 +++++++++++++++++++++++--------------------- po/pa.po | 99 +++++++++++++++++++++++--------------------- po/pl.po | 103 +++++++++++++++++++++++++--------------------- po/pt_BR.po | 103 +++++++++++++++++++++++++--------------------- po/pt_PT.po | 103 +++++++++++++++++++++++++--------------------- po/rm.po | 99 +++++++++++++++++++++++--------------------- po/ro.po | 103 +++++++++++++++++++++++++--------------------- po/ru.po | 103 +++++++++++++++++++++++++--------------------- po/sk.po | 103 +++++++++++++++++++++++++--------------------- po/sl.po | 103 +++++++++++++++++++++++++--------------------- po/sr_RS at cyrillic.po | 101 ++++++++++++++++++++++++--------------------- po/sr_RS at latin.po | 101 ++++++++++++++++++++++++--------------------- po/sv.po | 103 +++++++++++++++++++++++++--------------------- po/te.po | 99 +++++++++++++++++++++++--------------------- po/th.po | 99 +++++++++++++++++++++++--------------------- po/tr.po | 103 +++++++++++++++++++++++++--------------------- po/uk.po | 103 +++++++++++++++++++++++++--------------------- po/wa.po | 99 +++++++++++++++++++++++--------------------- po/wine.pot | 99 +++++++++++++++++++++++--------------------- po/zh_CN.po | 103 +++++++++++++++++++++++++--------------------- po/zh_TW.po | 103 +++++++++++++++++++++++++--------------------- 49 files changed, 2582 insertions(+), 2132 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=2a761320db4c8d4b5f1d4c0230a790b986778582 From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Nikolay Sivov : oledlg/tests: Handle localized menu strings. Message-ID: Module: wine Branch: master Commit: 88a97cd4320f4de238b5e9e1d4c0217866622cdb URL: http://source.winehq.org/git/wine.git/?a=commit;h=88a97cd4320f4de238b5e9e1d4c0217866622cdb Author: Nikolay Sivov Date: Tue Sep 8 16:32:17 2015 +0300 oledlg/tests: Handle localized menu strings. --- dlls/oledlg/tests/main.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/dlls/oledlg/tests/main.c b/dlls/oledlg/tests/main.c index d7f696a..9c5e4bd 100644 --- a/dlls/oledlg/tests/main.c +++ b/dlls/oledlg/tests/main.c @@ -26,6 +26,18 @@ #include "initguid.h" #include "oledlg.h" +static const WCHAR *strstrW( const WCHAR *str, const WCHAR *sub ) +{ + while (*str) + { + const WCHAR *p1 = str, *p2 = sub; + while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; } + if (!*p2) return str; + str++; + } + return NULL; +} + static HRESULT WINAPI enumverbs_QueryInterface(IEnumOLEVERB *iface, REFIID riid, void **ppv) { if (IsEqualIID(riid, &IID_IEnumOLEVERB) || IsEqualIID(riid, &IID_IUnknown)) { @@ -396,8 +408,9 @@ static void test_OleUIAddVerbMenu(void) info.cch = sizeof(buffW)/sizeof(WCHAR); ret = GetMenuItemInfoW(hMenu, 4, TRUE, &info); ok(ret, "got %d\n", ret); - /* item string has a form of ' ', where Object is localized */ - ok(!memcmp(buffW, verbW, sizeof(verbW) - sizeof(WCHAR)), "str %s\n", wine_dbgstr_w(buffW)); + /* Item string contains verb, usertype and localized string for 'Object' word, + exact format depends on localization. */ + ok(strstrW(buffW, verbW) != NULL, "str %s\n", wine_dbgstr_w(buffW)); ok(info.fState == 0, "got state 0x%08x\n", info.fState); ok(info.hSubMenu == NULL, "got submenu %p\n", info.hSubMenu); From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Andrew Eikum : include/xapo.idl: Add descriptions for IXAPO and IXAPOProperties. Message-ID: Module: wine Branch: master Commit: 8f98d4e6c4877e821b82a6457e471d2e99575471 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f98d4e6c4877e821b82a6457e471d2e99575471 Author: Andrew Eikum Date: Tue Sep 8 09:33:40 2015 -0500 include/xapo.idl: Add descriptions for IXAPO and IXAPOProperties. --- include/Makefile.in | 1 + include/xapo.idl | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) diff --git a/include/Makefile.in b/include/Makefile.in index f4d853e..9ed7663 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -145,6 +145,7 @@ PUBLIC_IDL_H_SRCS = \ wpcapi.idl \ wtypes.idl \ wuapi.idl \ + xapo.idl \ xaudio2.idl \ xmllite.idl diff --git a/include/xapo.idl b/include/xapo.idl new file mode 100644 index 0000000..9055775 --- /dev/null +++ b/include/xapo.idl @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2015 Andrew Eikum 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 + */ + +import "unknwn.idl"; + +#define XAPO_REGISTRATION_STRING_LENGTH 256 + +cpp_quote("#if 0") +typedef struct WAVEFORMATEX +{ + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} WAVEFORMATEX; + +typedef struct { + WAVEFORMATEX Format; + union { + WORD wValidBitsPerSample; + WORD wSamplesPerBlock; + WORD wReserved; + } Samples; + DWORD dwChannelMask; + GUID SubFormat; +} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; +cpp_quote("#else") +cpp_quote("#include ") +cpp_quote("#endif") + +typedef struct XAPO_REGISTRATION_PROPERTIES +{ + CLSID clsid; + WCHAR FriendlyName[XAPO_REGISTRATION_STRING_LENGTH]; + WCHAR CopyrightInfo[XAPO_REGISTRATION_STRING_LENGTH]; + UINT32 MajorVersion; + UINT32 MinorVersion; + UINT32 Flags; + UINT32 MinInputBufferCount; + UINT32 MaxInputBufferCount; + UINT32 MinOutputBufferCount; + UINT32 MaxOutputBufferCount; +} XAPO_REGISTRATION_PROPERTIES; + +typedef struct XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS { + const WAVEFORMATEX *pFormat; + UINT32 MaxFrameCount; +} XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS; + +typedef enum XAPO_BUFFER_FLAGS { + XAPO_BUFFER_SILENT, + XAPO_BUFFER_VALID +} XAPO_BUFFER_FLAGS; + +typedef struct XAPO_PROCESS_BUFFER_PARAMETERS { + void *pBuffer; + XAPO_BUFFER_FLAGS BufferFlags; + UINT32 ValidFrameCount; +} XAPO_PROCESS_BUFFER_PARAMETERS; + +/* XAudio2 2.8 version of IXAPO */ +[ + object, + local, + uuid(a410b984-9839-4819-a0be-2856ae6b3adb) +] +interface IXAPO : IUnknown +{ + HRESULT GetRegistrationProperties([out] XAPO_REGISTRATION_PROPERTIES **props); + + HRESULT IsInputFormatSupported(const WAVEFORMATEX *output_fmt, + const WAVEFORMATEX *input_fmt, WAVEFORMATEX **supported_fmt); + + HRESULT IsOutputFormatSupported(const WAVEFORMATEX *input_fmt, + const WAVEFORMATEX *output_fmt, WAVEFORMATEX **supported_fmt); + + HRESULT Initialize(const void *data, UINT32 data_len); + + HRESULT Reset(void); + + HRESULT LockForProcess(UINT32 in_params_count, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params, + UINT32 out_params_count, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params); + + void UnlockForProcess(void); + + void Process(UINT32 in_params_count, const XAPO_PROCESS_BUFFER_PARAMETERS *in_params, + UINT32 out_params_count, const XAPO_PROCESS_BUFFER_PARAMETERS *out_params, + BOOL enabled); + + UINT32 CalcInputFrames(UINT32 output_frames); + + UINT32 CalcOutputFrames(UINT32 input_frames); +} + +/* XAudio2 2.7 version of IXAPO is identical to 2.8 */ +cpp_quote("DEFINE_GUID(IID_IXAPO27, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x00);") + + +/* XAudio2 2.8 version of IXAPOParameters */ +[ + object, + local, + uuid(26d95c66-80f2-499a-ad54-5ae7f01c6d98) +] +interface IXAPOParameters : IUnknown +{ + void SetParameters(const void *params, UINT32 params_len); + + void GetParameters(void *params, UINT32 params_len); +} + +/* XAudio2 2.7 version of IXAPOParameters is identical to 2.8 */ +cpp_quote("DEFINE_GUID(IID_IXAPO27Parameters, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x01);") From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Andrew Eikum : xaudio2: Add stub implementation of AudioVolumeMeter. Message-ID: Module: wine Branch: master Commit: 395dc0f22cffa95ffcc4be5c4b3adf2678495503 URL: http://source.winehq.org/git/wine.git/?a=commit;h=395dc0f22cffa95ffcc4be5c4b3adf2678495503 Author: Andrew Eikum Date: Tue Sep 8 09:33:44 2015 -0500 xaudio2: Add stub implementation of AudioVolumeMeter. --- dlls/xaudio2_7/tests/xaudio2.c | 35 +++++- dlls/xaudio2_7/xaudio_classes.idl | 7 ++ dlls/xaudio2_7/xaudio_dll.c | 245 ++++++++++++++++++++++++++++++++++++++ dlls/xaudio2_8/xaudio2_8.spec | 1 + dlls/xaudio2_8/xaudio_dll.c | 8 ++ include/Makefile.in | 1 + include/xaudio2fx.idl | 26 ++++ 7 files changed, 321 insertions(+), 2 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=395dc0f22cffa95ffcc4be5c4b3adf2678495503 From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Andrew Eikum : xaudio2: Add stub for AudioReverb class. Message-ID: Module: wine Branch: master Commit: b3cb1e4d407dd5564846d989d356326bddc73b70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3cb1e4d407dd5564846d989d356326bddc73b70 Author: Andrew Eikum Date: Tue Sep 8 09:33:47 2015 -0500 xaudio2: Add stub for AudioReverb class. --- dlls/xaudio2_7/xaudio_classes.idl | 7 ++ dlls/xaudio2_7/xaudio_dll.c | 241 ++++++++++++++++++++++++++++++++++++++ dlls/xaudio2_8/xaudio_dll.c | 6 + include/xaudio2fx.idl | 7 ++ 4 files changed, 261 insertions(+) diff --git a/dlls/xaudio2_7/xaudio_classes.idl b/dlls/xaudio2_7/xaudio_classes.idl index a39d082..a1ed611 100644 --- a/dlls/xaudio2_7/xaudio_classes.idl +++ b/dlls/xaudio2_7/xaudio_classes.idl @@ -33,3 +33,10 @@ coclass XAudio2 { interface IXAudio2; } uuid(cac1105f-619b-4d04-831a-44e1cbf12d57) ] coclass AudioVolumeMeter { interface IUnknown; } + +[ + helpstring("XAudio2 Reverb Class"), + threading(both), + uuid(6a93130e-1d53-41d1-a9cf-e758800bb179) +] +coclass AudioReverb { interface IUnknown; } diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index 7a5f45b..739c919 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -2435,6 +2435,206 @@ static const IXAPOParametersVtbl VUMXAPOParameters_Vtbl = { VUMXAPOParams_GetParameters }; +typedef struct _ReverbImpl { + IXAPO IXAPO_iface; + IXAPOParameters IXAPOParameters_iface; + + LONG ref; +} ReverbImpl; + +static ReverbImpl *ReverbImpl_from_IXAPO(IXAPO *iface) +{ + return CONTAINING_RECORD(iface, ReverbImpl, IXAPO_iface); +} + +static ReverbImpl *ReverbImpl_from_IXAPOParameters(IXAPOParameters *iface) +{ + return CONTAINING_RECORD(iface, ReverbImpl, IXAPOParameters_iface); +} + +static HRESULT WINAPI RVBXAPO_QueryInterface(IXAPO *iface, REFIID riid, void **ppvObject) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + + TRACE("%p, %s, %p\n", This, wine_dbgstr_guid(riid), ppvObject); + + if(IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IXAPO) || + IsEqualGUID(riid, &IID_IXAPO27)) + *ppvObject = &This->IXAPO_iface; + else if(IsEqualGUID(riid, &IID_IXAPOParameters)) + *ppvObject = &This->IXAPOParameters_iface; + else + *ppvObject = NULL; + + if(*ppvObject){ + IUnknown_AddRef((IUnknown*)*ppvObject); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI RVBXAPO_AddRef(IXAPO *iface) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + ULONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p)->(): Refcount now %u\n", This, ref); + return ref; +} + +static ULONG WINAPI RVBXAPO_Release(IXAPO *iface) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(): Refcount now %u\n", This, ref); + + if(!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI RVBXAPO_GetRegistrationProperties(IXAPO *iface, + XAPO_REGISTRATION_PROPERTIES **props) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %p\n", This, props); + return E_NOTIMPL; +} + +static HRESULT WINAPI RVBXAPO_IsInputFormatSupported(IXAPO *iface, + const WAVEFORMATEX *output_fmt, const WAVEFORMATEX *input_fmt, + WAVEFORMATEX **supported_fmt) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %p, %p, %p\n", This, output_fmt, input_fmt, supported_fmt); + return E_NOTIMPL; +} + +static HRESULT WINAPI RVBXAPO_IsOutputFormatSupported(IXAPO *iface, + const WAVEFORMATEX *input_fmt, const WAVEFORMATEX *output_fmt, + WAVEFORMATEX **supported_fmt) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %p, %p, %p\n", This, input_fmt, output_fmt, supported_fmt); + return E_NOTIMPL; +} + +static HRESULT WINAPI RVBXAPO_Initialize(IXAPO *iface, const void *data, + UINT32 data_len) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %p, %u\n", This, data, data_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI RVBXAPO_Reset(IXAPO *iface) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI RVBXAPO_LockForProcess(IXAPO *iface, UINT32 in_params_count, + const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params, + UINT32 out_params_count, + const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %u, %p, %u, %p\n", This, in_params_count, in_params, + out_params_count, out_params); + return E_NOTIMPL; +} + +static void WINAPI RVBXAPO_UnlockForProcess(IXAPO *iface) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p\n", This); +} + +static void WINAPI RVBXAPO_Process(IXAPO *iface, UINT32 in_params_count, + const XAPO_PROCESS_BUFFER_PARAMETERS *in_params, + UINT32 out_params_count, + const XAPO_PROCESS_BUFFER_PARAMETERS *out_params, BOOL enabled) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %u, %p, %u, %p, %u\n", This, in_params_count, in_params, + out_params_count, out_params, enabled); +} + +static UINT32 WINAPI RVBXAPO_CalcInputFrames(IXAPO *iface, UINT32 output_frames) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %u\n", This, output_frames); + return 0; +} + +static UINT32 WINAPI RVBXAPO_CalcOutputFrames(IXAPO *iface, UINT32 input_frames) +{ + ReverbImpl *This = ReverbImpl_from_IXAPO(iface); + TRACE("%p, %u\n", This, input_frames); + return 0; +} + +static const IXAPOVtbl RVBXAPO_Vtbl = { + RVBXAPO_QueryInterface, + RVBXAPO_AddRef, + RVBXAPO_Release, + RVBXAPO_GetRegistrationProperties, + RVBXAPO_IsInputFormatSupported, + RVBXAPO_IsOutputFormatSupported, + RVBXAPO_Initialize, + RVBXAPO_Reset, + RVBXAPO_LockForProcess, + RVBXAPO_UnlockForProcess, + RVBXAPO_Process, + RVBXAPO_CalcInputFrames, + RVBXAPO_CalcOutputFrames +}; + +static HRESULT WINAPI RVBXAPOParams_QueryInterface(IXAPOParameters *iface, + REFIID riid, void **ppvObject) +{ + ReverbImpl *This = ReverbImpl_from_IXAPOParameters(iface); + return RVBXAPO_QueryInterface(&This->IXAPO_iface, riid, ppvObject); +} + +static ULONG WINAPI RVBXAPOParams_AddRef(IXAPOParameters *iface) +{ + ReverbImpl *This = ReverbImpl_from_IXAPOParameters(iface); + return RVBXAPO_AddRef(&This->IXAPO_iface); +} + +static ULONG WINAPI RVBXAPOParams_Release(IXAPOParameters *iface) +{ + ReverbImpl *This = ReverbImpl_from_IXAPOParameters(iface); + return RVBXAPO_Release(&This->IXAPO_iface); +} + +static void WINAPI RVBXAPOParams_SetParameters(IXAPOParameters *iface, + const void *params, UINT32 params_len) +{ + ReverbImpl *This = ReverbImpl_from_IXAPOParameters(iface); + TRACE("%p, %p, %u\n", This, params, params_len); +} + +static void WINAPI RVBXAPOParams_GetParameters(IXAPOParameters *iface, void *params, + UINT32 params_len) +{ + ReverbImpl *This = ReverbImpl_from_IXAPOParameters(iface); + TRACE("%p, %p, %u\n", This, params, params_len); +} + +static const IXAPOParametersVtbl RVBXAPOParameters_Vtbl = { + RVBXAPOParams_QueryInterface, + RVBXAPOParams_AddRef, + RVBXAPOParams_Release, + RVBXAPOParams_SetParameters, + RVBXAPOParams_GetParameters +}; + static HRESULT WINAPI XAudio2CF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj) { if(IsEqualGUID(riid, &IID_IUnknown) @@ -2615,6 +2815,35 @@ static HRESULT WINAPI VUMeterCF_CreateInstance(IClassFactory *iface, IUnknown *p return S_OK; } +static HRESULT WINAPI ReverbCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, + REFIID riid, void **ppobj) +{ + HRESULT hr; + ReverbImpl *object; + + TRACE("(static)->(%p,%s,%p)\n", pOuter, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if(pOuter) + return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if(!object) + return E_OUTOFMEMORY; + + object->IXAPO_iface.lpVtbl = &RVBXAPO_Vtbl; + object->IXAPOParameters_iface.lpVtbl = &RVBXAPOParameters_Vtbl; + + hr = IXAPO_QueryInterface(&object->IXAPO_iface, riid, ppobj); + if(FAILED(hr)){ + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + return S_OK; +} + static HRESULT WINAPI XAudio2CF_LockServer(IClassFactory *iface, BOOL dolock) { FIXME("(static)->(%d): stub!\n", dolock); @@ -2639,8 +2868,18 @@ static const IClassFactoryVtbl VUMeterCF_Vtbl = XAudio2CF_LockServer }; +static const IClassFactoryVtbl ReverbCF_Vtbl = +{ + XAudio2CF_QueryInterface, + XAudio2CF_AddRef, + XAudio2CF_Release, + ReverbCF_CreateInstance, + XAudio2CF_LockServer +}; + static IClassFactory xaudio2_cf = { &XAudio2CF_Vtbl }; static IClassFactory vumeter_cf = { &VUMeterCF_Vtbl }; +static IClassFactory reverb_cf = { &ReverbCF_Vtbl }; HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) { @@ -2652,6 +2891,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) factory = &xaudio2_cf; }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter)) { factory = &vumeter_cf; + }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb)) { + factory = &reverb_cf; } if(!factory) return CLASS_E_CLASSNOTAVAILABLE; diff --git a/dlls/xaudio2_8/xaudio_dll.c b/dlls/xaudio2_8/xaudio_dll.c index 521cc29..4a73783 100644 --- a/dlls/xaudio2_8/xaudio_dll.c +++ b/dlls/xaudio2_8/xaudio_dll.c @@ -79,3 +79,9 @@ HRESULT WINAPI CreateAudioVolumeMeter(IUnknown **out) return CoCreateInstance(&CLSID_AudioVolumeMeter, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out); } + +HRESULT WINAPI CreateAudioReverb(IUnknown **out) +{ + return CoCreateInstance(&CLSID_AudioReverb, NULL, CLSCTX_INPROC_SERVER, + &IID_IUnknown, (void**)out); +} diff --git a/include/xaudio2fx.idl b/include/xaudio2fx.idl index 8d74264..a83b2f6 100644 --- a/include/xaudio2fx.idl +++ b/include/xaudio2fx.idl @@ -24,3 +24,10 @@ import "unknwn.idl"; coclass AudioVolumeMeter { interface IUnknown; } + +[ + uuid(6a93130e-1d53-41d1-a9cf-e758800bb179) +] +coclass AudioReverb { + interface IUnknown; +} From julliard at wine.codeweavers.com Wed Sep 9 09:57:36 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:36 -0500 Subject: Piotr Caban : msi: Check HKLM/Software/Classes/Installer/ Components path while looking for components. Message-ID: Module: wine Branch: master Commit: e8f4fea5a0a99e82b538b03b3b0299cceab114db URL: http://source.winehq.org/git/wine.git/?a=commit;h=e8f4fea5a0a99e82b538b03b3b0299cceab114db Author: Piotr Caban Date: Wed Sep 9 09:55:35 2015 +0200 msi: Check HKLM/Software/Classes/Installer/Components path while looking for components. --- dlls/msi/registry.c | 12 +++++++++++- dlls/msi/tests/action.c | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c index 2106ab2..e797f1e 100644 --- a/dlls/msi/registry.c +++ b/dlls/msi/registry.c @@ -173,6 +173,10 @@ static const WCHAR szUserComponents[] = { 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', 'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s','\\',0}; +static const WCHAR szInstaller_Components[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s','\\',0}; + static const WCHAR szUserFeatures[] = { 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', 'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s','\\',0}; @@ -650,6 +654,7 @@ UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINS UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY *key, BOOL create) { WCHAR squished_cc[GUID_SIZE], keypath[0x200]; + UINT ret; if (!squash_guid(szComponent, squished_cc)) return ERROR_FUNCTION_FAILED; TRACE("%s squished %s\n", debugstr_w(szComponent), debugstr_w(squished_cc)); @@ -658,7 +663,12 @@ UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY *key, BOOL create) strcatW(keypath, squished_cc); if (create) return RegCreateKeyW(HKEY_CURRENT_USER, keypath, key); - return RegOpenKeyW(HKEY_CURRENT_USER, keypath, key); + ret = RegOpenKeyW(HKEY_CURRENT_USER, keypath, key); + if (ret != ERROR_FILE_NOT_FOUND) return ret; + + strcpyW(keypath, szInstaller_Components); + strcatW(keypath, squished_cc); + return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); } UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid, HKEY *key, BOOL create) diff --git a/dlls/msi/tests/action.c b/dlls/msi/tests/action.c index 435aeeb..2aa5b0b 100644 --- a/dlls/msi/tests/action.c +++ b/dlls/msi/tests/action.c @@ -5854,10 +5854,14 @@ static void test_publish_components(void) { static const char keypath[] = "Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA"; + static const char keypath2[] = + "Software\\Classes\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA"; UINT r; LONG res; HKEY key; + BYTE *data; + DWORD size; if (is_process_limited()) { @@ -5879,13 +5883,48 @@ static void test_publish_components(void) } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + size = 0; + r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}", + "english.txt", INSTALLMODE_DEFAULT, NULL, &size); + ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r); + res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key); ok(res == ERROR_SUCCESS, "components key not created %d\n", res); - res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, NULL); + res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, &size); + ok(res == ERROR_SUCCESS, "value not found %d\n", res); + + data = HeapAlloc(GetProcessHeap(), 0, size); + res = RegQueryValueExA(key, "english.txt", NULL, NULL, data, &size); ok(res == ERROR_SUCCESS, "value not found %d\n", res); RegCloseKey(key); + res = RegDeleteKeyA(HKEY_CURRENT_USER, keypath); + ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath2, &key); + ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res); + + res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size); + ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res); + RegCloseKey(key); + + size = 0; + r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}", + "english.txt", INSTALLMODE_DEFAULT, NULL, &size); + ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r); + + res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, keypath2); + ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res); + + res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &key); + ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res); + + res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size); + ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res); + HeapFree(GetProcessHeap(), 0, data); + RegCloseKey(key); + r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: Piotr Caban : wine.inf: Add HKLM\System\Select\Current key. Message-ID: Module: wine Branch: master Commit: 86d70c67b831f633b43f6b666719daef506141f5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=86d70c67b831f633b43f6b666719daef506141f5 Author: Piotr Caban Date: Wed Sep 9 10:21:46 2015 +0200 wine.inf: Add HKLM\System\Select\Current key. --- loader/wine.inf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/loader/wine.inf.in b/loader/wine.inf.in index 2025d9e..f30942a 100644 --- a/loader/wine.inf.in +++ b/loader/wine.inf.in @@ -658,6 +658,7 @@ HKLM,System\CurrentControlSet\Control\TimeZoneInformation,"StandardName",2,"" HKLM,System\CurrentControlSet\Control\TimeZoneInformation,"TimeZoneKeyName",2,"" HKLM,System\CurrentControlSet\Control\VirtualDeviceDrivers,,16 HKLM,System\CurrentControlSet\Control\VMM32Files,,16 +HKLM,System\Select,"Current",0x10003,1 HKCU,AppEvents\Schemes\Apps\Explorer\Navigating\.Current,,,"" HKCU,Software\Microsoft\Protected Storage System Provider,,16 ; Some apps requires at least four subkeys of Active Setup\Installed Components From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_rendertarget_view to d3d_rendertarget_view. Message-ID: Module: wine Branch: master Commit: 44fa6faa9bf1809ef2cf59f4cfc32a3a93f4ec2a URL: http://source.winehq.org/git/wine.git/?a=commit;h=44fa6faa9bf1809ef2cf59f4cfc32a3a93f4ec2a Author: J?zef Kucia Date: Wed Sep 9 01:35:41 2015 +0200 d3d11: Rename d3d10_rendertarget_view to d3d_rendertarget_view. --- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 10 +++++----- dlls/d3d11/view.c | 24 ++++++++++++------------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index c5593d7..ea6e834 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -171,7 +171,7 @@ HRESULT d3d_depthstencil_view_create(struct d3d_device *device, ID3D11Resource * struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) DECLSPEC_HIDDEN; /* ID3D10RenderTargetView */ -struct d3d10_rendertarget_view +struct d3d_rendertarget_view { ID3D10RenderTargetView ID3D10RenderTargetView_iface; LONG refcount; @@ -183,9 +183,9 @@ struct d3d10_rendertarget_view ID3D10Device1 *device; }; -HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view, struct d3d_device *device, +HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc) DECLSPEC_HIDDEN; -struct d3d10_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) DECLSPEC_HIDDEN; +struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) DECLSPEC_HIDDEN; /* ID3D10ShaderResourceView */ struct d3d10_shader_resource_view diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index d6065b4..d9beffe 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -940,7 +940,7 @@ static void STDMETHODCALLTYPE d3d10_device_OMSetRenderTargets(ID3D10Device1 *ifa wined3d_mutex_lock(); for (i = 0; i < render_target_view_count; ++i) { - struct d3d10_rendertarget_view *rtv = unsafe_impl_from_ID3D10RenderTargetView(render_target_views[i]); + struct d3d_rendertarget_view *rtv = unsafe_impl_from_ID3D10RenderTargetView(render_target_views[i]); wined3d_device_set_rendertarget_view(device->wined3d_device, i, rtv ? rtv->wined3d_view : NULL, FALSE); @@ -1210,7 +1210,7 @@ static void STDMETHODCALLTYPE d3d10_device_ClearRenderTargetView(ID3D10Device1 * ID3D10RenderTargetView *render_target_view, const FLOAT color_rgba[4]) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_rendertarget_view *view = unsafe_impl_from_ID3D10RenderTargetView(render_target_view); + struct d3d_rendertarget_view *view = unsafe_impl_from_ID3D10RenderTargetView(render_target_view); const struct wined3d_color color = {color_rgba[0], color_rgba[1], color_rgba[2], color_rgba[3]}; HRESULT hr; @@ -1692,7 +1692,7 @@ static void STDMETHODCALLTYPE d3d10_device_OMGetRenderTargets(ID3D10Device1 *ifa wined3d_mutex_lock(); if (render_target_views) { - struct d3d10_rendertarget_view *view_impl; + struct d3d_rendertarget_view *view_impl; unsigned int i; for (i = 0; i < view_count; ++i) @@ -2122,7 +2122,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRenderTargetView(ID3D10Devic ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3D10RenderTargetView **view) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_rendertarget_view *object; + struct d3d_rendertarget_view *object; HRESULT hr; TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); @@ -2130,7 +2130,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRenderTargetView(ID3D10Devic if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; - if (FAILED(hr = d3d10_rendertarget_view_init(object, device, resource, desc))) + if (FAILED(hr = d3d_rendertarget_view_init(object, device, resource, desc))) { WARN("Failed to initialize rendertarget view, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index cff0948..4fc77f5 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -766,9 +766,9 @@ struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10Dept return impl_from_ID3D10DepthStencilView(iface); } -static inline struct d3d10_rendertarget_view *impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) +static inline struct d3d_rendertarget_view *impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) { - return CONTAINING_RECORD(iface, struct d3d10_rendertarget_view, ID3D10RenderTargetView_iface); + return CONTAINING_RECORD(iface, struct d3d_rendertarget_view, ID3D10RenderTargetView_iface); } /* IUnknown methods */ @@ -796,7 +796,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_QueryInterface(ID3D10Re static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_AddRef(ID3D10RenderTargetView *iface) { - struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); @@ -806,7 +806,7 @@ static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_AddRef(ID3D10RenderTarget static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTargetView *iface) { - struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); @@ -829,7 +829,7 @@ static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTarge static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDevice(ID3D10RenderTargetView *iface, ID3D10Device **device) { - struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); TRACE("iface %p, device %p.\n", iface, device); @@ -840,7 +840,7 @@ static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDevice(ID3D10RenderTarg static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_GetPrivateData(ID3D10RenderTargetView *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -851,7 +851,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_GetPrivateData(ID3D10Re static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateData(ID3D10RenderTargetView *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -862,7 +862,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateData(ID3D10Re static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateDataInterface(ID3D10RenderTargetView *iface, REFGUID guid, const IUnknown *data) { - struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); @@ -874,7 +874,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateDataInterface static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetResource(ID3D10RenderTargetView *iface, ID3D10Resource **resource) { - struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); TRACE("iface %p, resource %p\n", iface, resource); @@ -887,7 +887,7 @@ static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetResource(ID3D10RenderTa static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDesc(ID3D10RenderTargetView *iface, D3D10_RENDER_TARGET_VIEW_DESC *desc) { - struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); + struct d3d_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); TRACE("iface %p, desc %p\n", iface, desc); @@ -974,7 +974,7 @@ static void wined3d_rendertarget_view_desc_from_d3d10core(struct wined3d_rendert } } -HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view, struct d3d_device *device, +HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc) { struct wined3d_rendertarget_view_desc wined3d_desc; @@ -1021,7 +1021,7 @@ HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view, struc return S_OK; } -struct d3d10_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) +struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) { if (!iface) return NULL; From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Add ID3D11RenderTargetView interface stub. Message-ID: Module: wine Branch: master Commit: b5b5b381f469870be81a109b6627170d9eafb20e URL: http://source.winehq.org/git/wine.git/?a=commit;h=b5b5b381f469870be81a109b6627170d9eafb20e Author: J?zef Kucia Date: Wed Sep 9 01:35:42 2015 +0200 d3d11: Add ID3D11RenderTargetView interface stub. --- dlls/d3d11/d3d11_private.h | 3 +- dlls/d3d11/view.c | 162 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 140 insertions(+), 25 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index ea6e834..58e5912 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -170,9 +170,10 @@ HRESULT d3d_depthstencil_view_create(struct d3d_device *device, ID3D11Resource * const D3D11_DEPTH_STENCIL_VIEW_DESC *desc, struct d3d_depthstencil_view **view) DECLSPEC_HIDDEN; struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface) DECLSPEC_HIDDEN; -/* ID3D10RenderTargetView */ +/* ID3D11RenderTargetView, ID3D10RenderTargetView */ struct d3d_rendertarget_view { + ID3D11RenderTargetView ID3D11RenderTargetView_iface; ID3D10RenderTargetView ID3D10RenderTargetView_iface; LONG refcount; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 4fc77f5..7f7dcfd 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -766,65 +766,178 @@ struct d3d_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10Dept return impl_from_ID3D10DepthStencilView(iface); } -static inline struct d3d_rendertarget_view *impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) +/* ID3D11RenderTargetView methods */ + +static inline struct d3d_rendertarget_view *impl_from_ID3D11RenderTargetView(ID3D11RenderTargetView *iface) { - return CONTAINING_RECORD(iface, struct d3d_rendertarget_view, ID3D10RenderTargetView_iface); + return CONTAINING_RECORD(iface, struct d3d_rendertarget_view, ID3D11RenderTargetView_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_QueryInterface(ID3D10RenderTargetView *iface, +static HRESULT STDMETHODCALLTYPE d3d11_rendertarget_view_QueryInterface(ID3D11RenderTargetView *iface, REFIID riid, void **object) { - TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); - if (IsEqualGUID(riid, &IID_ID3D10RenderTargetView) - || IsEqualGUID(riid, &IID_ID3D10View) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D11RenderTargetView) + || IsEqualGUID(riid, &IID_ID3D11View) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11RenderTargetView_AddRef(iface); *object = iface; return S_OK; } - WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + if (IsEqualGUID(riid, &IID_ID3D10RenderTargetView) + || IsEqualGUID(riid, &IID_ID3D10View) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + ID3D10RenderTargetView_AddRef(&view->ID3D10RenderTargetView_iface); + *object = &view->ID3D10RenderTargetView_iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *object = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_AddRef(ID3D10RenderTargetView *iface) +static ULONG STDMETHODCALLTYPE d3d11_rendertarget_view_AddRef(ID3D11RenderTargetView *iface) { - struct d3d_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); - ULONG refcount = InterlockedIncrement(&This->refcount); + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + ULONG refcount = InterlockedIncrement(&view->refcount); - TRACE("%p increasing refcount to %u\n", This, refcount); + TRACE("%p increasing refcount to %u.\n", view, refcount); return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTargetView *iface) +static ULONG STDMETHODCALLTYPE d3d11_rendertarget_view_Release(ID3D11RenderTargetView *iface) { - struct d3d_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); - ULONG refcount = InterlockedDecrement(&This->refcount); + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + ULONG refcount = InterlockedDecrement(&view->refcount); - TRACE("%p decreasing refcount to %u\n", This, refcount); + TRACE("%p decreasing refcount to %u.\n", view, refcount); if (!refcount) { wined3d_mutex_lock(); - wined3d_rendertarget_view_decref(This->wined3d_view); - ID3D10Resource_Release(This->resource); - ID3D10Device1_Release(This->device); - wined3d_private_store_cleanup(&This->private_store); + wined3d_rendertarget_view_decref(view->wined3d_view); + ID3D10Resource_Release(view->resource); + ID3D10Device1_Release(view->device); + wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); - HeapFree(GetProcessHeap(), 0, This); + HeapFree(GetProcessHeap(), 0, view); } return refcount; } +static void STDMETHODCALLTYPE d3d11_rendertarget_view_GetDevice(ID3D11RenderTargetView *iface, + ID3D11Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_rendertarget_view_GetPrivateData(ID3D11RenderTargetView *iface, + REFGUID guid, UINT *data_size, void *data) +{ + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_get_private_data(&view->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_rendertarget_view_SetPrivateData(ID3D11RenderTargetView *iface, + REFGUID guid, UINT data_size, const void *data) +{ + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_set_private_data(&view->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_rendertarget_view_SetPrivateDataInterface(ID3D11RenderTargetView *iface, + REFGUID guid, const IUnknown *data) +{ + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&view->private_store, guid, data); +} + +static void STDMETHODCALLTYPE d3d11_rendertarget_view_GetResource(ID3D11RenderTargetView *iface, + ID3D11Resource **resource) +{ + FIXME("iface %p, resource %p stub!\n", iface, resource); +} + +static void STDMETHODCALLTYPE d3d11_rendertarget_view_GetDesc(ID3D11RenderTargetView *iface, + D3D11_RENDER_TARGET_VIEW_DESC *desc) +{ + FIXME("iface %p, desc %p stub!\n", iface, desc); +} + +static const struct ID3D11RenderTargetViewVtbl d3d11_rendertarget_view_vtbl = +{ + /* IUnknown methods */ + d3d11_rendertarget_view_QueryInterface, + d3d11_rendertarget_view_AddRef, + d3d11_rendertarget_view_Release, + /* ID3D11DeviceChild methods */ + d3d11_rendertarget_view_GetDevice, + d3d11_rendertarget_view_GetPrivateData, + d3d11_rendertarget_view_SetPrivateData, + d3d11_rendertarget_view_SetPrivateDataInterface, + /* ID3D11View methods */ + d3d11_rendertarget_view_GetResource, + /* ID3D11RenderTargetView methods */ + d3d11_rendertarget_view_GetDesc, +}; + +/* ID3D10RenderTargetView methods */ + +static inline struct d3d_rendertarget_view *impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_rendertarget_view, ID3D10RenderTargetView_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_QueryInterface(ID3D10RenderTargetView *iface, + REFIID riid, void **object) +{ + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_rendertarget_view_QueryInterface(&view->ID3D11RenderTargetView_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_AddRef(ID3D10RenderTargetView *iface) +{ + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_rendertarget_view_AddRef(&view->ID3D11RenderTargetView_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTargetView *iface) +{ + struct d3d_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_rendertarget_view_Release(&view->ID3D11RenderTargetView_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDevice(ID3D10RenderTargetView *iface, ID3D10Device **device) @@ -981,6 +1094,7 @@ HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3 struct wined3d_resource *wined3d_resource; HRESULT hr; + view->ID3D11RenderTargetView_iface.lpVtbl = &d3d11_rendertarget_view_vtbl; view->ID3D10RenderTargetView_iface.lpVtbl = &d3d10_rendertarget_view_vtbl; view->refcount = 1; From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_rendertarget_view_GetResource(). Message-ID: Module: wine Branch: master Commit: 99bb367d522778abba938933267025c6c8fd384c URL: http://source.winehq.org/git/wine.git/?a=commit;h=99bb367d522778abba938933267025c6c8fd384c Author: J?zef Kucia Date: Wed Sep 9 01:35:43 2015 +0200 d3d11: Implement d3d11_rendertarget_view_GetResource(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 13 ++++++++++++- dlls/d3d11/view.c | 38 +++++++++++++++++++++----------------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 58e5912..30c588e 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -180,12 +180,12 @@ struct d3d_rendertarget_view struct wined3d_private_store private_store; struct wined3d_rendertarget_view *wined3d_view; D3D10_RENDER_TARGET_VIEW_DESC desc; - ID3D10Resource *resource; + ID3D11Resource *resource; ID3D10Device1 *device; }; HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, - ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc) DECLSPEC_HIDDEN; + ID3D11Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc) DECLSPEC_HIDDEN; struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) DECLSPEC_HIDDEN; /* ID3D10ShaderResourceView */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index d9beffe..b45342a 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2123,6 +2123,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRenderTargetView(ID3D10Devic { struct d3d_device *device = impl_from_ID3D10Device(iface); struct d3d_rendertarget_view *object; + ID3D11Resource *d3d11_resource; HRESULT hr; TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); @@ -2130,13 +2131,23 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRenderTargetView(ID3D10Devic if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; - if (FAILED(hr = d3d_rendertarget_view_init(object, device, resource, desc))) + if (FAILED(hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D11Resource, (void **)&d3d11_resource))) + { + ERR("Resource does not implement ID3D11Resource.\n"); + HeapFree(GetProcessHeap(), 0, object); + return E_FAIL; + } + + if (FAILED(hr = d3d_rendertarget_view_init(object, device, d3d11_resource, desc))) { WARN("Failed to initialize rendertarget view, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); + ID3D11Resource_Release(d3d11_resource); return hr; } + ID3D11Resource_Release(d3d11_resource); + TRACE("Created rendertarget view %p.\n", object); *view = &object->ID3D10RenderTargetView_iface; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 7f7dcfd..231eb19 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -121,21 +121,21 @@ static HRESULT set_dsdesc_from_resource(D3D11_DEPTH_STENCIL_VIEW_DESC *desc, ID3 } } -static HRESULT set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3D10Resource *resource) +static HRESULT set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3D11Resource *resource) { - D3D10_RESOURCE_DIMENSION dimension; + D3D11_RESOURCE_DIMENSION dimension; HRESULT hr; - ID3D10Resource_GetType(resource, &dimension); + ID3D11Resource_GetType(resource, &dimension); switch(dimension) { - case D3D10_RESOURCE_DIMENSION_TEXTURE1D: + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: { ID3D10Texture1D *texture; D3D10_TEXTURE1D_DESC texture_desc; - hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture1D, (void **)&texture); + hr = ID3D11Resource_QueryInterface(resource, &IID_ID3D10Texture1D, (void **)&texture); if (FAILED(hr)) { ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D?\n"); @@ -162,12 +162,12 @@ static HRESULT set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3 return S_OK; } - case D3D10_RESOURCE_DIMENSION_TEXTURE2D: + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: { ID3D10Texture2D *texture; D3D10_TEXTURE2D_DESC texture_desc; - hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture); + hr = ID3D11Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture); if (FAILED(hr)) { ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D?\n"); @@ -210,12 +210,12 @@ static HRESULT set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3 return S_OK; } - case D3D10_RESOURCE_DIMENSION_TEXTURE3D: + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: { ID3D10Texture3D *texture; D3D10_TEXTURE3D_DESC texture_desc; - hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture); + hr = ID3D11Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture); if (FAILED(hr)) { ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D?\n"); @@ -826,7 +826,7 @@ static ULONG STDMETHODCALLTYPE d3d11_rendertarget_view_Release(ID3D11RenderTarge { wined3d_mutex_lock(); wined3d_rendertarget_view_decref(view->wined3d_view); - ID3D10Resource_Release(view->resource); + ID3D11Resource_Release(view->resource); ID3D10Device1_Release(view->device); wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); @@ -875,7 +875,12 @@ static HRESULT STDMETHODCALLTYPE d3d11_rendertarget_view_SetPrivateDataInterface static void STDMETHODCALLTYPE d3d11_rendertarget_view_GetResource(ID3D11RenderTargetView *iface, ID3D11Resource **resource) { - FIXME("iface %p, resource %p stub!\n", iface, resource); + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + + TRACE("iface %p, resource %p.\n", iface, resource); + + *resource = view->resource; + ID3D11Resource_AddRef(*resource); } static void STDMETHODCALLTYPE d3d11_rendertarget_view_GetDesc(ID3D11RenderTargetView *iface, @@ -991,8 +996,7 @@ static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetResource(ID3D10RenderTa TRACE("iface %p, resource %p\n", iface, resource); - *resource = view->resource; - ID3D10Resource_AddRef(*resource); + ID3D11Resource_QueryInterface(view->resource, &IID_ID3D10Resource, (void **)resource); } /* ID3D10RenderTargetView methods */ @@ -1088,7 +1092,7 @@ static void wined3d_rendertarget_view_desc_from_d3d10core(struct wined3d_rendert } HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, - ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc) + ID3D11Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc) { struct wined3d_rendertarget_view_desc wined3d_desc; struct wined3d_resource *wined3d_resource; @@ -1109,10 +1113,10 @@ HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3 } wined3d_mutex_lock(); - if (!(wined3d_resource = wined3d_resource_from_d3d10_resource(resource))) + if (!(wined3d_resource = wined3d_resource_from_d3d11_resource(resource))) { wined3d_mutex_unlock(); - ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource); + ERR("Failed to get wined3d resource for d3d11 resource %p.\n", resource); return E_FAIL; } @@ -1128,7 +1132,7 @@ HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3 wined3d_private_store_init(&view->private_store); wined3d_mutex_unlock(); view->resource = resource; - ID3D10Resource_AddRef(resource); + ID3D11Resource_AddRef(resource); view->device = &device->ID3D10Device1_iface; ID3D10Device1_AddRef(view->device); From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_rendertarget_view_GetDesc(). Message-ID: Module: wine Branch: master Commit: 818051c50f4eee1de3b1428acf1f946252d86922 URL: http://source.winehq.org/git/wine.git/?a=commit;h=818051c50f4eee1de3b1428acf1f946252d86922 Author: J?zef Kucia Date: Wed Sep 9 01:35:44 2015 +0200 d3d11: Implement d3d11_rendertarget_view_GetDesc(). --- dlls/d3d11/d3d11_private.h | 4 +-- dlls/d3d11/device.c | 3 +- dlls/d3d11/view.c | 90 ++++++++++++++++++++++++---------------------- 3 files changed, 51 insertions(+), 46 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=818051c50f4eee1de3b1428acf1f946252d86922 From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateRenderTargetView(). Message-ID: Module: wine Branch: master Commit: 9a0d564683855e1a01ffcb926c9cb1653a7ff669 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a0d564683855e1a01ffcb926c9cb1653a7ff669 Author: J?zef Kucia Date: Wed Sep 9 01:35:45 2015 +0200 d3d11: Implement d3d11_device_CreateRenderTargetView(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 31 +++++++++++++++---------------- dlls/d3d11/view.c | 24 +++++++++++++++++++++++- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index e950bcd..cddef4d 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -184,8 +184,8 @@ struct d3d_rendertarget_view ID3D10Device1 *device; }; -HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, - ID3D11Resource *resource, const D3D11_RENDER_TARGET_VIEW_DESC *desc) DECLSPEC_HIDDEN; +HRESULT d3d_rendertarget_view_create(struct d3d_device *device, ID3D11Resource *resource, + const D3D11_RENDER_TARGET_VIEW_DESC *desc, struct d3d_rendertarget_view **view) DECLSPEC_HIDDEN; struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) DECLSPEC_HIDDEN; /* ID3D10ShaderResourceView */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 5e1f9e0..e866f71 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -135,9 +135,19 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateUnorderedAccessView(ID3D11De static HRESULT STDMETHODCALLTYPE d3d11_device_CreateRenderTargetView(ID3D11Device *iface, ID3D11Resource *resource, const D3D11_RENDER_TARGET_VIEW_DESC *desc, ID3D11RenderTargetView **view) { - FIXME("iface %p, resource %p, desc %p, view %p stub!\n", iface, resource, desc, view); + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_rendertarget_view *object; + HRESULT hr; + + TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); + + if (FAILED(hr = d3d_rendertarget_view_create(device, resource, desc, &object))) + return hr; + + *view = &object->ID3D11RenderTargetView_iface; + + return S_OK; - return E_NOTIMPL; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDepthStencilView(ID3D11Device *iface, @@ -2128,28 +2138,17 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRenderTargetView(ID3D10Devic TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); - if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) - return E_OUTOFMEMORY; - if (FAILED(hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D11Resource, (void **)&d3d11_resource))) { ERR("Resource does not implement ID3D11Resource.\n"); - HeapFree(GetProcessHeap(), 0, object); return E_FAIL; } - if (FAILED(hr = d3d_rendertarget_view_init(object, device, d3d11_resource, - (const D3D11_RENDER_TARGET_VIEW_DESC *)desc))) - { - WARN("Failed to initialize rendertarget view, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); - ID3D11Resource_Release(d3d11_resource); - return hr; - } - + hr = d3d_rendertarget_view_create(device, d3d11_resource, (const D3D11_RENDER_TARGET_VIEW_DESC *)desc, &object); ID3D11Resource_Release(d3d11_resource); + if (FAILED(hr)) + return hr; - TRACE("Created rendertarget view %p.\n", object); *view = &object->ID3D10RenderTargetView_iface; return S_OK; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index c30e12d..195cd73 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -1095,7 +1095,7 @@ static void wined3d_rendertarget_view_desc_from_d3d11(struct wined3d_rendertarge } } -HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, +static HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3d_device *device, ID3D11Resource *resource, const D3D11_RENDER_TARGET_VIEW_DESC *desc) { struct wined3d_rendertarget_view_desc wined3d_desc; @@ -1143,6 +1143,28 @@ HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, struct d3 return S_OK; } +HRESULT d3d_rendertarget_view_create(struct d3d_device *device, ID3D11Resource *resource, + const D3D11_RENDER_TARGET_VIEW_DESC *desc, struct d3d_rendertarget_view **view) +{ + struct d3d_rendertarget_view *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_rendertarget_view_init(object, device, resource, desc))) + { + WARN("Failed to initialize rendertarget view, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created rendertarget view %p.\n", object); + *view = object; + + return S_OK; +} + struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) { if (!iface) From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_rendertarget_view_GetDevice(). Message-ID: Module: wine Branch: master Commit: 2b211cab69cd43a4aad7c6c6a6a9f342ce3a2161 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2b211cab69cd43a4aad7c6c6a6a9f342ce3a2161 Author: J?zef Kucia Date: Wed Sep 9 01:35:46 2015 +0200 d3d11: Implement d3d11_rendertarget_view_GetDevice(). --- dlls/d3d11/d3d11_private.h | 2 +- dlls/d3d11/view.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index cddef4d..8abd975 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -181,7 +181,7 @@ struct d3d_rendertarget_view struct wined3d_rendertarget_view *wined3d_view; D3D11_RENDER_TARGET_VIEW_DESC desc; ID3D11Resource *resource; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_rendertarget_view_create(struct d3d_device *device, ID3D11Resource *resource, diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 195cd73..3010bac 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -827,7 +827,7 @@ static ULONG STDMETHODCALLTYPE d3d11_rendertarget_view_Release(ID3D11RenderTarge wined3d_mutex_lock(); wined3d_rendertarget_view_decref(view->wined3d_view); ID3D11Resource_Release(view->resource); - ID3D10Device1_Release(view->device); + ID3D11Device_Release(view->device); wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); HeapFree(GetProcessHeap(), 0, view); @@ -839,7 +839,12 @@ static ULONG STDMETHODCALLTYPE d3d11_rendertarget_view_Release(ID3D11RenderTarge static void STDMETHODCALLTYPE d3d11_rendertarget_view_GetDevice(ID3D11RenderTargetView *iface, ID3D11Device **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3d_rendertarget_view *view = impl_from_ID3D11RenderTargetView(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = view->device; + ID3D11Device_AddRef(*device); } static HRESULT STDMETHODCALLTYPE d3d11_rendertarget_view_GetPrivateData(ID3D11RenderTargetView *iface, @@ -955,8 +960,7 @@ static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDevice(ID3D10RenderTarg TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)view->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(view->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_GetPrivateData(ID3D10RenderTargetView *iface, @@ -1137,8 +1141,8 @@ static HRESULT d3d_rendertarget_view_init(struct d3d_rendertarget_view *view, st wined3d_mutex_unlock(); view->resource = resource; ID3D11Resource_AddRef(resource); - view->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(view->device); + view->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(view->device); return S_OK; } From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Port test_create_rendertarget_view() from d3d10core. Message-ID: Module: wine Branch: master Commit: 5b4d759e5578079a807c90886bc974d3959f33bf URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b4d759e5578079a807c90886bc974d3959f33bf Author: J?zef Kucia Date: Wed Sep 9 01:35:47 2015 +0200 d3d11/tests: Port test_create_rendertarget_view() from d3d10core. --- dlls/d3d11/tests/d3d11.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 960bd75..15b9b19 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -883,6 +883,112 @@ done: ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_create_rendertarget_view(void) +{ + D3D11_RENDER_TARGET_VIEW_DESC rtv_desc; + D3D11_SUBRESOURCE_DATA data = {0}; + D3D11_TEXTURE2D_DESC texture_desc; + ULONG refcount, expected_refcount; + D3D11_BUFFER_DESC buffer_desc; + ID3D11RenderTargetView *rtview; + ID3D11Device *device, *tmp; + ID3D11Texture2D *texture; + ID3D11Buffer *buffer; + IUnknown *iface; + HRESULT hr; + + if (!(device = create_device(NULL))) + { + skip("Failed to create device.\n"); + return; + } + + buffer_desc.ByteWidth = 1024; + buffer_desc.Usage = D3D11_USAGE_DEFAULT; + buffer_desc.BindFlags = D3D11_BIND_RENDER_TARGET; + buffer_desc.CPUAccessFlags = 0; + buffer_desc.MiscFlags = 0; + buffer_desc.StructureByteStride = 0; + + hr = ID3D11Device_CreateBuffer(device, &buffer_desc, &data, &buffer); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + + expected_refcount = get_refcount((IUnknown *)device) + 1; + hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer); + ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)device); + ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n", refcount, expected_refcount); + tmp = NULL; + expected_refcount = refcount + 1; + ID3D11Buffer_GetDevice(buffer, &tmp); + ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device); + refcount = get_refcount((IUnknown *)device); + ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); + ID3D11Device_Release(tmp); + + rtv_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_BUFFER; + U(rtv_desc).Buffer.ElementOffset = 0; + U(rtv_desc).Buffer.ElementWidth = 64; + + expected_refcount = get_refcount((IUnknown *)device) + 1; + hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)buffer, &rtv_desc, &rtview); + ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)device); + ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n", refcount, expected_refcount); + tmp = NULL; + expected_refcount = refcount + 1; + ID3D11RenderTargetView_GetDevice(rtview, &tmp); + ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device); + refcount = get_refcount((IUnknown *)device); + ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); + ID3D11Device_Release(tmp); + + hr = ID3D11RenderTargetView_QueryInterface(rtview, &IID_ID3D10RenderTargetView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Render target view should implement ID3D10RenderTargetView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + + ID3D11RenderTargetView_Release(rtview); + ID3D11Buffer_Release(buffer); + + texture_desc.Width = 512; + texture_desc.Height = 512; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Quality = 0; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + + hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x.\n", hr); + + /* For texture resources it's allowed to specify NULL as desc */ + hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)texture, NULL, &rtview); + ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x.\n", hr); + + ID3D11RenderTargetView_GetDesc(rtview, &rtv_desc); + ok(rtv_desc.Format == texture_desc.Format, "Got unexpected format %#x.\n", rtv_desc.Format); + ok(rtv_desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2D, "Got unexpected view dimension %#x.\n", + rtv_desc.ViewDimension); + ok(U(rtv_desc).Texture2D.MipSlice == 0, "Got unexpected mip slice %#x.\n", U(rtv_desc).Texture2D.MipSlice); + + hr = ID3D11RenderTargetView_QueryInterface(rtview, &IID_ID3D10RenderTargetView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Render target view should implement ID3D10RenderTargetView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + + ID3D11RenderTargetView_Release(rtview); + ID3D11Texture2D_Release(texture); + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(d3d11) { test_create_device(); @@ -893,4 +999,5 @@ START_TEST(d3d11) test_texture3d_interfaces(); test_buffer_interfaces(); test_depthstencil_view_interfaces(); + test_create_rendertarget_view(); } From julliard at wine.codeweavers.com Wed Sep 9 09:57:37 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 09 Sep 2015 09:57:37 -0500 Subject: Hugh McMaster : regsvr32: Return the most recent error code, even if later DLLs succeed. Message-ID: Module: wine Branch: master Commit: e19a8fd706768aa2bcbeeec2f22ca991c4821ad3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e19a8fd706768aa2bcbeeec2f22ca991c4821ad3 Author: Hugh McMaster Date: Wed Sep 9 20:43:52 2015 +1000 regsvr32: Return the most recent error code, even if later DLLs succeed. --- programs/regsvr32/regsvr32.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index a1b55a3..03d45fa 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -19,9 +19,6 @@ * 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 - * - * This version deliberately differs in error handling compared to the - * Windows version. */ #define WIN32_LEAN_AND_MEAN @@ -221,7 +218,7 @@ static WCHAR *parse_command_line(WCHAR *command_line) int wmain(int argc, WCHAR* argv[]) { - int i; + int i, res, ret = 0; BOOL CallRegister = TRUE; BOOL CallInstall = FALSE; BOOL Unregister = FALSE; @@ -286,7 +283,7 @@ int wmain(int argc, WCHAR* argv[]) if (argv[i]) { WCHAR *DllName = argv[i]; - int res = 0; + res = 0; DllFound = TRUE; if (CallInstall && Unregister) @@ -294,7 +291,10 @@ int wmain(int argc, WCHAR* argv[]) /* The Windows version stops processing the current file on the first error. */ if (res) + { + ret = res; continue; + } if (!CallInstall || (CallInstall && CallRegister)) { @@ -305,13 +305,19 @@ int wmain(int argc, WCHAR* argv[]) } if (res) + { + ret = res; continue; + } if (CallInstall && !Unregister) res = InstallDll(!Unregister, DllName, wsCommandLine); if (res) + { + ret = res; continue; + } } } @@ -324,5 +330,6 @@ int wmain(int argc, WCHAR* argv[]) OleUninitialize(); - return 0; + /* return the most recent error code, even if later DLLs succeed */ + return ret; } From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Bruno Jesus : msvfw32: Trace only what matters in MCIWNDM_GETDEVICE. Message-ID: Module: wine Branch: master Commit: 19d73d284745b3f24844ed5967f18ee2a9993f2f URL: http://source.winehq.org/git/wine.git/?a=commit;h=19d73d284745b3f24844ed5967f18ee2a9993f2f Author: Bruno Jesus <00cpxxx at gmail.com> Date: Thu Sep 10 00:48:05 2015 +0800 msvfw32: Trace only what matters in MCIWNDM_GETDEVICE. --- dlls/msvfw32/mciwnd.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dlls/msvfw32/mciwnd.c b/dlls/msvfw32/mciwnd.c index e561b14..fc49973 100644 --- a/dlls/msvfw32/mciwnd.c +++ b/dlls/msvfw32/mciwnd.c @@ -1070,27 +1070,33 @@ end_of_mci_open: case MCIWNDM_GETDEVICEA: { + int len = 0; + char *str = (char *)lParam; MCI_SYSINFO_PARMSA mci_sysinfo; - mci_sysinfo.lpstrReturn = (LPSTR)lParam; + mci_sysinfo.lpstrReturn = str; mci_sysinfo.dwRetSize = wParam; mwi->lasterror = mciSendCommandA(mwi->mci, MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME, (DWORD_PTR)&mci_sysinfo); - TRACE("MCIWNDM_GETDEVICEA: %s\n", debugstr_an((LPSTR)lParam, wParam)); + while(len < wParam && str[len]) len++; + TRACE("MCIWNDM_GETDEVICEA: %s\n", debugstr_an(str, len)); return 0; } case MCIWNDM_GETDEVICEW: { + int len = 0; + WCHAR *str = (WCHAR *)lParam; MCI_SYSINFO_PARMSW mci_sysinfo; - mci_sysinfo.lpstrReturn = (LPWSTR)lParam; + mci_sysinfo.lpstrReturn = str; mci_sysinfo.dwRetSize = wParam; mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME, (DWORD_PTR)&mci_sysinfo); - TRACE("MCIWNDM_GETDEVICEW: %s\n", debugstr_wn((LPWSTR)lParam, wParam)); + while(len < wParam && str[len]) len++; + TRACE("MCIWNDM_GETDEVICEW: %s\n", debugstr_wn(str, len)); return 0; } From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Marcus Meissner : ws2_32/tests: Fixed argument to GetComputerNameExW. Message-ID: Module: wine Branch: master Commit: 5af9acadb6b5b162b137476482308e4e548b32db URL: http://source.winehq.org/git/wine.git/?a=commit;h=5af9acadb6b5b162b137476482308e4e548b32db Author: Marcus Meissner Date: Wed Sep 9 21:47:14 2015 +0200 ws2_32/tests: Fixed argument to GetComputerNameExW. --- dlls/ws2_32/tests/sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index fa1236e..2bcc92e 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -6313,7 +6313,7 @@ static void test_GetAddrInfoW(void) int i, ret; ADDRINFOW *result, *result2, *p, hint; WCHAR name[256]; - DWORD size = sizeof(name); + DWORD size = sizeof(name)/sizeof(WCHAR); if (!pGetAddrInfoW || !pFreeAddrInfoW) { From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Dmitry Timoshkov : widl: Add special handling for pointers to arrays in the typelib generator. Message-ID: Module: wine Branch: master Commit: 7d1e3691abdec3a31a9b0cdd83f3f13a61ff063f URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d1e3691abdec3a31a9b0cdd83f3f13a61ff063f Author: Dmitry Timoshkov Date: Thu Sep 10 15:16:25 2015 +0800 widl: Add special handling for pointers to arrays in the typelib generator. --- tools/widl/write_msft.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index 88f1546..26600e4 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -1128,9 +1128,12 @@ static int encode_var( if (typeoffset == typelib->typelib_segdir[MSFT_SEG_TYPEDESC].length) { int mix_field; - + if (target_type & 0x80000000) { mix_field = ((target_type >> 16) & 0x3fff) | VT_BYREF; + } else if (is_array(ref)) { + type_t *element_type = type_alias_get_aliasee(type_array_get_element(ref)); + mix_field = get_type_vt(element_type) | VT_ARRAY | VT_BYREF; } else { typedata = (void *)&typelib->typelib_segment_data[MSFT_SEG_TYPEDESC][target_type]; mix_field = ((typedata[0] >> 16) == 0x7fff)? 0x7fff: 0x7ffe; From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Dmitry Timoshkov : oleaut32/tests: Add another test for calling a varargs method. Message-ID: Module: wine Branch: master Commit: 232f54aea2ff873305b437197f947da336b40038 URL: http://source.winehq.org/git/wine.git/?a=commit;h=232f54aea2ff873305b437197f947da336b40038 Author: Dmitry Timoshkov Date: Thu Sep 10 15:16:32 2015 +0800 oleaut32/tests: Add another test for calling a varargs method. This time with passing SAFEARRAY as a reference. --- dlls/oleaut32/tests/tmarshal.c | 55 +++++++++++++++++++++++++++++++++- dlls/oleaut32/tests/tmarshal.idl | 3 ++ dlls/oleaut32/tests/tmarshal_dispids.h | 1 + 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index f18aecc..6b89774 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -874,6 +874,41 @@ static HRESULT WINAPI Widget_VarArg_Run( return S_OK; } +static HRESULT WINAPI Widget_VarArg_Ref_Run( + IWidget *iface, BSTR name, SAFEARRAY **params, VARIANT *result) +{ + static const WCHAR catW[] = { 'C','a','t',0 }; + static const WCHAR supermanW[] = { 'S','u','p','e','r','m','a','n',0 }; + LONG bound; + VARIANT *var; + BSTR bstr; + HRESULT hr; + + trace("VarArg_Ref_Run(%p,%p,%p)\n", name, params, result); + + ok(!lstrcmpW(name, catW), "got %s\n", wine_dbgstr_w(name)); + + hr = SafeArrayGetLBound(*params, 1, &bound); + ok(hr == S_OK, "SafeArrayGetLBound error %#x\n", hr); + ok(bound == 0, "expected 0, got %d\n", bound); + + hr = SafeArrayGetUBound(*params, 1, &bound); + ok(hr == S_OK, "SafeArrayGetUBound error %#x\n", hr); + ok(bound == 0, "expected 0, got %d\n", bound); + + hr = SafeArrayAccessData(*params, (void **)&var); + ok(hr == S_OK, "SafeArrayAccessData error %#x\n", hr); + + ok(V_VT(&var[0]) == VT_BSTR, "expected VT_BSTR, got %d\n", V_VT(&var[0])); + bstr = V_BSTR(&var[0]); + ok(!lstrcmpW(bstr, supermanW), "got %s\n", wine_dbgstr_w(bstr)); + + hr = SafeArrayUnaccessData(*params); + ok(hr == S_OK, "SafeArrayUnaccessData error %#x\n", hr); + + return S_OK; +} + static const struct IWidgetVtbl Widget_VTable = { Widget_QueryInterface, @@ -912,7 +947,8 @@ static const struct IWidgetVtbl Widget_VTable = Widget_put_prop_req_arg, Widget_pos_restrict, Widget_neg_restrict, - Widget_VarArg_Run + Widget_VarArg_Run, + Widget_VarArg_Ref_Run }; static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject) @@ -1554,6 +1590,23 @@ static void test_typelibmarshal(void) SysFreeString(V_BSTR(&vararg[1])); SysFreeString(V_BSTR(&vararg[0])); + /* call VarArg_Ref_Run */ + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(szCat); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_BSTR; + V_BSTR(&vararg[0]) = SysAllocString(szSuperman); + dispparams.cNamedArgs = 0; + dispparams.cArgs = 2; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = vararg; + hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_REF_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); +todo_wine + ok_ole_success(hr, IDispatch_Invoke); + SysFreeString(V_BSTR(&vararg[1])); + SysFreeString(V_BSTR(&vararg[0])); + /* call Error */ dispparams.cNamedArgs = 0; dispparams.cArgs = 0; diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index ff9cac3..680f4b4 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -182,6 +182,9 @@ library TestTypelib [id(DISPID_TM_VARARG_RUN), vararg] HRESULT VarArg_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) params, [out, retval] VARIANT *result); + + [id(DISPID_TM_VARARG_REF_RUN), vararg] + HRESULT VarArg_Ref_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) *params, [out, retval] VARIANT *result); } [ diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h index d603a56..dfca216 100644 --- a/dlls/oleaut32/tests/tmarshal_dispids.h +++ b/dlls/oleaut32/tests/tmarshal_dispids.h @@ -45,6 +45,7 @@ #define DISPID_TM_NEG_RESTRICTED -26 #define DISPID_TM_TESTSECONDIFACE 27 #define DISPID_TM_VARARG_RUN 28 +#define DISPID_TM_VARARG_REF_RUN 29 #define DISPID_NOA_BSTRRET 1 #define DISPID_NOA_ERROR 2 From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Dmitry Timoshkov : oleaut32: Add support for handling VT_VARIANT|VT_ARRAY|VT_BYREF argument type. Message-ID: Module: wine Branch: master Commit: 97ce5f4874ecd9b16a2dd8d0d64205aab6cba67a URL: http://source.winehq.org/git/wine.git/?a=commit;h=97ce5f4874ecd9b16a2dd8d0d64205aab6cba67a Author: Dmitry Timoshkov Date: Thu Sep 10 15:17:04 2015 +0800 oleaut32: Add support for handling VT_VARIANT|VT_ARRAY|VT_BYREF argument type. --- dlls/oleaut32/tests/tmarshal.c | 1 - dlls/oleaut32/typelib.c | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index 6b89774..d200785 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -1602,7 +1602,6 @@ static void test_typelibmarshal(void) dispparams.rgdispidNamedArgs = NULL; dispparams.rgvarg = vararg; hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_REF_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); -todo_wine ok_ole_success(hr, IDispatch_Invoke); SysFreeString(V_BSTR(&vararg[1])); SysFreeString(V_BSTR(&vararg[0])); diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index f4bba71..650fa21 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -7078,7 +7078,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( } V_VT(&rgvarg[i]) = rgvt[i]; } - else if (rgvt[i] == (VT_VARIANT | VT_ARRAY) && func_desc->cParamsOpt < 0) + else if ((rgvt[i] == (VT_VARIANT | VT_ARRAY) || rgvt[i] == (VT_VARIANT | VT_ARRAY | VT_BYREF)) && func_desc->cParamsOpt < 0) { SAFEARRAY *a; SAFEARRAYBOUND bound; @@ -7107,7 +7107,10 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( SafeArrayDestroy(a); break; } - V_ARRAY(&rgvarg[i]) = a; + if (rgvt[i] & VT_BYREF) + V_BYREF(&rgvarg[i]) = &a; + else + V_ARRAY(&rgvarg[i]) = a; V_VT(&rgvarg[i]) = rgvt[i]; } else if ((rgvt[i] & VT_BYREF) && !V_ISBYREF(src_arg)) From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Dmitry Timoshkov : oleaut32/tests: Add a test to show that support for coercion to arrays of variants is specific to vararg methods. Message-ID: Module: wine Branch: master Commit: 462ef66105ef1b2d6a0e54cb96a85921fb84fb43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=462ef66105ef1b2d6a0e54cb96a85921fb84fb43 Author: Dmitry Timoshkov Date: Thu Sep 10 15:17:10 2015 +0800 oleaut32/tests: Add a test to show that support for coercion to arrays of variants is specific to vararg methods. --- dlls/oleaut32/tests/tmarshal.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index d200785..488c0d7 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -1534,6 +1534,30 @@ static void test_typelibmarshal(void) ok_ole_success(hr, IDispatch_Invoke); VariantClear(&varresult); + /* call Array with BSTR argument - type mismatch */ + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_BSTR; + V_BSTR(&vararg[0]) = SysAllocString(szSuperman); + dispparams.cNamedArgs = 0; + dispparams.cArgs = 1; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = vararg; + hr = IDispatch_Invoke(pDispatch, DISPID_TM_ARRAY, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); + ok(hr == DISP_E_TYPEMISMATCH || hr == DISP_E_BADVARTYPE, "expected DISP_E_TYPEMISMATCH, got %#x\n", hr); + SysFreeString(V_BSTR(&vararg[0])); + + /* call ArrayPtr with BSTR argument - type mismatch */ + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_BSTR; + V_BSTR(&vararg[0]) = SysAllocString(szSuperman); + dispparams.cNamedArgs = 0; + dispparams.cArgs = 1; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = vararg; + hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARRAYPTR, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); + ok(hr == DISP_E_TYPEMISMATCH || hr == DISP_E_BADVARTYPE, "expected DISP_E_TYPEMISMATCH, got %#x\n", hr); + SysFreeString(V_BSTR(&vararg[0])); + /* call VariantCArray - test marshaling of variant arrays */ V_VT(&vararg[0]) = VT_I4; V_I4(&vararg[0]) = 1; From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: =?UTF-8?Q?Aurimas=20Fi=C5=A1eras=20?=: po: Update Lithuanian translation. Message-ID: Module: wine Branch: master Commit: 099bd271b149539674e5c52b01214a2a9f4731e7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=099bd271b149539674e5c52b01214a2a9f4731e7 Author: Aurimas Fi?eras Date: Wed Sep 9 22:12:22 2015 +0300 po: Update Lithuanian translation. --- po/lt.po | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/po/lt.po b/po/lt.po index c268efd..df2404f 100644 --- a/po/lt.po +++ b/po/lt.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: Wine\n" "Report-Msgid-Bugs-To: http://bugs.winehq.org\n" "POT-Creation-Date: N/A\n" -"PO-Revision-Date: 2015-08-21 22:21+0300\n" +"PO-Revision-Date: 2015-09-09 22:11+0300\n" "Last-Translator: Aurimas Fi?eras \n" "Language-Team: Lithuanian \n" "Language: lt\n" @@ -7456,16 +7456,12 @@ msgid "&Convert..." msgstr "&Konvertuoti..." #: oledlg.rc:36 -#, fuzzy -#| msgid "&Object" msgid "%1 %2 &Object" -msgstr "&Objektas" +msgstr "%1 %2 &objekt?" #: oledlg.rc:34 -#, fuzzy -#| msgid "&Object" msgid "%s &Object" -msgstr "&Objektas" +msgstr "%s &objektas" #: oledlg.rc:33 oleview.rc:40 msgid "&Object" From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Nikolay Sivov : dwrite/tests: Some tests for TranslateColorGlyphRun(). Message-ID: Module: wine Branch: master Commit: 37d10af966221ff932d73a418163bd1fba29ff7b URL: http://source.winehq.org/git/wine.git/?a=commit;h=37d10af966221ff932d73a418163bd1fba29ff7b Author: Nikolay Sivov Date: Wed Sep 9 17:48:12 2015 +0300 dwrite/tests: Some tests for TranslateColorGlyphRun(). --- dlls/dwrite/tests/font.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++- include/winerror.h | 1 + 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index dfe782d..468a5c0 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -98,6 +98,7 @@ static const WCHAR arialW[] = {'A','r','i','a','l',0}; static const WCHAR tahomaUppercaseW[] = {'T','A','H','O','M','A',0}; static const WCHAR tahomaStrangecaseW[] = {'t','A','h','O','m','A',0}; static const WCHAR blahW[] = {'B','l','a','h','!',0}; +static const WCHAR emojiW[] = {'S','e','g','o','e',' ','U','I',' ','E','m','o','j','i',0}; static IDWriteFactory *create_factory(void) { @@ -4793,7 +4794,6 @@ struct CPAL_Header_0 static void test_GetPaletteEntries(void) { - static const WCHAR emojiW[] = {'S','e','g','o','e',' ','U','I',' ','E','m','o','j','i',0}; IDWriteFontFace2 *fontface2; IDWriteFontFace *fontface; IDWriteFactory *factory; @@ -4880,6 +4880,127 @@ static void test_GetPaletteEntries(void) IDWriteFactory_Release(factory); } +static void test_TranslateColorGlyphRun(void) +{ + IDWriteColorGlyphRunEnumerator *layers; + const DWRITE_COLOR_GLYPH_RUN *colorrun; + IDWriteFontFace *fontface; + IDWriteFactory2 *factory2; + IDWriteFactory *factory; + DWRITE_GLYPH_RUN run; + UINT32 codepoints[2]; + IDWriteFont *font; + UINT16 glyphs[2]; + BOOL hasrun; + HRESULT hr; + + factory = create_factory(); + + hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory2, (void**)&factory2); + IDWriteFactory_Release(factory); + if (hr != S_OK) { + win_skip("TranslateColorGlyphRun() is not supported.\n"); + return; + } + + /* Tahoma, no color support */ + fontface = create_fontface((IDWriteFactory*)factory2); + + codepoints[0] = 'A'; + hr = IDWriteFontFace_GetGlyphIndices(fontface, codepoints, 1, glyphs); + ok(hr == S_OK, "got 0x%08x\n", hr); + + run.fontFace = fontface; + run.fontEmSize = 20.0f; + run.glyphCount = 1; + run.glyphIndices = glyphs; + run.glyphAdvances = NULL; + run.glyphOffsets = NULL; + run.isSideways = FALSE; + run.bidiLevel = 0; + + layers = (void*)0xdeadbeef; + hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL, + DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers); +todo_wine { + ok(hr == DWRITE_E_NOCOLOR, "got 0x%08x\n", hr); + ok(layers == NULL, "got %p\n", layers); +} + IDWriteFontFace_Release(fontface); + + /* Segoe UI Emoji, with color support */ + font = get_font((IDWriteFactory*)factory2, emojiW, DWRITE_FONT_STYLE_NORMAL); + if (!font) { + IDWriteFactory2_Release(factory2); + skip("Segoe UI Emoji font not found.\n"); + return; + } + + hr = IDWriteFont_CreateFontFace(font, &fontface); + ok(hr == S_OK, "got 0x%08x\n", hr); + IDWriteFont_Release(font); + + codepoints[0] = 0x26c4; + hr = IDWriteFontFace_GetGlyphIndices(fontface, codepoints, 1, glyphs); + ok(hr == S_OK, "got 0x%08x\n", hr); + + run.fontFace = fontface; + + layers = NULL; + hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL, + DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(layers != NULL, "got %p\n", layers); + + while (1) { + hasrun = FALSE; + hr = IDWriteColorGlyphRunEnumerator_MoveNext(layers, &hasrun); + todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + + if (!hasrun) + break; + } + + /* iterated all way through */ + hr = IDWriteColorGlyphRunEnumerator_GetCurrentRun(layers, &colorrun); +todo_wine + ok(hr == E_NOT_VALID_STATE, "got 0x%08x\n", hr); + + IDWriteColorGlyphRunEnumerator_Release(layers); + + /* color font, glyph without color info */ + codepoints[0] = 'A'; + hr = IDWriteFontFace_GetGlyphIndices(fontface, codepoints, 1, glyphs); + ok(hr == S_OK, "got 0x%08x\n", hr); + + layers = (void*)0xdeadbeef; + hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL, + DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers); +todo_wine { + ok(hr == DWRITE_E_NOCOLOR, "got 0x%08x\n", hr); + ok(layers == NULL, "got %p\n", layers); +} + /* one glyph with, one without */ + codepoints[0] = 'A'; + codepoints[1] = 0x26c4; + + hr = IDWriteFontFace_GetGlyphIndices(fontface, codepoints, 2, glyphs); + ok(hr == S_OK, "got 0x%08x\n", hr); + + run.glyphCount = 2; + + layers = NULL; + hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL, + DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(layers != NULL, "got %p\n", layers); + IDWriteColorGlyphRunEnumerator_Release(layers); + + IDWriteFontFace_Release(fontface); + IDWriteFactory2_Release(factory2); +} + START_TEST(font) { IDWriteFactory *factory; @@ -4931,6 +5052,7 @@ START_TEST(font) test_CreateAlphaTexture(); test_IsSymbolFont(); test_GetPaletteEntries(); + test_TranslateColorGlyphRun(); IDWriteFactory_Release(factory); } diff --git a/include/winerror.h b/include/winerror.h index 1c9df07..87419d1 100644 --- a/include/winerror.h +++ b/include/winerror.h @@ -2077,6 +2077,7 @@ static inline HRESULT HRESULT_FROM_WIN32(unsigned int x) #undef NOERROR /* arpa/nameser_compat.h defines this */ #define E_NOT_SUFFICIENT_BUFFER HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +#define E_NOT_VALID_STATE HRESULT_FROM_WIN32(ERROR_INVALID_STATE) #ifdef RC_INVOKED #define _HRESULT_TYPEDEF_(x) (x) From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Alexandre Julliard : gdi32: Add an intermediate pointer to avoid a compiler warning. Message-ID: Module: wine Branch: master Commit: 58fe3afff527fd09cd729beea22e6ebfce82379a URL: http://source.winehq.org/git/wine.git/?a=commit;h=58fe3afff527fd09cd729beea22e6ebfce82379a Author: Alexandre Julliard Date: Thu Sep 10 19:47:24 2015 +0900 gdi32: Add an intermediate pointer to avoid a compiler warning. --- dlls/gdi32/bitblt.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c index 762ca0f..08ebfd9 100644 --- a/dlls/gdi32/bitblt.c +++ b/dlls/gdi32/bitblt.c @@ -224,20 +224,21 @@ static DWORD blend_bits( const BITMAPINFO *src_info, const struct gdi_image_bits /* helper to retrieve either both colors or only the background color for monochrome blits */ static void get_mono_dc_colors( HDC hdc, BITMAPINFO *info, int count ) { + RGBQUAD *colors = info->bmiColors; COLORREF color = GetBkColor( hdc ); - info->bmiColors[count - 1].rgbRed = GetRValue( color ); - info->bmiColors[count - 1].rgbGreen = GetGValue( color ); - info->bmiColors[count - 1].rgbBlue = GetBValue( color ); - info->bmiColors[count - 1].rgbReserved = 0; + colors[count - 1].rgbRed = GetRValue( color ); + colors[count - 1].rgbGreen = GetGValue( color ); + colors[count - 1].rgbBlue = GetBValue( color ); + colors[count - 1].rgbReserved = 0; if (count > 1) { color = GetTextColor( hdc ); - info->bmiColors[0].rgbRed = GetRValue( color ); - info->bmiColors[0].rgbGreen = GetGValue( color ); - info->bmiColors[0].rgbBlue = GetBValue( color ); - info->bmiColors[0].rgbReserved = 0; + colors[0].rgbRed = GetRValue( color ); + colors[0].rgbGreen = GetGValue( color ); + colors[0].rgbBlue = GetBValue( color ); + colors[0].rgbReserved = 0; } info->bmiHeader.biClrUsed = count; } From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Riccardo Bortolato : wined3d: Remove wined3d_volume_preload. Message-ID: Module: wine Branch: master Commit: 02ce14b3ef1c8087cf7d7443f674469a192bce03 URL: http://source.winehq.org/git/wine.git/?a=commit;h=02ce14b3ef1c8087cf7d7443f674469a192bce03 Author: Riccardo Bortolato Date: Wed Sep 9 19:02:19 2015 +0200 wined3d: Remove wined3d_volume_preload. --- dlls/wined3d/volume.c | 5 ----- dlls/wined3d/wined3d.spec | 1 - include/wine/wined3d.h | 1 - 3 files changed, 7 deletions(-) diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index 424938a..1bce5c0 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -481,11 +481,6 @@ void * CDECL wined3d_volume_get_parent(const struct wined3d_volume *volume) return volume->resource.parent; } -void CDECL wined3d_volume_preload(struct wined3d_volume *volume) -{ - FIXME("volume %p stub!\n", volume); -} - struct wined3d_resource * CDECL wined3d_volume_get_resource(struct wined3d_volume *volume) { TRACE("volume %p.\n", volume); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 9f714ef..ec3cc45 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -289,5 +289,4 @@ @ cdecl wined3d_volume_get_resource(ptr) @ cdecl wined3d_volume_incref(ptr) @ cdecl wined3d_volume_map(ptr ptr ptr long) -@ cdecl wined3d_volume_preload(ptr) @ cdecl wined3d_volume_unmap(ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 7d4e5a0..8f686fb 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2573,7 +2573,6 @@ struct wined3d_resource * __cdecl wined3d_volume_get_resource(struct wined3d_vol ULONG __cdecl wined3d_volume_incref(struct wined3d_volume *volume); HRESULT __cdecl wined3d_volume_map(struct wined3d_volume *volume, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags); -void __cdecl wined3d_volume_preload(struct wined3d_volume *volume); HRESULT __cdecl wined3d_volume_unmap(struct wined3d_volume *volume); /* Return the integer base-2 logarithm of x. Undefined for x == 0. */ From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Riccardo Bortolato : wined3d: Remove wined3d_volume_get_parent. Message-ID: Module: wine Branch: master Commit: 5cba355a8392c41b9b7b418eb910fb5c454b5528 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5cba355a8392c41b9b7b418eb910fb5c454b5528 Author: Riccardo Bortolato Date: Wed Sep 9 19:02:20 2015 +0200 wined3d: Remove wined3d_volume_get_parent. --- dlls/wined3d/volume.c | 7 ------- dlls/wined3d/wined3d.spec | 1 - include/wine/wined3d.h | 1 - 3 files changed, 9 deletions(-) diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index 1bce5c0..6d62c5e 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -474,13 +474,6 @@ ULONG CDECL wined3d_volume_decref(struct wined3d_volume *volume) return wined3d_texture_decref(volume->container); } -void * CDECL wined3d_volume_get_parent(const struct wined3d_volume *volume) -{ - TRACE("volume %p.\n", volume); - - return volume->resource.parent; -} - struct wined3d_resource * CDECL wined3d_volume_get_resource(struct wined3d_volume *volume) { TRACE("volume %p.\n", volume); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index ec3cc45..f2447da 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -285,7 +285,6 @@ @ cdecl wined3d_volume_decref(ptr) @ cdecl wined3d_volume_from_resource(ptr) -@ cdecl wined3d_volume_get_parent(ptr) @ cdecl wined3d_volume_get_resource(ptr) @ cdecl wined3d_volume_incref(ptr) @ cdecl wined3d_volume_map(ptr ptr ptr long) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 8f686fb..e2b9e1f 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2568,7 +2568,6 @@ ULONG __cdecl wined3d_vertex_declaration_incref(struct wined3d_vertex_declaratio ULONG __cdecl wined3d_volume_decref(struct wined3d_volume *volume); struct wined3d_volume * __cdecl wined3d_volume_from_resource(struct wined3d_resource *resource); -void * __cdecl wined3d_volume_get_parent(const struct wined3d_volume *volume); struct wined3d_resource * __cdecl wined3d_volume_get_resource(struct wined3d_volume *volume); ULONG __cdecl wined3d_volume_incref(struct wined3d_volume *volume); HRESULT __cdecl wined3d_volume_map(struct wined3d_volume *volume, From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Riccardo Bortolato : wined3d: Remove volume reference counting from public interface. Message-ID: Module: wine Branch: master Commit: 9eb47678de27d2c6bdbedde3515f89c228ba86ef URL: http://source.winehq.org/git/wine.git/?a=commit;h=9eb47678de27d2c6bdbedde3515f89c228ba86ef Author: Riccardo Bortolato Date: Wed Sep 9 19:02:21 2015 +0200 wined3d: Remove volume reference counting from public interface. --- dlls/wined3d/volume.c | 4 ++-- dlls/wined3d/wined3d.spec | 2 -- include/wine/wined3d.h | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index 6d62c5e..2daa55e 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -460,14 +460,14 @@ static void volume_unload(struct wined3d_resource *resource) resource_unload(resource); } -ULONG CDECL wined3d_volume_incref(struct wined3d_volume *volume) +static ULONG CDECL wined3d_volume_incref(struct wined3d_volume *volume) { TRACE("Forwarding to container %p.\n", volume->container); return wined3d_texture_incref(volume->container); } -ULONG CDECL wined3d_volume_decref(struct wined3d_volume *volume) +static ULONG CDECL wined3d_volume_decref(struct wined3d_volume *volume) { TRACE("Forwarding to container %p.\n", volume->container); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index f2447da..6f770a9 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -283,9 +283,7 @@ @ cdecl wined3d_vertex_declaration_get_parent(ptr) @ cdecl wined3d_vertex_declaration_incref(ptr) -@ cdecl wined3d_volume_decref(ptr) @ cdecl wined3d_volume_from_resource(ptr) @ cdecl wined3d_volume_get_resource(ptr) -@ cdecl wined3d_volume_incref(ptr) @ cdecl wined3d_volume_map(ptr ptr ptr long) @ cdecl wined3d_volume_unmap(ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index e2b9e1f..d3dde35 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2566,10 +2566,8 @@ ULONG __cdecl wined3d_vertex_declaration_decref(struct wined3d_vertex_declaratio void * __cdecl wined3d_vertex_declaration_get_parent(const struct wined3d_vertex_declaration *declaration); ULONG __cdecl wined3d_vertex_declaration_incref(struct wined3d_vertex_declaration *declaration); -ULONG __cdecl wined3d_volume_decref(struct wined3d_volume *volume); struct wined3d_volume * __cdecl wined3d_volume_from_resource(struct wined3d_resource *resource); struct wined3d_resource * __cdecl wined3d_volume_get_resource(struct wined3d_volume *volume); -ULONG __cdecl wined3d_volume_incref(struct wined3d_volume *volume); HRESULT __cdecl wined3d_volume_map(struct wined3d_volume *volume, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags); HRESULT __cdecl wined3d_volume_unmap(struct wined3d_volume *volume); From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Riccardo Bortolato : wined3d: Remove wined3d_surface_get_blt_status stub. Message-ID: Module: wine Branch: master Commit: e869ef5c0f5a11ab5981ecb1f4590fd592c711fc URL: http://source.winehq.org/git/wine.git/?a=commit;h=e869ef5c0f5a11ab5981ecb1f4590fd592c711fc Author: Riccardo Bortolato Date: Wed Sep 9 19:02:25 2015 +0200 wined3d: Remove wined3d_surface_get_blt_status stub. --- dlls/ddraw/surface.c | 16 +++++++--------- dlls/wined3d/surface.c | 15 --------------- dlls/wined3d/wined3d.spec | 1 - include/wine/wined3d.h | 1 - 4 files changed, 7 insertions(+), 26 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 4e815aa..fcdf04b 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -2945,18 +2945,16 @@ static HRESULT WINAPI ddraw_surface1_EnumOverlayZOrders(IDirectDrawSurface *ifac *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetBltStatus(IDirectDrawSurface7 *iface, DWORD Flags) { - struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface); - HRESULT hr; - TRACE("iface %p, flags %#x.\n", iface, Flags); - wined3d_mutex_lock(); - hr = wined3d_surface_get_blt_status(surface->wined3d_surface, Flags); - wined3d_mutex_unlock(); - switch(hr) + switch (Flags) { - case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS; - default: return hr; + case WINEDDGBS_CANBLT: + case WINEDDGBS_ISBLTDONE: + return DD_OK; + + default: + return DDERR_INVALIDPARAMS; } } diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index f01260c..f823e05 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1883,21 +1883,6 @@ struct wined3d_resource * CDECL wined3d_surface_get_resource(struct wined3d_surf return &surface->resource; } -HRESULT CDECL wined3d_surface_get_blt_status(const struct wined3d_surface *surface, DWORD flags) -{ - TRACE("surface %p, flags %#x.\n", surface, flags); - - switch (flags) - { - case WINEDDGBS_CANBLT: - case WINEDDGBS_ISBLTDONE: - return WINED3D_OK; - - default: - return WINED3DERR_INVALIDCALL; - } -} - HRESULT CDECL wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags) { TRACE("surface %p, flags %#x.\n", surface, flags); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 6f770a9..26bd6dd 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -224,7 +224,6 @@ @ cdecl wined3d_surface_blt(ptr ptr ptr ptr long ptr long) @ cdecl wined3d_surface_decref(ptr) @ cdecl wined3d_surface_from_resource(ptr) -@ cdecl wined3d_surface_get_blt_status(ptr long) @ cdecl wined3d_surface_get_flip_status(ptr long) @ cdecl wined3d_surface_get_overlay_position(ptr ptr ptr) @ cdecl wined3d_surface_get_parent(ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index d3dde35..5739899 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2478,7 +2478,6 @@ HRESULT __cdecl wined3d_surface_blt(struct wined3d_surface *dst_surface, const R const WINEDDBLTFX *blt_fx, enum wined3d_texture_filter_type filter); ULONG __cdecl wined3d_surface_decref(struct wined3d_surface *surface); struct wined3d_surface * __cdecl wined3d_surface_from_resource(struct wined3d_resource *resource); -HRESULT __cdecl wined3d_surface_get_blt_status(const struct wined3d_surface *surface, DWORD flags); HRESULT __cdecl wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags); HRESULT __cdecl wined3d_surface_get_overlay_position(const struct wined3d_surface *surface, LONG *x, LONG *y); void * __cdecl wined3d_surface_get_parent(const struct wined3d_surface *surface); From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: Riccardo Bortolato : wined3d: Remove wined3d_surface_get_flip_status stub. Message-ID: Module: wine Branch: master Commit: 825b141e5ae293fc7f0ba51de41ca6161cf09b0d URL: http://source.winehq.org/git/wine.git/?a=commit;h=825b141e5ae293fc7f0ba51de41ca6161cf09b0d Author: Riccardo Bortolato Date: Wed Sep 9 19:02:26 2015 +0200 wined3d: Remove wined3d_surface_get_flip_status stub. --- dlls/ddraw/surface.c | 17 ++++++++--------- dlls/wined3d/surface.c | 17 ----------------- dlls/wined3d/wined3d.spec | 1 - include/wine/wined3d.h | 1 - 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index fcdf04b..6b6ddb9 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -3117,19 +3117,18 @@ static HRESULT WINAPI ddraw_surface1_GetColorKey(IDirectDrawSurface *iface, DWOR *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetFlipStatus(IDirectDrawSurface7 *iface, DWORD Flags) { - struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface); - HRESULT hr; - TRACE("iface %p, flags %#x.\n", iface, Flags); - wined3d_mutex_lock(); - hr = wined3d_surface_get_flip_status(surface->wined3d_surface, Flags); - wined3d_mutex_unlock(); + /* XXX: DDERR_INVALIDSURFACETYPE */ - switch(hr) + switch (Flags) { - case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS; - default: return hr; + case WINEDDGFS_CANFLIP: + case WINEDDGFS_ISFLIPDONE: + return DD_OK; + + default: + return DDERR_INVALIDPARAMS; } } diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index f823e05..999423d8 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1883,23 +1883,6 @@ struct wined3d_resource * CDECL wined3d_surface_get_resource(struct wined3d_surf return &surface->resource; } -HRESULT CDECL wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags) -{ - TRACE("surface %p, flags %#x.\n", surface, flags); - - /* XXX: DDERR_INVALIDSURFACETYPE */ - - switch (flags) - { - case WINEDDGFS_CANFLIP: - case WINEDDGFS_ISFLIPDONE: - return WINED3D_OK; - - default: - return WINED3DERR_INVALIDCALL; - } -} - HRESULT CDECL wined3d_surface_is_lost(const struct wined3d_surface *surface) { TRACE("surface %p.\n", surface); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 26bd6dd..9531dd3 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -224,7 +224,6 @@ @ cdecl wined3d_surface_blt(ptr ptr ptr ptr long ptr long) @ cdecl wined3d_surface_decref(ptr) @ cdecl wined3d_surface_from_resource(ptr) -@ cdecl wined3d_surface_get_flip_status(ptr long) @ cdecl wined3d_surface_get_overlay_position(ptr ptr ptr) @ cdecl wined3d_surface_get_parent(ptr) @ cdecl wined3d_surface_get_pitch(ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 5739899..ac1e59e 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2478,7 +2478,6 @@ HRESULT __cdecl wined3d_surface_blt(struct wined3d_surface *dst_surface, const R const WINEDDBLTFX *blt_fx, enum wined3d_texture_filter_type filter); ULONG __cdecl wined3d_surface_decref(struct wined3d_surface *surface); struct wined3d_surface * __cdecl wined3d_surface_from_resource(struct wined3d_resource *resource); -HRESULT __cdecl wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags); HRESULT __cdecl wined3d_surface_get_overlay_position(const struct wined3d_surface *surface, LONG *x, LONG *y); void * __cdecl wined3d_surface_get_parent(const struct wined3d_surface *surface); DWORD __cdecl wined3d_surface_get_pitch(const struct wined3d_surface *surface); From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_shader_resource_view to d3d_shader_resource_view. Message-ID: Module: wine Branch: master Commit: 55d30331a5b3712280291720a65b3529420a2cb5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=55d30331a5b3712280291720a65b3529420a2cb5 Author: J?zef Kucia Date: Thu Sep 10 00:55:42 2015 +0200 d3d11: Rename d3d10_shader_resource_view to d3d_shader_resource_view. --- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 16 ++++++++-------- dlls/d3d11/view.c | 26 +++++++++++++------------- 3 files changed, 24 insertions(+), 24 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=55d30331a5b3712280291720a65b3529420a2cb5 From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Add ID3D11ShaderResourceView interface stub. Message-ID: Module: wine Branch: master Commit: 3882f2d303bf06bae60ba4f3d9e04b2f59f3cee0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3882f2d303bf06bae60ba4f3d9e04b2f59f3cee0 Author: J?zef Kucia Date: Thu Sep 10 00:55:43 2015 +0200 d3d11: Add ID3D11ShaderResourceView interface stub. --- dlls/d3d11/d3d11_private.h | 3 +- dlls/d3d11/view.c | 158 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 138 insertions(+), 23 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 0abd374..b5d0b72 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -188,9 +188,10 @@ HRESULT d3d_rendertarget_view_create(struct d3d_device *device, ID3D11Resource * const D3D11_RENDER_TARGET_VIEW_DESC *desc, struct d3d_rendertarget_view **view) DECLSPEC_HIDDEN; struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface) DECLSPEC_HIDDEN; -/* ID3D10ShaderResourceView */ +/* ID3D11ShaderResourceView, ID3D10ShaderResourceView */ struct d3d_shader_resource_view { + ID3D11ShaderResourceView ID3D11ShaderResourceView_iface; ID3D10ShaderResourceView ID3D10ShaderResourceView_iface; LONG refcount; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 968c27e..7410916 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -1178,65 +1178,178 @@ struct d3d_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10Rend return impl_from_ID3D10RenderTargetView(iface); } -static inline struct d3d_shader_resource_view *impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView *iface) +/* ID3D11ShaderResourceView methods */ + +struct d3d_shader_resource_view *impl_from_ID3D11ShaderResourceView(ID3D11ShaderResourceView *iface) { - return CONTAINING_RECORD(iface, struct d3d_shader_resource_view, ID3D10ShaderResourceView_iface); + return CONTAINING_RECORD(iface, struct d3d_shader_resource_view, ID3D11ShaderResourceView_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_QueryInterface(ID3D10ShaderResourceView *iface, +static HRESULT STDMETHODCALLTYPE d3d11_shader_resource_view_QueryInterface(ID3D11ShaderResourceView *iface, REFIID riid, void **object) { + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - if (IsEqualGUID(riid, &IID_ID3D10ShaderResourceView) - || IsEqualGUID(riid, &IID_ID3D10View) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + if (IsEqualGUID(riid, &IID_ID3D11ShaderResourceView) + || IsEqualGUID(riid, &IID_ID3D11View) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11ShaderResourceView_AddRef(iface); *object = iface; return S_OK; } + if (IsEqualGUID(riid, &IID_ID3D10ShaderResourceView) + || IsEqualGUID(riid, &IID_ID3D10View) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + ID3D10ShaderResourceView_AddRef(&view->ID3D10ShaderResourceView_iface); + *object = &view->ID3D10ShaderResourceView_iface; + return S_OK; + } + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *object = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_AddRef(ID3D10ShaderResourceView *iface) +static ULONG STDMETHODCALLTYPE d3d11_shader_resource_view_AddRef(ID3D11ShaderResourceView *iface) { - struct d3d_shader_resource_view *This = impl_from_ID3D10ShaderResourceView(iface); - ULONG refcount = InterlockedIncrement(&This->refcount); + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + ULONG refcount = InterlockedIncrement(&view->refcount); - TRACE("%p increasing refcount to %u.\n", This, refcount); + TRACE("%p increasing refcount to %u.\n", view, refcount); return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_Release(ID3D10ShaderResourceView *iface) +static ULONG STDMETHODCALLTYPE d3d11_shader_resource_view_Release(ID3D11ShaderResourceView *iface) { - struct d3d_shader_resource_view *This = impl_from_ID3D10ShaderResourceView(iface); - ULONG refcount = InterlockedDecrement(&This->refcount); + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + ULONG refcount = InterlockedDecrement(&view->refcount); - TRACE("%p decreasing refcount to %u.\n", This, refcount); + TRACE("%p decreasing refcount to %u.\n", view, refcount); if (!refcount) { wined3d_mutex_lock(); - wined3d_shader_resource_view_decref(This->wined3d_view); - ID3D10Resource_Release(This->resource); - ID3D10Device1_Release(This->device); - wined3d_private_store_cleanup(&This->private_store); + wined3d_shader_resource_view_decref(view->wined3d_view); + ID3D10Resource_Release(view->resource); + ID3D10Device1_Release(view->device); + wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); - HeapFree(GetProcessHeap(), 0, This); + HeapFree(GetProcessHeap(), 0, view); } return refcount; } +static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetDevice(ID3D11ShaderResourceView *iface, + ID3D11Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_shader_resource_view_GetPrivateData(ID3D11ShaderResourceView *iface, + REFGUID guid, UINT *data_size, void *data) +{ + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_get_private_data(&view->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_shader_resource_view_SetPrivateData(ID3D11ShaderResourceView *iface, + REFGUID guid, UINT data_size, const void *data) +{ + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_set_private_data(&view->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_shader_resource_view_SetPrivateDataInterface(ID3D11ShaderResourceView *iface, + REFGUID guid, const IUnknown *data) +{ + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&view->private_store, guid, data); +} + +static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetResource(ID3D11ShaderResourceView *iface, + ID3D11Resource **resource) +{ + FIXME("iface %p, resource %p stub!\n", iface, resource); +} + +static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetDesc(ID3D11ShaderResourceView *iface, + D3D11_SHADER_RESOURCE_VIEW_DESC *desc) +{ + FIXME("iface %p, desc %p stub!\n", iface, desc); +} + +static const struct ID3D11ShaderResourceViewVtbl d3d11_shader_resource_view_vtbl = +{ + /* IUnknown methods */ + d3d11_shader_resource_view_QueryInterface, + d3d11_shader_resource_view_AddRef, + d3d11_shader_resource_view_Release, + /* ID3D11DeviceChild methods */ + d3d11_shader_resource_view_GetDevice, + d3d11_shader_resource_view_GetPrivateData, + d3d11_shader_resource_view_SetPrivateData, + d3d11_shader_resource_view_SetPrivateDataInterface, + /* ID3D11View methods */ + d3d11_shader_resource_view_GetResource, + /* ID3D11ShaderResourceView methods */ + d3d11_shader_resource_view_GetDesc, +}; + +/* ID3D10ShaderResourceView methods */ + +static inline struct d3d_shader_resource_view *impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_shader_resource_view, ID3D10ShaderResourceView_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_QueryInterface(ID3D10ShaderResourceView *iface, + REFIID riid, void **object) +{ + struct d3d_shader_resource_view *view = impl_from_ID3D10ShaderResourceView(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_shader_resource_view_QueryInterface(&view->ID3D11ShaderResourceView_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_AddRef(ID3D10ShaderResourceView *iface) +{ + struct d3d_shader_resource_view *view = impl_from_ID3D10ShaderResourceView(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_shader_resource_view_AddRef(&view->ID3D11ShaderResourceView_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_Release(ID3D10ShaderResourceView *iface) +{ + struct d3d_shader_resource_view *view = impl_from_ID3D10ShaderResourceView(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_shader_resource_view_Release(&view->ID3D11ShaderResourceView_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetDevice(ID3D10ShaderResourceView *iface, @@ -1330,6 +1443,7 @@ HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, str struct wined3d_resource *wined3d_resource; HRESULT hr; + view->ID3D11ShaderResourceView_iface.lpVtbl = &d3d11_shader_resource_view_vtbl; view->ID3D10ShaderResourceView_iface.lpVtbl = &d3d10_shader_resource_view_vtbl; view->refcount = 1; From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_shader_resource_view_GetDevice(). Message-ID: Module: wine Branch: master Commit: cdc8d9af86749f143d31259b5d41013e2d7ba9c8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cdc8d9af86749f143d31259b5d41013e2d7ba9c8 Author: J?zef Kucia Date: Thu Sep 10 00:55:44 2015 +0200 d3d11: Implement d3d11_shader_resource_view_GetDevice(). --- dlls/d3d11/d3d11_private.h | 2 +- dlls/d3d11/view.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index b5d0b72..420de97 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -199,7 +199,7 @@ struct d3d_shader_resource_view struct wined3d_shader_resource_view *wined3d_view; D3D10_SHADER_RESOURCE_VIEW_DESC desc; ID3D10Resource *resource; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 7410916..cac8c25 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -1239,7 +1239,7 @@ static ULONG STDMETHODCALLTYPE d3d11_shader_resource_view_Release(ID3D11ShaderRe wined3d_mutex_lock(); wined3d_shader_resource_view_decref(view->wined3d_view); ID3D10Resource_Release(view->resource); - ID3D10Device1_Release(view->device); + ID3D11Device_Release(view->device); wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); HeapFree(GetProcessHeap(), 0, view); @@ -1251,7 +1251,12 @@ static ULONG STDMETHODCALLTYPE d3d11_shader_resource_view_Release(ID3D11ShaderRe static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetDevice(ID3D11ShaderResourceView *iface, ID3D11Device **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = view->device; + ID3D11Device_AddRef(*device); } static HRESULT STDMETHODCALLTYPE d3d11_shader_resource_view_GetPrivateData(ID3D11ShaderResourceView *iface, @@ -1359,8 +1364,7 @@ static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetDevice(ID3D10ShaderR TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)view->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(view->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_GetPrivateData(ID3D10ShaderResourceView *iface, @@ -1475,8 +1479,8 @@ HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, str wined3d_mutex_unlock(); view->resource = resource; ID3D10Resource_AddRef(resource); - view->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(view->device); + view->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(view->device); return S_OK; } From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_shader_resource_view_GetDesc(). Message-ID: Module: wine Branch: master Commit: 28f98a0d9d1a53c6f204be0f694f72bd0d13aba9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=28f98a0d9d1a53c6f204be0f694f72bd0d13aba9 Author: J?zef Kucia Date: Thu Sep 10 00:55:45 2015 +0200 d3d11: Implement d3d11_shader_resource_view_GetDesc(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 3 ++- dlls/d3d11/view.c | 26 +++++++++++++++----------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 420de97..5cf7509 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -197,13 +197,13 @@ struct d3d_shader_resource_view struct wined3d_private_store private_store; struct wined3d_shader_resource_view *wined3d_view; - D3D10_SHADER_RESOURCE_VIEW_DESC desc; + D3D11_SHADER_RESOURCE_VIEW_DESC desc; ID3D10Resource *resource; ID3D11Device *device; }; HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, - ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN; + ID3D10Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN; struct d3d_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView( ID3D10ShaderResourceView *iface) DECLSPEC_HIDDEN; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 0b90fb8..4266a98 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2115,7 +2115,8 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateShaderResourceView(ID3D10Dev if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; - if (FAILED(hr = d3d_shader_resource_view_init(object, device, resource, desc))) + if (FAILED(hr = d3d_shader_resource_view_init(object, device, resource, + (const D3D11_SHADER_RESOURCE_VIEW_DESC *)desc))) { WARN("Failed to initialize shader resource view, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index cac8c25..f3ac62f 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -240,7 +240,7 @@ static HRESULT set_rtdesc_from_resource(D3D11_RENDER_TARGET_VIEW_DESC *desc, ID3 } } -static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, ID3D10Resource *resource) +static HRESULT set_srdesc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D10Resource *resource) { D3D10_RESOURCE_DIMENSION dimension; @@ -265,13 +265,13 @@ static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, I desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) { - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE1D; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; desc->u.Texture1D.MostDetailedMip = 0; desc->u.Texture1D.MipLevels = texture_desc.MipLevels; } else { - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE1DARRAY; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; desc->u.Texture1DArray.MostDetailedMip = 0; desc->u.Texture1DArray.MipLevels = texture_desc.MipLevels; desc->u.Texture1DArray.FirstArraySlice = 0; @@ -300,20 +300,20 @@ static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, I { if (texture_desc.SampleDesc.Count == 1) { - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; desc->u.Texture2D.MostDetailedMip = 0; desc->u.Texture2D.MipLevels = texture_desc.MipLevels; } else { - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DMS; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS; } } else { if (texture_desc.SampleDesc.Count == 1) { - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DARRAY; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; desc->u.Texture2DArray.MostDetailedMip = 0; desc->u.Texture2DArray.MipLevels = texture_desc.MipLevels; desc->u.Texture2DArray.FirstArraySlice = 0; @@ -321,7 +321,7 @@ static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, I } else { - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DMSARRAY; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY; desc->u.Texture2DMSArray.FirstArraySlice = 0; desc->u.Texture2DMSArray.ArraySize = texture_desc.ArraySize; } @@ -345,7 +345,7 @@ static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, I ID3D10Texture3D_Release(texture); desc->Format = texture_desc.Format; - desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE3D; + desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; desc->u.Texture3D.MostDetailedMip = 0; desc->u.Texture3D.MipLevels = texture_desc.MipLevels; @@ -1298,7 +1298,11 @@ static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetResource(ID3D11Shade static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetDesc(ID3D11ShaderResourceView *iface, D3D11_SHADER_RESOURCE_VIEW_DESC *desc) { - FIXME("iface %p, desc %p stub!\n", iface, desc); + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + + TRACE("iface %p, desc %p.\n", iface, desc); + + *desc = view->desc; } static const struct ID3D11ShaderResourceViewVtbl d3d11_shader_resource_view_vtbl = @@ -1421,7 +1425,7 @@ static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetDesc(ID3D10ShaderRes TRACE("iface %p, desc %p.\n", iface, desc); - *desc = view->desc; + memcpy(desc, &view->desc, sizeof(*desc)); } static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl = @@ -1442,7 +1446,7 @@ static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl }; HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, - ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc) + ID3D10Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) { struct wined3d_resource *wined3d_resource; HRESULT hr; From julliard at wine.codeweavers.com Thu Sep 10 08:07:53 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:53 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_shader_resource_view_GetResource(). Message-ID: Module: wine Branch: master Commit: 487cf3d5c41693723ebdb899807cd3df921d8a3d URL: http://source.winehq.org/git/wine.git/?a=commit;h=487cf3d5c41693723ebdb899807cd3df921d8a3d Author: J?zef Kucia Date: Thu Sep 10 00:55:46 2015 +0200 d3d11: Implement d3d11_shader_resource_view_GetResource(). --- dlls/d3d11/d3d11_private.h | 4 +-- dlls/d3d11/device.c | 13 ++++++++- dlls/d3d11/view.c | 68 ++++++++++++++++++++++++---------------------- 3 files changed, 50 insertions(+), 35 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 5cf7509..93b82f9 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -198,12 +198,12 @@ struct d3d_shader_resource_view struct wined3d_private_store private_store; struct wined3d_shader_resource_view *wined3d_view; D3D11_SHADER_RESOURCE_VIEW_DESC desc; - ID3D10Resource *resource; + ID3D11Resource *resource; ID3D11Device *device; }; HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, - ID3D10Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN; + ID3D11Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN; struct d3d_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView( ID3D10ShaderResourceView *iface) DECLSPEC_HIDDEN; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 4266a98..ef12a33 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2108,6 +2108,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateShaderResourceView(ID3D10Dev { struct d3d_device *device = impl_from_ID3D10Device(iface); struct d3d_shader_resource_view *object; + ID3D11Resource *d3d11_resource; HRESULT hr; TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); @@ -2115,14 +2116,24 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateShaderResourceView(ID3D10Dev if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) return E_OUTOFMEMORY; - if (FAILED(hr = d3d_shader_resource_view_init(object, device, resource, + if (FAILED(hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D11Resource, (void **)&d3d11_resource))) + { + ERR("Resource does not implement ID3D11Resource.\n"); + HeapFree(GetProcessHeap(), 0, object); + return E_FAIL; + } + + if (FAILED(hr = d3d_shader_resource_view_init(object, device, d3d11_resource, (const D3D11_SHADER_RESOURCE_VIEW_DESC *)desc))) { WARN("Failed to initialize shader resource view, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); + ID3D11Resource_Release(d3d11_resource); return hr; } + ID3D11Resource_Release(d3d11_resource); + TRACE("Created shader resource view %p.\n", object); *view = &object->ID3D10ShaderResourceView_iface; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index f3ac62f..99b1be7 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -240,27 +240,27 @@ static HRESULT set_rtdesc_from_resource(D3D11_RENDER_TARGET_VIEW_DESC *desc, ID3 } } -static HRESULT set_srdesc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D10Resource *resource) +static HRESULT set_srdesc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D11Resource *resource) { - D3D10_RESOURCE_DIMENSION dimension; + D3D11_RESOURCE_DIMENSION dimension; - ID3D10Resource_GetType(resource, &dimension); + ID3D11Resource_GetType(resource, &dimension); switch (dimension) { - case D3D10_RESOURCE_DIMENSION_TEXTURE1D: + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: { - D3D10_TEXTURE1D_DESC texture_desc; - ID3D10Texture1D *texture; + D3D11_TEXTURE1D_DESC texture_desc; + ID3D11Texture1D *texture; - if (FAILED(ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture1D, (void **)&texture))) + if (FAILED(ID3D11Resource_QueryInterface(resource, &IID_ID3D11Texture1D, (void **)&texture))) { - ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D.\n"); + ERR("Resource of type TEXTURE1D doesn't implement ID3D11Texture1D.\n"); return E_INVALIDARG; } - ID3D10Texture1D_GetDesc(texture, &texture_desc); - ID3D10Texture1D_Release(texture); + ID3D11Texture1D_GetDesc(texture, &texture_desc); + ID3D11Texture1D_Release(texture); desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) @@ -281,19 +281,19 @@ static HRESULT set_srdesc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, I return S_OK; } - case D3D10_RESOURCE_DIMENSION_TEXTURE2D: + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: { - D3D10_TEXTURE2D_DESC texture_desc; - ID3D10Texture2D *texture; + D3D11_TEXTURE2D_DESC texture_desc; + ID3D11Texture2D *texture; - if (FAILED(ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture))) + if (FAILED(ID3D11Resource_QueryInterface(resource, &IID_ID3D11Texture2D, (void **)&texture))) { - ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D.\n"); + ERR("Resource of type TEXTURE2D doesn't implement ID3D11Texture2D.\n"); return E_INVALIDARG; } - ID3D10Texture2D_GetDesc(texture, &texture_desc); - ID3D10Texture2D_Release(texture); + ID3D11Texture2D_GetDesc(texture, &texture_desc); + ID3D11Texture2D_Release(texture); desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) @@ -330,19 +330,19 @@ static HRESULT set_srdesc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, I return S_OK; } - case D3D10_RESOURCE_DIMENSION_TEXTURE3D: + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: { - D3D10_TEXTURE3D_DESC texture_desc; - ID3D10Texture3D *texture; + D3D11_TEXTURE3D_DESC texture_desc; + ID3D11Texture3D *texture; - if (FAILED(ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture))) + if (FAILED(ID3D11Resource_QueryInterface(resource, &IID_ID3D11Texture3D, (void **)&texture))) { - ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D.\n"); + ERR("Resource of type TEXTURE3D doesn't implement ID3D11Texture3D.\n"); return E_INVALIDARG; } - ID3D10Texture3D_GetDesc(texture, &texture_desc); - ID3D10Texture3D_Release(texture); + ID3D11Texture3D_GetDesc(texture, &texture_desc); + ID3D11Texture3D_Release(texture); desc->Format = texture_desc.Format; desc->ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; @@ -354,7 +354,7 @@ static HRESULT set_srdesc_from_resource(D3D11_SHADER_RESOURCE_VIEW_DESC *desc, I default: FIXME("Unhandled resource dimension %#x.\n", dimension); - case D3D10_RESOURCE_DIMENSION_BUFFER: + case D3D11_RESOURCE_DIMENSION_BUFFER: return E_INVALIDARG; } } @@ -1238,7 +1238,7 @@ static ULONG STDMETHODCALLTYPE d3d11_shader_resource_view_Release(ID3D11ShaderRe { wined3d_mutex_lock(); wined3d_shader_resource_view_decref(view->wined3d_view); - ID3D10Resource_Release(view->resource); + ID3D11Resource_Release(view->resource); ID3D11Device_Release(view->device); wined3d_private_store_cleanup(&view->private_store); wined3d_mutex_unlock(); @@ -1292,7 +1292,12 @@ static HRESULT STDMETHODCALLTYPE d3d11_shader_resource_view_SetPrivateDataInterf static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetResource(ID3D11ShaderResourceView *iface, ID3D11Resource **resource) { - FIXME("iface %p, resource %p stub!\n", iface, resource); + struct d3d_shader_resource_view *view = impl_from_ID3D11ShaderResourceView(iface); + + TRACE("iface %p, resource %p.\n", iface, resource); + + *resource = view->resource; + ID3D11Resource_AddRef(*resource); } static void STDMETHODCALLTYPE d3d11_shader_resource_view_GetDesc(ID3D11ShaderResourceView *iface, @@ -1412,8 +1417,7 @@ static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetResource(ID3D10Shade TRACE("iface %p, resource %p.\n", iface, resource); - *resource = view->resource; - ID3D10Resource_AddRef(*resource); + ID3D11Resource_QueryInterface(view->resource, &IID_ID3D10Resource, (void **)resource); } /* ID3D10ShaderResourceView methods */ @@ -1446,7 +1450,7 @@ static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl }; HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, - ID3D10Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) + ID3D11Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) { struct wined3d_resource *wined3d_resource; HRESULT hr; @@ -1466,7 +1470,7 @@ HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, str } wined3d_mutex_lock(); - if (!(wined3d_resource = wined3d_resource_from_d3d10_resource(resource))) + if (!(wined3d_resource = wined3d_resource_from_d3d11_resource(resource))) { ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource); return E_FAIL; @@ -1482,7 +1486,7 @@ HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, str wined3d_private_store_init(&view->private_store); wined3d_mutex_unlock(); view->resource = resource; - ID3D10Resource_AddRef(resource); + ID3D11Resource_AddRef(resource); view->device = &device->ID3D11Device_iface; ID3D11Device_AddRef(view->device); From julliard at wine.codeweavers.com Thu Sep 10 08:07:54 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:54 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateShaderResourceView(). Message-ID: Module: wine Branch: master Commit: 8972105ee5e1a642b17762797c39cb4a09008203 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8972105ee5e1a642b17762797c39cb4a09008203 Author: J?zef Kucia Date: Thu Sep 10 00:55:47 2015 +0200 d3d11: Implement d3d11_device_CreateShaderResourceView(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 32 +++++++++++++++----------------- dlls/d3d11/view.c | 24 +++++++++++++++++++++++- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 93b82f9..e48befd 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -202,8 +202,8 @@ struct d3d_shader_resource_view ID3D11Device *device; }; -HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, - ID3D11Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN; +HRESULT d3d_shader_resource_view_create(struct d3d_device *device, ID3D11Resource *resource, + const D3D11_SHADER_RESOURCE_VIEW_DESC *desc, struct d3d_shader_resource_view **view) DECLSPEC_HIDDEN; struct d3d_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView( ID3D10ShaderResourceView *iface) DECLSPEC_HIDDEN; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index ef12a33..dcaa49c 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -119,9 +119,18 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateTexture3D(ID3D11Device *ifac static HRESULT STDMETHODCALLTYPE d3d11_device_CreateShaderResourceView(ID3D11Device *iface, ID3D11Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc, ID3D11ShaderResourceView **view) { - FIXME("iface %p, resource %p, desc %p, view %p stub!\n", iface, resource, desc, view); + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_shader_resource_view *object; + HRESULT hr; - return E_NOTIMPL; + TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); + + if (FAILED(hr = d3d_shader_resource_view_create(device, resource, desc, &object))) + return hr; + + *view = &object->ID3D11ShaderResourceView_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateUnorderedAccessView(ID3D11Device *iface, @@ -147,7 +156,6 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateRenderTargetView(ID3D11Devic *view = &object->ID3D11RenderTargetView_iface; return S_OK; - } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDepthStencilView(ID3D11Device *iface, @@ -2113,28 +2121,18 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateShaderResourceView(ID3D10Dev TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view); - if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) - return E_OUTOFMEMORY; - if (FAILED(hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D11Resource, (void **)&d3d11_resource))) { ERR("Resource does not implement ID3D11Resource.\n"); - HeapFree(GetProcessHeap(), 0, object); return E_FAIL; } - if (FAILED(hr = d3d_shader_resource_view_init(object, device, d3d11_resource, - (const D3D11_SHADER_RESOURCE_VIEW_DESC *)desc))) - { - WARN("Failed to initialize shader resource view, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); - ID3D11Resource_Release(d3d11_resource); - return hr; - } - + hr = d3d_shader_resource_view_create(device, d3d11_resource, (const D3D11_SHADER_RESOURCE_VIEW_DESC *)desc, + &object); ID3D11Resource_Release(d3d11_resource); + if (FAILED(hr)) + return hr; - TRACE("Created shader resource view %p.\n", object); *view = &object->ID3D10ShaderResourceView_iface; return S_OK; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 99b1be7..4b39cc8 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -1449,7 +1449,7 @@ static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl d3d10_shader_resource_view_GetDesc, }; -HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, +static HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, struct d3d_device *device, ID3D11Resource *resource, const D3D11_SHADER_RESOURCE_VIEW_DESC *desc) { struct wined3d_resource *wined3d_resource; @@ -1493,6 +1493,28 @@ HRESULT d3d_shader_resource_view_init(struct d3d_shader_resource_view *view, str return S_OK; } +HRESULT d3d_shader_resource_view_create(struct d3d_device *device, ID3D11Resource *resource, + const D3D11_SHADER_RESOURCE_VIEW_DESC *desc, struct d3d_shader_resource_view **view) +{ + struct d3d_shader_resource_view *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_shader_resource_view_init(object, device, resource, desc))) + { + WARN("Failed to initialize shader resource view, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created shader resource view %p.\n", object); + *view = object; + + return S_OK; +} + struct d3d_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView *iface) { if (!iface) From julliard at wine.codeweavers.com Thu Sep 10 08:07:54 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:54 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Port test_create_shader_resource_view() from d3d10core. Message-ID: Module: wine Branch: master Commit: eb45704ba88c2b0e59bf296a39c360d905a5d3fd URL: http://source.winehq.org/git/wine.git/?a=commit;h=eb45704ba88c2b0e59bf296a39c360d905a5d3fd Author: J?zef Kucia Date: Thu Sep 10 00:55:48 2015 +0200 d3d11/tests: Port test_create_shader_resource_view() from d3d10core. --- dlls/d3d11/tests/d3d11.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 15b9b19..8bf31dc 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -989,6 +989,102 @@ static void test_create_rendertarget_view(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_create_shader_resource_view(void) +{ + D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; + D3D11_TEXTURE2D_DESC texture_desc; + ULONG refcount, expected_refcount; + ID3D11ShaderResourceView *srview; + D3D11_BUFFER_DESC buffer_desc; + ID3D11Device *device, *tmp; + ID3D11Texture2D *texture; + ID3D11Buffer *buffer; + IUnknown *iface; + HRESULT hr; + + if (!(device = create_device(NULL))) + { + skip("Failed to create device.\n"); + return; + } + + buffer_desc.ByteWidth = 1024; + buffer_desc.Usage = D3D11_USAGE_DEFAULT; + buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + buffer_desc.CPUAccessFlags = 0; + buffer_desc.MiscFlags = 0; + buffer_desc.StructureByteStride = 0; + + hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer); + ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr); + + hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)buffer, NULL, &srview); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + + srv_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; + U(srv_desc).Buffer.ElementOffset = 0; + U(srv_desc).Buffer.ElementWidth = 64; + + expected_refcount = get_refcount((IUnknown *)device) + 1; + hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)buffer, &srv_desc, &srview); + ok(SUCCEEDED(hr), "Failed to create a shader resource view, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)device); + ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n", refcount, expected_refcount); + tmp = NULL; + expected_refcount = refcount + 1; + ID3D11ShaderResourceView_GetDevice(srview, &tmp); + ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device); + refcount = get_refcount((IUnknown *)device); + ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); + ID3D11Device_Release(tmp); + + hr = ID3D11ShaderResourceView_QueryInterface(srview, &IID_ID3D10ShaderResourceView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Shader resource view should implement ID3D10ShaderResourceView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + + ID3D11ShaderResourceView_Release(srview); + ID3D11Buffer_Release(buffer); + + texture_desc.Width = 512; + texture_desc.Height = 512; + texture_desc.MipLevels = 0; + texture_desc.ArraySize = 1; + texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Quality = 0; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + + hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x.\n", hr); + + hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)texture, NULL, &srview); + ok(SUCCEEDED(hr), "Failed to create a shader resource view, hr %#x.\n", hr); + + hr = ID3D11ShaderResourceView_QueryInterface(srview, &IID_ID3D10ShaderResourceView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Shader resource view should implement ID3D10ShaderResourceView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + + ID3D11ShaderResourceView_GetDesc(srview, &srv_desc); + ok(srv_desc.Format == texture_desc.Format, "Got unexpected format %#x.\n", srv_desc.Format); + ok(srv_desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2D, + "Got unexpected view dimension %#x.\n", srv_desc.ViewDimension); + ok(U(srv_desc).Texture2D.MostDetailedMip == 0, "Got unexpected MostDetailedMip %u.\n", + U(srv_desc).Texture2D.MostDetailedMip); + ok(U(srv_desc).Texture2D.MipLevels == 10, "Got unexpected MipLevels %u.\n", U(srv_desc).Texture2D.MipLevels); + + ID3D11ShaderResourceView_Release(srview); + ID3D11Texture2D_Release(texture); + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + START_TEST(d3d11) { test_create_device(); @@ -1000,4 +1096,5 @@ START_TEST(d3d11) test_buffer_interfaces(); test_depthstencil_view_interfaces(); test_create_rendertarget_view(); + test_create_shader_resource_view(); } From julliard at wine.codeweavers.com Thu Sep 10 08:07:54 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Thu, 10 Sep 2015 08:07:54 -0500 Subject: Jacek Caban : usp10: Added test of ScriptStringAnalyse call with 0 length string. Message-ID: Module: wine Branch: master Commit: efb1cf0299c23385f934fa9b3abc920bfca46611 URL: http://source.winehq.org/git/wine.git/?a=commit;h=efb1cf0299c23385f934fa9b3abc920bfca46611 Author: Jacek Caban Date: Thu Sep 10 12:46:47 2015 +0200 usp10: Added test of ScriptStringAnalyse call with 0 length string. --- dlls/usp10/tests/usp10.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c index b5d43f7..0db98d9 100644 --- a/dlls/usp10/tests/usp10.c +++ b/dlls/usp10/tests/usp10.c @@ -2547,6 +2547,12 @@ static void test_ScriptString(HDC hdc) &InClass, &ssa); ok(hr == E_PENDING, "ScriptStringAnalyse Stub should return E_PENDING not %08x\n", hr); + /* Test that 0 length string returns E_INVALIDARG */ + hr = ScriptStringAnalyse( hdc, teststr, 0, Glyphs, Charset, Flags, + ReqWidth, NULL, NULL, Dx, NULL, + &InClass, &ssa); + ok(hr == E_INVALIDARG, "ScriptStringAnalyse should return E_INVALIDARG not %08x\n", hr); + /* test with hdc, this should be a valid test */ hr = ScriptStringAnalyse( hdc, teststr, len, Glyphs, Charset, Flags, ReqWidth, NULL, NULL, Dx, NULL, From julliard at wine.codeweavers.com Fri Sep 11 06:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 06:03:43 -0500 Subject: Alexandre Julliard : Import of upstream bugzilla release 4.4.10. Message-ID: Module: bugzilla Branch: master Commit: 4cbc7ece4add61eed2a0016d927cca4e43ef64a8 URL: http://source.winehq.org/git/bugzilla.git/?a=commit;h=4cbc7ece4add61eed2a0016d927cca4e43ef64a8 Author: Alexandre Julliard Date: Fri Sep 11 19:57:24 2015 +0900 Import of upstream bugzilla release 4.4.10. --- .htaccess | 17 +- .travis.yml | 8 + Bugzilla/Constants.pm | 2 +- Bugzilla/Install/Filesystem.pm | 107 ++++++- Bugzilla/Install/Requirements.pm | 12 +- Bugzilla/Search.pm | 15 +- Bugzilla/Template.pm | 2 + Bugzilla/User.pm | 14 +- Bugzilla/Util.pm | 12 +- Bugzilla/WebService/Bug.pm | 2 + Bugzilla/WebService/Bugzilla.pm | 2 +- Bugzilla/WebService/Server/JSONRPC.pm | 2 +- Bugzilla/WebService/Server/XMLRPC.pm | 9 + Bugzilla/WebService/User.pm | 2 - LICENSE | 373 ++++++++++++++++++++++ README | 146 ++++----- checksetup.pl | 5 +- docs/bugzilla.ent | 4 +- docs/bugzilla.ent.tmpl | 4 +- docs/en/xml/bugzilla.ent | 4 +- importxml.pl | 3 + relogin.cgi | 3 + t/003safesys.t | 11 +- taskgraph.json | 220 +++++++++++++ template/en/default/pages/release-notes.html.tmpl | 50 +++ 25 files changed, 901 insertions(+), 128 deletions(-) Diff: http://source.winehq.org/git/bugzilla.git/?a=commitdiff;h=4cbc7ece4add61eed2a0016d927cca4e43ef64a8 From julliard at wine.codeweavers.com Fri Sep 11 06:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 06:03:43 -0500 Subject: Alexandre Julliard : Merge branch 'upstream'. Message-ID: Module: bugzilla Branch: master Commit: caf6a1349e1d7e4a279eb8da2fb9308a2f7752a8 URL: http://source.winehq.org/git/bugzilla.git/?a=commit;h=caf6a1349e1d7e4a279eb8da2fb9308a2f7752a8 Author: Alexandre Julliard Date: Fri Sep 11 19:58:22 2015 +0900 Merge branch 'upstream'. --- From julliard at wine.codeweavers.com Fri Sep 11 06:03:43 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 06:03:43 -0500 Subject: Alexandre Julliard : Import of upstream bugzilla release 4.4.10. Message-ID: Module: bugzilla Branch: upstream Commit: 4cbc7ece4add61eed2a0016d927cca4e43ef64a8 URL: http://source.winehq.org/git/bugzilla.git/?a=commit;h=4cbc7ece4add61eed2a0016d927cca4e43ef64a8 Author: Alexandre Julliard Date: Fri Sep 11 19:57:24 2015 +0900 Import of upstream bugzilla release 4.4.10. --- .htaccess | 17 +- .travis.yml | 8 + Bugzilla/Constants.pm | 2 +- Bugzilla/Install/Filesystem.pm | 107 ++++++- Bugzilla/Install/Requirements.pm | 12 +- Bugzilla/Search.pm | 15 +- Bugzilla/Template.pm | 2 + Bugzilla/User.pm | 14 +- Bugzilla/Util.pm | 12 +- Bugzilla/WebService/Bug.pm | 2 + Bugzilla/WebService/Bugzilla.pm | 2 +- Bugzilla/WebService/Server/JSONRPC.pm | 2 +- Bugzilla/WebService/Server/XMLRPC.pm | 9 + Bugzilla/WebService/User.pm | 2 - LICENSE | 373 ++++++++++++++++++++++ README | 146 ++++----- checksetup.pl | 5 +- docs/bugzilla.ent | 4 +- docs/bugzilla.ent.tmpl | 4 +- docs/en/xml/bugzilla.ent | 4 +- importxml.pl | 3 + relogin.cgi | 3 + t/003safesys.t | 11 +- taskgraph.json | 220 +++++++++++++ template/en/default/pages/release-notes.html.tmpl | 50 +++ 25 files changed, 901 insertions(+), 128 deletions(-) Diff: http://source.winehq.org/git/bugzilla.git/?a=commitdiff;h=4cbc7ece4add61eed2a0016d927cca4e43ef64a8 From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Nikolay Sivov : gdi32/tests: Avoid excessive traces for fonts with OS/ 2 version 4 tables. Message-ID: Module: wine Branch: master Commit: efb8afcfdcda88c8664641495e2adb05ca9a3319 URL: http://source.winehq.org/git/wine.git/?a=commit;h=efb8afcfdcda88c8664641495e2adb05ca9a3319 Author: Nikolay Sivov Date: Thu Sep 10 14:47:11 2015 +0300 gdi32/tests: Avoid excessive traces for fonts with OS/2 version 4 tables. --- dlls/gdi32/tests/font.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index 6b0da1f..cdc7726 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -3188,9 +3188,14 @@ typedef struct USHORT usDefaultChar; USHORT usBreakChar; USHORT usMaxContext; -} TT_OS2_V2; + /* version 4 (OpenType 1.6) */ + USHORT usLowerOpticalPointSize; + USHORT usUpperOpticalPointSize; +} TT_OS2_V4; #include "poppack.h" +#define TT_OS2_V0_SIZE (FIELD_OFFSET(TT_OS2_V4, ulCodePageRange1)) + typedef struct { USHORT version; @@ -3242,7 +3247,7 @@ typedef struct USHORT id_range_offset; } cmap_format_4_seg; -static void expect_ff(const TEXTMETRICA *tmA, const TT_OS2_V2 *os2, WORD family, const char *name) +static void expect_ff(const TEXTMETRICA *tmA, const TT_OS2_V4 *os2, WORD family, const char *name) { ok((tmA->tmPitchAndFamily & 0xf0) == family || broken(PRIMARYLANGID(GetSystemDefaultLangID()) != LANG_ENGLISH), @@ -3662,7 +3667,7 @@ static void test_text_metrics(const LOGFONTA *lf, const NEWTEXTMETRICA *ntm) HDC hdc; HFONT hfont, hfont_old; TEXTMETRICA tmA; - TT_OS2_V2 tt_os2; + TT_OS2_V4 tt_os2; LONG size, ret; const char *font_name = lf->lfFaceName; DWORD cmap_first = 0, cmap_last = 0; @@ -3693,7 +3698,8 @@ static void test_text_metrics(const LOGFONTA *lf, const NEWTEXTMETRICA *ntm) memset(&tt_os2, 0, sizeof(tt_os2)); ret = GetFontData(hdc, MS_OS2_TAG, 0, &tt_os2, size); - ok(ret == size, "GetFontData should return %u not %u\n", size, ret); + ok(ret >= TT_OS2_V0_SIZE && ret <= size, "GetFontData should return size from [%u,%u] not %u\n", TT_OS2_V0_SIZE, + size, ret); SetLastError(0xdeadbeef); ret = GetTextMetricsA(hdc, &tmA); From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Dmitry Timoshkov : msvideo: Implement MCIWndRegisterClass. Message-ID: Module: wine Branch: master Commit: 303172e332625a913373a7cf9d7107e63273c2dc URL: http://source.winehq.org/git/wine.git/?a=commit;h=303172e332625a913373a7cf9d7107e63273c2dc Author: Dmitry Timoshkov Date: Fri Sep 11 12:27:41 2015 +0800 msvideo: Implement MCIWndRegisterClass. --- dlls/msvideo.dll16/msvideo.dll16.spec | 2 +- dlls/msvideo.dll16/msvideo16.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/dlls/msvideo.dll16/msvideo.dll16.spec b/dlls/msvideo.dll16/msvideo.dll16.spec index 894fc9c..f45f644 100644 --- a/dlls/msvideo.dll16/msvideo.dll16.spec +++ b/dlls/msvideo.dll16/msvideo.dll16.spec @@ -63,6 +63,6 @@ 245 stub ICSEQCOMPRESSFRAMEEND 246 stub ICSEQCOMPRESSFRAME 250 cdecl _MCIWndCreate(word word long str) MCIWndCreate16 -251 stub _MCIWNDREGISTERCLASS +251 cdecl _MCIWndRegisterClass() MCIWndRegisterClass16 252 stub GETOPENFILENAMEPREVIEW 253 stub GETSAVEFILENAMEPREVIEW diff --git a/dlls/msvideo.dll16/msvideo16.c b/dlls/msvideo.dll16/msvideo16.c index 12833c9..e6c6c1e 100644 --- a/dlls/msvideo.dll16/msvideo16.c +++ b/dlls/msvideo.dll16/msvideo16.c @@ -974,6 +974,14 @@ BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, } /*********************************************************************** + * MCIWndRegisterClass(MSVIDEO.251) + */ +BOOL CDECL MCIWndRegisterClass16(void) +{ + return MCIWndRegisterClass(); +} + +/*********************************************************************** * MCIWndCreate(MSVIDEO.250) */ HWND16 CDECL MCIWndCreate16(HWND16 hwnd, HINSTANCE16 hinst16, From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Dmitry Timoshkov : msvideo: Add support for 16-bit MCIWndProc. Message-ID: Module: wine Branch: master Commit: 70161bc134ce8e7198d41c65ff147630a397f095 URL: http://source.winehq.org/git/wine.git/?a=commit;h=70161bc134ce8e7198d41c65ff147630a397f095 Author: Dmitry Timoshkov Date: Fri Sep 11 12:27:54 2015 +0800 msvideo: Add support for 16-bit MCIWndProc. --- dlls/msvideo.dll16/Makefile.in | 2 +- dlls/msvideo.dll16/msvideo16.c | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/dlls/msvideo.dll16/Makefile.in b/dlls/msvideo.dll16/Makefile.in index e08205e..5f7a9a4 100644 --- a/dlls/msvideo.dll16/Makefile.in +++ b/dlls/msvideo.dll16/Makefile.in @@ -1,5 +1,5 @@ MODULE = msvideo.dll16 -IMPORTS = msvfw32 version advapi32 +IMPORTS = msvfw32 version advapi32 user32 EXTRADLLFLAGS = -m16 -Wb,--main-module,msvfw32.dll diff --git a/dlls/msvideo.dll16/msvideo16.c b/dlls/msvideo.dll16/msvideo16.c index e6c6c1e..1b715e4 100644 --- a/dlls/msvideo.dll16/msvideo16.c +++ b/dlls/msvideo.dll16/msvideo16.c @@ -981,11 +981,31 @@ BOOL CDECL MCIWndRegisterClass16(void) return MCIWndRegisterClass(); } +static LRESULT (WINAPI *pMCIWndProc)(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); + +static LRESULT WINAPI MCIWndProc16(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case MCIWNDM_SENDSTRINGA: + lparam = (ULONG_PTR)MapSL(lparam); + break; + + default: + break; + } + + return CallWindowProcA(pMCIWndProc, hwnd, msg, wparam, lparam); +} + /*********************************************************************** * MCIWndCreate(MSVIDEO.250) */ -HWND16 CDECL MCIWndCreate16(HWND16 hwnd, HINSTANCE16 hinst16, - DWORD style, LPSTR file) +HWND16 CDECL MCIWndCreate16(HWND16 parent, HINSTANCE16 hinst16, + DWORD style, LPSTR file) { - return HWND_16(MCIWndCreateA(HWND_32(hwnd), 0, style, file)); + HWND hwnd = MCIWndCreateA(HWND_32(parent), 0, style, file); + if (hwnd) + pMCIWndProc = (void *)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (ULONG_PTR)MCIWndProc16); + return HWND_16(hwnd); } From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Hans Leidekker : include: Add missing Web Services declarations. Message-ID: Module: wine Branch: master Commit: dccb4293f3904df6fc11b595e7dc6f804ec48a24 URL: http://source.winehq.org/git/wine.git/?a=commit;h=dccb4293f3904df6fc11b595e7dc6f804ec48a24 Author: Hans Leidekker Date: Fri Sep 11 10:58:54 2015 +0200 include: Add missing Web Services declarations. --- include/webservices.h | 381 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 381 insertions(+) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=dccb4293f3904df6fc11b595e7dc6f804ec48a24 From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Hans Leidekker : webservices: Implement WsCreateError and WsFreeError. Message-ID: Module: wine Branch: master Commit: 60f1b8514e2b0a3a51a88633ec25746db89e67ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=60f1b8514e2b0a3a51a88633ec25746db89e67ae Author: Hans Leidekker Date: Fri Sep 11 10:59:21 2015 +0200 webservices: Implement WsCreateError and WsFreeError. --- dlls/webservices/Makefile.in | 3 +- dlls/webservices/main.c | 10 --- dlls/webservices/reader.c | 142 ++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- 4 files changed, 145 insertions(+), 12 deletions(-) diff --git a/dlls/webservices/Makefile.in b/dlls/webservices/Makefile.in index faac996..e11a2e7 100644 --- a/dlls/webservices/Makefile.in +++ b/dlls/webservices/Makefile.in @@ -2,4 +2,5 @@ MODULE = webservices.dll IMPORTLIB = webservices C_SRCS = \ - main.c + main.c \ + reader.c diff --git a/dlls/webservices/main.c b/dlls/webservices/main.c index e221d57..f99c5cd 100644 --- a/dlls/webservices/main.c +++ b/dlls/webservices/main.c @@ -42,13 +42,3 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) return TRUE; } - -/************************************************************************** - * WsCreateError [webservices.@] - */ -HRESULT WINAPI WsCreateError(const WS_ERROR_PROPERTY *properties, ULONG count, WS_ERROR **error) -{ - FIXME("%p %u %p: stub\n", properties, count, error); - if (error) *error = NULL; - return E_NOTIMPL; -} diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c new file mode 100644 index 0000000..08dae6d --- /dev/null +++ b/dlls/webservices/reader.c @@ -0,0 +1,142 @@ +/* + * Copyright 2015 Hans Leidekker 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 + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "webservices.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(webservices); + +static inline void *heap_alloc( SIZE_T size ) +{ + return HeapAlloc( GetProcessHeap(), 0, size ); +} + +static inline void *heap_alloc_zero( SIZE_T size ) +{ + return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size ); +} + +static inline void *heap_realloc( void *mem, SIZE_T size ) +{ + return HeapReAlloc( GetProcessHeap(), 0, mem, size ); +} + +static inline BOOL heap_free( void *mem ) +{ + return HeapFree( GetProcessHeap(), 0, mem ); +} + +static const struct +{ + ULONG size; + BOOL readonly; +} +error_props[] = +{ + { sizeof(ULONG), TRUE }, /* WS_ERROR_PROPERTY_STRING_COUNT */ + { sizeof(ULONG), FALSE }, /* WS_ERROR_PROPERTY_ORIGINAL_ERROR_CODE */ + { sizeof(LANGID), FALSE } /* WS_ERROR_PROPERTY_LANGID */ +}; + +struct error +{ + ULONG prop_count; + WS_ERROR_PROPERTY prop[sizeof(error_props)/sizeof(error_props[0])]; +}; + +static struct error *alloc_error(void) +{ + static const ULONG count = sizeof(error_props)/sizeof(error_props[0]); + struct error *ret; + ULONG i, size = sizeof(*ret) + count * sizeof(WS_ERROR_PROPERTY); + char *ptr; + + for (i = 0; i < count; i++) size += error_props[i].size; + if (!(ret = heap_alloc_zero( size ))) return NULL; + + ptr = (char *)&ret->prop[count]; + for (i = 0; i < count; i++) + { + ret->prop[i].value = ptr; + ret->prop[i].valueSize = error_props[i].size; + ptr += ret->prop[i].valueSize; + } + ret->prop_count = count; + return ret; +} + +static HRESULT set_error_prop( struct error *error, WS_ERROR_PROPERTY_ID id, const void *value, ULONG size ) +{ + if (id >= error->prop_count || size != error_props[id].size || error_props[id].readonly) + return E_INVALIDARG; + + memcpy( error->prop[id].value, value, size ); + return S_OK; +} + +/************************************************************************** + * WsCreateError [webservices.@] + */ +HRESULT WINAPI WsCreateError( const WS_ERROR_PROPERTY *properties, ULONG count, WS_ERROR **handle ) +{ + struct error *error; + LANGID langid = GetUserDefaultUILanguage(); + HRESULT hr; + ULONG i; + + TRACE( "%p %u %p\n", properties, count, handle ); + + if (!handle) return E_INVALIDARG; + if (!(error = alloc_error())) return E_OUTOFMEMORY; + + set_error_prop( error, WS_ERROR_PROPERTY_LANGID, &langid, sizeof(langid) ); + for (i = 0; i < count; i++) + { + if (properties[i].id == WS_ERROR_PROPERTY_ORIGINAL_ERROR_CODE) + { + heap_free( error ); + return E_INVALIDARG; + } + hr = set_error_prop( error, properties[i].id, properties[i].value, properties[i].valueSize ); + if (hr != S_OK) + { + heap_free( error ); + return hr; + } + } + + *handle = (WS_ERROR *)error; + return S_OK; +} + +/************************************************************************** + * WsFreeError [webservices.@] + */ +void WINAPI WsFreeError( WS_ERROR *handle ) +{ + struct error *error = (struct error *)handle; + + TRACE( "%p\n", handle ); + heap_free( error ); +} diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 386207c..9bf6496 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -49,7 +49,7 @@ @ stub WsFlushBody @ stub WsFlushWriter @ stub WsFreeChannel -@ stub WsFreeError +@ stdcall WsFreeError(ptr) @ stub WsFreeHeap @ stub WsFreeListener @ stub WsFreeMessage From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Hans Leidekker : webservices: Implement WsGetErrorProperty and WsSetErrorProperty. Message-ID: Module: wine Branch: master Commit: a1d2f213925ccfe6af9c5730aad8f384bea44586 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a1d2f213925ccfe6af9c5730aad8f384bea44586 Author: Hans Leidekker Date: Fri Sep 11 10:59:51 2015 +0200 webservices: Implement WsGetErrorProperty and WsSetErrorProperty. --- dlls/webservices/reader.c | 35 +++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 4 ++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 08dae6d..ac7de65 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -95,6 +95,15 @@ static HRESULT set_error_prop( struct error *error, WS_ERROR_PROPERTY_ID id, con return S_OK; } +static HRESULT get_error_prop( struct error *error, WS_ERROR_PROPERTY_ID id, void *buf, ULONG size ) +{ + if (id >= error->prop_count || size != error_props[id].size) + return E_INVALIDARG; + + memcpy( buf, error->prop[id].value, error->prop[id].valueSize ); + return S_OK; +} + /************************************************************************** * WsCreateError [webservices.@] */ @@ -140,3 +149,29 @@ void WINAPI WsFreeError( WS_ERROR *handle ) TRACE( "%p\n", handle ); heap_free( error ); } + +/************************************************************************** + * WsGetErrorProperty [webservices.@] + */ +HRESULT WINAPI WsGetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, void *buf, + ULONG size ) +{ + struct error *error = (struct error *)handle; + + TRACE( "%p %u %p %u\n", handle, id, buf, size ); + return get_error_prop( error, id, buf, size ); +} + +/************************************************************************** + * WsSetErrorProperty [webservices.@] + */ +HRESULT WINAPI WsSetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, const void *value, + ULONG size ) +{ + struct error *error = (struct error *)handle; + + TRACE( "%p %u %p %u\n", handle, id, value, size ); + + if (id == WS_ERROR_PROPERTY_LANGID) return WS_E_INVALID_OPERATION; + return set_error_prop( error, id, value, size ); +} diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 9bf6496..0ff3c0d 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -62,7 +62,7 @@ @ stub WsGetChannelProperty @ stub WsGetCustomHeader @ stub WsGetDictionary -@ stub WsGetErrorProperty +@ stdcall WsGetErrorProperty(ptr long ptr long) @ stub WsGetErrorString @ stub WsGetFaultErrorDetail @ stub WsGetFaultErrorProperty @@ -146,7 +146,7 @@ @ stub WsSendMessage @ stub WsSendReplyMessage @ stub WsSetChannelProperty -@ stub WsSetErrorProperty +@ stdcall WsSetErrorProperty(ptr long ptr long) @ stub WsSetFaultErrorDetail @ stub WsSetFaultErrorProperty @ stub WsSetHeader From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Hans Leidekker : webservices: Add tests. Message-ID: Module: wine Branch: master Commit: 0194595d9ad1c3037a33d102230b0131fca78622 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0194595d9ad1c3037a33d102230b0131fca78622 Author: Hans Leidekker Date: Fri Sep 11 11:00:20 2015 +0200 webservices: Add tests. --- configure | 1 + configure.ac | 1 + dlls/webservices/tests/Makefile.in | 5 ++ dlls/webservices/tests/reader.c | 118 +++++++++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+) diff --git a/configure b/configure index 15a122b..aeec729 100755 --- a/configure +++ b/configure @@ -17823,6 +17823,7 @@ wine_fn_config_test dlls/wbemdisp/tests wbemdisp_test wine_fn_config_dll wbemprox enable_wbemprox clean wine_fn_config_test dlls/wbemprox/tests wbemprox_test wine_fn_config_dll webservices enable_webservices implib +wine_fn_config_test dlls/webservices/tests webservices_test wine_fn_config_dll wer enable_wer implib wine_fn_config_test dlls/wer/tests wer_test wine_fn_config_dll wevtapi enable_wevtapi diff --git a/configure.ac b/configure.ac index aec53f6..ed7030f 100644 --- a/configure.ac +++ b/configure.ac @@ -3375,6 +3375,7 @@ WINE_CONFIG_TEST(dlls/wbemdisp/tests) WINE_CONFIG_DLL(wbemprox,,[clean]) WINE_CONFIG_TEST(dlls/wbemprox/tests) WINE_CONFIG_DLL(webservices,,[implib]) +WINE_CONFIG_TEST(dlls/webservices/tests) WINE_CONFIG_DLL(wer,,[implib]) WINE_CONFIG_TEST(dlls/wer/tests) WINE_CONFIG_DLL(wevtapi) diff --git a/dlls/webservices/tests/Makefile.in b/dlls/webservices/tests/Makefile.in new file mode 100644 index 0000000..d19fdc2 --- /dev/null +++ b/dlls/webservices/tests/Makefile.in @@ -0,0 +1,5 @@ +TESTDLL = webservices.dll +IMPORTS = webservices + +C_SRCS = \ + reader.c diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c new file mode 100644 index 0000000..0db68a0 --- /dev/null +++ b/dlls/webservices/tests/reader.c @@ -0,0 +1,118 @@ +/* + * Copyright 2015 Hans Leidekker 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 + */ + +#include +#include "windows.h" +#include "webservices.h" +#include "wine/test.h" + +static void test_WsCreateError(void) +{ + HRESULT hr; + WS_ERROR *error; + WS_ERROR_PROPERTY prop; + ULONG size, code, count; + LANGID langid; + + hr = WsCreateError( NULL, 0, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + error = NULL; + hr = WsCreateError( NULL, 0, &error ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( error != NULL, "error not set\n" ); + + count = 0xdeadbeef; + size = sizeof(count); + hr = WsGetErrorProperty( error, WS_ERROR_PROPERTY_STRING_COUNT, &count, size ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !count, "got %u\n", count ); + + hr = WsSetErrorProperty( error, WS_ERROR_PROPERTY_STRING_COUNT, &count, size ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + code = 0xdeadbeef; + size = sizeof(code); + hr = WsGetErrorProperty( error, WS_ERROR_PROPERTY_ORIGINAL_ERROR_CODE, &code, size ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !code, "got %u\n", code ); + + code = 0xdeadbeef; + hr = WsSetErrorProperty( error, WS_ERROR_PROPERTY_ORIGINAL_ERROR_CODE, &code, size ); + ok( hr == S_OK, "got %08x\n", hr ); + hr = WsGetErrorProperty( error, WS_ERROR_PROPERTY_ORIGINAL_ERROR_CODE, &code, size ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( code == 0xdeadbeef, "got %u\n", code ); + + langid = 0xdead; + size = sizeof(langid); + hr = WsGetErrorProperty( error, WS_ERROR_PROPERTY_LANGID, &langid, size ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( langid == GetUserDefaultUILanguage(), "got %u\n", langid ); + + langid = MAKELANGID( LANG_DUTCH, SUBLANG_DEFAULT ); + hr = WsSetErrorProperty( error, WS_ERROR_PROPERTY_LANGID, &langid, size ); + ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr ); + + count = 0xdeadbeef; + size = sizeof(count); + hr = WsGetErrorProperty( error, WS_ERROR_PROPERTY_LANGID + 1, &count, size ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + ok( count == 0xdeadbeef, "got %u\n", count ); + WsFreeError( error ); + + count = 1; + prop.id = WS_ERROR_PROPERTY_STRING_COUNT; + prop.value = &count; + prop.valueSize = sizeof(count); + hr = WsCreateError( &prop, 1, &error ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + code = 0xdeadbeef; + prop.id = WS_ERROR_PROPERTY_ORIGINAL_ERROR_CODE; + prop.value = &code; + prop.valueSize = sizeof(code); + hr = WsCreateError( &prop, 1, &error ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + langid = MAKELANGID( LANG_DUTCH, SUBLANG_DEFAULT ); + prop.id = WS_ERROR_PROPERTY_LANGID; + prop.value = &langid; + prop.valueSize = sizeof(langid); + hr = WsCreateError( &prop, 1, &error ); + ok( hr == S_OK, "got %08x\n", hr ); + + langid = 0xdead; + size = sizeof(langid); + hr = WsGetErrorProperty( error, WS_ERROR_PROPERTY_LANGID, &langid, size ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( langid == MAKELANGID( LANG_DUTCH, SUBLANG_DEFAULT ), "got %u\n", langid ); + WsFreeError( error ); + + count = 0xdeadbeef; + prop.id = WS_ERROR_PROPERTY_LANGID + 1; + prop.value = &count; + prop.valueSize = sizeof(count); + hr = WsCreateError( &prop, 1, &error ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); +} + +START_TEST(reader) +{ + test_WsCreateError(); +} From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Hans Leidekker : advapi32/tests: Avoid more test failures. Message-ID: Module: wine Branch: master Commit: a5b4ed75cf77c42313c691ba8f415f3a6e2c48d4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5b4ed75cf77c42313c691ba8f415f3a6e2c48d4 Author: Hans Leidekker Date: Fri Sep 11 10:58:33 2015 +0200 advapi32/tests: Avoid more test failures. --- dlls/advapi32/tests/security.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index ae9dd92..a5c98df 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -3789,7 +3789,8 @@ static void test_GetNamedSecurityInfoA(void) ok(bret, "Failed to get Builtin Admins ACE.\n"); flags = ((ACE_HEADER *)ace)->AceFlags; ok(flags == 0x0 - || broken(flags == (INHERIT_ONLY_ACE|CONTAINER_INHERIT_ACE|INHERITED_ACE)) /* w2k8 */, + || broken(flags == (INHERIT_ONLY_ACE|CONTAINER_INHERIT_ACE|INHERITED_ACE)) /* w2k8 */ + || broken(flags == (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE)), /* win7 */ "Builtin Admins ACE has unexpected flags (0x%x != 0x0)\n", flags); ok(ace->Mask == KEY_ALL_ACCESS || broken(ace->Mask == GENERIC_ALL) /* w2k8 */, "Builtin Admins ACE has unexpected mask (0x%x != 0x%x)\n", ace->Mask, KEY_ALL_ACCESS); @@ -5884,13 +5885,13 @@ static void test_system_security_access(void) /* ACCESS_SYSTEM_SECURITY requires special privilege */ res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ|ACCESS_SYSTEM_SECURITY, NULL, &hkey, NULL ); - todo_wine ok( res == ERROR_PRIVILEGE_NOT_HELD, "got %d\n", res ); if (res == ERROR_ACCESS_DENIED) { skip( "unprivileged user\n" ); CloseHandle( token ); return; } + todo_wine ok( res == ERROR_PRIVILEGE_NOT_HELD, "got %d\n", res ); priv.PrivilegeCount = 1; priv.Privileges[0].Luid = luid; @@ -5901,7 +5902,6 @@ static void test_system_security_access(void) ok( ret, "got %u\n", GetLastError()); res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ|ACCESS_SYSTEM_SECURITY, NULL, &hkey, NULL ); - ok( !res, "got %d\n", res ); if (res == ERROR_PRIVILEGE_NOT_HELD) { win_skip( "privilege not held\n" ); @@ -5909,6 +5909,7 @@ static void test_system_security_access(void) CloseHandle( token ); return; } + ok( !res, "got %d\n", res ); /* restore privileges */ ret = AdjustTokenPrivileges( token, FALSE, priv_prev, 0, NULL, NULL ); From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Aric Stewart : hidclass.sys: Add Plug-and-play and AddDevice. Message-ID: Module: wine Branch: master Commit: 43888392fac7d926ddcad13298cbb4ef74108482 URL: http://source.winehq.org/git/wine.git/?a=commit;h=43888392fac7d926ddcad13298cbb4ef74108482 Author: Aric Stewart Date: Wed Sep 9 10:20:11 2015 -0500 hidclass.sys: Add Plug-and-play and AddDevice. --- dlls/hidclass.sys/Makefile.in | 3 +- dlls/hidclass.sys/hid.h | 11 ++++ dlls/hidclass.sys/main.c | 50 ++++++++++++++- dlls/hidclass.sys/pnp.c | 146 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 208 insertions(+), 2 deletions(-) diff --git a/dlls/hidclass.sys/Makefile.in b/dlls/hidclass.sys/Makefile.in index 6b474f6..c5c9eb7 100644 --- a/dlls/hidclass.sys/Makefile.in +++ b/dlls/hidclass.sys/Makefile.in @@ -5,4 +5,5 @@ DELAYIMPORTS = setupapi hid C_SRCS = \ device.c \ - main.c + main.c \ + pnp.c diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index 7114312..efa4712 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -33,6 +33,8 @@ #define DEFAULT_POLL_INTERVAL 200 #define MAX_POLL_INTERVAL_MSEC 10000 +typedef NTSTATUS (WINAPI *pAddDevice)(DRIVER_OBJECT *DriverObject, DEVICE_OBJECT *PhysicalDeviceObject); + typedef struct _BASE_DEVICE_EXTENSTION { HID_DEVICE_EXTENSION deviceExtension; @@ -57,9 +59,18 @@ typedef struct _minidriver HID_MINIDRIVER_REGISTRATION minidriver; PDRIVER_UNLOAD DriverUnload; + + pAddDevice AddDevice; } minidriver; +NTSTATUS call_minidriver(ULONG code, DEVICE_OBJECT *device, void *in_buff, ULONG in_size, void *out_buff, ULONG out_size) DECLSPEC_HIDDEN; +minidriver* find_minidriver(DRIVER_OBJECT* driver) DECLSPEC_HIDDEN; + /* Internal device functions */ NTSTATUS HID_CreateDevice(DEVICE_OBJECT *native_device, HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT **device) DECLSPEC_HIDDEN; NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device, LPCWSTR serial, LPCWSTR index) DECLSPEC_HIDDEN; void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device) DECLSPEC_HIDDEN; + +/* Pseudo-Plug and Play support*/ +NTSTATUS WINAPI PNP_AddDevice(DRIVER_OBJECT *driver, DEVICE_OBJECT* PDO) DECLSPEC_HIDDEN; +void PNP_CleanupPNP(DRIVER_OBJECT *driver) DECLSPEC_HIDDEN; diff --git a/dlls/hidclass.sys/main.c b/dlls/hidclass.sys/main.c index e4844862..a58d9834 100644 --- a/dlls/hidclass.sys/main.c +++ b/dlls/hidclass.sys/main.c @@ -30,7 +30,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(hid); static struct list minidriver_list = LIST_INIT(minidriver_list); -static minidriver* find_minidriver(DRIVER_OBJECT *driver) +minidriver* find_minidriver(DRIVER_OBJECT *driver) { minidriver *md; LIST_FOR_EACH_ENTRY(md, &minidriver_list, minidriver, entry) @@ -51,6 +51,7 @@ static VOID WINAPI UnloadDriver(DRIVER_OBJECT *driver) { if (md->DriverUnload) md->DriverUnload(md->minidriver.DriverObject); + PNP_CleanupPNP(md->minidriver.DriverObject); list_remove(&md->entry); HeapFree( GetProcessHeap(), 0, md ); } @@ -67,8 +68,55 @@ NTSTATUS WINAPI HidRegisterMinidriver(HID_MINIDRIVER_REGISTRATION *registration) driver->DriverUnload = registration->DriverObject->DriverUnload; registration->DriverObject->DriverUnload = UnloadDriver; + driver->AddDevice = registration->DriverObject->DriverExtension->AddDevice; + registration->DriverObject->DriverExtension->AddDevice = PNP_AddDevice; + driver->minidriver = *registration; list_add_tail(&minidriver_list, &driver->entry); return STATUS_SUCCESS; } + +static NTSTATUS WINAPI internalComplete(DEVICE_OBJECT *deviceObject, IRP *irp, + void *context ) +{ + SetEvent(irp->UserEvent); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS call_minidriver(ULONG code, DEVICE_OBJECT *device, void *in_buff, ULONG in_size, void *out_buff, ULONG out_size) +{ + IRP *irp; + IO_STATUS_BLOCK irp_status; + IO_STACK_LOCATION *irpsp; + NTSTATUS status; + void *buffer = NULL; + + HANDLE event = CreateEventA(NULL, FALSE, FALSE, NULL); + + if (out_size) + { + buffer = HeapAlloc(GetProcessHeap(), 0, out_size); + memcpy(buffer, out_buff, out_size); + } + + irp = IoBuildDeviceIoControlRequest(code, device, in_buff, in_size, + buffer, out_size, TRUE, event, &irp_status); + + irpsp = IoGetNextIrpStackLocation(irp); + irpsp->CompletionRoutine = internalComplete; + irpsp->Control = SL_INVOKE_ON_SUCCESS | SL_INVOKE_ON_ERROR; + + IoCallDriver(device, irp); + + if (irp->IoStatus.u.Status == STATUS_PENDING) + WaitForSingleObject(event, INFINITE); + + memcpy(out_buff, buffer, out_size); + status = irp->IoStatus.u.Status; + + IoCompleteRequest(irp, IO_NO_INCREMENT ); + CloseHandle(event); + + return status; +} diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c new file mode 100644 index 0000000..0fb06a2 --- /dev/null +++ b/dlls/hidclass.sys/pnp.c @@ -0,0 +1,146 @@ +/* + * WINE HID Pseudo-Plug and Play support + * + * Copyright 2015 Aric Stewart + * + * 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 NONAMELESSUNION +#include +#include +#include "hid.h" +#include "ddk/hidtypes.h" +#include "wine/debug.h" +#include "wine/unicode.h" +#include "wine/list.h" + +WINE_DEFAULT_DEBUG_CHANNEL(hid); + +typedef struct _NATIVE_DEVICE { + struct list entry; + + DWORD vidpid; + DEVICE_OBJECT *PDO; + DEVICE_OBJECT *FDO; + HID_MINIDRIVER_REGISTRATION *minidriver; + +} NATIVE_DEVICE; + +static struct list tracked_devices = LIST_INIT(tracked_devices); + +NTSTATUS WINAPI PNP_AddDevice(DRIVER_OBJECT *driver, DEVICE_OBJECT *PDO) +{ + DEVICE_OBJECT *device = NULL; + NTSTATUS status; + minidriver *minidriver; + HID_DEVICE_ATTRIBUTES attr; + BASE_DEVICE_EXTENSION *ext = NULL; + WCHAR serial[256]; + WCHAR interface[256]; + DWORD index = HID_STRING_ID_ISERIALNUMBER; + NATIVE_DEVICE *tracked_device, *ptr; + INT interface_index = 1; + + static const WCHAR ig_fmtW[] = {'I','G','_','%','i',0}; + static const WCHAR im_fmtW[] = {'I','M','_','%','i',0}; + + + TRACE("PDO add device(%p)\n", PDO); + minidriver = find_minidriver(driver); + + status = HID_CreateDevice(PDO, &minidriver->minidriver, &device); + if (status != STATUS_SUCCESS) + { + ERR("Failed to create HID object (%x)\n",status); + return status; + } + + TRACE("Created device %p\n",device); + status = minidriver->AddDevice(minidriver->minidriver.DriverObject, device); + if (status != STATUS_SUCCESS) + { + ERR("Minidriver AddDevice failed (%x)\n",status); + HID_DeleteDevice(&minidriver->minidriver, device); + return status; + } + + status = call_minidriver(IOCTL_HID_GET_DEVICE_ATTRIBUTES, device, + NULL, 0, &attr, sizeof(attr)); + + if (status != STATUS_SUCCESS) + { + ERR("Minidriver failed to get Attributes(%x)\n",status); + HID_DeleteDevice(&minidriver->minidriver, device); + return status; + } + + ext = device->DeviceExtension; + ext->information.VendorID = attr.VendorID; + ext->information.ProductID = attr.ProductID; + ext->information.VersionNumber = attr.VersionNumber; + ext->information.Polled = minidriver->minidriver.DevicesArePolled; + + tracked_device = HeapAlloc(GetProcessHeap(), 0, sizeof(*tracked_device)); + tracked_device->vidpid = MAKELONG(attr.VendorID, attr.ProductID); + tracked_device->PDO = PDO; + tracked_device->FDO = device; + tracked_device->minidriver = &minidriver->minidriver; + + LIST_FOR_EACH_ENTRY(ptr, &tracked_devices, NATIVE_DEVICE, entry) + if (ptr->vidpid == tracked_device->vidpid) interface_index++; + + list_add_tail(&tracked_devices, &tracked_device->entry); + + serial[0] = 0; + status = call_minidriver(IOCTL_HID_GET_STRING, device, + &index, sizeof(DWORD), serial, sizeof(serial)); + + if (serial[0] == 0) + { + static const WCHAR wZeroSerial[]= {'0','0','0','0',0}; + lstrcpyW(serial, wZeroSerial); + } + + if (ext->preparseData->caps.UsagePage == HID_USAGE_PAGE_GENERIC && + (ext->preparseData->caps.Usage == HID_USAGE_GENERIC_GAMEPAD || + ext->preparseData->caps.Usage == HID_USAGE_GENERIC_JOYSTICK)) + sprintfW(interface, ig_fmtW, interface_index); + else + sprintfW(interface, im_fmtW, interface_index); + + HID_LinkDevice(device, serial, interface); + + ext->poll_interval = DEFAULT_POLL_INTERVAL; + InitializeListHead(&ext->irp_queue); + + return STATUS_SUCCESS; +} + +void PNP_CleanupPNP(DRIVER_OBJECT *driver) +{ + NATIVE_DEVICE *tracked_device, *ptr; + + LIST_FOR_EACH_ENTRY_SAFE(tracked_device, ptr, &tracked_devices, + NATIVE_DEVICE, entry) + { + if (tracked_device->minidriver->DriverObject == driver) + { + list_remove(&tracked_device->entry); + HID_DeleteDevice(tracked_device->minidriver, tracked_device->FDO); + HeapFree(GetProcessHeap(), 0, tracked_device); + } + } +} From julliard at wine.codeweavers.com Fri Sep 11 08:02:19 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 11 Sep 2015 08:02:19 -0500 Subject: Nikolay Sivov : libwine: Fix double byte default char initialization. Message-ID: Module: wine Branch: master Commit: a7e294c064ac443a4351d1cbe84e7f52e0775d6f URL: http://source.winehq.org/git/wine.git/?a=commit;h=a7e294c064ac443a4351d1cbe84e7f52e0775d6f Author: Nikolay Sivov Date: Tue Sep 8 23:45:20 2015 +0300 libwine: Fix double byte default char initialization. --- dlls/kernel32/tests/codepage.c | 9 ++++++++- libs/wine/wctomb.c | 16 +++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c index 71bedb7..54f62ae 100644 --- a/dlls/kernel32/tests/codepage.c +++ b/dlls/kernel32/tests/codepage.c @@ -276,12 +276,14 @@ static void test_overlapped_buffers(void) static void test_string_conversion(LPBOOL bUsedDefaultChar) { char mbc; - char mbs[5]; + char mbs[15]; int ret; WCHAR wc1 = 228; /* Western Windows-1252 character */ WCHAR wc2 = 1088; /* Russian Windows-1251 character not displayable for Windows-1252 */ static const WCHAR wcs[] = {'T', 'h', 1088, 'i', 0}; /* String with ASCII characters and a Russian character */ static const WCHAR dbwcs[] = {28953, 25152, 0}; /* String with Chinese (codepage 950) characters */ + static const WCHAR dbwcs2[] = {0x7bb8, 0x3d, 0xc813, 0xac00, 0xb77d, 0}; + static const char default_char[] = {0xa3, 0xbf, 0}; SetLastError(0xdeadbeef); ret = WideCharToMultiByte(1252, 0, &wc1, 1, &mbc, 1, NULL, bUsedDefaultChar); @@ -358,6 +360,11 @@ static void test_string_conversion(LPBOOL bUsedDefaultChar) ok(!strcmp(mbs, "??"), "mbs is %s\n", mbs); if(bUsedDefaultChar) ok(*bUsedDefaultChar == TRUE, "bUsedDefaultChar is %d\n", *bUsedDefaultChar); + ret = WideCharToMultiByte(936, WC_COMPOSITECHECK, dbwcs2, -1, mbs, sizeof(mbs), (const char *)default_char, bUsedDefaultChar); + ok(ret == 10, "ret is %d\n", ret); + ok(!strcmp(mbs, "\xf3\xe7\x3d\xa3\xbf\xa3\xbf\xa3\xbf"), "mbs is %s\n", mbs); + if(bUsedDefaultChar) ok(*bUsedDefaultChar == TRUE, "bUsedDefaultChar is %d\n", *bUsedDefaultChar); + /* Length-only tests */ SetLastError(0xdeadbeef); ret = WideCharToMultiByte(1252, 0, &wc2, 1, NULL, 0, NULL, bUsedDefaultChar); diff --git a/libs/wine/wctomb.c b/libs/wine/wctomb.c index 3b081d4..29a3d92 100644 --- a/libs/wine/wctomb.c +++ b/libs/wine/wctomb.c @@ -275,6 +275,14 @@ static inline int is_valid_dbcs_mapping( const struct dbcs_table *table, int fla return 1; } +/* compute the default char for the dbcs case */ +static inline WCHAR get_defchar_dbcs( const struct dbcs_table *table, const char *defchar ) +{ + if (!defchar) return table->info.def_char; + if (!defchar[1]) return (unsigned char)defchar[0]; + return ((unsigned char)defchar[0] << 8) | (unsigned char)defchar[1]; +} + /* query necessary dst length for src string */ static int get_length_dbcs( const struct dbcs_table *table, int flags, const WCHAR *src, unsigned int srclen, @@ -282,8 +290,7 @@ static int get_length_dbcs( const struct dbcs_table *table, int flags, { const unsigned short * const uni2cp_low = table->uni2cp_low; const unsigned short * const uni2cp_high = table->uni2cp_high; - WCHAR defchar_value = table->info.def_char; - WCHAR composed; + WCHAR defchar_value, composed; int len, tmp; if (!defchar && !used && !(flags & WC_COMPOSITECHECK)) @@ -295,7 +302,7 @@ static int get_length_dbcs( const struct dbcs_table *table, int flags, return len; } - if (defchar) defchar_value = defchar[1] ? ((defchar[0] << 8) | defchar[1]) : defchar[0]; + defchar_value = get_defchar_dbcs( table, defchar ); if (!used) used = &tmp; /* avoid checking on every char */ *used = 0; for (len = 0; srclen; len++, srclen--, src++) @@ -376,11 +383,10 @@ static int wcstombs_dbcs_slow( const struct dbcs_table *table, int flags, { const unsigned short * const uni2cp_low = table->uni2cp_low; const unsigned short * const uni2cp_high = table->uni2cp_high; - WCHAR defchar_value = table->info.def_char; + WCHAR defchar_value = get_defchar_dbcs( table, defchar ); WCHAR composed; int len, tmp; - if (defchar) defchar_value = defchar[1] ? ((defchar[0] << 8) | defchar[1]) : defchar[0]; if (!used) used = &tmp; /* avoid checking on every char */ *used = 0; From julliard at wine.codeweavers.com Mon Sep 14 09:41:57 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:41:57 -0500 Subject: Francois Gouget : dissect: Raise the new platforms' failed tests limit so they get a chance to improve. Message-ID: Module: tools Branch: master Commit: f108c92f2cf6c03737f42d955cb7deea49f529ad URL: http://source.winehq.org/git/tools.git/?a=commit;h=f108c92f2cf6c03737f42d955cb7deea49f529ad Author: Francois Gouget Date: Sun Sep 13 15:56:28 2015 +0200 dissect: Raise the new platforms' failed tests limit so they get a chance to improve. New platforms typically have so many test failures that their results are ignored. But developers cannot fix test failures they are not aware of, resulting in slow progress. So temporarily cut some slack to the new platforms. --- winetest/dissect | 2 ++ 1 file changed, 2 insertions(+) diff --git a/winetest/dissect b/winetest/dissect index 7a40234..067fa7b 100755 --- a/winetest/dissect +++ b/winetest/dissect @@ -216,6 +216,8 @@ if ($plid==1 && $major==4) { } elsif ($plid==3) { #$version = "ce$major$minor"; } +# Give a little slack to the new platforms. +$maxfailedtests += 20 if ($version eq "win8" || $version eq "win10"); if ($prediluvian and not $acceptprediluvianwin) { mydie "platform $version not accepted\n"; } From julliard at wine.codeweavers.com Mon Sep 14 09:44:33 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:33 -0500 Subject: Alexandre Julliard : include: Avoid some type redefinitions. Message-ID: Module: wine Branch: master Commit: b30517defd743f4295eaada3a7eabe98f31a395a URL: http://source.winehq.org/git/wine.git/?a=commit;h=b30517defd743f4295eaada3a7eabe98f31a395a Author: Alexandre Julliard Date: Mon Sep 14 16:19:14 2015 +0900 include: Avoid some type redefinitions. --- include/webservices.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/include/webservices.h b/include/webservices.h index 744bee4..0a8b206 100644 --- a/include/webservices.h +++ b/include/webservices.h @@ -25,10 +25,11 @@ extern "C" { typedef struct _WS_ERROR WS_ERROR; typedef struct _WS_HEAP WS_HEAP; -typedef struct _WS_STRUCT_DESCRIPTION WS_STRUCT_DESCRIPTION; typedef struct _WS_XML_BUFFER WS_XML_BUFFER; typedef struct _WS_XML_READER WS_XML_READER; -typedef struct _WS_XML_STRING WS_XML_STRING; + +struct _WS_STRUCT_DESCRIPTION; +struct _WS_XML_STRING; typedef enum { WS_ERROR_PROPERTY_STRING_COUNT, @@ -140,10 +141,10 @@ typedef struct _WS_XML_READER_STREAM_INPUT { } WS_XML_READER_STREAM_INPUT; typedef struct _WS_XML_DICTIONARY { - GUID guid; - WS_XML_STRING *strings; - ULONG stringCount; - BOOL isConst; + GUID guid; + struct _WS_XML_STRING *strings; + ULONG stringCount; + BOOL isConst; } WS_XML_DICTIONARY; typedef struct _WS_XML_STRING { @@ -254,8 +255,8 @@ typedef struct _WS_STRUCT_DESCRIPTION { ULONG fieldCount; WS_XML_STRING *typeLocalName; WS_XML_STRING *typeNs; - WS_STRUCT_DESCRIPTION *parentType; - WS_STRUCT_DESCRIPTION **subTypes; + struct _WS_STRUCT_DESCRIPTION *parentType; + struct _WS_STRUCT_DESCRIPTION **subTypes; ULONG subTypeCount; ULONG structOptions; } WS_STRUCT_DESCRIPTION; From julliard at wine.codeweavers.com Mon Sep 14 09:44:33 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:33 -0500 Subject: Piotr Caban : msi/tests: Fix MsiProvideQualifiedComponent test failure. Message-ID: Module: wine Branch: master Commit: f326e372d113332cb238584350b11702ec0b28a5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f326e372d113332cb238584350b11702ec0b28a5 Author: Piotr Caban Date: Fri Sep 11 16:33:33 2015 +0200 msi/tests: Fix MsiProvideQualifiedComponent test failure. --- dlls/msi/tests/action.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dlls/msi/tests/action.c b/dlls/msi/tests/action.c index 2aa5b0b..05e3b1e 100644 --- a/dlls/msi/tests/action.c +++ b/dlls/msi/tests/action.c @@ -5902,9 +5902,8 @@ static void test_publish_components(void) res = RegDeleteKeyA(HKEY_CURRENT_USER, keypath); ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath2, &key); - ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res); - + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath2, 0, NULL, REG_OPTION_NON_VOLATILE, + MAXIMUM_ALLOWED | KEY_WOW64_64KEY, NULL, &key, NULL ); res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size); ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res); RegCloseKey(key); @@ -5914,7 +5913,10 @@ static void test_publish_components(void) "english.txt", INSTALLMODE_DEFAULT, NULL, &size); ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r); - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, keypath2); + if (pRegDeleteKeyExA) + res = pRegDeleteKeyExA(HKEY_LOCAL_MACHINE, keypath2, KEY_WOW64_64KEY, 0); + else + res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, keypath2); ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res); res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &key); From julliard at wine.codeweavers.com Mon Sep 14 09:44:33 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:33 -0500 Subject: Andrew Eikum : xaudio2: Don' t keep running after master voice is destroyed. Message-ID: Module: wine Branch: master Commit: 4c8ed8d104bcdb6cb71bc9a73d1d7dd6e9a2f6bc URL: http://source.winehq.org/git/wine.git/?a=commit;h=4c8ed8d104bcdb6cb71bc9a73d1d7dd6e9a2f6bc Author: Andrew Eikum Date: Fri Sep 11 10:55:50 2015 -0500 xaudio2: Don't keep running after master voice is destroyed. --- dlls/xaudio2_7/xaudio_dll.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index 739c919..ce7a15b 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -1188,6 +1188,8 @@ static void WINAPI XA2M_DestroyVoice(IXAudio2MasteringVoice *iface) return; } + This->running = FALSE; + IAudioRenderClient_Release(This->render); This->render = NULL; @@ -3068,11 +3070,13 @@ static DWORD WINAPI engine_threadproc(void *arg) if(This->stop_engine) break; - if(!This->running) - continue; - EnterCriticalSection(&This->lock); + if(!This->running || !This->aclient){ + LeaveCriticalSection(&This->lock); + continue; + } + do_engine_tick(This); LeaveCriticalSection(&This->lock); From julliard at wine.codeweavers.com Mon Sep 14 09:44:33 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:33 -0500 Subject: Andrew Eikum : xaudio2: Quiet down some noisy stubs. Message-ID: Module: wine Branch: master Commit: 031af2ca9aa82ac4cd2c9222b4d37e7c1a137973 URL: http://source.winehq.org/git/wine.git/?a=commit;h=031af2ca9aa82ac4cd2c9222b4d37e7c1a137973 Author: Andrew Eikum Date: Fri Sep 11 10:55:55 2015 -0500 xaudio2: Quiet down some noisy stubs. --- dlls/xaudio2_7/xaudio_dll.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index ce7a15b..e68f1b6 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -1964,7 +1964,7 @@ static HRESULT WINAPI IXAudio2Impl_CommitChanges(IXAudio2 *iface, { IXAudio2Impl *This = impl_from_IXAudio2(iface); - FIXME("(%p)->(0x%x): stub!\n", This, operationSet); + TRACE("(%p)->(0x%x): stub!\n", This, operationSet); return E_NOTIMPL; } @@ -1974,7 +1974,7 @@ static void WINAPI IXAudio2Impl_GetPerformanceData(IXAudio2 *iface, { IXAudio2Impl *This = impl_from_IXAudio2(iface); - FIXME("(%p)->(%p): stub!\n", This, pPerfData); + TRACE("(%p)->(%p): stub!\n", This, pPerfData); memset(pPerfData, 0, sizeof(*pPerfData)); } From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Andrew Eikum : xaudio2: Support looping buffers. Message-ID: Module: wine Branch: master Commit: c28bfbc5b274e9009060fafa6ffaab7375c46014 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c28bfbc5b274e9009060fafa6ffaab7375c46014 Author: Andrew Eikum Date: Fri Sep 11 10:55:58 2015 -0500 xaudio2: Support looping buffers. Also shorten up the test runtime. --- dlls/xaudio2_7/tests/xaudio2.c | 265 ++++++++++++++++++++++++++++++++++++++++- dlls/xaudio2_7/xaudio_dll.c | 132 ++++++++++++++++++-- 2 files changed, 382 insertions(+), 15 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=c28bfbc5b274e9009060fafa6ffaab7375c46014 From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Vincent Povirk : comdlg32: Fix ignored out parameter. Message-ID: Module: wine Branch: master Commit: bbe009778ef8894bf70a5dacd6def04bbcb85477 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbe009778ef8894bf70a5dacd6def04bbcb85477 Author: Vincent Povirk Date: Fri Sep 11 11:17:52 2015 -0500 comdlg32: Fix ignored out parameter. --- dlls/comdlg32/itemdlg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/comdlg32/itemdlg.c b/dlls/comdlg32/itemdlg.c index 8a52d71..c8340df 100644 --- a/dlls/comdlg32/itemdlg.c +++ b/dlls/comdlg32/itemdlg.c @@ -804,6 +804,8 @@ static HRESULT add_item(customctrl* parent, DWORD itemid, LPCWSTR label, cctrl_i item->cdcstate = CDCS_VISIBLE|CDCS_ENABLED; list_add_tail(&parent->sub_items, &item->entry); + *result = item; + return S_OK; } From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Vincent Povirk : comdlg32: Remove fixme from EnableOpenDropDown. Message-ID: Module: wine Branch: master Commit: 3fc57e7b49a97816344d9706eec4b85550b88892 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3fc57e7b49a97816344d9706eec4b85550b88892 Author: Vincent Povirk Date: Wed Sep 9 14:18:33 2015 -0500 comdlg32: Remove fixme from EnableOpenDropDown. --- dlls/comdlg32/itemdlg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/comdlg32/itemdlg.c b/dlls/comdlg32/itemdlg.c index c8340df..e9d72cb 100644 --- a/dlls/comdlg32/itemdlg.c +++ b/dlls/comdlg32/itemdlg.c @@ -3582,7 +3582,7 @@ static HRESULT WINAPI IFileDialogCustomize_fnEnableOpenDropDown(IFileDialogCusto { FileDialogImpl *This = impl_from_IFileDialogCustomize(iface); MENUINFO mi; - FIXME("semi-stub - %p (%d)\n", This, dwIDCtl); + TRACE("%p (%d)\n", This, dwIDCtl); if (This->hmenu_opendropdown || get_cctrl(This, dwIDCtl)) return E_UNEXPECTED; From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Vincent Povirk : comdlg32: Return success from IFileDialog2::AddPlace. Message-ID: Module: wine Branch: master Commit: 4270a8a4dc55e2f99b5d1c721bdfbc778cf9e5f0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4270a8a4dc55e2f99b5d1c721bdfbc778cf9e5f0 Author: Vincent Povirk Date: Wed Sep 9 14:23:55 2015 -0500 comdlg32: Return success from IFileDialog2::AddPlace. --- dlls/comdlg32/itemdlg.c | 2 +- dlls/comdlg32/tests/itemdlg.c | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/dlls/comdlg32/itemdlg.c b/dlls/comdlg32/itemdlg.c index e9d72cb..8ca3064 100644 --- a/dlls/comdlg32/itemdlg.c +++ b/dlls/comdlg32/itemdlg.c @@ -2554,7 +2554,7 @@ static HRESULT WINAPI IFileDialog2_fnAddPlace(IFileDialog2 *iface, IShellItem *p { FileDialogImpl *This = impl_from_IFileDialog2(iface); FIXME("stub - %p (%p, %d)\n", This, psi, fdap); - return E_NOTIMPL; + return S_OK; } static HRESULT WINAPI IFileDialog2_fnSetDefaultExtension(IFileDialog2 *iface, LPCWSTR pszDefaultExtension) diff --git a/dlls/comdlg32/tests/itemdlg.c b/dlls/comdlg32/tests/itemdlg.c index 5d8e410..45e9776 100644 --- a/dlls/comdlg32/tests/itemdlg.c +++ b/dlls/comdlg32/tests/itemdlg.c @@ -778,22 +778,19 @@ static void test_basics(void) IFileSaveDialog_AddPlace(pfsd, NULL, 0); } - todo_wine - { hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_TOP + 1); - ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + todo_wine ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_BOTTOM); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_TOP); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_TOP + 1); - ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + todo_wine ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_BOTTOM); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_TOP); ok(hr == S_OK, "got 0x%08x\n", hr); - } /* SetFileName */ hr = IFileOpenDialog_SetFileName(pfod, NULL); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Vincent Povirk : comdlg32: Return success from IFileDialogCustomize:: MakeProminent. Message-ID: Module: wine Branch: master Commit: 9068f2d10cac2b95ae1e983a8171b20cc39878d8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9068f2d10cac2b95ae1e983a8171b20cc39878d8 Author: Vincent Povirk Date: Wed Sep 9 14:24:13 2015 -0500 comdlg32: Return success from IFileDialogCustomize::MakeProminent. --- dlls/comdlg32/itemdlg.c | 2 +- dlls/comdlg32/tests/itemdlg.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/comdlg32/itemdlg.c b/dlls/comdlg32/itemdlg.c index 8ca3064..aa42bf3 100644 --- a/dlls/comdlg32/itemdlg.c +++ b/dlls/comdlg32/itemdlg.c @@ -4302,7 +4302,7 @@ static HRESULT WINAPI IFileDialogCustomize_fnMakeProminent(IFileDialogCustomize { FileDialogImpl *This = impl_from_IFileDialogCustomize(iface); FIXME("stub - %p (%d)\n", This, dwIDCtl); - return E_NOTIMPL; + return S_OK; } static HRESULT WINAPI IFileDialogCustomize_fnSetControlItemText(IFileDialogCustomize *iface, diff --git a/dlls/comdlg32/tests/itemdlg.c b/dlls/comdlg32/tests/itemdlg.c index 45e9776..4649620 100644 --- a/dlls/comdlg32/tests/itemdlg.c +++ b/dlls/comdlg32/tests/itemdlg.c @@ -2233,7 +2233,7 @@ static void test_customize(void) ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate); hr = IFileDialogCustomize_MakeProminent(pfdc, id_vgroup1); - todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr); + ok(hr == S_OK, "got 0x%08x.\n", hr); IFileDialogCustomize_Release(pfdc); ref = IFileDialog_Release(pfod); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Vincent Povirk : comdlg32: Implement radio button lists in item dialog. Message-ID: Module: wine Branch: master Commit: 34d57e3621e08360b9d9306b15d55426cbad2cdf URL: http://source.winehq.org/git/wine.git/?a=commit;h=34d57e3621e08360b9d9306b15d55426cbad2cdf Author: Vincent Povirk Date: Thu Sep 10 10:22:11 2015 -0500 comdlg32: Implement radio button lists in item dialog. --- dlls/comdlg32/itemdlg.c | 223 +++++++++++++++++++++++++++++++++++++++++- dlls/comdlg32/tests/itemdlg.c | 24 +++-- 2 files changed, 232 insertions(+), 15 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=34d57e3621e08360b9d9306b15d55426cbad2cdf From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Bruno Jesus : quartz: Avoid audio header test code duplication. Message-ID: Module: wine Branch: master Commit: 66694cc043a86c4d2a3d96f390b22b4d18e60d39 URL: http://source.winehq.org/git/wine.git/?a=commit;h=66694cc043a86c4d2a3d96f390b22b4d18e60d39 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Sat Sep 12 17:16:44 2015 +0800 quartz: Avoid audio header test code duplication. The function MPEGSplitter_head_check does exactly the same test. --- dlls/quartz/mpegsplit.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c index 1ed352b..273c77c 100644 --- a/dlls/quartz/mpegsplit.c +++ b/dlls/quartz/mpegsplit.c @@ -114,9 +114,7 @@ static HRESULT parse_header(BYTE *header, LONGLONG *plen, LONGLONG *pduration) int bitrate_index, freq_index, lsf = 1, mpeg1, layer, padding, bitrate, length; LONGLONG duration; - if (!(header[0] == 0xff && ((header[1]>>5)&0x7) == 0x7 && - ((header[1]>>1)&0x3) != 0 && ((header[2]>>4)&0xf) != 0xf && - ((header[2]>>2)&0x3) != 0x3)) + if (MPEGSplitter_head_check(header) != MPEG_AUDIO_HEADER) { FIXME("Not a valid header: %02x:%02x:%02x:%02x\n", header[0], header[1], header[2], header[3]); return E_INVALIDARG; From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Gerald Pfeifer : netapi32: Avoid shift overflow for GENERIC_READ_ACCESS and friends. friends. Message-ID: Module: wine Branch: master Commit: a818d5cab2ebb7ff58b0aaf2ad39aa5374f40f22 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a818d5cab2ebb7ff58b0aaf2ad39aa5374f40f22 Author: Gerald Pfeifer Date: Fri Sep 11 21:31:12 2015 +0200 netapi32: Avoid shift overflow for GENERIC_READ_ACCESS and friends. friends. --- dlls/netapi32/netapi32.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c index d7af2e0..bb61e7f 100644 --- a/dlls/netapi32/netapi32.c +++ b/dlls/netapi32/netapi32.c @@ -506,10 +506,10 @@ static unsigned char ace_flags_to_samba( BYTE flags ) return ret; } -#define GENERIC_ALL_ACCESS (1 << 28) -#define GENERIC_EXECUTE_ACCESS (1 << 29) -#define GENERIC_WRITE_ACCESS (1 << 30) -#define GENERIC_READ_ACCESS (1 << 31) +#define GENERIC_ALL_ACCESS (1u << 28) +#define GENERIC_EXECUTE_ACCESS (1u << 29) +#define GENERIC_WRITE_ACCESS (1u << 30) +#define GENERIC_READ_ACCESS (1u << 31) static unsigned int access_mask_to_samba( DWORD mask ) { From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Piotr Caban : msvcrt/tests: Fix tolower test failures. Message-ID: Module: wine Branch: master Commit: b408b5a9a47159a8d7a424e59fabd471f68b61ff URL: http://source.winehq.org/git/wine.git/?a=commit;h=b408b5a9a47159a8d7a424e59fabd471f68b61ff Author: Piotr Caban Date: Sat Sep 12 13:15:27 2015 +0200 msvcrt/tests: Fix tolower test failures. --- dlls/msvcrt/tests/string.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index d247ba6..7733a7c 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -2608,6 +2608,7 @@ static void test_wctomb(void) static void test_tolower(void) { + WCHAR chw, lower; char ch, lch; int ret, len; @@ -2638,7 +2639,10 @@ static void test_tolower(void) ch = 0xF4; errno = 0xdeadbeef; ret = p_tolower(ch); - len = LCMapStringA(0, LCMAP_LOWERCASE, &ch, 1, &lch, 1); + if(!MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, &ch, 1, &chw, 1) || + LCMapStringW(CP_ACP, LCMAP_LOWERCASE, &chw, 1, &lower, 1) != 1 || + (len = WideCharToMultiByte(CP_ACP, 0, &lower, 1, &lch, 1, NULL, NULL)) != 1) + len = 0; if(len) ok(ret==(unsigned char)lch || broken(ret==ch)/*WinXP-*/, "ret = %x\n", ret); else @@ -2649,7 +2653,10 @@ static void test_tolower(void) ch = 0xD0; errno = 0xdeadbeef; ret = p_tolower(ch); - len = LCMapStringA(0, LCMAP_LOWERCASE, &ch, 1, &lch, 1); + if(!MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, &ch, 1, &chw, 1) || + LCMapStringW(CP_ACP, LCMAP_LOWERCASE, &chw, 1, &lower, 1) != 1 || + (len = WideCharToMultiByte(CP_ACP, 0, &lower, 1, &lch, 1, NULL, NULL)) != 1) + len = 0; if(len) ok(ret==(unsigned char)lch || broken(ret==ch)/*WinXP-*/, "ret = %x\n", ret); else From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Akihiro Sagawa : msi: Feature treeview should have WS_TABSTOP style. Message-ID: Module: wine Branch: master Commit: 6e51cfddfd722ef366fb2327b4ab84264aa19576 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6e51cfddfd722ef366fb2327b4ab84264aa19576 Author: Akihiro Sagawa Date: Sat Sep 12 20:24:22 2015 +0900 msi: Feature treeview should have WS_TABSTOP style. --- dlls/msi/dialog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c index a79ce1f..64cbbbc 100644 --- a/dlls/msi/dialog.c +++ b/dlls/msi/dialog.c @@ -2691,7 +2691,7 @@ static UINT msi_dialog_selection_tree( msi_dialog *dialog, MSIRECORD *rec ) /* create the treeview control */ style = TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT; - style |= WS_GROUP | WS_VSCROLL; + style |= WS_GROUP | WS_VSCROLL | WS_TABSTOP; control = msi_dialog_add_control( dialog, rec, WC_TREEVIEWW, style ); if (!control) { From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Akihiro Sagawa : quartz: Use boolean constants for BOOL. Message-ID: Module: wine Branch: master Commit: e4823f9b276c6142a973c1f3714750b755d84c81 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4823f9b276c6142a973c1f3714750b755d84c81 Author: Akihiro Sagawa Date: Sat Sep 12 20:24:24 2015 +0900 quartz: Use boolean constants for BOOL. --- dlls/quartz/mpegsplit.c | 10 +++++----- dlls/quartz/pin.c | 8 ++++---- dlls/quartz/waveparser.c | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c index 273c77c..835eef6 100644 --- a/dlls/quartz/mpegsplit.c +++ b/dlls/quartz/mpegsplit.c @@ -204,9 +204,9 @@ static HRESULT FillBuffer(MPEGSplitterImpl *This, IMediaSample *pCurrentSample) if (SUCCEEDED(hr)) { IMediaSample_SetTime(sample, &rtSampleStart, &rtSampleStop); - IMediaSample_SetPreroll(sample, 0); - IMediaSample_SetDiscontinuity(sample, 0); - IMediaSample_SetSyncPoint(sample, 1); + IMediaSample_SetPreroll(sample, FALSE); + IMediaSample_SetDiscontinuity(sample, FALSE); + IMediaSample_SetSyncPoint(sample, TRUE); hr = IAsyncReader_Request(pin->pReader, sample, 0); if (SUCCEEDED(hr)) { @@ -710,7 +710,7 @@ static HRESULT MPEGSplitter_first_request(LPVOID iface) IMediaSample_SetPreroll(sample, FALSE); IMediaSample_SetDiscontinuity(sample, TRUE); IMediaSample_SetSyncPoint(sample, 1); - This->seek = 0; + This->seek = FALSE; hr = IAsyncReader_Request(pin->pReader, sample, 0); if (SUCCEEDED(hr)) @@ -769,7 +769,7 @@ HRESULT MPEGSplitter_create(IUnknown * pUnkOuter, LPVOID * ppv) CoTaskMemFree(This); return hr; } - This->seek = 1; + This->seek = TRUE; /* Note: This memory is managed by the parser filter once created */ *ppv = This; diff --git a/dlls/quartz/pin.c b/dlls/quartz/pin.c index 52a3970..0a2c507 100644 --- a/dlls/quartz/pin.c +++ b/dlls/quartz/pin.c @@ -212,7 +212,7 @@ static HRESULT PullPin_Init(const IPinVtbl *PullPin_Vtbl, const PIN_INFO * pPinI pPinImpl->dRate = 1.0; pPinImpl->state = Req_Die; pPinImpl->fnCustomRequest = pCustomRequest; - pPinImpl->stop_playback = 1; + pPinImpl->stop_playback = TRUE; InitializeCriticalSection(&pPinImpl->thread_lock); pPinImpl->thread_lock.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": PullPin.thread_lock"); @@ -638,7 +638,7 @@ HRESULT PullPin_StartProcessing(PullPin * This) /* Wake up! */ assert(WaitForSingleObject(This->thread_sleepy, 0) == WAIT_TIMEOUT); This->state = Req_Run; - This->stop_playback = 0; + This->stop_playback = FALSE; ResetEvent(This->hEventStateChanged); SetEvent(This->thread_sleepy); } @@ -664,7 +664,7 @@ HRESULT PullPin_PauseProcessing(PullPin * This) assert(WaitForSingleObject(This->thread_sleepy, 0) == WAIT_TIMEOUT); This->state = Req_Pause; - This->stop_playback = 1; + This->stop_playback = TRUE; ResetEvent(This->hEventStateChanged); SetEvent(This->thread_sleepy); @@ -700,7 +700,7 @@ static HRESULT PullPin_StopProcessing(PullPin * This) assert(This->state == Req_Pause || This->state == Req_Sleepy); - This->stop_playback = 1; + This->stop_playback = TRUE; This->state = Req_Die; assert(WaitForSingleObject(This->thread_sleepy, 0) == WAIT_TIMEOUT); ResetEvent(This->hEventStateChanged); diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index 2ceb0fd..3f3846c 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -122,9 +122,9 @@ static HRESULT WAVEParser_Sample(LPVOID iface, IMediaSample * pSample, DWORD_PTR pin->rtCurrent = pin->rtNext; pin->rtNext = rtSampleStop; - IMediaSample_SetPreroll(newsample, 0); - IMediaSample_SetDiscontinuity(newsample, 0); - IMediaSample_SetSyncPoint(newsample, 1); + IMediaSample_SetPreroll(newsample, FALSE); + IMediaSample_SetDiscontinuity(newsample, FALSE); + IMediaSample_SetSyncPoint(newsample, TRUE); hr = IAsyncReader_Request(pin->pReader, newsample, 0); } From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Piotr Caban : msvcr120: Add fmin implementation. Message-ID: Module: wine Branch: master Commit: 09a727c33ca025b4b50172e872f04861df64213c URL: http://source.winehq.org/git/wine.git/?a=commit;h=09a727c33ca025b4b50172e872f04861df64213c Author: Piotr Caban Date: Sat Sep 12 14:29:00 2015 +0200 msvcr120: Add fmin implementation. --- dlls/msvcr120/msvcr120.spec | 6 +++--- dlls/msvcr120_app/msvcr120_app.spec | 6 +++--- dlls/msvcrt/math.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index c2aacac..0eb7ade 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2167,9 +2167,9 @@ @ cdecl fmax(double double) MSVCR120_fmax @ cdecl fmaxf(float float) MSVCR120_fmaxf @ cdecl fmaxl(double double) MSVCR120_fmax -@ stub fmin -@ stub fminf -@ stub fminl +@ cdecl fmin(double double) MSVCR120_fmin +@ cdecl fminf(float float) MSVCR120_fminf +@ cdecl fminl(double double) MSVCR120_fmin @ cdecl fmod(double double) MSVCRT_fmod @ cdecl -arch=arm,x86_64 fmodf(float float) MSVCRT_fmodf @ cdecl fopen(str str) MSVCRT_fopen diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 392c3f7..ec97ad7 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1836,9 +1836,9 @@ @ cdecl fmax(double double) msvcr120.fmax @ cdecl fmaxf(float float) msvcr120.fmaxf @ cdecl fmaxl(double double) msvcr120.fmaxl -@ stub fmin -@ stub fminf -@ stub fminl +@ cdecl fmin(double double) msvcr120.fmin +@ cdecl fminf(float float) msvcr120.fminf +@ cdecl fminl(double double) msvcr120.fminl @ cdecl fmod(double double) msvcr120.fmod @ cdecl -arch=arm,x86_64 fmodf(float float) msvcr120.fmodf @ cdecl fopen(str str) msvcr120.fopen diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 162dcfb..2459bf5 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -2683,3 +2683,31 @@ int CDECL MSVCR120__dsign(double x) { return signbit(x) ? 0x8000 : 0; } + +/********************************************************************* + * fminf (MSVCR120.@) + */ +float CDECL MSVCR120_fminf(float x, float y) +{ + if(isnanf(x)) + return y; + if(isnanf(y)) + return x; + if(x==0 && y==0) + return signbit(x) ? x : y; + return x Module: wine Branch: master Commit: 874c3f96f7559893a48bdc8ff1e9684a2a4c359d URL: http://source.winehq.org/git/wine.git/?a=commit;h=874c3f96f7559893a48bdc8ff1e9684a2a4c359d Author: Piotr Caban Date: Sat Sep 12 16:05:40 2015 +0200 msvcp60: Fix basic_string::operator[size_t] implementation. --- dlls/msvcp60/msvcp60.spec | 8 ++++---- dlls/msvcp60/string.c | 41 ++++++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec index 4ba1584..0aa3f1b 100644 --- a/dlls/msvcp60/msvcp60.spec +++ b/dlls/msvcp60/msvcp60.spec @@ -1535,12 +1535,12 @@ @ cdecl -arch=win64 ??9std@@YA_NPEBGAEBV?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@0@@Z(ptr ptr) MSVCP_basic_string_wchar_not_equal_cstr_str @ thiscall -arch=win32 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAEAADI at Z(ptr long) MSVCP_basic_string_char_operator_at @ cdecl -arch=win64 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAAAEAD_K at Z(ptr long) MSVCP_basic_string_char_operator_at -@ thiscall -arch=win32 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z(ptr long) MSVCP_basic_string_char_operator_at -@ cdecl -arch=win64 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z(ptr long) MSVCP_basic_string_char_operator_at +@ thiscall -arch=win32 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z(ptr long) MSVCP_basic_string_char_operator_at_const +@ cdecl -arch=win64 ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z(ptr long) MSVCP_basic_string_char_operator_at_const @ thiscall -arch=win32 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QAEAAGI at Z(ptr long) MSVCP_basic_string_wchar_operator_at @ cdecl -arch=win64 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEAAAEAG_K at Z(ptr long) MSVCP_basic_string_wchar_operator_at -@ thiscall -arch=win32 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z(ptr long) MSVCP_basic_string_wchar_operator_at -@ cdecl -arch=win64 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z(ptr long) MSVCP_basic_string_wchar_operator_at +@ thiscall -arch=win32 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z(ptr long) MSVCP_basic_string_wchar_operator_at_const +@ cdecl -arch=win64 ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z(ptr long) MSVCP_basic_string_wchar_operator_at_const @ thiscall -arch=win32 ??Bid at locale@std@@QAEIXZ(ptr) locale_id_operator_size_t @ cdecl -arch=win64 ??Bid at locale@std@@QEAA_KXZ(ptr) locale_id_operator_size_t @ thiscall -arch=win32 ??Bios_base at std@@QBEPAXXZ(ptr) ios_base_op_fail diff --git a/dlls/msvcp60/string.c b/dlls/msvcp60/string.c index 76a0e02..09f9854 100644 --- a/dlls/msvcp60/string.c +++ b/dlls/msvcp60/string.c @@ -22,7 +22,6 @@ #include "msvcp.h" #include "stdio.h" -#include "assert.h" #include "windef.h" #include "winbase.h" @@ -1412,15 +1411,29 @@ basic_string_char* __cdecl MSVCP_basic_string_char_concatenate_cstr_bstr(basic_s /* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAEAADI at Z */ /* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEAAAEAD_K at Z */ -/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z */ -/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at, 8) char* __thiscall MSVCP_basic_string_char_operator_at( basic_string_char *this, MSVCP_size_t pos) { TRACE("%p %lu\n", this, pos); - assert(this->size >= pos); + if(!this->ptr || pos>this->size) + return (char*)basic_string_char__Nullstr(); + + basic_string_char__Freeze(this); + return this->ptr+pos; +} + +/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEABDI at Z */ +/* ??A?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QEBAAEBD_K at Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at_const, 8) +const char* __thiscall MSVCP_basic_string_char_operator_at_const( + const basic_string_char *this, MSVCP_size_t pos) +{ + TRACE("%p %lu\n", this, pos); + + if(!this->ptr) + return basic_string_char__Nullstr(); return this->ptr+pos; } @@ -2935,15 +2948,29 @@ basic_string_wchar* __cdecl MSVCP_basic_string_wchar_concatenate_cstr_bstr(basic /* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QAEAAGI at Z */ /* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEAAAEAG_K at Z */ -/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z */ -/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z */ DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at, 8) wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at( basic_string_wchar *this, MSVCP_size_t pos) { TRACE("%p %lu\n", this, pos); - assert(this->size >= pos); + if(!this->ptr || pos>this->size) + return (wchar_t*)basic_string_wchar__Nullstr(); + + basic_string_wchar__Freeze(this); + return this->ptr+pos; +} + +/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QBEABGI at Z */ +/* ??A?$basic_string at GU?$char_traits at G@std@@V?$allocator at G@2@@std@@QEBAAEBG_K at Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at_const, 8) +const wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at_const( + const basic_string_wchar *this, MSVCP_size_t pos) +{ + TRACE("%p %lu\n", this, pos); + + if(!this->ptr) + return basic_string_wchar__Nullstr(); return this->ptr+pos; } From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Piotr Caban : msvcp: Add _Dtest implementation. Message-ID: Module: wine Branch: master Commit: 1e9402124d57dc982dc399f6e26a6662bc2f90a2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e9402124d57dc982dc399f6e26a6662bc2f90a2 Author: Piotr Caban Date: Sat Sep 12 16:13:25 2015 +0200 msvcp: Add _Dtest implementation. --- dlls/msvcp100/msvcp100.spec | 6 ++--- dlls/msvcp110/msvcp110.spec | 6 ++--- dlls/msvcp120/msvcp120.spec | 6 ++--- dlls/msvcp120/tests/msvcp120.c | 45 +++++++++++++++++++++++++++++++++++++ dlls/msvcp120_app/msvcp120_app.spec | 6 ++--- dlls/msvcp60/msvcp60.spec | 6 ++--- dlls/msvcp70/msvcp70.spec | 6 ++--- dlls/msvcp71/msvcp71.spec | 6 ++--- dlls/msvcp80/msvcp80.spec | 6 ++--- dlls/msvcp90/math.c | 34 ++++++++++++++++++++++++++++ dlls/msvcp90/msvcp90.spec | 6 ++--- include/msvcrt/math.h | 6 +++++ 12 files changed, 112 insertions(+), 27 deletions(-) diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec index 39c925c..6738979 100644 --- a/dlls/msvcp100/msvcp100.spec +++ b/dlls/msvcp100/msvcp100.spec @@ -2892,14 +2892,14 @@ @ extern _Denorm @ stub _Dnorm @ stub _Dscale -@ stub _Dtest +@ cdecl _Dtest(ptr) @ extern _Eps @ stub _Exp @ stub _FCosh @ extern _FDenorm @ stub _FDnorm @ stub _FDscale -@ stub _FDtest +@ cdecl _FDtest(ptr) @ extern _FEps @ stub _FExp @ extern _FInf @@ -2920,7 +2920,7 @@ @ stub _LCosh @ extern _LDenorm @ stub _LDscale -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ extern _LEps @ stub _LExp @ extern _LInf diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index ff4facb..f907c5b 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -3745,7 +3745,7 @@ @ cdecl _Do_call(ptr) @ stub _Dscale @ stub _Dtento -@ stub _Dtest +@ cdecl _Dtest(ptr) @ stub _Dunscale @ extern _Eps @ stub _Exp @@ -3755,7 +3755,7 @@ @ stub _FDnorm @ stub _FDscale @ stub _FDtento -@ stub _FDtest +@ cdecl _FDtest(ptr) @ stub _FDunscale @ extern _FEps @ stub _FExp @@ -3791,7 +3791,7 @@ @ stub _LDint @ stub _LDscale @ stub _LDtento -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ stub _LDunscale @ extern _LEps @ stub _LExp diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 715703e..1f8601c 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -3686,7 +3686,7 @@ @ cdecl _Do_call(ptr) @ stub _Dscale @ stub _Dtento -@ stub _Dtest +@ cdecl _Dtest(ptr) @ stub _Dunscale @ extern _Eps @ stub _Exp @@ -3696,7 +3696,7 @@ @ stub _FDnorm @ stub _FDscale @ stub _FDtento -@ stub _FDtest +@ cdecl _FDtest(ptr) @ stub _FDunscale @ extern _FEps @ stub _FExp @@ -3734,7 +3734,7 @@ @ stub _LDint @ stub _LDscale @ stub _LDtento -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ stub _LDunscale @ extern _LEps @ stub _LExp diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c index 10e0370..9255ff1 100644 --- a/dlls/msvcp120/tests/msvcp120.c +++ b/dlls/msvcp120/tests/msvcp120.c @@ -18,10 +18,25 @@ #include #include +#include #include "wine/test.h" #include "winbase.h" +static inline float __port_infinity(void) +{ + static const unsigned __inf_bytes = 0x7f800000; + return *(const float *)&__inf_bytes; +} +#define INFINITY __port_infinity() + +static inline float __port_nan(void) +{ + static const unsigned __nan_bytes = 0x7fc00000; + return *(const float *)&__nan_bytes; +} +#define NAN __port_nan() + typedef int MSVCRT_long; typedef unsigned char MSVCP_bool; @@ -70,6 +85,7 @@ static _Cvtvec* (__cdecl *p__Getcvt)(_Cvtvec*); static void (CDECL *p__Call_once)(int *once, void (CDECL *func)(void)); static void (CDECL *p__Call_onceEx)(int *once, void (CDECL *func)(void*), void *argv); static void (CDECL *p__Do_call)(void *this); +static short (__cdecl *p__Dtest)(double *d); /* filesystem */ static ULONGLONG(__cdecl *p_tr2_sys__File_size)(char const*); @@ -119,6 +135,8 @@ static BOOL init(void) "_Call_onceEx"); SET(p__Do_call, "_Do_call"); + SET(p__Dtest, + "_Dtest"); if(sizeof(void*) == 8) { /* 64-bit initialization */ SET(p_tr2_sys__File_size, "?_File_size at sys@tr2 at std@@YA_KPEBD at Z"); @@ -407,6 +425,32 @@ static void test__Do_call(void) ok(cnt == 1, "func was not called\n"); } +static void test__Dtest(void) +{ + double d; + short ret; + + d = 0; + ret = p__Dtest(&d); + ok(ret == FP_ZERO, "_Dtest(0) returned %x\n", ret); + + d = 1; + ret = p__Dtest(&d); + ok(ret == FP_NORMAL, "_Dtest(1) returned %x\n", ret); + + d = -1; + ret = p__Dtest(&d); + ok(ret == FP_NORMAL, "_Dtest(-1) returned %x\n", ret); + + d = INFINITY; + ret = p__Dtest(&d); + ok(ret == FP_INFINITE, "_Dtest(INF) returned %x\n", ret); + + d = NAN; + ret = p__Dtest(&d); + ok(ret == FP_NAN, "_Dtest(NAN) returned %x\n", ret); +} + static void test_tr2_sys__File_size(void) { ULONGLONG val; @@ -910,6 +954,7 @@ START_TEST(msvcp120) test__Getcvt(); test__Call_once(); test__Do_call(); + test__Dtest(); test_tr2_sys__File_size(); test_tr2_sys__Equivalent(); diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index 1e04e77..b689cb9 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -3686,7 +3686,7 @@ @ cdecl _Do_call(ptr) msvcp120._Do_call @ stub _Dscale @ stub _Dtento -@ stub _Dtest +@ cdecl _Dtest(ptr) msvcp120._Dtest @ stub _Dunscale @ extern _Eps msvcp120._Eps @ stub _Exp @@ -3696,7 +3696,7 @@ @ stub _FDnorm @ stub _FDscale @ stub _FDtento -@ stub _FDtest +@ cdecl _FDtest(ptr) msvcp120._FDtest @ stub _FDunscale @ extern _FEps msvcp120._FEps @ stub _FExp @@ -3734,7 +3734,7 @@ @ stub _LDint @ stub _LDscale @ stub _LDtento -@ stub _LDtest +@ cdecl _LDtest(ptr) msvcp120._LDtest @ stub _LDunscale @ extern _LEps msvcp120._LEps @ stub _LExp diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec index 0aa3f1b..10d04e5 100644 --- a/dlls/msvcp60/msvcp60.spec +++ b/dlls/msvcp60/msvcp60.spec @@ -4258,14 +4258,14 @@ @ extern _Denorm _Denorm @ stub _Dnorm @ stub _Dscale -@ stub _Dtest +@ cdecl _Dtest(ptr) @ extern _Eps _Eps @ stub _Exp @ stub _FCosh @ extern _FDenorm _FDenorm @ stub _FDnorm @ stub _FDscale -@ stub _FDtest +@ cdecl _FDtest(ptr) @ extern _FEps _FEps @ stub _FExp @ extern _FInf _FInf @@ -4282,7 +4282,7 @@ @ stub _LCosh @ extern _LDenorm _LDenorm @ stub _LDscale -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ extern _LEps _LEps @ stub _LExp @ extern _LInf _LInf diff --git a/dlls/msvcp70/msvcp70.spec b/dlls/msvcp70/msvcp70.spec index c9cdef4..f390d8a 100644 --- a/dlls/msvcp70/msvcp70.spec +++ b/dlls/msvcp70/msvcp70.spec @@ -5044,14 +5044,14 @@ @ extern _Denorm @ stub _Dnorm @ stub _Dscale -@ stub _Dtest +@ cdecl _Dtest(ptr) @ extern _Eps @ stub _Exp @ stub _FCosh @ extern _FDenorm @ stub _FDnorm @ stub _FDscale -@ stub _FDtest +@ cdecl _FDtest(ptr) @ extern _FEps @ stub _FExp @ extern _FInf @@ -5069,7 +5069,7 @@ @ stub _LCosh @ extern _LDenorm @ stub _LDscale -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ extern _LEps @ stub _LExp @ extern _LInf diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec index 2946a12..2675c9a 100644 --- a/dlls/msvcp71/msvcp71.spec +++ b/dlls/msvcp71/msvcp71.spec @@ -5098,14 +5098,14 @@ @ extern _Denorm @ stub _Dnorm @ stub _Dscale -@ stub _Dtest +@ cdecl _Dtest(ptr) @ extern _Eps @ stub _Exp @ stub _FCosh @ extern _FDenorm @ stub _FDnorm @ stub _FDscale -@ stub _FDtest +@ cdecl _FDtest(ptr) @ extern _FEps @ stub _FExp @ extern _FInf @@ -5125,7 +5125,7 @@ @ stub _LCosh @ extern _LDenorm @ stub _LDscale -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ extern _LEps @ stub _LExp @ extern _LInf diff --git a/dlls/msvcp80/msvcp80.spec b/dlls/msvcp80/msvcp80.spec index 4e292c0..ed04def 100644 --- a/dlls/msvcp80/msvcp80.spec +++ b/dlls/msvcp80/msvcp80.spec @@ -5705,7 +5705,7 @@ @ stub _Dnorm @ stub _Dscale @ stub _Dtentox -@ stub _Dtest +@ cdecl _Dtest(ptr) @ stub _Dunscale @ extern _Eps @ stub _Exp @@ -5714,7 +5714,7 @@ @ stub _FDnorm @ stub _FDscale @ stub _FDtentox -@ stub _FDtest +@ cdecl _FDtest(ptr) @ stub _FDunscale @ extern _FEps @ stub _FExp @@ -5736,7 +5736,7 @@ @ extern _LDenorm @ stub _LDscale @ stub _LDtentox -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ stub _LDunscale @ extern _LEps @ stub _LExp diff --git a/dlls/msvcp90/math.c b/dlls/msvcp90/math.c index 439865a..9b827f3 100644 --- a/dlls/msvcp90/math.c +++ b/dlls/msvcp90/math.c @@ -2226,3 +2226,37 @@ complex_double* __cdecl complex_double_sqrt(complex_double *ret, const complex_d complex_double c = { 0.5, 0 }; return complex_double_pow(ret, l, &c); } + +static short dclass(double x) +{ + switch(_fpclass(x)) { + case _FPCLASS_SNAN: + case _FPCLASS_QNAN: + return FP_NAN; + case _FPCLASS_NINF: + case _FPCLASS_PINF: + return FP_INFINITE; + case _FPCLASS_ND: + case _FPCLASS_PD: + return FP_SUBNORMAL; + case _FPCLASS_NN: + case _FPCLASS_PN: + default: + return FP_NORMAL; + case _FPCLASS_NZ: + case _FPCLASS_PZ: + return FP_ZERO; + } +} + +/* _Dtest */ +short __cdecl _Dtest(double *x) +{ + return dclass(*x); +} + +/* _FDtest */ +short __cdecl _FDtest(float *x) +{ + return dclass(*x); +} diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index 98edb65..d3a314b 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -6480,14 +6480,14 @@ @ extern _Denorm @ stub _Dnorm @ stub _Dscale -@ stub _Dtest +@ cdecl _Dtest(ptr) @ extern _Eps @ stub _Exp @ stub _FCosh @ extern _FDenorm @ stub _FDnorm @ stub _FDscale -@ stub _FDtest +@ cdecl _FDtest(ptr) @ extern _FEps @ stub _FExp @ extern _FInf @@ -6507,7 +6507,7 @@ @ stub _LCosh @ extern _LDenorm @ stub _LDscale -@ stub _LDtest +@ cdecl _LDtest(ptr) _Dtest @ extern _LEps @ stub _LExp @ extern _LInf diff --git a/include/msvcrt/math.h b/include/msvcrt/math.h index 34aa268..c1333d4 100644 --- a/include/msvcrt/math.h +++ b/include/msvcrt/math.h @@ -146,6 +146,12 @@ static const union { # endif #endif +#define FP_INFINITE 1 +#define FP_NAN 2 +#define FP_NORMAL -1 +#define FP_SUBNORMAL -2 +#define FP_ZERO 0 + #ifdef __cplusplus } #endif From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Gerald Pfeifer : oleacc: Avoid two cases of shift overflow. Message-ID: Module: wine Branch: master Commit: 92f9dd1942fb483844dd61c857e6ab539ed2e9ad URL: http://source.winehq.org/git/wine.git/?a=commit;h=92f9dd1942fb483844dd61c857e6ab539ed2e9ad Author: Gerald Pfeifer Date: Sun Sep 13 00:12:18 2015 +0200 oleacc: Avoid two cases of shift overflow. --- dlls/oleacc/tests/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/oleacc/tests/main.c b/dlls/oleacc/tests/main.c index 5f3f7da..7a0737c 100644 --- a/dlls/oleacc/tests/main.c +++ b/dlls/oleacc/tests/main.c @@ -445,7 +445,7 @@ static void test_GetStateText(void) ret = GetStateTextW(1< Module: wine Branch: master Commit: a833aaa5cea806763d3dfb6319428f667e2ed74e URL: http://source.winehq.org/git/wine.git/?a=commit;h=a833aaa5cea806763d3dfb6319428f667e2ed74e Author: Katarzyna Caban Date: Sun Sep 13 17:54:46 2015 +0200 po: Update Polish translation. --- po/pl.po | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/po/pl.po b/po/pl.po index 3f2267e..f157402 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7469,16 +7469,12 @@ msgid "&Convert..." msgstr "&Konwertuj..." #: oledlg.rc:36 -#, fuzzy -#| msgid "&Object" msgid "%1 %2 &Object" -msgstr "&Obiekt" +msgstr "%1 &Obiekt %2" #: oledlg.rc:34 -#, fuzzy -#| msgid "&Object" msgid "%s &Object" -msgstr "&Obiekt" +msgstr "&Obiekt %s" #: oledlg.rc:33 oleview.rc:40 msgid "&Object" @@ -12909,18 +12905,16 @@ msgstr "" #: uninstaller.rc:31 msgid "uninstaller: The application with GUID '%1' was not found\n" -msgstr "" +msgstr "usuwanie program?w: Nie znaleziono aplikacji o GUID '%1'\n" #: uninstaller.rc:32 msgid "" "uninstaller: The option '--remove' must be followed by an application GUID\n" -msgstr "" +msgstr "usuwanie program?w: Po opcji '--remove' nale?y poda? GUID aplikacji\n" #: uninstaller.rc:33 -#, fuzzy -#| msgid "Error: Invalid option '%c'.\n" msgid "uninstaller: Invalid option [%1]\n" -msgstr "B??d: Nieprawid?owa opcja '%c'.\n" +msgstr "usuwanie program?w: Nieprawid?owa opcja [%1]\n" #: uninstaller.rc:35 msgid "" @@ -12929,6 +12923,10 @@ msgid "" "Uninstall applications from the current Wine prefix.\n" "\n" msgstr "" +"Wine - Usuwanie program?w\n" +"\n" +"Usu? programy z bie??cego prefiksu Wine.\n" +"\n" #: uninstaller.rc:43 msgid "" @@ -12943,6 +12941,16 @@ msgid "" " [no option] Launch the graphical version of this program.\n" "\n" msgstr "" +"Spos?b u?ycia:\n" +" uninstaller [opcje]\n" +"\n" +"Opcje:\n" +" --help\t Wy?wietl t? instrukcj?.\n" +" --list\t Wy?wietl wszystkie aplikacje zainstalowane w tym prefiksie " +"Wine.\n" +" --remove {GUID} Usu? wskazan? aplikacj?.\n" +"\t\t U?yj '--list' do sprawdzenia GUID aplikacji.\n" +" [brak opcji] Uruchom graficzn? wersj? tego programu.\n" #: view.rc:36 msgid "&Pan" From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Aric Stewart : hidclass.sys: Implement a report ring buffer. Message-ID: Module: wine Branch: master Commit: 7e2ca70f799c12418178ef08d95ff10445b410b1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7e2ca70f799c12418178ef08d95ff10445b410b1 Author: Aric Stewart Date: Fri Sep 11 10:45:54 2015 -0500 hidclass.sys: Implement a report ring buffer. --- dlls/hidclass.sys/Makefile.in | 1 + dlls/hidclass.sys/buffer.c | 81 +++++++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/device.c | 2 ++ dlls/hidclass.sys/hid.h | 7 ++++ dlls/hidclass.sys/pnp.c | 2 ++ 5 files changed, 93 insertions(+) diff --git a/dlls/hidclass.sys/Makefile.in b/dlls/hidclass.sys/Makefile.in index c5c9eb7..8ed51e6 100644 --- a/dlls/hidclass.sys/Makefile.in +++ b/dlls/hidclass.sys/Makefile.in @@ -4,6 +4,7 @@ IMPORTS = ntoskrnl.exe DELAYIMPORTS = setupapi hid C_SRCS = \ + buffer.c \ device.c \ main.c \ pnp.c diff --git a/dlls/hidclass.sys/buffer.c b/dlls/hidclass.sys/buffer.c new file mode 100644 index 0000000..6fbcc0d --- /dev/null +++ b/dlls/hidclass.sys/buffer.c @@ -0,0 +1,81 @@ +/* Implementation of a ring buffer for reports + * + * Copyright 2015 CodeWeavers, Aric Stewart + * + * 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 + */ + +#include "config.h" +#include +#define NONAMELESSUNION +#include "hid.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(hid); + +#define BASE_BUFFER_SIZE 32 + +struct ReportRingBuffer +{ + UINT start, end, size; + + int *pointers; + UINT pointer_alloc; + UINT buffer_size; + + CRITICAL_SECTION lock; + + BYTE *buffer; +}; + +struct ReportRingBuffer* RingBuffer_Create(UINT buffer_size) +{ + struct ReportRingBuffer *ring; + TRACE("Create Ring Buffer with buffer size %i\n",buffer_size); + ring = HeapAlloc(GetProcessHeap(), 0, sizeof(*ring)); + if (!ring) + return NULL; + ring->start = ring->end = 0; + ring->size = BASE_BUFFER_SIZE; + ring->buffer_size = buffer_size; + ring->pointer_alloc = 2; + ring->pointers = HeapAlloc(GetProcessHeap(), 0, sizeof(int) * ring->pointer_alloc); + if (!ring->pointers) + { + HeapFree(GetProcessHeap(), 0, ring); + return NULL; + } + memset(ring->pointers, 0xff, sizeof(int) * ring->pointer_alloc); + ring->buffer = HeapAlloc(GetProcessHeap(), 0, buffer_size * ring->size); + if (!ring->buffer) + { + HeapFree(GetProcessHeap(), 0, ring->pointers); + HeapFree(GetProcessHeap(), 0, ring); + return NULL; + } + InitializeCriticalSection(&ring->lock); + ring->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RingBuffer.lock"); + return ring; +} + +void RingBuffer_Destroy(struct ReportRingBuffer *ring) +{ + HeapFree(GetProcessHeap(), 0, ring->buffer); + HeapFree(GetProcessHeap(), 0, ring->pointers); + ring->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&ring->lock); + HeapFree(GetProcessHeap(), 0, ring); +} diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index 384bc8f..e8deb95 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -178,6 +178,8 @@ void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device CloseHandle(ext->halt_event); HeapFree(GetProcessHeap(), 0, ext->preparseData); + if (ext->ring_buffer) + RingBuffer_Destroy(ext->ring_buffer); entry = RemoveHeadList(&ext->irp_queue); while(entry != &ext->irp_queue) diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index efa4712..538942b 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -35,6 +35,9 @@ typedef NTSTATUS (WINAPI *pAddDevice)(DRIVER_OBJECT *DriverObject, DEVICE_OBJECT *PhysicalDeviceObject); +/* Ring buffer functions */ +struct ReportRingBuffer; + typedef struct _BASE_DEVICE_EXTENSTION { HID_DEVICE_EXTENSION deviceExtension; @@ -44,6 +47,7 @@ typedef struct _BASE_DEVICE_EXTENSTION { ULONG poll_interval; WCHAR *device_name; WCHAR *link_name; + struct ReportRingBuffer *ring_buffer; HANDLE halt_event; HANDLE thread; @@ -52,6 +56,9 @@ typedef struct _BASE_DEVICE_EXTENSTION { /* Minidriver Specific stuff will end up here */ } BASE_DEVICE_EXTENSION; +void RingBuffer_Destroy(struct ReportRingBuffer *buffer) DECLSPEC_HIDDEN; +struct ReportRingBuffer* RingBuffer_Create(UINT buffer_size) DECLSPEC_HIDDEN; + typedef struct _minidriver { struct list entry; diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c index 0fb06a2..43bc449 100644 --- a/dlls/hidclass.sys/pnp.c +++ b/dlls/hidclass.sys/pnp.c @@ -126,6 +126,8 @@ NTSTATUS WINAPI PNP_AddDevice(DRIVER_OBJECT *driver, DEVICE_OBJECT *PDO) ext->poll_interval = DEFAULT_POLL_INTERVAL; InitializeListHead(&ext->irp_queue); + ext->ring_buffer = RingBuffer_Create(sizeof(HID_XFER_PACKET) + ext->preparseData->caps.InputReportByteLength); + return STATUS_SUCCESS; } From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: Florian Pelz : po: German translation: Various fixes. Message-ID: Module: wine Branch: master Commit: a161fb318b3b0ab58f2bf199bc72752c2390cbbc URL: http://source.winehq.org/git/wine.git/?a=commit;h=a161fb318b3b0ab58f2bf199bc72752c2390cbbc Author: Florian Pelz Date: Sun Sep 13 17:51:11 2015 +0200 po: German translation: Various fixes. Mostly as suggested by Julian R?ger. With suggestion from Jens Reyer. --- po/de.po | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/po/de.po b/po/de.po index 3dc3bff..ef20da1 100644 --- a/po/de.po +++ b/po/de.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: Wine\n" "Report-Msgid-Bugs-To: http://bugs.winehq.org\n" "POT-Creation-Date: N/A\n" -"PO-Revision-Date: 2015-09-02 12:17+0200\n" +"PO-Revision-Date: 2015-09-13 17:46+0200\n" "Last-Translator: Florian Pelz\n" "Language-Team: German\n" "Language: de\n" @@ -1515,7 +1515,7 @@ msgstr "CMC-Antwort" #: crypt32.rc:105 msgid "Unsigned CMC Request" -msgstr "Unsignierte-CMC-Antwort" +msgstr "Unsignierte CMC-Anfrage" #: crypt32.rc:106 msgid "CMC Status Info" @@ -1695,15 +1695,15 @@ msgstr "Windows-Hardware-Treiber-Verifizierung" #: crypt32.rc:150 cryptui.rc:134 msgid "Windows System Component Verification" -msgstr "Windows-System-Komponenten-Verifizierung" +msgstr "Windows-Systemkomponenten-Verifizierung" #: crypt32.rc:151 cryptui.rc:135 msgid "OEM Windows System Component Verification" -msgstr "OEM-Windows-System-Komponenten-Verifizierung" +msgstr "OEM-Windows-Systemkomponenten-Verifizierung" #: crypt32.rc:152 cryptui.rc:136 msgid "Embedded Windows System Component Verification" -msgstr "Embedded-Windows-System-Komponenten-Verifizierung" +msgstr "Embedded-Windows-Systemkomponenten-Verifizierung" #: crypt32.rc:153 cryptui.rc:143 msgid "Key Pack Licenses" @@ -1735,7 +1735,7 @@ msgstr "Dokumentensignatur" #: crypt32.rc:160 msgid "IP security IKE intermediate" -msgstr "Dazwischenliegende IP-Sicherheits-IKE" +msgstr "Intermedi?re IP-Sicherheits-IKE" #: crypt32.rc:161 cryptui.rc:132 msgid "File Recovery" @@ -1775,7 +1775,7 @@ msgstr "Pers?nlich" #: crypt32.rc:174 msgid "Intermediate Certification Authorities" -msgstr "Zwischenzertifizierungsstellen" +msgstr "Intermedi?re Zertifizierungsstellen" #: crypt32.rc:175 msgid "Other People" @@ -6843,9 +6843,9 @@ msgstr "" "Protokollierung und Benutzeroberfl?che f?r die oberen Befehle anpassen:\n" "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] Protokolldatei\n" "\t/q{|n|b|r|f|n+|b+|b-}\n" -"MSI-Service registrieren:\n" +"MSI-Dienst registrieren:\n" "\t/y\n" -"Registrierung des MSI-Service aufheben:\n" +"Registrierung des MSI-Dienstes aufheben:\n" "\t/z\n" "Diese Hilfe anzeigen:\n" "\t/help\n" @@ -6921,7 +6921,7 @@ msgstr "Vollst?ndige Frames (Unkomprimiert)" #: msvidc32.rc:29 msgid "Wine Video 1 video codec" -msgstr "Wine-Video-1-Video-Codec" +msgstr "Wine-Video-1-Videocodec" #: oleacc.rc:31 msgid "unknown object" @@ -10533,7 +10533,7 @@ msgstr "DHCP aktiviert" #: ipconfig.rc:49 msgid "Default gateway" -msgstr "Standard-Gateway" +msgstr "Standardgateway" #: ipconfig.rc:50 msgid "IPv6 address" @@ -12919,7 +12919,7 @@ msgstr "Die Prozessoraffinit?t konnte nicht ge?ndert werden" #: taskmgr.rc:322 msgid "System Idle Process" -msgstr "Leerlauf-Prozess" +msgstr "Leerlaufprozess" #: taskmgr.rc:323 msgid "Not Responding" @@ -13060,7 +13060,7 @@ msgstr "" #: winecfg.rc:143 msgid "Windows registration information" -msgstr "Windows-Registrierungs-Informationen" +msgstr "Windows-Registrierungsinformationen" #: winecfg.rc:144 msgid "&Owner:" @@ -13790,7 +13790,7 @@ msgstr "Dies ist ein Test" #: wineconsole.rc:44 msgid "wineconsole: Couldn't parse event id\n" -msgstr "wineconsole: Ereignis-ID konnte nicht geparset werden\n" +msgstr "wineconsole: Parsen der Ereignis-ID fehlgeschlagen\n" #: wineconsole.rc:45 msgid "wineconsole: Invalid backend\n" From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d10core/tests: Check that render target view implements ID3D11RenderTargetView. Message-ID: Module: wine Branch: master Commit: c32def6c4173c2ff4e2ba29ab44e58073e206e3b URL: http://source.winehq.org/git/wine.git/?a=commit;h=c32def6c4173c2ff4e2ba29ab44e58073e206e3b Author: J?zef Kucia Date: Mon Sep 14 00:13:32 2015 +0200 d3d10core/tests: Check that render target view implements ID3D11RenderTargetView. --- dlls/d3d10core/tests/device.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index e24cc94..836da96 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -783,6 +783,7 @@ static void test_create_rendertarget_view(void) ID3D10Device *device, *tmp; ID3D10Texture2D *texture; ID3D10Buffer *buffer; + IUnknown *iface; HRESULT hr; if (!(device = create_device())) @@ -831,6 +832,11 @@ static void test_create_rendertarget_view(void) ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); ID3D10Device_Release(tmp); + hr = ID3D10RenderTargetView_QueryInterface(rtview, &IID_ID3D11RenderTargetView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Render target view should implement ID3D11RenderTargetView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + ID3D10RenderTargetView_Release(rtview); ID3D10Buffer_Release(buffer); @@ -859,6 +865,11 @@ static void test_create_rendertarget_view(void) "Expected view dimension D3D10_RTV_DIMENSION_TEXTURE2D, got %#x\n", rtv_desc.ViewDimension); ok(U(rtv_desc).Texture2D.MipSlice == 0, "Expected mip slice 0, got %#x\n", U(rtv_desc).Texture2D.MipSlice); + hr = ID3D10RenderTargetView_QueryInterface(rtview, &IID_ID3D11RenderTargetView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Render target view should implement ID3D11RenderTargetView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + ID3D10RenderTargetView_Release(rtview); ID3D10Texture2D_Release(texture); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d10core/tests: Port test_depthstencil_view_interfaces() from d3d11. Message-ID: Module: wine Branch: master Commit: fbf7b84d10175798cac19fe9e5f980593671f163 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fbf7b84d10175798cac19fe9e5f980593671f163 Author: J?zef Kucia Date: Mon Sep 14 00:13:31 2015 +0200 d3d10core/tests: Port test_depthstencil_view_interfaces() from d3d11. --- dlls/d3d10core/tests/device.c | 69 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index ebe50cc..e24cc94 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -704,6 +704,74 @@ static void test_create_depthstencil_view(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_depthstencil_view_interfaces(void) +{ + D3D11_DEPTH_STENCIL_VIEW_DESC d3d11_dsv_desc; + D3D10_DEPTH_STENCIL_VIEW_DESC dsv_desc; + ID3D11DepthStencilView *d3d11_dsview; + D3D10_TEXTURE2D_DESC texture_desc; + ID3D10DepthStencilView *dsview; + ID3D10Texture2D *texture; + ID3D10Device *device; + ULONG refcount; + HRESULT hr; + + if (!(device = create_device())) + { + skip("Failed to create device.\n"); + return; + } + + texture_desc.Width = 512; + texture_desc.Height = 512; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Quality = 0; + texture_desc.Usage = D3D10_USAGE_DEFAULT; + texture_desc.BindFlags = D3D10_BIND_DEPTH_STENCIL; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + + hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x.\n", hr); + + dsv_desc.Format = texture_desc.Format; + dsv_desc.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2D; + U(dsv_desc).Texture2D.MipSlice = 0; + + hr = ID3D10Device_CreateDepthStencilView(device, (ID3D10Resource *)texture, &dsv_desc, &dsview); + ok(SUCCEEDED(hr), "Failed to create a depthstencil view, hr %#x.\n", hr); + + hr = ID3D10DepthStencilView_QueryInterface(dsview, &IID_ID3D11DepthStencilView, (void **)&d3d11_dsview); + ID3D10DepthStencilView_Release(dsview); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Depth stencil view should implement ID3D11DepthStencilView.\n"); + + if (SUCCEEDED(hr)) + { + ID3D11DepthStencilView_GetDesc(d3d11_dsview, &d3d11_dsv_desc); + ok(d3d11_dsv_desc.Format == dsv_desc.Format, "Got unexpected format %#x.\n", d3d11_dsv_desc.Format); + ok(d3d11_dsv_desc.ViewDimension == (D3D11_DSV_DIMENSION)dsv_desc.ViewDimension, + "Got unexpected view dimension %u.\n", d3d11_dsv_desc.ViewDimension); + ok(!d3d11_dsv_desc.Flags, "Got unexpected flags %#x.\n", d3d11_dsv_desc.Flags); + ok(U(d3d11_dsv_desc).Texture2D.MipSlice == U(dsv_desc).Texture2D.MipSlice, + "Got unexpected mip slice %u.\n", U(d3d11_dsv_desc).Texture2D.MipSlice); + + ID3D11DepthStencilView_Release(d3d11_dsview); + } + else + { + win_skip("D3D11 is not available.\n"); + } + + ID3D10Texture2D_Release(texture); + + refcount = ID3D10Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + static void test_create_rendertarget_view(void) { D3D10_RENDER_TARGET_VIEW_DESC rtv_desc; @@ -3738,6 +3806,7 @@ START_TEST(device) test_create_texture3d(); test_buffer_interfaces(); test_create_depthstencil_view(); + test_depthstencil_view_interfaces(); test_create_rendertarget_view(); test_create_shader_resource_view(); test_create_shader(); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d10core/tests: Check that shader resource view implements ID3D11ShaderResourceView. Message-ID: Module: wine Branch: master Commit: 6d916dc3e5a4aeb432bc27ef11b7d6c4c465192c URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d916dc3e5a4aeb432bc27ef11b7d6c4c465192c Author: J?zef Kucia Date: Mon Sep 14 00:13:33 2015 +0200 d3d10core/tests: Check that shader resource view implements ID3D11ShaderResourceView. --- dlls/d3d10core/tests/device.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index 836da96..ec835ab 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -887,6 +887,7 @@ static void test_create_shader_resource_view(void) ID3D10Device *device, *tmp; ID3D10Texture2D *texture; ID3D10Buffer *buffer; + IUnknown *iface; HRESULT hr; if (!(device = create_device())) @@ -925,6 +926,11 @@ static void test_create_shader_resource_view(void) ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); ID3D10Device_Release(tmp); + hr = ID3D10ShaderResourceView_QueryInterface(srview, &IID_ID3D11ShaderResourceView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Shader resource view should implement ID3D11ShaderResourceView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + ID3D10ShaderResourceView_Release(srview); ID3D10Buffer_Release(buffer); @@ -954,6 +960,11 @@ static void test_create_shader_resource_view(void) U(srv_desc).Texture2D.MostDetailedMip); ok(U(srv_desc).Texture2D.MipLevels == 10, "Got unexpected MipLevels %u.\n", U(srv_desc).Texture2D.MipLevels); + hr = ID3D10ShaderResourceView_QueryInterface(srview, &IID_ID3D11ShaderResourceView, (void **)&iface); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Shader resource view should implement ID3D11ShaderResourceView.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(iface); + ID3D10ShaderResourceView_Release(srview); ID3D10Texture2D_Release(texture); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Port test_create_depthstencil_view() from d3d10core. Message-ID: Module: wine Branch: master Commit: e0bd44583ccb3493f395f98e4a7a72d9114bc825 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e0bd44583ccb3493f395f98e4a7a72d9114bc825 Author: J?zef Kucia Date: Mon Sep 14 00:13:34 2015 +0200 d3d11/tests: Port test_create_depthstencil_view() from d3d10core. --- dlls/d3d11/tests/d3d11.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 8bf31dc..44e1550 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -815,6 +815,64 @@ static void test_buffer_interfaces(void) ok(!refcount, "Device has %u references left.\n", refcount); } +static void test_create_depthstencil_view(void) +{ + D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc; + D3D11_TEXTURE2D_DESC texture_desc; + ULONG refcount, expected_refcount; + ID3D11DepthStencilView *dsview; + ID3D11Device *device, *tmp; + ID3D11Texture2D *texture; + HRESULT hr; + + if (!(device = create_device(NULL))) + { + skip("Failed to create device.\n"); + return; + } + + texture_desc.Width = 512; + texture_desc.Height = 512; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Quality = 0; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + + hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture); + ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x.\n", hr); + + expected_refcount = get_refcount((IUnknown *)device) + 1; + hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)texture, NULL, &dsview); + ok(SUCCEEDED(hr), "Failed to create a depthstencil view, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)device); + ok(refcount >= expected_refcount, "Got unexpected refcount %u, expected >= %u.\n", refcount, expected_refcount); + tmp = NULL; + expected_refcount = refcount + 1; + ID3D11DepthStencilView_GetDevice(dsview, &tmp); + ok(tmp == device, "Got unexpected device %p, expected %p.\n", tmp, device); + refcount = get_refcount((IUnknown *)device); + ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount); + ID3D11Device_Release(tmp); + + ID3D11DepthStencilView_GetDesc(dsview, &dsv_desc); + ok(dsv_desc.Format == texture_desc.Format, "Got unexpected format %#x.\n", dsv_desc.Format); + ok(dsv_desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2D, + "Got unexpected view dimension %#x.\n", dsv_desc.ViewDimension); + ok(!dsv_desc.Flags, "Got unexpected flags %#x.\n", dsv_desc.Flags); + ok(U(dsv_desc).Texture2D.MipSlice == 0, "Got Unexpected mip slice %u.\n", U(dsv_desc).Texture2D.MipSlice); + + ID3D11DepthStencilView_Release(dsview); + ID3D11Texture2D_Release(texture); + + refcount = ID3D11Device_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +} + static void test_depthstencil_view_interfaces(void) { D3D10_DEPTH_STENCIL_VIEW_DESC d3d10_dsv_desc; @@ -1094,6 +1152,7 @@ START_TEST(d3d11) test_create_texture3d(); test_texture3d_interfaces(); test_buffer_interfaces(); + test_create_depthstencil_view(); test_depthstencil_view_interfaces(); test_create_rendertarget_view(); test_create_shader_resource_view(); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi/tests: Check that DXGI surface implements ID3D11Texture2D. Message-ID: Module: wine Branch: master Commit: cee4d0bb9151fc5361d36e36094c7d08c577af7b URL: http://source.winehq.org/git/wine.git/?a=commit;h=cee4d0bb9151fc5361d36e36094c7d08c577af7b Author: J?zef Kucia Date: Mon Sep 14 00:13:38 2015 +0200 dxgi/tests: Check that DXGI surface implements ID3D11Texture2D. --- dlls/dxgi/tests/device.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c index d6db790..fe2c453 100644 --- a/dlls/dxgi/tests/device.c +++ b/dlls/dxgi/tests/device.c @@ -172,10 +172,10 @@ done: static void test_create_surface(void) { - ID3D10Texture2D *texture; - IDXGISurface *surface; DXGI_SURFACE_DESC desc; + IDXGISurface *surface; IDXGIDevice *device; + IUnknown *texture; ULONG refcount; HRESULT hr; @@ -196,7 +196,12 @@ static void test_create_surface(void) hr = IDXGISurface_QueryInterface(surface, &IID_ID3D10Texture2D, (void **)&texture); ok(SUCCEEDED(hr), "Surface should implement ID3D10Texture2D\n"); - if (SUCCEEDED(hr)) ID3D10Texture2D_Release(texture); + IUnknown_Release(texture); + + hr = IDXGISurface_QueryInterface(surface, &IID_ID3D11Texture2D, (void **)&texture); + ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */, + "Surface should implement ID3D11Texture2D.\n"); + if (SUCCEEDED(hr)) IUnknown_Release(texture); IDXGISurface_Release(surface); refcount = IDXGIDevice_Release(device); From julliard at wine.codeweavers.com Mon Sep 14 09:44:34 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:34 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi/tests: Add missing DestroyWindow() call in test_createswapchain(). Message-ID: Module: wine Branch: master Commit: 7d9049c2dfdbb9cd6e44bbcee5bc52ed79a2ee5d URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d9049c2dfdbb9cd6e44bbcee5bc52ed79a2ee5d Author: J?zef Kucia Date: Mon Sep 14 00:13:39 2015 +0200 dxgi/tests: Add missing DestroyWindow() call in test_createswapchain(). --- dlls/dxgi/tests/device.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c index fe2c453..1e9507f 100644 --- a/dlls/dxgi/tests/device.c +++ b/dlls/dxgi/tests/device.c @@ -520,6 +520,7 @@ static void test_createswapchain(void) IUnknown_Release(obj); refcount = IDXGIDevice_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); + DestroyWindow(creation_desc.OutputWindow); } static void test_create_factory(void) From julliard at wine.codeweavers.com Mon Sep 14 09:44:35 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:35 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi/tests: Remove leftover debug comment. Message-ID: Module: wine Branch: master Commit: ef3afcf649411976ba754106a8c791c46ad5ce97 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ef3afcf649411976ba754106a8c791c46ad5ce97 Author: J?zef Kucia Date: Mon Sep 14 00:13:40 2015 +0200 dxgi/tests: Remove leftover debug comment. --- dlls/dxgi/tests/device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c index 1e9507f..008da26 100644 --- a/dlls/dxgi/tests/device.c +++ b/dlls/dxgi/tests/device.c @@ -1060,7 +1060,7 @@ static void test_swapchain_parameters(void) {TRUE, 0, 2 /* undefined */, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, {TRUE, 1, 2 /* undefined */, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, {TRUE, 2, 2 /* undefined */, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, - {TRUE, 0, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, /*10 */ + {TRUE, 0, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, {TRUE, 1, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, {TRUE, 2, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, S_OK, DXGI_ERROR_INVALID_CALL, 1}, {TRUE, 3, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, S_OK, DXGI_ERROR_INVALID_CALL, 2}, From julliard at wine.codeweavers.com Mon Sep 14 09:44:35 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:35 -0500 Subject: Hans Leidekker : webservices: Implement WsCreateHeap and WsFreeHeap. Message-ID: Module: wine Branch: master Commit: 5db34f7da17fdd86fc797b3bbea8401fb51041db URL: http://source.winehq.org/git/wine.git/?a=commit;h=5db34f7da17fdd86fc797b3bbea8401fb51041db Author: Hans Leidekker Date: Mon Sep 14 14:04:01 2015 +0200 webservices: Implement WsCreateHeap and WsFreeHeap. --- dlls/webservices/reader.c | 91 +++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 4 +- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index ac7de65..3084fe5 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -150,6 +150,97 @@ void WINAPI WsFreeError( WS_ERROR *handle ) heap_free( error ); } +static const struct +{ + ULONG size; + BOOL readonly; +} +heap_props[] = +{ + { sizeof(SIZE_T), FALSE }, /* WS_HEAP_PROPERTY_MAX_SIZE */ + { sizeof(SIZE_T), FALSE }, /* WS_HEAP_PROPERTY_TRIM_SIZE */ + { sizeof(SIZE_T), TRUE }, /* WS_HEAP_PROPERTY_REQUESTED_SIZE */ + { sizeof(SIZE_T), TRUE } /* WS_HEAP_PROPERTY_ACTUAL_SIZE */ +}; + +struct heap +{ + HANDLE handle; + ULONG prop_count; + WS_HEAP_PROPERTY prop[sizeof(heap_props)/sizeof(heap_props[0])]; +}; + +static struct heap *alloc_heap(void) +{ + static const ULONG count = sizeof(heap_props)/sizeof(heap_props[0]); + struct heap *ret; + ULONG i, size = sizeof(*ret) + count * sizeof(WS_HEAP_PROPERTY); + char *ptr; + + for (i = 0; i < count; i++) size += heap_props[i].size; + if (!(ret = heap_alloc_zero( size ))) return NULL; + + ptr = (char *)&ret->prop[count]; + for (i = 0; i < count; i++) + { + ret->prop[i].value = ptr; + ret->prop[i].valueSize = heap_props[i].size; + ptr += ret->prop[i].valueSize; + } + ret->prop_count = count; + return ret; +} + +static HRESULT set_heap_prop( struct heap *heap, WS_HEAP_PROPERTY_ID id, const void *value, ULONG size ) +{ + if (id >= heap->prop_count || size != heap_props[id].size || heap_props[id].readonly) + return E_INVALIDARG; + + memcpy( heap->prop[id].value, value, size ); + return S_OK; +} + +/************************************************************************** + * WsCreateHeap [webservices.@] + */ +HRESULT WINAPI WsCreateHeap( SIZE_T max_size, SIZE_T trim_size, const WS_HEAP_PROPERTY *properties, + ULONG count, WS_HEAP **handle, WS_ERROR *error ) +{ + struct heap *heap; + + TRACE( "%u %u %p %u %p %p\n", (ULONG)max_size, (ULONG)trim_size, properties, count, handle, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!handle || count) return E_INVALIDARG; + if (!(heap = alloc_heap())) return E_OUTOFMEMORY; + + set_heap_prop( heap, WS_HEAP_PROPERTY_MAX_SIZE, &max_size, sizeof(max_size) ); + set_heap_prop( heap, WS_HEAP_PROPERTY_TRIM_SIZE, &trim_size, sizeof(trim_size) ); + + if (!(heap->handle = HeapCreate( 0, 0, max_size ))) + { + heap_free( heap ); + return E_OUTOFMEMORY; + } + + *handle = (WS_HEAP *)heap; + return S_OK; +} + +/************************************************************************** + * WsFreeHeap [webservices.@] + */ +void WINAPI WsFreeHeap( WS_HEAP *handle ) +{ + struct heap *heap = (struct heap *)handle; + + TRACE( "%p\n", handle ); + + if (!heap) return; + HeapDestroy( heap->handle ); + heap_free( heap ); +} + /************************************************************************** * WsGetErrorProperty [webservices.@] */ diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 0ff3c0d..4136dcc 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -24,7 +24,7 @@ @ stub WsCreateChannelForListener @ stdcall WsCreateError(ptr long ptr) @ stub WsCreateFaultFromError -@ stub WsCreateHeap +@ stdcall WsCreateHeap(long long ptr long ptr ptr) @ stub WsCreateListener @ stub WsCreateMessage @ stub WsCreateMessageForChannel @@ -50,7 +50,7 @@ @ stub WsFlushWriter @ stub WsFreeChannel @ stdcall WsFreeError(ptr) -@ stub WsFreeHeap +@ stdcall WsFreeHeap(ptr) @ stub WsFreeListener @ stub WsFreeMessage @ stub WsFreeMetadata From julliard at wine.codeweavers.com Mon Sep 14 09:44:35 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Mon, 14 Sep 2015 09:44:35 -0500 Subject: Hans Leidekker : webservices: Implement WsGetHeapProperty. Message-ID: Module: wine Branch: master Commit: 9061ee4e8c78f058c15d3dc85b385a8d77a131a3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9061ee4e8c78f058c15d3dc85b385a8d77a131a3 Author: Hans Leidekker Date: Mon Sep 14 14:04:27 2015 +0200 webservices: Implement WsGetHeapProperty. --- dlls/webservices/reader.c | 23 +++++++++++++ dlls/webservices/tests/reader.c | 72 +++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 3084fe5..a0123aa 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -200,6 +200,15 @@ static HRESULT set_heap_prop( struct heap *heap, WS_HEAP_PROPERTY_ID id, const v return S_OK; } +static HRESULT get_heap_prop( struct heap *heap, WS_HEAP_PROPERTY_ID id, void *buf, ULONG size ) +{ + if (id >= heap->prop_count || size != heap_props[id].size) + return E_INVALIDARG; + + memcpy( buf, heap->prop[id].value, heap->prop[id].valueSize ); + return S_OK; +} + /************************************************************************** * WsCreateHeap [webservices.@] */ @@ -254,6 +263,20 @@ HRESULT WINAPI WsGetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, vo } /************************************************************************** + * WsGetHeapProperty [webservices.@] + */ +HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void *buf, + ULONG size, WS_ERROR *error ) +{ + struct heap *heap = (struct heap *)handle; + + TRACE( "%p %u %p %u %p\n", handle, id, buf, size, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + return get_heap_prop( heap, id, buf, size ); +} + +/************************************************************************** * WsSetErrorProperty [webservices.@] */ HRESULT WINAPI WsSetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, const void *value, diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c index 0db68a0..4b247d9 100644 --- a/dlls/webservices/tests/reader.c +++ b/dlls/webservices/tests/reader.c @@ -112,7 +112,79 @@ static void test_WsCreateError(void) ok( hr == E_INVALIDARG, "got %08x\n", hr ); } +static void test_WsCreateHeap(void) +{ + HRESULT hr; + WS_HEAP *heap; + WS_HEAP_PROPERTY prop; + SIZE_T max, trim, requested, actual; + ULONG size; + + hr = WsCreateHeap( 0, 0, NULL, 0, NULL, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + heap = NULL; + hr = WsCreateHeap( 0, 0, NULL, 0, &heap, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( heap != NULL, "heap not set\n" ); + WsFreeHeap( heap ); + + hr = WsCreateHeap( 1 << 16, 1 << 6, NULL, 0, NULL, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + heap = NULL; + hr = WsCreateHeap( 1 << 16, 0, NULL, 0, &heap, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( heap != NULL, "heap not set\n" ); + WsFreeHeap( heap ); + + hr = WsCreateHeap( 1 << 16, 1 << 6, NULL, 0, &heap, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + max = 0xdeadbeef; + size = sizeof(max); + hr = WsGetHeapProperty( heap, WS_HEAP_PROPERTY_MAX_SIZE, &max, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( max == 1 << 16, "got %u\n", (ULONG)max ); + + trim = 0xdeadbeef; + size = sizeof(trim); + hr = WsGetHeapProperty( heap, WS_HEAP_PROPERTY_TRIM_SIZE, &trim, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( trim == 1 << 6, "got %u\n", (ULONG)trim ); + + requested = 0xdeadbeef; + size = sizeof(requested); + hr = WsGetHeapProperty( heap, WS_HEAP_PROPERTY_REQUESTED_SIZE, &requested, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !requested, "got %u\n", (ULONG)requested ); + + actual = 0xdeadbeef; + size = sizeof(actual); + hr = WsGetHeapProperty( heap, WS_HEAP_PROPERTY_ACTUAL_SIZE, &actual, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !actual, "got %u\n", (ULONG)actual ); + + actual = 0xdeadbeef; + size = sizeof(actual); + hr = WsGetHeapProperty( heap, WS_HEAP_PROPERTY_ACTUAL_SIZE + 1, &actual, size, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + ok( actual == 0xdeadbeef, "got %u\n", (ULONG)actual ); + WsFreeHeap( heap ); + + max = 1 << 16; + prop.id = WS_HEAP_PROPERTY_MAX_SIZE; + prop.value = &max; + prop.valueSize = sizeof(max); + hr = WsCreateHeap( 1 << 16, 1 << 6, &prop, 1, &heap, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + hr = WsCreateHeap( 1 << 16, 1 << 6, NULL, 1, &heap, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); +} + START_TEST(reader) { test_WsCreateError(); + test_WsCreateHeap(); } diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 4136dcc..4cb35f6 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -68,7 +68,7 @@ @ stub WsGetFaultErrorProperty @ stub WsGetHeader @ stub WsGetHeaderAttributes -@ stub WsGetHeapProperty +@ stdcall WsGetHeapProperty(ptr long ptr long ptr) @ stub WsGetListenerProperty @ stub WsGetMappedHeader @ stub WsGetMessageProperty From jnewman at wine.codeweavers.com Mon Sep 14 16:34:26 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Mon, 14 Sep 2015 16:34:26 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: Add WWN 398 Message-ID: Module: website Branch: master Commit: 9bb67e2cec80938ae70afb4f2960d3a5f2e4fc16 URL: http://source.winehq.org/git/website.git/?a=commit;h=9bb67e2cec80938ae70afb4f2960d3a5f2e4fc16 Author: Andr? Hentschel Date: Mon Sep 14 21:03:04 2015 +0200 Add WWN 398 --- news/de/2015091401.xml | 12 + news/en/2015091401.xml | 12 + wwn/en/wn20150914_398.xml | 638 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 662 insertions(+) Diff: http://source.winehq.org/git/website.git/?a=commitdiff;h=9bb67e2cec80938ae70afb4f2960d3a5f2e4fc16 From julliard at wine.codeweavers.com Tue Sep 15 09:50:49 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:49 -0500 Subject: Nikolay Sivov : regedit: Block sorting by key value. Message-ID: Module: wine Branch: master Commit: e428884c0c9e05d9f04aa058538c1fbf91de4669 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e428884c0c9e05d9f04aa058538c1fbf91de4669 Author: Nikolay Sivov Date: Tue Sep 15 00:01:21 2015 +0300 regedit: Block sorting by key value. --- programs/regedit/listview.c | 1 + 1 file changed, 1 insertion(+) diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c index 6559116..d11d859 100644 --- a/programs/regedit/listview.c +++ b/programs/regedit/listview.c @@ -337,6 +337,7 @@ static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSor return g_invertSort ? (int)r->dwValType - (int)l->dwValType : (int)l->dwValType - (int)r->dwValType; if (g_columnToSort == 2) { /* FIXME: Sort on value */ + return 0; } return g_invertSort ? lstrcmpiW(r->name, l->name) : lstrcmpiW(l->name, r->name); } From julliard at wine.codeweavers.com Tue Sep 15 09:50:49 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:49 -0500 Subject: Nikolay Sivov : regedit: When sorting by key type consistently compare types. Message-ID: Module: wine Branch: master Commit: a72482fd39ade6b846c52d9816f3b8e889467b2c URL: http://source.winehq.org/git/wine.git/?a=commit;h=a72482fd39ade6b846c52d9816f3b8e889467b2c Author: Nikolay Sivov Date: Tue Sep 15 00:02:32 2015 +0300 regedit: When sorting by key type consistently compare types. Otherwise when sorting by type for key with same type list get sorted by name. --- programs/regedit/listview.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c index d11d859..c0119ff 100644 --- a/programs/regedit/listview.c +++ b/programs/regedit/listview.c @@ -333,7 +333,7 @@ static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSor if (g_columnToSort == ~0U) g_columnToSort = 0; - if (g_columnToSort == 1 && l->dwValType != r->dwValType) + if (g_columnToSort == 1) return g_invertSort ? (int)r->dwValType - (int)l->dwValType : (int)l->dwValType - (int)r->dwValType; if (g_columnToSort == 2) { /* FIXME: Sort on value */ From julliard at wine.codeweavers.com Tue Sep 15 09:50:49 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:49 -0500 Subject: Nikolay Sivov : configure: Add a symlink for wingding.ttf. Message-ID: Module: wine Branch: master Commit: 3fb6817554f52320330a60b98a7543bf1881ab99 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3fb6817554f52320330a60b98a7543bf1881ab99 Author: Nikolay Sivov Date: Tue Sep 15 00:31:54 2015 +0300 configure: Add a symlink for wingding.ttf. --- configure | 4 +++- configure.ac | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/configure b/configure index aeec729..00d3e5d 100755 --- a/configure +++ b/configure @@ -17133,7 +17133,8 @@ ac_config_links="$ac_config_links fonts/marlett.ttf:fonts/marlett.ttf" ac_config_links="$ac_config_links fonts/symbol.ttf:fonts/symbol.ttf" ac_config_links="$ac_config_links fonts/tahoma.ttf:fonts/tahoma.ttf" ac_config_links="$ac_config_links fonts/tahomabd.ttf:fonts/tahomabd.ttf" -test "$srcdir" = "." || wine_fn_config_symlink fonts/marlett.ttf fonts/symbol.ttf fonts/tahoma.ttf fonts/tahomabd.ttf +ac_config_links="$ac_config_links fonts/wingding.ttf:fonts/wingding.ttf" +test "$srcdir" = "." || wine_fn_config_symlink fonts/marlett.ttf fonts/symbol.ttf fonts/tahoma.ttf fonts/tahomabd.ttf fonts/wingding.ttf fi ac_config_links="$ac_config_links loader/l_intl.nls:loader/l_intl.nls" test "$srcdir" = "." || wine_fn_config_symlink loader/l_intl.nls @@ -18909,6 +18910,7 @@ do "fonts/symbol.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/symbol.ttf:fonts/symbol.ttf" ;; "fonts/tahoma.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/tahoma.ttf:fonts/tahoma.ttf" ;; "fonts/tahomabd.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/tahomabd.ttf:fonts/tahomabd.ttf" ;; + "fonts/wingding.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/wingding.ttf:fonts/wingding.ttf" ;; "loader/l_intl.nls") CONFIG_LINKS="$CONFIG_LINKS loader/l_intl.nls:loader/l_intl.nls" ;; "po/LINGUAS") CONFIG_LINKS="$CONFIG_LINKS po/LINGUAS:po/LINGUAS" ;; "wine") CONFIG_LINKS="$CONFIG_LINKS wine:tools/winewrapper" ;; diff --git a/configure.ac b/configure.ac index ed7030f..135268f 100644 --- a/configure.ac +++ b/configure.ac @@ -2692,7 +2692,7 @@ test -n "$CROSSTARGET" || WINE_APPEND_RULE( [crosstest: @echo \"crosstest is not supported (mingw not installed?)\" && false]) -WINE_CONFIG_SYMLINK(fonts,fonts,[marlett.ttf,symbol.ttf,tahoma.ttf,tahomabd.ttf],enable_fonts) +WINE_CONFIG_SYMLINK(fonts,fonts,[marlett.ttf,symbol.ttf,tahoma.ttf,tahomabd.ttf,wingding.ttf],enable_fonts) WINE_CONFIG_SYMLINK(loader,loader,[l_intl.nls]) WINE_CONFIG_SYMLINK(po,po,[LINGUAS]) WINE_CONFIG_SYMLINK(,tools,[wine],,winewrapper) From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Nikolay Sivov : oledlg: Fix menu item string format. Message-ID: Module: wine Branch: master Commit: 7e7b4de4b2f5c4f0e23fa870999e0725e1d997b5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7e7b4de4b2f5c4f0e23fa870999e0725e1d997b5 Author: Nikolay Sivov Date: Tue Sep 15 00:11:33 2015 +0300 oledlg: Fix menu item string format. --- dlls/oledlg/oledlg.rc | 2 +- po/ar.po | 2 +- po/bg.po | 2 +- po/ca.po | 2 +- po/cs.po | 2 +- po/da.po | 2 +- po/de.po | 2 +- po/el.po | 2 +- po/en.po | 4 ++-- po/en_US.po | 4 ++-- po/eo.po | 2 +- po/es.po | 2 +- po/fa.po | 2 +- po/fi.po | 2 +- po/fr.po | 2 +- po/he.po | 2 +- po/hi.po | 2 +- po/hr.po | 2 +- po/hu.po | 2 +- po/it.po | 2 +- po/ja.po | 2 +- po/ko.po | 2 +- po/lt.po | 4 ++-- po/ml.po | 2 +- po/nb_NO.po | 2 +- po/nl.po | 2 +- po/or.po | 2 +- po/pa.po | 2 +- po/pl.po | 4 ++-- po/pt_BR.po | 2 +- po/pt_PT.po | 2 +- po/rm.po | 2 +- po/ro.po | 2 +- po/ru.po | 2 +- po/sk.po | 2 +- po/sl.po | 2 +- po/sr_RS at cyrillic.po | 2 +- po/sr_RS at latin.po | 2 +- po/sv.po | 2 +- po/te.po | 2 +- po/th.po | 2 +- po/tr.po | 2 +- po/uk.po | 2 +- po/wa.po | 2 +- po/wine.pot | 2 +- po/zh_CN.po | 2 +- po/zh_TW.po | 2 +- 47 files changed, 51 insertions(+), 51 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=7e7b4de4b2f5c4f0e23fa870999e0725e1d997b5 From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Ken Thomases : winemac: Add a new registry setting, OpenGLSurfaceMode, to control how GL surfaces relate to the window. Message-ID: Module: wine Branch: master Commit: 47708c2635dee471a591a3077178b2ec775fcc62 URL: http://source.winehq.org/git/wine.git/?a=commit;h=47708c2635dee471a591a3077178b2ec775fcc62 Author: Ken Thomases Date: Mon Sep 14 20:35:25 2015 -0500 winemac: Add a new registry setting, OpenGLSurfaceMode, to control how GL surfaces relate to the window. The default behavior is that GL surfaces are on top of all non-GL content in the window. This maximizes the performance for the common case of games, but clipping by parents, siblings, and child windows isn't respected. Setting OpenGLSurfaceMode to "behind" pushes the GL surface to be behind the Mac window. The window has transparent holes punched through it so that the GL surface shows through. USER32 and the wineserver take care of making sure the holes are only where the GL windows would be unclipped and unoccluded. Because the OS X window server has to composite the GL surface with the window, this limits the framerate. Since the Mac driver has no server-side rendering path, GDI rendering to a window which has a GL surface doesn't work. As a partial workaround, mostly for cases where a GL surface is created but never used, setting OpenGLSurfaceMode to "transparent" allows the GDI rendering to show through the transparent parts of the GL surface. The GDI rendering is drawn to the top-level window's surface as normal. (The behavior of user32 to exclude the portion covered by a GL window from GDI rendering is disabled.) The GL surface is in front of the window but potentially wholly or partially transparent. It is composited with the window behind it. The GL surface is initially cleared to be completely transparent. So, if no GL rendering is done, the window will appear as though the GL surface didn't exist. --- dlls/winemac.drv/cocoa_opengl.m | 2 +- dlls/winemac.drv/cocoa_window.m | 31 ++++++++++++++++++++----------- dlls/winemac.drv/macdrv_cocoa.h | 7 +++++++ dlls/winemac.drv/macdrv_main.c | 11 +++++++++++ dlls/winemac.drv/opengl.c | 17 ++++++++++++++++- 5 files changed, 55 insertions(+), 13 deletions(-) diff --git a/dlls/winemac.drv/cocoa_opengl.m b/dlls/winemac.drv/cocoa_opengl.m index 2f46b87..ec2b191 100644 --- a/dlls/winemac.drv/cocoa_opengl.m +++ b/dlls/winemac.drv/cocoa_opengl.m @@ -109,7 +109,7 @@ glDrawBuffer(GL_FRONT_AND_BACK); glDisable(GL_SCISSOR_TEST); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glClearColor(0, 0, 0, 1); + glClearColor(0, 0, 0, gl_surface_mode == GL_SURFACE_IN_FRONT_TRANSPARENT ? 0 : 1); glClear(GL_COLOR_BUFFER_BIT); diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index f68a1c5..4ac03a7 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -198,6 +198,7 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif @property (readonly, copy, nonatomic) NSArray* childWineWindows; - (void) updateColorSpace; + - (void) updateForGLSubviews; - (BOOL) becameEligibleParentOrChild; - (void) becameIneligibleChild; @@ -334,14 +335,14 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif [self setNeedsDisplay:YES]; } - [(WineWindow*)[self window] updateColorSpace]; + [(WineWindow*)[self window] updateForGLSubviews]; } - (void) removeGLContext:(WineOpenGLContext*)context { [glContexts removeObjectIdenticalTo:context]; [pendingGlContexts removeObjectIdenticalTo:context]; - [(WineWindow*)[self window] updateColorSpace]; + [(WineWindow*)[self window] updateForGLSubviews]; } - (void) updateGLContexts @@ -1402,7 +1403,8 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif - (BOOL) needsTransparency { - return self.shape || self.colorKeyed || self.usePerPixelAlpha; + return self.shape || self.colorKeyed || self.usePerPixelAlpha || + (gl_surface_mode == GL_SURFACE_BEHIND && [[self.contentView valueForKeyPath:@"subviews. at max.hasGLContext"] boolValue]); } - (void) checkTransparency @@ -1775,6 +1777,13 @@ static inline NSUInteger adjusted_modifiers_for_option_behavior(NSUInteger modif [self setColorSpace:[NSColorSpace genericRGBColorSpace]]; } + - (void) updateForGLSubviews + { + [self updateColorSpace]; + if (gl_surface_mode == GL_SURFACE_BEHIND) + [self checkTransparency]; + } + /* * ---------- NSResponder method overrides ---------- @@ -2683,7 +2692,7 @@ macdrv_view macdrv_create_view(macdrv_window w, CGRect rect) name:NSApplicationDidChangeScreenParametersNotification object:NSApp]; [[window contentView] addSubview:view]; - [window updateColorSpace]; + [window updateForGLSubviews]; }); [pool release]; @@ -2712,7 +2721,7 @@ void macdrv_dispose_view(macdrv_view v) object:NSApp]; [view removeFromSuperview]; [view release]; - [window updateColorSpace]; + [window updateForGLSubviews]; }); [pool release]; @@ -2737,15 +2746,15 @@ void macdrv_set_view_window_and_frame(macdrv_view v, macdrv_window w, CGRect rec BOOL changedWindow = (window && window != [view window]); NSRect newFrame = NSRectFromCGRect(rect); NSRect oldFrame = [view frame]; - BOOL needUpdateWindowColorSpace = FALSE; + BOOL needUpdateWindowForGLSubviews = FALSE; if (changedWindow) { WineWindow* oldWindow = (WineWindow*)[view window]; [view removeFromSuperview]; - [oldWindow updateColorSpace]; + [oldWindow updateForGLSubviews]; [[window contentView] addSubview:view]; - needUpdateWindowColorSpace = TRUE; + needUpdateWindowForGLSubviews = TRUE; } if (!NSEqualRects(oldFrame, newFrame)) @@ -2759,11 +2768,11 @@ void macdrv_set_view_window_and_frame(macdrv_view v, macdrv_window w, CGRect rec else [view setFrame:newFrame]; [view setNeedsDisplay:YES]; - needUpdateWindowColorSpace = TRUE; + needUpdateWindowForGLSubviews = TRUE; } - if (needUpdateWindowColorSpace) - [(WineWindow*)[view window] updateColorSpace]; + if (needUpdateWindowForGLSubviews) + [(WineWindow*)[view window] updateForGLSubviews]; }); [pool release]; diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 4b68adc..d5e3f46 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -118,6 +118,12 @@ enum { }; enum { + GL_SURFACE_IN_FRONT_OPAQUE, + GL_SURFACE_IN_FRONT_TRANSPARENT, + GL_SURFACE_BEHIND, +}; + +enum { MACDRV_HOTKEY_SUCCESS, MACDRV_HOTKEY_ALREADY_REGISTERED, MACDRV_HOTKEY_FAILURE, @@ -149,6 +155,7 @@ extern int right_option_is_alt DECLSPEC_HIDDEN; extern int allow_immovable_windows DECLSPEC_HIDDEN; extern int cursor_clipping_locks_windows DECLSPEC_HIDDEN; extern int use_precise_scrolling DECLSPEC_HIDDEN; +extern int gl_surface_mode DECLSPEC_HIDDEN; extern int macdrv_start_cocoa_app(unsigned long long tickcount) DECLSPEC_HIDDEN; extern void macdrv_window_rejected_focus(const struct macdrv_event *event) DECLSPEC_HIDDEN; diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 38352a8..62c70df 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -57,6 +57,7 @@ BOOL disable_window_decorations = FALSE; int allow_immovable_windows = TRUE; int cursor_clipping_locks_windows = TRUE; int use_precise_scrolling = TRUE; +int gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE; HMODULE macdrv_module = 0; @@ -183,6 +184,16 @@ static void setup_options(void) if (!get_config_key(hkey, appkey, "UsePreciseScrolling", buffer, sizeof(buffer))) use_precise_scrolling = IS_OPTION_TRUE(buffer[0]); + if (!get_config_key(hkey, appkey, "OpenGLSurfaceMode", buffer, sizeof(buffer))) + { + if (!strcmp(buffer, "transparent")) + gl_surface_mode = GL_SURFACE_IN_FRONT_TRANSPARENT; + else if (!strcmp(buffer, "behind")) + gl_surface_mode = GL_SURFACE_BEHIND; + else + gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE; + } + if (appkey) RegCloseKey(appkey); if (hkey) RegCloseKey(hkey); } diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index 220efa3..a6f1440 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -1480,6 +1480,21 @@ static BOOL create_context(struct wgl_context *context, CGLContextObj share, uns return FALSE; } + if (gl_surface_mode == GL_SURFACE_IN_FRONT_TRANSPARENT) + { + GLint opacity = 0; + err = CGLSetParameter(context->cglcontext, kCGLCPSurfaceOpacity, &opacity); + if (err != kCGLNoError) + WARN("CGLSetParameter(kCGLCPSurfaceOpacity) failed with error %d %s; leaving opaque\n", err, CGLErrorString(err)); + } + else if (gl_surface_mode == GL_SURFACE_BEHIND) + { + GLint order = -1; + err = CGLSetParameter(context->cglcontext, kCGLCPSurfaceOrder, &order); + if (err != kCGLNoError) + WARN("CGLSetParameter(kCGLCPSurfaceOrder) failed with error %d %s; leaving in front\n", err, CGLErrorString(err)); + } + context->context = macdrv_create_opengl_context(context->cglcontext); CGLReleaseContext(context->cglcontext); if (!context->context) @@ -1638,7 +1653,7 @@ static BOOL set_pixel_format(HDC hdc, int fmt, BOOL allow_reset) done: release_win_data(data); - if (ret) __wine_set_pixel_format(hwnd, fmt); + if (ret && gl_surface_mode == GL_SURFACE_BEHIND) __wine_set_pixel_format(hwnd, fmt); return ret; } From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Dmitry Timoshkov : oleaut32: Use correct interface pointer. Message-ID: Module: wine Branch: master Commit: 6c83dd2d99af05606d625aa40374484d0b376f6e URL: http://source.winehq.org/git/wine.git/?a=commit;h=6c83dd2d99af05606d625aa40374484d0b376f6e Author: Dmitry Timoshkov Date: Tue Sep 15 11:35:57 2015 +0800 oleaut32: Use correct interface pointer. --- dlls/oleaut32/typelib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 650fa21..0891098 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -7885,19 +7885,19 @@ static HRESULT WINAPI ITypeInfo_fnGetContainingTypeLib( ITypeInfo2 *iface, ITypeLib * *ppTLib, UINT *pIndex) { ITypeInfoImpl *This = impl_from_ITypeInfo2(iface); - + /* If a pointer is null, we simply ignore it, the ATL in particular passes pIndex as 0 */ if (pIndex) { *pIndex=This->index; TRACE("returning pIndex=%d\n", *pIndex); } - + if (ppTLib) { - *ppTLib=(LPTYPELIB )(This->pTypeLib); + *ppTLib = (ITypeLib *)&This->pTypeLib->ITypeLib2_iface; ITypeLib_AddRef(*ppTLib); TRACE("returning ppTLib=%p\n", *ppTLib); } - + return S_OK; } From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: =?UTF-8?Q?Lauri=20Kentt=C3=A4=20?=: ntdll/tests: Fix error message. Message-ID: Module: wine Branch: master Commit: b3d51fb78b5561c6fb605931a86f11d789525c67 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3d51fb78b5561c6fb605931a86f11d789525c67 Author: Lauri Kentt? Date: Mon Sep 14 19:32:13 2015 +0300 ntdll/tests: Fix error message. --- dlls/ntdll/tests/rtl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 4903790..9a4ec48 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -877,10 +877,10 @@ static void test_RtlRandom(void) } /* if */ result = pRtlRandom(&seed); ok(result == result_expected, - "test: 0x%x%08x RtlUniform(&seed (seed == %x)) returns %x, expected %x\n", + "test: 0x%x%08x RtlRandom(&seed (seed == %x)) returns %x, expected %x\n", (DWORD)(num >> 32), (DWORD)num, seed_bak, result, result_expected); ok(seed == seed_expected, - "test: 0x%x%08x RtlUniform(&seed (seed == %x)) sets seed to %x, expected %x\n", + "test: 0x%x%08x RtlRandom(&seed (seed == %x)) sets seed to %x, expected %x\n", (DWORD)(num >> 32), (DWORD)num, seed_bak, result, seed_expected); } /* for */ } From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: =?UTF-8?Q?Lauri=20Kentt=C3=A4=20?=: po: Update Finnish translation. Message-ID: Module: wine Branch: master Commit: b5e3edbd3af7eafdb4ee2c9eca1dc392ea889b7f URL: http://source.winehq.org/git/wine.git/?a=commit;h=b5e3edbd3af7eafdb4ee2c9eca1dc392ea889b7f Author: Lauri Kentt? Date: Mon Sep 14 19:31:04 2015 +0300 po: Update Finnish translation. --- po/fi.po | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/fi.po b/po/fi.po index 4b1e2f6..e4a2bf2 100644 --- a/po/fi.po +++ b/po/fi.po @@ -7445,16 +7445,12 @@ msgid "&Convert..." msgstr "&Muunna..." #: oledlg.rc:36 -#, fuzzy -#| msgid "&Object" msgid "%1 %2 &Object" -msgstr "&Objekti" +msgstr "%1 %2 &Objekti" #: oledlg.rc:34 -#, fuzzy -#| msgid "&Object" msgid "%1 &Object" -msgstr "&Objekti" +msgstr "%1 &Objekti" #: oledlg.rc:33 oleview.rc:40 msgid "&Object" From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Piotr Caban : msvcr120: Add missing win64 exports. Message-ID: Module: wine Branch: master Commit: 05d2a083065a4bff429322eff43352b352b8b4e9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=05d2a083065a4bff429322eff43352b352b8b4e9 Author: Piotr Caban Date: Mon Sep 14 17:48:35 2015 +0200 msvcr120: Add missing win64 exports. --- dlls/msvcr120/msvcr120.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 0eb7ade..184c9b5 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -291,6 +291,7 @@ @ stub -arch=i386 ??1_SpinLock at details@Concurrency@@QAE at XZ @ stub -arch=win64 ??1_SpinLock at details@Concurrency@@QEAA at XZ @ stub -arch=i386 ??1_StructuredTaskCollection at details@Concurrency@@QAE at XZ +@ stub -arch=win64 ??1_StructuredTaskCollection at details@Concurrency@@QEAA at XZ @ stub -arch=arm ??1_TaskCollection at details@Concurrency@@QAA at XZ @ stub -arch=i386 ??1_TaskCollection at details@Concurrency@@QAE at XZ @ stub -arch=win64 ??1_TaskCollection at details@Concurrency@@QEAA at XZ @@ -398,7 +399,8 @@ @ stub -arch=win32 ?Alloc at Concurrency@@YAPAXI at Z @ stub -arch=win64 ?Alloc at Concurrency@@YAPEAX_K at Z @ stub ?Block at Context@Concurrency@@SAXXZ -@ stub ?CaptureCallstack at platform@details at Concurrency@@YAIPAPAXII at Z +@ stub -arch=win32 ?CaptureCallstack at platform@details at Concurrency@@YAIPAPAXII at Z +@ stub -arch=win64 ?CaptureCallstack at platform@details at Concurrency@@YA_KPEAPEAX_K1 at Z @ stub -arch=win32 ?Create at CurrentScheduler@Concurrency@@SAXABVSchedulerPolicy at 2@@Z @ stub -arch=win64 ?Create at CurrentScheduler@Concurrency@@SAXAEBVSchedulerPolicy at 2@@Z @ stub -arch=win32 ?Create at Scheduler@Concurrency@@SAPAV12 at ABVSchedulerPolicy@2@@Z @@ -1637,6 +1639,7 @@ @ stdcall -arch=i386 _seh_longjmp_unwind4(ptr) @ stdcall -arch=i386 _seh_longjmp_unwind(ptr) @ cdecl -arch=i386 _set_SSE2_enable(long) MSVCRT__set_SSE2_enable +@ stub -arch=win64 _set_FMA3_enable @ cdecl _set_abort_behavior(long long) MSVCRT__set_abort_behavior @ cdecl _set_controlfp(long long) @ cdecl _set_doserrno(long) From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Piotr Caban : msvcrt: Add _wctime32_s implementation. Message-ID: Module: wine Branch: master Commit: ecac39c19b8938066978f4c6b4a6e617d9ccf2ff URL: http://source.winehq.org/git/wine.git/?a=commit;h=ecac39c19b8938066978f4c6b4a6e617d9ccf2ff Author: Piotr Caban Date: Mon Sep 14 17:48:44 2015 +0200 msvcrt: Add _wctime32_s implementation. --- dlls/msvcr100/msvcr100.spec | 4 ++-- dlls/msvcr110/msvcr110.spec | 4 ++-- dlls/msvcr120/msvcr120.spec | 4 ++-- dlls/msvcr120_app/msvcr120_app.spec | 4 ++-- dlls/msvcr80/msvcr80.spec | 4 ++-- dlls/msvcr90/msvcr90.spec | 4 ++-- dlls/msvcrt/msvcrt.spec | 4 ++-- dlls/msvcrt/time.c | 47 ++++++++++++++++++++++++++++++++++++- 8 files changed, 60 insertions(+), 15 deletions(-) diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index f9eae91..edff2c9 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1525,9 +1525,9 @@ @ cdecl _wcsupr_s_l(wstr long ptr) MSVCRT__wcsupr_s_l @ cdecl _wcsxfrm_l(ptr wstr long ptr) MSVCRT__wcsxfrm_l @ cdecl _wctime32(ptr) MSVCRT__wctime32 -@ stub _wctime32_s +@ cdecl _wctime32_s(ptr long ptr) MSVCRT__wctime32_s @ cdecl _wctime64(ptr) MSVCRT__wctime64 -@ stub _wctime64_s +@ cdecl _wctime64_s(ptr long ptr) MSVCRT__wctime64_s @ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l # extern _wctype diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 51eddfb..9dda90a 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1884,9 +1884,9 @@ @ cdecl _wcsupr_s_l(wstr long ptr) MSVCRT__wcsupr_s_l @ cdecl _wcsxfrm_l(ptr wstr long ptr) MSVCRT__wcsxfrm_l @ cdecl _wctime32(ptr) MSVCRT__wctime32 -@ stub _wctime32_s +@ cdecl _wctime32_s(ptr long ptr) MSVCRT__wctime32_s @ cdecl _wctime64(ptr) MSVCRT__wctime64 -@ stub _wctime64_s +@ cdecl _wctime64_s(ptr long ptr) MSVCRT__wctime64_s @ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l # extern _wctype diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 184c9b5..6e13eef 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1908,9 +1908,9 @@ @ cdecl _wcsupr_s_l(wstr long ptr) MSVCRT__wcsupr_s_l @ cdecl _wcsxfrm_l(ptr wstr long ptr) MSVCRT__wcsxfrm_l @ cdecl _wctime32(ptr) MSVCRT__wctime32 -@ stub _wctime32_s +@ cdecl _wctime32_s(ptr long ptr) MSVCRT__wctime32_s @ cdecl _wctime64(ptr) MSVCRT__wctime64 -@ stub _wctime64_s +@ cdecl _wctime64_s(ptr long ptr) MSVCRT__wctime64_s @ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l # extern _wctype diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index ec97ad7..bc4d63b 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1601,9 +1601,9 @@ @ cdecl _wcsupr_s_l(wstr long ptr) msvcr120._wcsupr_s_l @ cdecl _wcsxfrm_l(ptr wstr long ptr) msvcr120._wcsxfrm_l @ cdecl _wctime32(ptr) msvcr120._wctime32 -@ stub _wctime32_s +@ cdecl _wctime32_s(ptr long ptr) msvcr120._wctime32_s @ cdecl _wctime64(ptr) msvcr120._wctime64 -@ stub _wctime64_s +@ cdecl _wctime64_s(ptr long ptr) msvcr120._wctime64_s @ cdecl _wctomb_l(ptr long ptr) msvcr120._wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) msvcr120._wctomb_s_l # extern _wctype diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index fac2446..cc10014 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1205,9 +1205,9 @@ @ cdecl _wcsupr_s_l(wstr long ptr) MSVCRT__wcsupr_s_l @ cdecl _wcsxfrm_l(ptr wstr long ptr) MSVCRT__wcsxfrm_l @ cdecl _wctime32(ptr) MSVCRT__wctime32 -@ stub _wctime32_s +@ cdecl _wctime32_s(ptr long ptr) MSVCRT__wctime32_s @ cdecl _wctime64(ptr) MSVCRT__wctime64 -@ stub _wctime64_s +@ cdecl _wctime64_s(ptr long ptr) MSVCRT__wctime64_s @ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l # extern _wctype diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 479b88b..e5415c4 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1180,9 +1180,9 @@ @ cdecl _wcsupr_s_l(wstr long ptr) MSVCRT__wcsupr_s_l @ cdecl _wcsxfrm_l(ptr wstr long ptr) MSVCRT__wcsxfrm_l @ cdecl _wctime32(ptr) MSVCRT__wctime32 -@ stub _wctime32_s +@ cdecl _wctime32_s(ptr long ptr) MSVCRT__wctime32_s @ cdecl _wctime64(ptr) MSVCRT__wctime64 -@ stub _wctime64_s +@ cdecl _wctime64_s(ptr long ptr) MSVCRT__wctime64_s @ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l # extern _wctype diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 37b94e3..3bd47d2 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1137,9 +1137,9 @@ @ cdecl _wcsxfrm_l(ptr wstr long ptr) MSVCRT__wcsxfrm_l @ cdecl _wctime(ptr) MSVCRT__wctime @ cdecl _wctime32(ptr) MSVCRT__wctime32 -# stub _wctime32_s(ptr long ptr) +@ cdecl _wctime32_s(ptr long ptr) MSVCRT__wctime32_s @ cdecl _wctime64(ptr) MSVCRT__wctime64 -# stub _wctime64_s(ptr long ptr) +@ cdecl _wctime64_s(ptr long ptr) MSVCRT__wctime64_s @ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l @ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l # extern _wctype diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c index e52e1d8..7fed3b3 100644 --- a/dlls/msvcrt/time.c +++ b/dlls/msvcrt/time.c @@ -1358,7 +1358,7 @@ int CDECL MSVCRT__wasctime_s(MSVCRT_wchar_t* time, MSVCRT_size_t size, const str if (!MSVCRT_CHECK_PMT(mstm != NULL)) return MSVCRT_EINVAL; ret = MSVCRT_asctime_s(buffer, sizeof(buffer), mstm); - if(!ret) + if(ret) return ret; MultiByteToWideChar(CP_ACP, 0, buffer, -1, time, size); return 0; @@ -1469,6 +1469,51 @@ MSVCRT_wchar_t * CDECL MSVCRT__wctime(const MSVCRT___time32_t *time) #endif /********************************************************************* + * _wctime64_s (MSVCRT.@) + */ +int CDECL MSVCRT__wctime64_s(MSVCRT_wchar_t *buf, + MSVCRT_size_t size, const MSVCRT___time64_t *time) +{ + struct MSVCRT_tm tm; + int ret; + + if(!MSVCRT_CHECK_PMT(buf != NULL)) return MSVCRT_EINVAL; + if(!MSVCRT_CHECK_PMT(size != 0)) return MSVCRT_EINVAL; + buf[0] = 0; + if(!MSVCRT_CHECK_PMT(time != NULL)) return MSVCRT_EINVAL; + if(!MSVCRT_CHECK_PMT(*time >= 0)) return MSVCRT_EINVAL; + if(!MSVCRT_CHECK_PMT(*time <= _MAX__TIME64_T)) return MSVCRT_EINVAL; + + ret = _localtime64_s(&tm, time); + if(ret != 0) + return ret; + + return MSVCRT__wasctime_s(buf, size, &tm); +} + +/********************************************************************* + * _wctime32_s (MSVCRT.@) + */ +int CDECL MSVCRT__wctime32_s(MSVCRT_wchar_t *buf, MSVCRT_size_t size, + const MSVCRT___time32_t *time) +{ + struct MSVCRT_tm tm; + int ret; + + if(!MSVCRT_CHECK_PMT(buf != NULL)) return MSVCRT_EINVAL; + if(!MSVCRT_CHECK_PMT(size != 0)) return MSVCRT_EINVAL; + buf[0] = 0; + if(!MSVCRT_CHECK_PMT(time != NULL)) return MSVCRT_EINVAL; + if(!MSVCRT_CHECK_PMT(*time >= 0)) return MSVCRT_EINVAL; + + ret = _localtime32_s(&tm, time); + if(ret != 0) + return ret; + + return MSVCRT__wasctime_s(buf, size, &tm); +} + +/********************************************************************* * _get_timezone (MSVCR100.@) */ int CDECL _get_timezone(LONG *timezone) From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Erich E. Hoover : wineps.drv: Add support for PostScript Format 1 glyph names. Message-ID: Module: wine Branch: master Commit: ce0fbe4f1e3054db6284dd5397c52b7dd6d182f7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce0fbe4f1e3054db6284dd5397c52b7dd6d182f7 Author: Erich E. Hoover Date: Wed Sep 2 17:21:15 2015 -0600 wineps.drv: Add support for PostScript Format 1 glyph names. In order to generate a searchable PDF from a PostScript document the glyph names must follow Adobe's convention. --- dlls/wineps.drv/download.c | 321 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 318 insertions(+), 3 deletions(-) diff --git a/dlls/wineps.drv/download.c b/dlls/wineps.drv/download.c index e5b57f7..0c4c5a7 100644 --- a/dlls/wineps.drv/download.c +++ b/dlls/wineps.drv/download.c @@ -30,6 +30,8 @@ #include "winnls.h" #include "psdrv.h" +#include "data/agl.h" + #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(psdrv); @@ -359,11 +361,324 @@ BOOL PSDRV_WriteSetDownloadFont(PHYSDEV dev, BOOL vertical) return TRUE; } +static void get_standard_glyph_name(WORD index, char *name) +{ + static const GLYPHNAME nonbreakingspace = { -1, "nonbreakingspace" }; + static const GLYPHNAME nonmarkingreturn = { -1, "nonmarkingreturn" }; + static const GLYPHNAME notdef = { -1, ".notdef" }; + static const GLYPHNAME null = { -1, ".null" }; + /* These PostScript Format 1 glyph names are stored by glyph index, do not reorder them. */ + static const GLYPHNAME *glyph_table[] = { + ¬def, + &null, + &nonmarkingreturn, + GN_space, + GN_exclam, + GN_quotedbl, + GN_numbersign, + GN_dollar, + GN_percent, + GN_ampersand, + GN_quotesingle, + GN_parenleft, + GN_parenright, + GN_asterisk, + GN_plus, + GN_comma, + GN_hyphen, + GN_period, + GN_slash, + GN_zero, + GN_one, + GN_two, + GN_three, + GN_four, + GN_five, + GN_six, + GN_seven, + GN_eight, + GN_nine, + GN_colon, + GN_semicolon, + GN_less, + GN_equal, + GN_greater, + GN_question, + GN_at, + GN_A, + GN_B, + GN_C, + GN_D, + GN_E, + GN_F, + GN_G, + GN_H, + GN_I, + GN_J, + GN_K, + GN_L, + GN_M, + GN_N, + GN_O, + GN_P, + GN_Q, + GN_R, + GN_S, + GN_T, + GN_U, + GN_V, + GN_W, + GN_X, + GN_Y, + GN_Z, + GN_bracketleft, + GN_backslash, + GN_bracketright, + GN_asciicircum, + GN_underscore, + GN_grave, + GN_a, + GN_b, + GN_c, + GN_d, + GN_e, + GN_f, + GN_g, + GN_h, + GN_i, + GN_j, + GN_k, + GN_l, + GN_m, + GN_n, + GN_o, + GN_p, + GN_q, + GN_r, + GN_s, + GN_t, + GN_u, + GN_v, + GN_w, + GN_x, + GN_y, + GN_z, + GN_braceleft, + GN_bar, + GN_braceright, + GN_asciitilde, + GN_Adieresis, + GN_Aring, + GN_Ccedilla, + GN_Eacute, + GN_Ntilde, + GN_Odieresis, + GN_Udieresis, + GN_aacute, + GN_agrave, + GN_acircumflex, + GN_adieresis, + GN_atilde, + GN_aring, + GN_ccedilla, + GN_eacute, + GN_egrave, + GN_ecircumflex, + GN_edieresis, + GN_iacute, + GN_igrave, + GN_icircumflex, + GN_idieresis, + GN_ntilde, + GN_oacute, + GN_ograve, + GN_ocircumflex, + GN_odieresis, + GN_otilde, + GN_uacute, + GN_ugrave, + GN_ucircumflex, + GN_udieresis, + GN_dagger, + GN_degree, + GN_cent, + GN_sterling, + GN_section, + GN_bullet, + GN_paragraph, + GN_germandbls, + GN_registered, + GN_copyright, + GN_trademark, + GN_acute, + GN_dieresis, + GN_notequal, + GN_AE, + GN_Oslash, + GN_infinity, + GN_plusminus, + GN_lessequal, + GN_greaterequal, + GN_yen, + GN_mu, + GN_partialdiff, + GN_summation, + GN_product, + GN_pi, + GN_integral, + GN_ordfeminine, + GN_ordmasculine, + GN_Omega, + GN_ae, + GN_oslash, + GN_questiondown, + GN_exclamdown, + GN_logicalnot, + GN_radical, + GN_florin, + GN_approxequal, + GN_Delta, + GN_guillemotleft, + GN_guillemotright, + GN_ellipsis, + &nonbreakingspace, + GN_Agrave, + GN_Atilde, + GN_Otilde, + GN_OE, + GN_oe, + GN_endash, + GN_emdash, + GN_quotedblleft, + GN_quotedblright, + GN_quoteleft, + GN_quoteright, + GN_divide, + GN_lozenge, + GN_ydieresis, + GN_Ydieresis, + GN_fraction, + GN_currency, + GN_guilsinglleft, + GN_guilsinglright, + GN_fi, + GN_fl, + GN_daggerdbl, + GN_periodcentered, + GN_quotesinglbase, + GN_quotedblbase, + GN_perthousand, + GN_Acircumflex, + GN_Ecircumflex, + GN_Aacute, + GN_Edieresis, + GN_Egrave, + GN_Iacute, + GN_Icircumflex, + GN_Idieresis, + GN_Igrave, + GN_Oacute, + GN_Ocircumflex, + GN_apple, + GN_Ograve, + GN_Uacute, + GN_Ucircumflex, + GN_Ugrave, + GN_dotlessi, + GN_circumflex, + GN_tilde, + GN_macron, + GN_breve, + GN_dotaccent, + GN_ring, + GN_cedilla, + GN_hungarumlaut, + GN_ogonek, + GN_caron, + GN_Lslash, + GN_lslash, + GN_Scaron, + GN_scaron, + GN_Zcaron, + GN_zcaron, + GN_brokenbar, + GN_Eth, + GN_eth, + GN_Yacute, + GN_yacute, + GN_Thorn, + GN_thorn, + GN_minus, + GN_multiply, + GN_onesuperior, + GN_twosuperior, + GN_threesuperior, + GN_onehalf, + GN_onequarter, + GN_threequarters, + GN_franc, + GN_Gbreve, + GN_gbreve, + GN_Idotaccent, + GN_Scedilla, + GN_scedilla, + GN_Cacute, + GN_cacute, + GN_Ccaron, + GN_ccaron, + GN_dcroat + }; + snprintf(name, MAX_G_NAME + 1, "%s", glyph_table[index]->sz); +} + void get_glyph_name(HDC hdc, WORD index, char *name) { - /* FIXME */ - sprintf(name, "g%04x", index); - return; + struct + { + DWORD format; + DWORD italicAngle; + SHORT underlinePosition; + SHORT underlineThickness; + DWORD isFixedPitch; + DWORD minMemType42; + DWORD maxMemType42; + DWORD minMemType1; + DWORD maxMemType1; + } *post_header; + BYTE *post = NULL; + DWORD size; + + /* set a fallback name that is just 'g' */ + snprintf(name, MAX_G_NAME + 1, "g%04x", index); + + /* attempt to obtain the glyph name from the 'post' table */ + size = GetFontData(hdc, MS_MAKE_TAG('p','o','s','t'), 0, NULL, 0); + if(size < sizeof(*post_header) || size == GDI_ERROR) + return; + post = HeapAlloc(GetProcessHeap(), 0, size); + if(!post) + return; + size = GetFontData(hdc, MS_MAKE_TAG('p','o','s','t'), 0, post, size); + if(size < sizeof(*post_header) || size == GDI_ERROR) + goto cleanup; + post_header = (typeof(post_header))(post); + /* note: only interested in the format for obtaining glyph names */ + post_header->format = GET_BE_DWORD(&post_header->format); + + /* now that we know the format of the 'post' table we can get the glyph name */ + if(post_header->format == MAKELONG(0, 1)) + { + if(index < 258) + get_standard_glyph_name(index, name); + else + WARN("Font uses PostScript Format 1, but non-standard glyph (%d) requested.\n", index); + } + else + FIXME("PostScript Format %d.%d glyph names are currently unsupported.\n", + HIWORD(post_header->format), LOWORD(post_header->format)); + +cleanup: + HeapFree(GetProcessHeap(), 0, post); } /**************************************************************************** From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Erich E. Hoover : wineps.drv: Add support for PostScript Format 2 standard glyph names. Message-ID: Module: wine Branch: master Commit: b66fcd68f7d54eae955cca8b8778a864866b5731 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b66fcd68f7d54eae955cca8b8778a864866b5731 Author: Erich E. Hoover Date: Thu Sep 3 16:16:31 2015 -0600 wineps.drv: Add support for PostScript Format 2 standard glyph names. --- dlls/wineps.drv/download.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dlls/wineps.drv/download.c b/dlls/wineps.drv/download.c index 0c4c5a7..7b99b33 100644 --- a/dlls/wineps.drv/download.c +++ b/dlls/wineps.drv/download.c @@ -631,6 +631,19 @@ static void get_standard_glyph_name(WORD index, char *name) snprintf(name, MAX_G_NAME + 1, "%s", glyph_table[index]->sz); } +static int get_post2_name_index(BYTE *post2header, DWORD size, WORD index) +{ + USHORT numberOfGlyphs = GET_BE_WORD(post2header); + DWORD offset = (1 + index) * sizeof(USHORT); + + if(offset + sizeof(USHORT) > size || index >= numberOfGlyphs) + { + FIXME("Index '%d' exceeds PostScript Format 2 table size (%d)\n", index, numberOfGlyphs); + return -1; + } + return GET_BE_WORD(post2header + offset); +} + void get_glyph_name(HDC hdc, WORD index, char *name) { struct @@ -673,6 +686,25 @@ void get_glyph_name(HDC hdc, WORD index, char *name) else WARN("Font uses PostScript Format 1, but non-standard glyph (%d) requested.\n", index); } + else if(post_header->format == MAKELONG(0, 2)) + { + BYTE *post2header = post + sizeof(*post_header); + int glyphNameIndex; + + size -= sizeof(*post_header); + if(size < sizeof(USHORT)) + { + FIXME("PostScript Format 2 table is invalid (cannot fit header)\n"); + goto cleanup; + } + glyphNameIndex = get_post2_name_index(post2header, size, index); + if(glyphNameIndex == -1) + goto cleanup; /* invalid index, use fallback name */ + else if(glyphNameIndex < 258) + get_standard_glyph_name(glyphNameIndex, name); + else + FIXME("PostScript Format 2 custom glyphs are currently unsupported.\n"); + } else FIXME("PostScript Format %d.%d glyph names are currently unsupported.\n", HIWORD(post_header->format), LOWORD(post_header->format)); From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Erich E. Hoover : wineps.drv: Add support for PostScript Format 2 custom glyph names. Message-ID: Module: wine Branch: master Commit: d79de513f754dd7572b6fe3f3b7bfe51dafd1dec URL: http://source.winehq.org/git/wine.git/?a=commit;h=d79de513f754dd7572b6fe3f3b7bfe51dafd1dec Author: Erich E. Hoover Date: Thu Sep 3 16:24:45 2015 -0600 wineps.drv: Add support for PostScript Format 2 custom glyph names. --- dlls/wineps.drv/download.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/dlls/wineps.drv/download.c b/dlls/wineps.drv/download.c index 7b99b33..30eb0db 100644 --- a/dlls/wineps.drv/download.c +++ b/dlls/wineps.drv/download.c @@ -644,6 +644,35 @@ static int get_post2_name_index(BYTE *post2header, DWORD size, WORD index) return GET_BE_WORD(post2header + offset); } +static void get_post2_custom_glyph_name(BYTE *post2header, DWORD size, WORD index, char *name) +{ + USHORT numberOfGlyphs = GET_BE_WORD(post2header); + int i, name_offset = (1 + numberOfGlyphs) * sizeof(USHORT); + BYTE name_length = 0; + + for(i = 0; i <= index; i++) + { + name_offset += name_length; + if(name_offset + sizeof(BYTE) > size) + { + FIXME("Pascal name offset '%d' exceeds PostScript Format 2 table size (%d)\n", + name_offset + sizeof(BYTE), size); + return; + } + name_length = (post2header + name_offset)[0]; + if(name_offset + name_length > size) + { + FIXME("Pascal name offset '%d' exceeds PostScript Format 2 table size (%d)\n", + name_offset + name_length, size); + return; + } + name_offset += sizeof(BYTE); + } + name_length = min(name_length, MAX_G_NAME); + memcpy(name, post2header + name_offset, name_length); + name[name_length] = 0; +} + void get_glyph_name(HDC hdc, WORD index, char *name) { struct @@ -703,7 +732,7 @@ void get_glyph_name(HDC hdc, WORD index, char *name) else if(glyphNameIndex < 258) get_standard_glyph_name(glyphNameIndex, name); else - FIXME("PostScript Format 2 custom glyphs are currently unsupported.\n"); + get_post2_custom_glyph_name(post2header, size, glyphNameIndex - 258, name); } else FIXME("PostScript Format %d.%d glyph names are currently unsupported.\n", From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Vincent Povirk : shell32: Do nothing if we can' t convert PIDL to path in SHAddToRecentDocs. Message-ID: Module: wine Branch: master Commit: 69d57ee72fb436270c52eac446f2deacb5de8e54 URL: http://source.winehq.org/git/wine.git/?a=commit;h=69d57ee72fb436270c52eac446f2deacb5de8e54 Author: Vincent Povirk Date: Mon Sep 14 15:08:36 2015 -0500 shell32: Do nothing if we can't convert PIDL to path in SHAddToRecentDocs. --- dlls/shell32/shellord.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c index 914dc5a..7387520 100644 --- a/dlls/shell32/shellord.c +++ b/dlls/shell32/shellord.c @@ -876,7 +876,11 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) switch (uFlags) { case SHARD_PIDL: - SHGetPathFromIDListA(pv, doc_name); + if (!SHGetPathFromIDListA(pv, doc_name)) + { + WARN("can't get path from PIDL\n"); + return; + } break; case SHARD_PATHA: From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Aric Stewart : hidclass.sys: Add USB Descriptor parsing. Message-ID: Module: wine Branch: master Commit: b7f43c99ee2c745c4c1316742948822b9b12f138 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7f43c99ee2c745c4c1316742948822b9b12f138 Author: Aric Stewart Date: Mon Sep 14 09:58:30 2015 -0500 hidclass.sys: Add USB Descriptor parsing. --- dlls/hidclass.sys/Makefile.in | 1 + dlls/hidclass.sys/descriptor.c | 1145 ++++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 3 + dlls/hidclass.sys/pnp.c | 37 ++ 4 files changed, 1186 insertions(+) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=b7f43c99ee2c745c4c1316742948822b9b12f138 From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Aric Stewart : hidclass.sys: Implement IRP_MJ_DEVICE_CONTROL for HID devices. Message-ID: Module: wine Branch: master Commit: 28125d40c2a94c97c67ac5a4a15f505d9fb5fccc URL: http://source.winehq.org/git/wine.git/?a=commit;h=28125d40c2a94c97c67ac5a4a15f505d9fb5fccc Author: Aric Stewart Date: Mon Sep 14 09:58:35 2015 -0500 hidclass.sys: Implement IRP_MJ_DEVICE_CONTROL for HID devices. --- dlls/hidclass.sys/device.c | 155 +++++++++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 2 + dlls/hidclass.sys/main.c | 2 + 3 files changed, 159 insertions(+) diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index e8deb95..036ced2 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -196,3 +196,158 @@ void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device IoDeleteDevice(device); } + +static NTSTATUS handle_IOCTL_HID_GET_COLLECTION_INFORMATION(IRP *irp, BASE_DEVICE_EXTENSION *base) +{ + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); + if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(HID_COLLECTION_INFORMATION)) + { + irp->IoStatus.u.Status = STATUS_BUFFER_OVERFLOW; + irp->IoStatus.Information = 0; + } + else + { + memcpy(irp->AssociatedIrp.SystemBuffer, &base->information, sizeof(HID_COLLECTION_INFORMATION)); + irp->IoStatus.Information = sizeof(HID_COLLECTION_INFORMATION); + irp->IoStatus.u.Status = STATUS_SUCCESS; + } + return STATUS_SUCCESS; +} + +static NTSTATUS handle_IOCTL_HID_GET_COLLECTION_DESCRIPTOR(IRP *irp, BASE_DEVICE_EXTENSION *base) +{ + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); + + if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < base->preparseData->dwSize) + { + irp->IoStatus.u.Status = STATUS_INVALID_BUFFER_SIZE; + irp->IoStatus.Information = 0; + } + else + { + memcpy(irp->UserBuffer, base->preparseData, base->preparseData->dwSize); + irp->IoStatus.Information = base->preparseData->dwSize; + irp->IoStatus.u.Status = STATUS_SUCCESS; + } + return STATUS_SUCCESS; +} + +static NTSTATUS handle_minidriver_string(DEVICE_OBJECT *device, IRP *irp, DWORD index) +{ + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); + WCHAR buffer[127]; + NTSTATUS status; + + status = call_minidriver(IOCTL_HID_GET_STRING, device, &index, sizeof(index), buffer, sizeof(buffer)); + + if (status == STATUS_SUCCESS) + { + WCHAR *out_buffer = (WCHAR*)(((BYTE*)irp->MdlAddress->StartVa) + irp->MdlAddress->ByteOffset); + int length = irpsp->Parameters.DeviceIoControl.OutputBufferLength/sizeof(WCHAR); + TRACE("got string %s from minidriver\n",debugstr_w(buffer)); + lstrcpynW(out_buffer, buffer, length); + irp->IoStatus.Information = (lstrlenW(buffer)+1) * sizeof(WCHAR); + } + irp->IoStatus.u.Status = status; + + return STATUS_SUCCESS; +} + +NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) +{ + NTSTATUS rc = STATUS_SUCCESS; + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); + BASE_DEVICE_EXTENSION *extension = device->DeviceExtension; + + irp->IoStatus.Information = 0; + + TRACE("device %p ioctl(%x)\n", device, irpsp->Parameters.DeviceIoControl.IoControlCode); + + switch (irpsp->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_HID_GET_POLL_FREQUENCY_MSEC: + TRACE("IOCTL_HID_GET_POLL_FREQUENCY_MSEC\n"); + if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) + { + irp->IoStatus.u.Status = STATUS_BUFFER_OVERFLOW; + irp->IoStatus.Information = 0; + break; + } + *((ULONG*)irp->AssociatedIrp.SystemBuffer) = extension->poll_interval; + irp->IoStatus.Information = sizeof(ULONG); + irp->IoStatus.u.Status = STATUS_SUCCESS; + break; + case IOCTL_HID_SET_POLL_FREQUENCY_MSEC: + { + ULONG poll_interval; + TRACE("IOCTL_HID_SET_POLL_FREQUENCY_MSEC\n"); + if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ULONG)) + { + irp->IoStatus.u.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + poll_interval = *(ULONG *)irp->AssociatedIrp.SystemBuffer; + if (poll_interval == 0) + FIXME("Handle opportunistic reads\n"); + else if (poll_interval <= MAX_POLL_INTERVAL_MSEC) + { + extension->poll_interval = poll_interval; + irp->IoStatus.u.Status = STATUS_SUCCESS; + } + else + irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER; + break; + } + case IOCTL_HID_GET_PRODUCT_STRING: + { + rc = handle_minidriver_string(device, irp, HID_STRING_ID_IPRODUCT); + break; + } + case IOCTL_HID_GET_MANUFACTURER_STRING: + { + rc = handle_minidriver_string(device, irp, HID_STRING_ID_IMANUFACTURER); + break; + } + case IOCTL_HID_GET_COLLECTION_INFORMATION: + { + rc = handle_IOCTL_HID_GET_COLLECTION_INFORMATION(irp, extension); + break; + } + case IOCTL_HID_GET_COLLECTION_DESCRIPTOR: + { + rc = handle_IOCTL_HID_GET_COLLECTION_DESCRIPTOR(irp, extension); + break; + } + case IOCTL_HID_GET_INPUT_REPORT: + { + HID_XFER_PACKET packet; + BYTE* buffer = ((BYTE*)irp->MdlAddress->StartVa) + irp->MdlAddress->ByteOffset; + + if (extension->preparseData->InputReports[0].reportID) + packet.reportId = buffer[0]; + else + packet.reportId = 0; + packet.reportBuffer = buffer; + packet.reportBufferLen = irpsp->Parameters.DeviceIoControl.OutputBufferLength; + + call_minidriver(IOCTL_HID_GET_INPUT_REPORT, device, NULL, 0, &packet, sizeof(packet)); + irp->IoStatus.Information = packet.reportBufferLen; + irp->IoStatus.u.Status = STATUS_SUCCESS; + break; + } + default: + { + ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode; + FIXME("Unsupported ioctl %x (device=%x access=%x func=%x method=%x)\n", + code, code >> 16, (code >> 14) & 3, (code >> 2) & 0xfff, code & 3); + irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED; + rc = STATUS_UNSUCCESSFUL; + break; + } + } + + if (rc != STATUS_PENDING) + IoCompleteRequest( irp, IO_NO_INCREMENT ); + + return rc; +} diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index bf10e0f..645bba7 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -78,6 +78,8 @@ NTSTATUS HID_CreateDevice(DEVICE_OBJECT *native_device, HID_MINIDRIVER_REGISTRAT NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device, LPCWSTR serial, LPCWSTR index) DECLSPEC_HIDDEN; void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device) DECLSPEC_HIDDEN; +NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; + /* Pseudo-Plug and Play support*/ NTSTATUS WINAPI PNP_AddDevice(DRIVER_OBJECT *driver, DEVICE_OBJECT* PDO) DECLSPEC_HIDDEN; void PNP_CleanupPNP(DRIVER_OBJECT *driver) DECLSPEC_HIDDEN; diff --git a/dlls/hidclass.sys/main.c b/dlls/hidclass.sys/main.c index a58d9834..f11d7b4 100644 --- a/dlls/hidclass.sys/main.c +++ b/dlls/hidclass.sys/main.c @@ -68,6 +68,8 @@ NTSTATUS WINAPI HidRegisterMinidriver(HID_MINIDRIVER_REGISTRATION *registration) driver->DriverUnload = registration->DriverObject->DriverUnload; registration->DriverObject->DriverUnload = UnloadDriver; + registration->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HID_Device_ioctl; + driver->AddDevice = registration->DriverObject->DriverExtension->AddDevice; registration->DriverObject->DriverExtension->AddDevice = PNP_AddDevice; From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Aric Stewart : hidclass.sys: Implment IRP_MJ_CREATE and IRP_MJ_CLOSE for HID Devices. Message-ID: Module: wine Branch: master Commit: 01aa7a6ec1cee0d55523fd72c2523db1b5ef6dbb URL: http://source.winehq.org/git/wine.git/?a=commit;h=01aa7a6ec1cee0d55523fd72c2523db1b5ef6dbb Author: Aric Stewart Date: Mon Sep 14 09:58:39 2015 -0500 hidclass.sys: Implment IRP_MJ_CREATE and IRP_MJ_CLOSE for HID Devices. --- dlls/hidclass.sys/buffer.c | 28 ++++++++++++++++++++++++++++ dlls/hidclass.sys/device.c | 22 ++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 4 ++++ dlls/hidclass.sys/main.c | 2 ++ 4 files changed, 56 insertions(+) diff --git a/dlls/hidclass.sys/buffer.c b/dlls/hidclass.sys/buffer.c index 6fbcc0d..c07632c 100644 --- a/dlls/hidclass.sys/buffer.c +++ b/dlls/hidclass.sys/buffer.c @@ -79,3 +79,31 @@ void RingBuffer_Destroy(struct ReportRingBuffer *ring) DeleteCriticalSection(&ring->lock); HeapFree(GetProcessHeap(), 0, ring); } + +UINT RingBuffer_AddPointer(struct ReportRingBuffer *ring) +{ + UINT idx; + EnterCriticalSection(&ring->lock); + for (idx = 0; idx < ring->pointer_alloc; idx++) + if (ring->pointers[idx] == -1) + break; + if (idx >= ring->pointer_alloc) + { + int count = idx = ring->pointer_alloc; + ring->pointer_alloc *= 2; + ring->pointers = HeapReAlloc(GetProcessHeap(), 0, ring->pointers, sizeof(int) * ring->pointer_alloc); + for( ;count < ring->pointer_alloc; count++) + ring->pointers[count] = -1; + } + ring->pointers[idx] = ring->start; + LeaveCriticalSection(&ring->lock); + return idx; +} + +void RingBuffer_RemovePointer(struct ReportRingBuffer *ring, UINT index) +{ + EnterCriticalSection(&ring->lock); + if (index < ring->pointer_alloc) + ring->pointers[index] = 0xffffffff; + LeaveCriticalSection(&ring->lock); +} diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index 036ced2..0b27baa 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -351,3 +351,25 @@ NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) return rc; } + +NTSTATUS WINAPI HID_Device_create(DEVICE_OBJECT *device, IRP *irp) +{ + BASE_DEVICE_EXTENSION *ext = device->DeviceExtension; + + TRACE("Open handle on device %p\n", device); + irp->Tail.Overlay.OriginalFileObject->FsContext = UlongToPtr(RingBuffer_AddPointer(ext->ring_buffer)); + irp->IoStatus.u.Status = STATUS_SUCCESS; + IoCompleteRequest( irp, IO_NO_INCREMENT ); + return STATUS_SUCCESS; +} + +NTSTATUS WINAPI HID_Device_close(DEVICE_OBJECT *device, IRP *irp) +{ + BASE_DEVICE_EXTENSION *ext = device->DeviceExtension; + int ptr = PtrToUlong(irp->Tail.Overlay.OriginalFileObject->FsContext); + TRACE("Close handle on device %p\n", device); + RingBuffer_RemovePointer(ext->ring_buffer, ptr); + irp->IoStatus.u.Status = STATUS_SUCCESS; + IoCompleteRequest( irp, IO_NO_INCREMENT ); + return STATUS_SUCCESS; +} diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index 645bba7..2005d8f 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -56,6 +56,8 @@ typedef struct _BASE_DEVICE_EXTENSTION { /* Minidriver Specific stuff will end up here */ } BASE_DEVICE_EXTENSION; +UINT RingBuffer_AddPointer(struct ReportRingBuffer *buffer) DECLSPEC_HIDDEN; +void RingBuffer_RemovePointer(struct ReportRingBuffer *ring, UINT index) DECLSPEC_HIDDEN; void RingBuffer_Destroy(struct ReportRingBuffer *buffer) DECLSPEC_HIDDEN; struct ReportRingBuffer* RingBuffer_Create(UINT buffer_size) DECLSPEC_HIDDEN; @@ -79,6 +81,8 @@ NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device, LPCWSTR serial, LPCWSTR index) DE void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device) DECLSPEC_HIDDEN; NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; +NTSTATUS WINAPI HID_Device_create(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; +NTSTATUS WINAPI HID_Device_close(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; /* Pseudo-Plug and Play support*/ NTSTATUS WINAPI PNP_AddDevice(DRIVER_OBJECT *driver, DEVICE_OBJECT* PDO) DECLSPEC_HIDDEN; diff --git a/dlls/hidclass.sys/main.c b/dlls/hidclass.sys/main.c index f11d7b4..1e0e802 100644 --- a/dlls/hidclass.sys/main.c +++ b/dlls/hidclass.sys/main.c @@ -69,6 +69,8 @@ NTSTATUS WINAPI HidRegisterMinidriver(HID_MINIDRIVER_REGISTRATION *registration) registration->DriverObject->DriverUnload = UnloadDriver; registration->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HID_Device_ioctl; + registration->DriverObject->MajorFunction[IRP_MJ_CREATE] = HID_Device_create; + registration->DriverObject->MajorFunction[IRP_MJ_CLOSE] = HID_Device_close; driver->AddDevice = registration->DriverObject->DriverExtension->AddDevice; registration->DriverObject->DriverExtension->AddDevice = PNP_AddDevice; From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Aric Stewart : hidclass.sys: Implement IRP_MJ_READ for HID Devices. Message-ID: Module: wine Branch: master Commit: 1de389ae2bbfb254cda55bc41a4ec837a86ce94f URL: http://source.winehq.org/git/wine.git/?a=commit;h=1de389ae2bbfb254cda55bc41a4ec837a86ce94f Author: Aric Stewart Date: Mon Sep 14 09:58:44 2015 -0500 hidclass.sys: Implement IRP_MJ_READ for HID Devices. --- dlls/hidclass.sys/buffer.c | 33 +++++++++++++++++++++++++++++++++ dlls/hidclass.sys/device.c | 43 +++++++++++++++++++++++++++++++++++++++++++ dlls/hidclass.sys/hid.h | 3 +++ dlls/hidclass.sys/main.c | 1 + 4 files changed, 80 insertions(+) diff --git a/dlls/hidclass.sys/buffer.c b/dlls/hidclass.sys/buffer.c index c07632c..af59284 100644 --- a/dlls/hidclass.sys/buffer.c +++ b/dlls/hidclass.sys/buffer.c @@ -80,6 +80,39 @@ void RingBuffer_Destroy(struct ReportRingBuffer *ring) HeapFree(GetProcessHeap(), 0, ring); } +UINT RingBuffer_GetBufferSize(struct ReportRingBuffer *ring) +{ + return ring->buffer_size; +} + +void RingBuffer_Read(struct ReportRingBuffer *ring, UINT index, void *output, UINT *size) +{ + void *ret = NULL; + + EnterCriticalSection(&ring->lock); + if (index >= ring->pointer_alloc || ring->pointers[index] == 0xffffffff) + { + LeaveCriticalSection(&ring->lock); + *size = 0; + return; + } + if (ring->pointers[index] == ring->end) + { + LeaveCriticalSection(&ring->lock); + *size = 0; + } + else + { + ret = &ring->buffer[ring->pointers[index] * ring->buffer_size]; + memcpy(output, ret, ring->buffer_size); + ring->pointers[index]++; + if (ring->pointers[index] == ring->size) + ring->pointers[index] = 0; + LeaveCriticalSection(&ring->lock); + *size = ring->buffer_size; + } +} + UINT RingBuffer_AddPointer(struct ReportRingBuffer *ring) { UINT idx; diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index 0b27baa..46bd010 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -36,6 +36,7 @@ #include "devguid.h" WINE_DEFAULT_DEBUG_CHANNEL(hid); +WINE_DECLARE_DEBUG_CHANNEL(hid_report); static const WCHAR device_name_fmtW[] = {'\\','D','e','v','i','c','e', '\\','H','I','D','#','%','p','&','%','p',0}; @@ -352,6 +353,48 @@ NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) return rc; } +NTSTATUS WINAPI HID_Device_read(DEVICE_OBJECT *device, IRP *irp) +{ + HID_XFER_PACKET *packet; + BASE_DEVICE_EXTENSION *ext = device->DeviceExtension; + UINT buffer_size = RingBuffer_GetBufferSize(ext->ring_buffer); + NTSTATUS rc = STATUS_SUCCESS; + int ptr = -1; + + packet = HeapAlloc(GetProcessHeap(), 0, buffer_size); + ptr = PtrToUlong( irp->Tail.Overlay.OriginalFileObject->FsContext ); + + irp->IoStatus.Information = 0; + RingBuffer_Read(ext->ring_buffer, ptr, packet, &buffer_size); + + if (buffer_size) + { + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); + TRACE_(hid_report)("Got Packet %p %i\n", packet->reportBuffer, packet->reportBufferLen); + if (irpsp->Parameters.Read.Length >= packet->reportBufferLen) + { + memcpy(irp->AssociatedIrp.SystemBuffer, packet->reportBuffer, packet->reportBufferLen); + irp->IoStatus.Information = packet->reportBufferLen; + irp->IoStatus.u.Status = STATUS_SUCCESS; + } + else + { + irp->IoStatus.Information = 0; + irp->IoStatus.u.Status = STATUS_BUFFER_OVERFLOW; + } + IoCompleteRequest( irp, IO_NO_INCREMENT ); + } + else + { + TRACE_(hid_report)("Queue irp\n"); + InsertTailList(&ext->irp_queue, &irp->Tail.Overlay.ListEntry); + rc = STATUS_PENDING; + } + HeapFree(GetProcessHeap(), 0, packet); + + return rc; +} + NTSTATUS WINAPI HID_Device_create(DEVICE_OBJECT *device, IRP *irp) { BASE_DEVICE_EXTENSION *ext = device->DeviceExtension; diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index 2005d8f..41b9937 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -58,6 +58,8 @@ typedef struct _BASE_DEVICE_EXTENSTION { UINT RingBuffer_AddPointer(struct ReportRingBuffer *buffer) DECLSPEC_HIDDEN; void RingBuffer_RemovePointer(struct ReportRingBuffer *ring, UINT index) DECLSPEC_HIDDEN; +void RingBuffer_Read(struct ReportRingBuffer *buffer, UINT index, void *output, UINT *size) DECLSPEC_HIDDEN; +UINT RingBuffer_GetBufferSize(struct ReportRingBuffer *buffer) DECLSPEC_HIDDEN; void RingBuffer_Destroy(struct ReportRingBuffer *buffer) DECLSPEC_HIDDEN; struct ReportRingBuffer* RingBuffer_Create(UINT buffer_size) DECLSPEC_HIDDEN; @@ -81,6 +83,7 @@ NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device, LPCWSTR serial, LPCWSTR index) DE void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device) DECLSPEC_HIDDEN; NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; +NTSTATUS WINAPI HID_Device_read(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; NTSTATUS WINAPI HID_Device_create(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; NTSTATUS WINAPI HID_Device_close(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN; diff --git a/dlls/hidclass.sys/main.c b/dlls/hidclass.sys/main.c index 1e0e802..4be4409 100644 --- a/dlls/hidclass.sys/main.c +++ b/dlls/hidclass.sys/main.c @@ -69,6 +69,7 @@ NTSTATUS WINAPI HidRegisterMinidriver(HID_MINIDRIVER_REGISTRATION *registration) registration->DriverObject->DriverUnload = UnloadDriver; registration->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HID_Device_ioctl; + registration->DriverObject->MajorFunction[IRP_MJ_READ] = HID_Device_read; registration->DriverObject->MajorFunction[IRP_MJ_CREATE] = HID_Device_create; registration->DriverObject->MajorFunction[IRP_MJ_CLOSE] = HID_Device_close; From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Hans Leidekker : webservices: Implement WsCreateReader and WsFreeReader. Message-ID: Module: wine Branch: master Commit: a3004d11de2ace91b4e9646741406e59b2dababf URL: http://source.winehq.org/git/wine.git/?a=commit;h=a3004d11de2ace91b4e9646741406e59b2dababf Author: Hans Leidekker Date: Tue Sep 15 11:15:06 2015 +0200 webservices: Implement WsCreateReader and WsFreeReader. --- dlls/webservices/reader.c | 111 ++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 4 +- 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index a0123aa..84802fc 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -250,6 +250,117 @@ void WINAPI WsFreeHeap( WS_HEAP *handle ) heap_free( heap ); } +static const struct +{ + ULONG size; + BOOL readonly; +} +reader_props[] = +{ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_MAX_DEPTH */ + { sizeof(BOOL), FALSE }, /* WS_XML_READER_PROPERTY_ALLOW_FRAGMENT */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_MAX_ATTRIBUTES */ + { sizeof(BOOL), FALSE }, /* WS_XML_READER_PROPERTY_READ_DECLARATION */ + { sizeof(WS_CHARSET), FALSE }, /* WS_XML_READER_PROPERTY_CHARSET */ + { sizeof(ULONGLONG), TRUE }, /* WS_XML_READER_PROPERTY_ROW */ + { sizeof(ULONGLONG), TRUE }, /* WS_XML_READER_PROPERTY_COLUMN */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_UTF8_TRIM_SIZE */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_STREAM_BUFFER_SIZE */ + { sizeof(BOOL), TRUE }, /* WS_XML_READER_PROPERTY_IN_ATTRIBUTE */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_STREAM_MAX_ROOT_MIME_PART_SIZE */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_STREAM_MAX_MIME_HEADERS_SIZE */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_MAX_MIME_PARTS */ + { sizeof(BOOL), FALSE }, /* WS_XML_READER_PROPERTY_ALLOW_INVALID_CHARACTER_REFERENCES */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_MAX_NAMESPACES */ +}; + +struct reader +{ + ULONG prop_count; + WS_XML_READER_PROPERTY prop[sizeof(reader_props)/sizeof(reader_props[0])]; +}; + +static struct reader *alloc_reader(void) +{ + static const ULONG count = sizeof(reader_props)/sizeof(reader_props[0]); + struct reader *ret; + ULONG i, size = sizeof(*ret) + count * sizeof(WS_XML_READER_PROPERTY); + char *ptr; + + for (i = 0; i < count; i++) size += reader_props[i].size; + if (!(ret = heap_alloc_zero( size ))) return NULL; + + ptr = (char *)&ret->prop[count]; + for (i = 0; i < count; i++) + { + ret->prop[i].value = ptr; + ret->prop[i].valueSize = reader_props[i].size; + ptr += ret->prop[i].valueSize; + } + ret->prop_count = count; + return ret; +} + +static HRESULT set_reader_prop( struct reader *reader, WS_XML_READER_PROPERTY_ID id, const void *value, ULONG size ) +{ + if (id >= reader->prop_count || size != reader_props[id].size || reader_props[id].readonly) + return E_INVALIDARG; + + memcpy( reader->prop[id].value, value, size ); + return S_OK; +} + +/************************************************************************** + * WsCreateReader [webservices.@] + */ +HRESULT WINAPI WsCreateReader( const WS_XML_READER_PROPERTY *properties, ULONG count, + WS_XML_READER **handle, WS_ERROR *error ) +{ + struct reader *reader; + ULONG i, max_depth = 32, max_attrs = 128, max_ns = 32; + WS_CHARSET charset = WS_CHARSET_UTF8; + BOOL read_decl = TRUE; + HRESULT hr; + + TRACE( "%p %u %p %p\n", properties, count, handle, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!handle) return E_INVALIDARG; + if (!(reader = alloc_reader())) return E_OUTOFMEMORY; + + set_reader_prop( reader, WS_XML_READER_PROPERTY_MAX_DEPTH, &max_depth, sizeof(max_depth) ); + set_reader_prop( reader, WS_XML_READER_PROPERTY_MAX_ATTRIBUTES, &max_attrs, sizeof(max_attrs) ); + set_reader_prop( reader, WS_XML_READER_PROPERTY_READ_DECLARATION, &read_decl, sizeof(read_decl) ); + set_reader_prop( reader, WS_XML_READER_PROPERTY_CHARSET, &charset, sizeof(charset) ); + set_reader_prop( reader, WS_XML_READER_PROPERTY_MAX_NAMESPACES, &max_ns, sizeof(max_ns) ); + + for (i = 0; i < count; i++) + { + hr = set_reader_prop( reader, properties[i].id, properties[i].value, properties[i].valueSize ); + if (hr != S_OK) + { + heap_free( reader ); + return hr; + } + } + + *handle = (WS_XML_READER *)reader; + return S_OK; +} + +/************************************************************************** + * WsFreeReader [webservices.@] + */ +void WINAPI WsFreeReader( WS_XML_READER *handle ) +{ + struct reader *reader = (struct reader *)handle; + + TRACE( "%p\n", handle ); + + if (!reader) return; + heap_free( reader ); +} + /************************************************************************** * WsGetErrorProperty [webservices.@] */ diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 4cb35f6..7e0a86b 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -29,7 +29,7 @@ @ stub WsCreateMessage @ stub WsCreateMessageForChannel @ stub WsCreateMetadata -@ stub WsCreateReader +@ stdcall WsCreateReader(ptr long ptr ptr) @ stub WsCreateServiceEndpointFromTemplate @ stub WsCreateServiceHost @ stub WsCreateServiceProxy @@ -54,7 +54,7 @@ @ stub WsFreeListener @ stub WsFreeMessage @ stub WsFreeMetadata -@ stub WsFreeReader +@ stdcall WsFreeReader(ptr) @ stub WsFreeSecurityToken @ stub WsFreeServiceHost @ stub WsFreeServiceProxy From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Hans Leidekker : webservices: Implement WsGetReaderProperty. Message-ID: Module: wine Branch: master Commit: 0e3b3e07ad5d55cb4a6103da80f1f7cc9b777445 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0e3b3e07ad5d55cb4a6103da80f1f7cc9b777445 Author: Hans Leidekker Date: Tue Sep 15 11:15:35 2015 +0200 webservices: Implement WsGetReaderProperty. --- dlls/webservices/reader.c | 23 +++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 84802fc..4f4d31c 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -310,6 +310,15 @@ static HRESULT set_reader_prop( struct reader *reader, WS_XML_READER_PROPERTY_ID return S_OK; } +static HRESULT get_reader_prop( struct reader *reader, WS_XML_READER_PROPERTY_ID id, void *buf, ULONG size ) +{ + if (id >= reader->prop_count || size != reader_props[id].size) + return E_INVALIDARG; + + memcpy( buf, reader->prop[id].value, reader->prop[id].valueSize ); + return S_OK; +} + /************************************************************************** * WsCreateReader [webservices.@] */ @@ -388,6 +397,20 @@ HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void } /************************************************************************** + * WsGetReaderProperty [webservices.@] + */ +HRESULT WINAPI WsGetReaderProperty( WS_XML_READER *handle, WS_XML_READER_PROPERTY_ID id, + void *buf, ULONG size, WS_ERROR *error ) +{ + struct reader *reader = (struct reader *)handle; + + TRACE( "%p %u %p %u %p\n", handle, id, buf, size, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + return get_reader_prop( reader, id, buf, size ); +} + +/************************************************************************** * WsSetErrorProperty [webservices.@] */ HRESULT WINAPI WsSetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, const void *value, diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 7e0a86b..487c2af 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -82,7 +82,7 @@ @ stub WsGetPrefixFromNamespace @ stub WsGetReaderNode @ stub WsGetReaderPosition -@ stub WsGetReaderProperty +@ stdcall WsGetReaderProperty(ptr long ptr long ptr) @ stub WsGetSecurityContextProperty @ stub WsGetSecurityTokenProperty @ stub WsGetServiceHostProperty From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Hans Leidekker : webservices: Implement WsSetInput. Message-ID: Module: wine Branch: master Commit: cf8efc384a40502ae29c453dc8ce7f58392983d0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf8efc384a40502ae29c453dc8ce7f58392983d0 Author: Hans Leidekker Date: Tue Sep 15 11:15:58 2015 +0200 webservices: Implement WsSetInput. --- dlls/webservices/reader.c | 58 +++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 4f4d31c..7a811c7 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -276,6 +276,8 @@ reader_props[] = struct reader { + const char *input_data; + ULONG input_size; ULONG prop_count; WS_XML_READER_PROPERTY prop[sizeof(reader_props)/sizeof(reader_props[0])]; }; @@ -407,6 +409,7 @@ HRESULT WINAPI WsGetReaderProperty( WS_XML_READER *handle, WS_XML_READER_PROPERT TRACE( "%p %u %p %u %p\n", handle, id, buf, size, error ); if (error) FIXME( "ignoring error parameter\n" ); + if (!reader->input_data) return WS_E_INVALID_OPERATION; return get_reader_prop( reader, id, buf, size ); } @@ -423,3 +426,58 @@ HRESULT WINAPI WsSetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, co if (id == WS_ERROR_PROPERTY_LANGID) return WS_E_INVALID_OPERATION; return set_error_prop( error, id, value, size ); } + +/************************************************************************** + * WsSetInput [webservices.@] + */ +HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING *encoding, + const WS_XML_READER_INPUT *input, const WS_XML_READER_PROPERTY *properties, + ULONG count, WS_ERROR *error ) +{ + struct reader *reader = (struct reader *)handle; + HRESULT hr; + ULONG i; + + TRACE( "%p %p %p %p %u %p\n", handle, encoding, input, properties, count, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!reader) return E_INVALIDARG; + + switch (encoding->encodingType) + { + case WS_XML_READER_ENCODING_TYPE_TEXT: + { + WS_XML_READER_TEXT_ENCODING *text = (WS_XML_READER_TEXT_ENCODING *)encoding; + if (text->charSet != WS_CHARSET_UTF8) + { + FIXME( "charset %u not supported\n", text->charSet ); + return E_NOTIMPL; + } + break; + } + default: + FIXME( "encoding type %u not supported\n", encoding->encodingType ); + return E_NOTIMPL; + } + switch (input->inputType) + { + case WS_XML_READER_INPUT_TYPE_BUFFER: + { + WS_XML_READER_BUFFER_INPUT *buf = (WS_XML_READER_BUFFER_INPUT *)input; + reader->input_data = buf->encodedData; + reader->input_size = buf->encodedDataSize; + break; + } + default: + FIXME( "input type %u not supported\n", input->inputType ); + return E_NOTIMPL; + } + + for (i = 0; i < count; i++) + { + hr = set_reader_prop( reader, properties[i].id, properties[i].value, properties[i].valueSize ); + if (hr != S_OK) return hr; + } + + return S_OK; +} diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 487c2af..6a81612 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -150,7 +150,7 @@ @ stub WsSetFaultErrorDetail @ stub WsSetFaultErrorProperty @ stub WsSetHeader -@ stub WsSetInput +@ stdcall WsSetInput(ptr ptr ptr ptr long ptr) @ stub WsSetInputToBuffer @ stub WsSetListenerProperty @ stub WsSetMessageProperty From julliard at wine.codeweavers.com Tue Sep 15 09:50:50 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:50 -0500 Subject: Hans Leidekker : webservices/tests: Add tests. Message-ID: Module: wine Branch: master Commit: e4f32c3c4b289b12c7428f6ce1e6e210306c7a98 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4f32c3c4b289b12c7428f6ce1e6e210306c7a98 Author: Hans Leidekker Date: Tue Sep 15 11:16:26 2015 +0200 webservices/tests: Add tests. --- dlls/webservices/tests/reader.c | 149 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c index 4b247d9..7f43a07 100644 --- a/dlls/webservices/tests/reader.c +++ b/dlls/webservices/tests/reader.c @@ -21,6 +21,9 @@ #include "webservices.h" #include "wine/test.h" +static const char data1[] = + ""; + static void test_WsCreateError(void) { HRESULT hr; @@ -183,8 +186,154 @@ static void test_WsCreateHeap(void) ok( hr == E_INVALIDARG, "got %08x\n", hr ); } +static HRESULT set_input( WS_XML_READER *reader, const char *data, ULONG size ) +{ + WS_XML_READER_TEXT_ENCODING encoding; + WS_XML_READER_BUFFER_INPUT input; + + encoding.encoding.encodingType = WS_XML_READER_ENCODING_TYPE_TEXT; + encoding.charSet = WS_CHARSET_UTF8; + + input.input.inputType = WS_XML_READER_INPUT_TYPE_BUFFER; + input.encodedData = (void *)data; + input.encodedDataSize = size; + + return WsSetInput( reader, (WS_XML_READER_ENCODING *)&encoding, + (WS_XML_READER_INPUT *)&input, NULL, 0, NULL ); +} + +static void test_WsCreateReader(void) +{ + HRESULT hr; + WS_XML_READER *reader; + WS_XML_READER_PROPERTY prop; + ULONG size, max_depth, max_attrs, trim_size, buffer_size, max_ns; + BOOL allow_fragment, read_decl, in_attr; + ULONGLONG row, column; + WS_CHARSET charset; + + hr = WsCreateReader( NULL, 0, NULL, NULL ) ; + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + reader = NULL; + hr = WsCreateReader( NULL, 0, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + ok( reader != NULL, "reader not set\n" ); + + /* can't retrieve properties before input is set */ + max_depth = 0xdeadbeef; + size = sizeof(max_depth); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_MAX_DEPTH, &max_depth, size, NULL ); + ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr ); + ok( max_depth == 0xdeadbeef, "max_depth set\n" ); + + hr = set_input( reader, data1, sizeof(data1) - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + /* check some defaults */ + max_depth = 0xdeadbeef; + size = sizeof(max_depth); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_MAX_DEPTH, &max_depth, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( max_depth == 32, "got %u\n", max_depth ); + + allow_fragment = TRUE; + size = sizeof(allow_fragment); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_ALLOW_FRAGMENT, &allow_fragment, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !allow_fragment, "got %d\n", allow_fragment ); + + max_attrs = 0xdeadbeef; + size = sizeof(max_attrs); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_MAX_ATTRIBUTES, &max_attrs, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( max_attrs == 128, "got %u\n", max_attrs ); + + read_decl = FALSE; + size = sizeof(read_decl); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_READ_DECLARATION, &read_decl, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( read_decl, "got %u\n", read_decl ); + + charset = 0xdeadbeef; + size = sizeof(charset); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_CHARSET, &charset, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( charset == WS_CHARSET_UTF8, "got %u\n", charset ); + + size = sizeof(trim_size); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_UTF8_TRIM_SIZE, &trim_size, size, NULL ); + todo_wine ok( hr == E_INVALIDARG, "got %08x\n", hr ); + WsFreeReader( reader ); + + hr = WsCreateReader( NULL, 0, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + hr = set_input( reader, data1, sizeof(data1) - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + size = sizeof(buffer_size); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_STREAM_BUFFER_SIZE, &buffer_size, size, NULL ); + todo_wine ok( hr == E_INVALIDARG, "got %08x\n", hr ); + WsFreeReader( reader ); + + hr = WsCreateReader( NULL, 0, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + hr = set_input( reader, data1, sizeof(data1) - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + max_ns = 0xdeadbeef; + size = sizeof(max_ns); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_MAX_NAMESPACES, &max_ns, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( max_ns == 32, "got %u\n", max_ns ); + WsFreeReader( reader ); + + /* change a property */ + max_depth = 16; + prop.id = WS_XML_READER_PROPERTY_MAX_DEPTH; + prop.value = &max_depth; + prop.valueSize = sizeof(max_depth); + hr = WsCreateReader( &prop, 1, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + hr = set_input( reader, data1, sizeof(data1) - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + max_depth = 0xdeadbeef; + size = sizeof(max_depth); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_MAX_DEPTH, &max_depth, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( max_depth == 16, "got %u\n", max_depth ); + WsFreeReader( reader ); + + /* show that some properties are read-only */ + row = 1; + prop.id = WS_XML_READER_PROPERTY_ROW; + prop.value = &row; + prop.valueSize = sizeof(row); + hr = WsCreateReader( &prop, 1, &reader, NULL ) ; + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + column = 1; + prop.id = WS_XML_READER_PROPERTY_COLUMN; + prop.value = &column; + prop.valueSize = sizeof(column); + hr = WsCreateReader( &prop, 1, &reader, NULL ) ; + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + in_attr = TRUE; + prop.id = WS_XML_READER_PROPERTY_IN_ATTRIBUTE; + prop.value = &in_attr; + prop.valueSize = sizeof(in_attr); + hr = WsCreateReader( &prop, 1, &reader, NULL ) ; + ok( hr == E_INVALIDARG, "got %08x\n", hr ); +} + START_TEST(reader) { test_WsCreateError(); test_WsCreateHeap(); + test_WsCreateReader(); } From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Set immediate_context to NULL in d3d11_device_GetImmediateContext(). Message-ID: Module: wine Branch: master Commit: ccb30415b69b6e3fdf54a61d9b4e97687012eca5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ccb30415b69b6e3fdf54a61d9b4e97687012eca5 Author: J?zef Kucia Date: Tue Sep 15 01:37:38 2015 +0200 d3d11: Set immediate_context to NULL in d3d11_device_GetImmediateContext(). --- dlls/d3d11/device.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index dcaa49c..e632677 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -425,6 +425,8 @@ static void STDMETHODCALLTYPE d3d11_device_GetImmediateContext(ID3D11Device *ifa ID3D11DeviceContext **immediate_context) { FIXME("iface %p, immediate_context %p stub!\n", iface, immediate_context); + + *immediate_context = NULL; } static HRESULT STDMETHODCALLTYPE d3d11_device_SetExceptionMode(ID3D11Device *iface, UINT flags) From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Set output parameters to NULL when D3D11CreateDevice() fails. Message-ID: Module: wine Branch: master Commit: 77844e2a0efb6e1a1c8320e2b7b01a9d01f0213f URL: http://source.winehq.org/git/wine.git/?a=commit;h=77844e2a0efb6e1a1c8320e2b7b01a9d01f0213f Author: J?zef Kucia Date: Tue Sep 15 01:37:39 2015 +0200 d3d11: Set output parameters to NULL when D3D11CreateDevice() fails. --- dlls/d3d11/d3d11_main.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dlls/d3d11/d3d11_main.c b/dlls/d3d11/d3d11_main.c index 40c4a5f..bce5e97 100644 --- a/dlls/d3d11/d3d11_main.c +++ b/dlls/d3d11/d3d11_main.c @@ -157,6 +157,13 @@ HRESULT WINAPI D3D11CreateDevice(IDXGIAdapter *adapter, D3D_DRIVER_TYPE driver_t adapter, debug_d3d_driver_type(driver_type), swrast, flags, feature_levels, levels, sdk_version, device_out, obtained_feature_level, immediate_context); + if (device_out) + *device_out = NULL; + if (obtained_feature_level) + *obtained_feature_level = 0; + if (immediate_context) + *immediate_context = NULL; + if (adapter) { IDXGIAdapter_AddRef(adapter); From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_input_layout to d3d_input_layout. Message-ID: Module: wine Branch: master Commit: 2a17794ffadda78a5a968eabfb76545607d3af82 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a17794ffadda78a5a968eabfb76545607d3af82 Author: J?zef Kucia Date: Tue Sep 15 01:37:42 2015 +0200 d3d11: Rename d3d10_input_layout to d3d_input_layout. --- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 8 ++++---- dlls/d3d11/inputlayout.c | 30 ++++++++++++++++-------------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index e48befd..b8f8977 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -208,7 +208,7 @@ struct d3d_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView( ID3D10ShaderResourceView *iface) DECLSPEC_HIDDEN; /* ID3D10InputLayout */ -struct d3d10_input_layout +struct d3d_input_layout { ID3D10InputLayout ID3D10InputLayout_iface; LONG refcount; @@ -217,10 +217,10 @@ struct d3d10_input_layout struct wined3d_vertex_declaration *wined3d_decl; }; -HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d_device *device, +HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device *device, const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length) DECLSPEC_HIDDEN; -struct d3d10_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) DECLSPEC_HIDDEN; +struct d3d_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) DECLSPEC_HIDDEN; /* ID3D10VertexShader */ struct d3d10_vertex_shader diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index e632677..d0468e2 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -728,7 +728,7 @@ static void STDMETHODCALLTYPE d3d10_device_IASetInputLayout(ID3D10Device1 *iface ID3D10InputLayout *input_layout) { struct d3d_device *This = impl_from_ID3D10Device(iface); - struct d3d10_input_layout *layout = unsafe_impl_from_ID3D10InputLayout(input_layout); + struct d3d_input_layout *layout = unsafe_impl_from_ID3D10InputLayout(input_layout); TRACE("iface %p, input_layout %p\n", iface, input_layout); @@ -1426,7 +1426,7 @@ static void STDMETHODCALLTYPE d3d10_device_IAGetInputLayout(ID3D10Device1 *iface { struct d3d_device *device = impl_from_ID3D10Device(iface); struct wined3d_vertex_declaration *wined3d_declaration; - struct d3d10_input_layout *input_layout_impl; + struct d3d_input_layout *input_layout_impl; TRACE("iface %p, input_layout %p.\n", iface, input_layout); @@ -2207,7 +2207,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device1 *i ID3D10InputLayout **input_layout) { struct d3d_device *This = impl_from_ID3D10Device(iface); - struct d3d10_input_layout *object; + struct d3d_input_layout *object; HRESULT hr; TRACE("iface %p, element_descs %p, element_count %u, shader_byte_code %p, " @@ -2219,7 +2219,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device1 *i if (!object) return E_OUTOFMEMORY; - hr = d3d10_input_layout_init(object, This, element_descs, element_count, + hr = d3d_input_layout_init(object, This, element_descs, element_count, shader_byte_code, shader_byte_code_length); if (FAILED(hr)) { diff --git a/dlls/d3d11/inputlayout.c b/dlls/d3d11/inputlayout.c index edf7806..3d3b17f 100644 --- a/dlls/d3d11/inputlayout.c +++ b/dlls/d3d11/inputlayout.c @@ -94,9 +94,11 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME return S_OK; } -static inline struct d3d10_input_layout *impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) +/* ID3D10InputLayout methods */ + +static inline struct d3d_input_layout *impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) { - return CONTAINING_RECORD(iface, struct d3d10_input_layout, ID3D10InputLayout_iface); + return CONTAINING_RECORD(iface, struct d3d_input_layout, ID3D10InputLayout_iface); } /* IUnknown methods */ @@ -123,7 +125,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_input_layout_QueryInterface(ID3D10InputLa static ULONG STDMETHODCALLTYPE d3d10_input_layout_AddRef(ID3D10InputLayout *iface) { - struct d3d10_input_layout *This = impl_from_ID3D10InputLayout(iface); + struct d3d_input_layout *This = impl_from_ID3D10InputLayout(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); @@ -140,7 +142,7 @@ static ULONG STDMETHODCALLTYPE d3d10_input_layout_AddRef(ID3D10InputLayout *ifac static ULONG STDMETHODCALLTYPE d3d10_input_layout_Release(ID3D10InputLayout *iface) { - struct d3d10_input_layout *This = impl_from_ID3D10InputLayout(iface); + struct d3d_input_layout *This = impl_from_ID3D10InputLayout(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); @@ -165,7 +167,7 @@ static void STDMETHODCALLTYPE d3d10_input_layout_GetDevice(ID3D10InputLayout *if static HRESULT STDMETHODCALLTYPE d3d10_input_layout_GetPrivateData(ID3D10InputLayout *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d10_input_layout *layout = impl_from_ID3D10InputLayout(iface); + struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface); TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -176,7 +178,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_input_layout_GetPrivateData(ID3D10InputLa static HRESULT STDMETHODCALLTYPE d3d10_input_layout_SetPrivateData(ID3D10InputLayout *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d10_input_layout *layout = impl_from_ID3D10InputLayout(iface); + struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -187,7 +189,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_input_layout_SetPrivateData(ID3D10InputLa static HRESULT STDMETHODCALLTYPE d3d10_input_layout_SetPrivateDataInterface(ID3D10InputLayout *iface, REFGUID guid, const IUnknown *data) { - struct d3d10_input_layout *layout = impl_from_ID3D10InputLayout(iface); + struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface); TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); @@ -207,20 +209,20 @@ static const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl = d3d10_input_layout_SetPrivateDataInterface, }; -static void STDMETHODCALLTYPE d3d10_input_layout_wined3d_object_destroyed(void *parent) +static void STDMETHODCALLTYPE d3d_input_layout_wined3d_object_destroyed(void *parent) { - struct d3d10_input_layout *layout = parent; + struct d3d_input_layout *layout = parent; wined3d_private_store_cleanup(&layout->private_store); HeapFree(GetProcessHeap(), 0, parent); } -static const struct wined3d_parent_ops d3d10_input_layout_wined3d_parent_ops = +static const struct wined3d_parent_ops d3d_input_layout_wined3d_parent_ops = { - d3d10_input_layout_wined3d_object_destroyed, + d3d_input_layout_wined3d_object_destroyed, }; -HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d_device *device, +HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device *device, const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length) { @@ -242,7 +244,7 @@ HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d_de } hr = wined3d_vertex_declaration_create(device->wined3d_device, wined3d_elements, element_count, - layout, &d3d10_input_layout_wined3d_parent_ops, &layout->wined3d_decl); + layout, &d3d_input_layout_wined3d_parent_ops, &layout->wined3d_decl); HeapFree(GetProcessHeap(), 0, wined3d_elements); if (FAILED(hr)) { @@ -256,7 +258,7 @@ HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d_de return S_OK; } -struct d3d10_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) +struct d3d_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) { if (!iface) return NULL; From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Add ID3D11InputLayout interface stub. Message-ID: Module: wine Branch: master Commit: 8361963f7bc0f68984426ac9ce6357462607ec57 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8361963f7bc0f68984426ac9ce6357462607ec57 Author: J?zef Kucia Date: Tue Sep 15 01:37:43 2015 +0200 d3d11: Add ID3D11InputLayout interface stub. --- dlls/d3d11/d3d11_private.h | 3 +- dlls/d3d11/inputlayout.c | 137 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 118 insertions(+), 22 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index b8f8977..5dfdc29 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -207,9 +207,10 @@ HRESULT d3d_shader_resource_view_create(struct d3d_device *device, ID3D11Resourc struct d3d_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView( ID3D10ShaderResourceView *iface) DECLSPEC_HIDDEN; -/* ID3D10InputLayout */ +/* ID3D11InputLayout, ID3D10InputLayout */ struct d3d_input_layout { + ID3D11InputLayout ID3D11InputLayout_iface; ID3D10InputLayout ID3D10InputLayout_iface; LONG refcount; diff --git a/dlls/d3d11/inputlayout.c b/dlls/d3d11/inputlayout.c index 3d3b17f..68b8b6f 100644 --- a/dlls/d3d11/inputlayout.c +++ b/dlls/d3d11/inputlayout.c @@ -94,69 +94,163 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME return S_OK; } -/* ID3D10InputLayout methods */ +/* ID3D11InputLayout methods */ -static inline struct d3d_input_layout *impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) +static inline struct d3d_input_layout *impl_from_ID3D11InputLayout(ID3D11InputLayout *iface) { - return CONTAINING_RECORD(iface, struct d3d_input_layout, ID3D10InputLayout_iface); + return CONTAINING_RECORD(iface, struct d3d_input_layout, ID3D11InputLayout_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_input_layout_QueryInterface(ID3D10InputLayout *iface, +static HRESULT STDMETHODCALLTYPE d3d11_input_layout_QueryInterface(ID3D11InputLayout *iface, REFIID riid, void **object) { - TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); - if (IsEqualGUID(riid, &IID_ID3D10InputLayout) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D11InputLayout) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11InputLayout_AddRef(iface); *object = iface; return S_OK; } - WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + if (IsEqualGUID(riid, &IID_ID3D10InputLayout) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + ID3D10InputLayout_AddRef(&layout->ID3D10InputLayout_iface); + *object = &layout->ID3D10InputLayout_iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *object = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_input_layout_AddRef(ID3D10InputLayout *iface) +static ULONG STDMETHODCALLTYPE d3d11_input_layout_AddRef(ID3D11InputLayout *iface) { - struct d3d_input_layout *This = impl_from_ID3D10InputLayout(iface); - ULONG refcount = InterlockedIncrement(&This->refcount); + struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); + ULONG refcount = InterlockedIncrement(&layout->refcount); - TRACE("%p increasing refcount to %u\n", This, refcount); + TRACE("%p increasing refcount to %u.\n", layout, refcount); if (refcount == 1) { wined3d_mutex_lock(); - wined3d_vertex_declaration_incref(This->wined3d_decl); + wined3d_vertex_declaration_incref(layout->wined3d_decl); wined3d_mutex_unlock(); } return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_input_layout_Release(ID3D10InputLayout *iface) +static ULONG STDMETHODCALLTYPE d3d11_input_layout_Release(ID3D11InputLayout *iface) { - struct d3d_input_layout *This = impl_from_ID3D10InputLayout(iface); - ULONG refcount = InterlockedDecrement(&This->refcount); + struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); + ULONG refcount = InterlockedDecrement(&layout->refcount); - TRACE("%p decreasing refcount to %u\n", This, refcount); + TRACE("%p decreasing refcount to %u.\n", layout, refcount); if (!refcount) { wined3d_mutex_lock(); - wined3d_vertex_declaration_decref(This->wined3d_decl); + wined3d_vertex_declaration_decref(layout->wined3d_decl); wined3d_mutex_unlock(); } return refcount; } +static void STDMETHODCALLTYPE d3d11_input_layout_GetDevice(ID3D11InputLayout *iface, + ID3D11Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_input_layout_GetPrivateData(ID3D11InputLayout *iface, + REFGUID guid, UINT *data_size, void *data) +{ + struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_get_private_data(&layout->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_input_layout_SetPrivateData(ID3D11InputLayout *iface, + REFGUID guid, UINT data_size, const void *data) +{ + struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_set_private_data(&layout->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_input_layout_SetPrivateDataInterface(ID3D11InputLayout *iface, + REFGUID guid, const IUnknown *data) +{ + struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface); + + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&layout->private_store, guid, data); +} + +static const struct ID3D11InputLayoutVtbl d3d11_input_layout_vtbl = +{ + /* IUnknown methods */ + d3d11_input_layout_QueryInterface, + d3d11_input_layout_AddRef, + d3d11_input_layout_Release, + /* ID3D11DeviceChild methods */ + d3d11_input_layout_GetDevice, + d3d11_input_layout_GetPrivateData, + d3d11_input_layout_SetPrivateData, + d3d11_input_layout_SetPrivateDataInterface, +}; + +/* ID3D10InputLayout methods */ + +static inline struct d3d_input_layout *impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_input_layout, ID3D10InputLayout_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_input_layout_QueryInterface(ID3D10InputLayout *iface, + REFIID riid, void **object) +{ + struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_input_layout_QueryInterface(&layout->ID3D11InputLayout_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_input_layout_AddRef(ID3D10InputLayout *iface) +{ + struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_input_layout_AddRef(&layout->ID3D11InputLayout_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_input_layout_Release(ID3D10InputLayout *iface) +{ + struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_input_layout_Release(&layout->ID3D11InputLayout_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_input_layout_GetDevice(ID3D10InputLayout *iface, ID3D10Device **device) @@ -229,6 +323,7 @@ HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device struct wined3d_vertex_element *wined3d_elements; HRESULT hr; + layout->ID3D11InputLayout_iface.lpVtbl = &d3d11_input_layout_vtbl; layout->ID3D10InputLayout_iface.lpVtbl = &d3d10_input_layout_vtbl; layout->refcount = 1; wined3d_mutex_lock(); From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateInputLayout(). Message-ID: Module: wine Branch: master Commit: 1cb181668ee991c0e17c116b5c16880ea18393b9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1cb181668ee991c0e17c116b5c16880ea18393b9 Author: J?zef Kucia Date: Tue Sep 15 01:37:44 2015 +0200 d3d11: Implement d3d11_device_CreateInputLayout(). --- dlls/d3d11/d3d11_private.h | 7 ++++--- dlls/d3d11/device.c | 32 ++++++++++++++++---------------- dlls/d3d11/inputlayout.c | 36 +++++++++++++++++++++++++++++++----- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 5dfdc29..303fa6d 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -218,9 +218,10 @@ struct d3d_input_layout struct wined3d_vertex_declaration *wined3d_decl; }; -HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device *device, - const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, - const void *shader_byte_code, SIZE_T shader_byte_code_length) DECLSPEC_HIDDEN; +HRESULT d3d_input_layout_create(struct d3d_device *device, + const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, + const void *shader_byte_code, SIZE_T shader_byte_code_length, + struct d3d_input_layout **layout) DECLSPEC_HIDDEN; struct d3d_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) DECLSPEC_HIDDEN; /* ID3D10VertexShader */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index d0468e2..65524d3 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -179,11 +179,21 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateInputLayout(ID3D11Device *if const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, ID3D11InputLayout **input_layout) { - FIXME("iface %p, element_descs %p, element_count %u, shader_byte_code %p, shader_byte_code_length %lu, " - "input_layout %p stub!\n", iface, element_descs, element_count, shader_byte_code, + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_input_layout *object; + HRESULT hr; + + TRACE("iface %p, element_descs %p, element_count %u, shader_byte_code %p, shader_byte_code_length %lu, " + "input_layout %p.\n", iface, element_descs, element_count, shader_byte_code, shader_byte_code_length, input_layout); - return E_NOTIMPL; + if (FAILED(hr = d3d_input_layout_create(device, element_descs, element_count, + shader_byte_code, shader_byte_code_length, &object))) + return hr; + + *input_layout = &object->ID3D11InputLayout_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateVertexShader(ID3D11Device *iface, const void *byte_code, @@ -2206,7 +2216,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device1 *i const void *shader_byte_code, SIZE_T shader_byte_code_length, ID3D10InputLayout **input_layout) { - struct d3d_device *This = impl_from_ID3D10Device(iface); + struct d3d_device *device = impl_from_ID3D10Device(iface); struct d3d_input_layout *object; HRESULT hr; @@ -2215,20 +2225,10 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device1 *i iface, element_descs, element_count, shader_byte_code, shader_byte_code_length, input_layout); - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) - return E_OUTOFMEMORY; - - hr = d3d_input_layout_init(object, This, element_descs, element_count, - shader_byte_code, shader_byte_code_length); - if (FAILED(hr)) - { - WARN("Failed to initialize input layout, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); + if (FAILED(hr = d3d_input_layout_create(device, (const D3D11_INPUT_ELEMENT_DESC *)element_descs, element_count, + shader_byte_code, shader_byte_code_length, &object))) return hr; - } - TRACE("Created input layout %p.\n", object); *input_layout = &object->ID3D10InputLayout_iface; return S_OK; diff --git a/dlls/d3d11/inputlayout.c b/dlls/d3d11/inputlayout.c index 68b8b6f..bb98d30 100644 --- a/dlls/d3d11/inputlayout.c +++ b/dlls/d3d11/inputlayout.c @@ -39,7 +39,7 @@ static HRESULT isgn_handler(const char *data, DWORD data_size, DWORD tag, void * } } -static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC *element_descs, +static HRESULT d3d11_input_layout_to_wined3d_declaration(const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, struct wined3d_vertex_element **wined3d_elements) { @@ -65,7 +65,7 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME for (i = 0; i < element_count; ++i) { struct wined3d_vertex_element *e = &(*wined3d_elements)[i]; - const D3D10_INPUT_ELEMENT_DESC *f = &element_descs[i]; + const D3D11_INPUT_ELEMENT_DESC *f = &element_descs[i]; UINT j; e->format = wined3dformat_from_dxgi_format(f->Format); @@ -316,8 +316,8 @@ static const struct wined3d_parent_ops d3d_input_layout_wined3d_parent_ops = d3d_input_layout_wined3d_object_destroyed, }; -HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device *device, - const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, +static HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device *device, + const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length) { struct wined3d_vertex_element *wined3d_elements; @@ -329,7 +329,7 @@ HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device wined3d_mutex_lock(); wined3d_private_store_init(&layout->private_store); - if (FAILED(hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count, + if (FAILED(hr = d3d11_input_layout_to_wined3d_declaration(element_descs, element_count, shader_byte_code, shader_byte_code_length, &wined3d_elements))) { WARN("Failed to create wined3d vertex declaration elements, hr %#x.\n", hr); @@ -353,6 +353,32 @@ HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device return S_OK; } +HRESULT d3d_input_layout_create(struct d3d_device *device, + const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, + const void *shader_byte_code, SIZE_T shader_byte_code_length, + struct d3d_input_layout **layout) +{ + struct d3d_input_layout *object; + HRESULT hr; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_input_layout_init(object, device, element_descs, element_count, + shader_byte_code, shader_byte_code_length))) + { + WARN("Failed to initialize input layout, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created input layout %p.\n", object); + *layout = object; + + return S_OK; +} + struct d3d_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) { if (!iface) From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: Andrey Gusev : wined3d: Fix TRACE in shader_dump_decl_usage(). Message-ID: Module: wine Branch: master Commit: edbd841d341002d9f027af84b594981bfc4057a8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=edbd841d341002d9f027af84b594981bfc4057a8 Author: Andrey Gusev Date: Tue Sep 15 12:08:46 2015 +0300 wined3d: Fix TRACE in shader_dump_decl_usage(). --- dlls/wined3d/shader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index b7b57c7..6e9fa9e 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -1178,7 +1178,7 @@ static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semanti break; case WINED3D_SHADER_RESOURCE_TEXTURE_3D: - TRACE("_volume"); + TRACE("_3d"); break; case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: Nikolay Sivov : dwrite: Print font table tag in string form in traces. Message-ID: Module: wine Branch: master Commit: 20e6181304cb54341978a01b4919e5b91f24664d URL: http://source.winehq.org/git/wine.git/?a=commit;h=20e6181304cb54341978a01b4919e5b91f24664d Author: Nikolay Sivov Date: Tue Sep 15 15:44:59 2015 +0300 dwrite: Print font table tag in string form in traces. --- dlls/dwrite/font.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 6a46a1a..e98dc15 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -260,7 +260,7 @@ static inline struct dwrite_fontlist *impl_from_IDWriteFontList(IDWriteFontList static inline const char *debugstr_tag(UINT32 tag) { - return wine_dbg_sprintf("%c%c%c%c", tag & 0xff, (tag >> 8) & 0xff, (tag >> 16) & 0xff, tag >> 24); + return debugstr_an((char*)&tag, 4); } static HRESULT get_cached_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics) @@ -566,7 +566,7 @@ static HRESULT WINAPI dwritefontface_TryGetFontTable(IDWriteFontFace2 *iface, UI { struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface); - TRACE("(%p)->(%u %p %p %p %p)\n", This, table_tag, table_data, table_size, context, exists); + TRACE("(%p)->(%s %p %p %p %p)\n", This, debugstr_tag(table_tag), table_data, table_size, context, exists); return opentype_get_font_table(This->streams[0], This->type, This->index, table_tag, table_data, context, table_size, exists); } From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: Jacek Caban : ieframe/tests: Fixed tests on some VMs. Message-ID: Module: wine Branch: master Commit: c4d41435062e430c1c5f2ba3e9f3a282a7fd8c72 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c4d41435062e430c1c5f2ba3e9f3a282a7fd8c72 Author: Jacek Caban Date: Tue Sep 15 15:04:50 2015 +0200 ieframe/tests: Fixed tests on some VMs. --- dlls/ieframe/tests/webbrowser.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dlls/ieframe/tests/webbrowser.c b/dlls/ieframe/tests/webbrowser.c index e95fd5e..3e0e760 100644 --- a/dlls/ieframe/tests/webbrowser.c +++ b/dlls/ieframe/tests/webbrowser.c @@ -688,6 +688,8 @@ static void _test_invoke_bool(unsigned line, const DISPPARAMS *params, BOOL stri static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const VARIANT *flags, const VARIANT *frame, const VARIANT *post_data, const VARIANT *headers, const VARIANT *cancel) { + BSTR str; + ok(V_VT(disp) == VT_DISPATCH, "V_VT(disp)=%d, expected VT_DISPATCH\n", V_VT(disp)); ok(V_DISPATCH(disp) != NULL, "V_DISPATCH(disp) == NULL\n"); ok(V_DISPATCH(disp) == (IDispatch*)wb, "V_DISPATCH(disp)=%p, wb=%p\n", V_DISPATCH(disp), wb); @@ -763,8 +765,9 @@ static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const if(V_VARIANTREF(headers)) { ok(V_VT(V_VARIANTREF(headers)) == VT_BSTR, "V_VT(V_VARIANTREF(headers))=%d, expected VT_BSTR\n", V_VT(V_VARIANTREF(headers))); - ok(V_BSTR(V_VARIANTREF(headers)) == NULL, "V_BSTR(V_VARIANTREF(headers)) = %s, expected NULL\n", - wine_dbgstr_w(V_BSTR(V_VARIANTREF(headers)))); + str = V_BSTR(V_VARIANTREF(headers)); + ok(!str || !strcmp_wa(str, "Referer: http://test.winehq.org/tests/hello.html\r\n"), + "V_BSTR(V_VARIANTREF(headers)) = %s, expected NULL\n", wine_dbgstr_w(str)); } ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel)=%x, expected VT_BYREF|VT_BOOL\n", From julliard at wine.codeweavers.com Tue Sep 15 09:50:51 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Tue, 15 Sep 2015 09:50:51 -0500 Subject: Jacek Caban : mshtml/tests: Fixed tests on some Windows versions. Message-ID: Module: wine Branch: master Commit: aacc7b394ee1eb25001ae2854fd774e1b443e50b URL: http://source.winehq.org/git/wine.git/?a=commit;h=aacc7b394ee1eb25001ae2854fd774e1b443e50b Author: Jacek Caban Date: Tue Sep 15 15:09:09 2015 +0200 mshtml/tests: Fixed tests on some Windows versions. --- dlls/mshtml/tests/htmldoc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index 635302c..899cd73 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -3453,7 +3453,8 @@ static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(IDocObjectService *i if(!testing_submit) { ok(!pPostData, "pPostData = %p\n", pPostData); ok(!cbPostData, "cbPostData = %d\n", cbPostData); - ok(!lpszHeaders, "lpszHeaders = %s\n", wine_dbgstr_w(lpszHeaders)); + ok(!lpszHeaders || !strcmp_wa(lpszHeaders, "Referer: http://test.winehq.org/tests/winehq_snapshot/\r\n"), + "lpszHeaders = %s\n", wine_dbgstr_w(lpszHeaders)); }else { ok(cbPostData == 9, "cbPostData = %d\n", cbPostData); ok(!memcmp(pPostData, "cmd=TEST", cbPostData), "pPostData = %p\n", pPostData); From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement D3D11CreateDeviceAndSwapChain(). Message-ID: Module: wine Branch: master Commit: e441e7b4a98cabb39d6270a343a38c8e850fbd9b URL: http://source.winehq.org/git/wine.git/?a=commit;h=e441e7b4a98cabb39d6270a343a38c8e850fbd9b Author: J?zef Kucia Date: Wed Sep 16 01:30:07 2015 +0200 d3d11: Implement D3D11CreateDeviceAndSwapChain(). --- dlls/d3d11/d3d11_main.c | 84 +++++++++++++++++++++++++++++++++++++++++++--- dlls/d3d11/d3d11_private.h | 2 +- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/dlls/d3d11/d3d11_main.c b/dlls/d3d11/d3d11_main.c index bce5e97..5d35f10 100644 --- a/dlls/d3d11/d3d11_main.c +++ b/dlls/d3d11/d3d11_main.c @@ -273,11 +273,85 @@ HRESULT WINAPI D3D11CreateDevice(IDXGIAdapter *adapter, D3D_DRIVER_TYPE driver_t HRESULT WINAPI D3D11CreateDeviceAndSwapChain(IDXGIAdapter *adapter, D3D_DRIVER_TYPE driver_type, HMODULE swrast, UINT flags, const D3D_FEATURE_LEVEL *feature_levels, UINT levels, UINT sdk_version, const DXGI_SWAP_CHAIN_DESC *swapchain_desc, IDXGISwapChain **swapchain, - ID3D11Device **device, D3D_FEATURE_LEVEL *feature_level, ID3D11DeviceContext **immediate_context) + ID3D11Device **device_out, D3D_FEATURE_LEVEL *obtained_feature_level, ID3D11DeviceContext **immediate_context) { - FIXME("adapter %p, driver_type %s, swrast %p, flags %#x, feature_levels %p, levels %#x, sdk_version %u, " - "swapchain_desc %p, swapchain %p, device %p, feature_level %p, immediate_context %p stub!\n", + DXGI_SWAP_CHAIN_DESC desc; + IDXGIDevice *dxgi_device; + IDXGIFactory *factory; + ID3D11Device *device; + HRESULT hr; + + TRACE("adapter %p, driver_type %s, swrast %p, flags %#x, feature_levels %p, levels %u, sdk_version %u, " + "swapchain_desc %p, swapchain %p, device %p, obtained_feature_level %p, immediate_context %p.\n", adapter, debug_d3d_driver_type(driver_type), swrast, flags, feature_levels, levels, sdk_version, - swapchain_desc, swapchain, device, feature_level, immediate_context); - return E_NOTIMPL; + swapchain_desc, swapchain, device_out, obtained_feature_level, immediate_context); + + if (swapchain) + *swapchain = NULL; + if (device_out) + *device_out = NULL; + + if (FAILED(hr = D3D11CreateDevice(adapter, driver_type, swrast, flags, feature_levels, levels, sdk_version, + &device, obtained_feature_level, immediate_context))) + { + WARN("Failed to create a device, returning %#x.\n", hr); + return hr; + } + + if (swapchain) + { + if (FAILED(hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device))) + { + ERR("Failed to get a dxgi device from the d3d11 device, returning %#x.\n", hr); + goto cleanup; + } + + hr = IDXGIDevice_GetAdapter(dxgi_device, &adapter); + IDXGIDevice_Release(dxgi_device); + if (FAILED(hr)) + { + ERR("Failed to get the device adapter, returning %#x.\n", hr); + goto cleanup; + } + + hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory); + IDXGIAdapter_Release(adapter); + if (FAILED(hr)) + { + ERR("Failed to get the adapter factory, returning %#x.\n", hr); + goto cleanup; + } + + desc = *swapchain_desc; + hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &desc, swapchain); + IDXGIFactory_Release(factory); + if (FAILED(hr)) + { + WARN("Failed to create a swapchain, returning %#x.\n", hr); + goto cleanup; + } + + TRACE("Created IDXGISwapChain %p.\n", swapchain); + } + + if (device_out) + *device_out = device; + else + ID3D11Device_Release(device); + + return S_OK; + +cleanup: + if (device) + ID3D11Device_Release(device); + if (obtained_feature_level) + *obtained_feature_level = 0; + if (immediate_context) + { + /* FIXME: Remove the following NULL check once the d3d11_device_GetImmediateContext() is implemented. */ + if (*immediate_context) ID3D11DeviceContext_Release(*immediate_context); + *immediate_context = NULL; + } + + return hr; } diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 303fa6d..27a7ed4 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -353,7 +353,7 @@ HRESULT d3d10_query_init(struct d3d10_query *query, struct d3d_device *device, const D3D10_QUERY_DESC *desc, BOOL predicate) DECLSPEC_HIDDEN; struct d3d10_query *unsafe_impl_from_ID3D10Query(ID3D10Query *iface) DECLSPEC_HIDDEN; -/* IDirect3D10Device1 */ +/* ID3D11Device, ID3D10Device1 */ struct d3d_device { IUnknown IUnknown_inner; From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11/tests: Add tests for D3D11CreateDeviceAndSwapChain(). Message-ID: Module: wine Branch: master Commit: cad6ad920878f05222a55ddaad5cc9e3ef27a409 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cad6ad920878f05222a55ddaad5cc9e3ef27a409 Author: J?zef Kucia Date: Wed Sep 16 01:30:08 2015 +0200 d3d11/tests: Add tests for D3D11CreateDeviceAndSwapChain(). --- dlls/d3d11/tests/Makefile.in | 2 +- dlls/d3d11/tests/d3d11.c | 160 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 154 insertions(+), 8 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=cad6ad920878f05222a55ddaad5cc9e3ef27a409 From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_vertex_shader to d3d_vertex_shader. Message-ID: Module: wine Branch: master Commit: 92a71ae09c2de1c4c27a06f9a4ab40bc018ed72c URL: http://source.winehq.org/git/wine.git/?a=commit;h=92a71ae09c2de1c4c27a06f9a4ab40bc018ed72c Author: J?zef Kucia Date: Wed Sep 16 01:30:09 2015 +0200 d3d11: Rename d3d10_vertex_shader to d3d_vertex_shader. --- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 8 ++++---- dlls/d3d11/shader.c | 30 +++++++++++++++--------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 27a7ed4..1b5be15 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -225,7 +225,7 @@ HRESULT d3d_input_layout_create(struct d3d_device *device, struct d3d_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) DECLSPEC_HIDDEN; /* ID3D10VertexShader */ -struct d3d10_vertex_shader +struct d3d_vertex_shader { ID3D10VertexShader ID3D10VertexShader_iface; LONG refcount; @@ -235,9 +235,9 @@ struct d3d10_vertex_shader ID3D10Device1 *device; }; -HRESULT d3d10_vertex_shader_init(struct d3d10_vertex_shader *shader, struct d3d_device *device, +HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) DECLSPEC_HIDDEN; -struct d3d10_vertex_shader *unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) DECLSPEC_HIDDEN; +struct d3d_vertex_shader *unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) DECLSPEC_HIDDEN; /* ID3D10GeometryShader */ struct d3d10_geometry_shader diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 65524d3..050b83e 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -678,7 +678,7 @@ static void STDMETHODCALLTYPE d3d10_device_VSSetShader(ID3D10Device1 *iface, ID3D10VertexShader *shader) { struct d3d_device *This = impl_from_ID3D10Device(iface); - struct d3d10_vertex_shader *vs = unsafe_impl_from_ID3D10VertexShader(shader); + struct d3d_vertex_shader *vs = unsafe_impl_from_ID3D10VertexShader(shader); TRACE("iface %p, shader %p\n", iface, shader); @@ -1385,7 +1385,7 @@ static void STDMETHODCALLTYPE d3d10_device_PSGetSamplers(ID3D10Device1 *iface, static void STDMETHODCALLTYPE d3d10_device_VSGetShader(ID3D10Device1 *iface, ID3D10VertexShader **shader) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_vertex_shader *shader_impl; + struct d3d_vertex_shader *shader_impl; struct wined3d_shader *wined3d_shader; TRACE("iface %p, shader %p.\n", iface, shader); @@ -2238,7 +2238,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device1 * const void *byte_code, SIZE_T byte_code_length, ID3D10VertexShader **shader) { struct d3d_device *This = impl_from_ID3D10Device(iface); - struct d3d10_vertex_shader *object; + struct d3d_vertex_shader *object; HRESULT hr; TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n", @@ -2248,7 +2248,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device1 * if (!object) return E_OUTOFMEMORY; - hr = d3d10_vertex_shader_init(object, This, byte_code, byte_code_length); + hr = d3d_vertex_shader_init(object, This, byte_code, byte_code_length); if (FAILED(hr)) { WARN("Failed to initialize vertex shader, hr %#x.\n", hr); diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index bab6cbf..b9be0a8 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -122,9 +122,9 @@ void shader_free_signature(struct wined3d_shader_signature *s) HeapFree(GetProcessHeap(), 0, s->elements); } -static inline struct d3d10_vertex_shader *impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) +static inline struct d3d_vertex_shader *impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) { - return CONTAINING_RECORD(iface, struct d3d10_vertex_shader, ID3D10VertexShader_iface); + return CONTAINING_RECORD(iface, struct d3d_vertex_shader, ID3D10VertexShader_iface); } /* IUnknown methods */ @@ -151,7 +151,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_QueryInterface(ID3D10Vertex static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_AddRef(ID3D10VertexShader *iface) { - struct d3d10_vertex_shader *This = impl_from_ID3D10VertexShader(iface); + struct d3d_vertex_shader *This = impl_from_ID3D10VertexShader(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); @@ -169,7 +169,7 @@ static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_AddRef(ID3D10VertexShader *if static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *iface) { - struct d3d10_vertex_shader *This = impl_from_ID3D10VertexShader(iface); + struct d3d_vertex_shader *This = impl_from_ID3D10VertexShader(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); @@ -193,7 +193,7 @@ static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *i static void STDMETHODCALLTYPE d3d10_vertex_shader_GetDevice(ID3D10VertexShader *iface, ID3D10Device **device) { - struct d3d10_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); TRACE("iface %p, device %p.\n", iface, device); @@ -204,7 +204,7 @@ static void STDMETHODCALLTYPE d3d10_vertex_shader_GetDevice(ID3D10VertexShader * static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_GetPrivateData(ID3D10VertexShader *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d10_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -215,7 +215,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_GetPrivateData(ID3D10Vertex static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_SetPrivateData(ID3D10VertexShader *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d10_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -226,7 +226,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_SetPrivateData(ID3D10Vertex static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_SetPrivateDataInterface(ID3D10VertexShader *iface, REFGUID guid, const IUnknown *data) { - struct d3d10_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); @@ -246,20 +246,20 @@ static const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl = d3d10_vertex_shader_SetPrivateDataInterface, }; -static void STDMETHODCALLTYPE d3d10_vertex_shader_wined3d_object_destroyed(void *parent) +static void STDMETHODCALLTYPE d3d_vertex_shader_wined3d_object_destroyed(void *parent) { - struct d3d10_vertex_shader *shader = parent; + struct d3d_vertex_shader *shader = parent; wined3d_private_store_cleanup(&shader->private_store); HeapFree(GetProcessHeap(), 0, parent); } -static const struct wined3d_parent_ops d3d10_vertex_shader_wined3d_parent_ops = +static const struct wined3d_parent_ops d3d_vertex_shader_wined3d_parent_ops = { - d3d10_vertex_shader_wined3d_object_destroyed, + d3d_vertex_shader_wined3d_object_destroyed, }; -HRESULT d3d10_vertex_shader_init(struct d3d10_vertex_shader *shader, struct d3d_device *device, +HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { struct wined3d_shader_signature output_signature; @@ -289,7 +289,7 @@ HRESULT d3d10_vertex_shader_init(struct d3d10_vertex_shader *shader, struct d3d_ desc.max_version = 4; hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader, - &d3d10_vertex_shader_wined3d_parent_ops, &shader->wined3d_shader); + &d3d_vertex_shader_wined3d_parent_ops, &shader->wined3d_shader); shader_free_signature(&input_signature); shader_free_signature(&output_signature); if (FAILED(hr)) @@ -307,7 +307,7 @@ HRESULT d3d10_vertex_shader_init(struct d3d10_vertex_shader *shader, struct d3d_ return S_OK; } -struct d3d10_vertex_shader *unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) +struct d3d_vertex_shader *unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) { if (!iface) return NULL; From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement ID3D11VertexShader interface. Message-ID: Module: wine Branch: master Commit: 32892beba97bf71133191310c4b9e8203d3b8d2c URL: http://source.winehq.org/git/wine.git/?a=commit;h=32892beba97bf71133191310c4b9e8203d3b8d2c Author: J?zef Kucia Date: Wed Sep 16 01:30:10 2015 +0200 d3d11: Implement ID3D11VertexShader interface. --- dlls/d3d11/d3d11_private.h | 5 +- dlls/d3d11/shader.c | 155 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 131 insertions(+), 29 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 1b5be15..517a1be 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -224,15 +224,16 @@ HRESULT d3d_input_layout_create(struct d3d_device *device, struct d3d_input_layout **layout) DECLSPEC_HIDDEN; struct d3d_input_layout *unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface) DECLSPEC_HIDDEN; -/* ID3D10VertexShader */ +/* ID3D11VertexShader, ID3D10VertexShader */ struct d3d_vertex_shader { + ID3D11VertexShader ID3D11VertexShader_iface; ID3D10VertexShader ID3D10VertexShader_iface; LONG refcount; struct wined3d_private_store private_store; struct wined3d_shader *wined3d_shader; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index b9be0a8..f0aadc8 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -122,73 +122,174 @@ void shader_free_signature(struct wined3d_shader_signature *s) HeapFree(GetProcessHeap(), 0, s->elements); } -static inline struct d3d_vertex_shader *impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) +/* ID3D11VertexShader methods */ + +static inline struct d3d_vertex_shader *impl_from_ID3D11VertexShader(ID3D11VertexShader *iface) { - return CONTAINING_RECORD(iface, struct d3d_vertex_shader, ID3D10VertexShader_iface); + return CONTAINING_RECORD(iface, struct d3d_vertex_shader, ID3D11VertexShader_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_QueryInterface(ID3D10VertexShader *iface, +static HRESULT STDMETHODCALLTYPE d3d11_vertex_shader_QueryInterface(ID3D11VertexShader *iface, REFIID riid, void **object) { - TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); - if (IsEqualGUID(riid, &IID_ID3D10VertexShader) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D11VertexShader) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11VertexShader_AddRef(iface); *object = iface; return S_OK; } - WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + if (IsEqualGUID(riid, &IID_ID3D10VertexShader) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + IUnknown_AddRef(&shader->ID3D10VertexShader_iface); + *object = &shader->ID3D10VertexShader_iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *object = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_AddRef(ID3D10VertexShader *iface) +static ULONG STDMETHODCALLTYPE d3d11_vertex_shader_AddRef(ID3D11VertexShader *iface) { - struct d3d_vertex_shader *This = impl_from_ID3D10VertexShader(iface); - ULONG refcount = InterlockedIncrement(&This->refcount); + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); + ULONG refcount = InterlockedIncrement(&shader->refcount); - TRACE("%p increasing refcount to %u\n", This, refcount); + TRACE("%p increasing refcount to %u.\n", shader, refcount); if (refcount == 1) { - ID3D10Device1_AddRef(This->device); + ID3D11Device_AddRef(shader->device); wined3d_mutex_lock(); - wined3d_shader_incref(This->wined3d_shader); + wined3d_shader_incref(shader->wined3d_shader); wined3d_mutex_unlock(); } return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *iface) +static ULONG STDMETHODCALLTYPE d3d11_vertex_shader_Release(ID3D11VertexShader *iface) { - struct d3d_vertex_shader *This = impl_from_ID3D10VertexShader(iface); - ULONG refcount = InterlockedDecrement(&This->refcount); + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); + ULONG refcount = InterlockedDecrement(&shader->refcount); - TRACE("%p decreasing refcount to %u\n", This, refcount); + TRACE("%p decreasing refcount to %u.\n", shader, refcount); if (!refcount) { - ID3D10Device1 *device = This->device; + ID3D11Device *device = shader->device; wined3d_mutex_lock(); - wined3d_shader_decref(This->wined3d_shader); + wined3d_shader_decref(shader->wined3d_shader); wined3d_mutex_unlock(); /* Release the device last, it may cause the wined3d device to be * destroyed. */ - ID3D10Device1_Release(device); + ID3D11Device_Release(device); } return refcount; } +static void STDMETHODCALLTYPE d3d11_vertex_shader_GetDevice(ID3D11VertexShader *iface, + ID3D11Device **device) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = shader->device; + ID3D11Device_AddRef(*device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_vertex_shader_GetPrivateData(ID3D11VertexShader *iface, + REFGUID guid, UINT *data_size, void *data) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_get_private_data(&shader->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_vertex_shader_SetPrivateData(ID3D11VertexShader *iface, + REFGUID guid, UINT data_size, const void *data) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_set_private_data(&shader->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_vertex_shader_SetPrivateDataInterface(ID3D11VertexShader *iface, + REFGUID guid, const IUnknown *data) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D11VertexShader(iface); + + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&shader->private_store, guid, data); +} + +static const struct ID3D11VertexShaderVtbl d3d11_vertex_shader_vtbl = +{ + /* IUnknown methods */ + d3d11_vertex_shader_QueryInterface, + d3d11_vertex_shader_AddRef, + d3d11_vertex_shader_Release, + /* ID3D11DeviceChild methods */ + d3d11_vertex_shader_GetDevice, + d3d11_vertex_shader_GetPrivateData, + d3d11_vertex_shader_SetPrivateData, + d3d11_vertex_shader_SetPrivateDataInterface, +}; + +/* ID3D10VertexShader methods */ + +static inline struct d3d_vertex_shader *impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_vertex_shader, ID3D10VertexShader_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_QueryInterface(ID3D10VertexShader *iface, + REFIID riid, void **object) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_vertex_shader_QueryInterface(&shader->ID3D11VertexShader_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_AddRef(ID3D10VertexShader *iface) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_vertex_shader_AddRef(&shader->ID3D11VertexShader_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *iface) +{ + struct d3d_vertex_shader *shader = impl_from_ID3D10VertexShader(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_vertex_shader_Release(&shader->ID3D11VertexShader_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_vertex_shader_GetDevice(ID3D10VertexShader *iface, ID3D10Device **device) @@ -197,8 +298,7 @@ static void STDMETHODCALLTYPE d3d10_vertex_shader_GetDevice(ID3D10VertexShader * TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)shader->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(shader->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_GetPrivateData(ID3D10VertexShader *iface, @@ -268,6 +368,7 @@ HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_devi struct wined3d_shader_desc desc; HRESULT hr; + shader->ID3D11VertexShader_iface.lpVtbl = &d3d11_vertex_shader_vtbl; shader->ID3D10VertexShader_iface.lpVtbl = &d3d10_vertex_shader_vtbl; shader->refcount = 1; wined3d_mutex_lock(); @@ -301,8 +402,8 @@ HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_devi } wined3d_mutex_unlock(); - shader->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(shader->device); + shader->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(shader->device); return S_OK; } From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreateVertexShader(). Message-ID: Module: wine Branch: master Commit: 70fdfdb11b312709e74b90e3f564f874a476e419 URL: http://source.winehq.org/git/wine.git/?a=commit;h=70fdfdb11b312709e74b90e3f564f874a476e419 Author: J?zef Kucia Date: Wed Sep 16 01:30:11 2015 +0200 d3d11: Implement d3d11_device_CreateVertexShader(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 32 +++++++++++++++++--------------- dlls/d3d11/shader.c | 24 +++++++++++++++++++++++- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 517a1be..e14a305 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -236,8 +236,8 @@ struct d3d_vertex_shader ID3D11Device *device; }; -HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, - const void *byte_code, SIZE_T byte_code_length) DECLSPEC_HIDDEN; +HRESULT d3d_vertex_shader_create(struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length, + struct d3d_vertex_shader **shader) DECLSPEC_HIDDEN; struct d3d_vertex_shader *unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) DECLSPEC_HIDDEN; /* ID3D10GeometryShader */ diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 050b83e..f3e5e89 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -199,10 +199,22 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateInputLayout(ID3D11Device *if static HRESULT STDMETHODCALLTYPE d3d11_device_CreateVertexShader(ID3D11Device *iface, const void *byte_code, SIZE_T byte_code_length, ID3D11ClassLinkage *class_linkage, ID3D11VertexShader **shader) { - FIXME("iface %p, byte_code %p, byte_code_length %lu, class_linkage %p, shader %p stub!\n", + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_vertex_shader *object; + HRESULT hr; + + TRACE("iface %p, byte_code %p, byte_code_length %lu, class_linkage %p, shader %p.\n", iface, byte_code, byte_code_length, class_linkage, shader); - return E_NOTIMPL; + if (class_linkage) + FIXME("Class linkage is not implemented yet.\n"); + + if (FAILED(hr = d3d_vertex_shader_create(device, byte_code, byte_code_length, &object))) + return hr; + + *shader = &object->ID3D11VertexShader_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateGeometryShader(ID3D11Device *iface, const void *byte_code, @@ -2237,26 +2249,16 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device1 *i static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device1 *iface, const void *byte_code, SIZE_T byte_code_length, ID3D10VertexShader **shader) { - struct d3d_device *This = impl_from_ID3D10Device(iface); + struct d3d_device *device = impl_from_ID3D10Device(iface); struct d3d_vertex_shader *object; HRESULT hr; - TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n", + TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p.\n", iface, byte_code, byte_code_length, shader); - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) - return E_OUTOFMEMORY; - - hr = d3d_vertex_shader_init(object, This, byte_code, byte_code_length); - if (FAILED(hr)) - { - WARN("Failed to initialize vertex shader, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); + if (FAILED(hr = d3d_vertex_shader_create(device, byte_code, byte_code_length, &object))) return hr; - } - TRACE("Created vertex shader %p.\n", object); *shader = &object->ID3D10VertexShader_iface; return S_OK; diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index f0aadc8..2df882c 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -359,7 +359,7 @@ static const struct wined3d_parent_ops d3d_vertex_shader_wined3d_parent_ops = d3d_vertex_shader_wined3d_object_destroyed, }; -HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, +static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { struct wined3d_shader_signature output_signature; @@ -408,6 +408,28 @@ HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_devi return S_OK; } +HRESULT d3d_vertex_shader_create(struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length, + struct d3d_vertex_shader **shader) +{ + struct d3d_vertex_shader *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_vertex_shader_init(object, device, byte_code, byte_code_length))) + { + WARN("Failed to initialize vertex shader, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex shader %p.\n", object); + *shader = object; + + return S_OK; +} + struct d3d_vertex_shader *unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader *iface) { if (!iface) From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Rename d3d10_pixel_shader to d3d_pixel_shader. Message-ID: Module: wine Branch: master Commit: f210c42de79e98288a277b6ee48cde351f047a29 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f210c42de79e98288a277b6ee48cde351f047a29 Author: J?zef Kucia Date: Wed Sep 16 01:30:12 2015 +0200 d3d11: Rename d3d10_pixel_shader to d3d_pixel_shader. --- dlls/d3d11/d3d11_private.h | 6 +++--- dlls/d3d11/device.c | 8 ++++---- dlls/d3d11/shader.c | 30 +++++++++++++++--------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index e14a305..5dc50ad 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -255,7 +255,7 @@ HRESULT d3d10_geometry_shader_init(struct d3d10_geometry_shader *shader, struct struct d3d10_geometry_shader *unsafe_impl_from_ID3D10GeometryShader(ID3D10GeometryShader *iface) DECLSPEC_HIDDEN; /* ID3D10PixelShader */ -struct d3d10_pixel_shader +struct d3d_pixel_shader { ID3D10PixelShader ID3D10PixelShader_iface; LONG refcount; @@ -265,9 +265,9 @@ struct d3d10_pixel_shader ID3D10Device1 *device; }; -HRESULT d3d10_pixel_shader_init(struct d3d10_pixel_shader *shader, struct d3d_device *device, +HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) DECLSPEC_HIDDEN; -struct d3d10_pixel_shader *unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) DECLSPEC_HIDDEN; +struct d3d_pixel_shader *unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) DECLSPEC_HIDDEN; HRESULT shader_parse_signature(const char *data, DWORD data_size, struct wined3d_shader_signature *s) DECLSPEC_HIDDEN; void shader_free_signature(struct wined3d_shader_signature *s) DECLSPEC_HIDDEN; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index f3e5e89..9ebb5a2 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -657,7 +657,7 @@ static void STDMETHODCALLTYPE d3d10_device_PSSetShader(ID3D10Device1 *iface, ID3D10PixelShader *shader) { struct d3d_device *This = impl_from_ID3D10Device(iface); - struct d3d10_pixel_shader *ps = unsafe_impl_from_ID3D10PixelShader(shader); + struct d3d_pixel_shader *ps = unsafe_impl_from_ID3D10PixelShader(shader); TRACE("iface %p, shader %p\n", iface, shader); @@ -1347,7 +1347,7 @@ static void STDMETHODCALLTYPE d3d10_device_PSGetShaderResources(ID3D10Device1 *i static void STDMETHODCALLTYPE d3d10_device_PSGetShader(ID3D10Device1 *iface, ID3D10PixelShader **shader) { struct d3d_device *device = impl_from_ID3D10Device(iface); - struct d3d10_pixel_shader *shader_impl; + struct d3d_pixel_shader *shader_impl; struct wined3d_shader *wined3d_shader; TRACE("iface %p, shader %p.\n", iface, shader); @@ -2308,7 +2308,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreatePixelShader(ID3D10Device1 *i const void *byte_code, SIZE_T byte_code_length, ID3D10PixelShader **shader) { struct d3d_device *This = impl_from_ID3D10Device(iface); - struct d3d10_pixel_shader *object; + struct d3d_pixel_shader *object; HRESULT hr; TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n", @@ -2318,7 +2318,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreatePixelShader(ID3D10Device1 *i if (!object) return E_OUTOFMEMORY; - hr = d3d10_pixel_shader_init(object, This, byte_code, byte_code_length); + hr = d3d_pixel_shader_init(object, This, byte_code, byte_code_length); if (FAILED(hr)) { WARN("Failed to initialize pixel shader, hr %#x.\n", hr); diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index 2df882c..8bf32f0 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -612,9 +612,9 @@ struct d3d10_geometry_shader *unsafe_impl_from_ID3D10GeometryShader(ID3D10Geomet return impl_from_ID3D10GeometryShader(iface); } -static inline struct d3d10_pixel_shader *impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) +static inline struct d3d_pixel_shader *impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) { - return CONTAINING_RECORD(iface, struct d3d10_pixel_shader, ID3D10PixelShader_iface); + return CONTAINING_RECORD(iface, struct d3d_pixel_shader, ID3D10PixelShader_iface); } /* IUnknown methods */ @@ -641,7 +641,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_QueryInterface(ID3D10PixelSh static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_AddRef(ID3D10PixelShader *iface) { - struct d3d10_pixel_shader *This = impl_from_ID3D10PixelShader(iface); + struct d3d_pixel_shader *This = impl_from_ID3D10PixelShader(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); @@ -659,7 +659,7 @@ static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_AddRef(ID3D10PixelShader *ifac static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_Release(ID3D10PixelShader *iface) { - struct d3d10_pixel_shader *This = impl_from_ID3D10PixelShader(iface); + struct d3d_pixel_shader *This = impl_from_ID3D10PixelShader(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); @@ -683,7 +683,7 @@ static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_Release(ID3D10PixelShader *ifa static void STDMETHODCALLTYPE d3d10_pixel_shader_GetDevice(ID3D10PixelShader *iface, ID3D10Device **device) { - struct d3d10_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); TRACE("iface %p, device %p.\n", iface, device); @@ -694,7 +694,7 @@ static void STDMETHODCALLTYPE d3d10_pixel_shader_GetDevice(ID3D10PixelShader *if static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_GetPrivateData(ID3D10PixelShader *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d10_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -705,7 +705,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_GetPrivateData(ID3D10PixelSh static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_SetPrivateData(ID3D10PixelShader *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d10_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); @@ -716,7 +716,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_SetPrivateData(ID3D10PixelSh static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_SetPrivateDataInterface(ID3D10PixelShader *iface, REFGUID guid, const IUnknown *data) { - struct d3d10_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); @@ -736,20 +736,20 @@ static const struct ID3D10PixelShaderVtbl d3d10_pixel_shader_vtbl = d3d10_pixel_shader_SetPrivateDataInterface, }; -static void STDMETHODCALLTYPE d3d10_pixel_shader_wined3d_object_destroyed(void *parent) +static void STDMETHODCALLTYPE d3d_pixel_shader_wined3d_object_destroyed(void *parent) { - struct d3d10_pixel_shader *shader = parent; + struct d3d_pixel_shader *shader = parent; wined3d_private_store_cleanup(&shader->private_store); HeapFree(GetProcessHeap(), 0, parent); } -static const struct wined3d_parent_ops d3d10_pixel_shader_wined3d_parent_ops = +static const struct wined3d_parent_ops d3d_pixel_shader_wined3d_parent_ops = { - d3d10_pixel_shader_wined3d_object_destroyed, + d3d_pixel_shader_wined3d_object_destroyed, }; -HRESULT d3d10_pixel_shader_init(struct d3d10_pixel_shader *shader, struct d3d_device *device, +HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { struct wined3d_shader_signature output_signature; @@ -779,7 +779,7 @@ HRESULT d3d10_pixel_shader_init(struct d3d10_pixel_shader *shader, struct d3d_de desc.max_version = 4; hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader, - &d3d10_pixel_shader_wined3d_parent_ops, &shader->wined3d_shader); + &d3d_pixel_shader_wined3d_parent_ops, &shader->wined3d_shader); shader_free_signature(&input_signature); shader_free_signature(&output_signature); if (FAILED(hr)) @@ -797,7 +797,7 @@ HRESULT d3d10_pixel_shader_init(struct d3d10_pixel_shader *shader, struct d3d_de return S_OK; } -struct d3d10_pixel_shader *unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) +struct d3d_pixel_shader *unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) { if (!iface) return NULL; From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement ID3D11PixelShader interface. Message-ID: Module: wine Branch: master Commit: 13a80eaab180517ff64963cafce87ed04ec72820 URL: http://source.winehq.org/git/wine.git/?a=commit;h=13a80eaab180517ff64963cafce87ed04ec72820 Author: J?zef Kucia Date: Wed Sep 16 01:30:13 2015 +0200 d3d11: Implement ID3D11PixelShader interface. --- dlls/d3d11/d3d11_private.h | 5 +- dlls/d3d11/shader.c | 155 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 131 insertions(+), 29 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 5dc50ad..3aff186 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -254,15 +254,16 @@ HRESULT d3d10_geometry_shader_init(struct d3d10_geometry_shader *shader, struct const void *byte_code, SIZE_T byte_code_length) DECLSPEC_HIDDEN; struct d3d10_geometry_shader *unsafe_impl_from_ID3D10GeometryShader(ID3D10GeometryShader *iface) DECLSPEC_HIDDEN; -/* ID3D10PixelShader */ +/* ID3D11PixelShader, ID3D10PixelShader */ struct d3d_pixel_shader { + ID3D11PixelShader ID3D11PixelShader_iface; ID3D10PixelShader ID3D10PixelShader_iface; LONG refcount; struct wined3d_private_store private_store; struct wined3d_shader *wined3d_shader; - ID3D10Device1 *device; + ID3D11Device *device; }; HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index 8bf32f0..695ccf9 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -612,73 +612,174 @@ struct d3d10_geometry_shader *unsafe_impl_from_ID3D10GeometryShader(ID3D10Geomet return impl_from_ID3D10GeometryShader(iface); } -static inline struct d3d_pixel_shader *impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) +/* ID3D11PixelShader methods */ + +static inline struct d3d_pixel_shader *impl_from_ID3D11PixelShader(ID3D11PixelShader *iface) { - return CONTAINING_RECORD(iface, struct d3d_pixel_shader, ID3D10PixelShader_iface); + return CONTAINING_RECORD(iface, struct d3d_pixel_shader, ID3D11PixelShader_iface); } -/* IUnknown methods */ - -static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_QueryInterface(ID3D10PixelShader *iface, +static HRESULT STDMETHODCALLTYPE d3d11_pixel_shader_QueryInterface(ID3D11PixelShader *iface, REFIID riid, void **object) { - TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); - if (IsEqualGUID(riid, &IID_ID3D10PixelShader) - || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D11PixelShader) + || IsEqualGUID(riid, &IID_ID3D11DeviceChild) || IsEqualGUID(riid, &IID_IUnknown)) { - IUnknown_AddRef(iface); + ID3D11PixelShader_AddRef(iface); *object = iface; return S_OK; } - WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + if (IsEqualGUID(riid, &IID_ID3D10PixelShader) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild)) + { + IUnknown_AddRef(&shader->ID3D10PixelShader_iface); + *object = &shader->ID3D10PixelShader_iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); *object = NULL; return E_NOINTERFACE; } -static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_AddRef(ID3D10PixelShader *iface) +static ULONG STDMETHODCALLTYPE d3d11_pixel_shader_AddRef(ID3D11PixelShader *iface) { - struct d3d_pixel_shader *This = impl_from_ID3D10PixelShader(iface); - ULONG refcount = InterlockedIncrement(&This->refcount); + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); + ULONG refcount = InterlockedIncrement(&shader->refcount); - TRACE("%p increasing refcount to %u\n", This, refcount); + TRACE("%p increasing refcount to %u.\n", shader, refcount); if (refcount == 1) { - ID3D10Device1_AddRef(This->device); + ID3D11Device_AddRef(shader->device); wined3d_mutex_lock(); - wined3d_shader_incref(This->wined3d_shader); + wined3d_shader_incref(shader->wined3d_shader); wined3d_mutex_unlock(); } return refcount; } -static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_Release(ID3D10PixelShader *iface) +static ULONG STDMETHODCALLTYPE d3d11_pixel_shader_Release(ID3D11PixelShader *iface) { - struct d3d_pixel_shader *This = impl_from_ID3D10PixelShader(iface); - ULONG refcount = InterlockedDecrement(&This->refcount); + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); + ULONG refcount = InterlockedDecrement(&shader->refcount); - TRACE("%p decreasing refcount to %u\n", This, refcount); + TRACE("%p decreasing refcount to %u.\n", shader, refcount); if (!refcount) { - ID3D10Device1 *device = This->device; + ID3D11Device *device = shader->device; wined3d_mutex_lock(); - wined3d_shader_decref(This->wined3d_shader); + wined3d_shader_decref(shader->wined3d_shader); wined3d_mutex_unlock(); /* Release the device last, it may cause the wined3d device to be * destroyed. */ - ID3D10Device1_Release(device); + ID3D11Device_Release(device); } return refcount; } +static void STDMETHODCALLTYPE d3d11_pixel_shader_GetDevice(ID3D11PixelShader *iface, + ID3D11Device **device) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); + + TRACE("iface %p, device %p.\n", iface, device); + + *device = shader->device; + ID3D11Device_AddRef(*device); +} + +static HRESULT STDMETHODCALLTYPE d3d11_pixel_shader_GetPrivateData(ID3D11PixelShader *iface, + REFGUID guid, UINT *data_size, void *data) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); + + TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_get_private_data(&shader->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_pixel_shader_SetPrivateData(ID3D11PixelShader *iface, + REFGUID guid, UINT data_size, const void *data) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); + + TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); + + return d3d_set_private_data(&shader->private_store, guid, data_size, data); +} + +static HRESULT STDMETHODCALLTYPE d3d11_pixel_shader_SetPrivateDataInterface(ID3D11PixelShader *iface, + REFGUID guid, const IUnknown *data) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D11PixelShader(iface); + + TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data); + + return d3d_set_private_data_interface(&shader->private_store, guid, data); +} + +static const struct ID3D11PixelShaderVtbl d3d11_pixel_shader_vtbl = +{ + /* IUnknown methods */ + d3d11_pixel_shader_QueryInterface, + d3d11_pixel_shader_AddRef, + d3d11_pixel_shader_Release, + /* ID3D11DeviceChild methods */ + d3d11_pixel_shader_GetDevice, + d3d11_pixel_shader_GetPrivateData, + d3d11_pixel_shader_SetPrivateData, + d3d11_pixel_shader_SetPrivateDataInterface, +}; + +/* ID3D10PixelShader methods */ + +static inline struct d3d_pixel_shader *impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) +{ + return CONTAINING_RECORD(iface, struct d3d_pixel_shader, ID3D10PixelShader_iface); +} + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_QueryInterface(ID3D10PixelShader *iface, + REFIID riid, void **object) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return d3d11_pixel_shader_QueryInterface(&shader->ID3D11PixelShader_iface, riid, object); +} + +static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_AddRef(ID3D10PixelShader *iface) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_pixel_shader_AddRef(&shader->ID3D11PixelShader_iface); +} + +static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_Release(ID3D10PixelShader *iface) +{ + struct d3d_pixel_shader *shader = impl_from_ID3D10PixelShader(iface); + + TRACE("iface %p.\n", iface); + + return d3d11_pixel_shader_Release(&shader->ID3D11PixelShader_iface); +} + /* ID3D10DeviceChild methods */ static void STDMETHODCALLTYPE d3d10_pixel_shader_GetDevice(ID3D10PixelShader *iface, ID3D10Device **device) @@ -687,8 +788,7 @@ static void STDMETHODCALLTYPE d3d10_pixel_shader_GetDevice(ID3D10PixelShader *if TRACE("iface %p, device %p.\n", iface, device); - *device = (ID3D10Device *)shader->device; - ID3D10Device_AddRef(*device); + ID3D11Device_QueryInterface(shader->device, &IID_ID3D10Device, (void **)device); } static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_GetPrivateData(ID3D10PixelShader *iface, @@ -758,6 +858,7 @@ HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device struct wined3d_shader_desc desc; HRESULT hr; + shader->ID3D11PixelShader_iface.lpVtbl = &d3d11_pixel_shader_vtbl; shader->ID3D10PixelShader_iface.lpVtbl = &d3d10_pixel_shader_vtbl; shader->refcount = 1; wined3d_mutex_lock(); @@ -791,8 +892,8 @@ HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device } wined3d_mutex_unlock(); - shader->device = &device->ID3D10Device1_iface; - ID3D10Device1_AddRef(shader->device); + shader->device = &device->ID3D11Device_iface; + ID3D11Device_AddRef(shader->device); return S_OK; } From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Implement d3d11_device_CreatePixelShader(). Message-ID: Module: wine Branch: master Commit: 8d253f84011d4f3c99520cfa9240ec596efb786f URL: http://source.winehq.org/git/wine.git/?a=commit;h=8d253f84011d4f3c99520cfa9240ec596efb786f Author: J?zef Kucia Date: Wed Sep 16 01:30:14 2015 +0200 d3d11: Implement d3d11_device_CreatePixelShader(). --- dlls/d3d11/d3d11_private.h | 4 ++-- dlls/d3d11/device.c | 32 +++++++++++++++++--------------- dlls/d3d11/shader.c | 24 +++++++++++++++++++++++- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 3aff186..e76ce6d 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -266,8 +266,8 @@ struct d3d_pixel_shader ID3D11Device *device; }; -HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, - const void *byte_code, SIZE_T byte_code_length) DECLSPEC_HIDDEN; +HRESULT d3d_pixel_shader_create(struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length, + struct d3d_pixel_shader **shader) DECLSPEC_HIDDEN; struct d3d_pixel_shader *unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) DECLSPEC_HIDDEN; HRESULT shader_parse_signature(const char *data, DWORD data_size, struct wined3d_shader_signature *s) DECLSPEC_HIDDEN; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 9ebb5a2..eb605aa 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -242,10 +242,22 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateGeometryShaderWithStreamOutp static HRESULT STDMETHODCALLTYPE d3d11_device_CreatePixelShader(ID3D11Device *iface, const void *byte_code, SIZE_T byte_code_length, ID3D11ClassLinkage *class_linkage, ID3D11PixelShader **shader) { - FIXME("iface %p, byte_code %p, byte_code_length %lu, class_linkage %p, shader %p stub!\n", + struct d3d_device *device = impl_from_ID3D11Device(iface); + struct d3d_pixel_shader *object; + HRESULT hr; + + TRACE("iface %p, byte_code %p, byte_code_length %lu, class_linkage %p, shader %p.\n", iface, byte_code, byte_code_length, class_linkage, shader); - return E_NOTIMPL; + if (class_linkage) + FIXME("Class linkage is not implemented yet.\n"); + + if (FAILED(hr = d3d_pixel_shader_create(device, byte_code, byte_code_length, &object))) + return hr; + + *shader = &object->ID3D11PixelShader_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d11_device_CreateHullShader(ID3D11Device *iface, const void *byte_code, @@ -2307,26 +2319,16 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShaderWithStreamOutp static HRESULT STDMETHODCALLTYPE d3d10_device_CreatePixelShader(ID3D10Device1 *iface, const void *byte_code, SIZE_T byte_code_length, ID3D10PixelShader **shader) { - struct d3d_device *This = impl_from_ID3D10Device(iface); + struct d3d_device *device = impl_from_ID3D10Device(iface); struct d3d_pixel_shader *object; HRESULT hr; - TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n", + TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p.\n", iface, byte_code, byte_code_length, shader); - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) - return E_OUTOFMEMORY; - - hr = d3d_pixel_shader_init(object, This, byte_code, byte_code_length); - if (FAILED(hr)) - { - WARN("Failed to initialize pixel shader, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); + if (FAILED(hr = d3d_pixel_shader_create(device, byte_code, byte_code_length, &object))) return hr; - } - TRACE("Created pixel shader %p.\n", object); *shader = &object->ID3D10PixelShader_iface; return S_OK; diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index 695ccf9..40dac3d 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -849,7 +849,7 @@ static const struct wined3d_parent_ops d3d_pixel_shader_wined3d_parent_ops = d3d_pixel_shader_wined3d_object_destroyed, }; -HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, +static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { struct wined3d_shader_signature output_signature; @@ -898,6 +898,28 @@ HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device return S_OK; } +HRESULT d3d_pixel_shader_create(struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length, + struct d3d_pixel_shader **shader) +{ + struct d3d_pixel_shader *object; + HRESULT hr; + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (FAILED(hr = d3d_pixel_shader_init(object, device, byte_code, byte_code_length))) + { + WARN("Failed to initialize pixel shader, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created pixel shader %p.\n", object); + *shader = object; + + return S_OK; +} + struct d3d_pixel_shader *unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader *iface) { if (!iface) From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: Hans Leidekker : webservices: Implement WsGetReaderNode. Message-ID: Module: wine Branch: master Commit: 8bef93521f56f5f8a6d1443402443d374c16b99d URL: http://source.winehq.org/git/wine.git/?a=commit;h=8bef93521f56f5f8a6d1443402443d374c16b99d Author: Hans Leidekker Date: Wed Sep 16 11:18:27 2015 +0200 webservices: Implement WsGetReaderNode. --- dlls/webservices/reader.c | 95 +++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 7a811c7..1599aac 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -24,6 +24,7 @@ #include "webservices.h" #include "wine/debug.h" +#include "wine/list.h" WINE_DEFAULT_DEBUG_CHANNEL(webservices); @@ -250,6 +251,65 @@ void WINAPI WsFreeHeap( WS_HEAP *handle ) heap_free( heap ); } +struct node +{ + WS_XML_ELEMENT_NODE hdr; + struct list entry; +}; + +static struct node *alloc_node( WS_XML_NODE_TYPE type ) +{ + struct node *ret; + + if (!(ret = heap_alloc_zero( sizeof(*ret) ))) return NULL; + ret->hdr.node.nodeType = type; + list_init( &ret->entry ); + return ret; +} + +static void free_node( struct node *node ) +{ + if (!node) return; + switch (node->hdr.node.nodeType) + { + case WS_XML_NODE_TYPE_ELEMENT: + { + WS_XML_ELEMENT_NODE *elem = (WS_XML_ELEMENT_NODE *)node; + heap_free( elem->prefix ); + heap_free( elem->localName ); + heap_free( elem->ns ); + break; + } + case WS_XML_NODE_TYPE_TEXT: + { + WS_XML_TEXT_NODE *text = (WS_XML_TEXT_NODE *)node; + heap_free( text->text ); + break; + } + case WS_XML_NODE_TYPE_END_ELEMENT: + case WS_XML_NODE_TYPE_EOF: + case WS_XML_NODE_TYPE_BOF: + break; + + default: + ERR( "unhandled type %u\n", node->hdr.node.nodeType ); + break; + } + heap_free( node ); +} + +static void destroy_nodes( struct list *list ) +{ + struct list *ptr; + + while ((ptr = list_head( list ))) + { + struct node *node = LIST_ENTRY( ptr, struct node, entry ); + list_remove( &node->entry ); + free_node( node ); + } +} + static const struct { ULONG size; @@ -276,6 +336,8 @@ reader_props[] = struct reader { + struct list nodes; + struct node *current; const char *input_data; ULONG input_size; ULONG prop_count; @@ -328,6 +390,7 @@ HRESULT WINAPI WsCreateReader( const WS_XML_READER_PROPERTY *properties, ULONG c WS_XML_READER **handle, WS_ERROR *error ) { struct reader *reader; + struct node *node; ULONG i, max_depth = 32, max_attrs = 128, max_ns = 32; WS_CHARSET charset = WS_CHARSET_UTF8; BOOL read_decl = TRUE; @@ -355,6 +418,15 @@ HRESULT WINAPI WsCreateReader( const WS_XML_READER_PROPERTY *properties, ULONG c } } + if (!(node = alloc_node( WS_XML_NODE_TYPE_EOF ))) + { + heap_free( reader ); + return E_OUTOFMEMORY; + } + list_init( &reader->nodes ); + list_add_tail( &reader->nodes, &node->entry ); + reader->current = node; + *handle = (WS_XML_READER *)reader; return S_OK; } @@ -369,6 +441,7 @@ void WINAPI WsFreeReader( WS_XML_READER *handle ) TRACE( "%p\n", handle ); if (!reader) return; + destroy_nodes( &reader->nodes ); heap_free( reader ); } @@ -399,6 +472,23 @@ HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void } /************************************************************************** + * WsGetReaderNode [webservices.@] + */ +HRESULT WINAPI WsGetReaderNode( WS_XML_READER *handle, const WS_XML_NODE **node, + WS_ERROR *error ) +{ + struct reader *reader = (struct reader *)handle; + + TRACE( "%p %p %p\n", handle, node, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!reader || !node) return E_INVALIDARG; + + *node = &reader->current->hdr.node; + return S_OK; +} + +/************************************************************************** * WsGetReaderProperty [webservices.@] */ HRESULT WINAPI WsGetReaderProperty( WS_XML_READER *handle, WS_XML_READER_PROPERTY_ID id, @@ -435,6 +525,7 @@ HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING * ULONG count, WS_ERROR *error ) { struct reader *reader = (struct reader *)handle; + struct node *node; HRESULT hr; ULONG i; @@ -479,5 +570,9 @@ HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING * if (hr != S_OK) return hr; } + if (!(node = alloc_node( WS_XML_NODE_TYPE_BOF ))) return E_OUTOFMEMORY; + list_add_head( &reader->nodes, &node->entry ); + reader->current = node; + return S_OK; } diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 6a81612..cf74019 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -80,7 +80,7 @@ @ stub WsGetPolicyAlternativeCount @ stub WsGetPolicyProperty @ stub WsGetPrefixFromNamespace -@ stub WsGetReaderNode +@ stdcall WsGetReaderNode(ptr ptr ptr) @ stub WsGetReaderPosition @ stdcall WsGetReaderProperty(ptr long ptr long ptr) @ stub WsGetSecurityContextProperty From julliard at wine.codeweavers.com Wed Sep 16 09:54:06 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:06 -0500 Subject: Hans Leidekker : webservices: Implement WsFillReader. Message-ID: Module: wine Branch: master Commit: 7b16d186e62ebe591b41add50074f72ca61aeee5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7b16d186e62ebe591b41add50074f72ca61aeee5 Author: Hans Leidekker Date: Wed Sep 16 11:19:00 2015 +0200 webservices: Implement WsFillReader. --- dlls/webservices/reader.c | 22 ++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index 1599aac..a9219ee 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -336,6 +336,8 @@ reader_props[] = struct reader { + ULONG read_size; + ULONG read_pos; struct list nodes; struct node *current; const char *input_data; @@ -446,6 +448,26 @@ void WINAPI WsFreeReader( WS_XML_READER *handle ) } /************************************************************************** + * WsFillReader [webservices.@] + */ +HRESULT WINAPI WsFillReader( WS_XML_READER *handle, ULONG min_size, const WS_ASYNC_CONTEXT *ctx, + WS_ERROR *error ) +{ + struct reader *reader = (struct reader *)handle; + + TRACE( "%p %u %p %p\n", handle, min_size, ctx, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!reader) return E_INVALIDARG; + + /* FIXME: add support for stream input */ + reader->read_size = min( min_size, reader->input_size ); + reader->read_pos = 0; + + return S_OK; +} + +/************************************************************************** * WsGetErrorProperty [webservices.@] */ HRESULT WINAPI WsGetErrorProperty( WS_ERROR *handle, WS_ERROR_PROPERTY_ID id, void *buf, diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index cf74019..e8a0c7f 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -44,7 +44,7 @@ @ stub WsEndWriterCanonicalization @ stub WsFileTimeToDateTime @ stub WsFillBody -@ stub WsFillReader +@ stdcall WsFillReader(ptr long ptr ptr) @ stub WsFindAttribute @ stub WsFlushBody @ stub WsFlushWriter From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Hans Leidekker : webservices/tests: Add tests. Message-ID: Module: wine Branch: master Commit: 11d0886f04c973ccc6e69b611497083a82d7dfe3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=11d0886f04c973ccc6e69b611497083a82d7dfe3 Author: Hans Leidekker Date: Wed Sep 16 11:19:27 2015 +0200 webservices/tests: Add tests. --- dlls/webservices/tests/reader.c | 121 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c index 7f43a07..e2ab39a 100644 --- a/dlls/webservices/tests/reader.c +++ b/dlls/webservices/tests/reader.c @@ -331,9 +331,130 @@ static void test_WsCreateReader(void) ok( hr == E_INVALIDARG, "got %08x\n", hr ); } +static void test_WsSetInput(void) +{ + HRESULT hr; + WS_XML_READER *reader; + WS_XML_READER_PROPERTY prop; + WS_XML_READER_TEXT_ENCODING enc; + WS_XML_READER_BUFFER_INPUT input; + WS_CHARSET charset; + const WS_XML_NODE *node; + ULONG size, max_depth; + + hr = WsCreateReader( NULL, 0, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsSetInput( NULL, NULL, NULL, NULL, 0, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + node = NULL; + hr = WsGetReaderNode( reader, &node, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( node != NULL, "node not set\n" ); + if (node) ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType ); + + enc.encoding.encodingType = WS_XML_READER_ENCODING_TYPE_TEXT; + enc.charSet = WS_CHARSET_UTF8; + + input.input.inputType = WS_XML_READER_INPUT_TYPE_BUFFER; + input.encodedData = (void *)data1; + input.encodedDataSize = sizeof(data1) - 1; + + hr = WsSetInput( reader, (WS_XML_READER_ENCODING *)&enc, (WS_XML_READER_INPUT *)&input, NULL, 0, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + node = NULL; + hr = WsGetReaderNode( reader, &node, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( node != NULL, "node not set\n" ); + if (node) ok( node->nodeType == WS_XML_NODE_TYPE_BOF, "got %u\n", node->nodeType ); + + /* multiple calls are allowed */ + hr = WsSetInput( reader, (WS_XML_READER_ENCODING *)&enc, (WS_XML_READER_INPUT *)&input, NULL, 0, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + /* charset is detected by WsSetInput */ + enc.encoding.encodingType = WS_XML_READER_ENCODING_TYPE_TEXT; + enc.charSet = WS_CHARSET_AUTO; + hr = WsSetInput( reader, (WS_XML_READER_ENCODING *)&enc, (WS_XML_READER_INPUT *)&input, NULL, 0, NULL ); + todo_wine ok( hr == S_OK, "got %08x\n", hr ); + + charset = 0xdeadbeef; + size = sizeof(charset); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_CHARSET, &charset, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( charset == WS_CHARSET_UTF8, "got %u\n", charset ); + + enc.encoding.encodingType = WS_XML_READER_ENCODING_TYPE_TEXT; + enc.charSet = WS_CHARSET_UTF8; + + /* reader properties can be set with WsSetInput */ + max_depth = 16; + prop.id = WS_XML_READER_PROPERTY_MAX_DEPTH; + prop.value = &max_depth; + prop.valueSize = sizeof(max_depth); + hr = WsSetInput( reader, (WS_XML_READER_ENCODING *)&enc, (WS_XML_READER_INPUT *)&input, &prop, 1, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + max_depth = 0xdeadbeef; + size = sizeof(max_depth); + hr = WsGetReaderProperty( reader, WS_XML_READER_PROPERTY_MAX_DEPTH, &max_depth, size, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( max_depth == 16, "got %u\n", max_depth ); + WsFreeReader( reader ); +} + +static void test_WsFillReader(void) +{ + HRESULT hr; + WS_XML_READER *reader; + const WS_XML_NODE *node; + + hr = WsCreateReader( NULL, 0, &reader, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + hr = set_input( reader, data1, sizeof(data1) - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsFillReader( reader, sizeof(data1) - 1, NULL, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = set_input( reader, data1, sizeof(data1) - 1 ); + ok( hr == S_OK, "got %08x\n", hr ); + + node = NULL; + hr = WsGetReaderNode( reader, &node, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( node != NULL, "node not set\n" ); + if (node) ok( node->nodeType == WS_XML_NODE_TYPE_BOF, "got %u\n", node->nodeType ); + + hr = WsFillReader( NULL, sizeof(data1) - 1, NULL, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + hr = WsFillReader( reader, sizeof(data1) - 1, NULL, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + node = NULL; + hr = WsGetReaderNode( reader, &node, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( node != NULL, "node not set\n" ); + if (node) ok( node->nodeType == WS_XML_NODE_TYPE_BOF, "got %u\n", node->nodeType ); + + hr = WsFillReader( reader, sizeof(data1) - 1, NULL, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + /* min_size larger than input size */ + hr = WsFillReader( reader, sizeof(data1), NULL, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + WsFreeReader( reader ); +} + START_TEST(reader) { test_WsCreateError(); test_WsCreateHeap(); test_WsCreateReader(); + test_WsSetInput(); + test_WsFillReader(); } From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Nikolay Sivov : shell32/tests: Test icon ids that are invalid on all systems. Message-ID: Module: wine Branch: master Commit: e585d17ff31360813df446db6f95713054d24a01 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e585d17ff31360813df446db6f95713054d24a01 Author: Nikolay Sivov Date: Wed Sep 16 12:43:48 2015 +0300 shell32/tests: Test icon ids that are invalid on all systems. --- dlls/shell32/tests/shelllink.c | 40 +++++++++------------------------------- include/shellapi.h | 4 ++-- 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/dlls/shell32/tests/shelllink.c b/dlls/shell32/tests/shelllink.c index b258052..41fac48 100644 --- a/dlls/shell32/tests/shelllink.c +++ b/dlls/shell32/tests/shelllink.c @@ -993,7 +993,6 @@ static void test_SHGetStockIconInfo(void) { BYTE buffer[sizeof(SHSTOCKICONINFO) + 16]; SHSTOCKICONINFO *sii = (SHSTOCKICONINFO *) buffer; - BOOL atleast_win7; HRESULT hr; INT i; @@ -1007,11 +1006,11 @@ static void test_SHGetStockIconInfo(void) /* negative values are handled */ memset(buffer, '#', sizeof(buffer)); sii->cbSize = sizeof(SHSTOCKICONINFO); - hr = pSHGetStockIconInfo(-1, SHGSI_ICONLOCATION, sii); + hr = pSHGetStockIconInfo(SIID_INVALID, SHGSI_ICONLOCATION, sii); ok(hr == E_INVALIDARG, "-1: got 0x%x (expected E_INVALIDARG)\n", hr); /* max. id for vista is 140 (no definition exists for this value) */ - for (i = 0; i <= 140; i++) + for (i = SIID_DOCNOASSOC; i <= SIID_CLUSTEREDDRIVE; i++) { memset(buffer, '#', sizeof(buffer)); sii->cbSize = sizeof(SHSTOCKICONINFO); @@ -1026,38 +1025,17 @@ static void test_SHGetStockIconInfo(void) sii->iIcon, wine_dbgstr_w(sii->szPath)); } - /* there are more icons since win7 */ - memset(buffer, '#', sizeof(buffer)); - sii->cbSize = sizeof(SHSTOCKICONINFO); - hr = pSHGetStockIconInfo(i, SHGSI_ICONLOCATION, sii); - atleast_win7 = (!hr); - - for (; i < (SIID_MAX_ICONS + 25) ; i++) + /* test invalid icons indices that are invalid for all platforms */ + for (i = SIID_MAX_ICONS; i < (SIID_MAX_ICONS + 25) ; i++) { memset(buffer, '#', sizeof(buffer)); sii->cbSize = sizeof(SHSTOCKICONINFO); hr = pSHGetStockIconInfo(i, SHGSI_ICONLOCATION, sii); - - if (atleast_win7 && (i == (SIID_MAX_ICONS - 1)) && broken(hr == E_INVALIDARG)) - { - /* Off by one windows bug: there are SIID_MAX_ICONS icons from 0 - * up to SIID_MAX_ICONS-1 on Windows 8, but the last one is missing - * on Windows 7. - */ - trace("%3d: got E_INVALIDARG (windows bug: off by one)\n", i); - } - else if (atleast_win7 && (i < (SIID_MAX_ICONS))) - { - ok(hr == S_OK, - "%3d: got 0x%x, iSysImageIndex: 0x%x, iIcon: 0x%x (expected S_OK)\n", - i, hr, sii->iSysImageIndex, sii->iIcon); - - if ((hr == S_OK) && (winetest_debug > 1)) - trace("%3d: got iSysImageIndex %3d, iIcon %3d and %s\n", i, sii->iSysImageIndex, - sii->iIcon, wine_dbgstr_w(sii->szPath)); - } - else - ok(hr == E_INVALIDARG, "%3d: got 0x%x (expected E_INVALIDARG)\n", i, hr); + ok(hr == E_INVALIDARG, "%3d: got 0x%x (expected E_INVALIDARG)\n", i, hr); + todo_wine { + ok(sii->iSysImageIndex == -1, "%d: got iSysImageIndex %d\n", i, sii->iSysImageIndex); + ok(sii->iIcon == -1, "%d: got iIcon %d\n", i, sii->iIcon); + } } /* test more returned SHSTOCKICONINFO elements without extra flags */ diff --git a/include/shellapi.h b/include/shellapi.h index 57454e3..b94626f 100644 --- a/include/shellapi.h +++ b/include/shellapi.h @@ -606,8 +606,8 @@ typedef enum SHSTOCKICONID SIID_MEDIABDR, SIID_MEDIABDRE, SIID_CLUSTEREDDRIVE, - /* Missing: 141 - 174 */ - SIID_MAX_ICONS = 175 + /* Missing: 141 - 177 */ + SIID_MAX_ICONS = 178 }SHSTOCKICONID; typedef struct _SHSTOCKICONINFO From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Andrew Eikum : include/xaudio2.idl: Fix struct packing. Message-ID: Module: wine Branch: master Commit: b305000f82986496b0eb71100302e89fb3c938c1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b305000f82986496b0eb71100302e89fb3c938c1 Author: Andrew Eikum Date: Tue Sep 15 13:48:57 2015 -0500 include/xaudio2.idl: Fix struct packing. --- include/xaudio2.idl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/xaudio2.idl b/include/xaudio2.idl index 4dca600..3ac3e22 100644 --- a/include/xaudio2.idl +++ b/include/xaudio2.idl @@ -21,6 +21,8 @@ import "mmdeviceapi.idl"; import "audiosessiontypes.h"; +cpp_quote("#include ") + [ uuid(5a508685-a254-4fba-9b82-9a24b00306af) ] @@ -593,3 +595,5 @@ cpp_quote("inline static float XAudio2RadiansToCutoffFrequency(float radians, fl cpp_quote("#endif") cpp_quote("HRESULT WINAPI XAudio2Create(IXAudio2** pxaudio2, UINT32 flags, XAUDIO2_PROCESSOR processor);") + +cpp_quote("#include ") From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Alistair Leslie-Hughes : d3dx10_43: Add ID3DX10ThreadPump interface. Message-ID: Module: wine Branch: master Commit: 73d03f850ad2f624019847e54cf30addc241777e URL: http://source.winehq.org/git/wine.git/?a=commit;h=73d03f850ad2f624019847e54cf30addc241777e Author: Alistair Leslie-Hughes Date: Wed Jul 15 13:37:50 2015 +1000 d3dx10_43: Add ID3DX10ThreadPump interface. --- include/Makefile.in | 1 + include/d3dx10core.idl | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/include/Makefile.in b/include/Makefile.in index b1104ee..84a6381 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -32,6 +32,7 @@ PUBLIC_IDL_H_SRCS = \ d3d11_1.idl \ d3d11sdklayers.idl \ d3dcommon.idl \ + d3dx10core.idl \ ddstream.idl \ devicetopology.idl \ dimm.idl \ diff --git a/include/d3dx10core.idl b/include/d3dx10core.idl new file mode 100644 index 0000000..f0d8ff6 --- /dev/null +++ b/include/d3dx10core.idl @@ -0,0 +1,66 @@ +/* + * Copyright 2015 Alistair Leslie-Hughes + * + * 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 + */ + +import "oaidl.idl"; +import "ocidl.idl"; +import "dxgi.idl"; +import "d3dcommon.idl"; + +[ + object, + local, + pointer_default(unique) +] +interface ID3DX10DataLoader +{ + HRESULT Load(); + HRESULT Decompress([out] void **data, [in] SIZE_T *bytes); + HRESULT Destroy(); +}; + +[ + object, + local, + pointer_default(unique) +] +interface ID3DX10DataProcessor +{ + HRESULT Process([in] void *data, [in] SIZE_T bytes); + HRESULT CreateDeviceObject([out] void **dataobject); + HRESULT Destroy(); +}; + + +[ + object, + local, + pointer_default(unique), + uuid(c93fecfa-6967-478a-abbc-402d90621fcb) +] +interface ID3DX10ThreadPump : IUnknown +{ + HRESULT AddWorkItem([in] ID3DX10DataLoader *loader, [in] ID3DX10DataProcessor *processor, + [in] HRESULT *result, [out] void **object); + UINT GetWorkItemCount(); + + HRESULT WaitForAllItems(); + HRESULT ProcessDeviceWorkItems([in] UINT count); + + HRESULT PurgeAllItems(); + HRESULT GetQueueStatus([in] UINT *queue, [in] UINT *processqueue, [in] UINT *devicequeue); +}; From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Alistair Leslie-Hughes : d3dx10_43: Add D3DX10CreateEffectFromFileA/ W stubs. Message-ID: Module: wine Branch: master Commit: 145dc1dd14d47e8d0bfa4fccc63f9d2c42f5fa9f URL: http://source.winehq.org/git/wine.git/?a=commit;h=145dc1dd14d47e8d0bfa4fccc63f9d2c42f5fa9f Author: Alistair Leslie-Hughes Date: Wed Jul 15 12:19:50 2015 +1000 d3dx10_43: Add D3DX10CreateEffectFromFileA/W stubs. --- dlls/d3dx10_43/d3dx10_43.spec | 4 ++-- dlls/d3dx10_43/d3dx10_43_main.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/dlls/d3dx10_43/d3dx10_43.spec b/dlls/d3dx10_43/d3dx10_43.spec index 363d007..5bc871b 100644 --- a/dlls/d3dx10_43/d3dx10_43.spec +++ b/dlls/d3dx10_43/d3dx10_43.spec @@ -20,8 +20,8 @@ @ stub D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) @ stub D3DX10CreateDevice(ptr long long long ptr) @ stub D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) -@ stub D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) -@ stub D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stub D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stub D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stub D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) diff --git a/dlls/d3dx10_43/d3dx10_43_main.c b/dlls/d3dx10_43/d3dx10_43_main.c index b3f9341..1b505fa 100644 --- a/dlls/d3dx10_43/d3dx10_43_main.c +++ b/dlls/d3dx10_43/d3dx10_43_main.c @@ -21,6 +21,8 @@ #include "config.h" #include "wine/port.h" +#include "wine/debug.h" +#include "wine/unicode.h" #include @@ -32,6 +34,9 @@ #include "objbase.h" #include "d3d10.h" +#include "d3dx10core.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dx); BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { @@ -59,3 +64,29 @@ BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) return FALSE; } + +HRESULT WINAPI D3DX10CreateEffectFromFileA(const char *filename, const D3D10_SHADER_MACRO *defines, + ID3D10Include *include, const char *profile, UINT hlslflags, UINT fxflags, ID3D10Device *device, + ID3D10EffectPool *effectpool, ID3DX10ThreadPump *pump, ID3D10Effect **effect, ID3D10Blob **errors, + HRESULT *hresult) +{ + FIXME("filename %s, defines %p, include %p, profile %s, hlslflags %#x, fxflags %#x, " + "device %p, effectpool %p, pump %p, effect %p, errors %p, hresult %p\n", + debugstr_a(filename), defines, include, debugstr_a(profile), hlslflags, fxflags, + device, effectpool, pump, effect, errors, hresult); + + return E_NOTIMPL; +} + +HRESULT WINAPI D3DX10CreateEffectFromFileW(const WCHAR *filename, const D3D10_SHADER_MACRO *defines, + ID3D10Include *include, const char *profile, UINT hlslflags, UINT fxflags, ID3D10Device *device, + ID3D10EffectPool *effectpool, ID3DX10ThreadPump *pump, ID3D10Effect **effect, ID3D10Blob **errors, + HRESULT *hresult) +{ + FIXME("filename %s, defines %p, include %p, profile %s, hlslflags %#x, fxflags %#x, " + "device %p, effectpool %p, pump %p, effect %p, errors %p, hresult %p\n", + debugstr_w(filename), defines, include, debugstr_a(profile), hlslflags, fxflags, device, + effectpool, pump, effect, errors, hresult); + + return E_NOTIMPL; +} From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Alistair Leslie-Hughes : d3dx10_43: Added D3DX10CreateEffectFromMemory stub. Message-ID: Module: wine Branch: master Commit: 978b4f19c7fb79ee83b1e1ead7bd36256fcb46ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=978b4f19c7fb79ee83b1e1ead7bd36256fcb46ae Author: Alistair Leslie-Hughes Date: Wed Jul 22 14:20:34 2015 +1000 d3dx10_43: Added D3DX10CreateEffectFromMemory stub. --- dlls/d3dx10_43/d3dx10_43.spec | 2 +- dlls/d3dx10_43/d3dx10_43_main.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/dlls/d3dx10_43/d3dx10_43.spec b/dlls/d3dx10_43/d3dx10_43.spec index 5bc871b..ada1fa0 100644 --- a/dlls/d3dx10_43/d3dx10_43.spec +++ b/dlls/d3dx10_43/d3dx10_43.spec @@ -22,7 +22,7 @@ @ stub D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) @ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) -@ stub D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stub D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stub D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) @ stub D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) diff --git a/dlls/d3dx10_43/d3dx10_43_main.c b/dlls/d3dx10_43/d3dx10_43_main.c index 1b505fa..0e4c580 100644 --- a/dlls/d3dx10_43/d3dx10_43_main.c +++ b/dlls/d3dx10_43/d3dx10_43_main.c @@ -90,3 +90,16 @@ HRESULT WINAPI D3DX10CreateEffectFromFileW(const WCHAR *filename, const D3D10_SH return E_NOTIMPL; } + +HRESULT WINAPI D3DX10CreateEffectFromMemory(const void *data, SIZE_T datasize, const char *filename, + const D3D10_SHADER_MACRO *defines, ID3D10Include *include, const char *profile, UINT hlslflags, + UINT fxflags, ID3D10Device *device, ID3D10EffectPool *effectpool, ID3DX10ThreadPump *pump, + ID3D10Effect **effect, ID3D10Blob **errors, HRESULT *hresult) +{ + FIXME("data %p, datasize %lu, filename %s, defines %p, include %p, profile %s, hlslflags %#x, fxflags %#x, " + "device %p, effectpool %p, pump %p, effect %p, errors %p, hresult %p\n", + data, datasize, debugstr_a(filename), defines, include, debugstr_a(profile), hlslflags, fxflags, device, + effectpool, pump, effect, errors, hresult); + + return E_NOTIMPL; +} From julliard at wine.codeweavers.com Wed Sep 16 09:54:07 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Wed, 16 Sep 2015 09:54:07 -0500 Subject: Jens Reyer : loader: Fix German manpage description of WINELOADER. Message-ID: Module: wine Branch: master Commit: 8fdcc239ba784894eed0f5c08ec56441db783e5e URL: http://source.winehq.org/git/wine.git/?a=commit;h=8fdcc239ba784894eed0f5c08ec56441db783e5e Author: Jens Reyer Date: Wed Sep 16 03:56:49 2015 +0200 loader: Fix German manpage description of WINELOADER. --- loader/wine.de.UTF-8.man.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader/wine.de.UTF-8.man.in b/loader/wine.de.UTF-8.man.in index 1dd2d78..25dff94 100644 --- a/loader/wine.de.UTF-8.man.in +++ b/loader/wine.de.UTF-8.man.in @@ -97,7 +97,7 @@ Gibt den Ort der .B wine -Anwendung an, die genutzt wird, um Windows-Programme zu laden. Wenn diese Variable nicht gesetzt ist, wird versucht, -.B @bindir@/wineserver +.B @bindir@/wine zu laden. Wenn auch dies nicht funktioniert, wird in $PATH und anderen Orten nach wine gesucht. .TP From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Andrey Gusev : d3d8: TRACE fixes. Message-ID: Module: wine Branch: master Commit: f0c52fe0f53fc661b40a874a9cdbe0278311cbd6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f0c52fe0f53fc661b40a874a9cdbe0278311cbd6 Author: Andrey Gusev Date: Wed Sep 16 20:22:38 2015 +0300 d3d8: TRACE fixes. --- dlls/d3d8/surface.c | 2 +- dlls/d3d8/vertexdeclaration.c | 2 +- dlls/d3d8/volume.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c index 7779a56..a76d0ce 100644 --- a/dlls/d3d8/surface.c +++ b/dlls/d3d8/surface.c @@ -30,7 +30,7 @@ static inline struct d3d8_surface *impl_from_IDirect3DSurface8(IDirect3DSurface8 static HRESULT WINAPI d3d8_surface_QueryInterface(IDirect3DSurface8 *iface, REFIID riid, void **out) { - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), out); + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); if (IsEqualGUID(riid, &IID_IDirect3DSurface8) || IsEqualGUID(riid, &IID_IDirect3DResource8) diff --git a/dlls/d3d8/vertexdeclaration.c b/dlls/d3d8/vertexdeclaration.c index 968b76b..7900325 100644 --- a/dlls/d3d8/vertexdeclaration.c +++ b/dlls/d3d8/vertexdeclaration.c @@ -263,7 +263,7 @@ static UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3 WORD stream = 0; int offset = 0; - TRACE("d3d8_elements %p, wined3d_elements %p\n", d3d8_elements, wined3d_elements); + TRACE("d3d8_elements %p, d3d8_elements_size %p, wined3d_elements %p\n", d3d8_elements, d3d8_elements_size, wined3d_elements); /* 128 should be enough for anyone... */ *wined3d_elements = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 128 * sizeof(**wined3d_elements)); diff --git a/dlls/d3d8/volume.c b/dlls/d3d8/volume.c index d116b16..077ec72 100644 --- a/dlls/d3d8/volume.c +++ b/dlls/d3d8/volume.c @@ -30,7 +30,7 @@ static inline struct d3d8_volume *impl_from_IDirect3DVolume8(IDirect3DVolume8 *i static HRESULT WINAPI d3d8_volume_QueryInterface(IDirect3DVolume8 *iface, REFIID riid, void **out) { - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), out); + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); if (IsEqualGUID(riid, &IID_IDirect3DVolume8) || IsEqualGUID(riid, &IID_IUnknown)) From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Andrey Gusev : d3d9: TRACE fixes. Message-ID: Module: wine Branch: master Commit: 425160ce85ded396df218807b13c367801b4f395 URL: http://source.winehq.org/git/wine.git/?a=commit;h=425160ce85ded396df218807b13c367801b4f395 Author: Andrey Gusev Date: Wed Sep 16 20:23:29 2015 +0300 d3d9: TRACE fixes. --- dlls/d3d9/query.c | 2 +- dlls/d3d9/vertexdeclaration.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/d3d9/query.c b/dlls/d3d9/query.c index 42b476c..6b55aec 100644 --- a/dlls/d3d9/query.c +++ b/dlls/d3d9/query.c @@ -32,7 +32,7 @@ static inline struct d3d9_query *impl_from_IDirect3DQuery9(IDirect3DQuery9 *ifac static HRESULT WINAPI d3d9_query_QueryInterface(IDirect3DQuery9 *iface, REFIID riid, void **out) { - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), out); + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); if (IsEqualGUID(riid, &IID_IDirect3DQuery9) || IsEqualGUID(riid, &IID_IUnknown)) diff --git a/dlls/d3d9/vertexdeclaration.c b/dlls/d3d9/vertexdeclaration.c index cc7998d..914de24 100644 --- a/dlls/d3d9/vertexdeclaration.c +++ b/dlls/d3d9/vertexdeclaration.c @@ -326,7 +326,7 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elem UINT count = 1; UINT i; - TRACE("d3d9_elements %p, wined3d_elements %p\n", d3d9_elements, wined3d_elements); + TRACE("d3d9_elements %p, wined3d_elements %p, element_count %p\n", d3d9_elements, wined3d_elements, element_count); element = d3d9_elements; while (element++->Stream != 0xff && count++ < 128); From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Replace dxgi_cs with wined3d_mutex. Message-ID: Module: wine Branch: master Commit: 0eefb93535ae676953fdfb2b6a4034eec320b916 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0eefb93535ae676953fdfb2b6a4034eec320b916 Author: J?zef Kucia Date: Thu Sep 17 01:10:13 2015 +0200 dxgi: Replace dxgi_cs with wined3d_mutex. --- dlls/dxgi/adapter.c | 4 ++-- dlls/dxgi/device.c | 12 ++++++------ dlls/dxgi/dxgi_main.c | 30 ++++++++++-------------------- dlls/dxgi/dxgi_private.h | 2 -- dlls/dxgi/factory.c | 20 ++++++++++---------- dlls/dxgi/output.c | 10 +++++----- dlls/dxgi/swapchain.c | 16 ++++++++-------- dlls/dxgi/utils.c | 18 +++++++++--------- 8 files changed, 50 insertions(+), 62 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=0eefb93535ae676953fdfb2b6a4034eec320b916 From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Add locking around remaining wined3d calls. Message-ID: Module: wine Branch: master Commit: 2a1186db19f20e3bfc065905dc49fa87e480675c URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a1186db19f20e3bfc065905dc49fa87e480675c Author: J?zef Kucia Date: Thu Sep 17 01:10:14 2015 +0200 dxgi: Add locking around remaining wined3d calls. --- dlls/dxgi/device.c | 12 ++++++++++-- dlls/dxgi/factory.c | 2 ++ dlls/dxgi/surface.c | 2 ++ dlls/dxgi/swapchain.c | 18 +++++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index a6c4589..ae07bac 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -194,6 +194,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac surface_desc.depth = 1; surface_desc.size = 0; + wined3d_mutex_lock(); memset(surface, 0, surface_count * sizeof(*surface)); for (i = 0; i < surface_count; ++i) { @@ -218,11 +219,13 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac TRACE("Created IDXGISurface %p (%u/%u)\n", surface[i], i + 1, surface_count); } + wined3d_mutex_unlock(); IWineDXGIDeviceParent_Release(dxgi_device_parent); return S_OK; fail: + wined3d_mutex_unlock(); for (j = 0; j < i; ++j) { IDXGISurface_Release(surface[i]); @@ -364,6 +367,7 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l device->IWineDXGIDevice_iface.lpVtbl = &dxgi_device_vtbl; device->refcount = 1; + wined3d_mutex_lock(); wined3d_private_store_init(&device->private_store); layer_base = device + 1; @@ -373,6 +377,7 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l { WARN("Failed to create device, returning %#x.\n", hr); wined3d_private_store_cleanup(&device->private_store); + wined3d_mutex_unlock(); return hr; } @@ -382,6 +387,7 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l ERR("DXGI device should implement IWineD3DDeviceParent.\n"); IUnknown_Release(device->child_layer); wined3d_private_store_cleanup(&device->private_store); + wined3d_mutex_unlock(); return hr; } wined3d_device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent); @@ -397,18 +403,18 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l hr = E_FAIL; IUnknown_Release(device->child_layer); wined3d_private_store_cleanup(&device->private_store); + wined3d_mutex_unlock(); return hr; } - wined3d_mutex_lock(); hr = wined3d_device_create(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, NULL, 0, 4, wined3d_device_parent, &device->wined3d_device); - wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create a wined3d device, returning %#x.\n", hr); IUnknown_Release(device->child_layer); wined3d_private_store_cleanup(&device->private_store); + wined3d_mutex_unlock(); return hr; } @@ -422,8 +428,10 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l wined3d_device_decref(device->wined3d_device); IUnknown_Release(device->child_layer); wined3d_private_store_cleanup(&device->private_store); + wined3d_mutex_unlock(); return hr; } + wined3d_mutex_unlock(); device->factory = &dxgi_factory->IDXGIFactory1_iface; IDXGIFactory1_AddRef(device->factory); diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c index fb8b7ce..2e0d5ab 100644 --- a/dlls/dxgi/factory.c +++ b/dlls/dxgi/factory.c @@ -253,7 +253,9 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IDXGIFactory1 *ifa return hr; } + wined3d_mutex_lock(); *swapchain = wined3d_swapchain_get_parent(wined3d_swapchain); + wined3d_mutex_unlock(); return S_OK; } diff --git a/dlls/dxgi/surface.c b/dlls/dxgi/surface.c index 221a80d..4ce9130 100644 --- a/dlls/dxgi/surface.c +++ b/dlls/dxgi/surface.c @@ -168,7 +168,9 @@ static HRESULT STDMETHODCALLTYPE dxgi_surface_GetDesc(IDXGISurface *iface, DXGI_ TRACE("iface %p, desc %p.\n", iface, desc); + wined3d_mutex_lock(); wined3d_resource_get_desc(surface->wined3d_resource, &wined3d_desc); + wined3d_mutex_unlock(); desc->Width = wined3d_desc.width; desc->Height = wined3d_desc.height; desc->Format = dxgi_format_from_wined3dformat(wined3d_desc.format); diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 53d2b7f..f1495cb 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -59,7 +59,11 @@ static ULONG STDMETHODCALLTYPE dxgi_swapchain_AddRef(IDXGISwapChain *iface) TRACE("%p increasing refcount to %u\n", This, refcount); if (refcount == 1) + { + wined3d_mutex_lock(); wined3d_swapchain_incref(This->wined3d_swapchain); + wined3d_mutex_unlock(); + } return refcount; } @@ -72,7 +76,11 @@ static ULONG STDMETHODCALLTYPE dxgi_swapchain_Release(IDXGISwapChain *iface) TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) + { + wined3d_mutex_lock(); wined3d_swapchain_decref(This->wined3d_swapchain); + wined3d_mutex_unlock(); + } return refcount; } @@ -130,13 +138,18 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDevice(IDXGISwapChain *iface, static HRESULT STDMETHODCALLTYPE dxgi_swapchain_Present(IDXGISwapChain *iface, UINT sync_interval, UINT flags) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); + HRESULT hr; TRACE("iface %p, sync_interval %u, flags %#x\n", iface, sync_interval, flags); if (sync_interval) FIXME("Unimplemented sync interval %u\n", sync_interval); if (flags) FIXME("Unimplemented flags %#x\n", flags); - return wined3d_swapchain_present(This->wined3d_swapchain, NULL, NULL, NULL, NULL, 0); + wined3d_mutex_lock(); + hr = wined3d_swapchain_present(This->wined3d_swapchain, NULL, NULL, NULL, NULL, 0); + wined3d_mutex_unlock(); + + return hr; } static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, @@ -327,6 +340,7 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device swapchain->IDXGISwapChain_iface.lpVtbl = &dxgi_swapchain_vtbl; swapchain->refcount = 1; + wined3d_mutex_lock(); wined3d_private_store_init(&swapchain->private_store); if (FAILED(hr = wined3d_swapchain_create(device->wined3d_device, desc, swapchain, @@ -334,8 +348,10 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device { WARN("Failed to create wined3d swapchain, hr %#x.\n", hr); wined3d_private_store_cleanup(&swapchain->private_store); + wined3d_mutex_unlock(); return hr; } + wined3d_mutex_unlock(); return S_OK; } From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Austin English : dxgi: Upgrade Direct3D 10 WARN to a FIXME. Message-ID: Module: wine Branch: master Commit: 4114e048150ce22349ccdda2e3787822f43496cb URL: http://source.winehq.org/git/wine.git/?a=commit;h=4114e048150ce22349ccdda2e3787822f43496cb Author: Austin English Date: Wed Sep 16 21:25:59 2015 -0500 dxgi: Upgrade Direct3D 10 WARN to a FIXME. --- dlls/dxgi/device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index ae07bac..ecb9d91 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -23,6 +23,7 @@ #include "dxgi_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dxgi); +WINE_DECLARE_DEBUG_CHANNEL(winediag); static inline struct dxgi_device *impl_from_IWineDXGIDevice(IWineDXGIDevice *iface) { @@ -398,7 +399,7 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l hr = wined3d_get_device_caps(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, &caps); if (FAILED(hr) || caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4) { - WARN("Direct3D 10 is not supported on this GPU with the current shader backend.\n"); + FIXME_(winediag)("Direct3D 10 is not supported on this GPU with the current shader backend.\n"); if (SUCCEEDED(hr)) hr = E_FAIL; IUnknown_Release(device->child_layer); From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Bruno Jesus : mciavi32: Make a debug message more clear. Message-ID: Module: wine Branch: master Commit: 1862c38f7d8699553470b37b3c4c7c8160626ea0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1862c38f7d8699553470b37b3c4c7c8160626ea0 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Thu Sep 17 15:58:23 2015 +0800 mciavi32: Make a debug message more clear. --- dlls/mciavi32/mmoutput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/mciavi32/mmoutput.c b/dlls/mciavi32/mmoutput.c index 5d4e092..3f3bc53 100644 --- a/dlls/mciavi32/mmoutput.c +++ b/dlls/mciavi32/mmoutput.c @@ -398,8 +398,8 @@ BOOL MCIAVI_GetInfo(WINE_MCIAVI* wma) mmioAscend(wma->hFile, &mmckInfo, 0); } if (alb.numVideoFrames != wma->dwPlayableVideoFrames) { - WARN("Found %d video frames (/%d), reducing playable frames\n", - alb.numVideoFrames, wma->dwPlayableVideoFrames); + WARN("AVI header says %d frames, we found %d video frames, reducing playable frames\n", + wma->dwPlayableVideoFrames, alb.numVideoFrames); wma->dwPlayableVideoFrames = alb.numVideoFrames; } wma->dwPlayableAudioBlocks = alb.numAudioBlocks; From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Bruno Jesus : mciavi32: Start playing from frame 0 instead of 1. Message-ID: Module: wine Branch: master Commit: ab4460a382d002342e7a2e9f1432e53321e1ccf7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab4460a382d002342e7a2e9f1432e53321e1ccf7 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Thu Sep 17 15:58:39 2015 +0800 mciavi32: Start playing from frame 0 instead of 1. --- dlls/mciavi32/mciavi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/mciavi32/mciavi.c b/dlls/mciavi32/mciavi.c index b1c89f0..843fe2c 100644 --- a/dlls/mciavi32/mciavi.c +++ b/dlls/mciavi32/mciavi.c @@ -393,8 +393,8 @@ static DWORD MCIAVI_player(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_PLAY_PARMS lpP { while(next_frame_us <= tc && wma->dwCurrVideoFrame < wma->dwToVideoFrame){ double dur; - ++wma->dwCurrVideoFrame; dur = MCIAVI_PaintFrame(wma, hDC); + ++wma->dwCurrVideoFrame; if(!dur) break; next_frame_us += dur; From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Bruno Jesus : mciavi32: Detect Indeo video frames as valid frames. Message-ID: Module: wine Branch: master Commit: c5e281d0d26b6095968e6c17b20f7369e22df6b0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5e281d0d26b6095968e6c17b20f7369e22df6b0 Author: Bruno Jesus <00cpxxx at gmail.com> Date: Thu Sep 17 15:59:49 2015 +0800 mciavi32: Detect Indeo video frames as valid frames. --- dlls/mciavi32/mmoutput.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dlls/mciavi32/mmoutput.c b/dlls/mciavi32/mmoutput.c index 3f3bc53..d3badb6 100644 --- a/dlls/mciavi32/mmoutput.c +++ b/dlls/mciavi32/mmoutput.c @@ -190,8 +190,11 @@ static BOOL MCIAVI_AddFrame(WINE_MCIAVI* wma, LPMMCKINFO mmck, */ twocc = TWOCCFromFOURCC(mmck->ckid); if (twocc == TWOCCFromFOURCC(wma->inbih->biCompression)) - twocc = cktypeDIBcompressed; - + twocc = cktypeDIBcompressed; + /* Also detect some chunks that seem to be used by Indeo videos where the chunk is named + * after the codec. */ + else if (twocc == LOWORD(wma->ash_video.fccHandler)) + twocc = cktypeDIBcompressed; switch (twocc) { case cktypeDIBbits: case cktypeDIBcompressed: From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Ken Thomases : dbghelp: On Mac, get the wineloader path from the target or our own process before resorting to guessing. Message-ID: Module: wine Branch: master Commit: f458cd844a59ee98c09712be7590e0331459e080 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f458cd844a59ee98c09712be7590e0331459e080 Author: Ken Thomases Date: Thu Sep 17 21:26:36 2015 -0500 dbghelp: On Mac, get the wineloader path from the target or our own process before resorting to guessing. This makes backtraces more reliably complete when WINELOADER isn't set and the loader isn't in a typical location. --- dlls/dbghelp/macho_module.c | 159 ++++++++++++++++++++++++++++++-------------- 1 file changed, 110 insertions(+), 49 deletions(-) diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c index 8d7091d..205c0c0 100644 --- a/dlls/dbghelp/macho_module.c +++ b/dlls/dbghelp/macho_module.c @@ -58,6 +58,7 @@ #include #include #include +#include #ifdef HAVE_MACH_O_DYLD_IMAGES_H #include @@ -1301,6 +1302,57 @@ static void macho_module_remove(struct process* pcs, struct module_format* modfm HeapFree(GetProcessHeap(), 0, modfmt); } + +/****************************************************************** + * get_dyld_image_info_address + */ +static ULONG_PTR get_dyld_image_info_address(struct process* pcs) +{ + NTSTATUS status; + PROCESS_BASIC_INFORMATION pbi; + ULONG_PTR dyld_image_info_address = 0; + + /* Get address of PEB */ + status = NtQueryInformationProcess(pcs->handle, ProcessBasicInformation, &pbi, sizeof(pbi), NULL); + if (status == STATUS_SUCCESS) + { + /* Read dyld image info address from PEB */ + if (ReadProcessMemory(pcs->handle, &pbi.PebBaseAddress->Reserved[0], + &dyld_image_info_address, sizeof(dyld_image_info_address), NULL)) + { + TRACE("got dyld_image_info_address 0x%08lx from PEB %p MacDyldImageInfo %p\n", + (unsigned long)dyld_image_info_address, pbi.PebBaseAddress, &pbi.PebBaseAddress->Reserved); + } + } + +#ifndef __LP64__ /* No reading the symtab with nlist(3) in LP64 */ + if (!dyld_image_info_address) + { + static void* dyld_all_image_infos_addr; + + /* Our next best guess is that dyld was loaded at its base address + and we can find the dyld image infos address by looking up its symbol. */ + if (!dyld_all_image_infos_addr) + { + struct nlist nl[2]; + memset(nl, 0, sizeof(nl)); + nl[0].n_un.n_name = (char*)"_dyld_all_image_infos"; + if (!nlist("/usr/lib/dyld", nl)) + dyld_all_image_infos_addr = (void*)nl[0].n_value; + } + + if (dyld_all_image_infos_addr) + { + TRACE("got dyld_image_info_address %p from /usr/lib/dyld symbol table\n", + dyld_all_image_infos_addr); + dyld_image_info_address = (ULONG_PTR)dyld_all_image_infos_addr; + } + } +#endif + + return dyld_image_info_address; +} + /****************************************************************** * macho_load_file * @@ -1328,54 +1380,8 @@ static BOOL macho_load_file(struct process* pcs, const WCHAR* filename, */ if (macho_info->flags & MACHO_INFO_DEBUG_HEADER) { - PROCESS_BASIC_INFORMATION pbi; - NTSTATUS status; - - ret = FALSE; - - /* Get address of PEB */ - status = NtQueryInformationProcess(pcs->handle, ProcessBasicInformation, - &pbi, sizeof(pbi), NULL); - if (status == STATUS_SUCCESS) - { - ULONG_PTR dyld_image_info; - - /* Read dyld image info address from PEB */ - if (ReadProcessMemory(pcs->handle, &pbi.PebBaseAddress->Reserved[0], - &dyld_image_info, sizeof(dyld_image_info), NULL)) - { - TRACE("got dyld_image_info 0x%08lx from PEB %p MacDyldImageInfo %p\n", - (unsigned long)dyld_image_info, pbi.PebBaseAddress, &pbi.PebBaseAddress->Reserved); - macho_info->dbg_hdr_addr = dyld_image_info; - ret = TRUE; - } - } - -#ifndef __LP64__ /* No reading the symtab with nlist(3) in LP64 */ - if (!ret) - { - static void* dyld_all_image_infos_addr; - - /* Our next best guess is that dyld was loaded at its base address - and we can find the dyld image infos address by looking up its symbol. */ - if (!dyld_all_image_infos_addr) - { - struct nlist nl[2]; - memset(nl, 0, sizeof(nl)); - nl[0].n_un.n_name = (char*)"_dyld_all_image_infos"; - if (!nlist("/usr/lib/dyld", nl)) - dyld_all_image_infos_addr = (void*)nl[0].n_value; - } - - if (dyld_all_image_infos_addr) - { - TRACE("got dyld_image_info %p from /usr/lib/dyld symbol table\n", - dyld_all_image_infos_addr); - macho_info->dbg_hdr_addr = (unsigned long)dyld_all_image_infos_addr; - ret = TRUE; - } - } -#endif + macho_info->dbg_hdr_addr = (unsigned long)get_dyld_image_info_address(pcs); + ret = TRUE; } if (macho_info->flags & MACHO_INFO_MODULE) @@ -1695,7 +1701,62 @@ BOOL macho_synchronize_module_list(struct process* pcs) */ static BOOL macho_search_loader(struct process* pcs, struct macho_info* macho_info) { - return macho_search_and_load_file(pcs, get_wine_loader_name(), 0, macho_info); + BOOL ret = FALSE; + ULONG_PTR dyld_image_info_address; + struct dyld_all_image_infos image_infos; + struct dyld_image_info image_info; + uint32_t len; + char path[PATH_MAX]; + BOOL got_path = FALSE; + + dyld_image_info_address = get_dyld_image_info_address(pcs); + if (dyld_image_info_address && + ReadProcessMemory(pcs->handle, (void*)dyld_image_info_address, &image_infos, sizeof(image_infos), NULL) && + image_infos.infoArray && image_infos.infoArrayCount && + ReadProcessMemory(pcs->handle, image_infos.infoArray, &image_info, sizeof(image_info), NULL) && + image_info.imageFilePath) + { + for (len = sizeof(path); len > 0; len /= 2) + { + if (ReadProcessMemory(pcs->handle, image_info.imageFilePath, path, len, NULL)) + { + path[len - 1] = 0; + got_path = TRUE; + TRACE("got executable path from target's dyld image info: %s\n", debugstr_a(path)); + break; + } + } + } + + /* If we couldn't get the executable path from the target process, try our + own. It will almost always be the same. */ + if (!got_path) + { + len = sizeof(path); + if (!_NSGetExecutablePath(path, &len)) + { + got_path = TRUE; + TRACE("using own executable path: %s\n", debugstr_a(path)); + } + } + + if (got_path) + { + WCHAR* pathW; + + len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0); + pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (pathW) + { + MultiByteToWideChar(CP_UNIXCP, 0, path, -1, pathW, len); + ret = macho_load_file(pcs, pathW, 0, macho_info); + HeapFree(GetProcessHeap(), 0, pathW); + } + } + + if (!ret) + ret = macho_search_and_load_file(pcs, get_wine_loader_name(), 0, macho_info); + return ret; } /****************************************************************** From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Ken Thomases : dbghelp: Fix a comment to reflect what the code' s actually doing. Message-ID: Module: wine Branch: master Commit: 8d6b34940933aa6551f50e7e218b400e86a27aea URL: http://source.winehq.org/git/wine.git/?a=commit;h=8d6b34940933aa6551f50e7e218b400e86a27aea Author: Ken Thomases Date: Thu Sep 17 21:26:37 2015 -0500 dbghelp: Fix a comment to reflect what the code's actually doing. --- dlls/dbghelp/macho_module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c index 205c0c0..1352870 100644 --- a/dlls/dbghelp/macho_module.c +++ b/dlls/dbghelp/macho_module.c @@ -1551,7 +1551,7 @@ static BOOL macho_search_and_load_file(struct process* pcs, const WCHAR* filenam if (strstrW(filename, S_libstdcPPW)) return FALSE; /* We know we can't do it */ - /* If has no directories, try LD_LIBRARY_PATH first. */ + /* If has no directories, try PATH first. */ if (!strchrW(filename, '/')) { ret = macho_load_file_from_path(pcs, filename, load_addr, From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: Ken Thomases : dbghelp: Provide a default value for DYLD_FALLBACK_LIBRARY_PATH, which is closer to how dyld behaves. Message-ID: Module: wine Branch: master Commit: d5739561d8b45fa5cc72e05b7786e581b80be668 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d5739561d8b45fa5cc72e05b7786e581b80be668 Author: Ken Thomases Date: Thu Sep 17 21:26:38 2015 -0500 dbghelp: Provide a default value for DYLD_FALLBACK_LIBRARY_PATH, which is closer to how dyld behaves. --- dlls/dbghelp/macho_module.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c index 1352870..1f5d446 100644 --- a/dlls/dbghelp/macho_module.c +++ b/dlls/dbghelp/macho_module.c @@ -1571,8 +1571,10 @@ static BOOL macho_search_and_load_file(struct process* pcs, const WCHAR* filenam /* Try DYLD_FALLBACK_LIBRARY_PATH, with just the filename (no directories). */ if (!ret) { - ret = macho_load_file_from_path(pcs, p, load_addr, - getenv("DYLD_FALLBACK_LIBRARY_PATH"), macho_info); + const char* fallback = getenv("DYLD_FALLBACK_LIBRARY_PATH"); + if (!fallback) + fallback = "/usr/local/lib:/lib:/usr/lib"; + ret = macho_load_file_from_path(pcs, p, load_addr, fallback, macho_info); } if (!ret && !strchrW(filename, '/')) ret = macho_load_file_from_dll_path(pcs, filename, load_addr, macho_info); From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Add stub of class strstreambuf. Message-ID: Module: wine Branch: master Commit: 37de5343526320e04dba9117547ed254986b1922 URL: http://source.winehq.org/git/wine.git/?a=commit;h=37de5343526320e04dba9117547ed254986b1922 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:46 2015 +0200 msvcirt: Add stub of class strstreambuf. --- dlls/msvcirt/msvcirt.c | 214 ++++++++++++++++++++++++++++++++++++++++---- dlls/msvcirt/msvcirt.h | 2 + dlls/msvcirt/msvcirt.spec | 70 +++++++-------- dlls/msvcrt20/msvcrt20.spec | 62 ++++++------- dlls/msvcrt40/msvcrt40.spec | 62 ++++++------- 5 files changed, 298 insertions(+), 112 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=37de5343526320e04dba9117547ed254986b1922 From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf constructors and destructor. Message-ID: Module: wine Branch: master Commit: aa4e2740b7c16b016b88fe477519cae8566b7f70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=aa4e2740b7c16b016b88fe477519cae8566b7f70 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:47 2015 +0200 msvcirt: Implement strstreambuf constructors and destructor. --- dlls/msvcirt/msvcirt.c | 58 +++++++++++++--- dlls/msvcirt/tests/msvcirt.c | 156 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+), 9 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=aa4e2740b7c16b016b88fe477519cae8566b7f70 From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: freeze. Message-ID: Module: wine Branch: master Commit: a8b26a96b4d6d57052515d149f9ea35952af1737 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8b26a96b4d6d57052515d149f9ea35952af1737 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:48 2015 +0200 msvcirt: Implement strstreambuf::freeze. --- dlls/msvcirt/msvcirt.c | 4 +++- dlls/msvcirt/tests/msvcirt.c | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index b50745c..4d0f4f6 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1289,7 +1289,9 @@ int __thiscall strstreambuf_doallocate(strstreambuf *this) DEFINE_THISCALL_WRAPPER(strstreambuf_freeze, 8) void __thiscall strstreambuf_freeze(strstreambuf *this, int frozen) { - FIXME("(%p %d) stub\n", this, frozen); + TRACE("(%p %d)\n", this, frozen); + if (!this->constant) + this->dynamic = !frozen; } /* ?overflow at strstreambuf@@UAEHH at Z */ diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c index 932e6fb..aaa9f1c 100644 --- a/dlls/msvcirt/tests/msvcirt.c +++ b/dlls/msvcirt/tests/msvcirt.c @@ -193,6 +193,7 @@ static strstreambuf* (*__thiscall p_strstreambuf_buffer_ctor)(strstreambuf*, cha static strstreambuf* (*__thiscall p_strstreambuf_ubuffer_ctor)(strstreambuf*, unsigned char*, int, unsigned char*); static strstreambuf* (*__thiscall p_strstreambuf_ctor)(strstreambuf*); static void (*__thiscall p_strstreambuf_dtor)(strstreambuf*); +static void (*__thiscall p_strstreambuf_freeze)(strstreambuf*, int); /* ios */ static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*); @@ -345,6 +346,7 @@ static BOOL init(void) SET(p_strstreambuf_ubuffer_ctor, "??0strstreambuf@@QEAA at PEAEH0@Z"); SET(p_strstreambuf_ctor, "??0strstreambuf@@QEAA at XZ"); SET(p_strstreambuf_dtor, "??1strstreambuf@@UEAA at XZ"); + SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QEAAXH at Z"); SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z"); SET(p_ios_ctor, "??0ios@@IEAA at XZ"); @@ -417,6 +419,7 @@ static BOOL init(void) SET(p_strstreambuf_ubuffer_ctor, "??0strstreambuf@@QAE at PAEH0@Z"); SET(p_strstreambuf_ctor, "??0strstreambuf@@QAE at XZ"); SET(p_strstreambuf_dtor, "??1strstreambuf@@UAE at XZ"); + SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QAEXH at Z"); SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z"); SET(p_ios_ctor, "??0ios@@IAE at XZ"); @@ -1518,7 +1521,6 @@ static void test_strstreambuf(void) "wrong put end, expected %p + 0x7fffffff or -1, got %p\n", buffer, ssb1.base.epptr); ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic); ok(ssb1.constant == 1, "expected 1, got %d\n", ssb1.constant); - call_func1(p_strstreambuf_dtor, &ssb1); call_func1(p_strstreambuf_ctor, &ssb2); ok(ssb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", ssb2.base.allocated); ok(ssb2.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ssb2.base.unbuffered); @@ -1527,6 +1529,22 @@ static void test_strstreambuf(void) ok(ssb2.constant == 0, "expected 0, got %d\n", ssb2.constant); ok(ssb2.f_alloc == NULL, "expected %p, got %p\n", NULL, ssb2.f_alloc); ok(ssb2.f_free == NULL, "expected %p, got %p\n", NULL, ssb2.f_free); + + /* freeze */ + call_func2(p_strstreambuf_freeze, &ssb1, 0); + ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic); + ssb1.constant = 0; + call_func2(p_strstreambuf_freeze, &ssb1, 0); + ok(ssb1.dynamic == 1, "expected 1, got %d\n", ssb1.dynamic); + call_func2(p_strstreambuf_freeze, &ssb1, 3); + ok(ssb1.dynamic == 0, "expected 0, got %d\n", ssb1.dynamic); + ssb1.constant = 1; + call_func2(p_strstreambuf_freeze, &ssb2, 5); + ok(ssb2.dynamic == 0, "expected 0, got %d\n", ssb2.dynamic); + call_func2(p_strstreambuf_freeze, &ssb2, 0); + ok(ssb2.dynamic == 1, "expected 1, got %d\n", ssb2.dynamic); + + call_func1(p_strstreambuf_dtor, &ssb1); call_func1(p_strstreambuf_dtor, &ssb2); } From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: str. Message-ID: Module: wine Branch: master Commit: 222cd629a384c84bbf7824f3ee828bb3523d5198 URL: http://source.winehq.org/git/wine.git/?a=commit;h=222cd629a384c84bbf7824f3ee828bb3523d5198 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:49 2015 +0200 msvcirt: Implement strstreambuf::str. --- dlls/msvcirt/msvcirt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index 4d0f4f6..4b826db 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1326,8 +1326,9 @@ streambuf* __thiscall strstreambuf_setbuf(strstreambuf *this, char *buffer, int DEFINE_THISCALL_WRAPPER(strstreambuf_str, 4) char* __thiscall strstreambuf_str(strstreambuf *this) { - FIXME("(%p) stub\n", this); - return NULL; + TRACE("(%p)\n", this); + strstreambuf_freeze(this, 1); + return this->base.base; } /* ?sync at strstreambuf@@UAEHXZ */ From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: doallocate. Message-ID: Module: wine Branch: master Commit: 0257ebc838395dd9934e4ab682483eba72963c5e URL: http://source.winehq.org/git/wine.git/?a=commit;h=0257ebc838395dd9934e4ab682483eba72963c5e Author: Iv?n Matellanes Date: Thu Sep 17 11:06:50 2015 +0200 msvcirt: Implement strstreambuf::doallocate. --- dlls/msvcirt/msvcirt.c | 37 +++++++++++++++++++++++++++++++++++-- dlls/msvcirt/tests/msvcirt.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index 4b826db..d2c39eb 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1280,8 +1280,41 @@ strstreambuf* __thiscall strstreambuf_scalar_dtor(strstreambuf *this, unsigned i DEFINE_THISCALL_WRAPPER(strstreambuf_doallocate, 4) int __thiscall strstreambuf_doallocate(strstreambuf *this) { - FIXME("(%p) stub\n", this); - return EOF; + char *prev_buffer = this->base.base, *new_buffer; + LONG prev_size = this->base.ebuf - this->base.base, new_size; + + TRACE("(%p)\n", this); + + /* calculate the size of the new buffer */ + new_size = (prev_size > 0 ? prev_size : 0) + (this->increase > 0 ? this->increase : 1); + /* get a new buffer */ + if (this->f_alloc) + new_buffer = this->f_alloc(new_size); + else + new_buffer = MSVCRT_operator_new(new_size); + if (!new_buffer) + return EOF; + if (this->base.ebuf) { + /* copy the contents and adjust the pointers */ + memcpy(new_buffer, this->base.base, prev_size); + if (this->base.egptr) { + this->base.eback += new_buffer - prev_buffer; + this->base.gptr += new_buffer - prev_buffer; + this->base.egptr += new_buffer - prev_buffer; + } + if (this->base.epptr) { + this->base.pbase += new_buffer - prev_buffer; + this->base.pptr += new_buffer - prev_buffer; + this->base.epptr += new_buffer - prev_buffer; + } + /* free the old buffer */ + if (this->f_free) + this->f_free(this->base.base); + else + MSVCRT_operator_delete(this->base.base); + } + streambuf_setb(&this->base, new_buffer, new_buffer + new_size, 0); + return 1; } /* ?freeze at strstreambuf@@QAEXH at Z */ diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c index aaa9f1c..c7398d6 100644 --- a/dlls/msvcirt/tests/msvcirt.c +++ b/dlls/msvcirt/tests/msvcirt.c @@ -193,6 +193,7 @@ static strstreambuf* (*__thiscall p_strstreambuf_buffer_ctor)(strstreambuf*, cha static strstreambuf* (*__thiscall p_strstreambuf_ubuffer_ctor)(strstreambuf*, unsigned char*, int, unsigned char*); static strstreambuf* (*__thiscall p_strstreambuf_ctor)(strstreambuf*); static void (*__thiscall p_strstreambuf_dtor)(strstreambuf*); +static int (*__thiscall p_strstreambuf_doallocate)(strstreambuf*); static void (*__thiscall p_strstreambuf_freeze)(strstreambuf*, int); /* ios */ @@ -346,6 +347,7 @@ static BOOL init(void) SET(p_strstreambuf_ubuffer_ctor, "??0strstreambuf@@QEAA at PEAEH0@Z"); SET(p_strstreambuf_ctor, "??0strstreambuf@@QEAA at XZ"); SET(p_strstreambuf_dtor, "??1strstreambuf@@UEAA at XZ"); + SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MEAAHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QEAAXH at Z"); SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z"); @@ -419,6 +421,7 @@ static BOOL init(void) SET(p_strstreambuf_ubuffer_ctor, "??0strstreambuf@@QAE at PAEH0@Z"); SET(p_strstreambuf_ctor, "??0strstreambuf@@QAE at XZ"); SET(p_strstreambuf_dtor, "??1strstreambuf@@UAE at XZ"); + SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MAEHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QAEXH at Z"); SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z"); @@ -1420,6 +1423,7 @@ static void test_strstreambuf(void) { strstreambuf ssb1, ssb2; char buffer[64]; + int ret; memset(&ssb1, 0xab, sizeof(strstreambuf)); memset(&ssb2, 0xab, sizeof(strstreambuf)); @@ -1544,6 +1548,35 @@ static void test_strstreambuf(void) call_func2(p_strstreambuf_freeze, &ssb2, 0); ok(ssb2.dynamic == 1, "expected 1, got %d\n", ssb2.dynamic); + /* doallocate */ + ssb2.dynamic = 0; + ssb2.increase = 5; + ret = (int) call_func1(p_strstreambuf_doallocate, &ssb2); + ok(ret == 1, "return value %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 5, "expected %p, got %p\n", ssb2.base.base + 5, ssb2.base.ebuf); + ssb2.base.eback = ssb2.base.base; + ssb2.base.gptr = ssb2.base.base + 2; + ssb2.base.egptr = ssb2.base.base + 4; + strcpy(ssb2.base.base, "Check"); + ret = (int) call_func1(p_strstreambuf_doallocate, &ssb2); + ok(ret == 1, "return value %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 10, "expected %p, got %p\n", ssb2.base.base + 10, ssb2.base.ebuf); + ok(ssb2.base.eback == ssb2.base.base, "wrong get base, expected %p got %p\n", ssb2.base.base, ssb2.base.eback); + ok(ssb2.base.gptr == ssb2.base.base + 2, "wrong get pointer, expected %p got %p\n", ssb2.base.base + 2, ssb2.base.gptr); + ok(ssb2.base.egptr == ssb2.base.base + 4, "wrong get end, expected %p got %p\n", ssb2.base.base + 4, ssb2.base.egptr); + ok(!strncmp(ssb2.base.base, "Check", 5), "strings are not equal\n"); + ssb2.base.pbase = ssb2.base.pptr = ssb2.base.base + 4; + ssb2.base.epptr = ssb2.base.ebuf; + ssb2.increase = -3; + ret = (int) call_func1(p_strstreambuf_doallocate, &ssb2); + ok(ret == 1, "return value %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 11, "expected %p, got %p\n", ssb2.base.base + 11, ssb2.base.ebuf); + ok(ssb2.base.pbase == ssb2.base.base + 4, "wrong put base, expected %p got %p\n", ssb2.base.base + 4, ssb2.base.pbase); + ok(ssb2.base.pptr == ssb2.base.base + 4, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 4, ssb2.base.pptr); + ok(ssb2.base.epptr == ssb2.base.base + 10, "wrong put end, expected %p got %p\n", ssb2.base.base + 10, ssb2.base.epptr); + ok(!strncmp(ssb2.base.base, "Check", 5), "strings are not equal\n"); + ssb2.dynamic = 1; + call_func1(p_strstreambuf_dtor, &ssb1); call_func1(p_strstreambuf_dtor, &ssb2); } From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: setbuf. Message-ID: Module: wine Branch: master Commit: 675ad97a69bac725fb92b362a6d79c4fb1ae7679 URL: http://source.winehq.org/git/wine.git/?a=commit;h=675ad97a69bac725fb92b362a6d79c4fb1ae7679 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:51 2015 +0200 msvcirt: Implement strstreambuf::setbuf. --- dlls/msvcirt/msvcirt.c | 6 ++++-- dlls/msvcirt/tests/msvcirt.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index d2c39eb..0ea4030 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1350,8 +1350,10 @@ streampos __thiscall strstreambuf_seekoff(strstreambuf *this, streamoff offset, DEFINE_THISCALL_WRAPPER(strstreambuf_setbuf, 12) streambuf* __thiscall strstreambuf_setbuf(strstreambuf *this, char *buffer, int length) { - FIXME("(%p %p %d) stub\n", this, buffer, length); - return NULL; + TRACE("(%p %p %d)\n", this, buffer, length); + if (length) + this->increase = length; + return &this->base; } /* ?str at strstreambuf@@QAEPADXZ */ diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c index c7398d6..978665f 100644 --- a/dlls/msvcirt/tests/msvcirt.c +++ b/dlls/msvcirt/tests/msvcirt.c @@ -195,6 +195,7 @@ static strstreambuf* (*__thiscall p_strstreambuf_ctor)(strstreambuf*); static void (*__thiscall p_strstreambuf_dtor)(strstreambuf*); static int (*__thiscall p_strstreambuf_doallocate)(strstreambuf*); static void (*__thiscall p_strstreambuf_freeze)(strstreambuf*, int); +static streambuf* (*__thiscall p_strstreambuf_setbuf)(strstreambuf*, char*, int); /* ios */ static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*); @@ -349,6 +350,7 @@ static BOOL init(void) SET(p_strstreambuf_dtor, "??1strstreambuf@@UEAA at XZ"); SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MEAAHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QEAAXH at Z"); + SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z"); SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z"); SET(p_ios_ctor, "??0ios@@IEAA at XZ"); @@ -423,6 +425,7 @@ static BOOL init(void) SET(p_strstreambuf_dtor, "??1strstreambuf@@UAE at XZ"); SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MAEHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QAEXH at Z"); + SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z"); SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z"); SET(p_ios_ctor, "??0ios@@IAE at XZ"); @@ -1422,6 +1425,7 @@ static void test_filebuf(void) static void test_strstreambuf(void) { strstreambuf ssb1, ssb2; + streambuf *pret; char buffer[64]; int ret; @@ -1577,6 +1581,21 @@ static void test_strstreambuf(void) ok(!strncmp(ssb2.base.base, "Check", 5), "strings are not equal\n"); ssb2.dynamic = 1; + /* setbuf */ + pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb1, buffer + 16, 16); + ok(pret == &ssb1.base, "expected %p got %p\n", &ssb1.base, pret); + ok(ssb1.base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, ssb1.base.base); + ok(ssb1.increase == 16, "expected 16, got %d\n", ssb1.increase); + pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb2, NULL, 2); + ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret); + ok(ssb2.increase == 2, "expected 2, got %d\n", ssb2.increase); + pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb2, buffer, 0); + ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret); + ok(ssb2.increase == 2, "expected 2, got %d\n", ssb2.increase); + pret = (streambuf*) call_func3(p_strstreambuf_setbuf, &ssb2, NULL, -2); + ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret); + ok(ssb2.increase == -2, "expected -2, got %d\n", ssb2.increase); + call_func1(p_strstreambuf_dtor, &ssb1); call_func1(p_strstreambuf_dtor, &ssb2); } From julliard at wine.codeweavers.com Fri Sep 18 14:31:17 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:17 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: sync. Message-ID: Module: wine Branch: master Commit: ea953271deaeb558650ac349311cc13620f038a9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea953271deaeb558650ac349311cc13620f038a9 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:52 2015 +0200 msvcirt: Implement strstreambuf::sync. --- dlls/msvcirt/msvcirt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index 0ea4030..c6e67dc 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1371,8 +1371,8 @@ char* __thiscall strstreambuf_str(strstreambuf *this) DEFINE_THISCALL_WRAPPER(strstreambuf_sync, 4) int __thiscall strstreambuf_sync(strstreambuf *this) { - FIXME("(%p) stub\n", this); - return EOF; + TRACE("(%p)\n", this); + return 0; } /* ?underflow at strstreambuf@@UAEHXZ */ From julliard at wine.codeweavers.com Fri Sep 18 14:31:18 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:18 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: underflow. Message-ID: Module: wine Branch: master Commit: 2f70aba8d9dc729b6bfda7a9427bf896cc5894fd URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f70aba8d9dc729b6bfda7a9427bf896cc5894fd Author: Iv?n Matellanes Date: Thu Sep 17 11:06:53 2015 +0200 msvcirt: Implement strstreambuf::underflow. --- dlls/msvcirt/msvcirt.c | 9 +++++++-- dlls/msvcirt/tests/msvcirt.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index c6e67dc..a320879 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1380,8 +1380,13 @@ int __thiscall strstreambuf_sync(strstreambuf *this) DEFINE_THISCALL_WRAPPER(strstreambuf_underflow, 4) int __thiscall strstreambuf_underflow(strstreambuf *this) { - FIXME("(%p) stub\n", this); - return EOF; + TRACE("(%p)\n", this); + if (this->base.gptr < this->base.egptr) + return *this->base.gptr; + /* extend the get area to include the characters written */ + if (this->base.egptr < this->base.pptr) + this->base.egptr = this->base.pptr; + return (this->base.gptr < this->base.egptr) ? *this->base.gptr : EOF; } /* ??0ios@@IAE at ABV0@@Z */ diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c index 978665f..5e29e9a 100644 --- a/dlls/msvcirt/tests/msvcirt.c +++ b/dlls/msvcirt/tests/msvcirt.c @@ -196,6 +196,7 @@ static void (*__thiscall p_strstreambuf_dtor)(strstreambuf*); static int (*__thiscall p_strstreambuf_doallocate)(strstreambuf*); static void (*__thiscall p_strstreambuf_freeze)(strstreambuf*, int); static streambuf* (*__thiscall p_strstreambuf_setbuf)(strstreambuf*, char*, int); +static int (*__thiscall p_strstreambuf_underflow)(strstreambuf*); /* ios */ static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*); @@ -351,6 +352,7 @@ static BOOL init(void) SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MEAAHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QEAAXH at Z"); SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z"); + SET(p_strstreambuf_underflow, "?underflow at strstreambuf@@UEAAHXZ"); SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z"); SET(p_ios_ctor, "??0ios@@IEAA at XZ"); @@ -426,6 +428,7 @@ static BOOL init(void) SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MAEHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QAEXH at Z"); SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z"); + SET(p_strstreambuf_underflow, "?underflow at strstreambuf@@UAEHXZ"); SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z"); SET(p_ios_ctor, "??0ios@@IAE at XZ"); @@ -1596,6 +1599,31 @@ static void test_strstreambuf(void) ok(pret == &ssb2.base, "expected %p got %p\n", &ssb2.base, pret); ok(ssb2.increase == -2, "expected -2, got %d\n", ssb2.increase); + /* underflow */ + ssb1.base.epptr = ssb1.base.ebuf = ssb1.base.base + 64; + ret = (int) call_func1(p_strstreambuf_underflow, &ssb1); + ok(ret == 'T', "expected 'T' got %d\n", ret); + ssb1.base.gptr = ssb1.base.egptr; + ret = (int) call_func1(p_strstreambuf_underflow, &ssb1); + ok(ret == EOF, "expected EOF got %d\n", ret); + ret = (int) call_func3(p_streambuf_xsputn, &ssb1.base, "Gotta make you understand", 5); + ok(ret == 5, "expected 5 got %d\n", ret); + ok(ssb1.base.pptr == buffer + 25, "wrong put pointer, expected %p got %p\n", buffer + 25, ssb1.base.pptr); + ret = (int) call_func1(p_strstreambuf_underflow, &ssb1); + ok(ret == 'G', "expected 'G' got %d\n", ret); + ok(ssb1.base.egptr == buffer + 25, "wrong get end, expected %p got %p\n", buffer + 25, ssb1.base.egptr); + ssb1.base.gptr = ssb1.base.egptr = ssb1.base.pptr = ssb1.base.epptr; + ret = (int) call_func1(p_strstreambuf_underflow, &ssb1); + ok(ret == EOF, "expected EOF got %d\n", ret); + ssb2.base.eback = ssb2.base.gptr = ssb2.base.egptr = NULL; + ssb2.base.pbase = ssb2.base.pptr = ssb2.base.epptr = NULL; + ret = (int) call_func1(p_strstreambuf_underflow, &ssb2); + ok(ret == EOF, "expected EOF got %d\n", ret); + ssb2.base.eback = ssb2.base.base; + ssb2.base.gptr = ssb2.base.egptr = ssb2.base.ebuf; + ret = (int) call_func1(p_strstreambuf_underflow, &ssb2); + ok(ret == EOF, "expected EOF got %d\n", ret); + call_func1(p_strstreambuf_dtor, &ssb1); call_func1(p_strstreambuf_dtor, &ssb2); } From julliard at wine.codeweavers.com Fri Sep 18 14:31:18 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 18 Sep 2015 14:31:18 -0500 Subject: =?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement strstreambuf:: overflow. Message-ID: Module: wine Branch: master Commit: 60d1d6f5952e8b5d6fb0327a28c047058851fa70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=60d1d6f5952e8b5d6fb0327a28c047058851fa70 Author: Iv?n Matellanes Date: Thu Sep 17 11:06:54 2015 +0200 msvcirt: Implement strstreambuf::overflow. --- dlls/msvcirt/msvcirt.c | 14 +++++++-- dlls/msvcirt/tests/msvcirt.c | 68 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c index a320879..0a34ac0 100644 --- a/dlls/msvcirt/msvcirt.c +++ b/dlls/msvcirt/msvcirt.c @@ -1332,8 +1332,18 @@ void __thiscall strstreambuf_freeze(strstreambuf *this, int frozen) DEFINE_THISCALL_WRAPPER(strstreambuf_overflow, 8) int __thiscall strstreambuf_overflow(strstreambuf *this, int c) { - FIXME("(%p %d) stub\n", this, c); - return EOF; + TRACE("(%p %d)\n", this, c); + if (this->base.pptr >= this->base.epptr) { + /* increase the buffer size if it's dynamic */ + if (!this->dynamic || call_streambuf_doallocate(&this->base) == EOF) + return EOF; + if (!this->base.epptr) + this->base.pbase = this->base.pptr = this->base.egptr ? this->base.egptr : this->base.base; + this->base.epptr = this->base.ebuf; + } + if (c != EOF) + *this->base.pptr++ = c; + return 1; } /* ?seekoff at strstreambuf@@UAEJJW4seek_dir at ios@@H at Z */ diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c index 5e29e9a..9bf93af 100644 --- a/dlls/msvcirt/tests/msvcirt.c +++ b/dlls/msvcirt/tests/msvcirt.c @@ -195,6 +195,7 @@ static strstreambuf* (*__thiscall p_strstreambuf_ctor)(strstreambuf*); static void (*__thiscall p_strstreambuf_dtor)(strstreambuf*); static int (*__thiscall p_strstreambuf_doallocate)(strstreambuf*); static void (*__thiscall p_strstreambuf_freeze)(strstreambuf*, int); +static int (*__thiscall p_strstreambuf_overflow)(strstreambuf*, int); static streambuf* (*__thiscall p_strstreambuf_setbuf)(strstreambuf*, char*, int); static int (*__thiscall p_strstreambuf_underflow)(strstreambuf*); @@ -351,6 +352,7 @@ static BOOL init(void) SET(p_strstreambuf_dtor, "??1strstreambuf@@UEAA at XZ"); SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MEAAHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QEAAXH at Z"); + SET(p_strstreambuf_overflow, "?overflow at strstreambuf@@UEAAHH at Z"); SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z"); SET(p_strstreambuf_underflow, "?underflow at strstreambuf@@UEAAHXZ"); @@ -427,6 +429,7 @@ static BOOL init(void) SET(p_strstreambuf_dtor, "??1strstreambuf@@UAE at XZ"); SET(p_strstreambuf_doallocate, "?doallocate at strstreambuf@@MAEHXZ"); SET(p_strstreambuf_freeze, "?freeze at strstreambuf@@QAEXH at Z"); + SET(p_strstreambuf_overflow, "?overflow at strstreambuf@@UAEHH at Z"); SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z"); SET(p_strstreambuf_underflow, "?underflow at strstreambuf@@UAEHXZ"); @@ -1624,6 +1627,71 @@ static void test_strstreambuf(void) ret = (int) call_func1(p_strstreambuf_underflow, &ssb2); ok(ret == EOF, "expected EOF got %d\n", ret); + /* overflow */ + ssb1.base.pptr = ssb1.base.epptr - 1; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, EOF); + ok(ret == 1, "expected 1 got %d\n", ret); + ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, 'A'); + ok(ret == 1, "expected 1 got %d\n", ret); + ok(ssb1.base.pptr == ssb1.base.epptr, "wrong put pointer, expected %p got %p\n", ssb1.base.epptr, ssb1.base.pptr); + ok(*(ssb1.base.pptr - 1) == 'A', "expected 'A' got %d\n", *(ssb1.base.pptr - 1)); + ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, 'B'); + ok(ret == EOF, "expected EOF got %d\n", ret); + ret = (int) call_func2(p_strstreambuf_overflow, &ssb1, EOF); + ok(ret == EOF, "expected EOF got %d\n", ret); + ssb2.dynamic = 0; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'C'); + ok(ret == EOF, "expected EOF got %d\n", ret); + ssb2.dynamic = 1; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'C'); + ok(ret == 1, "expected 1 got %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 12, "expected %p got %p\n", ssb2.base.base + 12, ssb2.base.ebuf); + ok(ssb2.base.gptr == ssb2.base.base + 11, "wrong get pointer, expected %p got %p\n", ssb2.base.base + 11, ssb2.base.gptr); + ok(ssb2.base.pbase == ssb2.base.base + 11, "wrong put base, expected %p got %p\n", ssb2.base.base + 11, ssb2.base.pbase); + ok(ssb2.base.pptr == ssb2.base.base + 12, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 12, ssb2.base.pptr); + ok(ssb2.base.epptr == ssb2.base.base + 12, "wrong put end, expected %p got %p\n", ssb2.base.base + 12, ssb2.base.epptr); + ok(*(ssb2.base.pptr - 1) == 'C', "expected 'C' got %d\n", *(ssb2.base.pptr - 1)); + ssb2.increase = 4; + ssb2.base.eback = ssb2.base.gptr = ssb2.base.egptr = NULL; + ssb2.base.pbase = ssb2.base.pptr = ssb2.base.epptr = NULL; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'D'); + ok(ret == 1, "expected 1 got %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 16, "expected %p got %p\n", ssb2.base.base + 16, ssb2.base.ebuf); + ok(ssb2.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, ssb2.base.gptr); + ok(ssb2.base.pbase == ssb2.base.base, "wrong put base, expected %p got %p\n", ssb2.base.base, ssb2.base.pbase); + ok(ssb2.base.pptr == ssb2.base.base + 1, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 1, ssb2.base.pptr); + ok(ssb2.base.epptr == ssb2.base.base + 16, "wrong put end, expected %p got %p\n", ssb2.base.base + 16, ssb2.base.epptr); + ok(*(ssb2.base.pptr - 1) == 'D', "expected 'D' got %d\n", *(ssb2.base.pptr - 1)); + ssb2.base.pbase = ssb2.base.base + 3; + ssb2.base.pptr = ssb2.base.epptr + 5; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'E'); + ok(ret == 1, "expected 1 got %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 20, "expected %p got %p\n", ssb2.base.base + 20, ssb2.base.ebuf); + ok(ssb2.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, ssb2.base.gptr); + ok(ssb2.base.pbase == ssb2.base.base + 3, "wrong put base, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.pbase); + ok(ssb2.base.pptr == ssb2.base.base + 22, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 22, ssb2.base.pptr); + ok(ssb2.base.epptr == ssb2.base.base + 20, "wrong put end, expected %p got %p\n", ssb2.base.base + 20, ssb2.base.epptr); + ok(*(ssb2.base.pptr - 1) == 'E', "expected 'E' got %d\n", *(ssb2.base.pptr - 1)); + ssb2.base.egptr = ssb2.base.base + 2; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'F'); + ok(ret == 1, "expected 1 got %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 24, "expected %p got %p\n", ssb2.base.base + 24, ssb2.base.ebuf); + ok(ssb2.base.gptr != NULL, "wrong get pointer, expected != NULL\n"); + ok(ssb2.base.pbase == ssb2.base.base + 3, "wrong put base, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.pbase); + ok(ssb2.base.pptr == ssb2.base.base + 23, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 23, ssb2.base.pptr); + ok(ssb2.base.epptr == ssb2.base.base + 24, "wrong put end, expected %p got %p\n", ssb2.base.base + 24, ssb2.base.epptr); + ok(*(ssb2.base.pptr - 1) == 'F', "expected 'F' got %d\n", *(ssb2.base.pptr - 1)); + ssb2.base.eback = ssb2.base.gptr = ssb2.base.base; + ssb2.base.epptr = NULL; + ret = (int) call_func2(p_strstreambuf_overflow, &ssb2, 'G'); + ok(ret == 1, "expected 1 got %d\n", ret); + ok(ssb2.base.ebuf == ssb2.base.base + 28, "expected %p got %p\n", ssb2.base.base + 28, ssb2.base.ebuf); + ok(ssb2.base.gptr == ssb2.base.base, "wrong get pointer, expected %p got %p\n", ssb2.base.base, ssb2.base.gptr); + ok(ssb2.base.pbase == ssb2.base.base + 2, "wrong put base, expected %p got %p\n", ssb2.base.base + 2, ssb2.base.pbase); + ok(ssb2.base.pptr == ssb2.base.base + 3, "wrong put pointer, expected %p got %p\n", ssb2.base.base + 3, ssb2.base.pptr); + ok(ssb2.base.epptr == ssb2.base.base + 28, "wrong put end, expected %p got %p\n", ssb2.base.base + 28, ssb2.base.epptr); + ok(*(ssb2.base.pptr - 1) == 'G', "expected 'G' got %d\n", *(ssb2.base.pptr - 1)); + call_func1(p_strstreambuf_dtor, &ssb1); call_func1(p_strstreambuf_dtor, &ssb2); } From jnewman at wine.codeweavers.com Mon Sep 21 13:25:22 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Mon, 21 Sep 2015 13:25:22 -0500 Subject: Kyle Auble : Add up-to-date download page for Debian Message-ID: Module: website Branch: master Commit: ff9da5f0e0281e3def2b10ae1077fa67bc6c084a URL: http://source.winehq.org/git/website.git/?a=commit;h=ff9da5f0e0281e3def2b10ae1077fa67bc6c084a Author: Kyle Auble Date: Sun Sep 20 20:24:13 2015 -0600 Add up-to-date download page for Debian I incorporated all of Jens' suggestions, plus tweaked the language to sound better in a few places and gave the HTML more space to breathe. The 2nd patch in the series should still be fine without any changes. --- templates/en/download/debian.template | 162 ++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/templates/en/download/debian.template b/templates/en/download/debian.template new file mode 100644 index 0000000..00c611b --- /dev/null +++ b/templates/en/download/debian.template @@ -0,0 +1,162 @@ + + + + +

+ +Debian Logo +Wine on Debian + +Debian Logo +

+ +

+You can directly install software for Debian from .deb package +files, but using the APT package manager (or a front-end such as +Aptitude or Synaptic) to get software from the official Debian repos is +much safer and cleaner. Here are instructions and hints for installing +your preferred version of Wine, the Debian way.... +

+ + +

For 32-Bit Debian

+ +

+So long as your package system is configured correctly and +up-to-date, grabbing Wine should be simple, whether you use Debian +stable, testing, or unstable. On 32-bit +Debian, you can install a stable release of Wine with a single +apt-get command: +

+ +
sudo apt-get install wine
+ +

+Starting with Debian Jessie (release 8.0), there is also a package of +Wine's development release that can be installed alongside the stable +release: +

+ +
sudo apt-get install wine-development
+ +

+Note that you currently need to use the command +'wine-development' instead of 'wine' to run the +development version from the command-line. +

+ +

+You should be able to closely track upstream with the +"wine-development" package. While the version on stable will only +upgrade with each major Debian release, current packages for users on +stable will be regularly available from +Debian Backports (see below for details). + +Similarly, the packages in testing and unstable won't be +updated while Debian is in its biennial code-freeze. Advanced users that +really need a packaged, cutting-edge version of Wine during those +months can still find it in +Debian experimental. +

+ + +

On 64-Bit Debian

+ +

+Even if your system uses 64-bit Debian, you probably still +want a Wine installation that can run 32-bit Windows applications. To +install 32-bit application support, just make sure your system is +configured to pull in 32-bit packages and the index is updated +first: +

+ +
+sudo dpkg --add-architecture i386
+sudo apt-get update
+sudo apt-get install wine-development
+
+ +

Starting with Debian Stretch, you can also install Wine on 64-bit ARM +systems:

+ +
+sudo dpkg --add-architecture armhf
+sudo apt-get update
+sudo apt-get install wine-development
+
+ + +

Debian Backports

+ +

+If you are on stable and want a newer version of +"wine-development", starting with Debian Jessie, you can grab a version +in sync with upstream from Debian Backports. To install it, you need to +enable the Backports repo first by adding the following line to one of +your sources.list files: +

+ +
+deb http://httpredir.debian.org/debian/ jessie-backports main
+
+ +

+You can do this either through Synaptic + (Settings -> Repositories -> Other Software -> Add) +or by editing the sources.list file directly + ('sudo editor /etc/apt/sources.list'). +Then once you've added your sources, update your package index + (Reload in Synaptic or 'sudo apt-get update' on the + command-line). +

+ +

+If you don't mind possibly upgrading other dependencies to Backports +versions too, you can install everything from the command-line in one +swoop: +

+ +
sudo apt-get install -t jessie-backports wine-development
+ +

If you want to be more selective about keeping stable +dependencies though, you can use the form:

+ +
sudo apt-get install wine-development/jessie-backports
+ +

+However, if any other packages need to be installed or updated, this +method will abort with a list of such packages. You can selectively +install those from either stable or Backports, then repeat the +command to install "wine-development/jessie-backports". +

+ + +

More Information

+ +

For more info, you can see the Debian package site:

+ + + +

There are also useful wiki pages out there too:

+ + From jnewman at wine.codeweavers.com Mon Sep 21 13:25:22 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Mon, 21 Sep 2015 13:25:22 -0500 Subject: Kyle Auble : Update download entries for Ubuntu & Debian Message-ID: Module: website Branch: master Commit: daa3cf55171f9b86aa1760a2f12781e029da3775 URL: http://source.winehq.org/git/website.git/?a=commit;h=daa3cf55171f9b86aa1760a2f12781e029da3775 Author: Kyle Auble Date: Mon Sep 21 13:18:43 2015 -0500 Update download entries for Ubuntu & Debian --- templates/en/download.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/en/download.template b/templates/en/download.template index 02bc360..7001c9b 100644 --- a/templates/en/download.template +++ b/templates/en/download.template @@ -63,15 +63,15 @@ requested in exchange for hosting the Wine web site.

Ubuntu linux Download Ubuntu packages - - binary and source .debs for Ubuntu Trusty (14.04 LTS) + - binary and source .debs for Ubuntu Scott Ritchie - + Debian Linux - Download Debian packages + Download Debian packages - binary and source .debs for Debian Debian Wine Party From jnewman at wine.codeweavers.com Mon Sep 21 13:25:22 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Mon, 21 Sep 2015 13:25:22 -0500 Subject: Jeremy Newman : sync translations Message-ID: Module: website Branch: master Commit: b521df30902492f72dae79114e7bf9c75dbd34e1 URL: http://source.winehq.org/git/website.git/?a=commit;h=b521df30902492f72dae79114e7bf9c75dbd34e1 Author: Jeremy Newman Date: Mon Sep 21 13:24:20 2015 -0500 sync translations --- templates/de/download.template | 6 +++--- templates/fr/download.template | 8 ++++---- templates/he/download.template | 4 ++-- templates/pl/download.template | 6 +++--- templates/pt/download.template | 6 +++--- templates/tr/download.template | 6 +++--- templates/uk/download.template | 6 +++--- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/templates/de/download.template b/templates/de/download.template index 479a717..c44773a 100644 --- a/templates/de/download.template +++ b/templates/de/download.template @@ -64,15 +64,15 @@ für das Hosten der Wine-Webseite erbeten hat.

Ubuntu linux Ubuntu - Binär- und Quellpakete (.deb) für Ubuntu Trusty (14.04 LTS) + Binär- und Quellpakete (.deb) für Ubuntu Trusty Scott Ritchie - + Debian Linux - Debian + Debian Binärpakete (.deb) für Debian Debian Wine Party diff --git a/templates/fr/download.template b/templates/fr/download.template index 0d34178..971e073 100644 --- a/templates/fr/download.template +++ b/templates/fr/download.template @@ -66,16 +66,16 @@ center;">Voyez la Ubuntu Linux Paquets Ubuntu - - .deb binaires et sources pour Ubuntu Precise (12.04), Quantal (12.10), Raring (13.04) et Saucy (13.10) + - .deb binaires et sources pour Ubuntu Scott Ritchie - + Debian Linux - Paquets Debian - - .deb binaires pour Debian Sid + Paquets Debian + - .deb binaires pour Debian Debian Wine Party diff --git a/templates/he/download.template b/templates/he/download.template index fd10e37..1a36569 100644 --- a/templates/he/download.template +++ b/templates/he/download.template @@ -67,10 +67,10 @@ - + Debian Linux - ????? ?????? ?????? + ????? ?????? ?????? - ????? .deb??????? ??????; Debian Wine Party diff --git a/templates/pl/download.template b/templates/pl/download.template index 4b39e63..10e09f8 100644 --- a/templates/pl/download.template +++ b/templates/pl/download.template @@ -60,15 +60,15 @@ Ubuntu linux Pobierz paczki dla Ubuntu - - binarne i ?r?d?owe paczki .deb dla Ubuntu Trusty (14.04 LTS) + - binarne i ?r?d?owe paczki .deb dla Ubuntu Scott Ritchie - + Debian Linux - Pobierz paczki dla Debian + Pobierz paczki dla Debian - binarne paczki .deb dla Debian Debian Wine Party diff --git a/templates/pt/download.template b/templates/pt/download.template index 66ce52f..fad296b 100644 --- a/templates/pt/download.template +++ b/templates/pt/download.template @@ -59,15 +59,15 @@ Ubuntu linux Descarregar pacotes para Ubuntu - - .debs bin?rios e do c?digo fonte para Ubuntu Precise (12.04), Quantal (12.10), e Raring (13.04) + - .debs bin?rios e do c?digo fonte para Ubuntu Scott Ritchie - + Debian Linux - Descarregar pacotes para Debian + Descarregar pacotes para Debian - .debs bin?rios para Debian Debian Wine Party diff --git a/templates/tr/download.template b/templates/tr/download.template index 4cc7d3d..8689d07 100644 --- a/templates/tr/download.template +++ b/templates/tr/download.template @@ -59,15 +59,15 @@ Ubuntu linux Ubuntu paketleri indirin - - Ubuntu Precise (12.04), Quantal (12.10) ve Raring (13.04) i?in .debs ikili ve kaynak paketi + - Ubuntu i?in .debs ikili ve kaynak paketi Scott Ritchie - + Debian Linux - Debian paketleri indirin + Debian paketleri indirin - Debian i?in ikili .deb dosyalar? Debian Wine Party diff --git a/templates/uk/download.template b/templates/uk/download.template index 5440152..a36ebc1 100644 --- a/templates/uk/download.template +++ b/templates/uk/download.template @@ -60,15 +60,15 @@ Ubuntu linux ??????????? ??????? Ubuntu - - ??????? ?? ??????? .deb ????? ??? Ubuntu Trusty (14.04 LTS) + - ??????? ?? ??????? .deb ????? ??? Ubuntu Scott Ritchie - + Debian Linux - ??????????? ??????? Debian + ??????????? ??????? Debian - ??????? .deb ????? ??? Debian Debian Wine Party From jnewman at wine.codeweavers.com Wed Sep 23 16:37:22 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Wed, 23 Sep 2015 16:37:22 -0500 Subject: Jactry Zeng : Update Simplified Chinese translation for download page. Message-ID: Module: website Branch: master Commit: 26f6f982c8e81ac8cc5b5d1488851f0e5c160c55 URL: http://source.winehq.org/git/website.git/?a=commit;h=26f6f982c8e81ac8cc5b5d1488851f0e5c160c55 Author: Jactry Zeng Date: Wed Sep 23 22:33:52 2015 +0200 Update Simplified Chinese translation for download page. Signed-off-by: Jactry Zeng --- templates/zh-cn/download.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/zh-cn/download.template b/templates/zh-cn/download.template index d3d51ca..3ce949d 100644 --- a/templates/zh-cn/download.template +++ b/templates/zh-cn/download.template @@ -60,15 +60,15 @@ requested in exchange for hosting the Wine web site.

- Ubuntu linux + Ubuntu linux ?? Ubuntu ??? - - Ubuntu Trusty (14.04 LTS) ??????? .debs + - Ubuntu ??????? .debs Scott Ritchie - + Debian Linux ?? Debian ??? From jnewman at wine.codeweavers.com Fri Sep 25 09:16:00 2015 From: jnewman at wine.codeweavers.com (Jeremy Newman) Date: Fri, 25 Sep 2015 09:16:00 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: Add WWN 399 Message-ID: Module: website Branch: master Commit: 43a01bdfb4e6275fb49b977849d2799e8749b7fc URL: http://source.winehq.org/git/website.git/?a=commit;h=43a01bdfb4e6275fb49b977849d2799e8749b7fc Author: Andr? Hentschel Date: Thu Sep 24 20:59:15 2015 +0200 Add WWN 399 --- news/de/2015092401.xml | 11 ++++++++ news/en/2015092401.xml | 11 ++++++++ wwn/en/wn20150924_399.xml | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/news/de/2015092401.xml b/news/de/2015092401.xml new file mode 100644 index 0000000..ebf4363 --- /dev/null +++ b/news/de/2015092401.xml @@ -0,0 +1,11 @@ + + 24. September 2015 + World Wine News Ausgabe 399 + +WWN Ausgabe 399 wurde heute ver?ffentlicht. + + + diff --git a/news/en/2015092401.xml b/news/en/2015092401.xml new file mode 100644 index 0000000..8c6b5b0 --- /dev/null +++ b/news/en/2015092401.xml @@ -0,0 +1,11 @@ + + September 24, 2015 + World Wine News Issue 399 + +WWN Issue 399 was released today. + + + diff --git a/wwn/en/wn20150924_399.xml b/wwn/en/wn20150924_399.xml new file mode 100644 index 0000000..77cb901 --- /dev/null +++ b/wwn/en/wn20150924_399.xml @@ -0,0 +1,67 @@ + + +Wine Traffic + +André Hentschel + +

This is the 399th issue of the World Wine News publication. This time a special edition!

+ +
+

+ Last weekend at WineConf 2015 in Vienna we intensively talked about our stable releases, how + to integrate wine-staging, signing off patches and much more. + In this WWN special edition I want to present changes to our stable release process. +

+

+ See also: + WineConf2015 in our Wiki +

+
+ +
+ + Michael Stefaniuc wrote in: +

+
+
+Hello,
+
+at WineConf we had a fairly uncontroversial discussion about the Wine
+Stable release process. As the current process of feature based Wine
+releases isn't working following changes were agreed upon.
+
+Release Process Changes
+- -----------------------
+- - Switch to time based releases.
+
+- - Major releases once a year in autumn/fall. Code freeze starts around
+  mid/end of September.
+
+- - Michael Stefaniuc will be the stable maintainer starting with 1.8.x.
+  Other people are more than welcome to help out with Wine Stable.
+  I'll document stuff and send out a request for help during the code
+  freeze.
+
+- - The stable release will be supported in bugzilla.
+
+- - This changes take effect immediately. You can expect Alexandre to
+  announce a code freeze in the next couple of weeks.
+
+- - We will revisit this changes should the need arise, e.g. reduce the
+  time between two major stable releases.
+
+]]> +
+ +
From julliard at wine.codeweavers.com Fri Sep 25 15:22:01 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:01 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: ws2_32/tests: Don' t test function directly when reporting WSAGetLastError(). Message-ID: Module: wine Branch: master Commit: d0a5a32546b600eaabe1c03f0137c418e1fff591 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d0a5a32546b600eaabe1c03f0137c418e1fff591 Author: Andr? Hentschel Date: Sat Sep 19 15:42:51 2015 +0200 ws2_32/tests: Don't test function directly when reporting WSAGetLastError(). --- dlls/ws2_32/tests/sock.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 2bcc92e..8a0e375 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3737,7 +3737,8 @@ static void test_select(void) ok(FD_ISSET(fdRead, &writefds), "fdRead socket is not in the set\n"); len = sizeof(id); id = 0xdeadbeef; - ok(!getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len), "getsockopt failed with %d\n",WSAGetLastError()); + ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len); + ok(!ret, "getsockopt failed with %d\n", WSAGetLastError()); ok(id == 0, "expected 0, got %d\n", id); /* When data is received the receiver gets the read descriptor */ @@ -3821,7 +3822,8 @@ static void test_select(void) ok(ret == 1, "expected 1, got %d\n", ret); len = sizeof(id); id = 0xdeadbeef; - ok(!getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len), "getsockopt failed with %d\n",WSAGetLastError()); + ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len); + ok(!ret, "getsockopt failed with %d\n", WSAGetLastError()); ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id); ok(FD_ISSET(fdWrite, &exceptfds), "fdWrite socket is not in the set\n"); ok(select_timeout.tv_usec == 250000, "select timeout should not have changed\n"); From julliard at wine.codeweavers.com Fri Sep 25 15:22:01 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:01 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: kernel32/tests: Don' t test for the exact process count. Message-ID: Module: wine Branch: master Commit: 774efacbec2d15d2e4aab93932fae5605fc8ed0e URL: http://source.winehq.org/git/wine.git/?a=commit;h=774efacbec2d15d2e4aab93932fae5605fc8ed0e Author: Andr? Hentschel Date: Sat Sep 19 17:01:42 2015 +0200 kernel32/tests: Don't test for the exact process count. --- dlls/kernel32/tests/toolhelp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/tests/toolhelp.c b/dlls/kernel32/tests/toolhelp.c index ed76c9c..c40dbc4 100644 --- a/dlls/kernel32/tests/toolhelp.c +++ b/dlls/kernel32/tests/toolhelp.c @@ -175,8 +175,8 @@ static void test_thread(DWORD curr_pid, DWORD sub_pcs_pid) num++; } while (pThread32Next( hSnapshot, &te )); } - ok(curr_found == 1, "couldn't find self in thread list\n"); - ok(sub_found == 2, "couldn't find sub-process thread's in thread list\n"); + ok(curr_found, "couldn't find self in thread list\n"); + ok(sub_found >= 2, "couldn't find sub-process threads in thread list\n"); /* check that first really resets enumeration */ curr_found = 0; @@ -192,8 +192,8 @@ static void test_thread(DWORD curr_pid, DWORD sub_pcs_pid) num--; } while (pThread32Next( hSnapshot, &te )); } - ok(curr_found == 1, "couldn't find self in thread list\n"); - ok(sub_found == 2, "couldn't find sub-process thread's in thread list\n"); + ok(curr_found, "couldn't find self in thread list\n"); + ok(sub_found >= 2, "couldn't find sub-process threads in thread list\n"); me.dwSize = sizeof(me); ok(!pModule32First( hSnapshot, &me ), "shouldn't return a module\n"); From julliard at wine.codeweavers.com Fri Sep 25 15:22:01 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:01 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: ntdll/tests: Simplify the RtlRandom test. Message-ID: Module: wine Branch: master Commit: c6b888f16f65db07172131f705a4be4a8c35b219 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6b888f16f65db07172131f705a4be4a8c35b219 Author: Andr? Hentschel Date: Tue Sep 15 21:43:44 2015 +0200 ntdll/tests: Simplify the RtlRandom test. --- dlls/ntdll/tests/rtl.c | 222 ++----------------------------------------------- 1 file changed, 8 insertions(+), 214 deletions(-) diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 9a4ec48..ce23310 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -657,46 +657,11 @@ static void test_RtlUniform(void) } -static ULONG my_RtlRandom(PULONG seed) -{ - static ULONG saved_value[128] = - { /* 0 */ 0x4c8bc0aa, 0x4c022957, 0x2232827a, 0x2f1e7626, 0x7f8bdafb, 0x5c37d02a, 0x0ab48f72, 0x2f0c4ffa, - /* 8 */ 0x290e1954, 0x6b635f23, 0x5d3885c0, 0x74b49ff8, 0x5155fa54, 0x6214ad3f, 0x111e9c29, 0x242a3a09, - /* 16 */ 0x75932ae1, 0x40ac432e, 0x54f7ba7a, 0x585ccbd5, 0x6df5c727, 0x0374dad1, 0x7112b3f1, 0x735fc311, - /* 24 */ 0x404331a9, 0x74d97781, 0x64495118, 0x323e04be, 0x5974b425, 0x4862e393, 0x62389c1d, 0x28a68b82, - /* 32 */ 0x0f95da37, 0x7a50bbc6, 0x09b0091c, 0x22cdb7b4, 0x4faaed26, 0x66417ccd, 0x189e4bfa, 0x1ce4e8dd, - /* 40 */ 0x5274c742, 0x3bdcf4dc, 0x2d94e907, 0x32eac016, 0x26d33ca3, 0x60415a8a, 0x31f57880, 0x68c8aa52, - /* 48 */ 0x23eb16da, 0x6204f4a1, 0x373927c1, 0x0d24eb7c, 0x06dd7379, 0x2b3be507, 0x0f9c55b1, 0x2c7925eb, - /* 56 */ 0x36d67c9a, 0x42f831d9, 0x5e3961cb, 0x65d637a8, 0x24bb3820, 0x4d08e33d, 0x2188754f, 0x147e409e, - /* 64 */ 0x6a9620a0, 0x62e26657, 0x7bd8ce81, 0x11da0abb, 0x5f9e7b50, 0x23e444b6, 0x25920c78, 0x5fc894f0, - /* 72 */ 0x5e338cbb, 0x404237fd, 0x1d60f80f, 0x320a1743, 0x76013d2b, 0x070294ee, 0x695e243b, 0x56b177fd, - /* 80 */ 0x752492e1, 0x6decd52f, 0x125f5219, 0x139d2e78, 0x1898d11e, 0x2f7ee785, 0x4db405d8, 0x1a028a35, - /* 88 */ 0x63f6f323, 0x1f6d0078, 0x307cfd67, 0x3f32a78a, 0x6980796c, 0x462b3d83, 0x34b639f2, 0x53fce379, - /* 96 */ 0x74ba50f4, 0x1abc2c4b, 0x5eeaeb8d, 0x335a7a0d, 0x3973dd20, 0x0462d66b, 0x159813ff, 0x1e4643fd, - /* 104 */ 0x06bc5c62, 0x3115e3fc, 0x09101613, 0x47af2515, 0x4f11ec54, 0x78b99911, 0x3db8dd44, 0x1ec10b9b, - /* 112 */ 0x5b5506ca, 0x773ce092, 0x567be81a, 0x5475b975, 0x7a2cde1a, 0x494536f5, 0x34737bb4, 0x76d9750b, - /* 120 */ 0x2a1f6232, 0x2e49644d, 0x7dddcbe7, 0x500cebdb, 0x619dab9e, 0x48c626fe, 0x1cda3193, 0x52dabe9d }; - ULONG rand; - int pos; - ULONG result; - - rand = (*seed * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; - *seed = (rand * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; - pos = *seed & 0x7f; - result = saved_value[pos]; - saved_value[pos] = rand; - return(result); -} - - static void test_RtlRandom(void) { - ULONGLONG num; + int i, j; ULONG seed; - ULONG seed_bak; - ULONG seed_expected; - ULONG result; - ULONG result_expected; + ULONG res[512]; if (!pRtlRandom) { @@ -704,185 +669,14 @@ static void test_RtlRandom(void) return; } -/* - * Unlike RtlUniform, RtlRandom is not documented. We guess that for - * RtlRandom D.H. Lehmer's 1948 algorithm is used like stated in - * the documentation of the RtlUniform function. This algorithm is: - * - * seed = (seed * const_1 + const_2) % const_3; - * - * According to the RtlUniform documentation the random number is - * distributed over [0..MAXLONG], but in reality it is distributed - * over [0..MAXLONG-1]. Therefore const_3 might be MAXLONG + 1 or - * MAXLONG: - * - * seed = (seed * const_1 + const_2) % (MAXLONG + 1); - * - * or - * - * seed = (seed * const_1 + const_2) % MAXLONG; - * - * To find out const_2 we just call RtlRandom with seed set to 0: - */ seed = 0; - result_expected = 0x320a1743; - seed_expected =0x44b; - result = pRtlRandom(&seed); - -/* - * Windows Vista uses different algorithms, so skip the rest of the tests - * until that is figured out. Trace output for the failures is about 10.5 MB! - */ - - if (seed == 0x3fc) { - skip("Most likely running on Windows Vista which uses a different algorithm\n"); - return; + for (i = 0; i < sizeof(res) / sizeof(res[0]); i++) + { + res[i] = pRtlRandom(&seed); + ok(seed != res[i], "%i: seed is same as res %x\n", i, seed); + for (j = 0; j < i; j++) + ok(res[i] != res[j], "res[%i] (%x) is same as res[%i] (%x)\n", j, res[j], i, res[i]); } - - ok(result == result_expected, - "pRtlRandom(&seed (seed == 0)) returns %x, expected %x\n", - result, result_expected); - ok(seed == seed_expected, - "pRtlRandom(&seed (seed == 0)) sets seed to %x, expected %x\n", - seed, seed_expected); -/* - * Seed is not equal to result as with RtlUniform. To see more we - * call RtlRandom again with seed set to 0: - */ - seed = 0; - result_expected = 0x7fffffc3; - seed_expected =0x44b; - result = pRtlRandom(&seed); - ok(result == result_expected, - "RtlRandom(&seed (seed == 0)) returns %x, expected %x\n", - result, result_expected); - ok(seed == seed_expected, - "RtlRandom(&seed (seed == 0)) sets seed to %x, expected %x\n", - seed, seed_expected); -/* - * Seed is set to the same value as before but the result is different. - * To see more we call RtlRandom again with seed set to 0: - */ - seed = 0; - result_expected = 0x7fffffc3; - seed_expected =0x44b; - result = pRtlRandom(&seed); - ok(result == result_expected, - "RtlRandom(&seed (seed == 0)) returns %x, expected %x\n", - result, result_expected); - ok(seed == seed_expected, - "RtlRandom(&seed (seed == 0)) sets seed to %x, expected %x\n", - seed, seed_expected); -/* - * Seed is again set to the same value as before. This time we also - * have the same result as before. Interestingly the value of the - * result is 0x7fffffc3 which is the same value used in RtlUniform - * as const_2. If we do - * - * seed = 0; - * result = RtlUniform(&seed); - * - * we get the same result (0x7fffffc3) as with - * - * seed = 0; - * RtlRandom(&seed); - * seed = 0; - * result = RtlRandom(&seed); - * - * And there is another interesting thing. If we do - * - * seed = 0; - * RtlUniform(&seed); - * RtlUniform(&seed); - * - * seed is set to the value 0x44b which ist the same value that - * - * seed = 0; - * RtlRandom(&seed); - * - * assigns to seed. Putting these two findings together leads to - * the conclusion that RtlRandom saves the value in some variable, - * like in the following algorithm: - * - * result = saved_value; - * saved_value = RtlUniform(&seed); - * RtlUniform(&seed); - * return(result); - * - * Now we do further tests with seed set to 1: - */ - seed = 1; - result_expected = 0x7a50bbc6; - seed_expected =0x5a1; - result = pRtlRandom(&seed); - ok(result == result_expected, - "RtlRandom(&seed (seed == 1)) returns %x, expected %x\n", - result, result_expected); - ok(seed == seed_expected, - "RtlRandom(&seed (seed == 1)) sets seed to %x, expected %x\n", - seed, seed_expected); -/* - * If there is just one saved_value the result now would be - * 0x7fffffc3. From this test we can see that there is more than - * one saved_value, like with this algorithm: - * - * result = saved_value[pos]; - * saved_value[pos] = RtlUniform(&seed); - * RtlUniform(&seed); - * return(result); - * - * But how is the value of pos determined? The calls to RtlUniform - * create a sequence of random numbers. Every second random number - * is put into the saved_value array and is used in some later call - * of RtlRandom as result. The only reasonable source to determine - * pos are the random numbers generated by RtlUniform which are not - * put into the saved_value array. This are the values of seed - * between the two calls of RtlUniform as in this algorithm: - * - * rand = RtlUniform(&seed); - * RtlUniform(&seed); - * pos = position(seed); - * result = saved_value[pos]; - * saved_value[pos] = rand; - * return(result); - * - * What remains to be determined is: The size of the saved_value array, - * the initial values of the saved_value array and the function - * position(seed). These tests are not shown here. - * The result of these tests is: The size of the saved_value array - * is 128, the initial values can be seen in the my_RtlRandom - * function and the position(seed) function is (seed & 0x7f). - * - * For a full test of RtlRandom use one of the following loop heads: - * - * for (num = 0; num <= 0xffffffff; num++) { - * seed = num; - * ... - * - * seed = 0; - * for (num = 0; num <= 0xffffffff; num++) { - * ... - */ - seed = 0; - for (num = 0; num <= 100000; num++) { - seed_bak = seed; - seed_expected = seed; - result_expected = my_RtlRandom(&seed_expected); - /* The following corrections are necessary because the */ - /* previous tests changed the saved_value array */ - if (num == 0) { - result_expected = 0x7fffffc3; - } else if (num == 81) { - result_expected = 0x7fffffb1; - } /* if */ - result = pRtlRandom(&seed); - ok(result == result_expected, - "test: 0x%x%08x RtlRandom(&seed (seed == %x)) returns %x, expected %x\n", - (DWORD)(num >> 32), (DWORD)num, seed_bak, result, result_expected); - ok(seed == seed_expected, - "test: 0x%x%08x RtlRandom(&seed (seed == %x)) sets seed to %x, expected %x\n", - (DWORD)(num >> 32), (DWORD)num, seed_bak, result, seed_expected); - } /* for */ } From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: =?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: psapi/tests: Don' t check for exact value. Message-ID: Module: wine Branch: master Commit: a3ab34b4197ee66c53fc1a202cdd9fe1a6b4bd13 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a3ab34b4197ee66c53fc1a202cdd9fe1a6b4bd13 Author: Andr? Hentschel Date: Sun Sep 20 14:43:46 2015 +0200 psapi/tests: Don't check for exact value. Signed-off-by: Andr? Hentschel --- dlls/psapi/tests/psapi_main.c | 55 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c index cebfc5f..d7d3a1e 100644 --- a/dlls/psapi/tests/psapi_main.c +++ b/dlls/psapi/tests/psapi_main.c @@ -194,6 +194,11 @@ static void test_GetModuleInformation(void) ok(info.lpBaseOfDll == hMod, "lpBaseOfDll=%p hMod=%p\n", info.lpBaseOfDll, hMod); } +static BOOL check_with_margin(SIZE_T perf, SIZE_T sysperf, int margin) +{ + return (perf >= max(sysperf, margin) - margin && perf <= sysperf + margin); +} + static void test_GetPerformanceInfo(void) { PERFORMANCE_INFORMATION info; @@ -227,36 +232,30 @@ static void test_GetPerformanceInfo(void) ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %08x\n", status); ok(size >= sizeof(SYSTEM_PERFORMANCE_INFORMATION), "incorrect length %d\n", size); - ok(info.CommitTotal == sys_performance_info->TotalCommittedPages, - "expected info.CommitTotal=%u but got %u\n", - sys_performance_info->TotalCommittedPages, (ULONG)info.CommitTotal); - ok(info.CommitLimit == sys_performance_info->TotalCommitLimit, - "expected info.CommitLimit=%u but got %u\n", - sys_performance_info->TotalCommitLimit, (ULONG)info.CommitLimit); + ok(check_with_margin(info.CommitTotal, sys_performance_info->TotalCommittedPages, 288), + "expected approximately %ld but got %d\n", info.CommitTotal, sys_performance_info->TotalCommittedPages); + + ok(check_with_margin(info.CommitLimit, sys_performance_info->TotalCommitLimit, 32), + "expected approximately %ld but got %d\n", info.CommitLimit, sys_performance_info->TotalCommitLimit); - ok(info.CommitPeak == sys_performance_info->PeakCommitment, - "expected info.CommitPeak=%u but got %u\n", - sys_performance_info->PeakCommitment, (ULONG)info.CommitPeak); + ok(check_with_margin(info.CommitPeak, sys_performance_info->PeakCommitment, 32), + "expected approximately %ld but got %d\n", info.CommitPeak, sys_performance_info->PeakCommitment); - ok(info.PhysicalAvailable >= max(sys_performance_info->AvailablePages, 25) - 25 && - info.PhysicalAvailable <= sys_performance_info->AvailablePages + 25, - "expected approximately info.PhysicalAvailable=%u but got %u\n", - sys_performance_info->AvailablePages, (ULONG)info.PhysicalAvailable); + ok(check_with_margin(info.PhysicalAvailable, sys_performance_info->AvailablePages, 64), + "expected approximately %ld but got %d\n", info.PhysicalAvailable, sys_performance_info->AvailablePages); /* TODO: info.SystemCache not checked yet - to which field(s) does this value correspond to? */ - ok(info.KernelTotal == sys_performance_info->PagedPoolUsage + sys_performance_info->NonPagedPoolUsage, - "expected info.KernelTotal=%u but got %u\n", - sys_performance_info->PagedPoolUsage + sys_performance_info->NonPagedPoolUsage, (ULONG)info.KernelTotal); + ok(check_with_margin(info.KernelTotal, sys_performance_info->PagedPoolUsage + sys_performance_info->NonPagedPoolUsage, 64), + "expected approximately %ld but got %d\n", info.KernelTotal, + sys_performance_info->PagedPoolUsage + sys_performance_info->NonPagedPoolUsage); - ok(info.KernelPaged == sys_performance_info->PagedPoolUsage, - "expected info.KernelPaged=%u but got %u\n", - sys_performance_info->PagedPoolUsage, (ULONG)info.KernelPaged); + ok(check_with_margin(info.KernelPaged, sys_performance_info->PagedPoolUsage, 64), + "expected approximately %ld but got %d\n", info.KernelPaged, sys_performance_info->PagedPoolUsage); - ok(info.KernelNonpaged == sys_performance_info->NonPagedPoolUsage, - "expected info.KernelNonpaged=%u but got %u\n", - sys_performance_info->NonPagedPoolUsage, (ULONG)info.KernelNonpaged); + ok(check_with_margin(info.KernelNonpaged, sys_performance_info->NonPagedPoolUsage, 8), + "expected approximately %ld but got %d\n", info.KernelNonpaged, sys_performance_info->NonPagedPoolUsage); /* compare with values from SYSTEM_BASIC_INFORMATION */ size = 0; @@ -297,14 +296,14 @@ static void test_GetPerformanceInfo(void) } HeapFree(GetProcessHeap(), 0, sys_process_info); - ok(info.HandleCount == handle_count, - "expected info.HandleCount=%u but got %u\n", handle_count, info.HandleCount); + ok(check_with_margin(info.HandleCount, handle_count, 8), + "expected approximately %d but got %d\n", info.HandleCount, handle_count); - ok(info.ProcessCount == process_count, - "expected info.ProcessCount=%u but got %u\n", process_count, info.ProcessCount); + ok(check_with_margin(info.ProcessCount, process_count, 4), + "expected approximately %d but got %d\n", info.ProcessCount, process_count); - ok(info.ThreadCount == thread_count, - "expected info.ThreadCount=%u but got %u\n", thread_count, info.ThreadCount); + ok(check_with_margin(info.ThreadCount, thread_count, 4), + "expected approximately %d but got %d\n", info.ThreadCount, thread_count); } } From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Nikolay Sivov : urlmon/tests: Fixed a couple of test failure on Win10. Message-ID: Module: wine Branch: master Commit: c0308873b94dfc7889ea376ac09a9002e5a90885 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c0308873b94dfc7889ea376ac09a9002e5a90885 Author: Nikolay Sivov Date: Sun Sep 20 11:53:59 2015 +0300 urlmon/tests: Fixed a couple of test failure on Win10. --- dlls/urlmon/tests/protocol.c | 6 ++++++ include/urlmon.idl | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c index c50d356..01d52ea 100644 --- a/dlls/urlmon/tests/protocol.c +++ b/dlls/urlmon/tests/protocol.c @@ -887,6 +887,9 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, case BINDSTATUS_RESERVED_7: trace("BINDSTATUS_RESERVED_7\n"); break; + case BINDSTATUS_RESERVED_8: + trace("BINDSTATUS_RESERVED_8\n"); + break; default: ok(0, "Unexpected status %d (%d)\n", ulStatusCode, ulStatusCode-BINDSTATUS_LAST); }; @@ -1399,6 +1402,9 @@ static HRESULT WINAPI BindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulS CHECK_EXPECT(GetBindString_ROOTDOC_URL); ok(cEl == 1, "cEl=%d, expected 1\n", cEl); return E_NOTIMPL; + case BINDSTRING_ENTERPRISE_ID: + ok(cEl == 1, "cEl=%d, expected 1\n", cEl); + return E_NOTIMPL; default: ok(0, "unexpected ulStringType %d\n", ulStringType); } diff --git a/include/urlmon.idl b/include/urlmon.idl index 4be8d4b..35dee40 100644 --- a/include/urlmon.idl +++ b/include/urlmon.idl @@ -729,7 +729,8 @@ interface IInternetBindInfo : IUnknown BINDSTRING_ROOTDOC_URL, BINDSTRING_INITIAL_FILENAME, BINDSTRING_PROXY_USERNAME, - BINDSTRING_PROXY_PASSWORD + BINDSTRING_PROXY_PASSWORD, + BINDSTRING_ENTERPRISE_ID } BINDSTRING; HRESULT GetBindInfo( From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Nikolay Sivov : msacm32/tests: Allow alternative product id. Message-ID: Module: wine Branch: master Commit: bc26431e9409356081682b0fa219f350bb503890 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc26431e9409356081682b0fa219f350bb503890 Author: Nikolay Sivov Date: Mon Sep 21 21:13:24 2015 +0300 msacm32/tests: Allow alternative product id. --- dlls/msacm32/tests/msacm.c | 18 +++++++++++++----- include/mmreg.h | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index 88ad330..0defb33 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -127,15 +127,16 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, TODO: should it be *exactly* sizeof(dd), as tested here? */ if (rc == MMSYSERR_NOERROR) { - struct { + static const struct { const char *shortname; - const WORD mid; - const WORD pid; + WORD mid; + WORD pid; + WORD pid_alt; } *iter, expected_ids[] = { { "Microsoft IMA ADPCM", MM_MICROSOFT, MM_MSFT_ACM_IMAADPCM }, { "MS-ADPCM", MM_MICROSOFT, MM_MSFT_ACM_MSADPCM }, { "Microsoft CCITT G.711", MM_MICROSOFT, MM_MSFT_ACM_G711}, - { "MPEG Layer-3 Codec", MM_FRAUNHOFER_IIS, MM_FHGIIS_MPEGLAYER3_DECODE }, + { "MPEG Layer-3 Codec", MM_FRAUNHOFER_IIS, MM_FHGIIS_MPEGLAYER3_DECODE, MM_FHGIIS_MPEGLAYER3_PROFESSIONAL }, { "MS-PCM", MM_MICROSOFT, MM_MSFT_ACM_PCM }, { 0 } }; @@ -145,7 +146,14 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, for (iter = expected_ids; iter->shortname; ++iter) { if (dd.szShortName && !strcmp(iter->shortname, dd.szShortName)) { - ok(iter->mid == dd.wMid && iter->pid == dd.wPid, + /* try alternative product id on mismatch */ + if (iter->pid_alt && iter->pid != dd.wPid) + ok(iter->mid == dd.wMid && iter->pid_alt == dd.wPid, + "Got wrong manufacturer (0x%x vs 0x%x) or product (0x%x vs 0x%x)\n", + dd.wMid, iter->mid, + dd.wPid, iter->pid_alt); + else + ok(iter->mid == dd.wMid && iter->pid == dd.wPid, "Got wrong manufacturer (0x%x vs 0x%x) or product (0x%x vs 0x%x)\n", dd.wMid, iter->mid, dd.wPid, iter->pid); diff --git a/include/mmreg.h b/include/mmreg.h index e0b1dd0..2ee2b00 100644 --- a/include/mmreg.h +++ b/include/mmreg.h @@ -129,6 +129,7 @@ typedef struct _WAVEFORMATEX { #define MM_FRAUNHOFER_IIS 0xAC #define MM_FHGIIS_MPEGLAYER3_DECODE 0x09 +#define MM_FHGIIS_MPEGLAYER3_PROFESSIONAL 0x0d #if !defined(WAVE_FORMAT_EXTENSIBLE) #define WAVE_FORMAT_EXTENSIBLE 0xFFFE /* Microsoft */ From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Sebastian Lackner : opencl: Avoid deprecation warning for OpenCL 1.2 APIs. Message-ID: Module: wine Branch: master Commit: 7a485dd1ea09a42eb3656ffe1207a8e87d6992d4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a485dd1ea09a42eb3656ffe1207a8e87d6992d4 Author: Sebastian Lackner Date: Tue Sep 22 15:40:40 2015 +0200 opencl: Avoid deprecation warning for OpenCL 1.2 APIs. Signed-off-by: Sebastian Lackner --- dlls/opencl/opencl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/opencl/opencl.c b/dlls/opencl/opencl.c index f690733..2d145bf 100644 --- a/dlls/opencl/opencl.c +++ b/dlls/opencl/opencl.c @@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(opencl); #if defined(HAVE_CL_CL_H) #define CL_USE_DEPRECATED_OPENCL_1_1_APIS +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS #define CL_USE_DEPRECATED_OPENCL_2_0_APIS #include #elif defined(HAVE_OPENCL_OPENCL_H) From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Hans Leidekker : winhttp: Verify certificates against the hostname instead of the server name. Message-ID: Module: wine Branch: master Commit: d22e21f96d5069a235a9a814f7126b5ca5ed4c1a URL: http://source.winehq.org/git/wine.git/?a=commit;h=d22e21f96d5069a235a9a814f7126b5ca5ed4c1a Author: Hans Leidekker Date: Tue Sep 22 15:57:12 2015 +0200 winhttp: Verify certificates against the hostname instead of the server name. The server name is different when connections are made through a proxy server. Signed-off-by: Hans Leidekker --- dlls/winhttp/request.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index d3f4d91..380edb8 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -1051,7 +1051,7 @@ static BOOL open_connection( request_t *request ) return FALSE; } } - if (!netconn_secure_connect( &request->netconn, connect->servername )) + if (!netconn_secure_connect( &request->netconn, connect->hostname )) { netconn_close( &request->netconn ); heap_free( addressW ); From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Hans Leidekker : winhttp/tests: Never use a proxy for connections to localhost. Message-ID: Module: wine Branch: master Commit: 4eb2807bd42515e500d335d9a01e5550ed4632be URL: http://source.winehq.org/git/wine.git/?a=commit;h=4eb2807bd42515e500d335d9a01e5550ed4632be Author: Hans Leidekker Date: Tue Sep 22 15:57:44 2015 +0200 winhttp/tests: Never use a proxy for connections to localhost. Signed-off-by: Hans Leidekker --- dlls/winhttp/tests/winhttp.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 05993f0..15af208 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -2138,7 +2138,7 @@ static void test_basic_request(int port, const WCHAR *verb, const WCHAR *path) DWORD count, status, size, error, supported, first, target; BOOL ret; - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2206,7 +2206,7 @@ static void test_basic_authentication(int port) DWORD status, size, error, supported, first, target; BOOL ret; - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2343,7 +2343,7 @@ static void test_basic_authentication(int port) /* credentials set with WinHttpSetCredentials take precedence over those set through options */ - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2377,7 +2377,7 @@ static void test_basic_authentication(int port) WinHttpCloseHandle(con); WinHttpCloseHandle(ses); - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2419,7 +2419,7 @@ static void test_no_headers(int port) DWORD error; BOOL ret; - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2456,7 +2456,7 @@ static void test_no_content(int port) DWORD size, len = sizeof(buf), bytes_read, status; BOOL ret; - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2541,7 +2541,7 @@ static void test_head_request(int port) DWORD size, len, count, status; BOOL ret; - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2606,7 +2606,7 @@ static void test_not_modified(int port) GetSystemTime(&st); WinHttpTimeFromSystemTime(&st, &today[sizeof(ifmodifiedW)/sizeof(WCHAR)]); - session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, + session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); ok(session != NULL, "WinHttpOpen failed: %u\n", GetLastError()); @@ -2660,7 +2660,7 @@ static void test_bad_header( int port ) DWORD index, len; BOOL ret; - ses = WinHttpOpen( test_useragent, 0, NULL, NULL, 0 ); + ses = WinHttpOpen( test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 ); ok( ses != NULL, "failed to open session %u\n", GetLastError() ); con = WinHttpConnect( ses, localhostW, port, 0 ); @@ -2692,7 +2692,7 @@ static void test_multiple_reads(int port) DWORD total_len = 0; BOOL ret; - ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); con = WinHttpConnect(ses, localhostW, port, 0); @@ -2745,7 +2745,7 @@ static void test_cookies( int port ) DWORD status, size; BOOL ret; - ses = WinHttpOpen( test_useragent, 0, NULL, NULL, 0 ); + ses = WinHttpOpen( test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 ); ok( ses != NULL, "failed to open session %u\n", GetLastError() ); con = WinHttpConnect( ses, localhostW, port, 0 ); @@ -2825,7 +2825,7 @@ static void test_cookies( int port ) WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); - ses = WinHttpOpen( test_useragent, 0, NULL, NULL, 0 ); + ses = WinHttpOpen( test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 ); ok( ses != NULL, "failed to open session %u\n", GetLastError() ); con = WinHttpConnect( ses, localhostW, port, 0 ); @@ -2859,7 +2859,7 @@ static void test_connection_info( int port ) DWORD size, error; BOOL ret; - ses = WinHttpOpen( test_useragent, 0, NULL, NULL, 0 ); + ses = WinHttpOpen( test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 ); ok( ses != NULL, "failed to open session %u\n", GetLastError() ); con = WinHttpConnect( ses, localhostW, port, 0 ); From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Hans Leidekker : winhttp/tests: Fix a test failure. Message-ID: Module: wine Branch: master Commit: 42a8a3e74bd5c66c721e6236c2c3bf086858e58b URL: http://source.winehq.org/git/wine.git/?a=commit;h=42a8a3e74bd5c66c721e6236c2c3bf086858e58b Author: Hans Leidekker Date: Tue Sep 22 15:58:09 2015 +0200 winhttp/tests: Fix a test failure. Signed-off-by: Hans Leidekker --- dlls/winhttp/tests/winhttp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 15af208..369574a 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -486,7 +486,8 @@ static void test_WinHttpAddHeaders(void) static const WCHAR test_header_begin[] = {'P','O','S','T',' ','/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'}; static const WCHAR full_path_test_header_begin[] = - {'P','O','S','T',' ','h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',':','8','0','/','p','o','s','t','.','p','h','p',' ','H','T','T','P','/','1'}; + {'P','O','S','T',' ','h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',':','8','0', + '/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'}; static const WCHAR test_header_end[] = {'\r','\n','\r','\n',0}; static const WCHAR test_header_name[] = {'W','a','r','n','i','n','g',0}; static const WCHAR test_header_name2[] = {'n','a','m','e',0}; From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Hans Leidekker : winhttp/tests: Handle timeout errors. Message-ID: Module: wine Branch: master Commit: 29967d63bbe2279de003f4b1cea55000aac46074 URL: http://source.winehq.org/git/wine.git/?a=commit;h=29967d63bbe2279de003f4b1cea55000aac46074 Author: Hans Leidekker Date: Tue Sep 22 15:58:33 2015 +0200 winhttp/tests: Handle timeout errors. Signed-off-by: Hans Leidekker --- dlls/winhttp/tests/notification.c | 21 +++++++++++++-------- dlls/winhttp/tests/winhttp.c | 31 ++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/dlls/winhttp/tests/notification.c b/dlls/winhttp/tests/notification.c index a409c0d..5d76d12 100644 --- a/dlls/winhttp/tests/notification.c +++ b/dlls/winhttp/tests/notification.c @@ -159,7 +159,7 @@ static void setup_test( struct info *info, enum api function, unsigned int line static void test_connection_cache( void ) { HANDLE ses, con, req, event; - DWORD size, status; + DWORD size, status, err; BOOL ret, unload = TRUE; struct info info, *context = &info; @@ -194,7 +194,8 @@ static void test_connection_cache( void ) setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -222,7 +223,8 @@ static void test_connection_cache( void ) setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -289,7 +291,8 @@ static void test_connection_cache( void ) setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -317,7 +320,8 @@ static void test_connection_cache( void ) setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -387,7 +391,7 @@ static const struct notification redirect_test[] = static void test_redirect( void ) { HANDLE ses, con, req; - DWORD size, status; + DWORD size, status, err; BOOL ret; struct info info, *context = &info; @@ -414,7 +418,8 @@ static void test_redirect( void ) setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -524,7 +529,7 @@ static void test_async( void ) SetLastError( 0xdeadbeef ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); err = GetLastError(); - if (!ret && err == ERROR_WINHTTP_CANNOT_CONNECT) + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); WinHttpCloseHandle( req ); diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 369574a..0ecd5ab 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -254,7 +254,7 @@ static void test_OpenRequest (void) SetLastError(0xdeadbeef); ret = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, 0); err = GetLastError(); - if (!ret && err == ERROR_WINHTTP_CANNOT_CONNECT) + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("Connection failed, skipping.\n"); goto done; @@ -280,6 +280,7 @@ static void test_empty_headers_param(void) { static const WCHAR empty[] = {0}; HINTERNET ses, con, req; + DWORD err; BOOL ret; ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); @@ -292,7 +293,8 @@ static void test_empty_headers_param(void) ok(req != NULL, "failed to open a request %u\n", GetLastError()); ret = WinHttpSendRequest(req, empty, 0, NULL, 0, 0, 0); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -315,7 +317,7 @@ static void test_SendRequest (void) static CHAR post_data[] = "mode=Test"; static const char test_post[] = "mode => Test\0\n"; HINTERNET session, request, connection; - DWORD header_len, optional_len, total_len, bytes_rw, size; + DWORD header_len, optional_len, total_len, bytes_rw, size, err; DWORD_PTR context; BOOL ret; CHAR buffer[256]; @@ -348,7 +350,8 @@ static void test_SendRequest (void) context++; ret = WinHttpSendRequest(request, content_type, header_len, post_data, optional_len, total_len, context); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -968,7 +971,7 @@ static void CALLBACK cert_error(HINTERNET handle, DWORD_PTR ctx, DWORD status, L static void test_secure_connection(void) { HINTERNET ses, con, req; - DWORD size, status, policy, bitness, read_size; + DWORD size, status, policy, bitness, read_size, err; BOOL ret; CERT_CONTEXT *cert; WINHTTP_CERTIFICATE_INFO info; @@ -989,7 +992,8 @@ static void test_secure_connection(void) ok(req != NULL, "failed to open a request %u\n", GetLastError()); ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("Connection failed, skipping.\n"); goto cleanup; @@ -1011,7 +1015,9 @@ static void test_secure_connection(void) WinHttpSetStatusCallback(req, cert_error, WINHTTP_CALLBACK_STATUS_SECURE_FAILURE, 0); ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); - if (!ret && (GetLastError() == ERROR_WINHTTP_SECURE_FAILURE || GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT)) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_SECURE_FAILURE || err == ERROR_WINHTTP_CANNOT_CONNECT || + err == ERROR_WINHTTP_TIMEOUT)) { skip("secure connection failed, skipping remaining secure tests\n"); goto cleanup; @@ -1089,7 +1095,8 @@ static void test_request_parameter_defaults(void) ok(req != NULL, "failed to open a request %u\n", GetLastError()); ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + error = GetLastError(); + if (!ret && (error == ERROR_WINHTTP_CANNOT_CONNECT || error == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -1116,7 +1123,8 @@ static void test_request_parameter_defaults(void) ok(req != NULL, "failed to open a request %u\n", GetLastError()); ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); - if (!ret && (GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT || GetLastError() == ERROR_WINHTTP_TIMEOUT)) + error = GetLastError(); + if (!ret && (error == ERROR_WINHTTP_CANNOT_CONNECT || error == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -4009,7 +4017,7 @@ static void test_chunked_read(void) static const WCHAR verb[] = {'/','t','e','s','t','c','h','u','n','k','e','d',0}; static const WCHAR chunked[] = {'c','h','u','n','k','e','d',0}; WCHAR header[32]; - DWORD len; + DWORD len, err; HINTERNET ses, con = NULL, req = NULL; BOOL ret; @@ -4028,7 +4036,8 @@ static void test_chunked_read(void) if (!req) goto done; ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + err = GetLastError(); + if (!ret && (err == ERROR_WINHTTP_CANNOT_CONNECT || err == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Hans Leidekker : msi/tests: Fix a test failure on Ultimate editions. Message-ID: Module: wine Branch: master Commit: 100c043e89485a1fd6d7071fd5f8291d8104d5fa URL: http://source.winehq.org/git/wine.git/?a=commit;h=100c043e89485a1fd6d7071fd5f8291d8104d5fa Author: Hans Leidekker Date: Wed Sep 23 11:02:32 2015 +0200 msi/tests: Fix a test failure on Ultimate editions. Signed-off-by: Hans Leidekker --- dlls/msi/tests/msi.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dlls/msi/tests/msi.c b/dlls/msi/tests/msi.c index b98a8c2..feeb1ff 100644 --- a/dlls/msi/tests/msi.c +++ b/dlls/msi/tests/msi.c @@ -4229,12 +4229,11 @@ static void test_MsiGetFileVersion(void) ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); /* pcchLangBuf not big enough */ - langsz = 3; + langsz = 4; lstrcpyA(lang, "lang"); r = MsiGetFileVersionA(path, NULL, NULL, lang, &langsz); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); - ok(!strncmp(lang, langcheck, 2), - "Expected first character of \"%s\", got \"%s\"\n", langcheck, lang); + ok(lstrcmpA(lang, "lang"), "lang not set\n"); ok(langsz >= langchecksz, "Expected %d >= %d\n", langsz, langchecksz); /* pcchVersionBuf big enough, pcchLangBuf not big enough */ @@ -4255,7 +4254,7 @@ static void test_MsiGetFileVersion(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); ok(langsz >= langchecksz && langsz < MAX_PATH, "Expected %d >= %d\n", langsz, langchecksz); - ok(lstrcmpA(lang, "lang"), "lang buffer not modified\n"); + ok(strstr(lang, langcheck) != NULL, "expected %s in %s\n", langcheck, lang); /* NULL pcchVersionBuf and pcchLangBuf */ r = MsiGetFileVersionA(path, version, NULL, lang, NULL); From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Sebastian Lackner : ntdll: Ignore higher bits in selector for ThreadDescriptorTableEntry info query. Message-ID: Module: wine Branch: master Commit: 6d9cf4910329c01032662ca6ce87a3138ba3e0eb URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d9cf4910329c01032662ca6ce87a3138ba3e0eb Author: Sebastian Lackner Date: Wed Sep 23 20:19:52 2015 +0200 ntdll: Ignore higher bits in selector for ThreadDescriptorTableEntry info query. Fixes a random test failure in kernel32/thread tests caused by the uninitialized HIWORD. Signed-off-by: Sebastian Lackner --- dlls/ntdll/thread.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 0a8a7b9..b8109e1 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -1014,7 +1014,7 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, status = STATUS_INFO_LENGTH_MISMATCH; else if (!(tdi->Selector & 4)) /* GDT selector */ { - unsigned sel = tdi->Selector & ~3; /* ignore RPL */ + unsigned sel = LOWORD(tdi->Selector) & ~3; /* ignore RPL */ status = STATUS_SUCCESS; if (!sel) /* null selector */ memset( &tdi->Entry, 0, sizeof(tdi->Entry) ); @@ -1045,7 +1045,7 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, SERVER_START_REQ( get_selector_entry ) { req->handle = wine_server_obj_handle( handle ); - req->entry = tdi->Selector >> 3; + req->entry = LOWORD(tdi->Selector) >> 3; status = wine_server_call( req ); if (!status) { From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Piotr Caban : msvcrt: Pass pthreadlocinfo to update_threadlocinfo_category helper function. Message-ID: Module: wine Branch: master Commit: d04c895b91dad2a4f57cecbb20f322185cf94c3d URL: http://source.winehq.org/git/wine.git/?a=commit;h=d04c895b91dad2a4f57cecbb20f322185cf94c3d Author: Piotr Caban Date: Thu Sep 24 16:15:40 2015 +0200 msvcrt: Pass pthreadlocinfo to update_threadlocinfo_category helper function. Signed-off-by: Piotr Caban --- dlls/msvcrt/locale.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index ad06b1a..b5fca6e 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -310,7 +310,7 @@ LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage) /* INTERNAL: Set lc_handle, lc_id and lc_category in threadlocinfo struct */ static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp, - MSVCRT__locale_t loc, int category) + MSVCRT_pthreadlocinfo locinfo, int category) { char buf[256], *p; int len; @@ -318,25 +318,25 @@ static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp, if(GetLocaleInfoA(lcid, LOCALE_ILANGUAGE|LOCALE_NOUSEROVERRIDE, buf, 256)) { p = buf; - loc->locinfo->lc_id[category].wLanguage = 0; + locinfo->lc_id[category].wLanguage = 0; while(*p) { - loc->locinfo->lc_id[category].wLanguage *= 16; + locinfo->lc_id[category].wLanguage *= 16; if(*p <= '9') - loc->locinfo->lc_id[category].wLanguage += *p-'0'; + locinfo->lc_id[category].wLanguage += *p-'0'; else - loc->locinfo->lc_id[category].wLanguage += *p-'a'+10; + locinfo->lc_id[category].wLanguage += *p-'a'+10; p++; } - loc->locinfo->lc_id[category].wCountry = - loc->locinfo->lc_id[category].wLanguage; + locinfo->lc_id[category].wCountry = + locinfo->lc_id[category].wLanguage; } - loc->locinfo->lc_id[category].wCodePage = cp; + locinfo->lc_id[category].wCodePage = cp; - loc->locinfo->lc_handle[category] = lcid; + locinfo->lc_handle[category] = lcid; len = 0; len += GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE @@ -348,18 +348,18 @@ static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp, sprintf(buf+len, "%d", cp); len += strlen(buf+len)+1; - loc->locinfo->lc_category[category].locale = MSVCRT_malloc(len); - loc->locinfo->lc_category[category].refcount = MSVCRT_malloc(sizeof(int)); - if(!loc->locinfo->lc_category[category].locale - || !loc->locinfo->lc_category[category].refcount) { - MSVCRT_free(loc->locinfo->lc_category[category].locale); - MSVCRT_free(loc->locinfo->lc_category[category].refcount); - loc->locinfo->lc_category[category].locale = NULL; - loc->locinfo->lc_category[category].refcount = NULL; + locinfo->lc_category[category].locale = MSVCRT_malloc(len); + locinfo->lc_category[category].refcount = MSVCRT_malloc(sizeof(int)); + if(!locinfo->lc_category[category].locale + || !locinfo->lc_category[category].refcount) { + MSVCRT_free(locinfo->lc_category[category].locale); + MSVCRT_free(locinfo->lc_category[category].refcount); + locinfo->lc_category[category].locale = NULL; + locinfo->lc_category[category].refcount = NULL; return TRUE; } - memcpy(loc->locinfo->lc_category[category].locale, buf, len); - *loc->locinfo->lc_category[category].refcount = 1; + memcpy(locinfo->lc_category[category].locale, buf, len); + *locinfo->lc_category[category].refcount = 1; return FALSE; } @@ -1006,7 +1006,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) } if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) { - if(update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE], cp[MSVCRT_LC_COLLATE], loc, MSVCRT_LC_COLLATE)) { + if(update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE], cp[MSVCRT_LC_COLLATE], loc->locinfo, MSVCRT_LC_COLLATE)) { MSVCRT__free_locale(loc); return NULL; } @@ -1024,7 +1024,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) CPINFO cp_info; int j; - if(update_threadlocinfo_category(lcid[MSVCRT_LC_CTYPE], cp[MSVCRT_LC_CTYPE], loc, MSVCRT_LC_CTYPE)) { + if(update_threadlocinfo_category(lcid[MSVCRT_LC_CTYPE], cp[MSVCRT_LC_CTYPE], loc->locinfo, MSVCRT_LC_CTYPE)) { MSVCRT__free_locale(loc); return NULL; } @@ -1097,7 +1097,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) _setmbcp_l(loc->locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage, lcid[MSVCRT_LC_CTYPE], loc->mbcinfo); if(lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) { - if(update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY], loc, MSVCRT_LC_MONETARY)) { + if(update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY], loc->locinfo, MSVCRT_LC_MONETARY)) { MSVCRT__free_locale(loc); return NULL; } @@ -1365,7 +1365,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) } if(lcid[MSVCRT_LC_NUMERIC] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_NUMERIC)) { - if(update_threadlocinfo_category(lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC], loc, MSVCRT_LC_NUMERIC)) { + if(update_threadlocinfo_category(lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC], loc->locinfo, MSVCRT_LC_NUMERIC)) { MSVCRT__free_locale(loc); return NULL; } @@ -1471,7 +1471,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) } if(lcid[MSVCRT_LC_TIME] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_TIME)) { - if(update_threadlocinfo_category(lcid[MSVCRT_LC_TIME], cp[MSVCRT_LC_TIME], loc, MSVCRT_LC_TIME)) { + if(update_threadlocinfo_category(lcid[MSVCRT_LC_TIME], cp[MSVCRT_LC_TIME], loc->locinfo, MSVCRT_LC_TIME)) { MSVCRT__free_locale(loc); return NULL; } From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Piotr Caban : msvcrt: Pass pthreadlocinfo to set_lc_locale_name function. Message-ID: Module: wine Branch: master Commit: 905daf251a6d383a894ff34113f80c603d041e84 URL: http://source.winehq.org/git/wine.git/?a=commit;h=905daf251a6d383a894ff34113f80c603d041e84 Author: Piotr Caban Date: Thu Sep 24 16:15:50 2015 +0200 msvcrt: Pass pthreadlocinfo to set_lc_locale_name function. Signed-off-by: Piotr Caban --- dlls/msvcrt/locale.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index b5fca6e..6320d3a 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -830,9 +830,9 @@ void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale) } #if _MSVCR_VER >= 110 -static inline BOOL set_lc_locale_name(MSVCRT__locale_t loc, int cat) +static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat) { - LCID lcid = loc->locinfo->lc_handle[cat]; + LCID lcid = locinfo->lc_handle[cat]; WCHAR buf[100]; int len; @@ -843,14 +843,14 @@ static inline BOOL set_lc_locale_name(MSVCRT__locale_t loc, int cat) if(LocaleNameToLCID(buf, 0) != lcid) len = LCIDToLocaleName(lcid, buf, 100, 0); - if(!len || !(loc->locinfo->lc_name[cat] = MSVCRT_malloc(len*sizeof(MSVCRT_wchar_t)))) + if(!len || !(locinfo->lc_name[cat] = MSVCRT_malloc(len*sizeof(MSVCRT_wchar_t)))) return FALSE; - memcpy(loc->locinfo->lc_name[cat], buf, len*sizeof(MSVCRT_wchar_t)); + memcpy(locinfo->lc_name[cat], buf, len*sizeof(MSVCRT_wchar_t)); return TRUE; } #else -static inline BOOL set_lc_locale_name(MSVCRT__locale_t loc, int cat) +static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat) { return TRUE; } @@ -1013,7 +1013,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) loc->locinfo->lc_collate_cp = loc->locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage; - if(!set_lc_locale_name(loc, MSVCRT_LC_COLLATE)) { + if(!set_lc_locale_name(loc->locinfo, MSVCRT_LC_COLLATE)) { MSVCRT__free_locale(loc); return NULL; } @@ -1063,7 +1063,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) for(j=cp_info.LeadByte[i]; j<=cp_info.LeadByte[i+1]; j++) loc->locinfo->ctype1[j+1] |= MSVCRT__LEADBYTE; - if(!set_lc_locale_name(loc, MSVCRT_LC_CTYPE)) { + if(!set_lc_locale_name(loc->locinfo, MSVCRT_LC_CTYPE)) { MSVCRT__free_locale(loc); return NULL; } @@ -1301,7 +1301,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) } #endif - if(!set_lc_locale_name(loc, MSVCRT_LC_MONETARY)) { + if(!set_lc_locale_name(loc->locinfo, MSVCRT_LC_MONETARY)) { MSVCRT__free_locale(loc); return NULL; } @@ -1434,7 +1434,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) } #endif - if(!set_lc_locale_name(loc, MSVCRT_LC_NUMERIC)) { + if(!set_lc_locale_name(loc->locinfo, MSVCRT_LC_NUMERIC)) { MSVCRT__free_locale(loc); return NULL; } @@ -1476,7 +1476,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) return NULL; } - if(!set_lc_locale_name(loc, MSVCRT_LC_TIME)) { + if(!set_lc_locale_name(loc->locinfo, MSVCRT_LC_TIME)) { MSVCRT__free_locale(loc); return NULL; } From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Piotr Caban : msvcrt: Add create_locinfo helper function. Message-ID: Module: wine Branch: master Commit: ca8ef840ad55f3ceff99b50653efb5015f2e9dbc URL: http://source.winehq.org/git/wine.git/?a=commit;h=ca8ef840ad55f3ceff99b50653efb5015f2e9dbc Author: Piotr Caban Date: Thu Sep 24 16:15:54 2015 +0200 msvcrt: Add create_locinfo helper function. Signed-off-by: Piotr Caban --- dlls/msvcrt/locale.c | 527 ++++++++++++++++++++++++++------------------------- 1 file changed, 271 insertions(+), 256 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=ca8ef840ad55f3ceff99b50653efb5015f2e9dbc From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Piotr Caban : msvcrt: Use create_locinfo helper in setlocale implementation. Message-ID: Module: wine Branch: master Commit: f075043273ab1dcb30c5d030d445fa15dabb4187 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f075043273ab1dcb30c5d030d445fa15dabb4187 Author: Piotr Caban Date: Thu Sep 24 16:16:02 2015 +0200 msvcrt: Use create_locinfo helper in setlocale implementation. Signed-off-by: Piotr Caban --- dlls/msvcrt/locale.c | 120 +++++++++++++++++++++++++-------------------------- 1 file changed, 60 insertions(+), 60 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=f075043273ab1dcb30c5d030d445fa15dabb4187 From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Piotr Caban : msvcrt: Only create locale categories that have changed in setlocale function. Message-ID: Module: wine Branch: master Commit: f9bae3e5a27c56a02378cd1348dbb1cea57b5dc5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f9bae3e5a27c56a02378cd1348dbb1cea57b5dc5 Author: Piotr Caban Date: Thu Sep 24 16:16:16 2015 +0200 msvcrt: Only create locale categories that have changed in setlocale function. Signed-off-by: Piotr Caban --- dlls/msvcrt/locale.c | 434 ++++++++++++++++++++++++++++----------------------- 1 file changed, 236 insertions(+), 198 deletions(-) Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=f9bae3e5a27c56a02378cd1348dbb1cea57b5dc5 From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Andrew Eikum : xaudio2: Fix mmdevapi buffer size calculation. Message-ID: Module: wine Branch: master Commit: 2decbcc05f62dd58cfe978a7f1edc187b74f72dc URL: http://source.winehq.org/git/wine.git/?a=commit;h=2decbcc05f62dd58cfe978a7f1edc187b74f72dc Author: Andrew Eikum Date: Thu Sep 24 14:33:05 2015 -0500 xaudio2: Fix mmdevapi buffer size calculation. Signed-off-by: Andrew Eikum --- dlls/xaudio2_7/xaudio_dll.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index ccbcd21..4f8c76b 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -1798,7 +1798,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface, HRESULT hr; WAVEFORMATEX *fmt; ALCint attrs[7]; - REFERENCE_TIME period; + REFERENCE_TIME period, bufdur; TRACE("(%p)->(%p, %u, %u, 0x%x, %s, %p, 0x%x)\n", This, ppMasteringVoice, inputChannels, inputSampleRate, flags, @@ -1885,18 +1885,21 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface, CoTaskMemFree(fmt); - hr = IAudioClient_Initialize(This->aclient, AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_STREAMFLAGS_EVENTCALLBACK, inputSampleRate /* 1s buffer */, - 0, &This->fmt.Format, NULL); + hr = IAudioClient_GetDevicePeriod(This->aclient, &period, NULL); if(FAILED(hr)){ - WARN("Initialize failed: %08x\n", hr); + WARN("GetDevicePeriod failed: %08x\n", hr); hr = XAUDIO2_E_DEVICE_INVALIDATED; goto exit; } - hr = IAudioClient_GetDevicePeriod(This->aclient, &period, NULL); + /* 3 periods or 0.1 seconds */ + bufdur = max(3 * period, 1000000); + + hr = IAudioClient_Initialize(This->aclient, AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_STREAMFLAGS_EVENTCALLBACK, bufdur, + 0, &This->fmt.Format, NULL); if(FAILED(hr)){ - WARN("GetDevicePeriod failed: %08x\n", hr); + WARN("Initialize failed: %08x\n", hr); hr = XAUDIO2_E_DEVICE_INVALIDATED; goto exit; } From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Andrew Eikum : xaudio2: Don't report mid-buffer positions. Message-ID: Module: wine Branch: master Commit: 80be4dad87c38d706979b7f457762458171af12f URL: http://source.winehq.org/git/wine.git/?a=commit;h=80be4dad87c38d706979b7f457762458171af12f Author: Andrew Eikum Date: Thu Sep 24 14:34:14 2015 -0500 xaudio2: Don't report mid-buffer positions. Signed-off-by: Andrew Eikum --- dlls/xaudio2_7/xaudio_dll.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index 4f8c76b..5c67ffb 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -776,13 +776,9 @@ static void WINAPI XA2SRC_GetState(IXAudio2SourceVoice *iface, EnterCriticalSection(&This->lock); - if(!(Flags & XAUDIO2_VOICE_NOSAMPLESPLAYED)){ - ALint bufpos = 0; - - alGetSourcei(This->al_src, AL_SAMPLE_OFFSET, &bufpos); - - pVoiceState->SamplesPlayed = This->played_frames + bufpos; - }else + if(!(Flags & XAUDIO2_VOICE_NOSAMPLESPLAYED)) + pVoiceState->SamplesPlayed = This->played_frames; + else pVoiceState->SamplesPlayed = 0; if(This->nbufs) From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Andrew Eikum : xaudio2: Implement IXAudio2SourceVoice frequency functions. Message-ID: Module: wine Branch: master Commit: eae93c1f412c9c55ac6319938fdf15444b8e7a74 URL: http://source.winehq.org/git/wine.git/?a=commit;h=eae93c1f412c9c55ac6319938fdf15444b8e7a74 Author: Andrew Eikum Date: Fri Sep 25 12:39:40 2015 -0500 xaudio2: Implement IXAudio2SourceVoice frequency functions. Signed-off-by: Andrew Eikum --- dlls/xaudio2_7/tests/xaudio2.c | 8 ++++++++ dlls/xaudio2_7/xaudio_dll.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/dlls/xaudio2_7/tests/xaudio2.c b/dlls/xaudio2_7/tests/xaudio2.c index aabb70e..e8f4fbc 100644 --- a/dlls/xaudio2_7/tests/xaudio2.c +++ b/dlls/xaudio2_7/tests/xaudio2.c @@ -467,6 +467,14 @@ static void test_buffer_callbacks(IXAudio2 *xa) XA2CALL_0(StartEngine); ok(hr == S_OK, "StartEngine failed: %08x\n", hr); + if(xaudio27){ + hr = IXAudio27SourceVoice_SetSourceSampleRate((IXAudio27SourceVoice*)src, 48000); + todo_wine ok(hr == S_OK, "SetSourceSampleRate failed: %08x\n", hr); + }else{ + hr = IXAudio2SourceVoice_SetSourceSampleRate(src, 48000); + ok(hr == XAUDIO2_E_INVALID_CALL, "SetSourceSampleRate should have failed: %08x\n", hr); + } + while(1){ if(xaudio27) IXAudio27SourceVoice_GetState((IXAudio27SourceVoice*)src, &state); diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index 5c67ffb..8b41cbb 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -797,14 +797,32 @@ static HRESULT WINAPI XA2SRC_SetFrequencyRatio(IXAudio2SourceVoice *iface, float Ratio, UINT32 OperationSet) { XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface); + ALfloat r; + TRACE("%p, %f, 0x%x\n", This, Ratio, OperationSet); + + if(Ratio < XAUDIO2_MIN_FREQ_RATIO) + r = XAUDIO2_MIN_FREQ_RATIO; + else if (Ratio > XAUDIO2_MAX_FREQ_RATIO) + r = XAUDIO2_MAX_FREQ_RATIO; + else + r = Ratio; + + alSourcef(This->al_src, AL_PITCH, r); + return S_OK; } static void WINAPI XA2SRC_GetFrequencyRatio(IXAudio2SourceVoice *iface, float *pRatio) { + ALfloat ratio; XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface); + TRACE("%p, %p\n", This, pRatio); + + alGetSourcef(This->al_src, AL_PITCH, &ratio); + + *pRatio = ratio; } static HRESULT WINAPI XA2SRC_SetSourceSampleRate( @@ -812,7 +830,20 @@ static HRESULT WINAPI XA2SRC_SetSourceSampleRate( UINT32 NewSourceSampleRate) { XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface); + TRACE("%p, %u\n", This, NewSourceSampleRate); + + EnterCriticalSection(&This->lock); + + if(This->nbufs){ + LeaveCriticalSection(&This->lock); + return XAUDIO2_E_INVALID_CALL; + } + + This->fmt->nSamplesPerSec = NewSourceSampleRate; + + LeaveCriticalSection(&This->lock); + return S_OK; } From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Sebastian Lackner : xaudio2_7/tests: Remove duplicate call to test_DeviceDetails. Message-ID: Module: wine Branch: master Commit: 9bb215979c8c23dc2956fbb13d082008f6dd8c0d URL: http://source.winehq.org/git/wine.git/?a=commit;h=9bb215979c8c23dc2956fbb13d082008f6dd8c0d Author: Sebastian Lackner Date: Thu Sep 24 22:01:51 2015 +0200 xaudio2_7/tests: Remove duplicate call to test_DeviceDetails. Signed-off-by: Sebastian Lackner --- dlls/xaudio2_7/tests/xaudio2.c | 1 - 1 file changed, 1 deletion(-) diff --git a/dlls/xaudio2_7/tests/xaudio2.c b/dlls/xaudio2_7/tests/xaudio2.c index e8f4fbc..2cea7af 100644 --- a/dlls/xaudio2_7/tests/xaudio2.c +++ b/dlls/xaudio2_7/tests/xaudio2.c @@ -775,7 +775,6 @@ START_TEST(xaudio2) has_devices = test_DeviceDetails(xa27); if(has_devices){ - test_DeviceDetails(xa27); test_simple_streaming((IXAudio2*)xa27); test_buffer_callbacks((IXAudio2*)xa27); test_looping((IXAudio2*)xa27); From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Huw Davies : fonts: Fix the version in the name table to match the Version : line. Message-ID: Module: wine Branch: master Commit: c51aee637b7f15853218f719426ba6ff0d275a13 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c51aee637b7f15853218f719426ba6ff0d275a13 Author: Huw Davies Date: Fri Sep 25 16:05:10 2015 +0100 fonts: Fix the version in the name table to match the Version: line. The (not so) recently updated fontforge parses the name table for this in preference to the Version: line. Signed-off-by: Huw Davies --- fonts/symbol.sfd | 2 +- fonts/symbol.ttf | Bin 26040 -> 26028 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/fonts/symbol.sfd b/fonts/symbol.sfd index f77a64b..f5b8bee 100644 --- a/fonts/symbol.sfd +++ b/fonts/symbol.sfd @@ -71,7 +71,7 @@ ShortTable: maxp 16 0 0 EndShort -LangName: 1033 "" "" "Regular" "WineSymbol:Version 0.001" "" "Version 0.001 February 3, 2009, initial release" "" "" "Wine" "Jon Parshall for CodeWeavers" "" "http://www.winehq.org" "http://www.codeweavers.com" "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.+AAoACgAA-This program 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.+AAoACgAA-A copy of the GNU Lesser General Public License is included in the Wine distribution in the file COPYING.LIB. If you did not receive this copy, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA." "http://www.gnu.org/licenses/lgpl.html" +LangName: 1033 "" "" "Regular" "WineSymbol:Version 1.1" "" "Version 1.1 February 3, 2009, initial release" "" "" "Wine" "Jon Parshall for CodeWeavers" "" "http://www.winehq.org" "http://www.codeweavers.com" "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.+AAoACgAA-This program 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.+AAoACgAA-A copy of the GNU Lesser General Public License is included in the Wine distribution in the file COPYING.LIB. If you did not receive this copy, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA." "http://www.gnu.org/licenses/lgpl.html" GaspTable: 1 65535 2 0 Encoding: Custom UnicodeInterp: none diff --git a/fonts/symbol.ttf b/fonts/symbol.ttf index 0f3313b..1fd5b4e 100644 Binary files a/fonts/symbol.ttf and b/fonts/symbol.ttf differ From julliard at wine.codeweavers.com Fri Sep 25 15:22:02 2015 From: julliard at wine.codeweavers.com (Alexandre Julliard) Date: Fri, 25 Sep 2015 15:22:02 -0500 Subject: Jared Smudde : winemine: Load main icon in the about window. Message-ID: Module: wine Branch: master Commit: 3966affe064c7b98a7b4c052b6a6696fe74c8830 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3966affe064c7b98a7b4c052b6a6696fe74c8830 Author: Jared Smudde Date: Thu Sep 24 21:13:46 2015 -0500 winemine: Load main icon in the about window. --- programs/winemine/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/winemine/main.c b/programs/winemine/main.c index 91b2092..7ccae07 100644 --- a/programs/winemine/main.c +++ b/programs/winemine/main.c @@ -1003,7 +1003,7 @@ static LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara LoadStringW( board.hInst, IDS_APPNAME, appname, sizeof(appname)/sizeof(WCHAR) ); LoadStringW( board.hInst, IDS_ABOUT, other, sizeof(other)/sizeof(WCHAR) ); ShellAboutW( hWnd, appname, other, - LoadImageA( board.hInst, "WINEMINE", IMAGE_ICON, 48, 48, LR_SHARED )); + LoadImageW(board.hInst, MAKEINTRESOURCEW(IDI_WINEMINE), IMAGE_ICON, 48, 48, LR_SHARED)); return 0; } default: