mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Replaced DirectDraw palette and clipper raw pointers with smart pointers
This commit is contained in:
parent
e8f4a970e0
commit
f973291f93
@ -1,6 +1,5 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
#include "CompatDirectDrawPalette.h"
|
|
||||||
#include "CompatGdi.h"
|
#include "CompatGdi.h"
|
||||||
#include "CompatGdiCaret.h"
|
#include "CompatGdiCaret.h"
|
||||||
#include "CompatGdiDcCache.h"
|
#include "CompatGdiDcCache.h"
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "CompatDirectDrawPalette.h"
|
|
||||||
#include "CompatGdiDcCache.h"
|
#include "CompatGdiDcCache.h"
|
||||||
#include "CompatPrimarySurface.h"
|
#include "CompatPrimarySurface.h"
|
||||||
#include "CompatPtr.h"
|
#include "CompatPtr.h"
|
||||||
@ -20,7 +19,7 @@ namespace
|
|||||||
DWORD g_maxUsedCacheSize = 0;
|
DWORD g_maxUsedCacheSize = 0;
|
||||||
DWORD g_ddLockThreadId = 0;
|
DWORD g_ddLockThreadId = 0;
|
||||||
|
|
||||||
IDirectDrawPalette* g_palette = nullptr;
|
CompatWeakPtr<IDirectDrawPalette> g_palette;
|
||||||
PALETTEENTRY g_paletteEntries[256] = {};
|
PALETTEENTRY g_paletteEntries[256] = {};
|
||||||
void* g_surfaceMemory = nullptr;
|
void* g_surfaceMemory = nullptr;
|
||||||
LONG g_pitch = 0;
|
LONG g_pitch = 0;
|
||||||
@ -167,7 +166,8 @@ namespace CompatGdiDcCache
|
|||||||
bool init()
|
bool init()
|
||||||
{
|
{
|
||||||
auto dd(DDrawRepository::getDirectDraw());
|
auto dd(DDrawRepository::getDirectDraw());
|
||||||
dd->CreatePalette(dd, DDPCAPS_8BIT | DDPCAPS_ALLOW256, g_paletteEntries, &g_palette, nullptr);
|
dd->CreatePalette(dd,
|
||||||
|
DDPCAPS_8BIT | DDPCAPS_ALLOW256, g_paletteEntries, &g_palette.getRef(), nullptr);
|
||||||
return nullptr != g_palette;
|
return nullptr != g_palette;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,8 +221,7 @@ namespace CompatGdiDcCache
|
|||||||
{
|
{
|
||||||
std::memcpy(&g_paletteEntries[startingEntry], &entries[startingEntry],
|
std::memcpy(&g_paletteEntries[startingEntry], &entries[startingEntry],
|
||||||
count * sizeof(PALETTEENTRY));
|
count * sizeof(PALETTEENTRY));
|
||||||
CompatDirectDrawPalette::s_origVtable.SetEntries(
|
g_palette->SetEntries(g_palette, 0, startingEntry, count, g_paletteEntries);
|
||||||
g_palette, 0, startingEntry, count, g_paletteEntries);
|
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#include "CompatDirectDrawPalette.h"
|
|
||||||
#include "CompatPaletteConverter.h"
|
#include "CompatPaletteConverter.h"
|
||||||
#include "CompatPrimarySurface.h"
|
#include "CompatPrimarySurface.h"
|
||||||
#include "CompatPtr.h"
|
#include "CompatPtr.h"
|
||||||
@ -131,7 +130,7 @@ namespace CompatPaletteConverter
|
|||||||
g_dc = nullptr;
|
g_dc = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setClipper(IDirectDrawClipper* clipper)
|
void setClipper(CompatWeakPtr<IDirectDrawClipper> clipper)
|
||||||
{
|
{
|
||||||
if (g_surface)
|
if (g_surface)
|
||||||
{
|
{
|
||||||
|
@ -12,6 +12,6 @@ namespace CompatPaletteConverter
|
|||||||
HDC getDc();
|
HDC getDc();
|
||||||
CompatWeakPtr<IDirectDrawSurface7> getSurface();
|
CompatWeakPtr<IDirectDrawSurface7> getSurface();
|
||||||
void release();
|
void release();
|
||||||
void setClipper(IDirectDrawClipper* clipper);
|
void setClipper(CompatWeakPtr<IDirectDrawClipper> clipper);
|
||||||
void updatePalette(DWORD startingEntry, DWORD count);
|
void updatePalette(DWORD startingEntry, DWORD count);
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ namespace CompatPrimarySurface
|
|||||||
|
|
||||||
DisplayMode displayMode = {};
|
DisplayMode displayMode = {};
|
||||||
bool isDisplayModeChanged = false;
|
bool isDisplayModeChanged = false;
|
||||||
LPDIRECTDRAWPALETTE palette = nullptr;
|
CompatWeakPtr<IDirectDrawPalette> palette;
|
||||||
PALETTEENTRY paletteEntries[256] = {};
|
PALETTEENTRY paletteEntries[256] = {};
|
||||||
LONG width = 0;
|
LONG width = 0;
|
||||||
LONG height = 0;
|
LONG height = 0;
|
||||||
|
@ -27,7 +27,7 @@ namespace CompatPrimarySurface
|
|||||||
|
|
||||||
extern DisplayMode displayMode;
|
extern DisplayMode displayMode;
|
||||||
extern bool isDisplayModeChanged;
|
extern bool isDisplayModeChanged;
|
||||||
extern LPDIRECTDRAWPALETTE palette;
|
extern CompatWeakPtr<IDirectDrawPalette> palette;
|
||||||
extern PALETTEENTRY paletteEntries[256];
|
extern PALETTEENTRY paletteEntries[256];
|
||||||
extern LONG width;
|
extern LONG width;
|
||||||
extern LONG height;
|
extern LONG height;
|
||||||
|
@ -82,12 +82,12 @@ namespace
|
|||||||
void hookDirectDrawPalette(CompatRef<IDirectDraw7> dd)
|
void hookDirectDrawPalette(CompatRef<IDirectDraw7> dd)
|
||||||
{
|
{
|
||||||
PALETTEENTRY paletteEntries[2] = {};
|
PALETTEENTRY paletteEntries[2] = {};
|
||||||
IDirectDrawPalette* palette = nullptr;
|
CompatPtr<IDirectDrawPalette> palette;
|
||||||
HRESULT result = dd->CreatePalette(&dd, DDPCAPS_1BIT, paletteEntries, &palette, nullptr);
|
HRESULT result = dd->CreatePalette(&dd,
|
||||||
|
DDPCAPS_1BIT, paletteEntries, &palette.getRef(), nullptr);
|
||||||
if (SUCCEEDED(result))
|
if (SUCCEEDED(result))
|
||||||
{
|
{
|
||||||
CompatDirectDrawPalette::hookVtable(*palette);
|
CompatDirectDrawPalette::hookVtable(*palette);
|
||||||
palette->lpVtbl->Release(palette);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
#include "CompatDirectDrawPalette.h"
|
|
||||||
#include "CompatDirectDrawSurface.h"
|
#include "CompatDirectDrawSurface.h"
|
||||||
#include "CompatGdi.h"
|
#include "CompatGdi.h"
|
||||||
#include "CompatPaletteConverter.h"
|
#include "CompatPaletteConverter.h"
|
||||||
@ -23,6 +22,7 @@ namespace
|
|||||||
|
|
||||||
CompatWeakPtr<IDirectDrawSurface7> g_frontBuffer;
|
CompatWeakPtr<IDirectDrawSurface7> g_frontBuffer;
|
||||||
CompatWeakPtr<IDirectDrawSurface7> g_backBuffer;
|
CompatWeakPtr<IDirectDrawSurface7> g_backBuffer;
|
||||||
|
CompatWeakPtr<IDirectDrawClipper> g_clipper;
|
||||||
DDSURFACEDESC2 g_surfaceDesc = {};
|
DDSURFACEDESC2 g_surfaceDesc = {};
|
||||||
IReleaseNotifier g_releaseNotifier(onRelease);
|
IReleaseNotifier g_releaseNotifier(onRelease);
|
||||||
|
|
||||||
@ -47,16 +47,6 @@ namespace
|
|||||||
|
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
if (!RealPrimarySurface::isFullScreen())
|
|
||||||
{
|
|
||||||
IDirectDrawClipper* clipper = nullptr;
|
|
||||||
if (FAILED(g_frontBuffer->GetClipper(g_frontBuffer, &clipper)))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
clipper->lpVtbl->Release(clipper);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto primary(CompatPrimarySurface::getPrimary());
|
auto primary(CompatPrimarySurface::getPrimary());
|
||||||
if (CompatPrimarySurface::pixelFormat.dwRGBBitCount <= 8)
|
if (CompatPrimarySurface::pixelFormat.dwRGBBitCount <= 8)
|
||||||
{
|
{
|
||||||
@ -161,6 +151,7 @@ namespace
|
|||||||
timeEndPeriod(1);
|
timeEndPeriod(1);
|
||||||
g_frontBuffer = nullptr;
|
g_frontBuffer = nullptr;
|
||||||
g_backBuffer.release();
|
g_backBuffer.release();
|
||||||
|
g_clipper = nullptr;
|
||||||
g_isFullScreen = false;
|
g_isFullScreen = false;
|
||||||
CompatPaletteConverter::release();
|
CompatPaletteConverter::release();
|
||||||
|
|
||||||
@ -347,15 +338,16 @@ HRESULT RealPrimarySurface::restore()
|
|||||||
return g_frontBuffer->Restore(g_frontBuffer);
|
return g_frontBuffer->Restore(g_frontBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RealPrimarySurface::setClipper(LPDIRECTDRAWCLIPPER clipper)
|
void RealPrimarySurface::setClipper(CompatWeakPtr<IDirectDrawClipper> clipper)
|
||||||
{
|
{
|
||||||
CompatPaletteConverter::setClipper(clipper);
|
|
||||||
|
|
||||||
HRESULT result = g_frontBuffer->SetClipper(g_frontBuffer, clipper);
|
HRESULT result = g_frontBuffer->SetClipper(g_frontBuffer, clipper);
|
||||||
if (FAILED(result))
|
if (FAILED(result))
|
||||||
{
|
{
|
||||||
LOG_ONCE("Failed to set clipper on the real primary surface: " << result);
|
LOG_ONCE("Failed to set clipper on the real primary surface: " << result);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
CompatPaletteConverter::setClipper(clipper);
|
||||||
|
g_clipper = clipper;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RealPrimarySurface::setPalette()
|
void RealPrimarySurface::setPalette()
|
||||||
@ -370,7 +362,7 @@ void RealPrimarySurface::setPalette()
|
|||||||
|
|
||||||
void RealPrimarySurface::update()
|
void RealPrimarySurface::update()
|
||||||
{
|
{
|
||||||
if (!IsRectEmpty(&g_updateRect) && 0 == g_disableUpdateCount)
|
if (!IsRectEmpty(&g_updateRect) && 0 == g_disableUpdateCount && (g_isFullScreen || g_clipper))
|
||||||
{
|
{
|
||||||
const long long qpcNow = Time::queryPerformanceCounter();
|
const long long qpcNow = Time::queryPerformanceCounter();
|
||||||
if (Time::qpcToMs(qpcNow - g_qpcNextUpdate) >= 0)
|
if (Time::qpcToMs(qpcNow - g_qpcNextUpdate) >= 0)
|
||||||
|
@ -23,7 +23,7 @@ public:
|
|||||||
static void release();
|
static void release();
|
||||||
static void removeUpdateThread();
|
static void removeUpdateThread();
|
||||||
static HRESULT restore();
|
static HRESULT restore();
|
||||||
static void setClipper(LPDIRECTDRAWCLIPPER clipper);
|
static void setClipper(CompatWeakPtr<IDirectDrawClipper> clipper);
|
||||||
static void setPalette();
|
static void setPalette();
|
||||||
static void update();
|
static void update();
|
||||||
static void updatePalette(DWORD startingEntry, DWORD count);
|
static void updatePalette(DWORD startingEntry, DWORD count);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user