HRESULT WINAPI D3DXFileCreate(ID3DXFile **d3dxfile) { ID3DXFileImpl *object; HRESULT ret; TRACE("(%p)\n", d3dxfile); if (!d3dxfile) return E_POINTER; *d3dxfile = NULL; object = HeapAlloc(GetProcessHeap(), 0, sizeof(*object)); if (!object) return E_OUTOFMEMORY; ret = DirectXFileCreate(&object->dxfile); if (ret != S_OK) { HeapFree(GetProcessHeap(), 0, object); if (ret == E_OUTOFMEMORY) return ret; return E_FAIL; } object->ID3DXFile_iface.lpVtbl = &ID3DXFile_Vtbl; object->ref = 1; *d3dxfile = &object->ID3DXFile_iface; return S_OK; }
//----------------------------------------------------------------------------- // Name: // Desc: //----------------------------------------------------------------------------- HRESULT CD3DFile::CreateFromResource( LPDIRECT3DDEVICE9 pd3dDevice, TCHAR* strResource, TCHAR* strType ) { LPDIRECTXFILE pDXFile = NULL; LPDIRECTXFILEENUMOBJECT pEnumObj = NULL; LPDIRECTXFILEDATA pFileData = NULL; HRESULT hr; // Create a x file object if( FAILED( hr = DirectXFileCreate( &pDXFile ) ) ) return E_FAIL; // Register templates for d3drm and patch extensions. if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES ) ) ) { pDXFile->Release(); return E_FAIL; } CHAR strTypeAnsi[MAX_PATH]; DXUtil_ConvertGenericStringToAnsiCb( strTypeAnsi, strType, sizeof(strTypeAnsi) ); DXFILELOADRESOURCE dxlr; dxlr.hModule = NULL; dxlr.lpName = strResource; dxlr.lpType = (TCHAR*) strTypeAnsi; // Create enum object hr = pDXFile->CreateEnumObject( (void*)&dxlr, DXFILELOAD_FROMRESOURCE, &pEnumObj ); if( FAILED(hr) ) { pDXFile->Release(); return hr; } // Enumerate top level objects (which are always frames) while( SUCCEEDED( pEnumObj->GetNextDataObject( &pFileData ) ) ) { hr = LoadFrame( pd3dDevice, pFileData, this ); pFileData->Release(); if( FAILED(hr) ) { pEnumObj->Release(); pDXFile->Release(); return E_FAIL; } } SAFE_RELEASE( pFileData ); SAFE_RELEASE( pEnumObj ); SAFE_RELEASE( pDXFile ); return S_OK; }
//----------------------------------------------------------------------------- // Name: // Desc: //----------------------------------------------------------------------------- HRESULT CD3DFile::Create( LPDIRECT3DDEVICE9 pd3dDevice, TCHAR* strFilename ) { LPDIRECTXFILE pDXFile = NULL; LPDIRECTXFILEENUMOBJECT pEnumObj = NULL; LPDIRECTXFILEDATA pFileData = NULL; HRESULT hr; // Create a x file object if( FAILED( hr = DirectXFileCreate( &pDXFile ) ) ) return E_FAIL; // Register templates for d3drm and patch extensions. if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES ) ) ) { pDXFile->Release(); return E_FAIL; } // Find the path to the file, and convert it to ANSI (for the D3DXOF API) TCHAR strPath[MAX_PATH]; CHAR strPathANSI[MAX_PATH]; DXUtil_FindMediaFileCb( strPath, sizeof(strPath), strFilename ); DXUtil_ConvertGenericStringToAnsiCb( strPathANSI, strPath, sizeof(strPathANSI) ); // Create enum object hr = pDXFile->CreateEnumObject( (void*)strPathANSI, DXFILELOAD_FROMFILE, &pEnumObj ); if( FAILED(hr) ) { pDXFile->Release(); return hr; } // Enumerate top level objects (which are always frames) while( SUCCEEDED( pEnumObj->GetNextDataObject( &pFileData ) ) ) { hr = LoadFrame( pd3dDevice, pFileData, this ); pFileData->Release(); if( FAILED(hr) ) { pEnumObj->Release(); pDXFile->Release(); return E_FAIL; } } SAFE_RELEASE( pFileData ); SAFE_RELEASE( pEnumObj ); SAFE_RELEASE( pDXFile ); return S_OK; }