[PATCH 3/3] d3dx9_36: Add DIB file support to D3DXSaveSurfaceToFileInMemory.

Christian Costa titan.costa at gmail.com
Sun Apr 21 16:57:12 CDT 2013


---
 dlls/d3dx9_36/surface.c |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 2dc2af6..abfbe7c 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -1933,6 +1933,7 @@ HRESULT WINAPI D3DXSaveSurfaceToFileInMemory(ID3DXBuffer **dst_buffer, D3DXIMAGE
     switch (file_format)
     {
         case D3DXIFF_BMP:
+        case D3DXIFF_DIB:
             encoder_clsid = &CLSID_WICBmpEncoder;
             break;
         case D3DXIFF_PNG:
@@ -1943,7 +1944,6 @@ HRESULT WINAPI D3DXSaveSurfaceToFileInMemory(ID3DXBuffer **dst_buffer, D3DXIMAGE
             break;
         case D3DXIFF_DDS:
             return save_dds_surface_to_memory(dst_buffer, src_surface, src_rect);
-        case D3DXIFF_DIB:
         case D3DXIFF_HDR:
         case D3DXIFF_PFM:
         case D3DXIFF_TGA:
@@ -2080,6 +2080,10 @@ HRESULT WINAPI D3DXSaveSurfaceToFileInMemory(ID3DXBuffer **dst_buffer, D3DXIMAGE
     }
     size = stream_stats.cbSize.u.LowPart;
 
+    /* Remove BMP header for DIB */
+    if (file_format == D3DXIFF_DIB)
+        size -= sizeof(BITMAPFILEHEADER);
+
     hr = D3DXCreateBuffer(size, &buffer);
     if (FAILED(hr)) goto cleanup;
 
@@ -2088,6 +2092,9 @@ HRESULT WINAPI D3DXSaveSurfaceToFileInMemory(ID3DXBuffer **dst_buffer, D3DXIMAGE
     {
         void *buffer_pointer = ID3DXBuffer_GetBufferPointer(buffer);
         void *stream_data = GlobalLock(stream_hglobal);
+        /* Remove BMP header for DIB */
+        if (file_format == D3DXIFF_DIB)
+            stream_data = (void*)((BYTE*)stream_data + sizeof(BITMAPFILEHEADER));
         memcpy(buffer_pointer, stream_data, size);
         GlobalUnlock(stream_hglobal);
         *dst_buffer = buffer;




More information about the wine-patches mailing list