Commit 9956ea70 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Convert from floating point to specific surface formats.

Instead of from WINED3DFMT_B8G8R8A8_UNORM.
parent a455a918
......@@ -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))
......
......@@ -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 = {
......
......@@ -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;
......
......@@ -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)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment