Roderick Colenbrander : wined3d: In DirectDraw a palette is a property of a surface while in d3d8/ 9 it is a property of a device.
Module: wine Branch: master Commit: a5444cb897bb250d28e4fb83323e0bcf6fa01d23 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5444cb897bb250d28e4fb8332... Author: Roderick Colenbrander <thunderbird2k(a)gmx.net> Date: Thu Feb 21 18:36:50 2008 +0100 wined3d: In DirectDraw a palette is a property of a surface while in d3d8/9 it is a property of a device. --- dlls/wined3d/surface.c | 44 +++++++++++++++++++++++++------------------- 1 files changed, 25 insertions(+), 19 deletions(-) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index c74c80f..e56b928 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -2024,31 +2024,22 @@ static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4] } if (pal == NULL) { + /* In DirectDraw the palette is a property of the surface, there are no such things as device palettes. */ + if(dxVersion <= 7) { + ERR("This code should never get entered for DirectDraw!, expect problems\n"); + return; + } + /* Still no palette? Use the device's palette */ /* can ddraw and d3d < 8 surfaces use device's palette (d3d >= 8 feature)? */ for (i = 0; i < 256; i++) { table[i][0] = device->palettes[device->currentPalette][i].peRed; table[i][1] = device->palettes[device->currentPalette][i].peGreen; table[i][2] = device->palettes[device->currentPalette][i].peBlue; - - if(dxVersion >= 8) { - /* Direct3D >= 8 palette usage style: P8 textures use device palettes, palette entry format is A8R8G8B8, - alpha is stored in peFlags and may be used by the app if D3DPTEXTURECAPS_ALPHAPALETTE device - capability flag is present (wine does advertise this capability) */ - table[i][3] = device->palettes[device->currentPalette][i].peFlags; - } else { - /* BltOverride uses a GL_ALPHA_TEST based on GL_NOT_EQUAL 0, so the alpha component - of pixels that should be masked away should be 0. When inde_in_alpha is set, - we will store the palette index (the glReadPixels code reads GL_ALPHA back) - or else we store 0xff. */ - if(colorkey && (i >= This->SrcBltCKey.dwColorSpaceLowValue) && (i <= This->SrcBltCKey.dwColorSpaceHighValue)) { - table[i][3] = 0; - } else if(index_in_alpha) { - table[i][3] = i; - } else { - table[i][3] = 0xFF; - } - } + /* Direct3D >= 8 palette usage style: P8 textures use device palettes, palette entry format is A8R8G8B8, + alpha is stored in peFlags and may be used by the app if D3DPTEXTURECAPS_ALPHAPALETTE device + capability flag is present (wine does advertise this capability) */ + table[i][3] = device->palettes[device->currentPalette][i].peFlags; } } else { TRACE("Using surface palette %p\n", pal); @@ -3176,6 +3167,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * DWORD oldCKeyFlags = Src->CKeyFlags; WINEDDCOLORKEY oldBltCKey = This->SrcBltCKey; RECT SourceRectangle; + BOOL paletteOverride = FALSE; TRACE("Blt from surface %p to rendertarget %p\n", Src, This); @@ -3227,6 +3219,16 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * Src->CKeyFlags &= ~WINEDDSD_CKSRCBLT; } + /* When blitting from an offscreen surface to a rendertarget, the source + * surface is not required to have a palette. Our rendering / conversion + * code further down the road retrieves the palette from the surface, so + * it must have a palette set. */ + if((Src->resource.format == WINED3DFMT_P8) && (Src->palette == NULL)) { + paletteOverride = TRUE; + TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This); + Src->palette = This->palette; + } + /* Now load the surface */ IWineD3DSurface_PreLoad((IWineD3DSurface *) Src); @@ -3327,6 +3329,10 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * Src->CKeyFlags = oldCKeyFlags; This->SrcBltCKey = oldBltCKey; + /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */ + if(paletteOverride) + Src->palette = NULL; + LEAVE_GL(); /* TODO: If the surface is locked often, perform the Blt in software on the memory instead */
participants (1)
-
Alexandre Julliard