1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00
DDrawCompat/DDrawCompat/Gdi/CompatDc.cpp
2022-09-27 21:44:59 +02:00

52 lines
1.0 KiB
C++

#include <D3dDdi/Device.h>
#include <D3dDdi/Resource.h>
#include <D3dDdi/ScopedCriticalSection.h>
#include <DDraw/RealPrimarySurface.h>
#include <DDraw/Surfaces/PrimarySurface.h>
#include <Gdi/CompatDc.h>
#include <Gdi/Dc.h>
namespace Gdi
{
CompatDc::CompatDc(HDC dc, bool isReadOnly)
: m_origDc(dc)
, m_compatDc(Gdi::Dc::getDc(dc))
, m_isReadOnly(isReadOnly)
{
if (m_compatDc)
{
D3dDdi::ScopedCriticalSection lock;
auto gdiResource = D3dDdi::Device::getGdiResource();
if (gdiResource)
{
if (isReadOnly)
{
gdiResource->prepareForCpuRead(0);
}
else
{
gdiResource->prepareForCpuWrite(0);
}
}
}
else
{
m_compatDc = m_origDc;
}
}
CompatDc::~CompatDc()
{
if (m_compatDc != m_origDc)
{
D3dDdi::ScopedCriticalSection lock;
auto gdiResource = D3dDdi::Device::getGdiResource();
if (!m_isReadOnly && (!gdiResource || DDraw::PrimarySurface::getFrontResource() == *gdiResource))
{
DDraw::RealPrimarySurface::scheduleUpdate();
}
Gdi::Dc::releaseDc(m_origDc);
}
}
}