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:
parent
0dbd210649
commit
47f02667bf
@ -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:
|
||||
|
35
DDrawCompat/DDraw/Surfaces/FullScreenTagSurface.cpp
Normal file
35
DDrawCompat/DDraw/Surfaces/FullScreenTagSurface.cpp
Normal 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;
|
||||
}
|
||||
}
|
22
DDrawCompat/DDraw/Surfaces/FullScreenTagSurface.h
Normal file
22
DDrawCompat/DDraw/Surfaces/FullScreenTagSurface.h
Normal 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;
|
||||
};
|
||||
}
|
@ -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" />
|
||||
|
@ -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">
|
||||
|
Loading…
x
Reference in New Issue
Block a user