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 <atomic>
#include "CompatDirectDrawPalette.h"
#include "CompatGdi.h" #include "CompatGdi.h"
#include "CompatGdiCaret.h" #include "CompatGdiCaret.h"
#include "CompatGdiDcCache.h" #include "CompatGdiDcCache.h"

View File

@ -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();
} }
} }

View File

@ -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)
{ {

View File

@ -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);
} }

View File

@ -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;

View File

@ -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;

View File

@ -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
{ {

View File

@ -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)

View File

@ -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);