[PATCH 3/5] d3dx11: Made d3dx9 texture loading function generic

Fabian Maurer dark.shadow4 at web.de
Tue Sep 13 15:11:50 CDT 2016


Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/d3dx11_43/async.c | 174 +++++++++++++------------------------------------
 1 file changed, 47 insertions(+), 127 deletions(-)

diff --git a/dlls/d3dx11_43/async.c b/dlls/d3dx11_43/async.c
index aba4674..6b8ea15 100644
--- a/dlls/d3dx11_43/async.c
+++ b/dlls/d3dx11_43/async.c
@@ -34,63 +34,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
 
-/* temporary defines to not break compilation */
-
-#define IDirect3DSurface9_GetDesc(p,a)                 (p)->lpVtbl->GetDesc(p,a)
-#define IDirect3DSurface9_LockRect(p,a,b,c)            (p)->lpVtbl->LockRect(p,a,b,c)
-#define IDirect3DSurface9_UnlockRect(p)                (p)->lpVtbl->UnlockRect(p)
-
-typedef struct _D3DSURFACE_DESC {
-    DWORD           Format;
-    DWORD     Type;
-    DWORD               Usage;
-    DWORD             Pool;
-    DWORD MultiSampleType;
-    DWORD               MultiSampleQuality;
-    UINT                Width;
-    UINT                Height;
-} D3DSURFACE_DESC;
-
-typedef struct _D3DLOCKED_RECT {
-    INT                 Pitch;
-    void*               pBits;
-} D3DLOCKED_RECT;
-
-
-#define INTERFACE IDirect3DSurface9
-DECLARE_INTERFACE_(IDirect3DSurface9,IDirect3DResource9)
-{
-    /*** IUnknown methods ***/
-    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
-    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG,Release)(THIS) PURE;
-    /*** IDirect3DResource9 methods ***/
-    STDMETHOD(GetDevice)(THIS_ struct IDirect3DDevice9** ppDevice) PURE;
-    STDMETHOD(SetPrivateData)(THIS_ REFGUID guid, const void *data, DWORD data_size, DWORD flags) PURE;
-    STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid, void* pData, DWORD* pSizeOfData) PURE;
-    STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE;
-    STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE;
-    STDMETHOD_(DWORD, GetPriority)(THIS) PURE;
-    STDMETHOD_(void, PreLoad)(THIS) PURE;
-    STDMETHOD_(DWORD, GetType)(THIS) PURE;
-    /*** IDirect3DSurface9 methods ***/
-    STDMETHOD(GetContainer)(THIS_ REFIID riid, void** ppContainer) PURE;
-    STDMETHOD(GetDesc)(THIS_ D3DSURFACE_DESC* pDesc) PURE;
-    STDMETHOD(LockRect)(THIS_ D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags) PURE;
-    STDMETHOD(UnlockRect)(THIS) PURE;
-    STDMETHOD(GetDC)(THIS_ HDC* phdc) PURE;
-    STDMETHOD(ReleaseDC)(THIS_ HDC hdc) PURE;
-};
-#undef INTERFACE
-
-
-#ifndef MAKEFOURCC
-#define MAKEFOURCC(ch0, ch1, ch2, ch3)  \
-    ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |  \
-    ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
-#endif
-
-
 /* currently taken from dxgi */
 
 DXGI_FORMAT dxgi_format_from_wined3dformat(enum wined3d_format_id format)
@@ -1094,7 +1037,7 @@ static BOOL convert_dib_to_bmp(void **data, UINT *size)
 }
 
 /************************************************************
- * helper functions for D3DXLoadSurfaceFromMemory
+ * helper functions for load_image_from_memory
  */
 struct argb_conversion_info
 {
@@ -1489,7 +1432,7 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic
 }
 
 /************************************************************
- * D3DXGetImageInfoFromFileInMemory
+ * load_imageinfo_from_file_in_memory
  *
  * Fills a D3DXIMAGE_INFO structure with info about an image
  *
@@ -1509,7 +1452,7 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic
  *   datasize may be bigger than the actual file size
  *
  */
-HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(const void *data, UINT datasize, D3DXIMAGE_INFO *info)
+HRESULT WINAPI load_imageinfo_from_file_in_memory(const void *data, UINT datasize, D3DXIMAGE_INFO *info)
 {
     IWICImagingFactory *factory;
     IWICBitmapDecoder *decoder = NULL;
@@ -1637,7 +1580,7 @@ HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(const void *data, UINT datasize,
 }
 
 /************************************************************
- * D3DXLoadSurfaceFromMemory
+ * load_image_from_memory
  *
  * Loads data from a given memory chunk into a surface,
  * applying any of the specified filters.
@@ -1668,21 +1611,20 @@ HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(const void *data, UINT datasize,
  *   negative values for pSrcRect are allowed as we're only looking at the width and height anyway.
  *
  */
-HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
+HRESULT WINAPI load_image_from_memory(void *dst_data,
         const PALETTEENTRY *dst_palette, const RECT *dst_rect, const void *src_memory,
         enum wined3d_format_id src_format, UINT src_pitch, const PALETTEENTRY *src_palette, const RECT *src_rect,
-        DWORD filter, D3DCOLOR color_key)
+        DWORD filter, D3DCOLOR color_key, enum wined3d_format_id dst_format, UINT dst_pitch)
 {
     const struct pixel_format_desc *srcformatdesc, *destformatdesc;
-    D3DSURFACE_DESC surfdesc;
-    D3DLOCKED_RECT lockrect;
+
     struct volume src_size, dst_size;
 
-    TRACE("(%p, %p, %s, %p, %#x, %u, %p, %s, %#x, 0x%08x)\n",
-            dst_surface, dst_palette, wine_dbgstr_rect(dst_rect), src_memory, src_format,
-            src_pitch, src_palette, wine_dbgstr_rect(src_rect), filter, color_key);
+    TRACE("(%p, %p, %s, %p, %#x, %u, %p, %s, %#x, 0x%08x, %#x, %d)\n",
+            dst_data, dst_palette, wine_dbgstr_rect(dst_rect), src_memory, src_format,
+            src_pitch, src_palette, wine_dbgstr_rect(src_rect), filter, color_key, dst_format, dst_pitch);
 
-    if (!dst_surface || !src_memory || !src_rect)
+    if (!dst_data || !src_memory || !src_rect)
     {
         WARN("Invalid argument specified.\n");
         return D3DERR_INVALIDCALL;
@@ -1698,80 +1640,60 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
     if (filter == D3DX_DEFAULT)
         filter = D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER;
 
-    IDirect3DSurface9_GetDesc(dst_surface, &surfdesc);
-
     src_size.width = src_rect->right - src_rect->left;
     src_size.height = src_rect->bottom - src_rect->top;
     src_size.depth = 1;
-    if (!dst_rect)
-    {
-        dst_size.width = surfdesc.Width;
-        dst_size.height = surfdesc.Height;
-    }
-    else
+
+    if (dst_rect->left > dst_rect->right
+            || dst_rect->top > dst_rect->bottom
+            || dst_rect->left < 0 || dst_rect->top < 0)
     {
-        if (dst_rect->left > dst_rect->right || dst_rect->right > surfdesc.Width
-                || dst_rect->top > dst_rect->bottom || dst_rect->bottom > surfdesc.Height
-                || dst_rect->left < 0 || dst_rect->top < 0)
-        {
-            WARN("Invalid dst_rect specified.\n");
-            return D3DERR_INVALIDCALL;
-        }
-        dst_size.width = dst_rect->right - dst_rect->left;
-        dst_size.height = dst_rect->bottom - dst_rect->top;
-        if (!dst_size.width || !dst_size.height)
-            return D3D_OK;
+        WARN("Invalid dst_rect specified.\n");
+        return D3DERR_INVALIDCALL;
     }
+    dst_size.width = dst_rect->right - dst_rect->left;
+    dst_size.height = dst_rect->bottom - dst_rect->top;
+    if (!dst_size.width || !dst_size.height)
+        return D3D_OK;
+
     dst_size.depth = 1;
 
     srcformatdesc = get_format_info(src_format);
-    destformatdesc = get_format_info(surfdesc.Format);
+    destformatdesc = get_format_info(dst_format);
     if (srcformatdesc->type == FORMAT_UNKNOWN || destformatdesc->type == FORMAT_UNKNOWN)
     {
-        FIXME("Unsupported pixel format conversion %#x -> %#x\n", src_format, surfdesc.Format);
+        FIXME("Unsupported pixel format conversion %#x -> %#x\n", src_format, dst_format);
         return E_NOTIMPL;
     }
 
-    if (src_format == surfdesc.Format
+    if (src_format == dst_format
             && dst_size.width == src_size.width
             && dst_size.height == src_size.height
             && color_key == 0) /* Simple copy. */
     {
         if (src_rect->left & (srcformatdesc->block_width - 1)
-                || src_rect->top & (srcformatdesc->block_height - 1)
-                || (src_rect->right & (srcformatdesc->block_width - 1)
-                    && src_size.width != surfdesc.Width)
-                || (src_rect->bottom & (srcformatdesc->block_height - 1)
-                    && src_size.height != surfdesc.Height))
+                || src_rect->top & (srcformatdesc->block_height - 1))
         {
             WARN("Source rect %s is misaligned.\n", wine_dbgstr_rect(src_rect));
             return D3DXERR_INVALIDDATA;
         }
 
-        if (FAILED(IDirect3DSurface9_LockRect(dst_surface, &lockrect, dst_rect, 0)))
-            return D3DXERR_INVALIDDATA;
-
-        copy_pixels(src_memory, src_pitch, 0, lockrect.pBits, lockrect.Pitch, 0,
+        copy_pixels(src_memory, src_pitch, 0, dst_data, dst_pitch, 0,
                 &src_size, srcformatdesc);
-
-        IDirect3DSurface9_UnlockRect(dst_surface);
     }
     else /* Stretching or format conversion. */
     {
         if (((srcformatdesc->type != FORMAT_ARGB) && (srcformatdesc->type != FORMAT_INDEX)) ||
             (destformatdesc->type != FORMAT_ARGB))
         {
-            FIXME("Format conversion missing %#x -> %#x\n", src_format, surfdesc.Format);
+            FIXME("Format conversion missing %#x -> %#x\n", src_format, dst_format);
             return E_NOTIMPL;
         }
 
-        if (FAILED(IDirect3DSurface9_LockRect(dst_surface, &lockrect, dst_rect, 0)))
-            return D3DXERR_INVALIDDATA;
-
         if ((filter & 0xf) == D3DX_FILTER_NONE)
         {
             convert_argb_pixels(src_memory, src_pitch, 0, &src_size, srcformatdesc,
-                    lockrect.pBits, lockrect.Pitch, 0, &dst_size, destformatdesc, color_key, src_palette);
+                    dst_data, dst_pitch, 0, &dst_size, destformatdesc, color_key, src_palette);
         }
         else /* if ((filter & 0xf) == D3DX_FILTER_POINT) */
         {
@@ -1781,18 +1703,16 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
             /* Always apply a point filter until D3DX_FILTER_LINEAR,
              * D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented. */
             point_filter_argb_pixels(src_memory, src_pitch, 0, &src_size, srcformatdesc,
-                    lockrect.pBits, lockrect.Pitch, 0, &dst_size, destformatdesc, color_key, src_palette);
+                    dst_data, dst_pitch, 0, &dst_size, destformatdesc, color_key, src_palette);
         }
-
-        IDirect3DSurface9_UnlockRect(dst_surface);
     }
 
     return D3D_OK;
 }
 
-static HRESULT load_surface_from_dds(IDirect3DSurface9 *dst_surface, const PALETTEENTRY *dst_palette,
+static HRESULT load_surface_from_dds(void *dst_data, const PALETTEENTRY *dst_palette,
     const RECT *dst_rect, const void *src_data, const RECT *src_rect, DWORD filter, D3DCOLOR color_key,
-    const D3DXIMAGE_INFO *src_info)
+    const D3DXIMAGE_INFO *src_info, enum wined3d_format_id dst_format, UINT dst_pitch)
 {
     UINT size;
     UINT src_pitch;
@@ -1805,12 +1725,12 @@ static HRESULT load_surface_from_dds(IDirect3DSurface9 *dst_surface, const PALET
     if (FAILED(calculate_dds_surface_size(src_info->Format, src_info->Width, src_info->Height, &src_pitch, &size)))
         return E_NOTIMPL;
 
-    return D3DXLoadSurfaceFromMemory(dst_surface, dst_palette, dst_rect, pixels, src_info->Format,
-        src_pitch, NULL, src_rect, filter, color_key);
+    return load_image_from_memory(dst_data, dst_palette, dst_rect, pixels, src_info->Format,
+        src_pitch, NULL, src_rect, filter, color_key, dst_format, dst_pitch);
 }
 
 /************************************************************
- * D3DXLoadSurfaceFromFileInMemory
+ * load_imagedata_from_file_in_memory
  *
  * Loads data from a given buffer into a surface and fills a given
  * D3DXIMAGE_INFO structure with info about the source data.
@@ -1832,9 +1752,9 @@ static HRESULT load_surface_from_dds(IDirect3DSurface9 *dst_surface, const PALET
  *            D3DXERR_INVALIDDATA, if pSrcData is no valid image file
  *
  */
-HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(IDirect3DSurface9 *pDestSurface,
+HRESULT WINAPI load_imagedata_from_file_in_memory(void *pDstData,
         const PALETTEENTRY *pDestPalette, const RECT *pDestRect, const void *pSrcData, UINT SrcDataSize,
-        const RECT *pSrcRect, DWORD dwFilter, D3DCOLOR Colorkey, D3DXIMAGE_INFO *pSrcInfo)
+        const RECT *pSrcRect, DWORD dwFilter, D3DCOLOR Colorkey, D3DXIMAGE_INFO *pSrcInfo, enum wined3d_format_id dst_format, UINT dst_pitch)
 {
     D3DXIMAGE_INFO imginfo;
     HRESULT hr, com_init;
@@ -1848,15 +1768,15 @@ HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(IDirect3DSurface9 *pDestSurface,
     WICRect wicrect;
     RECT rect;
 
-    TRACE("dst_surface %p, dst_palette %p, dst_rect %s, src_data %p, src_data_size %u, "
-            "src_rect %s, filter %#x, color_key 0x%08x, src_info %p.\n",
-            pDestSurface, pDestPalette, wine_dbgstr_rect(pDestRect), pSrcData, SrcDataSize,
-            wine_dbgstr_rect(pSrcRect), dwFilter, Colorkey, pSrcInfo);
+    TRACE("dst_data %p, dst_palette %p, dst_rect %s, src_data %p, src_data_size %u, "
+            "src_rect %s, filter %#x, color_key 0x%08x, src_info %p, dst_format: %#x, dst_pitch: %d.\n",
+            pDstData, pDestPalette, wine_dbgstr_rect(pDestRect), pSrcData, SrcDataSize,
+            wine_dbgstr_rect(pSrcRect), dwFilter, Colorkey, pSrcInfo, dst_format, dst_pitch);
 
-    if (!pDestSurface || !pSrcData || !SrcDataSize)
+    if (!pDstData || !pSrcData || !SrcDataSize)
         return D3DERR_INVALIDCALL;
 
-    hr = D3DXGetImageInfoFromFileInMemory(pSrcData, SrcDataSize, &imginfo);
+    hr = load_imageinfo_from_file_in_memory(pSrcData, SrcDataSize, &imginfo);
 
     if (FAILED(hr))
         return hr;
@@ -1880,8 +1800,8 @@ HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(IDirect3DSurface9 *pDestSurface,
 
     if (imginfo.ImageFileFormat == D3DXIFF_DDS)
     {
-        hr = load_surface_from_dds(pDestSurface, pDestPalette, pDestRect, pSrcData, &rect,
-            dwFilter, Colorkey, &imginfo);
+        hr = load_surface_from_dds(pDstData, pDestPalette, pDestRect, pSrcData, &rect,
+            dwFilter, Colorkey, &imginfo, dst_format, dst_pitch);
         if (SUCCEEDED(hr) && pSrcInfo)
             *pSrcInfo = imginfo;
         return hr;
@@ -1974,9 +1894,9 @@ HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(IDirect3DSurface9 *pDestSurface,
 
         if (SUCCEEDED(hr))
         {
-            hr = D3DXLoadSurfaceFromMemory(pDestSurface, pDestPalette, pDestRect,
+            hr = load_image_from_memory(pDstData, pDestPalette, pDestRect,
                                            buffer, imginfo.Format, pitch,
-                                           palette, &rect, dwFilter, Colorkey);
+                                           palette, &rect, dwFilter, Colorkey, dst_format, dst_pitch);
         }
 
         HeapFree(GetProcessHeap(), 0, colors);
-- 
2.9.3




More information about the wine-patches mailing list