From 1fd88b38856cbaee4087281511c807f110c97c97 Mon Sep 17 00:00:00 2001 From: Aaryaman Vasishta Date: Thu, 25 Oct 2018 14:11:29 +0330 Subject: [PATCH] d3drm: Implement d3drm*_LoadTexture(). Signed-off-by: Aaryaman Vasishta Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d3drm/d3drm.c | 40 ++++++++++++++++++++---- dlls/d3drm/tests/d3drm.c | 66 ++++++++++++++++------------------------ 2 files changed, 61 insertions(+), 45 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index 3ea16327bfc..d0f20235a8f 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -638,12 +638,24 @@ static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface, struct d3drm_texture *object; 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 (!texture) + return D3DRMERR_BADVALUE; if (FAILED(hr = d3drm_texture_create(&object, iface))) return hr; *texture = &object->IDirect3DRMTexture_iface; + if (FAILED(hr = IDirect3DRMTexture_InitFromFile(*texture, filename))) + { + IDirect3DRMTexture_Release(*texture); + *texture = NULL; + if (!filename) + return D3DRMERR_BADVALUE; + + return hr == D3DRMERR_BADOBJECT ? D3DRMERR_FILENOTFOUND : hr; + } return D3DRM_OK; } @@ -1143,15 +1155,22 @@ static HRESULT WINAPI d3drm2_LoadTexture(IDirect3DRM2 *iface, const char *filename, IDirect3DRMTexture2 **texture) { struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); - struct d3drm_texture *object; + 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 = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface))) + if (!texture) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = IDirect3DRM3_LoadTexture(&d3drm->IDirect3DRM3_iface, filename, &texture3))) + { + *texture = NULL; return hr; + } - *texture = &object->IDirect3DRMTexture2_iface; + hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture); + IDirect3DRMTexture3_Release(texture3); return hr; } @@ -1818,12 +1837,21 @@ static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface, struct d3drm_texture *object; 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 (!texture) + return D3DRMERR_BADVALUE; if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface))) return hr; *texture = &object->IDirect3DRMTexture3_iface; + if (FAILED(hr = IDirect3DRMTexture3_InitFromFile(*texture, filename))) + { + IDirect3DRMTexture3_Release(*texture); + *texture = NULL; + return hr == D3DRMERR_BADOBJECT ? D3DRMERR_FILENOTFOUND : hr; + } return D3DRM_OK; } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 91ee68ca435..5157952d63d 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -5601,45 +5601,36 @@ static void test_load_texture(void) /* Test all failures together. */ texture1 = (IDirect3DRMTexture *)0xdeadbeef; hr = IDirect3DRM_LoadTexture(d3drm1, NULL, &texture1); - todo_wine ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); - todo_wine ok(!texture1, "Got unexpected texture %p.\n", texture1); + ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); + ok(!texture1, "Got unexpected texture %p.\n", texture1); texture1 = (IDirect3DRMTexture *)0xdeadbeef; hr = IDirect3DRM_LoadTexture(d3drm1, "", &texture1); - todo_wine ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); - todo_wine ok(!texture1, "Got unexpected texture %p.\n", texture1); - if (hr == D3DRMERR_FILENOTFOUND) - { - hr = IDirect3DRM_LoadTexture(d3drm1, NULL, NULL); - ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); - } + ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); + ok(!texture1, "Got unexpected texture %p.\n", texture1); + hr = IDirect3DRM_LoadTexture(d3drm1, NULL, NULL); + ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); texture2 = (IDirect3DRMTexture2 *)0xdeadbeef; hr = IDirect3DRM2_LoadTexture(d3drm2, NULL, &texture2); - todo_wine ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); - todo_wine ok(!texture2, "Got unexpected texture %p.\n", texture2); + ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); + ok(!texture2, "Got unexpected texture %p.\n", texture2); texture2 = (IDirect3DRMTexture2 *)0xdeadbeef; hr = IDirect3DRM2_LoadTexture(d3drm2, "", &texture2); - todo_wine ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); - todo_wine ok(!texture2, "Got unexpected texture %p.\n", texture2); - if (hr == D3DRMERR_FILENOTFOUND) - { - hr = IDirect3DRM2_LoadTexture(d3drm2, NULL, NULL); - ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); - } + ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); + ok(!texture2, "Got unexpected texture %p.\n", texture2); + hr = IDirect3DRM2_LoadTexture(d3drm2, NULL, NULL); + ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); texture3 = (IDirect3DRMTexture3 *)0xdeadbeef; hr = IDirect3DRM3_LoadTexture(d3drm3, NULL, &texture3); - todo_wine ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); - todo_wine ok(!texture3, "Got unexpected texture %p.\n", texture3); + ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); + ok(!texture3, "Got unexpected texture %p.\n", texture3); texture3 = (IDirect3DRMTexture3 *)0xdeadbeef; hr = IDirect3DRM_LoadTexture(d3drm3, "", &texture3); - todo_wine ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); - todo_wine ok(!texture3, "Got unexpected texture %p.\n", texture3); - if (hr == D3DRMERR_FILENOTFOUND) - { - hr = IDirect3DRM3_LoadTexture(d3drm3, NULL, NULL); - ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); - } + ok(hr == D3DRMERR_FILENOTFOUND, "Got unexpected hr %#x.\n", hr); + ok(!texture3, "Got unexpected texture %p.\n", texture3); + hr = IDirect3DRM3_LoadTexture(d3drm3, NULL, NULL); + ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(tests); ++i) { @@ -5648,13 +5639,12 @@ 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: Got unexpected hr %#x.\n", i, hr); + ok(hr == D3DRMERR_BADOBJECT, "Test %u: Got unexpected hr %#x.\n", i, hr); /* InitFromFile() seems to AddRef() IDirect3DRM even if it fails. */ - if (hr == D3DRMERR_BADOBJECT) - IDirect3DRM_Release(d3drm1); + IDirect3DRM_Release(d3drm1); d3drm_img = IDirect3DRMTexture_GetImage(texture1); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); test_bitmap_data(i * 7, d3drm_img, FALSE, tests[i].w, tests[i].h, tests[i].palettized); @@ -5678,12 +5668,11 @@ 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: Got unexpected hr %#x.\n", i, hr); - if (hr == D3DRMERR_BADOBJECT) - IDirect3DRM_Release(d3drm1); + ok(hr == D3DRMERR_BADOBJECT, "Test %u: Got unexpected hr %#x.\n", i, hr); + IDirect3DRM_Release(d3drm1); d3drm_img = IDirect3DRMTexture2_GetImage(texture2); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); test_bitmap_data(i * 7 + 2, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized); @@ -5707,12 +5696,11 @@ 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: Got unexpected hr %#x.\n", i, hr); - if (hr == D3DRMERR_BADOBJECT) - IDirect3DRM_Release(d3drm1); + ok(hr == D3DRMERR_BADOBJECT, "Test %u: Got unexpected hr %#x.\n", i, hr); + IDirect3DRM_Release(d3drm1); d3drm_img = IDirect3DRMTexture3_GetImage(texture3); ok(!!d3drm_img, "Test %u: Failed to get image.\n", i); test_bitmap_data(i * 7 + 4, d3drm_img, TRUE, tests[i].w, tests[i].h, tests[i].palettized);