diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index e5f34f08f4c..a8e0f5190e9 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -3282,14 +3282,33 @@ static void convert_b8g8r8x8_unorm_b8g8r8a8_unorm_color_key(const BYTE *src, uns } } +static void convert_b8g8r8a8_unorm_b8g8r8a8_unorm_color_key(const BYTE *src, unsigned int src_pitch, + BYTE *dst, unsigned int dst_pitch, unsigned int width, unsigned int height, + const struct wined3d_color_key *color_key) +{ + const DWORD *src_row; + unsigned int x, y; + DWORD *dst_row; + + for (y = 0; y < height; ++y) + { + src_row = (DWORD *)&src[src_pitch * y]; + dst_row = (DWORD *)&dst[dst_pitch * y]; + for (x = 0; x < width; ++x) + { + DWORD src_color = src_row[x]; + if (color_in_range(color_key, src_color)) + src_color &= ~0xff000000; + dst_row[x] = src_color; + } + } +} + static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height, UINT outpitch, enum wined3d_conversion_type conversion_type, struct wined3d_surface *surface) { struct wined3d_palette *palette = NULL; struct wined3d_texture *texture; - const BYTE *source; - unsigned int x, y; - BYTE *dest; TRACE("src %p, dst %p, pitch %u, width %u, height %u, outpitch %u, conversion_type %#x, surface %p.\n", src, dst, pitch, width, height, outpitch, conversion_type, surface); @@ -3325,20 +3344,8 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI break; case WINED3D_CT_CK_B8G8R8A8: - for (y = 0; y < height; ++y) - { - source = src + pitch * y; - dest = dst + outpitch * y; - for (x = 0; x < width; ++x) - { - DWORD color = *(const DWORD *)source; - if (color_in_range(&texture->src_blt_color_key, color)) - color &= ~0xff000000; - *(DWORD*)dest = color; - source += 4; - dest += 4; - } - } + convert_b8g8r8a8_unorm_b8g8r8a8_unorm_color_key(src, pitch, dst, outpitch, + width, height, &texture->src_blt_color_key); break; default: