[D3DRM] Sync with Wine Staging 1.9.11. CORE-11368

svn path=/trunk/; revision=71757
This commit is contained in:
Amine Khaldi 2016-07-02 15:33:46 +00:00
parent 2115bc3365
commit a8ea8a5e22
7 changed files with 386 additions and 84 deletions

View file

@ -3,6 +3,7 @@
*
* Copyright 2010, 2012 Christian Costa
* Copyright 2011 André Hentschel
* Copyright 2016 Aaryaman Vasishta
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -127,10 +128,12 @@ static ULONG WINAPI d3drm1_Release(IDirect3DRM *iface)
static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
{
FIXME("iface %p, clsid %s, outer %p, iid %s, out %p stub!\n",
struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
return E_NOTIMPL;
return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
}
static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
@ -181,9 +184,25 @@ static HRESULT WINAPI d3drm1_CreateAnimationSet(IDirect3DRM *iface, IDirect3DRMA
static HRESULT WINAPI d3drm1_CreateTexture(IDirect3DRM *iface,
D3DRMIMAGE *image, IDirect3DRMTexture **texture)
{
FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture);
struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
IDirect3DRMTexture3 *texture3;
HRESULT hr;
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture, (IUnknown **)texture);
TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
if (!texture)
return D3DRMERR_BADVALUE;
if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
{
*texture = NULL;
return hr;
}
hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture);
IDirect3DRMTexture3_Release(texture3);
return hr;
}
static HRESULT WINAPI d3drm1_CreateLight(IDirect3DRM *iface,
@ -391,17 +410,33 @@ static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface,
static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface,
const char *filename, IDirect3DRMTexture **texture)
{
struct d3drm_texture *object;
HRESULT hr;
FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture, (IUnknown **)texture);
if (FAILED(hr = d3drm_texture_create(&object, iface)))
return hr;
*texture = &object->IDirect3DRMTexture_iface;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm1_LoadTextureFromResource(IDirect3DRM *iface,
HRSRC resource, IDirect3DRMTexture **texture)
{
struct d3drm_texture *object;
HRESULT hr;
FIXME("iface %p, resource %p, texture %p stub!\n", iface, resource, texture);
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture, (IUnknown **)texture);
if (FAILED(hr = d3drm_texture_create(&object, iface)))
return hr;
*texture = &object->IDirect3DRMTexture_iface;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm1_SetSearchPath(IDirect3DRM *iface, const char *path)
@ -567,10 +602,12 @@ static ULONG WINAPI d3drm2_Release(IDirect3DRM2 *iface)
static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
{
FIXME("iface %p, clsid %s, outer %p, iid %s, out %p stub!\n",
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
return E_NOTIMPL;
return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
}
static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
@ -621,9 +658,25 @@ static HRESULT WINAPI d3drm2_CreateAnimationSet(IDirect3DRM2 *iface, IDirect3DRM
static HRESULT WINAPI d3drm2_CreateTexture(IDirect3DRM2 *iface,
D3DRMIMAGE *image, IDirect3DRMTexture2 **texture)
{
FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture);
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
IDirect3DRMTexture3 *texture3;
HRESULT hr;
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture2, (IUnknown **)texture);
TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
if (!texture)
return D3DRMERR_BADVALUE;
if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
{
*texture = NULL;
return hr;
}
hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture);
IDirect3DRMTexture3_Release(texture3);
return hr;
}
static HRESULT WINAPI d3drm2_CreateLight(IDirect3DRM2 *iface,
@ -809,18 +862,36 @@ 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);
struct d3drm_texture *object;
HRESULT hr;
FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture2, (IUnknown **)texture);
if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
return hr;
*texture = &object->IDirect3DRMTexture2_iface;
return hr;
}
static HRESULT WINAPI d3drm2_LoadTextureFromResource(IDirect3DRM2 *iface, HMODULE module,
const char *resource_name, const char *resource_type, IDirect3DRMTexture2 **texture)
{
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
struct d3drm_texture *object;
HRESULT hr;
FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
iface, debugstr_a(resource_name), debugstr_a(resource_type), texture);
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture2, (IUnknown **)texture);
if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
return hr;
*texture = &object->IDirect3DRMTexture2_iface;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm2_SetSearchPath(IDirect3DRM2 *iface, const char *path)
@ -994,10 +1065,51 @@ static ULONG WINAPI d3drm3_Release(IDirect3DRM3 *iface)
static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
{
FIXME("iface %p, clsid %s, outer %p, iid %s, out %p stub!\n",
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
IUnknown *object;
HRESULT hr;
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
return E_NOTIMPL;
if (!out)
return D3DRMERR_BADVALUE;
if (!clsid || !iid)
{
*out = NULL;
return D3DRMERR_BADVALUE;
}
if (outer)
{
FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer);
*out = NULL;
return E_NOTIMPL;
}
if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture))
{
struct d3drm_texture *texture;
if (FAILED(hr = d3drm_texture_create(&texture, &d3drm->IDirect3DRM_iface)))
{
*out = NULL;
return hr;
}
object = (IUnknown *)&texture->IDirect3DRMTexture3_iface;
}
else
{
FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
*out = NULL;
return CLASSFACTORY_E_FIRST;
}
if (FAILED(hr = IUnknown_QueryInterface(object, iid, out)))
*out = NULL;
IUnknown_Release(object);
return hr;
}
static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
@ -1046,9 +1158,28 @@ static HRESULT WINAPI d3drm3_CreateAnimationSet(IDirect3DRM3 *iface, IDirect3DRM
static HRESULT WINAPI d3drm3_CreateTexture(IDirect3DRM3 *iface,
D3DRMIMAGE *image, IDirect3DRMTexture3 **texture)
{
FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture);
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
struct d3drm_texture *object;
HRESULT hr;
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture3, (IUnknown **)texture);
TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
if (!texture)
return D3DRMERR_BADVALUE;
if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
return hr;
*texture = &object->IDirect3DRMTexture3_iface;
if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture, image)))
{
IDirect3DRMTexture3_Release(*texture);
*texture = NULL;
return D3DRMERR_BADVALUE;
}
return D3DRM_OK;
}
static HRESULT WINAPI d3drm3_CreateLight(IDirect3DRM3 *iface,
@ -1284,18 +1415,36 @@ static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,
static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface,
const char *filename, IDirect3DRMTexture3 **texture)
{
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
struct d3drm_texture *object;
HRESULT hr;
FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture3, (IUnknown **)texture);
if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
return hr;
*texture = &object->IDirect3DRMTexture3_iface;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm3_LoadTextureFromResource(IDirect3DRM3 *iface, HMODULE module,
const char *resource_name, const char *resource_type, IDirect3DRMTexture3 **texture)
{
struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
struct d3drm_texture *object;
HRESULT hr;
FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
iface, module, debugstr_a(resource_name), debugstr_a(resource_type), texture);
return Direct3DRMTexture_create(&IID_IDirect3DRMTexture3, (IUnknown **)texture);
if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
return hr;
*texture = &object->IDirect3DRMTexture3_iface;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm3_SetSearchPath(IDirect3DRM3 *iface, const char *path)

View file

@ -34,3 +34,67 @@ BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, void *reserved)
}
return TRUE;
}
void d3drm_object_init(struct d3drm_object *object)
{
object->ref = 1;
object->appdata = 0;
list_init(&object->destroy_callbacks);
}
struct destroy_callback
{
struct list entry;
D3DRMOBJECTCALLBACK cb;
void *ctx;
};
HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx)
{
struct destroy_callback *callback;
if (!cb)
return D3DRMERR_BADVALUE;
callback = HeapAlloc(GetProcessHeap(), 0, sizeof(*callback));
if (!callback)
return E_OUTOFMEMORY;
callback->cb = cb;
callback->ctx = ctx;
list_add_head(&object->destroy_callbacks, &callback->entry);
return D3DRM_OK;
}
HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx)
{
struct destroy_callback *callback;
if (!cb)
return D3DRMERR_BADVALUE;
LIST_FOR_EACH_ENTRY(callback, &object->destroy_callbacks, struct destroy_callback, entry)
{
if (callback->cb == cb && callback->ctx == ctx)
{
list_remove(&callback->entry);
HeapFree(GetProcessHeap(), 0, callback);
break;
}
}
return D3DRM_OK;
}
void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object)
{
struct destroy_callback *callback, *callback2;
LIST_FOR_EACH_ENTRY_SAFE(callback, callback2, &object->destroy_callbacks, struct destroy_callback, entry)
{
callback->cb(iface, callback->ctx);
list_remove(&callback->entry);
HeapFree(GetProcessHeap(), 0, callback);
}
}

View file

@ -38,9 +38,33 @@
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
#include "wine/list.h"
struct d3drm_device;
struct d3drm_object
{
LONG ref;
DWORD appdata;
struct list destroy_callbacks;
};
struct d3drm_texture
{
struct d3drm_object obj;
IDirect3DRMTexture IDirect3DRMTexture_iface;
IDirect3DRMTexture2 IDirect3DRMTexture2_iface;
IDirect3DRMTexture3 IDirect3DRMTexture3_iface;
IDirect3DRM *d3drm;
D3DRMIMAGE *image;
};
void d3drm_object_init(struct d3drm_object *object) DECLSPEC_HIDDEN;
HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object) DECLSPEC_HIDDEN;
HRESULT d3drm_device_create(struct d3drm_device **out) DECLSPEC_HIDDEN;
HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
IDirect3DRMDevice *IDirect3DRMDevice_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
IDirect3DRMDevice2 *IDirect3DRMDevice2_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
IDirect3DRMDevice3 *IDirect3DRMDevice3_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
@ -51,7 +75,6 @@ HRESULT Direct3DRMMesh_create(IDirect3DRMMesh** obj) DECLSPEC_HIDDEN;
HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN;
HRESULT Direct3DRMViewport_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN;
HRESULT Direct3DRMMaterial_create(IDirect3DRMMaterial2** ret_iface) DECLSPEC_HIDDEN;
HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown** ret_iface) DECLSPEC_HIDDEN;
HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *data,
D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN;

View file

@ -1056,7 +1056,7 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData,
return hr;
}
TRACE("Mesh name is '%s'\n", This->name ? This->name : "");
TRACE("Mesh name is %s\n", debugstr_a(This->name));
This->nb_normals = 0;
@ -1149,6 +1149,7 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData,
IDirectXFileObject *child;
DWORD i = 0;
float* values;
struct d3drm_texture *texture_object;
TRACE("Process MeshMaterialList\n");
@ -1286,13 +1287,12 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData,
if (file != INVALID_HANDLE_VALUE)
{
CloseHandle(file);
hr = Direct3DRMTexture_create(&IID_IDirect3DRMTexture3, (IUnknown**)&This->materials[i].texture);
if (FAILED(hr))
if (FAILED(hr = d3drm_texture_create(&texture_object, NULL)))
{
IDirectXFileData_Release(data);
goto end;
}
This->materials[i].texture = &texture_object->IDirect3DRMTexture3_iface;
}
}
}

View file

@ -20,15 +20,6 @@
#include "d3drm_private.h"
struct d3drm_texture
{
IDirect3DRMTexture IDirect3DRMTexture_iface;
IDirect3DRMTexture2 IDirect3DRMTexture2_iface;
IDirect3DRMTexture3 IDirect3DRMTexture3_iface;
LONG ref;
DWORD app_data;
};
static inline struct d3drm_texture *impl_from_IDirect3DRMTexture(IDirect3DRMTexture *iface)
{
return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture_iface);
@ -44,6 +35,31 @@ static inline struct d3drm_texture *impl_from_IDirect3DRMTexture3(IDirect3DRMTex
return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture3_iface);
}
static void d3drm_texture_destroy(struct d3drm_texture *texture)
{
TRACE("texture %p is being destroyed.\n", texture);
d3drm_object_cleanup((IDirect3DRMObject*)&texture->IDirect3DRMTexture3_iface, &texture->obj);
if (texture->image)
IDirect3DRM_Release(texture->d3drm);
HeapFree(GetProcessHeap(), 0, texture);
}
static BOOL d3drm_validate_image(D3DRMIMAGE *image)
{
if (!image
|| !image->red_mask
|| !image->green_mask
|| !image->blue_mask
|| !image->buffer1
|| !(image->rgb || (image->palette && image->palette_size)))
{
return FALSE;
}
return TRUE;
}
static HRESULT WINAPI d3drm_texture1_QueryInterface(IDirect3DRMTexture *iface, REFIID riid, void **out)
{
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
@ -84,17 +100,21 @@ static HRESULT WINAPI d3drm_texture1_Clone(IDirect3DRMTexture *iface,
static HRESULT WINAPI d3drm_texture1_AddDestroyCallback(IDirect3DRMTexture *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return IDirect3DRMTexture3_AddDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
}
static HRESULT WINAPI d3drm_texture1_DeleteDestroyCallback(IDirect3DRMTexture *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return IDirect3DRMTexture3_DeleteDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
}
static HRESULT WINAPI d3drm_texture1_SetAppData(IDirect3DRMTexture *iface, DWORD data)
@ -380,17 +400,21 @@ static HRESULT WINAPI d3drm_texture2_Clone(IDirect3DRMTexture2 *iface,
static HRESULT WINAPI d3drm_texture2_AddDestroyCallback(IDirect3DRMTexture2 *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return IDirect3DRMTexture3_AddDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
}
static HRESULT WINAPI d3drm_texture2_DeleteDestroyCallback(IDirect3DRMTexture2 *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return IDirect3DRMTexture3_DeleteDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
}
static HRESULT WINAPI d3drm_texture2_SetAppData(IDirect3DRMTexture2 *iface, DWORD data)
@ -604,9 +628,11 @@ static D3DCOLOR WINAPI d3drm_texture2_GetDecalTransparentColor(IDirect3DRMTextur
static HRESULT WINAPI d3drm_texture2_InitFromImage(IDirect3DRMTexture2 *iface, D3DRMIMAGE *image)
{
FIXME("iface %p, image %p stub!\n", iface, image);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
return E_NOTIMPL;
TRACE("iface %p, image %p.\n", iface, image);
return IDirect3DRMTexture3_InitFromImage(&texture->IDirect3DRMTexture3_iface, image);
}
static HRESULT WINAPI d3drm_texture2_InitFromResource2(IDirect3DRMTexture2 *iface,
@ -699,7 +725,7 @@ static HRESULT WINAPI d3drm_texture3_QueryInterface(IDirect3DRMTexture3 *iface,
static ULONG WINAPI d3drm_texture3_AddRef(IDirect3DRMTexture3 *iface)
{
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
ULONG refcount = InterlockedIncrement(&texture->ref);
ULONG refcount = InterlockedIncrement(&texture->obj.ref);
TRACE("%p increasing refcount to %u.\n", iface, refcount);
@ -709,12 +735,12 @@ static ULONG WINAPI d3drm_texture3_AddRef(IDirect3DRMTexture3 *iface)
static ULONG WINAPI d3drm_texture3_Release(IDirect3DRMTexture3 *iface)
{
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
ULONG refcount = InterlockedDecrement(&texture->ref);
ULONG refcount = InterlockedDecrement(&texture->obj.ref);
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
if (!refcount)
HeapFree(GetProcessHeap(), 0, texture);
d3drm_texture_destroy(texture);
return refcount;
}
@ -730,17 +756,21 @@ static HRESULT WINAPI d3drm_texture3_Clone(IDirect3DRMTexture3 *iface,
static HRESULT WINAPI d3drm_texture3_AddDestroyCallback(IDirect3DRMTexture3 *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return d3drm_object_add_destroy_callback(&texture->obj, cb, ctx);
}
static HRESULT WINAPI d3drm_texture3_DeleteDestroyCallback(IDirect3DRMTexture3 *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return d3drm_object_delete_destroy_callback(&texture->obj, cb, ctx);
}
static HRESULT WINAPI d3drm_texture3_SetAppData(IDirect3DRMTexture3 *iface, DWORD data)
@ -749,7 +779,7 @@ static HRESULT WINAPI d3drm_texture3_SetAppData(IDirect3DRMTexture3 *iface, DWOR
TRACE("iface %p, data %#x.\n", iface, data);
texture->app_data = data;
texture->obj.appdata = data;
return D3DRM_OK;
}
@ -760,7 +790,7 @@ static DWORD WINAPI d3drm_texture3_GetAppData(IDirect3DRMTexture3 *iface)
TRACE("iface %p.\n", iface);
return texture->app_data;
return texture->obj.appdata;
}
static HRESULT WINAPI d3drm_texture3_SetName(IDirect3DRMTexture3 *iface, const char *name)
@ -781,7 +811,7 @@ static HRESULT WINAPI d3drm_texture3_GetClassName(IDirect3DRMTexture3 *iface, DW
{
TRACE("iface %p, size %p, name %p.\n", iface, size, name);
if (!size || *size < strlen("Texture") || !name)
if (!size || *size < sizeof("Texture") || !name)
return E_INVALIDARG;
strcpy(name, "Texture");
@ -885,9 +915,11 @@ static HRESULT WINAPI d3drm_texture3_GetDecalOrigin(IDirect3DRMTexture3 *iface,
static D3DRMIMAGE * WINAPI d3drm_texture3_GetImage(IDirect3DRMTexture3 *iface)
{
FIXME("iface %p stub!\n", iface);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
return NULL;
TRACE("iface %p.\n", iface);
return texture->image;
}
static DWORD WINAPI d3drm_texture3_GetShades(IDirect3DRMTexture3 *iface)
@ -927,9 +959,22 @@ static D3DCOLOR WINAPI d3drm_texture3_GetDecalTransparentColor(IDirect3DRMTextur
static HRESULT WINAPI d3drm_texture3_InitFromImage(IDirect3DRMTexture3 *iface, D3DRMIMAGE *image)
{
FIXME("iface %p, image %p stub!\n", iface, image);
struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
return E_NOTIMPL;
TRACE("iface %p, image %p.\n", iface, image);
if (!d3drm_validate_image(image))
return D3DRMERR_BADOBJECT;
/* d3drm intentionally leaks a reference to IDirect3DRM here if texture has already been initialized. */
IDirect3DRM_AddRef(texture->d3drm);
if (texture->image)
return D3DRMERR_BADOBJECT;
texture->image = image;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm_texture3_InitFromResource2(IDirect3DRMTexture3 *iface,
@ -1029,12 +1074,11 @@ static const struct IDirect3DRMTexture3Vtbl d3drm_texture3_vtbl =
d3drm_texture3_SetValidationCallback,
};
HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown **out)
HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm)
{
struct d3drm_texture *object;
HRESULT hr;
TRACE("riid %s, out %p.\n", debugstr_guid(riid), out);
TRACE("texture %p.\n", texture);
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
@ -1042,10 +1086,11 @@ HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown **out)
object->IDirect3DRMTexture_iface.lpVtbl = &d3drm_texture1_vtbl;
object->IDirect3DRMTexture2_iface.lpVtbl = &d3drm_texture2_vtbl;
object->IDirect3DRMTexture3_iface.lpVtbl = &d3drm_texture3_vtbl;
object->ref = 1;
object->d3drm = d3drm;
hr = IDirect3DRMTexture3_QueryInterface(&object->IDirect3DRMTexture3_iface, riid, (void **)out);
IDirect3DRMTexture3_Release(&object->IDirect3DRMTexture3_iface);
d3drm_object_init(&object->obj);
return hr;
*texture = object;
return D3DRM_OK;
}

View file

@ -22,9 +22,9 @@
struct d3drm_viewport
{
struct d3drm_object obj;
IDirect3DRMViewport IDirect3DRMViewport_iface;
IDirect3DRMViewport2 IDirect3DRMViewport2_iface;
LONG ref;
D3DVALUE back;
D3DVALUE front;
D3DVALUE field;
@ -48,6 +48,7 @@ static HRESULT WINAPI d3drm_viewport1_QueryInterface(IDirect3DRMViewport *iface,
TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
if (IsEqualGUID(riid, &IID_IDirect3DRMViewport)
|| IsEqualGUID(riid, &IID_IDirect3DRMObject)
|| IsEqualGUID(riid, &IID_IUnknown))
{
*out = &viewport->IDirect3DRMViewport_iface;
@ -70,7 +71,7 @@ static HRESULT WINAPI d3drm_viewport1_QueryInterface(IDirect3DRMViewport *iface,
static ULONG WINAPI d3drm_viewport1_AddRef(IDirect3DRMViewport *iface)
{
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
ULONG refcount = InterlockedIncrement(&viewport->ref);
ULONG refcount = InterlockedIncrement(&viewport->obj.ref);
TRACE("%p increasing refcount to %u.\n", iface, refcount);
@ -80,12 +81,15 @@ static ULONG WINAPI d3drm_viewport1_AddRef(IDirect3DRMViewport *iface)
static ULONG WINAPI d3drm_viewport1_Release(IDirect3DRMViewport *iface)
{
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
ULONG refcount = InterlockedDecrement(&viewport->ref);
ULONG refcount = InterlockedDecrement(&viewport->obj.ref);
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
if (!refcount)
{
d3drm_object_cleanup((IDirect3DRMObject*)iface, &viewport->obj);
HeapFree(GetProcessHeap(), 0, viewport);
}
return refcount;
}
@ -101,31 +105,39 @@ static HRESULT WINAPI d3drm_viewport1_Clone(IDirect3DRMViewport *iface,
static HRESULT WINAPI d3drm_viewport1_AddDestroyCallback(IDirect3DRMViewport *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return IDirect3DRMViewport2_AddDestroyCallback(&viewport->IDirect3DRMViewport2_iface, cb, ctx);
}
static HRESULT WINAPI d3drm_viewport1_DeleteDestroyCallback(IDirect3DRMViewport *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return IDirect3DRMViewport2_DeleteDestroyCallback(&viewport->IDirect3DRMViewport2_iface, cb, ctx);
}
static HRESULT WINAPI d3drm_viewport1_SetAppData(IDirect3DRMViewport *iface, DWORD data)
{
FIXME("iface %p, data %#x stub!\n", iface, data);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
return E_NOTIMPL;
TRACE("iface %p, data %#x\n", iface, data);
return IDirect3DRMViewport2_SetAppData(&viewport->IDirect3DRMViewport2_iface, data);
}
static DWORD WINAPI d3drm_viewport1_GetAppData(IDirect3DRMViewport *iface)
{
FIXME("iface %p.\n", iface);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
return 0;
TRACE("iface %p.\n", iface);
return IDirect3DRMViewport2_GetAppData(&viewport->IDirect3DRMViewport2_iface);
}
static HRESULT WINAPI d3drm_viewport1_SetName(IDirect3DRMViewport *iface, const char *name)
@ -454,31 +466,40 @@ static HRESULT WINAPI d3drm_viewport2_Clone(IDirect3DRMViewport2 *iface,
static HRESULT WINAPI d3drm_viewport2_AddDestroyCallback(IDirect3DRMViewport2 *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return d3drm_object_add_destroy_callback(&viewport->obj, cb, ctx);
}
static HRESULT WINAPI d3drm_viewport2_DeleteDestroyCallback(IDirect3DRMViewport2 *iface,
D3DRMOBJECTCALLBACK cb, void *ctx)
{
FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
return E_NOTIMPL;
TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
return d3drm_object_delete_destroy_callback(&viewport->obj, cb, ctx);
}
static HRESULT WINAPI d3drm_viewport2_SetAppData(IDirect3DRMViewport2 *iface, DWORD data)
{
FIXME("iface %p, data %#x stub!\n", iface, data);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
return E_NOTIMPL;
TRACE("iface %p, data %#x\n", iface, data);
viewport->obj.appdata = data;
return S_OK;
}
static DWORD WINAPI d3drm_viewport2_GetAppData(IDirect3DRMViewport2 *iface)
{
FIXME("iface %p stub!\n", iface);
struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
return 0;
TRACE("iface %p\n", iface);
return viewport->obj.appdata;
}
static HRESULT WINAPI d3drm_viewport2_SetName(IDirect3DRMViewport2 *iface, const char *name)
@ -810,7 +831,7 @@ HRESULT Direct3DRMViewport_create(REFIID riid, IUnknown **out)
object->IDirect3DRMViewport_iface.lpVtbl = &d3drm_viewport1_vtbl;
object->IDirect3DRMViewport2_iface.lpVtbl = &d3drm_viewport2_vtbl;
object->ref = 1;
d3drm_object_init(&object->obj);
if (IsEqualGUID(riid, &IID_IDirect3DRMViewport2))
*out = (IUnknown *)&object->IDirect3DRMViewport2_iface;

View file

@ -25,7 +25,7 @@ reactos/dll/directx/wine/amstream # Synced to WineStaging-1.9.11
reactos/dll/directx/wine/d3d8 # Synced to WineStaging-1.9.4
reactos/dll/directx/wine/d3d9 # Synced to WineStaging-1.9.4
reactos/dll/directx/wine/d3dcompiler_43 # Synced to WineStaging-1.9.4
reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.9.4
reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.9.11
reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to WineStaging-1.9.4
reactos/dll/directx/wine/d3dxof # Synced to WineStaging-1.9.4
reactos/dll/directx/wine/ddraw # Synced to WineStaging-1.9.4