wined3d: Remove IWineD3DSurface::RealizePalette() from the public interface.

This commit is contained in:
Henri Verbeet 2011-01-24 11:19:37 +01:00 committed by Alexandre Julliard
parent 4219fef3f4
commit 05603c4568
6 changed files with 119 additions and 99 deletions

View File

@ -163,10 +163,11 @@ static HRESULT WINAPI IWineD3DPaletteImpl_SetEntries(IWineD3DPalette *iface,
LIST_FOR_EACH_ENTRY(res, &This->device->resources, IWineD3DResourceImpl, resource.resource_list_entry)
{
if(IWineD3DResource_GetType((IWineD3DResource *) res) == WINED3DRTYPE_SURFACE) {
IWineD3DSurfaceImpl *impl = (IWineD3DSurfaceImpl *) res;
if(impl->palette == This)
IWineD3DSurface_RealizePalette((IWineD3DSurface *) res);
if (IWineD3DResource_GetType((IWineD3DResource *)res) == WINED3DRTYPE_SURFACE)
{
IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)res;
if (surface->palette == This)
surface->surface_ops->surface_realize_palette(surface);
}
}

View File

@ -333,6 +333,64 @@ void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
}
}
static void surface_realize_palette(IWineD3DSurfaceImpl *surface)
{
IWineD3DPaletteImpl *palette = surface->palette;
TRACE("surface %p.\n", surface);
if (!palette) return;
if (surface->resource.format->id == WINED3DFMT_P8_UINT
|| surface->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM)
{
if (surface->resource.usage & WINED3DUSAGE_RENDERTARGET)
{
/* Make sure the texture is up to date. This call doesn't do
* anything if the texture is already up to date. */
surface_load_location(surface, SFLAG_INTEXTURE, NULL);
/* We want to force a palette refresh, so mark the drawable as not being up to date */
surface_modify_location(surface, SFLAG_INDRAWABLE, FALSE);
}
else
{
if (!(surface->flags & SFLAG_INSYSMEM))
{
TRACE("Palette changed with surface that does not have an up to date system memory copy.\n");
surface_load_location(surface, SFLAG_INSYSMEM, NULL);
}
surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
}
}
if (surface->flags & SFLAG_DIBSECTION)
{
RGBQUAD col[256];
unsigned int i;
TRACE("Updating the DC's palette.\n");
for (i = 0; i < 256; ++i)
{
col[i].rgbRed = palette->palents[i].peRed;
col[i].rgbGreen = palette->palents[i].peGreen;
col[i].rgbBlue = palette->palents[i].peBlue;
col[i].rgbReserved = 0;
}
SetDIBColorTable(surface->hDC, 0, 256, col);
}
/* Propagate the changes to the drawable when we have a palette. */
if (surface->resource.usage & WINED3DUSAGE_RENDERTARGET)
surface_load_location(surface, SFLAG_INDRAWABLE, NULL);
}
static const struct wined3d_surface_ops surface_ops =
{
surface_realize_palette,
};
HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id,
@ -3896,65 +3954,14 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
return IWineD3DBaseSurfaceImpl_BltFast(iface, dstx, dsty, src_surface, rsrc, trans);
}
static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface)
{
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
RGBQUAD col[256];
IWineD3DPaletteImpl *pal = This->palette;
unsigned int n;
TRACE("(%p)\n", This);
if (!pal) return WINED3D_OK;
if (This->resource.format->id == WINED3DFMT_P8_UINT
|| This->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM)
{
if (This->resource.usage & WINED3DUSAGE_RENDERTARGET)
{
/* Make sure the texture is up to date. This call doesn't do
* anything if the texture is already up to date. */
surface_load_location(This, SFLAG_INTEXTURE, NULL);
/* We want to force a palette refresh, so mark the drawable as not being up to date */
surface_modify_location(This, SFLAG_INDRAWABLE, FALSE);
}
else
{
if (!(This->flags & SFLAG_INSYSMEM))
{
TRACE("Palette changed with surface that does not have an up to date system memory copy.\n");
surface_load_location(This, SFLAG_INSYSMEM, NULL);
}
TRACE("Dirtifying surface\n");
surface_modify_location(This, SFLAG_INSYSMEM, TRUE);
}
}
if (This->flags & SFLAG_DIBSECTION)
{
TRACE("(%p): Updating the hdc's palette\n", This);
for (n=0; n<256; n++) {
col[n].rgbRed = pal->palents[n].peRed;
col[n].rgbGreen = pal->palents[n].peGreen;
col[n].rgbBlue = pal->palents[n].peBlue;
col[n].rgbReserved = 0;
}
SetDIBColorTable(This->hDC, 0, 256, col);
}
/* Propagate the changes to the drawable when we have a palette. */
if (This->resource.usage & WINED3DUSAGE_RENDERTARGET)
surface_load_location(This, SFLAG_INDRAWABLE, NULL);
return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
/** Check against the maximum texture sizes supported by the video card **/
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
unsigned int pow2Width, pow2Height;
This->surface_ops = &surface_ops;
This->texture_name = 0;
This->texture_target = GL_TEXTURE_2D;
@ -4701,7 +4708,6 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
IWineD3DSurfaceImpl_BltFast,
IWineD3DBaseSurfaceImpl_GetPalette,
IWineD3DBaseSurfaceImpl_SetPalette,
IWineD3DSurfaceImpl_RealizePalette,
IWineD3DBaseSurfaceImpl_SetColorKey,
IWineD3DBaseSurfaceImpl_GetPitch,
IWineD3DSurfaceImpl_SetMem,

View File

@ -237,9 +237,10 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD
if (This->resource.usage & WINED3DUSAGE_RENDERTARGET)
PalImpl->flags |= WINEDDPCAPS_PRIMARYSURFACE;
return IWineD3DSurface_RealizePalette(iface);
This->surface_ops->surface_realize_palette(This);
}
else return WINED3D_OK;
return WINED3D_OK;
}
HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD flags, const WINEDDCOLORKEY *CKey)

View File

@ -57,6 +57,49 @@ void surface_gdi_cleanup(IWineD3DSurfaceImpl *This)
resource_cleanup((IWineD3DResourceImpl *)This);
}
static void gdi_surface_realize_palette(IWineD3DSurfaceImpl *surface)
{
IWineD3DPaletteImpl *palette = surface->palette;
TRACE("surface %p.\n", surface);
if (!palette) return;
if (surface->flags & SFLAG_DIBSECTION)
{
RGBQUAD col[256];
unsigned int i;
TRACE("Updating the DC's palette.\n");
for (i = 0; i < 256; ++i)
{
col[i].rgbRed = palette->palents[i].peRed;
col[i].rgbGreen = palette->palents[i].peGreen;
col[i].rgbBlue = palette->palents[i].peBlue;
col[i].rgbReserved = 0;
}
SetDIBColorTable(surface->hDC, 0, 256, col);
}
/* Update the image because of the palette change. Some games like e.g.
* Red Alert call SetEntries a lot to implement fading. */
/* Tell the swapchain to update the screen. */
if (surface->container.type == WINED3D_CONTAINER_SWAPCHAIN)
{
IWineD3DSwapChainImpl *swapchain = surface->container.u.swapchain;
if (surface == swapchain->front_buffer)
{
x11_copy_to_screen(swapchain, NULL);
}
}
}
static const struct wined3d_surface_ops gdi_surface_ops =
{
gdi_surface_realize_palette,
};
/*****************************************************************************
* IWineD3DSurface::Release, GDI version
*
@ -290,42 +333,6 @@ static HRESULT WINAPI IWineGDISurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC
return WINED3D_OK;
}
static HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
RGBQUAD col[256];
IWineD3DPaletteImpl *pal = This->palette;
unsigned int n;
TRACE("(%p)\n", This);
if (!pal) return WINED3D_OK;
if (This->flags & SFLAG_DIBSECTION)
{
TRACE("(%p): Updating the hdc's palette\n", This);
for (n=0; n<256; n++) {
col[n].rgbRed = pal->palents[n].peRed;
col[n].rgbGreen = pal->palents[n].peGreen;
col[n].rgbBlue = pal->palents[n].peBlue;
col[n].rgbReserved = 0;
}
SetDIBColorTable(This->hDC, 0, 256, col);
}
/* Update the image because of the palette change. Some games like e.g Red Alert
call SetEntries a lot to implement fading. */
/* Tell the swapchain to update the screen */
if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN)
{
IWineD3DSwapChainImpl *swapchain = This->container.u.swapchain;
if (This == swapchain->front_buffer)
{
x11_copy_to_screen(swapchain, NULL);
}
}
return WINED3D_OK;
}
/*****************************************************************************
* IWineD3DSurface::PrivateSetup, GDI version
*
@ -349,6 +356,8 @@ IWineGDISurfaceImpl_PrivateSetup(IWineD3DSurface *iface)
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
HRESULT hr;
This->surface_ops = &gdi_surface_ops;
if(This->resource.usage & WINED3DUSAGE_OVERLAY)
{
ERR("(%p) Overlays not yet supported by GDI surfaces\n", This);
@ -469,7 +478,6 @@ const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl =
IWineD3DBaseSurfaceImpl_BltFast,
IWineD3DBaseSurfaceImpl_GetPalette,
IWineD3DBaseSurfaceImpl_SetPalette,
IWineGDISurfaceImpl_RealizePalette,
IWineD3DBaseSurfaceImpl_SetColorKey,
IWineD3DBaseSurfaceImpl_GetPitch,
IWineGDISurfaceImpl_SetMem,

View File

@ -2088,6 +2088,11 @@ struct wined3d_subresource_container
} u;
};
struct wined3d_surface_ops
{
void (*surface_realize_palette)(struct IWineD3DSurfaceImpl *surface);
};
/*****************************************************************************
* IWineD3DSurface implementation structure
*/
@ -2098,6 +2103,7 @@ struct IWineD3DSurfaceImpl
IWineD3DResourceClass resource;
/* IWineD3DSurface fields */
const struct wined3d_surface_ops *surface_ops;
struct wined3d_subresource_container container;
WINED3DSURFACET_DESC currentDesc;
IWineD3DPaletteImpl *palette; /* D3D7 style palette handling */

View File

@ -2426,8 +2426,6 @@ interface IWineD3DSurface : IWineD3DResource
HRESULT SetPalette(
[in] IWineD3DPalette *palette
);
HRESULT RealizePalette(
);
HRESULT SetColorKey(
[in] DWORD flags,
[in] const WINEDDCOLORKEY *color_key