=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3dx9: Introduce a function for copying pixels.

Alexandre Julliard julliard at winehq.org
Mon Oct 29 13:52:51 CDT 2012


Module: wine
Branch: master
Commit: 08a5dbbb8e04d6a6fdcf6b78ca1258b569716ecf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=08a5dbbb8e04d6a6fdcf6b78ca1258b569716ecf

Author: Józef Kucia <joseph.kucia at gmail.com>
Date:   Sun Oct 28 22:59:56 2012 +0100

d3dx9: Introduce a function for copying pixels.

---

 dlls/d3dx9_36/d3dx9_36_private.h |    3 ++
 dlls/d3dx9_36/surface.c          |   63 ++++++++++++++++++++++---------------
 dlls/d3dx9_36/volume.c           |   29 +++++------------
 3 files changed, 48 insertions(+), 47 deletions(-)

diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index 125ebbc..b010310 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -72,6 +72,9 @@ HRESULT write_buffer_to_file(const WCHAR *filename, ID3DXBuffer *buffer) DECLSPE
 const struct pixel_format_desc *get_format_info(D3DFORMAT format) DECLSPEC_HIDDEN;
 const struct pixel_format_desc *get_format_info_idx(int idx) DECLSPEC_HIDDEN;
 
+void copy_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
+    BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *size,
+    const struct pixel_format_desc *format) DECLSPEC_HIDDEN;
 void convert_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
     const struct volume *src_size, const struct pixel_format_desc *src_format,
     BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *dst_size,
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 14df4ff..eae1649 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -460,11 +460,7 @@ static HRESULT save_dds_surface_to_memory(ID3DXBuffer **dst_buffer, IDirect3DSur
     if (FAILED(hr)) return hr;
 
     pixel_format = get_format_info(src_desc.Format);
-    if (pixel_format->type != FORMAT_ARGB)
-    {
-        FIXME("Unsupported pixel format %#x\n", src_desc.Format);
-        return E_NOTIMPL;
-    }
+    if (pixel_format->type == FORMAT_UNKNOWN) return E_NOTIMPL;
 
     file_size = calculate_dds_file_size(src_desc.Format, src_desc.Width, src_desc.Height, 1, 1, 1);
 
@@ -504,8 +500,8 @@ static HRESULT save_dds_surface_to_memory(ID3DXBuffer **dst_buffer, IDirect3DSur
     volume.width = src_desc.Width;
     volume.height = src_desc.Height;
     volume.depth = 1;
-    convert_argb_pixels(locked_rect.pBits, locked_rect.Pitch, 0, &volume, pixel_format,
-        pixels, dst_pitch, 0, &volume, pixel_format, 0);
+    copy_pixels(locked_rect.pBits, locked_rect.Pitch, 0, pixels, dst_pitch, 0,
+        &volume, pixel_format);
 
     IDirect3DSurface9_UnlockRect(src_surface);
 
@@ -1355,6 +1351,37 @@ static void format_from_vec4(const struct pixel_format_desc *format, const struc
 }
 
 /************************************************************
+ * copy_pixels
+ *
+ * Copies the source buffer to the destination buffer.
+ * Works for any pixel format.
+ * The source and the destination must be block-aligned.
+ */
+void copy_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
+        BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *size,
+        const struct pixel_format_desc *format)
+{
+    UINT row, slice;
+    BYTE *dst_addr;
+    const BYTE *src_addr;
+    UINT row_block_count = (size->width + format->block_width - 1) / format->block_width;
+    UINT row_count = (size->height + format->block_height - 1) / format->block_height;
+
+    for (slice = 0; slice < size->depth; slice++)
+    {
+        src_addr = src + slice * src_slice_pitch;
+        dst_addr = dst + slice * dst_slice_pitch;
+
+        for (row = 0; row < row_count; row++)
+        {
+            memcpy(dst_addr, src_addr, row_block_count * format->block_byte_count);
+            src_addr += src_row_pitch;
+            dst_addr += dst_row_pitch;
+        }
+    }
+}
+
+/************************************************************
  * convert_argb_pixels
  *
  * Copies the source buffer to the destination buffer, performing
@@ -1584,7 +1611,6 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
     D3DSURFACE_DESC surfdesc;
     D3DLOCKED_RECT lockrect;
     struct volume src_size, dst_size;
-    HRESULT hr;
 
     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,
@@ -1644,12 +1670,6 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
             && dst_size.width == src_size.width
             && dst_size.height == src_size.height) /* Simple copy. */
     {
-        UINT row_block_count = ((src_size.width + srcformatdesc->block_width - 1) / srcformatdesc->block_width);
-        UINT row_count = (src_size.height + srcformatdesc->block_height - 1) / srcformatdesc->block_height;
-        const BYTE *src_addr;
-        BYTE *dst_addr;
-        UINT row;
-
         if (src_rect->left & (srcformatdesc->block_width - 1)
                 || src_rect->top & (srcformatdesc->block_height - 1)
                 || (src_rect->right & (srcformatdesc->block_width - 1)
@@ -1661,20 +1681,11 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
             return D3DXERR_INVALIDDATA;
         }
 
-        if (FAILED(hr = IDirect3DSurface9_LockRect(dst_surface, &lockrect, dst_rect, 0)))
+        if (FAILED(IDirect3DSurface9_LockRect(dst_surface, &lockrect, dst_rect, 0)))
             return D3DXERR_INVALIDDATA;
 
-        src_addr = src_memory;
-        src_addr += (src_rect->top / srcformatdesc->block_height) * src_pitch;
-        src_addr += (src_rect->left / srcformatdesc->block_width) * srcformatdesc->block_byte_count;
-        dst_addr = lockrect.pBits;
-
-        for (row = 0; row < row_count; ++row)
-        {
-            memcpy(dst_addr, src_addr, row_block_count * srcformatdesc->block_byte_count);
-            src_addr += src_pitch;
-            dst_addr += lockrect.Pitch;
-        }
+        copy_pixels(src_memory, src_pitch, 0, lockrect.pBits, lockrect.Pitch, 0,
+                &src_size, srcformatdesc);
 
         IDirect3DSurface9_UnlockRect(dst_surface);
     }
diff --git a/dlls/d3dx9_36/volume.c b/dlls/d3dx9_36/volume.c
index 1e19d9d..5664c79 100644
--- a/dlls/d3dx9_36/volume.c
+++ b/dlls/d3dx9_36/volume.c
@@ -150,11 +150,7 @@ HRESULT WINAPI D3DXLoadVolumeFromMemory(IDirect3DVolume9 *dst_volume,
     if (desc.Format == src_format
             && dst_size.width == src_size.width && dst_size.height == src_size.height && dst_size.depth == src_size.depth)
     {
-        UINT row, slice;
-        BYTE *dst_addr;
         const BYTE *src_addr;
-        UINT row_block_count = (src_size.width + src_format_desc->block_width - 1) / src_format_desc->block_width;
-        UINT row_count = (src_size.height + src_format_desc->block_height - 1) / src_format_desc->block_height;
 
         if (src_box->Left & (src_format_desc->block_width - 1)
                 || src_box->Top & (src_format_desc->block_height - 1)
@@ -168,26 +164,17 @@ HRESULT WINAPI D3DXLoadVolumeFromMemory(IDirect3DVolume9 *dst_volume,
             return E_NOTIMPL;
         }
 
+        src_addr = src_memory;
+        src_addr += src_box->Front * src_slice_pitch;
+        src_addr += (src_box->Top / src_format_desc->block_height) * src_row_pitch;
+        src_addr += (src_box->Left / src_format_desc->block_width) * src_format_desc->block_byte_count;
+
         hr = IDirect3DVolume9_LockBox(dst_volume, &locked_box, dst_box, 0);
         if (FAILED(hr)) return hr;
 
-        for (slice = 0; slice < src_size.depth; slice++)
-        {
-            src_addr = src_memory;
-            src_addr += (src_box->Front + slice) * src_slice_pitch;
-            src_addr += (src_box->Top / src_format_desc->block_height) * src_row_pitch;
-            src_addr += (src_box->Left / src_format_desc->block_width) * src_format_desc->block_byte_count;
-
-            dst_addr = locked_box.pBits;
-            dst_addr += slice * locked_box.SlicePitch;
-
-            for (row = 0; row < row_count; row++)
-            {
-                memcpy(dst_addr, src_addr, row_block_count * src_format_desc->block_byte_count);
-                src_addr += src_row_pitch;
-                dst_addr += locked_box.RowPitch;
-            }
-        }
+        copy_pixels(src_addr, src_row_pitch, src_slice_pitch,
+                locked_box.pBits, locked_box.RowPitch, locked_box.SlicePitch,
+                &dst_size, dst_format_desc);
 
         IDirect3DVolume9_UnlockBox(dst_volume);
     }




More information about the wine-cvs mailing list