From 4891ca168e9841918797f6811482e42a980d076b Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 24 Jan 2011 11:19:38 +0100 Subject: [PATCH] wined3d: Remove IWineD3DSurface::DrawOverlay() from the public interface. --- dlls/wined3d/surface.c | 60 +++++++++++++++++----------------- dlls/wined3d/surface_base.c | 4 +-- dlls/wined3d/surface_gdi.c | 13 ++++---- dlls/wined3d/wined3d_private.h | 1 + include/wine/wined3d.idl | 2 -- 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 658e3fcf459..2300a68cd68 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -386,9 +386,32 @@ static void surface_realize_palette(IWineD3DSurfaceImpl *surface) surface_load_location(surface, SFLAG_INDRAWABLE, NULL); } +static HRESULT surface_draw_overlay(IWineD3DSurfaceImpl *surface) +{ + HRESULT hr; + + /* If there's no destination surface there is nothing to do. */ + if (!surface->overlay_dest) + return WINED3D_OK; + + /* Blt calls ModifyLocation on the dest surface, which in turn calls + * DrawOverlay to update the overlay. Prevent an endless recursion. */ + if (surface->overlay_dest->flags & SFLAG_INOVERLAYDRAW) + return WINED3D_OK; + + surface->overlay_dest->flags |= SFLAG_INOVERLAYDRAW; + hr = IWineD3DSurface_Blt((IWineD3DSurface *)surface->overlay_dest, + &surface->overlay_destrect, (IWineD3DSurface *)surface, &surface->overlay_srcrect, + WINEDDBLT_WAIT, NULL, WINED3DTEXF_LINEAR); + surface->overlay_dest->flags &= ~SFLAG_INOVERLAYDRAW; + + return hr; +} + static const struct wined3d_surface_ops surface_ops = { surface_realize_palette, + surface_draw_overlay, }; HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment, @@ -2070,9 +2093,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Unmap(IWineD3DSurface *iface) memset(&This->lockedRect, 0, sizeof(RECT)); /* Overlays have to be redrawn manually after changes with the GL implementation */ - if(This->overlay_dest) { - IWineD3DSurface_DrawOverlay(iface); - } + if (This->overlay_dest) + This->surface_ops->surface_draw_overlay(This); + return WINED3D_OK; } @@ -2775,11 +2798,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS flip_surface(This, (IWineD3DSurfaceImpl *) override); /* Update the overlay if it is visible */ - if(This->overlay_dest) { - return IWineD3DSurface_DrawOverlay((IWineD3DSurface *) This); - } else { + if (This->overlay_dest) + return This->surface_ops->surface_draw_overlay(This); + else return WINED3D_OK; - } } if(override) { @@ -4306,7 +4328,7 @@ void surface_modify_location(IWineD3DSurfaceImpl *surface, DWORD flag, BOOL pers { LIST_FOR_EACH_ENTRY(overlay, &surface->overlays, IWineD3DSurfaceImpl, overlay_entry) { - IWineD3DSurface_DrawOverlay((IWineD3DSurface *)overlay); + overlay->surface_ops->surface_draw_overlay(overlay); } } } @@ -4641,27 +4663,6 @@ static WINED3DSURFTYPE WINAPI IWineD3DSurfaceImpl_GetImplType(IWineD3DSurface *i return SURFACE_OPENGL; } -static HRESULT WINAPI IWineD3DSurfaceImpl_DrawOverlay(IWineD3DSurface *iface) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - HRESULT hr; - - /* If there's no destination surface there is nothing to do */ - if(!This->overlay_dest) return WINED3D_OK; - - /* Blt calls ModifyLocation on the dest surface, which in turn calls DrawOverlay to - * update the overlay. Prevent an endless recursion. */ - if (This->overlay_dest->flags & SFLAG_INOVERLAYDRAW) - return WINED3D_OK; - - This->overlay_dest->flags |= SFLAG_INOVERLAYDRAW; - hr = IWineD3DSurfaceImpl_Blt((IWineD3DSurface *)This->overlay_dest, - &This->overlay_destrect, iface, &This->overlay_srcrect, - WINEDDBLT_WAIT, NULL, WINED3DTEXF_LINEAR); - This->overlay_dest->flags &= ~SFLAG_INOVERLAYDRAW; - - return hr; -} - BOOL surface_is_offscreen(IWineD3DSurfaceImpl *surface) { IWineD3DSwapChainImpl *swapchain = surface->container.u.swapchain; @@ -4721,7 +4722,6 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl = IWineD3DSurfaceImpl_SetFormat, IWineD3DSurfaceImpl_PrivateSetup, IWineD3DSurfaceImpl_GetImplType, - IWineD3DSurfaceImpl_DrawOverlay }; static HRESULT ffp_blit_alloc(IWineD3DDeviceImpl *device) { return WINED3D_OK; } diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c index cad2caf9463..ae7e44102e7 100644 --- a/dlls/wined3d/surface_base.c +++ b/dlls/wined3d/surface_base.c @@ -357,7 +357,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface This->overlay_destrect.right = X + w; This->overlay_destrect.bottom = Y + h; - IWineD3DSurface_DrawOverlay(iface); + This->surface_ops->surface_draw_overlay(This); return WINED3D_OK; } @@ -462,7 +462,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, con This->overlay_dest = NULL; } - IWineD3DSurface_DrawOverlay(iface); + This->surface_ops->surface_draw_overlay(This); return WINED3D_OK; } diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c index c5642852793..9a729fb0c3a 100644 --- a/dlls/wined3d/surface_gdi.c +++ b/dlls/wined3d/surface_gdi.c @@ -95,9 +95,16 @@ static void gdi_surface_realize_palette(IWineD3DSurfaceImpl *surface) } } +static HRESULT gdi_surface_draw_overlay(IWineD3DSurfaceImpl *surface) +{ + FIXME("GDI surfaces can't draw overlays yet.\n"); + return E_FAIL; +} + static const struct wined3d_surface_ops gdi_surface_ops = { gdi_surface_realize_palette, + gdi_surface_draw_overlay, }; /***************************************************************************** @@ -439,11 +446,6 @@ static WINED3DSURFTYPE WINAPI IWineGDISurfaceImpl_GetImplType(IWineD3DSurface *i return SURFACE_GDI; } -static HRESULT WINAPI IWineGDISurfaceImpl_DrawOverlay(IWineD3DSurface *iface) { - FIXME("GDI surfaces can't draw overlays yet\n"); - return E_FAIL; -} - /* FIXME: This vtable should not use any IWineD3DSurface* implementation functions, * only IWineD3DBaseSurface and IWineGDISurface ones. */ @@ -491,5 +493,4 @@ const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl = IWineD3DBaseSurfaceImpl_SetFormat, IWineGDISurfaceImpl_PrivateSetup, IWineGDISurfaceImpl_GetImplType, - IWineGDISurfaceImpl_DrawOverlay }; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 68e4734f67e..96b845fbb84 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2091,6 +2091,7 @@ struct wined3d_subresource_container struct wined3d_surface_ops { void (*surface_realize_palette)(struct IWineD3DSurfaceImpl *surface); + HRESULT (*surface_draw_overlay)(struct IWineD3DSurfaceImpl *surface); }; /***************************************************************************** diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl index b99fb4d8158..523d7fcc780 100644 --- a/include/wine/wined3d.idl +++ b/include/wine/wined3d.idl @@ -2467,8 +2467,6 @@ interface IWineD3DSurface : IWineD3DResource ); WINED3DSURFTYPE GetImplType( ); - HRESULT DrawOverlay( - ); } [