1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Moved FullScreenTagSurface implementation to separate layer

This commit is contained in:
narzoul 2016-09-11 18:58:23 +02:00
parent 0dbd210649
commit 47f02667bf
5 changed files with 68 additions and 28 deletions

View File

@ -4,7 +4,7 @@
#include "DDraw/DirectDraw.h"
#include "DDraw/DirectDrawSurface.h"
#include "DDraw/DisplayMode.h"
#include "DDraw/IReleaseNotifier.h"
#include "DDraw/Surfaces/FullScreenTagSurface.h"
#include "DDraw/Surfaces/PrimarySurface.h"
#include "DDraw/Surfaces/Surface.h"
@ -23,32 +23,6 @@ namespace
DirectDrawInterface* g_fullScreenDirectDraw = nullptr;
CompatWeakPtr<IDirectDrawSurface> g_fullScreenTagSurface;
void onReleaseFullScreenTagSurface();
DDraw::IReleaseNotifier g_fullScreenTagSurfaceReleaseNotifier(&onReleaseFullScreenTagSurface);
CompatPtr<IDirectDrawSurface> createFullScreenTagSurface(CompatRef<IDirectDraw> dd)
{
DDSURFACEDESC desc = {};
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
desc.dwWidth = 1;
desc.dwHeight = 1;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
CompatPtr<IDirectDrawSurface> tagSurface;
dd->CreateSurface(&dd, &desc, &tagSurface.getRef(), nullptr);
if (tagSurface)
{
CompatPtr<IDirectDrawSurface7> tagSurface7(tagSurface);
tagSurface7->SetPrivateData(
tagSurface7, IID_IReleaseNotifier, &g_fullScreenTagSurfaceReleaseNotifier,
sizeof(&g_fullScreenTagSurfaceReleaseNotifier), DDSPD_IUNKNOWNPOINTER);
}
return tagSurface;
}
bool isFullScreenDirectDraw(void* dd)
{
return dd && g_fullScreenDirectDraw &&
@ -65,7 +39,8 @@ namespace
void setFullScreenDirectDraw(CompatRef<IDirectDraw> dd)
{
g_fullScreenTagSurface.release();
g_fullScreenTagSurface = createFullScreenTagSurface(dd).detach();
DDraw::FullScreenTagSurface::create(
dd, g_fullScreenTagSurface.getRef(), &onReleaseFullScreenTagSurface);
/*
IDirectDraw interfaces don't conform to the COM rule about object identity:

View File

@ -0,0 +1,35 @@
#include "DDraw/Surfaces/SurfaceImpl.h"
#include "DDraw/Surfaces/FullScreenTagSurface.h"
namespace DDraw
{
FullScreenTagSurface::FullScreenTagSurface(const std::function<void()>& releaseHandler)
: m_releaseHandler(releaseHandler)
{
}
FullScreenTagSurface::~FullScreenTagSurface()
{
m_releaseHandler();
}
HRESULT FullScreenTagSurface::create(CompatRef<IDirectDraw> dd, IDirectDrawSurface*& surface,
const std::function<void()>& releaseHandler)
{
DDSURFACEDESC desc = {};
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
desc.dwWidth = 1;
desc.dwHeight = 1;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
HRESULT result = Surface::create(dd, desc, surface);
if (SUCCEEDED(result))
{
CompatPtr<IDirectDrawSurface7> surface7(Compat::queryInterface<IDirectDrawSurface7>(surface));
std::unique_ptr<Surface> privateData(new FullScreenTagSurface(releaseHandler));
attach(*surface7, privateData);
}
return result;
}
}

View File

@ -0,0 +1,22 @@
#pragma once
#include <functional>
#include "Common/CompatPtr.h"
#include "DDraw/Surfaces/Surface.h"
namespace DDraw
{
class FullScreenTagSurface : public Surface
{
public:
FullScreenTagSurface(const std::function<void()>& releaseHandler);
virtual ~FullScreenTagSurface();
static HRESULT create(CompatRef<IDirectDraw> dd, IDirectDrawSurface*& surface,
const std::function<void()>& releaseHandler);
private:
std::function<void()> m_releaseHandler;
};
}

View File

@ -178,6 +178,7 @@
<ClInclude Include="DDraw\Hooks.h" />
<ClInclude Include="DDraw\Repository.h" />
<ClInclude Include="DDraw\ScopedThreadLock.h" />
<ClInclude Include="DDraw\Surfaces\FullScreenTagSurface.h" />
<ClInclude Include="DDraw\Surfaces\PrimarySurface.h" />
<ClInclude Include="DDraw\Surfaces\PrimarySurfaceImpl.h" />
<ClInclude Include="DDraw\Surfaces\Surface.h" />
@ -229,6 +230,7 @@
<ClCompile Include="DDraw\Repository.cpp" />
<ClCompile Include="DDraw\IReleaseNotifier.cpp" />
<ClCompile Include="DDraw\RealPrimarySurface.cpp" />
<ClCompile Include="DDraw\Surfaces\FullScreenTagSurface.cpp" />
<ClCompile Include="DDraw\Surfaces\PrimarySurface.cpp" />
<ClCompile Include="DDraw\Surfaces\PrimarySurfaceImpl.cpp" />
<ClCompile Include="DDraw\Surfaces\Surface.cpp" />

View File

@ -255,6 +255,9 @@
<ClInclude Include="DDraw\Surfaces\PrimarySurfaceImpl.h">
<Filter>Header Files\DDraw\Surfaces</Filter>
</ClInclude>
<ClInclude Include="DDraw\Surfaces\FullScreenTagSurface.h">
<Filter>Header Files\DDraw\Surfaces</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp">
@ -383,6 +386,9 @@
<ClCompile Include="DDraw\Surfaces\PrimarySurfaceImpl.cpp">
<Filter>Source Files\DDraw\Surfaces</Filter>
</ClCompile>
<ClCompile Include="DDraw\Surfaces\FullScreenTagSurface.cpp">
<Filter>Source Files\DDraw\Surfaces</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Dll\DDrawCompat.def">