From: Aaryaman Vasishta Subject: [PATCH 7/7] d3drm: Implement IDirect3DRM*::LoadTexture. (v5 resend) Message-Id: <1463174497-50916-7-git-send-email-jem456.vasishta@gmail.com> Date: Sat, 14 May 2016 02:51:37 +0530 In-Reply-To: <1463174497-50916-1-git-send-email-jem456.vasishta@gmail.com> References: <1463174497-50916-1-git-send-email-jem456.vasishta@gmail.com> Signed-off-by: Aaryaman Vasishta --- dlls/d3drm/d3drm.c | 27 ++++++++++++++++++++++----- dlls/d3drm/tests/d3drm.c | 33 +++++++++++++-------------------- dlls/d3drm/texture.c | 3 +-- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index eeda666..bf3341e 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -417,11 +417,17 @@ static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface, { HRESULT hr; - FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture); + TRACE("iface %p, filename %s, texture %p.\n", iface, debugstr_a(filename), texture); if (FAILED(hr = IDirect3DRM_CreateObject(iface, &CLSID_CDirect3DRMTexture, NULL, &IID_IDirect3DRMTexture, (void **)texture))) return hr; + if (FAILED(hr = IDirect3DRMTexture_InitFromFile(*texture, filename))) + { + IDirect3DRMTexture_Release(*texture); + return hr; + } + return D3DRM_OK; } @@ -858,14 +864,19 @@ static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface, static HRESULT WINAPI d3drm2_LoadTexture(IDirect3DRM2 *iface, const char *filename, IDirect3DRMTexture2 **texture) { + struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); + IDirect3DRMTexture3 *texture3; HRESULT hr; - FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture); + TRACE("iface %p, filename %s, texture %p.\n", iface, debugstr_a(filename), texture); - if (FAILED(hr = IDirect3DRM2_CreateObject(iface, &CLSID_CDirect3DRMTexture, NULL, &IID_IDirect3DRMTexture2, (void **)texture))) + if (FAILED(hr = IDirect3DRM3_LoadTexture(&d3drm->IDirect3DRM3_iface, filename, &texture3))) return hr; - return D3DRM_OK; + hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture); + IDirect3DRMTexture3_Release(texture3); + + return hr; } static HRESULT WINAPI d3drm2_LoadTextureFromResource(IDirect3DRM2 *iface, HMODULE module, @@ -1401,11 +1412,17 @@ static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface, { HRESULT hr; - FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture); + TRACE("iface %p, filename %s, texture %p.\n", iface, debugstr_a(filename), texture); if (FAILED(hr = IDirect3DRM3_CreateObject(iface, &CLSID_CDirect3DRMTexture, NULL, &IID_IDirect3DRMTexture3, (void **)texture))) return hr; + if (FAILED(hr = IDirect3DRMTexture3_InitFromFile(*texture, filename))) + { + IDirect3DRMTexture3_Release(*texture); + return hr; + } + return D3DRM_OK; } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 93c4093..bf5edfa 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -4540,18 +4540,16 @@ static void test_load_texture(void) hr = IDirect3DRM_LoadTexture(d3drm1, filename, &texture1); ok(SUCCEEDED(hr), "Test %u: Failed to load texture, hr %#x.\n", i, hr); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 > ref1, "Test %u: expected ref2 > ref1, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); + ok(ref2 > ref1, "Test %u: expected ref2 > ref1, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); hr = IDirect3DRMTexture_InitFromFile(texture1, filename); - todo_wine ok(hr == D3DRMERR_BADOBJECT, "Test %u: Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", i, hr); + ok(hr == D3DRMERR_BADOBJECT, "Test %u: Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", i, hr); /* InitFromFile seems to AddRef IDirect3DRM even if it fails. */ - if (FAILED(hr)) - IDirect3DRM_Release(d3drm1); + IDirect3DRM_Release(d3drm1); d3drm_img = IDirect3DRMTexture_GetImage(texture1); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); - if (d3drm_img) - test_bitmap_data(i * 7, d3drm_img, FALSE, tests[i].w, tests[i].h, tests[i].palettized); + test_bitmap_data(i * 7, d3drm_img, FALSE, tests[i].w, tests[i].h, tests[i].palettized); IDirect3DRMTexture_Release(texture1); ref2 = get_refcount((IUnknown *)d3drm1); ok(ref1 == ref2, "Test %u: expected ref1 == ref2, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); @@ -4567,17 +4565,15 @@ static void test_load_texture(void) hr = IDirect3DRM2_LoadTexture(d3drm2, filename, &texture2); ok(SUCCEEDED(hr), "Test %u: Failed to load texture, hr %#x.\n", i, hr); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 > ref1, "Test %u: expected ref2 > ref1, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); + ok(ref2 > ref1, "Test %u: expected ref2 > ref1, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); hr = IDirect3DRMTexture2_InitFromFile(texture2, filename); - todo_wine ok(hr == D3DRMERR_BADOBJECT, "Test %u: Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", i, hr); - if (FAILED(hr)) - IDirect3DRM_Release(d3drm1); + ok(hr == D3DRMERR_BADOBJECT, "Test %u: Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", i, hr); + IDirect3DRM_Release(d3drm1); d3drm_img = IDirect3DRMTexture2_GetImage(texture2); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); - if (d3drm_img) - test_bitmap_data(i * 7 + 2, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); + test_bitmap_data(i * 7 + 2, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); IDirect3DRMTexture2_Release(texture2); ref2 = get_refcount((IUnknown *)d3drm1); ok(ref1 == ref2, "Test %u: expected ref1 == ref2, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); @@ -4593,25 +4589,22 @@ static void test_load_texture(void) hr = IDirect3DRM3_LoadTexture(d3drm3, filename, &texture3); ok(SUCCEEDED(hr), "Test %u: Failed to load texture, hr %#x.\n", i, hr); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 > ref1, "Test %u: expected ref2 > ref1, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); + ok(ref2 > ref1, "Test %u: expected ref2 > ref1, got ref1 = %u, ref2 = %u.\n", i, ref1, ref2); hr = IDirect3DRMTexture3_InitFromFile(texture3, filename); - todo_wine ok(hr == D3DRMERR_BADOBJECT, "Test %u: Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", i, hr); - if (FAILED(hr)) - IDirect3DRM_Release(d3drm1); + ok(hr == D3DRMERR_BADOBJECT, "Test %u: Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", i, hr); + IDirect3DRM_Release(d3drm1); d3drm_img = IDirect3DRMTexture3_GetImage(texture3); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); - if (d3drm_img) - test_bitmap_data(i * 7 + 4, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); + test_bitmap_data(i * 7 + 4, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); /* Test whether querying a version 1 texture from version 3 causes a * change in the loading behavior. */ hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)&texture1); ok(SUCCEEDED(hr), "Failed to get IDirect3DRMTexture interface, hr %#x.\n", hr); d3drm_img = IDirect3DRMTexture_GetImage(texture1); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); - if (d3drm_img) - test_bitmap_data(i * 7 + 5, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); + test_bitmap_data(i * 7 + 5, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); IDirect3DRMTexture_Release(texture1); IDirect3DRMTexture3_Release(texture3); ref2 = get_refcount((IUnknown *)d3drm1); diff --git a/dlls/d3drm/texture.c b/dlls/d3drm/texture.c index 5890b91..46b2107 100644 --- a/dlls/d3drm/texture.c +++ b/dlls/d3drm/texture.c @@ -1296,8 +1296,7 @@ static HRESULT WINAPI d3drm_texture3_InitFromImage(IDirect3DRMTexture3 *iface, D return D3DRMERR_BADOBJECT; /* d3drm intentionally leaks a reference to IDirect3DRM here if texture has already been initialized. */ - if (texture->d3drm) - IDirect3DRM_AddRef(texture->d3drm); + IDirect3DRM_AddRef(texture->d3drm); if (texture->image) return D3DRMERR_BADOBJECT; -- 2.3.2 (Apple Git-55)