Author: akhaldi Date: Thu Sep 25 19:46:26 2014 New Revision: 64286
URL: http://svn.reactos.org/svn/reactos?rev=64286&view=rev Log: [D3DX9_*] * Sync with Wine 1.7.27. CORE-8540
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec trunk/reactos/dll/directx/wine/d3dx9_36/font.c trunk/reactos/dll/directx/wine/d3dx9_36/mesh.c trunk/reactos/dll/directx/wine/d3dx9_36/shader.c trunk/reactos/dll/directx/wine/d3dx9_36/surface.c trunk/reactos/dll/directx/wine/d3dx9_36/texture.c trunk/reactos/dll/directx/wine/d3dx9_36/util.c trunk/reactos/dll/directx/wine/d3dx9_36/xfile.c trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/d... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -105,7 +105,7 @@ @ stdcall D3DXCreateTextureFromResourceW(ptr ptr wstr ptr) @ stdcall -stub D3DXCreateTextureGutterHelper(long long ptr long ptr) @ stdcall -stub D3DXCreateTextureShader(ptr ptr) -@ stdcall -stub D3DXCreateTorus(ptr long long long long ptr ptr) +@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) @ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) @ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) @ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr)
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/font.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/f... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/font.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/font.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -140,8 +140,8 @@ static HRESULT WINAPI ID3DXFontImpl_GetGlyphData(ID3DXFont *iface, UINT glyph, IDirect3DTexture9 **texture, RECT *blackbox, POINT *cellinc) { - FIXME("iface %p, glyph %#x, texture %p, blackbox %s, cellinc %s stub!\n", - iface, glyph, texture, wine_dbgstr_rect(blackbox), wine_dbgstr_point(cellinc)); + FIXME("iface %p, glyph %#x, texture %p, blackbox %p, cellinc %p stub!\n", + iface, glyph, texture, blackbox, cellinc); return E_NOTIMPL; }
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/mesh.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/m... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/mesh.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/mesh.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -2741,16 +2741,20 @@ return hr; hr = child->lpVtbl->GetType(child, &type); if (FAILED(hr)) - return hr; + goto err;
if (IsEqualGUID(&type, &TID_D3DRMTextureFilename)) { hr = parse_texture_filename(child, &material->pTextureFilename); if (FAILED(hr)) - return hr; - } - } - + goto err; + } + IUnknown_Release(child); + } return D3D_OK; + +err: + IUnknown_Release(child); + return hr; }
static void destroy_materials(struct mesh_data *mesh) @@ -2771,7 +2775,7 @@ SIZE_T data_size; const DWORD *data, *in_ptr; GUID type; - ID3DXFileData *child; + ID3DXFileData *child = NULL; DWORD num_materials; DWORD i; SIZE_T nb_children; @@ -2854,6 +2858,9 @@ if (FAILED(hr)) goto end; } + + IUnknown_Release(child); + child = NULL; } if (num_materials != mesh->num_materials) { WARN("only %u of %u materials defined\n", num_materials, mesh->num_materials); @@ -2861,6 +2868,8 @@ }
end: + if (child) + IUnknown_Release(child); filedata->lpVtbl->Unlock(filedata); return hr; } @@ -3158,7 +3167,7 @@ const BYTE *data, *in_ptr; DWORD *index_out_ptr; GUID type; - ID3DXFileData *child; + ID3DXFileData *child = NULL; DWORD i; SIZE_T nb_children; DWORD nb_skin_weigths_info = 0; @@ -3275,9 +3284,6 @@ hr = parse_vertex_colors(child, mesh_data); } else if (IsEqualGUID(&type, &TID_D3DRMMeshTextureCoords)) { hr = parse_texture_coords(child, mesh_data); - hr = filedata->lpVtbl->GetChild(filedata, i, &child); - if (FAILED(hr)) - goto end; } else if (IsEqualGUID(&type, &TID_D3DRMMeshMaterialList) && (provide_flags & PROVIDE_MATERIALS)) { @@ -3306,6 +3312,9 @@ } if (FAILED(hr)) goto end; + + IUnknown_Release(child); + child = NULL; }
if (mesh_data->skin_info && (nb_skin_weigths_info != mesh_data->nb_bones)) { @@ -3318,6 +3327,8 @@ hr = D3D_OK;
end: + if (child) + IUnknown_Release(child); filedata->lpVtbl->Unlock(filedata); return hr; } @@ -3846,7 +3857,7 @@ return hr; hr = child->lpVtbl->GetType(child, &type); if (FAILED(hr)) - return hr; + goto err;
if (IsEqualGUID(&type, &TID_D3DRMMesh)) { hr = load_mesh_container(child, options, device, alloc_hier, next_container); @@ -3860,10 +3871,15 @@ next_child = &(*next_child)->pFrameSibling; } if (FAILED(hr)) - return hr; - } - + goto err; + + IUnknown_Release(child); + } return D3D_OK; + +err: + IUnknown_Release(child); + return hr; }
HRESULT WINAPI D3DXLoadMeshHierarchyFromXInMemory(const void *memory, DWORD memory_size, DWORD options, @@ -4129,12 +4145,15 @@ return hr; hr = child->lpVtbl->GetType(child, &type); if (FAILED(hr)) - return hr; + goto err;
if (IsEqualGUID(&type, &TID_D3DRMMesh)) { struct mesh_container *container = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*container)); if (!container) - return E_OUTOFMEMORY; + { + hr = E_OUTOFMEMORY; + goto err; + } list_add_tail(container_list, &container->entry); container->transform = transform;
@@ -4150,10 +4169,15 @@ hr = parse_frame(child, options, device, &transform, container_list, provide_flags); } if (FAILED(hr)) - return hr; - } - + goto err; + + IUnknown_Release(child); + } return D3D_OK; + +err: + IUnknown_Release(child); + return hr; }
HRESULT WINAPI D3DXLoadMeshFromXInMemory(const void *memory, DWORD memory_size, DWORD options, @@ -4683,12 +4707,6 @@ return D3DERR_INVALIDCALL; }
- if (adjacency) - { - FIXME("Case of adjacency != NULL not implemented.\n"); - return E_NOTIMPL; - } - number_of_vertices = 2 + slices * (stacks-1); number_of_faces = 2 * slices + (stacks - 2) * (2 * slices);
@@ -4826,6 +4844,24 @@ free_sincos_table(&phi); sphere->lpVtbl->UnlockIndexBuffer(sphere); sphere->lpVtbl->UnlockVertexBuffer(sphere); + + + if (adjacency) + { + if (FAILED(hr = D3DXCreateBuffer(number_of_faces * sizeof(DWORD) * 3, adjacency))) + { + sphere->lpVtbl->Release(sphere); + return hr; + } + + if (FAILED(hr = sphere->lpVtbl->GenerateAdjacency(sphere, 0.0f, (*adjacency)->lpVtbl->GetBufferPointer(*adjacency)))) + { + (*adjacency)->lpVtbl->Release(*adjacency); + sphere->lpVtbl->Release(sphere); + return hr; + } + } + *mesh = sphere;
return D3D_OK; @@ -5044,6 +5080,113 @@ HeapFree(GetProcessHeap(), 0, textW);
return hr; +} + +HRESULT WINAPI D3DXCreateTorus(struct IDirect3DDevice9 *device, + float innerradius, float outerradius, UINT sides, UINT rings, struct ID3DXMesh **mesh, ID3DXBuffer **adjacency) +{ + HRESULT hr; + ID3DXMesh *torus; + WORD (*faces)[3]; + struct vertex *vertices; + float phi, phi_step, sin_phi, cos_phi; + float theta, theta_step, sin_theta, cos_theta; + unsigned int i, j, numvert, numfaces; + + TRACE("device %p, innerradius %.8e, outerradius %.8e, sides %u, rings %u, mesh %p, adjacency %p.\n", + device, innerradius, outerradius, sides, rings, mesh, adjacency); + + numvert = sides * rings; + numfaces = numvert * 2; + + if (!device || innerradius < 0.0f || outerradius < 0.0f || sides < 3 || rings < 3 || !mesh) + { + WARN("Invalid arguments.\n"); + return D3DERR_INVALIDCALL; + } + + if (FAILED(hr = D3DXCreateMeshFVF(numfaces, numvert, D3DXMESH_MANAGED, D3DFVF_XYZ | D3DFVF_NORMAL, device, &torus))) + return hr; + + if (FAILED(hr = torus->lpVtbl->LockVertexBuffer(torus, 0, (void **)&vertices))) + { + torus->lpVtbl->Release(torus); + return hr; + } + + if (FAILED(hr = torus->lpVtbl->LockIndexBuffer(torus, 0, (void **)&faces))) + { + torus->lpVtbl->UnlockVertexBuffer(torus); + torus->lpVtbl->Release(torus); + return hr; + } + + phi_step = D3DX_PI / sides * 2.0f; + theta_step = D3DX_PI / rings * -2.0f; + + theta = 0.0f; + + for (i = 0; i < rings; ++i) + { + phi = 0.0f; + + sin_theta = sinf(theta); + cos_theta = cosf(theta); + + for (j = 0; j < sides; ++j) + { + sin_phi = sinf(phi); + cos_phi = cosf(phi); + + vertices[i * sides + j].position.x = (innerradius * cos_phi + outerradius) * cos_theta; + vertices[i * sides + j].position.y = (innerradius * cos_phi + outerradius) * sin_theta; + vertices[i * sides + j].position.z = innerradius * sin_phi; + vertices[i * sides + j].normal.x = cos_phi * cos_theta; + vertices[i * sides + j].normal.y = cos_phi * sin_theta; + vertices[i * sides + j].normal.z = sin_phi; + + phi += phi_step; + } + + theta += theta_step; + } + + for (i = 0; i < numfaces - sides * 2; ++i) + { + faces[i][0] = i % 2 ? i / 2 + sides : i / 2; + faces[i][1] = (i / 2 + 1) % sides ? i / 2 + 1 : i / 2 + 1 - sides; + faces[i][2] = (i + 1) % (sides * 2) ? (i + 1) / 2 + sides : (i + 1) / 2; + } + + for (j = 0; i < numfaces; ++i, ++j) + { + faces[i][0] = i % 2 ? j / 2 : i / 2; + faces[i][1] = (i / 2 + 1) % sides ? i / 2 + 1 : i / 2 + 1 - sides; + faces[i][2] = i == numfaces - 1 ? 0 : (j + 1) / 2; + } + + torus->lpVtbl->UnlockIndexBuffer(torus); + torus->lpVtbl->UnlockVertexBuffer(torus); + + if (adjacency) + { + if (FAILED(hr = D3DXCreateBuffer(numfaces * sizeof(DWORD) * 3, adjacency))) + { + torus->lpVtbl->Release(torus); + return hr; + } + + if (FAILED(hr = torus->lpVtbl->GenerateAdjacency(torus, 0.0f, (*adjacency)->lpVtbl->GetBufferPointer(*adjacency)))) + { + (*adjacency)->lpVtbl->Release(*adjacency); + torus->lpVtbl->Release(torus); + return hr; + } + } + + *mesh = torus; + + return D3D_OK; }
enum pointtype {
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/shader.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/s... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/shader.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/shader.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -207,6 +207,20 @@ return hr; }
+static const void *main_file_data; + +static CRITICAL_SECTION from_file_mutex; +static CRITICAL_SECTION_DEBUG from_file_mutex_debug = +{ + 0, 0, &from_file_mutex, + { + &from_file_mutex_debug.ProcessLocksList, + &from_file_mutex_debug.ProcessLocksList + }, + 0, 0, {(DWORD_PTR)(__FILE__ ": from_file_mutex")} +}; +static CRITICAL_SECTION from_file_mutex = {&from_file_mutex_debug, -1, 0, 0, 0, 0}; + /* D3DXInclude private implementation, used to implement * D3DXAssembleShaderFromFile() from D3DXAssembleShader(). */ /* To be able to correctly resolve include search paths we have to store the @@ -216,24 +230,40 @@ const char *filename, const void *parent_data, const void **data, UINT *bytes) { const char *p, *parent_name = ""; - char *pathname = NULL; + char *pathname = NULL, *ptr; char **buffer = NULL; HANDLE file; UINT size;
- if(parent_data != NULL) + if (parent_data) + { parent_name = *((const char **)parent_data - 1); + } + else + { + if (main_file_data) + parent_name = *((const char **)main_file_data - 1); + }
TRACE("Looking up for include file %s, parent %s\n", debugstr_a(filename), debugstr_a(parent_name));
- if ((p = strrchr(parent_name, '\')) || (p = strrchr(parent_name, '/'))) p++; - else p = parent_name; + if ((p = strrchr(parent_name, '\'))) + ++p; + else + p = parent_name; pathname = HeapAlloc(GetProcessHeap(), 0, (p - parent_name) + strlen(filename) + 1); if(!pathname) return HRESULT_FROM_WIN32(GetLastError());
memcpy(pathname, parent_name, p - parent_name); strcpy(pathname + (p - parent_name), filename); + ptr = pathname + (p - parent_name); + while (*ptr) + { + if (*ptr == '/') + *ptr = '\'; + ++ptr; + }
file = CreateFileA(pathname, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if(file == INVALID_HANDLE_VALUE) @@ -253,6 +283,8 @@ goto error;
*data = buffer + 1; + if (!main_file_data) + main_file_data = *data;
CloseHandle(file); return S_OK; @@ -268,6 +300,8 @@ { HeapFree(GetProcessHeap(), 0, *((char **)data - 1)); HeapFree(GetProcessHeap(), 0, (char **)data - 1); + if (main_file_data == data) + main_file_data = NULL; return S_OK; }
@@ -327,9 +361,11 @@ return E_OUTOFMEMORY; WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, len, NULL, NULL);
+ EnterCriticalSection(&from_file_mutex); hr = ID3DXInclude_Open(include, D3D_INCLUDE_LOCAL, filename_a, NULL, &buffer, &len); if (FAILED(hr)) { + LeaveCriticalSection(&from_file_mutex); HeapFree(GetProcessHeap(), 0, filename_a); return D3DXERR_INVALIDDATA; } @@ -337,6 +373,7 @@ hr = D3DXAssembleShader(buffer, len, defines, include, flags, shader, error_messages);
ID3DXInclude_Close(include, buffer); + LeaveCriticalSection(&from_file_mutex); HeapFree(GetProcessHeap(), 0, filename_a); return hr; } @@ -459,9 +496,11 @@ return E_OUTOFMEMORY; WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, filename_len, NULL, NULL);
+ EnterCriticalSection(&from_file_mutex); hr = ID3DXInclude_Open(include, D3D_INCLUDE_LOCAL, filename_a, NULL, &buffer, &len); if (FAILED(hr)) { + LeaveCriticalSection(&from_file_mutex); HeapFree(GetProcessHeap(), 0, filename_a); return D3DXERR_INVALIDDATA; } @@ -475,6 +514,7 @@ constant_table);
ID3DXInclude_Close(include, buffer); + LeaveCriticalSection(&from_file_mutex); HeapFree(GetProcessHeap(), 0, filename_a); return hr; } @@ -579,9 +619,11 @@ return E_OUTOFMEMORY; WideCharToMultiByte(CP_ACP, 0, filename, -1, filename_a, len, NULL, NULL);
+ EnterCriticalSection(&from_file_mutex); hr = ID3DXInclude_Open(include, D3D_INCLUDE_LOCAL, filename_a, NULL, &buffer, &len); if (FAILED(hr)) { + LeaveCriticalSection(&from_file_mutex); HeapFree(GetProcessHeap(), 0, filename_a); return D3DXERR_INVALIDDATA; } @@ -592,6 +634,7 @@ (ID3DBlob **)shader, (ID3DBlob **)error_messages);
ID3DXInclude_Close(include, buffer); + LeaveCriticalSection(&from_file_mutex); HeapFree(GetProcessHeap(), 0, filename_a); return hr; }
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/surface.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/s... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/surface.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/surface.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -1026,7 +1026,7 @@ * * RETURNS * Success: D3D_OK - * Failure: D3DERR_INVALIDCALL, if pDestSurface or pSrcData or SrcDataSize are NULL + * Failure: D3DERR_INVALIDCALL, if pDestSurface, pSrcData or SrcDataSize is NULL * D3DXERR_INVALIDDATA, if pSrcData is no valid image file * */ @@ -1362,12 +1362,28 @@ * Extracts the relevant components from the source color and * drops the less significant bits if they aren't used by the destination format. */ -static void get_relevant_argb_components(const struct argb_conversion_info *info, DWORD col, DWORD *out) -{ - UINT i = 0; - for(;i < 4;i++) - if(info->process_channel[i]) - out[i] = (col & info->srcmask[i]) >> info->srcshift[i]; +static void get_relevant_argb_components(const struct argb_conversion_info *info, const BYTE *col, DWORD *out) +{ + unsigned int i, j; + unsigned int component, mask; + + for (i = 0; i < 4; ++i) + { + if (!info->process_channel[i]) + continue; + + component = 0; + mask = info->srcmask[i]; + for (j = 0; j < 4 && mask; ++j) + { + if (info->srcshift[i] < j * 8) + component |= (col[j] & mask) << (j * 8 - info->srcshift[i]); + else + component |= (col[j] & mask) >> (info->srcshift[i] - j * 8); + mask >>= 8; + } + out[i] = component; + } }
/************************************************************ @@ -1545,14 +1561,14 @@ { DWORD val;
- get_relevant_argb_components(&conv_info, *(DWORD *)src_ptr, channels); + get_relevant_argb_components(&conv_info, src_ptr, channels); val = make_argb_color(&conv_info, channels);
if (color_key) { DWORD ck_pixel;
- get_relevant_argb_components(&ck_conv_info, *(DWORD *)src_ptr, channels); + get_relevant_argb_components(&ck_conv_info, src_ptr, channels); ck_pixel = make_argb_color(&ck_conv_info, channels); if (ck_pixel == color_key) val &= ~conv_info.destmask[0]; @@ -1648,14 +1664,14 @@ { DWORD val;
- get_relevant_argb_components(&conv_info, *(DWORD *)src_ptr, channels); + get_relevant_argb_components(&conv_info, src_ptr, channels); val = make_argb_color(&conv_info, channels);
if (color_key) { DWORD ck_pixel;
- get_relevant_argb_components(&ck_conv_info, *(DWORD *)src_ptr, channels); + get_relevant_argb_components(&ck_conv_info, src_ptr, channels); ck_pixel = make_argb_color(&ck_conv_info, channels); if (ck_pixel == color_key) val &= ~conv_info.destmask[0]; @@ -1716,7 +1732,7 @@ * RETURNS * Success: D3D_OK, if we successfully load the pixel data into our surface or * if pSrcMemory is NULL but the other parameters are valid - * Failure: D3DERR_INVALIDCALL, if pDestSurface, SrcPitch or pSrcRect are NULL or + * Failure: D3DERR_INVALIDCALL, if pDestSurface, SrcPitch or pSrcRect is NULL or * if SrcFormat is an invalid format (other than D3DFMT_UNKNOWN) or * if DestRect is invalid * D3DXERR_INVALIDDATA, if we fail to lock pDestSurface @@ -1867,7 +1883,7 @@ * * RETURNS * Success: D3D_OK - * Failure: D3DERR_INVALIDCALL, if pDestSurface or pSrcSurface are NULL + * Failure: D3DERR_INVALIDCALL, if pDestSurface or pSrcSurface is NULL * D3DXERR_INVALIDDATA, if one of the surfaces is not lockable * */
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/texture.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/t... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/texture.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/texture.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -180,6 +180,27 @@ } }
+static D3DFORMAT get_luminance_replacement_format(D3DFORMAT format) +{ + static const struct + { + D3DFORMAT luminance_format; + D3DFORMAT replacement_format; + } luminance_replacements[] = + { + {D3DFMT_L8, D3DFMT_X8R8G8B8}, + {D3DFMT_A8L8, D3DFMT_A8R8G8B8}, + {D3DFMT_A4L4, D3DFMT_A4R4G4B4}, + {D3DFMT_L16, D3DFMT_A16B16G16R16} + }; + unsigned int i; + + for (i = 0; i < sizeof(luminance_replacements) / sizeof(luminance_replacements[0]); ++i) + if (format == luminance_replacements[i].luminance_format) + return luminance_replacements[i].replacement_format; + return format; +} + HRESULT WINAPI D3DXCheckTextureRequirements(struct IDirect3DDevice9 *device, UINT *width, UINT *height, UINT *miplevels, DWORD usage, D3DFORMAT *format, D3DPOOL pool) { @@ -251,16 +272,16 @@ FIXME("Pixel format %x not handled\n", usedformat); goto cleanup; } + fmt = get_format_info(get_luminance_replacement_format(usedformat));
allow_24bits = fmt->bytes_per_pixel == 3; - channels = (fmt->bits[0] ? 1 : 0) + (fmt->bits[1] ? 1 : 0) - + (fmt->bits[2] ? 1 : 0) + (fmt->bits[3] ? 1 : 0); + channels = !!fmt->bits[0] + !!fmt->bits[1] + !!fmt->bits[2] + !!fmt->bits[3]; usedformat = D3DFMT_UNKNOWN;
while ((curfmt = get_format_info_idx(i))) { - unsigned int curchannels = (curfmt->bits[0] ? 1 : 0) + (curfmt->bits[1] ? 1 : 0) - + (curfmt->bits[2] ? 1 : 0) + (curfmt->bits[3] ? 1 : 0); + unsigned int curchannels = !!curfmt->bits[0] + !!curfmt->bits[1] + + !!curfmt->bits[2] + !!curfmt->bits[3]; int score;
i++; @@ -521,8 +542,6 @@ IDirect3DTexture9 **texptr; IDirect3DTexture9 *buftex; IDirect3DSurface9 *surface; - BOOL file_width = FALSE, file_height = FALSE; - BOOL file_format = FALSE, file_miplevels = FALSE; BOOL dynamic_texture; D3DXIMAGE_INFO imginfo; UINT loaded_miplevels, skip_levels; @@ -565,25 +584,21 @@
if (width == D3DX_FROM_FILE) { - file_width = TRUE; width = imginfo.Width; }
if (height == D3DX_FROM_FILE) { - file_height = TRUE; height = imginfo.Height; }
if (format == D3DFMT_FROM_FILE) { - file_format = TRUE; format = imginfo.Format; }
if (miplevels == D3DX_FROM_FILE) { - file_miplevels = TRUE; miplevels = imginfo.MipLevels; }
@@ -621,14 +636,6 @@ { FIXME("Generation of mipmaps for compressed pixel formats is not implemented yet.\n"); miplevels = 1; - } - - if (((file_width) && (width != imginfo.Width)) || - ((file_height) && (height != imginfo.Height)) || - ((file_format) && (format != imginfo.Format)) || - ((file_miplevels) && (miplevels != imginfo.MipLevels))) - { - return D3DERR_NOTAVAILABLE; }
if (FAILED(IDirect3DDevice9_GetDeviceCaps(device, &caps)))
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/util.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/u... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/util.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/util.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -178,6 +178,7 @@ HRESULT hr = S_OK; void *buffer_pointer; DWORD buffer_size; + DWORD bytes_written; HANDLE file = CreateFileW(dst_filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError()); @@ -185,7 +186,7 @@ buffer_pointer = ID3DXBuffer_GetBufferPointer(buffer); buffer_size = ID3DXBuffer_GetBufferSize(buffer);
- if (!WriteFile(file, buffer_pointer, buffer_size, NULL, NULL)) + if (!WriteFile(file, buffer_pointer, buffer_size, &bytes_written, NULL)) hr = HRESULT_FROM_WIN32(GetLastError());
CloseHandle(file);
Modified: trunk/reactos/dll/directx/wine/d3dx9_36/xfile.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/wine/d3dx9_36/x... ============================================================================== --- trunk/reactos/dll/directx/wine/d3dx9_36/xfile.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/wine/d3dx9_36/xfile.c [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -294,6 +294,7 @@ { struct d3dx9_file_data *object; IDirectXFileObject *data_object; + unsigned int children_array_size = 0; HRESULT ret;
TRACE("dxfile_object %p, ret_iface %p.\n", dxfile_object, ret_iface); @@ -316,6 +317,7 @@ if (SUCCEEDED(ret)) { ret = IDirectXFileDataReference_Resolve(reference, &object->dxfile_data); + IUnknown_Release(reference); if (FAILED(ret)) { HeapFree(GetProcessHeap(), 0, object); @@ -333,24 +335,47 @@
while (SUCCEEDED(ret = IDirectXFileData_GetNextObject(object->dxfile_data, &data_object))) { - if (object->children) - object->children = HeapReAlloc(GetProcessHeap(), 0, object->children, sizeof(ID3DXFileData*) * (object->nb_children + 1)); - else - object->children = HeapAlloc(GetProcessHeap(), 0, sizeof(ID3DXFileData*)); - if (!object->children) + if (object->nb_children >= children_array_size) { - ret = E_OUTOFMEMORY; - break; + ID3DXFileData **new_children; + + if (object->children) + { + children_array_size *= 2; + new_children = HeapReAlloc(GetProcessHeap(), 0, object->children, + sizeof(*object->children) * children_array_size); + } + else + { + children_array_size = 4; + new_children = HeapAlloc(GetProcessHeap(), 0, sizeof(*object->children) * children_array_size); + } + if (!new_children) + { + ret = E_OUTOFMEMORY; + break; + } + object->children = new_children; } - if (FAILED(ret = d3dx9_file_data_create(data_object, &object->children[object->nb_children]))) + ret = d3dx9_file_data_create(data_object, &object->children[object->nb_children]); + IUnknown_Release(data_object); + if (FAILED(ret)) break; object->nb_children++; } - if (ret != DXFILEERR_NOMOREOBJECTS) { (&object->ID3DXFileData_iface)->lpVtbl->Release(&object->ID3DXFileData_iface); return ret; + } + if (object->children) + { + ID3DXFileData **new_children; + + new_children = HeapReAlloc(GetProcessHeap(), 0, object->children, + sizeof(*object->children) * object->nb_children); + if (new_children) + object->children = new_children; }
TRACE("Found %u children\n", object->nb_children); @@ -530,6 +555,7 @@ DXFILELOADRESOURCE dxfile_resource; DXFILELOADMEMORY dxfile_memory; IDirectXFileData *data_object; + unsigned children_array_size = 0; HRESULT ret;
TRACE("iface %p, source %p, options %#x, enum_object %p.\n", iface, source, options, enum_object); @@ -587,19 +613,43 @@ /* Fill enum object with top level data objects */ while (SUCCEEDED(ret = IDirectXFileEnumObject_GetNextDataObject(dxfile_enum_object, &data_object))) { - if (object->children) - object->children = HeapReAlloc(GetProcessHeap(), 0, object->children, sizeof(*object->children) * (object->nb_children + 1)); - else - object->children = HeapAlloc(GetProcessHeap(), 0, sizeof(*object->children)); - if (!object->children) + if (object->nb_children >= children_array_size) { - ret = E_OUTOFMEMORY; - break; + ID3DXFileData **new_children; + + if (object->children) + { + children_array_size *= 2; + new_children = HeapReAlloc(GetProcessHeap(), 0, object->children, + sizeof(*object->children) * children_array_size); + } + else + { + children_array_size = 4; + new_children = HeapAlloc(GetProcessHeap(), 0, sizeof(*object->children) * children_array_size); + } + if (!new_children) + { + ret = E_OUTOFMEMORY; + break; + } + object->children = new_children; } - if (FAILED(ret = d3dx9_file_data_create((IDirectXFileObject*)data_object, - &object->children[object->nb_children]))) + ret = d3dx9_file_data_create((IDirectXFileObject*)data_object, + &object->children[object->nb_children]); + IUnknown_Release(data_object); + if (FAILED(ret)) break; object->nb_children++; + } + if (object->children) + { + ID3DXFileData **new_children; + + new_children = HeapReAlloc(GetProcessHeap(), 0, object->children, + sizeof(*object->children) * object->nb_children); + if (new_children) + object->children = new_children; }
IDirectXFileEnumObject_Release(dxfile_enum_object);
Modified: trunk/reactos/media/doc/README.WINE URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=6... ============================================================================== --- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original) +++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Thu Sep 25 19:46:26 2014 @@ -31,7 +31,7 @@ reactos/dll/directx/wine/d3d8 # Synced to Wine-1.7.27 reactos/dll/directx/wine/d3d9 # Synced to Wine-1.7.27 reactos/dll/directx/wine/d3dcompiler_43 # Synced to Wine-1.7.27 -reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to Wine-1.7.17 +reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to Wine-1.7.27 reactos/dll/directx/wine/d3dxof # Synced to Wine-1.7.17 reactos/dll/directx/wine/ddraw # Synced to Wine-1.7.27 reactos/dll/directx/wine/devenum # Synced to Wine-1.7.17