Roderick Colenbrander : wined3d: Introduce a helper function which converts a color from the surface format to ARGB .

Alexandre Julliard julliard at winehq.org
Tue Mar 30 10:39:44 CDT 2010


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

Author: Roderick Colenbrander <thunderbird2k at gmail.com>
Date:   Thu Mar 25 16:42:51 2010 +0100

wined3d: Introduce a helper function which converts a color from the surface format to ARGB.

---

 dlls/wined3d/surface.c |   94 +++++++++++++++++++++++++++++-------------------
 1 files changed, 57 insertions(+), 37 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 9850731..2cfcb36 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -959,6 +959,61 @@ static inline BOOL surface_can_stretch_rect(IWineD3DSurfaceImpl *src, IWineD3DSu
             && is_identity_fixup(dst->resource.format_desc->color_fixup)));
 }
 
+static BOOL surface_convert_color_to_argb(IWineD3DSurfaceImpl *This, DWORD color, DWORD *argb_color)
+{
+    IWineD3DDeviceImpl *device = This->resource.device;
+
+    switch(This->resource.format_desc->format)
+    {
+        case WINED3DFMT_P8_UINT:
+            {
+                DWORD alpha;
+
+                if (primary_render_target_is_p8(device))
+                    alpha = color << 24;
+                else
+                    alpha = 0xFF000000;
+
+                if (This->palette) {
+                    *argb_color = (alpha |
+                            (This->palette->palents[color].peRed << 16) |
+                            (This->palette->palents[color].peGreen << 8) |
+                            (This->palette->palents[color].peBlue));
+                } else {
+                    *argb_color = alpha;
+                }
+            }
+            break;
+
+        case WINED3DFMT_B5G6R5_UNORM:
+            {
+                if (color == 0xFFFF) {
+                    *argb_color = 0xFFFFFFFF;
+                } else {
+                    *argb_color = ((0xFF000000) |
+                            ((color & 0xF800) << 8) |
+                            ((color & 0x07E0) << 5) |
+                            ((color & 0x001F) << 3));
+                }
+            }
+            break;
+
+        case WINED3DFMT_B8G8R8_UNORM:
+        case WINED3DFMT_B8G8R8X8_UNORM:
+            *argb_color = 0xFF000000 | color;
+            break;
+
+        case WINED3DFMT_B8G8R8A8_UNORM:
+            *argb_color = color;
+            break;
+
+        default:
+            ERR("Unhandled conversion from %s to ARGB!\n", debug_d3dformat(This->resource.format_desc->format));
+            return FALSE;
+    }
+    return TRUE;
+}
+
 static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
 {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
@@ -4145,44 +4200,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
             /* The color as given in the Blt function is in the format of the frame-buffer...
              * 'clear' expect it in ARGB format => we need to do some conversion :-)
              */
-            if (This->resource.format_desc->format == WINED3DFMT_P8_UINT)
+            if (!surface_convert_color_to_argb(This, DDBltFx->u5.dwFillColor, &color))
             {
-                DWORD alpha;
-
-                if (primary_render_target_is_p8(myDevice)) alpha = DDBltFx->u5.dwFillColor << 24;
-                else alpha = 0xFF000000;
-
-                if (This->palette) {
-                    color = (alpha |
-                            (This->palette->palents[DDBltFx->u5.dwFillColor].peRed << 16) |
-                            (This->palette->palents[DDBltFx->u5.dwFillColor].peGreen << 8) |
-                            (This->palette->palents[DDBltFx->u5.dwFillColor].peBlue));
-                } else {
-                    color = alpha;
-                }
-            }
-            else if (This->resource.format_desc->format == WINED3DFMT_B5G6R5_UNORM)
-            {
-                if (DDBltFx->u5.dwFillColor == 0xFFFF) {
-                    color = 0xFFFFFFFF;
-                } else {
-                    color = ((0xFF000000) |
-                            ((DDBltFx->u5.dwFillColor & 0xF800) << 8) |
-                            ((DDBltFx->u5.dwFillColor & 0x07E0) << 5) |
-                            ((DDBltFx->u5.dwFillColor & 0x001F) << 3));
-                }
-            }
-            else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8_UNORM
-                    || This->resource.format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
-            {
-                color = 0xFF000000 | DDBltFx->u5.dwFillColor;
-            }
-            else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
-            {
-                color = DDBltFx->u5.dwFillColor;
-            }
-            else {
-                ERR("Wrong surface type for BLT override(Format doesn't match) !\n");
+                /* The color conversion function already prints an error, so need to do it here */
                 return WINED3DERR_INVALIDCALL;
             }
 




More information about the wine-cvs mailing list