[PATCH] d3dx9: Add support for ABGR formats in filter_copy_simple_data

Tony Wasserka tony.wasserka at freenet.de
Wed Jul 15 10:32:02 CDT 2009


---
 dlls/d3dx9_36/surface.c |   41 ++++++++++++++++++++++++++++-------------
 1 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index f9f31f9..635d412 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -328,15 +328,22 @@ HRESULT WINAPI D3DXLoadSurfaceFromResourceW(LPDIRECT3DSURFACE9 pDestSurface,
  * get_masks
  *
  * Returns the masks necessary to split a pixel into its components.
- * Works only for ARGB formats with 1 - 4 bytes per pixel.
+ * Works only for ARGB and ABGR formats with 1 - 4 bytes per pixel.
  *
  */
 void get_masks(StaticPixelFormatDesc format, DWORD *amask, DWORD *rmask, DWORD *gmask, DWORD *bmask)
 {
-    *amask = ((1 << format.abits) - 1) << (format.rbits + format.gbits + format.bbits);
-    *rmask = ((1 << format.rbits) - 1) << (format.gbits + format.bbits);
-    *gmask = ((1 << format.gbits) - 1) << (format.bbits);
-    *bmask =  (1 << format.bbits) - 1;
+    if(format.type == FORMAT_ARGB) {
+        *amask = ((1 << format.abits) - 1) << (format.rbits + format.gbits + format.bbits);
+        *rmask = ((1 << format.rbits) - 1) << (format.gbits + format.bbits);
+        *gmask = ((1 << format.gbits) - 1) << (format.bbits);
+        *bmask =  (1 << format.bbits) - 1;
+    } else if(format.type == FORMAT_ABGR) {
+        *amask = ((1 << format.abits) - 1) << (format.bbits + format.gbits + format.rbits);
+        *bmask = ((1 << format.bbits) - 1) << (format.gbits + format.rbits);
+        *gmask = ((1 << format.gbits) - 1) << (format.rbits);
+        *rmask =  (1 << format.rbits) - 1;
+    }
 }
 
 /************************************************************
@@ -344,15 +351,23 @@ void get_masks(StaticPixelFormatDesc format, DWORD *amask, DWORD *rmask, DWORD *
  *
  * Returns the (nonnegative) shifts necessary to extract each component of a pixel
  * and scale it to the destination format's bits per channel.
- * Works only for ARGB formats.
+ * Works only for ARGB and ABGR formats.
  *
  */
 void get_shifts(StaticPixelFormatDesc srcformat, StaticPixelFormatDesc destformat, DWORD *ashift, DWORD *rshift, DWORD *gshift, DWORD *bshift)
 {
-    *ashift = srcformat.rbits + srcformat.gbits + srcformat.bbits + max(srcformat.abits - destformat.abits, 0);
-    *rshift = srcformat.gbits + srcformat.bbits + max(srcformat.rbits - destformat.rbits, 0);
-    *gshift = srcformat.bbits + max(srcformat.gbits - destformat.gbits, 0);
-    *bshift = max(srcformat.bbits - destformat.bbits, 0);
+    if(srcformat.type == FORMAT_ARGB) {
+        *ashift = srcformat.rbits + srcformat.gbits + srcformat.bbits + max(srcformat.abits - destformat.abits, 0);
+        *rshift = srcformat.gbits + srcformat.bbits + max(srcformat.rbits - destformat.rbits, 0);
+        *gshift = srcformat.bbits + max(srcformat.gbits - destformat.gbits, 0);
+        *bshift = max(srcformat.bbits - destformat.bbits, 0);
+    } else if(srcformat.type == FORMAT_ABGR) {
+        *ashift = srcformat.bbits + srcformat.gbits + srcformat.rbits + max(srcformat.abits - destformat.abits, 0);
+        *bshift = srcformat.gbits + srcformat.rbits + max(srcformat.bbits - destformat.bbits, 0);
+        *gshift = srcformat.rbits + max(srcformat.gbits - destformat.gbits, 0);
+        *rshift = max(srcformat.rbits - destformat.rbits, 0);
+    }
+
 }
 
 /************************************************************
@@ -389,7 +404,7 @@ void convert_a8r8g8b8_to_format(DWORD *col, DWORD *mask, StaticPixelFormatDesc d
  *
  * Copies the source buffer to the destination buffer, performing
  * any necessary format conversion and color keying.
- * Works only for ARGB formats with 1 - 4 bytes per pixel.
+ * Works only for ARGB and ABGR formats with 1 - 4 bytes per pixel.
  */
 void filter_copy_simple_data(LPBYTE  pSrc, UINT  SrcPitch, POINT  SrcSize, StaticPixelFormatDesc  SrcFormat,
                              LPBYTE pDest, UINT DestPitch, POINT DestSize, StaticPixelFormatDesc DestFormat,
@@ -504,8 +519,8 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(LPDIRECT3DSURFACE9 pDestSurface,
 
     get_format_info(SrcFormat, &SrcFormatDesc);
     get_format_info(SurfDesc.Format, &DestFormatDesc);
-    if( SrcFormatDesc.type != FORMAT_ARGB ||  SrcFormatDesc.bpp > 4) return E_NOTIMPL;
-    if(DestFormatDesc.type != FORMAT_ARGB || DestFormatDesc.bpp > 4) return E_NOTIMPL;
+    if( SrcFormatDesc.type == FORMAT_UNKNOWN ||  SrcFormatDesc.bpp > 4) return E_NOTIMPL;
+    if(DestFormatDesc.type == FORMAT_UNKNOWN || DestFormatDesc.bpp > 4) return E_NOTIMPL;
 
     SrcSize.x = pSrcRect->right - pSrcRect->left;
     SrcSize.y = pSrcRect->bottom - pSrcRect->top;
-- 
1.6.0.2


--------------050702030301000503090602--



More information about the wine-patches mailing list