mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
52 lines
1.0 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|