[PATCH 1/5] d3drm: Move loading code from IDirect3DRM3Impl_Load to a separate function so it can be called recursively.
Christian Costa
titan.costa at gmail.com
Tue May 15 01:08:22 CDT 2012
---
dlls/d3drm/d3drm.c | 226 +++++++++++++++++++++++++++-------------------------
1 files changed, 119 insertions(+), 107 deletions(-)
diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index 401cccd..7ea0b2a 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -1266,6 +1266,123 @@ static HRESULT WINAPI IDirect3DRM3Impl_EnumerateObjects(IDirect3DRM3* iface, D3D
return E_NOTIMPL;
}
+HRESULT load_data(IDirect3DRM3* iface, LPDIRECTXFILEDATA data_object, LPIID* GUIDs, DWORD nb_GUIDs, D3DRMLOADCALLBACK LoadProc,
+ LPVOID ArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc, LPVOID ArgLTP, LPDIRECT3DRMFRAME3 parent_frame)
+{
+ HRESULT ret = D3DRMERR_BADOBJECT;
+ HRESULT hr;
+ const GUID* guid;
+ DWORD i;
+ BOOL requested = FALSE;
+
+ hr = IDirectXFileData_GetType(data_object, &guid);
+ if (hr != DXFILE_OK)
+ goto end;
+
+ TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
+
+ if (IsEqualGUID(guid, &TID_D3DRMMesh))
+ {
+ TRACE("Found TID_D3DRMMesh\n");
+
+ for (i = 0; i < nb_GUIDs; i++)
+ if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder) ||
+ IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder2) ||
+ IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder3))
+ {
+ requested = TRUE;
+ break;
+ }
+
+ if (requested)
+ {
+ LPDIRECT3DRMMESHBUILDER3 meshbuilder;
+
+ FIXME("Load mesh data and notify application\n");
+
+ hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
+ if (SUCCEEDED(hr))
+ {
+ LPDIRECT3DRMOBJECT object = NULL;
+
+ hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
+ if (SUCCEEDED(hr))
+ {
+ hr = load_mesh_data(meshbuilder, data_object);
+ if (SUCCEEDED(hr))
+ LoadProc(object, GUIDs[i], ArgLP);
+ IDirect3DRMObject_Release(object);
+ }
+ IDirect3DRMMeshBuilder3_Release(meshbuilder);
+ }
+
+ if (FAILED(hr))
+ ERR("Cannot process mesh\n");
+ }
+ }
+ else if (IsEqualGUID(guid, &TID_D3DRMFrame))
+ {
+ TRACE("Found TID_D3DRMFrame\n");
+
+ for (i = 0; i < nb_GUIDs; i++)
+ if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
+ IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
+ IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
+ {
+ requested = TRUE;
+ break;
+ }
+
+ if (requested)
+ {
+ LPDIRECT3DRMFRAME3 frame;
+
+ FIXME("Fake frame data and notify application\n");
+
+ hr = IDirect3DRM3_CreateFrame(iface, NULL, &frame);
+ if (SUCCEEDED(hr))
+ {
+ LPDIRECT3DRMOBJECT object;
+
+ hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
+ if (SUCCEEDED(hr))
+ {
+ LoadProc(object, GUIDs[i], ArgLP);
+ IDirect3DRMObject_Release(object);
+ }
+ IDirect3DRMFrame3_Release(frame);
+ }
+
+ if (FAILED(hr))
+ ERR("Cannot process frame\n");
+ }
+ }
+ else if (IsEqualGUID(guid, &TID_D3DRMMaterial))
+ {
+ TRACE("Found TID_D3DRMMaterial\n");
+
+ for (i = 0; i < nb_GUIDs; i++)
+ if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMaterial) ||
+ IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMaterial2))
+ requested = TRUE;
+
+ if (requested)
+ {
+ FIXME("Processing material not supported yet\n");
+ }
+ }
+ else
+ {
+ FIXME("Found unknown TID %s\n", debugstr_guid(guid));
+ }
+
+ ret = D3DRM_OK;
+
+end:
+
+ return ret;
+}
+
static HRESULT WINAPI IDirect3DRM3Impl_Load(IDirect3DRM3* iface, LPVOID ObjSource, LPVOID ObjID,
LPIID* GUIDs, DWORD nb_GUIDs, D3DRMLOADOPTIONS LOFlags,
D3DRMLOADCALLBACK LoadProc, LPVOID ArgLP,
@@ -1364,115 +1481,10 @@ static HRESULT WINAPI IDirect3DRM3Impl_Load(IDirect3DRM3* iface, LPVOID ObjSourc
goto end;
}
- hr = IDirectXFileData_GetType(pData, &pGuid);
- if (hr != DXFILE_OK)
+ ret = load_data(iface, pData, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, ParentFrame);
+ if (ret != D3DRM_OK)
goto end;
- TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
-
- if (IsEqualGUID(pGuid, &TID_D3DRMMesh))
- {
- BOOL requested = FALSE;
- HRESULT hr;
-
- TRACE("Found TID_D3DRMMesh\n");
-
- for (i = 0; i < nb_GUIDs; i++)
- if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder) ||
- IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder2) ||
- IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder3))
- {
- requested = TRUE;
- break;
- }
-
- if (requested)
- {
- LPDIRECT3DRMMESHBUILDER3 meshbuilder;
-
- FIXME("Load mesh data and notify application\n");
-
- hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
- if (SUCCEEDED(hr))
- {
- LPDIRECT3DRMOBJECT object = NULL;
-
- hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
- if (SUCCEEDED(hr))
- {
- hr = load_mesh_data(meshbuilder, pData);
- if (SUCCEEDED(hr))
- LoadProc(object, GUIDs[i], ArgLP);
- IDirect3DRMObject_Release(object);
- }
- IDirect3DRMMeshBuilder3_Release(meshbuilder);
- }
-
- if (FAILED(hr))
- ERR("Cannot process mesh\n");
- }
- }
- else if (IsEqualGUID(pGuid, &TID_D3DRMFrame))
- {
- BOOL requested = FALSE;
- HRESULT hr;
-
- TRACE("Found TID_D3DRMFrame\n");
-
- for (i = 0; i < nb_GUIDs; i++)
- if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
- IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
- IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
- {
- requested = TRUE;
- break;
- }
-
- if (requested)
- {
- LPDIRECT3DRMFRAME3 frame;
-
- FIXME("Fake frame data and notify application\n");
-
- hr = IDirect3DRM3_CreateFrame(iface, NULL, &frame);
- if (SUCCEEDED(hr))
- {
- LPDIRECT3DRMOBJECT object;
-
- hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
- if (SUCCEEDED(hr))
- {
- LoadProc(object, GUIDs[i], ArgLP);
- IDirect3DRMObject_Release(object);
- }
- IDirect3DRMFrame3_Release(frame);
- }
-
- if (FAILED(hr))
- ERR("Cannot process frame\n");
-
- }
- }
- else if (IsEqualGUID(pGuid, &TID_D3DRMMaterial))
- {
- BOOL requested = FALSE;
-
- TRACE("Found TID_D3DRMMaterial\n");
-
- for (i = 0; i < nb_GUIDs; i++)
- if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMaterial) ||
- IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMaterial2))
- requested = TRUE;
-
- if (requested)
- {
- FIXME("Processing material not supported yet\n");
- }
- }
- else
- {
- FIXME("Found unknown TID %s\n", debugstr_guid(pGuid));
- }
IDirectXFileData_Release(pData);
pData = NULL;
}
More information about the wine-patches
mailing list