[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