1
0
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:
narzoul 2016-05-16 22:31:58 +02:00
parent e8f4a970e0
commit f973291f93
9 changed files with 19 additions and 30 deletions

View File

@ -1,6 +1,5 @@
#include <atomic>
#include "CompatDirectDrawPalette.h"
#include "CompatGdi.h"
#include "CompatGdiCaret.h"
#include "CompatGdiDcCache.h"

View File

@ -1,7 +1,6 @@
#include <cstring>
#include <vector>
#include "CompatDirectDrawPalette.h"
#include "CompatGdiDcCache.h"
#include "CompatPrimarySurface.h"
#include "CompatPtr.h"
@ -20,7 +19,7 @@ namespace
DWORD g_maxUsedCacheSize = 0;
DWORD g_ddLockThreadId = 0;
IDirectDrawPalette* g_palette = nullptr;
CompatWeakPtr<IDirectDrawPalette> g_palette;
PALETTEENTRY g_paletteEntries[256] = {};
void* g_surfaceMemory = nullptr;
LONG g_pitch = 0;
@ -167,7 +166,8 @@ namespace CompatGdiDcCache
bool init()
{
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;
}
@ -221,8 +221,7 @@ namespace CompatGdiDcCache
{
std::memcpy(&g_paletteEntries[startingEntry], &entries[startingEntry],
count * sizeof(PALETTEENTRY));
CompatDirectDrawPalette::s_origVtable.SetEntries(
g_palette, 0, startingEntry, count, g_paletteEntries);
g_palette->SetEntries(g_palette, 0, startingEntry, count, g_paletteEntries);
clear();
}
}

View File

@ -1,7 +1,6 @@
#include <algorithm>
#include <cstring>
#include "CompatDirectDrawPalette.h"
#include "CompatPaletteConverter.h"
#include "CompatPrimarySurface.h"
#include "CompatPtr.h"
@ -131,7 +130,7 @@ namespace CompatPaletteConverter
g_dc = nullptr;
}
void setClipper(IDirectDrawClipper* clipper)
void setClipper(CompatWeakPtr<IDirectDrawClipper> clipper)
{
if (g_surface)
{

View File

@ -12,6 +12,6 @@ namespace CompatPaletteConverter
HDC getDc();
CompatWeakPtr<IDirectDrawSurface7> getSurface();
void release();
void setClipper(IDirectDrawClipper* clipper);
void setClipper(CompatWeakPtr<IDirectDrawClipper> clipper);
void updatePalette(DWORD startingEntry, DWORD count);
}

View File

@ -80,7 +80,7 @@ namespace CompatPrimarySurface
DisplayMode displayMode = {};
bool isDisplayModeChanged = false;
LPDIRECTDRAWPALETTE palette = nullptr;
CompatWeakPtr<IDirectDrawPalette> palette;
PALETTEENTRY paletteEntries[256] = {};
LONG width = 0;
LONG height = 0;

View File

@ -27,7 +27,7 @@ namespace CompatPrimarySurface
extern DisplayMode displayMode;
extern bool isDisplayModeChanged;
extern LPDIRECTDRAWPALETTE palette;
extern CompatWeakPtr<IDirectDrawPalette> palette;
extern PALETTEENTRY paletteEntries[256];
extern LONG width;
extern LONG height;

View File

@ -82,12 +82,12 @@ namespace
void hookDirectDrawPalette(CompatRef<IDirectDraw7> dd)
{
PALETTEENTRY paletteEntries[2] = {};
IDirectDrawPalette* palette = nullptr;
HRESULT result = dd->CreatePalette(&dd, DDPCAPS_1BIT, paletteEntries, &palette, nullptr);
CompatPtr<IDirectDrawPalette> palette;
HRESULT result = dd->CreatePalette(&dd,
DDPCAPS_1BIT, paletteEntries, &palette.getRef(), nullptr);
if (SUCCEEDED(result))
{
CompatDirectDrawPalette::hookVtable(*palette);
palette->lpVtbl->Release(palette);
}
else
{

View File

@ -1,6 +1,5 @@
#include <atomic>
#include "CompatDirectDrawPalette.h"
#include "CompatDirectDrawSurface.h"
#include "CompatGdi.h"
#include "CompatPaletteConverter.h"
@ -23,6 +22,7 @@ namespace
CompatWeakPtr<IDirectDrawSurface7> g_frontBuffer;
CompatWeakPtr<IDirectDrawSurface7> g_backBuffer;
CompatWeakPtr<IDirectDrawClipper> g_clipper;
DDSURFACEDESC2 g_surfaceDesc = {};
IReleaseNotifier g_releaseNotifier(onRelease);
@ -47,16 +47,6 @@ namespace
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());
if (CompatPrimarySurface::pixelFormat.dwRGBBitCount <= 8)
{
@ -161,6 +151,7 @@ namespace
timeEndPeriod(1);
g_frontBuffer = nullptr;
g_backBuffer.release();
g_clipper = nullptr;
g_isFullScreen = false;
CompatPaletteConverter::release();
@ -347,15 +338,16 @@ HRESULT RealPrimarySurface::restore()
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);
if (FAILED(result))
{
LOG_ONCE("Failed to set clipper on the real primary surface: " << result);
return;
}
CompatPaletteConverter::setClipper(clipper);
g_clipper = clipper;
}
void RealPrimarySurface::setPalette()
@ -370,7 +362,7 @@ void RealPrimarySurface::setPalette()
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();
if (Time::qpcToMs(qpcNow - g_qpcNextUpdate) >= 0)

View File

@ -23,7 +23,7 @@ public:
static void release();
static void removeUpdateThread();
static HRESULT restore();
static void setClipper(LPDIRECTDRAWCLIPPER clipper);
static void setClipper(CompatWeakPtr<IDirectDrawClipper> clipper);
static void setPalette();
static void update();
static void updatePalette(DWORD startingEntry, DWORD count);