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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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=…
==============================================================================
--- 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