Module: wine Branch: master Commit: 9956ea70449907aaeee72b72e4b7f178ac876a68 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9956ea70449907aaeee72b72e4...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Aug 23 18:28:07 2010 +0200
wined3d: Convert from floating point to specific surface formats.
Instead of from WINED3DFMT_B8G8R8A8_UNORM.
---
dlls/wined3d/device.c | 14 +++----------- dlls/wined3d/surface.c | 10 +++++++--- dlls/wined3d/utils.c | 30 +++++++++++++++++++----------- dlls/wined3d/wined3d_private.h | 5 ++--- 4 files changed, 31 insertions(+), 28 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index bb793cd..e528296 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5496,6 +5496,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DeletePatch(IWineD3DDevice *iface, UINT static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface, IWineD3DSurface *surface, const WINED3DRECT *pRect, WINED3DCOLOR color) { + const WINED3DCOLORVALUE c = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)surface; WINEDDBLTFX BltFx;
@@ -5510,7 +5511,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface,
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - const WINED3DCOLORVALUE c = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; const RECT draw_rect = {0, 0, s->currentDesc.Width, s->currentDesc.Height};
return device_clear_render_targets((IWineD3DDeviceImpl *)iface, 1, &s, @@ -5521,7 +5521,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface, /* Just forward this to the DirectDraw blitting engine */ memset(&BltFx, 0, sizeof(BltFx)); BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(color, s->resource.format_desc->format); + BltFx.u5.dwFillColor = wined3d_format_convert_from_float(s->resource.format_desc, &c); return IWineD3DSurface_Blt(surface, (const RECT *)pRect, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); } @@ -5560,19 +5560,11 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac else { WINEDDBLTFX BltFx; - WINED3DCOLOR c; - - WARN("Converting to WINED3DCOLOR, this might give incorrect results\n"); - - c = ((DWORD)(color->b * 255.0f)); - c |= ((DWORD)(color->g * 255.0f)) << 8; - c |= ((DWORD)(color->r * 255.0f)) << 16; - c |= ((DWORD)(color->a * 255.0f)) << 24;
/* Just forward this to the DirectDraw blitting engine */ memset(&BltFx, 0, sizeof(BltFx)); BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(c, surface->resource.format_desc->format); + BltFx.u5.dwFillColor = wined3d_format_convert_from_float(surface->resource.format_desc, color); hr = IWineD3DSurface_Blt((IWineD3DSurface *)surface, NULL, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); if (FAILED(hr)) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 06893ee..c210fdf 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -4923,13 +4923,17 @@ static BOOL cpu_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ return FALSE; }
-static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color) +static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, + IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD color) { + const WINED3DCOLORVALUE c = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; WINEDDBLTFX BltFx; + memset(&BltFx, 0, sizeof(BltFx)); BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(fill_color, dst_surface->resource.format_desc->format); - return IWineD3DBaseSurfaceImpl_Blt((IWineD3DSurface*)dst_surface, dst_rect, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); + BltFx.u5.dwFillColor = wined3d_format_convert_from_float(dst_surface->resource.format_desc, &c); + return IWineD3DBaseSurfaceImpl_Blt((IWineD3DSurface*)dst_surface, dst_rect, + NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); }
const struct blit_shader cpu_blit = { diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index e3a0cb6..b6d7eab 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -2532,25 +2532,33 @@ BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc, short *d return TRUE; }
-DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) +DWORD wined3d_format_convert_from_float(const struct wined3d_format_desc *format, const WINED3DCOLORVALUE *color) { + WINED3DFORMAT destfmt = format->format; unsigned int r, g, b, a; DWORD ret;
- if (destfmt == WINED3DFMT_B8G8R8A8_UNORM - || destfmt == WINED3DFMT_B8G8R8X8_UNORM - || destfmt == WINED3DFMT_B8G8R8_UNORM) - return color; + TRACE("Converting color {%.8e %.8e %.8e %.8e} to format %s.\n", + color->r, color->g, color->b, color->a, debug_d3dformat(destfmt));
- TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt)); - - a = (color & 0xff000000) >> 24; - r = (color & 0x00ff0000) >> 16; - g = (color & 0x0000ff00) >> 8; - b = (color & 0x000000ff) >> 0; + r = (DWORD)((color->r * 255.0f) + 0.5f); + g = (DWORD)((color->g * 255.0f) + 0.5f); + b = (DWORD)((color->b * 255.0f) + 0.5f); + a = (DWORD)((color->a * 255.0f) + 0.5f);
switch(destfmt) { + case WINED3DFMT_B8G8R8A8_UNORM: + case WINED3DFMT_B8G8R8X8_UNORM: + case WINED3DFMT_B8G8R8_UNORM: + ret = b; + ret |= g << 8; + ret |= r << 16; + ret |= a << 24; + TRACE("Returning 0x%08x.\n", ret); + return ret; + + case WINED3DFMT_B5G6R5_UNORM: if(r == 0xff && g == 0xff && b == 0xff) return 0xffff; r = (r * 32) / 256; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ecb426c..c0ac388 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2620,9 +2620,6 @@ const char *debug_d3dtop(WINED3DTEXTUREOP d3dtop) DECLSPEC_HIDDEN; void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN; const char *debug_surflocation(DWORD flag) DECLSPEC_HIDDEN;
-/* Color conversion routines */ -DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) DECLSPEC_HIDDEN; - /* Routines for GL <-> D3D values */ GLenum StencilOp(DWORD op) DECLSPEC_HIDDEN; GLenum CompareFunc(DWORD func) DECLSPEC_HIDDEN; @@ -2998,6 +2995,8 @@ const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; UINT wined3d_format_calculate_size(const struct wined3d_format_desc *format, UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN; +DWORD wined3d_format_convert_from_float(const struct wined3d_format_desc *format, + const WINED3DCOLORVALUE *color) DECLSPEC_HIDDEN;
static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock) {