Replaced memory with new.

Cleaned up gdrv, zdrv, render.
This commit is contained in:
oz 2021-10-02 17:45:31 +03:00
parent dc5915b4f8
commit 93de90b680
25 changed files with 220 additions and 439 deletions

View file

@ -42,8 +42,6 @@ set(SOURCE_FILES
SpaceCadetPinball/loader.h SpaceCadetPinball/loader.h
SpaceCadetPinball/maths.cpp SpaceCadetPinball/maths.cpp
SpaceCadetPinball/maths.h SpaceCadetPinball/maths.h
SpaceCadetPinball/memory.cpp
SpaceCadetPinball/memory.h
SpaceCadetPinball/midi.cpp SpaceCadetPinball/midi.cpp
SpaceCadetPinball/midi.h SpaceCadetPinball/midi.h
SpaceCadetPinball/nudge.cpp SpaceCadetPinball/nudge.cpp

View file

@ -4,7 +4,6 @@
#include "fullscrn.h" #include "fullscrn.h"
#include "gdrv.h" #include "gdrv.h"
#include "memory.h"
#include "zdrv.h" #include "zdrv.h"
@ -13,10 +12,15 @@ EntryData::~EntryData()
if (Buffer) if (Buffer)
{ {
if (EntryType == FieldTypes::Bitmap8bit) if (EntryType == FieldTypes::Bitmap8bit)
gdrv::destroy_bitmap(reinterpret_cast<gdrv_bitmap8*>(Buffer)); {
delete reinterpret_cast<gdrv_bitmap8*>(Buffer);
}
else if (EntryType == FieldTypes::Bitmap16bit) else if (EntryType == FieldTypes::Bitmap16bit)
zdrv::destroy_zmap(reinterpret_cast<zmap_header_type*>(Buffer)); {
memory::free(Buffer); delete reinterpret_cast<zmap_header_type*>(Buffer);
}
else
delete[] Buffer;
} }
} }
@ -40,8 +44,8 @@ void GroupData::AddEntry(EntryData* entry)
if (srcBmp->BitmapType == BitmapTypes::Spliced) if (srcBmp->BitmapType == BitmapTypes::Spliced)
{ {
// Get rid of spliced bitmap early on, to simplify render pipeline // Get rid of spliced bitmap early on, to simplify render pipeline
auto bmp = memory::allocate<gdrv_bitmap8>(); auto bmp = new gdrv_bitmap8(srcBmp->Width, srcBmp->Height, srcBmp->Width);
auto zMap = memory::allocate<zmap_header_type>(); auto zMap = new zmap_header_type(srcBmp->Width, srcBmp->Height, srcBmp->Width);
SplitSplicedBitmap(*srcBmp, *bmp, *zMap); SplitSplicedBitmap(*srcBmp, *bmp, *zMap);
NeedsSort = true; NeedsSort = true;
@ -97,13 +101,11 @@ void GroupData::SplitSplicedBitmap(const gdrv_bitmap8& srcBmp, gdrv_bitmap8& bmp
{ {
assertm(srcBmp.BitmapType == BitmapTypes::Spliced, "GroupData: wrong bitmap type"); assertm(srcBmp.BitmapType == BitmapTypes::Spliced, "GroupData: wrong bitmap type");
gdrv::create_bitmap(&bmp, srcBmp.Width, srcBmp.Height, srcBmp.Width);
std::memset(bmp.IndexedBmpPtr, 0xff, bmp.Stride * bmp.Height); std::memset(bmp.IndexedBmpPtr, 0xff, bmp.Stride * bmp.Height);
bmp.XPosition = srcBmp.XPosition; bmp.XPosition = srcBmp.XPosition;
bmp.YPosition = srcBmp.YPosition; bmp.YPosition = srcBmp.YPosition;
bmp.Resolution = srcBmp.Resolution; bmp.Resolution = srcBmp.Resolution;
zdrv::create_zmap(&zMap, srcBmp.Width, srcBmp.Height, srcBmp.Width);
zdrv::fill(&zMap, zMap.Width, zMap.Height, 0, 0, 0xFFFF); zdrv::fill(&zMap, zMap.Width, zMap.Height, 0, 0, 0xFFFF);
zMap.Resolution = srcBmp.Resolution; zMap.Resolution = srcBmp.Resolution;

View file

@ -4,7 +4,6 @@
#include "control.h" #include "control.h"
#include "loader.h" #include "loader.h"
#include "memory.h"
#include "timer.h" #include "timer.h"
#include "TPinballTable.h" #include "TPinballTable.h"
@ -17,11 +16,11 @@ TLightBargraph::TLightBargraph(TPinballTable* table, int groupIndex) : TLightGro
float* floatArr = loader::query_float_attribute(groupIndex, 0, 904); float* floatArr = loader::query_float_attribute(groupIndex, 0, 904);
if (floatArr) if (floatArr)
{ {
int count = 2 * List.size(); auto count = 2 * List.size();
TimerTimeArray = memory::allocate<float>(count); TimerTimeArray = new float[count];
if (TimerTimeArray) if (TimerTimeArray)
{ {
for (int i = 0; i < count; ++floatArr) for (auto i = 0u; i < count; ++floatArr)
TimerTimeArray[i++] = *floatArr; TimerTimeArray[i++] = *floatArr;
} }
} }
@ -30,8 +29,7 @@ TLightBargraph::TLightBargraph(TPinballTable* table, int groupIndex) : TLightGro
TLightBargraph::~TLightBargraph() TLightBargraph::~TLightBargraph()
{ {
if (TimerTimeArray) delete[] TimerTimeArray;
memory::free(TimerTimeArray);
} }
int TLightBargraph::Message(int code, float value) int TLightBargraph::Message(int code, float value)

View file

@ -4,7 +4,6 @@
#include "control.h" #include "control.h"
#include "loader.h" #include "loader.h"
#include "memory.h"
#include "pb.h" #include "pb.h"
#include "pinball.h" #include "pinball.h"
#include "render.h" #include "render.h"
@ -194,18 +193,18 @@ TPinballTable::TPinballTable(): TPinballComponent(nullptr, -1, false)
TPinballTable::~TPinballTable() TPinballTable::~TPinballTable()
{ {
for (int scoreIndex = 0; scoreIndex < 4; scoreIndex++) for (auto& PlayerScore : PlayerScores)
{ {
memory::free(PlayerScores[scoreIndex].ScoreStruct); delete PlayerScore.ScoreStruct;
} }
if (ScorePlayerNumber1) if (ScorePlayerNumber1)
{ {
memory::free(ScorePlayerNumber1); delete ScorePlayerNumber1;
ScorePlayerNumber1 = nullptr; ScorePlayerNumber1 = nullptr;
} }
if (ScoreBallcount) if (ScoreBallcount)
{ {
memory::free(ScoreBallcount); delete ScoreBallcount;
ScoreBallcount = nullptr; ScoreBallcount = nullptr;
} }
delete LightGroup; delete LightGroup;

View file

@ -75,7 +75,7 @@ void TTextBox::Clear()
gdrv_bitmap8* bmp = BgBmp; gdrv_bitmap8* bmp = BgBmp;
if (bmp) if (bmp)
gdrv::copy_bitmap( gdrv::copy_bitmap(
&render::vscreen, render::vscreen,
Width, Width,
Height, Height,
OffsetX, OffsetX,
@ -84,7 +84,7 @@ void TTextBox::Clear()
OffsetX, OffsetX,
OffsetY); OffsetY);
else else
gdrv::fill_bitmap(&render::vscreen, Width, Height, OffsetX, OffsetY, 0); gdrv::fill_bitmap(render::vscreen, Width, Height, OffsetX, OffsetY, 0);
if (Timer) if (Timer)
{ {
if (Timer != -1) if (Timer != -1)
@ -149,7 +149,7 @@ void TTextBox::Draw()
auto bmp = BgBmp; auto bmp = BgBmp;
if (bmp) if (bmp)
gdrv::copy_bitmap( gdrv::copy_bitmap(
&render::vscreen, render::vscreen,
Width, Width,
Height, Height,
OffsetX, OffsetX,
@ -158,7 +158,7 @@ void TTextBox::Draw()
OffsetX, OffsetX,
OffsetY); OffsetY);
else else
gdrv::fill_bitmap(&render::vscreen, Width, Height, OffsetX, OffsetY, 0); gdrv::fill_bitmap(render::vscreen, Width, Height, OffsetX, OffsetY, 0);
bool display = false; bool display = false;
while (Message1) while (Message1)
@ -191,8 +191,8 @@ void TTextBox::Draw()
{ {
gdrv::grtext_draw_ttext_in_box( gdrv::grtext_draw_ttext_in_box(
Message1->Text, Message1->Text,
render::vscreen.XPosition + OffsetX, render::vscreen->XPosition + OffsetX,
render::vscreen.YPosition + OffsetY, render::vscreen->YPosition + OffsetY,
Width, Width,
Height, Height,
255); 255);
@ -245,10 +245,10 @@ void TTextBox::Draw()
auto height = charBmp->Height; auto height = charBmp->Height;
auto width = charBmp->Width; auto width = charBmp->Width;
if (render::background_bitmap) if (render::background_bitmap)
gdrv::copy_bitmap_w_transparency(&render::vscreen, width, height, offX, y, charBmp, 0, gdrv::copy_bitmap_w_transparency(render::vscreen, width, height, offX, y, charBmp, 0,
0); 0);
else else
gdrv::copy_bitmap(&render::vscreen, width, height, offX, y, charBmp, 0, 0); gdrv::copy_bitmap(render::vscreen, width, height, offX, y, charBmp, 0, 0);
font = Font; font = Font;
offX += charBmp->Width + font->GapWidth; offX += charBmp->Width + font->GapWidth;
} }

View file

@ -1,6 +1,5 @@
#include "pch.h" #include "pch.h"
#include "TTextBoxMessage.h" #include "TTextBoxMessage.h"
#include "memory.h"
#include "pb.h" #include "pb.h"
TTextBoxMessage::TTextBoxMessage(char* text, float time) TTextBoxMessage::TTextBoxMessage(char* text, float time)
@ -11,7 +10,7 @@ TTextBoxMessage::TTextBoxMessage(char* text, float time)
if (text) if (text)
{ {
const auto textLen = strlen(text) + 1; const auto textLen = strlen(text) + 1;
Text = memory::allocate(textLen); Text = new char[textLen];
if (Text) if (Text)
strncpy(Text, text, textLen); strncpy(Text, text, textLen);
} }
@ -21,8 +20,7 @@ TTextBoxMessage::TTextBoxMessage(char* text, float time)
TTextBoxMessage::~TTextBoxMessage() TTextBoxMessage::~TTextBoxMessage()
{ {
if (Text) delete[] Text;
memory::free(Text);
} }
float TTextBoxMessage::TimeLeft() const float TTextBoxMessage::TimeLeft() const

View file

@ -2,7 +2,6 @@
#include "gdrv.h" #include "gdrv.h"
#include "GroupData.h" #include "GroupData.h"
#include "memory.h"
#include "partman.h" #include "partman.h"
#include "pb.h" #include "pb.h"
#include "score.h" #include "score.h"
@ -10,77 +9,74 @@
ColorRgba gdrv::current_palette[256]{}; ColorRgba gdrv::current_palette[256]{};
int gdrv::create_bitmap(gdrv_bitmap8* bmp, int width, int height, int stride, bool indexed) gdrv_bitmap8::gdrv_bitmap8(int width, int height, bool indexed)
{ {
assertm(width >= 0 && height >= 0, "Negative bitmap8 dimensions"); assertm(width >= 0 && height >= 0, "Negative bitmap8 dimensions");
bmp->Width = width; Width = width;
bmp->Height = height; Height = height;
bmp->Stride = width; Stride = width;
bmp->BitmapType = BitmapTypes::DibBitmap; IndexedStride = width;
bmp->Texture = nullptr; BitmapType = BitmapTypes::DibBitmap;
Texture = nullptr;
if (stride >= 0) IndexedBmpPtr = nullptr;
bmp->IndexedStride = stride; XPosition = 0;
else YPosition = 0;
{ Resolution = 0;
bmp->IndexedStride = width;
if (width % 4)
bmp->IndexedStride = width - width % 4 + 4;
}
if (indexed) if (indexed)
bmp->IndexedBmpPtr = memory::allocate(bmp->Height * bmp->IndexedStride); IndexedBmpPtr = new char[Height * IndexedStride];
bmp->BmpBufPtr1 = memory::allocate<ColorRgba>(bmp->Height * bmp->Stride); BmpBufPtr1 = new ColorRgba[Height * Stride];
if (bmp->BmpBufPtr1)
{
return 0;
}
return -1;
} }
int gdrv::create_bitmap(gdrv_bitmap8& bmp, const dat8BitBmpHeader& header) gdrv_bitmap8::gdrv_bitmap8(const dat8BitBmpHeader& header)
{ {
assertm(header.Width >= 0 && header.Height >= 0, "Negative bitmap8 dimensions"); assertm(header.Width >= 0 && header.Height >= 0, "Negative bitmap8 dimensions");
if (header.IsFlagSet(bmp8Flags::Spliced)) if (header.IsFlagSet(bmp8Flags::Spliced))
bmp.BitmapType = BitmapTypes::Spliced; BitmapType = BitmapTypes::Spliced;
else if (header.IsFlagSet(bmp8Flags::DibBitmap)) else if (header.IsFlagSet(bmp8Flags::DibBitmap))
bmp.BitmapType = BitmapTypes::DibBitmap; BitmapType = BitmapTypes::DibBitmap;
else else
bmp.BitmapType = BitmapTypes::RawBitmap; BitmapType = BitmapTypes::RawBitmap;
bmp.Width = header.Width; Width = header.Width;
bmp.Stride = header.Width; Stride = header.Width;
bmp.IndexedStride = header.Width; IndexedStride = header.Width;
bmp.Height = header.Height; Height = header.Height;
bmp.XPosition = header.XPosition; XPosition = header.XPosition;
bmp.YPosition = header.YPosition; YPosition = header.YPosition;
bmp.Resolution = header.Resolution; Resolution = header.Resolution;
bmp.Texture = nullptr; Texture = nullptr;
int sizeInBytes; int sizeInBytes;
if (bmp.BitmapType == BitmapTypes::Spliced) if (BitmapType == BitmapTypes::Spliced)
{ {
sizeInBytes = header.Size; sizeInBytes = header.Size;
} }
else else
{ {
if (bmp.BitmapType == BitmapTypes::RawBitmap) if (BitmapType == BitmapTypes::RawBitmap)
assertm(bmp.Width % 4 == 0 || header.IsFlagSet(bmp8Flags::RawBmpUnaligned), "Wrong raw bitmap align flag"); assertm(Width % 4 == 0 || header.IsFlagSet(bmp8Flags::RawBmpUnaligned), "Wrong raw bitmap align flag");
if (bmp.Width % 4) if (Width % 4)
bmp.IndexedStride = bmp.Width - bmp.Width % 4 + 4; IndexedStride = Width - Width % 4 + 4;
sizeInBytes = bmp.Height * bmp.IndexedStride; sizeInBytes = Height * IndexedStride;
assertm(sizeInBytes == header.Size, "Wrong bitmap8 size"); assertm(sizeInBytes == header.Size, "Wrong bitmap8 size");
} }
bmp.IndexedBmpPtr = memory::allocate(sizeInBytes); IndexedBmpPtr = new char[sizeInBytes];
bmp.BmpBufPtr1 = memory::allocate<ColorRgba>(bmp.Stride * bmp.Height); BmpBufPtr1 = new ColorRgba[Stride * Height];
if (bmp.BmpBufPtr1) }
{
return 0; gdrv_bitmap8::~gdrv_bitmap8()
{
if (BitmapType != BitmapTypes::None)
{
delete[] BmpBufPtr1;
delete[] IndexedBmpPtr;
if (Texture)
SDL_DestroyTexture(Texture);
} }
return -1;
} }
int gdrv::display_palette(ColorRgba* plt) int gdrv::display_palette(ColorRgba* plt)
@ -139,24 +135,6 @@ int gdrv::display_palette(ColorRgba* plt)
return 0; return 0;
} }
int gdrv::destroy_bitmap(gdrv_bitmap8* bmp)
{
if (!bmp)
return -1;
if (bmp->BitmapType != BitmapTypes::None)
{
memory::free(bmp->BmpBufPtr1);
if (bmp->IndexedBmpPtr)
memory::free(bmp->IndexedBmpPtr);
if (bmp->Texture)
SDL_DestroyTexture(bmp->Texture);
}
memset(bmp, 0, sizeof(gdrv_bitmap8));
return 0;
}
void gdrv::fill_bitmap(gdrv_bitmap8* bmp, int width, int height, int xOff, int yOff, uint8_t fillChar) void gdrv::fill_bitmap(gdrv_bitmap8* bmp, int width, int height, int xOff, int yOff, uint8_t fillChar)
{ {
auto color = current_palette[fillChar]; auto color = current_palette[fillChar];

View file

@ -39,6 +39,9 @@ static_assert(sizeof(ColorRgba) == 4, "Wrong size of RGBA color");
struct gdrv_bitmap8 struct gdrv_bitmap8
{ {
gdrv_bitmap8(int width, int height, bool indexed);
gdrv_bitmap8(const struct dat8BitBmpHeader& header);
~gdrv_bitmap8();
ColorRgba* BmpBufPtr1; ColorRgba* BmpBufPtr1;
char* IndexedBmpPtr; char* IndexedBmpPtr;
int Width; int Width;
@ -49,7 +52,6 @@ struct gdrv_bitmap8
int XPosition; int XPosition;
int YPosition; int YPosition;
unsigned Resolution; unsigned Resolution;
//ColorRgba* RgbaBuffer;
SDL_Texture* Texture; SDL_Texture* Texture;
}; };
@ -57,9 +59,6 @@ struct gdrv_bitmap8
class gdrv class gdrv
{ {
public: public:
static int create_bitmap(gdrv_bitmap8* bmp, int width, int height, int stride = -1, bool indexed = true);
static int create_bitmap(gdrv_bitmap8& bmp, const struct dat8BitBmpHeader& header);
static int destroy_bitmap(gdrv_bitmap8* bmp);
static int display_palette(ColorRgba* plt); static int display_palette(ColorRgba* plt);
static void fill_bitmap(gdrv_bitmap8* bmp, int width, int height, int xOff, int yOff, uint8_t fillChar); static void fill_bitmap(gdrv_bitmap8* bmp, int width, int height, int xOff, int yOff, uint8_t fillChar);
static void copy_bitmap(gdrv_bitmap8* dstBmp, int width, int height, int xOff, int yOff, gdrv_bitmap8* srcBmp, static void copy_bitmap(gdrv_bitmap8* dstBmp, int width, int height, int xOff, int yOff, gdrv_bitmap8* srcBmp,

View file

@ -1,6 +1,5 @@
#include "pch.h" #include "pch.h"
#include "loader.h" #include "loader.h"
#include "memory.h"
#include "GroupData.h" #include "GroupData.h"
#include "pb.h" #include "pb.h"
#include "pinball.h" #include "pinball.h"

View file

@ -1,40 +0,0 @@
#include "pch.h"
#include "memory.h"
size_t memory::use_total;
int memory::critical_allocation;
void (*memory::critical_callback)();
std::map<void*, size_t> memory::alloc_map{};
void memory::init(void (*callback)())
{
critical_callback = callback;
}
char* memory::allocate(size_t size)
{
auto buf = static_cast<char*>(malloc(size));
if (!buf)
{
if (critical_allocation && critical_callback)
critical_callback();
return nullptr;
}
use_total += size;
alloc_map[buf] = size;
return buf;
}
void memory::free(void* buf)
{
auto alloc = alloc_map.find(buf);
if (alloc == alloc_map.end())
{
assertm(false, "Unknown memory type");
return;
}
use_total -= alloc->second;
std::free(alloc->first);
}

View file

@ -1,60 +0,0 @@
#pragma once
#include <map>
class memory
{
public:
static void init(void (*callback)(void));
static char* allocate(size_t size);
static void free(void* buf);
template <typename T>
static T* allocate(size_t count = 1, size_t add = 0)
{
size_t size = sizeof(T) * count + add;
auto buf = static_cast<T*>(malloc(size));
if (!buf)
{
if (critical_allocation && critical_callback)
critical_callback();
return nullptr;
}
use_total += size;
alloc_map[buf] = size;
return buf;
}
template <typename T>
static T* realloc(T* buf, size_t size)
{
if (!buf)
return reinterpret_cast<T*>(allocate(size));
auto alloc = alloc_map.find(buf);
if (alloc == alloc_map.end())
{
assertm(false, "Unknown memory type");
return buf;
}
auto newBuf = static_cast<T*>(std::realloc(alloc->first, size));
if (!newBuf)
{
if (critical_allocation && critical_callback)
critical_callback();
return nullptr;
}
use_total += size - alloc->second;
alloc_map.erase(alloc);
alloc_map[newBuf] = size;
return newBuf;
}
static size_t use_total;
static int critical_allocation;
private:
static void (*critical_callback)();
static std::map<void*, size_t> alloc_map;
};

View file

@ -2,7 +2,6 @@
#include "options.h" #include "options.h"
#include "fullscrn.h" #include "fullscrn.h"
#include "memory.h"
#include "midi.h" #include "midi.h"
#include "Sound.h" #include "Sound.h"
#include "winmain.h" #include "winmain.h"

View file

@ -1,5 +1,4 @@
#pragma once #pragma once
#include <map>
enum class Menu1:int enum class Menu1:int
{ {

View file

@ -3,7 +3,6 @@
#include "gdrv.h" #include "gdrv.h"
#include "GroupData.h" #include "GroupData.h"
#include "memory.h"
#include "zdrv.h" #include "zdrv.h"
short partman::_field_size[] = short partman::_field_size[] =
@ -40,7 +39,7 @@ DatFile* partman::load_records(LPCSTR lpFileName, bool fullTiltMode)
if (header.Unknown) if (header.Unknown)
{ {
auto unknownBuf = memory::allocate(header.Unknown); auto unknownBuf = new char[header.Unknown];
if (!unknownBuf) if (!unknownBuf)
{ {
fclose(fileHandle); fclose(fileHandle);
@ -48,7 +47,7 @@ DatFile* partman::load_records(LPCSTR lpFileName, bool fullTiltMode)
return nullptr; return nullptr;
} }
fread(unknownBuf, 1, header.Unknown, fileHandle); fread(unknownBuf, 1, header.Unknown, fileHandle);
memory::free(unknownBuf); delete[] unknownBuf;
} }
datFile->Groups.reserve(header.NumberOfGroups); datFile->Groups.reserve(header.NumberOfGroups);
@ -75,13 +74,8 @@ DatFile* partman::load_records(LPCSTR lpFileName, bool fullTiltMode)
assertm(bmpHeader.Size + sizeof(dat8BitBmpHeader) == fieldSize, "partman: Wrong bitmap field size"); assertm(bmpHeader.Size + sizeof(dat8BitBmpHeader) == fieldSize, "partman: Wrong bitmap field size");
assertm(bmpHeader.Resolution <= 2, "partman: bitmap resolution out of bounds"); assertm(bmpHeader.Resolution <= 2, "partman: bitmap resolution out of bounds");
auto bmp = memory::allocate<gdrv_bitmap8>(); auto bmp = new gdrv_bitmap8(bmpHeader);
entryData->Buffer = reinterpret_cast<char*>(bmp); entryData->Buffer = reinterpret_cast<char*>(bmp);
if (!bmp || gdrv::create_bitmap(*bmp, bmpHeader))
{
abort = true;
break;
}
fread(bmp->IndexedBmpPtr, 1, bmpHeader.Size, fileHandle); fread(bmp->IndexedBmpPtr, 1, bmpHeader.Size, fileHandle);
} }
else if (entryType == FieldTypes::Bitmap16bit) else if (entryType == FieldTypes::Bitmap16bit)
@ -98,8 +92,7 @@ DatFile* partman::load_records(LPCSTR lpFileName, bool fullTiltMode)
fread(&zMapHeader, 1, sizeof(dat16BitBmpHeader), fileHandle); fread(&zMapHeader, 1, sizeof(dat16BitBmpHeader), fileHandle);
auto length = fieldSize - sizeof(dat16BitBmpHeader); auto length = fieldSize - sizeof(dat16BitBmpHeader);
auto zMap = memory::allocate<zmap_header_type>(); auto zMap = new zmap_header_type(zMapHeader.Width, zMapHeader.Height, zMapHeader.Stride);
zdrv::create_zmap(zMap, zMapHeader.Width, zMapHeader.Height, zMapHeader.Stride);
zMap->Resolution = zMapResolution; zMap->Resolution = zMapResolution;
if (zMapHeader.Stride * zMapHeader.Height * 2u == length) if (zMapHeader.Stride * zMapHeader.Height * 2u == length)
{ {
@ -114,7 +107,7 @@ DatFile* partman::load_records(LPCSTR lpFileName, bool fullTiltMode)
} }
else else
{ {
char* entryBuffer = memory::allocate(fieldSize); auto entryBuffer = new char[fieldSize];
entryData->Buffer = entryBuffer; entryData->Buffer = entryBuffer;
if (!entryBuffer) if (!entryBuffer)
{ {

View file

@ -5,7 +5,6 @@
#include "control.h" #include "control.h"
#include "fullscrn.h" #include "fullscrn.h"
#include "high_score.h" #include "high_score.h"
#include "memory.h"
#include "pinball.h" #include "pinball.h"
#include "proj.h" #include "proj.h"
#include "render.h" #include "render.h"
@ -40,7 +39,6 @@ int pb::init()
{ {
float projMat[12], zMin = 0, zScaler = 0; float projMat[12], zMin = 0, zScaler = 0;
++memory::critical_allocation;
auto dataFilePath = pinball::make_path_name(winmain::DatFileName); auto dataFilePath = pinball::make_path_name(winmain::DatFileName);
record_table = partman::load_records(dataFilePath.c_str(), FullTiltMode); record_table = partman::load_records(dataFilePath.c_str(), FullTiltMode);
@ -77,7 +75,7 @@ int pb::init()
render::init(nullptr, zMin, zScaler, resInfo->TableWidth, resInfo->TableHeight); render::init(nullptr, zMin, zScaler, resInfo->TableWidth, resInfo->TableHeight);
gdrv::copy_bitmap( gdrv::copy_bitmap(
&render::vscreen, render::vscreen,
backgroundBmp->Width, backgroundBmp->Width,
backgroundBmp->Height, backgroundBmp->Height,
backgroundBmp->XPosition, backgroundBmp->XPosition,
@ -101,7 +99,6 @@ int pb::init()
high_score::read(highscore_table); high_score::read(highscore_table);
ball_speed_limit = MainTable->BallList.at(0)->Offset * 200.0f; ball_speed_limit = MainTable->BallList.at(0)->Offset * 200.0f;
--memory::critical_allocation;
return 0; return 0;
} }
@ -471,11 +468,6 @@ void pb::keydown(int key)
strncpy(String1, pinball::get_rc_string(26, 0), sizeof String1 - 1); strncpy(String1, pinball::get_rc_string(26, 0), sizeof String1 - 1);
high_score::show_and_set_high_score_dialog(highscore_table, 1000000000, 1, String1); high_score::show_and_set_high_score_dialog(highscore_table, 1000000000, 1, String1);
break; break;
case 'm':
char buffer[20];
snprintf(buffer, sizeof buffer, "%zu", memory::use_total);
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Mem:", buffer, winmain::MainWindow);
break;
case 'r': case 'r':
control::cheat_bump_rank(); control::cheat_bump_rank();
break; break;

View file

@ -28,6 +28,7 @@
#include <cstring> #include <cstring>
#include <string> #include <string>
#include <thread> #include <thread>
#include <map>
#define SDL_MAIN_HANDLED #define SDL_MAIN_HANDLED
#include "SDL.h" #include "SDL.h"

View file

@ -1,6 +1,5 @@
#include "pch.h" #include "pch.h"
#include "pinball.h" #include "pinball.h"
#include "memory.h"
#include "winmain.h" #include "winmain.h"
// Todo: load translations from file // Todo: load translations from file

View file

@ -2,49 +2,43 @@
#include "render.h" #include "render.h"
#include "GroupData.h" #include "GroupData.h"
#include "memory.h"
#include "options.h" #include "options.h"
#include "pb.h" #include "pb.h"
#include "TPinballTable.h" #include "TPinballTable.h"
#include "winmain.h" #include "winmain.h"
int render::many_dirty, render::many_sprites, render::many_balls; std::vector<render_sprite_type_struct*> render::dirty_list, render::sprite_list, render::ball_list;
render_sprite_type_struct **render::dirty_list, **render::sprite_list, **render::ball_list;
zmap_header_type* render::background_zmap; zmap_header_type* render::background_zmap;
int render::zmap_offset, render::zmap_offsetY, render::offset_x, render::offset_y; int render::zmap_offset, render::zmap_offsetY, render::offset_x, render::offset_y;
float render::zscaler, render::zmin, render::zmax; float render::zscaler, render::zmin, render::zmax;
rectangle_type render::vscreen_rect; rectangle_type render::vscreen_rect;
gdrv_bitmap8 render::vscreen, *render::background_bitmap, render::ball_bitmap[20]; gdrv_bitmap8 *render::vscreen, *render::background_bitmap, *render::ball_bitmap[20];
zmap_header_type render::zscreen; zmap_header_type* render::zscreen;
SDL_Texture* render::vScreenTex = nullptr; SDL_Texture* render::vScreenTex = nullptr;
SDL_Rect render::DestinationRect{}; SDL_Rect render::DestinationRect{};
void render::init(gdrv_bitmap8* bmp, float zMin, float zScaler, int width, int height) void render::init(gdrv_bitmap8* bmp, float zMin, float zScaler, int width, int height)
{ {
++memory::critical_allocation;
zscaler = zScaler; zscaler = zScaler;
zmin = zMin; zmin = zMin;
zmax = 4294967300.0f / zScaler + zMin; zmax = 4294967300.0f / zScaler + zMin;
sprite_list = memory::allocate<render_sprite_type_struct*>(1000); vscreen = new gdrv_bitmap8(width, height, false);
dirty_list = memory::allocate<render_sprite_type_struct*>(1000); zscreen = new zmap_header_type(width, height, width);
ball_list = memory::allocate<render_sprite_type_struct*>(20); zdrv::fill(zscreen, zscreen->Width, zscreen->Height, 0, 0, 0xFFFF);
gdrv::create_bitmap(&vscreen, width, height, width, false);
zdrv::create_zmap(&zscreen, width, height);
zdrv::fill(&zscreen, zscreen.Width, zscreen.Height, 0, 0, 0xFFFF);
vscreen_rect.YPosition = 0; vscreen_rect.YPosition = 0;
vscreen_rect.XPosition = 0; vscreen_rect.XPosition = 0;
vscreen_rect.Width = width; vscreen_rect.Width = width;
vscreen_rect.Height = height; vscreen_rect.Height = height;
vscreen.YPosition = 0; vscreen->YPosition = 0;
vscreen.XPosition = 0; vscreen->XPosition = 0;
for (auto& ballBmp : ball_bitmap) for (auto& ballBmp : ball_bitmap)
gdrv::create_bitmap(&ballBmp, 64, 64, 64, false); ballBmp = new gdrv_bitmap8(64, 64, false);
background_bitmap = bmp; background_bitmap = bmp;
if (bmp) if (bmp)
gdrv::copy_bitmap(&vscreen, width, height, 0, 0, bmp, 0, 0); gdrv::copy_bitmap(vscreen, width, height, 0, 0, bmp, 0, 0);
else else
gdrv::fill_bitmap(&vscreen, vscreen.Width, vscreen.Height, 0, 0, 0); gdrv::fill_bitmap(vscreen, vscreen->Width, vscreen->Height, 0, 0, 0);
{ {
UsingSdlHint hint{SDL_HINT_RENDER_SCALE_QUALITY, options::Options.LinearFiltering ? "linear" : "nearest"}; UsingSdlHint hint{SDL_HINT_RENDER_SCALE_QUALITY, options::Options.LinearFiltering ? "linear" : "nearest"};
@ -57,25 +51,21 @@ void render::init(gdrv_bitmap8* bmp, float zMin, float zScaler, int width, int h
); );
SDL_SetTextureBlendMode(vScreenTex, SDL_BLENDMODE_NONE); SDL_SetTextureBlendMode(vScreenTex, SDL_BLENDMODE_NONE);
} }
--memory::critical_allocation;
} }
void render::uninit() void render::uninit()
{ {
gdrv::destroy_bitmap(&vscreen); delete vscreen;
zdrv::destroy_zmap(&zscreen); delete zscreen;
for (auto i = many_sprites - 1; i >= 0; --i) for (auto sprite : sprite_list)
remove_sprite(sprite_list[i]); remove_sprite(sprite, false);
for (auto j = many_balls - 1; j >= 0; --j) for (auto ball : ball_list)
remove_ball(ball_list[j]); remove_ball(ball, false);
for (auto& ballBmp : ball_bitmap) for (auto& ballBmp : ball_bitmap)
gdrv::destroy_bitmap(&ballBmp); delete ballBmp;
memory::free(ball_list); ball_list.clear();
memory::free(dirty_list); dirty_list.clear();
memory::free(sprite_list); sprite_list.clear();
many_sprites = 0;
many_dirty = 0;
many_balls = 0;
SDL_DestroyTexture(vScreenTex); SDL_DestroyTexture(vScreenTex);
} }
@ -84,10 +74,9 @@ void render::update()
unpaint_balls(); unpaint_balls();
// Clip dirty sprites with vScreen, clear clipping (dirty) rectangles // Clip dirty sprites with vScreen, clear clipping (dirty) rectangles
for (int index = 0; index < many_dirty; ++index) for (auto curSprite : dirty_list)
{ {
bool clearSprite = false; bool clearSprite = false;
auto curSprite = dirty_list[index];
switch (curSprite->VisualType) switch (curSprite->VisualType)
{ {
case VisualTypes::Sprite: case VisualTypes::Sprite:
@ -114,18 +103,17 @@ void render::update()
auto width = curSprite->DirtyRect.Width; auto width = curSprite->DirtyRect.Width;
auto xPos = curSprite->DirtyRect.XPosition; auto xPos = curSprite->DirtyRect.XPosition;
auto height = curSprite->DirtyRect.Height; auto height = curSprite->DirtyRect.Height;
zdrv::fill(&zscreen, width, height, xPos, yPos, 0xFFFF); zdrv::fill(zscreen, width, height, xPos, yPos, 0xFFFF);
if (background_bitmap) if (background_bitmap)
gdrv::copy_bitmap(&vscreen, width, height, xPos, yPos, background_bitmap, xPos, yPos); gdrv::copy_bitmap(vscreen, width, height, xPos, yPos, background_bitmap, xPos, yPos);
else else
gdrv::fill_bitmap(&vscreen, width, height, xPos, yPos, 0); gdrv::fill_bitmap(vscreen, width, height, xPos, yPos, 0);
} }
} }
// Paint dirty rectangles of dirty sprites // Paint dirty rectangles of dirty sprites
for (int index = 0; index < many_dirty; ++index) for (auto sprite : dirty_list)
{ {
auto sprite = dirty_list[index];
if (sprite->DirtyRect.Width > 0 && (sprite->VisualType == VisualTypes::None || sprite->VisualType == if (sprite->DirtyRect.Width > 0 && (sprite->VisualType == VisualTypes::None || sprite->VisualType ==
VisualTypes::Sprite)) VisualTypes::Sprite))
repaint(sprite); repaint(sprite);
@ -134,27 +122,26 @@ void render::update()
paint_balls(); paint_balls();
// In the original, this used to blit dirty sprites and balls // In the original, this used to blit dirty sprites and balls
for (int index = 0; index < many_dirty; ++index) for (auto sprite : dirty_list)
{ {
auto sprite = dirty_list[index];
sprite->DirtyRectPrev = sprite->DirtyRect; sprite->DirtyRectPrev = sprite->DirtyRect;
if (sprite->UnknownFlag != 0) if (sprite->UnknownFlag != 0)
remove_sprite(sprite); remove_sprite(sprite, true);
} }
many_dirty = 0; dirty_list.clear();
} }
void render::sprite_modified(render_sprite_type_struct* sprite) void render::sprite_modified(render_sprite_type_struct* sprite)
{ {
if (sprite->VisualType != VisualTypes::Ball && many_dirty < 999) if (sprite->VisualType != VisualTypes::Ball && dirty_list.size() < 999)
dirty_list[many_dirty++] = sprite; dirty_list.push_back(sprite);
} }
render_sprite_type_struct* render::create_sprite(VisualTypes visualType, gdrv_bitmap8* bmp, zmap_header_type* zMap, render_sprite_type_struct* render::create_sprite(VisualTypes visualType, gdrv_bitmap8* bmp, zmap_header_type* zMap,
int xPosition, int yPosition, rectangle_type* rect) int xPosition, int yPosition, rectangle_type* rect)
{ {
auto sprite = memory::allocate<render_sprite_type_struct>(); auto sprite = new render_sprite_type_struct();
if (!sprite) if (!sprite)
return nullptr; return nullptr;
sprite->BmpRect.YPosition = yPosition; sprite->BmpRect.YPosition = yPosition;
@ -163,7 +150,6 @@ render_sprite_type_struct* render::create_sprite(VisualTypes visualType, gdrv_bi
sprite->VisualType = visualType; sprite->VisualType = visualType;
sprite->UnknownFlag = 0; sprite->UnknownFlag = 0;
sprite->SpriteArray = nullptr; sprite->SpriteArray = nullptr;
sprite->SpriteCount = 0;
sprite->DirtyRect = rectangle_type{}; sprite->DirtyRect = rectangle_type{};
if (rect) if (rect)
{ {
@ -198,57 +184,41 @@ render_sprite_type_struct* render::create_sprite(VisualTypes visualType, gdrv_bi
sprite->DirtyRectPrev = sprite->BmpRect; sprite->DirtyRectPrev = sprite->BmpRect;
if (visualType == VisualTypes::Ball) if (visualType == VisualTypes::Ball)
{ {
ball_list[many_balls++] = sprite; ball_list.push_back(sprite);
} }
else else
{ {
sprite_list[many_sprites++] = sprite; sprite_list.push_back(sprite);
sprite_modified(sprite); sprite_modified(sprite);
} }
return sprite; return sprite;
} }
void render::remove_sprite(render_sprite_type_struct* sprite) void render::remove_sprite(render_sprite_type_struct* sprite, bool removeFromList)
{ {
int index = 0; if (removeFromList)
if (many_sprites > 0)
{ {
while (sprite_list[index] != sprite) auto it = std::find(sprite_list.begin(), sprite_list.end(), sprite);
{ if (it != sprite_list.end())
if (++index >= many_sprites) sprite_list.erase(it);
return;
}
while (index < many_sprites)
{
sprite_list[index] = sprite_list[index + 1];
++index;
}
many_sprites--;
if (sprite->SpriteArray)
memory::free(sprite->SpriteArray);
memory::free(sprite);
}
} }
void render::remove_ball(struct render_sprite_type_struct* ball) delete sprite->SpriteArray;
{ delete sprite;
int index = 0;
if (many_balls > 0)
{
while (ball_list[index] != ball)
{
if (++index >= many_balls)
return;
} }
while (index < many_balls)
void render::remove_ball(render_sprite_type_struct* ball, bool removeFromList)
{ {
ball_list[index] = ball_list[index + 1]; if (removeFromList)
++index; {
} auto it = std::find(ball_list.begin(), ball_list.end(), ball);
many_balls--; if (it != ball_list.end())
memory::free(ball); ball_list.erase(it);
} }
delete ball->SpriteArray;
delete ball;
} }
void render::sprite_set(render_sprite_type_struct* sprite, gdrv_bitmap8* bmp, zmap_header_type* zMap, int xPos, void render::sprite_set(render_sprite_type_struct* sprite, gdrv_bitmap8* bmp, zmap_header_type* zMap, int xPos,
@ -322,19 +292,18 @@ void render::repaint(struct render_sprite_type_struct* sprite)
rectangle_type clipRect{}; rectangle_type clipRect{};
if (!sprite->SpriteArray) if (!sprite->SpriteArray)
return; return;
for (int index = 0; index < sprite->SpriteCount; index++) for (auto refSprite : *sprite->SpriteArray)
{ {
auto refSprite = sprite->SpriteArray[index];
if (!refSprite->UnknownFlag && refSprite->Bmp) if (!refSprite->UnknownFlag && refSprite->Bmp)
{ {
if (maths::rectangle_clip(&refSprite->BmpRect, &sprite->DirtyRect, &clipRect)) if (maths::rectangle_clip(&refSprite->BmpRect, &sprite->DirtyRect, &clipRect))
zdrv::paint( zdrv::paint(
clipRect.Width, clipRect.Width,
clipRect.Height, clipRect.Height,
&vscreen, vscreen,
clipRect.XPosition, clipRect.XPosition,
clipRect.YPosition, clipRect.YPosition,
&zscreen, zscreen,
clipRect.XPosition, clipRect.XPosition,
clipRect.YPosition, clipRect.YPosition,
refSprite->Bmp, refSprite->Bmp,
@ -351,9 +320,9 @@ void render::repaint(struct render_sprite_type_struct* sprite)
void render::paint_balls() void render::paint_balls()
{ {
// Sort ball sprites by depth // Sort ball sprites by depth
for (auto i = 0; i < many_balls; i++) for (auto i = 0u; i < ball_list.size(); i++)
{ {
for (auto j = i; j < many_balls / 2; ++j) for (auto j = i; j < ball_list.size() / 2; ++j)
{ {
auto ballA = ball_list[j]; auto ballA = ball_list[j];
auto ballB = ball_list[i]; auto ballB = ball_list[i];
@ -366,7 +335,7 @@ void render::paint_balls()
} }
// For balls that clip vScreen: save original vScreen contents and paint ball bitmap. // For balls that clip vScreen: save original vScreen contents and paint ball bitmap.
for (auto index = 0; index < many_balls; ++index) for (auto index = 0u; index < ball_list.size(); ++index)
{ {
auto ball = ball_list[index]; auto ball = ball_list[index];
auto dirty = &ball->DirtyRect; auto dirty = &ball->DirtyRect;
@ -374,14 +343,14 @@ void render::paint_balls()
{ {
int xPos = dirty->XPosition; int xPos = dirty->XPosition;
int yPos = dirty->YPosition; int yPos = dirty->YPosition;
gdrv::copy_bitmap(&ball_bitmap[index], dirty->Width, dirty->Height, 0, 0, &vscreen, xPos, yPos); gdrv::copy_bitmap(ball_bitmap[index], dirty->Width, dirty->Height, 0, 0, vscreen, xPos, yPos);
zdrv::paint_flat( zdrv::paint_flat(
dirty->Width, dirty->Width,
dirty->Height, dirty->Height,
&vscreen, vscreen,
xPos, xPos,
yPos, yPos,
&zscreen, zscreen,
xPos, xPos,
yPos, yPos,
ball->Bmp, ball->Bmp,
@ -399,17 +368,17 @@ void render::paint_balls()
void render::unpaint_balls() void render::unpaint_balls()
{ {
// Restore portions of vScreen saved during previous paint_balls call. // Restore portions of vScreen saved during previous paint_balls call.
for (int index = many_balls - 1; index >= 0; index--) for (int index = static_cast<int>(ball_list.size()) - 1; index >= 0; index--)
{ {
auto curBall = ball_list[index]; auto curBall = ball_list[index];
if (curBall->DirtyRect.Width > 0) if (curBall->DirtyRect.Width > 0)
gdrv::copy_bitmap( gdrv::copy_bitmap(
&vscreen, vscreen,
curBall->DirtyRect.Width, curBall->DirtyRect.Width,
curBall->DirtyRect.Height, curBall->DirtyRect.Height,
curBall->DirtyRect.XPosition, curBall->DirtyRect.XPosition,
curBall->DirtyRect.YPosition, curBall->DirtyRect.YPosition,
&ball_bitmap[index], ball_bitmap[index],
0, 0,
0); 0);
@ -425,51 +394,42 @@ void render::shift(int offsetX, int offsetY)
void render::build_occlude_list() void render::build_occlude_list()
{ {
++memory::critical_allocation; std::vector<render_sprite_type_struct*>* spriteArr = nullptr;
render_sprite_type_struct** spriteArr = nullptr; for (auto mainSprite : sprite_list)
for (int index = 0; index < many_sprites; ++index)
{ {
auto mainSprite = sprite_list[index];
if (mainSprite->SpriteArray) if (mainSprite->SpriteArray)
{ {
memory::free(mainSprite->SpriteArray); delete mainSprite->SpriteArray;
mainSprite->SpriteArray = nullptr; mainSprite->SpriteArray = nullptr;
mainSprite->SpriteCount = 0;
} }
if (!mainSprite->UnknownFlag && mainSprite->BoundingRect.Width != -1) if (!mainSprite->UnknownFlag && mainSprite->BoundingRect.Width != -1)
{ {
if (!spriteArr) if (!spriteArr)
spriteArr = memory::allocate<render_sprite_type_struct*>(1000); spriteArr = new std::vector<render_sprite_type_struct*>();
int occludeCount = 0; for (auto refSprite : sprite_list)
for (int i = 0; i < many_sprites; ++i)
{ {
auto refSprite = sprite_list[i];
if (!refSprite->UnknownFlag if (!refSprite->UnknownFlag
&& refSprite->BoundingRect.Width != -1 && refSprite->BoundingRect.Width != -1
&& maths::rectangle_clip(&mainSprite->BoundingRect, &refSprite->BoundingRect, nullptr) && maths::rectangle_clip(&mainSprite->BoundingRect, &refSprite->BoundingRect, nullptr)
&& spriteArr) && spriteArr)
{ {
spriteArr[occludeCount++] = refSprite; spriteArr->push_back(refSprite);
} }
} }
if (!mainSprite->UnknownFlag && mainSprite->Bmp && occludeCount < 2) if (!mainSprite->UnknownFlag && mainSprite->Bmp && spriteArr->size() < 2)
occludeCount = 0; spriteArr->clear();
if (occludeCount) if (!spriteArr->empty())
{ {
mainSprite->SpriteArray = memory::realloc(spriteArr, sizeof(void*) * occludeCount); mainSprite->SpriteArray = spriteArr;
mainSprite->SpriteCount = occludeCount;
spriteArr = nullptr; spriteArr = nullptr;
} }
} }
} }
if (spriteArr) delete spriteArr;
memory::free(spriteArr);
--memory::critical_allocation;
} }
void render::SpriteViewer(bool* show) void render::SpriteViewer(bool* show)
@ -575,23 +535,23 @@ void render::BlitVScreen()
reinterpret_cast<void**>(&lockedPixels), reinterpret_cast<void**>(&lockedPixels),
&pitch &pitch
); );
assertm(static_cast<unsigned>(pitch) == vscreen.Width * sizeof(ColorRgba), "Padding on vScreen texture"); assertm(static_cast<unsigned>(pitch) == vscreen->Width * sizeof(ColorRgba), "Padding on vScreen texture");
if (offset_x == 0 && offset_y == 0) if (offset_x == 0 && offset_y == 0)
{ {
// No offset - direct copy // No offset - direct copy
std::memcpy(lockedPixels, vscreen.BmpBufPtr1, vscreen.Width * vscreen.Height * sizeof(ColorRgba)); std::memcpy(lockedPixels, vscreen->BmpBufPtr1, vscreen->Width * vscreen->Height * sizeof(ColorRgba));
} }
else else
{ {
// Copy offset table and fixed side bar // Copy offset table and fixed side bar
auto tableWidth = pb::MainTable->Width; auto tableWidth = pb::MainTable->Width;
auto scoreWidth = vscreen.Width - pb::MainTable->Width; auto scoreWidth = vscreen->Width - pb::MainTable->Width;
auto tableStride = tableWidth * sizeof(ColorRgba); auto tableStride = tableWidth * sizeof(ColorRgba);
auto scoreStride = scoreWidth * sizeof(ColorRgba); auto scoreStride = scoreWidth * sizeof(ColorRgba);
auto srcScorePtr = &vscreen.BmpBufPtr1[tableWidth]; auto srcScorePtr = &vscreen->BmpBufPtr1[tableWidth];
auto xSrc = 0, ySrc = 0, xDst = offset_x, yDst = offset_y, height = vscreen.Height; auto xSrc = 0, ySrc = 0, xDst = offset_x, yDst = offset_y, height = vscreen->Height;
// Negative dst == positive src offset // Negative dst == positive src offset
if (xDst < 0) if (xDst < 0)
@ -618,8 +578,8 @@ void render::BlitVScreen()
if (ySrc) if (ySrc)
height -= ySrc; height -= ySrc;
auto srcBmpPtr = &vscreen.BmpBufPtr1[vscreen.Width * ySrc + xSrc]; auto srcBmpPtr = &vscreen->BmpBufPtr1[vscreen->Width * ySrc + xSrc];
auto dstPtr = &lockedPixels[vscreen.Width * yDst + xDst]; auto dstPtr = &lockedPixels[vscreen->Width * yDst + xDst];
for (int y = height; y > 0; --y) for (int y = height; y > 0; --y)
{ {
std::memcpy(dstPtr, srcBmpPtr, tableStride); std::memcpy(dstPtr, srcBmpPtr, tableStride);
@ -627,8 +587,8 @@ void render::BlitVScreen()
std::memcpy(dstPtr, srcScorePtr, scoreStride); std::memcpy(dstPtr, srcScorePtr, scoreStride);
dstPtr += scoreWidth; dstPtr += scoreWidth;
srcBmpPtr += vscreen.Stride; srcBmpPtr += vscreen->Stride;
srcScorePtr += vscreen.Stride; srcScorePtr += vscreen->Stride;
} }
} }

View file

@ -22,8 +22,7 @@ struct render_sprite_type_struct
int ZMapOffestY; int ZMapOffestY;
int ZMapOffestX; int ZMapOffestX;
rectangle_type DirtyRect; rectangle_type DirtyRect;
render_sprite_type_struct** SpriteArray; std::vector<render_sprite_type_struct*>* SpriteArray;
int SpriteCount;
rectangle_type BoundingRect; rectangle_type BoundingRect;
}; };
@ -31,7 +30,7 @@ struct render_sprite_type_struct
class render class render
{ {
public: public:
static gdrv_bitmap8 vscreen, *background_bitmap; static gdrv_bitmap8 *vscreen, *background_bitmap;
static SDL_Rect DestinationRect; static SDL_Rect DestinationRect;
static void init(gdrv_bitmap8* bmp, float zMin, float zScaler, int width, int height); static void init(gdrv_bitmap8* bmp, float zMin, float zScaler, int width, int height);
@ -41,8 +40,8 @@ public:
static render_sprite_type_struct* create_sprite(VisualTypes visualType, gdrv_bitmap8* bmp, static render_sprite_type_struct* create_sprite(VisualTypes visualType, gdrv_bitmap8* bmp,
zmap_header_type* zMap, zmap_header_type* zMap,
int xPosition, int yPosition, rectangle_type* rect); int xPosition, int yPosition, rectangle_type* rect);
static void remove_sprite(render_sprite_type_struct* sprite); static void remove_sprite(render_sprite_type_struct* sprite, bool removeFromList);
static void remove_ball(struct render_sprite_type_struct* ball); static void remove_ball(render_sprite_type_struct* ball, bool removeFromList);
static void sprite_set(render_sprite_type_struct* sprite, gdrv_bitmap8* bmp, zmap_header_type* zMap, int xPos, static void sprite_set(render_sprite_type_struct* sprite, gdrv_bitmap8* bmp, zmap_header_type* zMap, int xPos,
int yPos); int yPos);
static void sprite_set_bitmap(render_sprite_type_struct* sprite, gdrv_bitmap8* bmp); static void sprite_set_bitmap(render_sprite_type_struct* sprite, gdrv_bitmap8* bmp);
@ -53,14 +52,13 @@ public:
static void SpriteViewer(bool* show); static void SpriteViewer(bool* show);
static void PresentVScreen(); static void PresentVScreen();
private: private:
static int many_dirty, many_sprites, many_balls; static std::vector<render_sprite_type_struct*> dirty_list, sprite_list, ball_list;
static render_sprite_type_struct **dirty_list, **sprite_list, **ball_list;
static zmap_header_type* background_zmap; static zmap_header_type* background_zmap;
static int zmap_offset, zmap_offsetY, offset_x, offset_y; static int zmap_offset, zmap_offsetY, offset_x, offset_y;
static float zscaler, zmin, zmax; static float zscaler, zmin, zmax;
static rectangle_type vscreen_rect; static rectangle_type vscreen_rect;
static gdrv_bitmap8 ball_bitmap[20]; static gdrv_bitmap8 *ball_bitmap[20];
static zmap_header_type zscreen; static zmap_header_type* zscreen;
static SDL_Texture* vScreenTex; static SDL_Texture* vScreenTex;
static void repaint(struct render_sprite_type_struct* sprite); static void repaint(struct render_sprite_type_struct* sprite);

View file

@ -4,7 +4,6 @@
#include "EmbeddedData.h" #include "EmbeddedData.h"
#include "fullscrn.h" #include "fullscrn.h"
#include "loader.h" #include "loader.h"
#include "memory.h"
#include "GroupData.h" #include "GroupData.h"
#include "pb.h" #include "pb.h"
#include "render.h" #include "render.h"
@ -19,7 +18,7 @@ int score::init()
scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp) scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp)
{ {
auto score = memory::allocate<scoreStruct>(); auto score = new scoreStruct();
if (!score) if (!score)
return nullptr; return nullptr;
score->Score = -9999; score->Score = -9999;
@ -31,7 +30,7 @@ scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp)
FieldTypes::ShortArray)); FieldTypes::ShortArray));
if (!dimensions) if (!dimensions)
{ {
memory::free(score); delete score;
return nullptr; return nullptr;
} }
int groupIndex = *dimensions++; int groupIndex = *dimensions++;
@ -50,10 +49,7 @@ scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp)
scoreStruct* score::dup(scoreStruct* score, int scoreIndex) scoreStruct* score::dup(scoreStruct* score, int scoreIndex)
{ {
auto result = memory::allocate<scoreStruct>(); return new scoreStruct(*score);
if (result)
memcpy(result, score, sizeof(scoreStruct));
return result;
} }
void score::load_msg_font(LPCSTR lpName) void score::load_msg_font(LPCSTR lpName)
@ -73,7 +69,7 @@ void score::load_msg_font_3DPB(LPCSTR lpName)
auto rcData = reinterpret_cast<int16_t*>(ImFontAtlas::DecompressCompressedBase85Data( auto rcData = reinterpret_cast<int16_t*>(ImFontAtlas::DecompressCompressedBase85Data(
EmbeddedData::PB_MSGFT_bin_compressed_data_base85)); EmbeddedData::PB_MSGFT_bin_compressed_data_base85));
auto fontp = memory::allocate<score_msg_font_type>(); auto fontp = new score_msg_font_type();
msg_fontp = fontp; msg_fontp = fontp;
if (!fontp) if (!fontp)
{ {
@ -91,10 +87,10 @@ void score::load_msg_font_3DPB(LPCSTR lpName)
} }
auto height = rcData[2]; auto height = rcData[2];
auto tmpCharBur = memory::allocate(maxWidth * height + 4); auto tmpCharBur = new char[maxWidth * height + 4];
if (!tmpCharBur) if (!tmpCharBur)
{ {
memory::free(msg_fontp); delete msg_fontp;
msg_fontp = nullptr; msg_fontp = nullptr;
IM_FREE(rcData); IM_FREE(rcData);
return; return;
@ -111,19 +107,8 @@ void score::load_msg_font_3DPB(LPCSTR lpName)
if (!width) if (!width)
continue; continue;
auto bmp = memory::allocate<gdrv_bitmap8>(); auto bmp = new gdrv_bitmap8(width, height, true);
msg_fontp->Chars[charInd] = bmp; msg_fontp->Chars[charInd] = bmp;
if (!bmp)
{
break;
}
if (gdrv::create_bitmap(bmp, width, height, width))
{
memory::free(bmp);
msg_fontp->Chars[charInd] = nullptr;
break;
}
auto sizeInBytes = height * width + 1; auto sizeInBytes = height * width + 1;
memcpy(tmpCharBur + 3, ptrToData, sizeInBytes); memcpy(tmpCharBur + 3, ptrToData, sizeInBytes);
@ -139,7 +124,7 @@ void score::load_msg_font_3DPB(LPCSTR lpName)
} }
} }
memory::free(tmpCharBur); delete[] tmpCharBur;
IM_FREE(rcData); IM_FREE(rcData);
if (charInd != 128) if (charInd != 128)
unload_msg_font(); unload_msg_font();
@ -152,7 +137,7 @@ void score::load_msg_font_FT(LPCSTR lpName)
int groupIndex = pb::record_table->record_labeled(lpName); int groupIndex = pb::record_table->record_labeled(lpName);
if (groupIndex < 0) if (groupIndex < 0)
return; return;
msg_fontp = reinterpret_cast<score_msg_font_type*>(memory::allocate(sizeof(score_msg_font_type))); msg_fontp = new score_msg_font_type();
if (!msg_fontp) if (!msg_fontp)
return; return;
@ -179,15 +164,11 @@ void score::unload_msg_font()
{ {
/*3DBP creates bitmaps, FT just references them from partman*/ /*3DBP creates bitmaps, FT just references them from partman*/
if (!pb::FullTiltMode) if (!pb::FullTiltMode)
for (int i = 0; i < 128; i++) for (auto& Char : msg_fontp->Chars)
{ {
if (msg_fontp->Chars[i]) delete Char;
{
gdrv::destroy_bitmap(msg_fontp->Chars[i]);
memory::free(msg_fontp->Chars[i]);
} }
} delete msg_fontp;
memory::free(msg_fontp);
msg_fontp = nullptr; msg_fontp = nullptr;
} }
} }
@ -198,7 +179,7 @@ void score::erase(scoreStruct* score, int blitFlag)
{ {
if (score->BackgroundBmp) if (score->BackgroundBmp)
gdrv::copy_bitmap( gdrv::copy_bitmap(
&render::vscreen, render::vscreen,
score->Width, score->Width,
score->Height, score->Height,
score->OffsetX, score->OffsetX,
@ -207,7 +188,7 @@ void score::erase(scoreStruct* score, int blitFlag)
score->OffsetX, score->OffsetX,
score->OffsetY); score->OffsetY);
else else
gdrv::fill_bitmap(&render::vscreen, score->Width, score->Height, score->OffsetX, score->OffsetY, 0); gdrv::fill_bitmap(render::vscreen, score->Width, score->Height, score->OffsetX, score->OffsetY, 0);
} }
} }
@ -242,9 +223,9 @@ void score::update(scoreStruct* score)
int height = bmp->Height; int height = bmp->Height;
int width = bmp->Width; int width = bmp->Width;
if (render::background_bitmap) if (render::background_bitmap)
gdrv::copy_bitmap_w_transparency(&render::vscreen, width, height, x, y, bmp, 0, 0); gdrv::copy_bitmap_w_transparency(render::vscreen, width, height, x, y, bmp, 0, 0);
else else
gdrv::copy_bitmap(&render::vscreen, width, height, x, y, bmp, 0, 0); gdrv::copy_bitmap(render::vscreen, width, height, x, y, bmp, 0, 0);
} }
} }
} }

View file

@ -1,7 +1,6 @@
#include "pch.h" #include "pch.h"
#include "timer.h" #include "timer.h"
#include "memory.h"
#include "pb.h" #include "pb.h"
int timer::SetCount; int timer::SetCount;
@ -13,7 +12,7 @@ timer_struct* timer::TimerBuffer;
int timer::init(int count) int timer::init(int count)
{ {
auto buf = memory::allocate<timer_struct>(count); auto buf = new timer_struct[count];
TimerBuffer = buf; TimerBuffer = buf;
if (!buf) if (!buf)
return 1; return 1;
@ -32,8 +31,7 @@ int timer::init(int count)
void timer::uninit() void timer::uninit()
{ {
if (TimerBuffer) delete[] TimerBuffer;
memory::free(TimerBuffer);
TimerBuffer = nullptr; TimerBuffer = nullptr;
} }

View file

@ -2,7 +2,6 @@
#include "winmain.h" #include "winmain.h"
#include "fullscrn.h" #include "fullscrn.h"
#include "memory.h"
#include "midi.h" #include "midi.h"
#include "pinball.h" #include "pinball.h"
#include "options.h" #include "options.h"
@ -28,7 +27,7 @@ int winmain::no_time_loss;
bool winmain::restart = false; bool winmain::restart = false;
gdrv_bitmap8 winmain::gfr_display{}; gdrv_bitmap8* winmain::gfr_display = nullptr;
std::string winmain::DatFileName; std::string winmain::DatFileName;
bool winmain::ShowAboutDialog = false; bool winmain::ShowAboutDialog = false;
bool winmain::ShowImGuiDemo = false; bool winmain::ShowImGuiDemo = false;
@ -46,7 +45,7 @@ int winmain::WinMain(LPCSTR lpCmdLine)
restart = false; restart = false;
bQuit = false; bQuit = false;
memory::init(memalloc_failure); std::set_new_handler(memalloc_failure);
// SDL init // SDL init
SDL_SetMainReady(); SDL_SetMainReady();
@ -117,8 +116,6 @@ int winmain::WinMain(LPCSTR lpCmdLine)
// PB init from message handler // PB init from message handler
{ {
++memory::critical_allocation;
options::init(); options::init();
auto voiceCount = options::get_int("Voices", 8); auto voiceCount = options::get_int("Voices", 8);
if (Sound::Init(voiceCount)) if (Sound::Init(voiceCount))
@ -136,8 +133,6 @@ int winmain::WinMain(LPCSTR lpCmdLine)
} }
fullscrn::init(); fullscrn::init();
--memory::critical_allocation;
} }
pb::reset_table(); pb::reset_table();
@ -182,7 +177,7 @@ int winmain::WinMain(LPCSTR lpCmdLine)
if (DispGRhistory) if (DispGRhistory)
{ {
if (!gfr_display.BmpBufPtr1) if (!gfr_display)
{ {
auto plt = static_cast<ColorRgba*>(malloc(1024u)); auto plt = static_cast<ColorRgba*>(malloc(1024u));
auto pltPtr = &plt[10]; auto pltPtr = &plt[10];
@ -199,14 +194,14 @@ int winmain::WinMain(LPCSTR lpCmdLine)
} }
gdrv::display_palette(plt); gdrv::display_palette(plt);
free(plt); free(plt);
gdrv::create_bitmap(&gfr_display, 400, 15, 400, false); gfr_display = new gdrv_bitmap8(400, 15, false);
} }
if (!dtHistoryCounter) if (!dtHistoryCounter)
{ {
dtHistoryCounter = 300; dtHistoryCounter = 300;
gdrv::copy_bitmap(&render::vscreen, 300, 10, 0, 30, &gfr_display, 0, 0); gdrv::copy_bitmap(render::vscreen, 300, 10, 0, 30, gfr_display, 0, 0);
gdrv::fill_bitmap(&gfr_display, 300, 10, 0, 0, 0); gdrv::fill_bitmap(gfr_display, 300, 10, 0, 0, 0);
} }
} }
@ -227,7 +222,7 @@ int winmain::WinMain(LPCSTR lpCmdLine)
auto deltaT = static_cast<int>(frameDuration); auto deltaT = static_cast<int>(frameDuration);
frameDuration -= deltaT; frameDuration -= deltaT;
pb::frame(deltaT); pb::frame(deltaT);
if (gfr_display.BmpBufPtr1) if (gfr_display)
{ {
auto deltaTPal = deltaT + 10; auto deltaTPal = deltaT + 10;
auto fillChar = static_cast<uint8_t>(deltaTPal); auto fillChar = static_cast<uint8_t>(deltaTPal);
@ -235,7 +230,7 @@ int winmain::WinMain(LPCSTR lpCmdLine)
{ {
fillChar = 1; fillChar = 1;
} }
gdrv::fill_bitmap(&gfr_display, 1, 10, 300 - dtHistoryCounter, 0, fillChar); gdrv::fill_bitmap(gfr_display, 1, 10, 300 - dtHistoryCounter, 0, fillChar);
--dtHistoryCounter; --dtHistoryCounter;
} }
updateCounter++; updateCounter++;
@ -289,7 +284,7 @@ int winmain::WinMain(LPCSTR lpCmdLine)
} }
} }
gdrv::destroy_bitmap(&gfr_display); delete gfr_display;
options::uninit(); options::uninit();
midi::music_shutdown(); midi::music_shutdown();
pb::uninit(); pb::uninit();

View file

@ -52,7 +52,7 @@ public:
static int WinMain(LPCSTR lpCmdLine); static int WinMain(LPCSTR lpCmdLine);
static int event_handler(const SDL_Event* event); static int event_handler(const SDL_Event* event);
static void memalloc_failure(); [[ noreturn ]] static void memalloc_failure();
static int ProcessWindowMessages(); static int ProcessWindowMessages();
static void a_dialog(); static void a_dialog();
static void end_pause(); static void end_pause();
@ -64,7 +64,7 @@ public:
private: private:
static int return_value, bQuit, DispFrameRate, DispGRhistory, activated; static int return_value, bQuit, DispFrameRate, DispGRhistory, activated;
static int has_focus, mouse_down, last_mouse_x, last_mouse_y, no_time_loss; static int has_focus, mouse_down, last_mouse_x, last_mouse_y, no_time_loss;
static gdrv_bitmap8 gfr_display; static gdrv_bitmap8* gfr_display;
static std::string FpsDetails; static std::string FpsDetails;
static bool restart; static bool restart;
static bool ShowAboutDialog; static bool ShowAboutDialog;

View file

@ -1,21 +1,26 @@
#include "pch.h" #include "pch.h"
#include "zdrv.h" #include "zdrv.h"
#include "memory.h"
#include "winmain.h" #include "winmain.h"
int zdrv::create_zmap(zmap_header_type* zmap, int width, int height, int stride) zmap_header_type::zmap_header_type(int width, int height, int stride)
{ {
zmap->Width = width; Resolution = 0;
zmap->Height = height; Width = width;
zmap->Stride = stride >= 0 ? stride : pad(width); Height = height;
zmap->Texture = nullptr; Stride = stride >= 0 ? stride : pad(width);
Texture = nullptr;
zmap->ZPtr1 = memory::allocate<unsigned short>(zmap->Stride * zmap->Height); ZPtr1 = new unsigned short[Stride * Height];
return zmap->ZPtr1 ? 0 : -1;
} }
int zdrv::pad(int width) zmap_header_type::~zmap_header_type()
{
delete[] ZPtr1;
if (Texture)
SDL_DestroyTexture(Texture);
}
int zmap_header_type::pad(int width)
{ {
int result = width; int result = width;
if (width & 3) if (width & 3)
@ -23,17 +28,6 @@ int zdrv::pad(int width)
return result; return result;
} }
int zdrv::destroy_zmap(zmap_header_type* zmap)
{
if (!zmap)
return -1;
if (zmap->ZPtr1)
memory::free(zmap->ZPtr1);
if (zmap->Texture)
SDL_DestroyTexture(zmap->Texture);
memset(zmap, 0, sizeof(zmap_header_type));
return 0;
}
void zdrv::fill(zmap_header_type* zmap, int width, int height, int xOff, int yOff, uint16_t fillWord) void zdrv::fill(zmap_header_type* zmap, int width, int height, int xOff, int yOff, uint16_t fillWord)
{ {

View file

@ -3,20 +3,21 @@
struct zmap_header_type struct zmap_header_type
{ {
zmap_header_type(int width, int height, int stride);
~zmap_header_type();
int Width; int Width;
int Height; int Height;
int Stride; int Stride;
unsigned Resolution; unsigned Resolution;
uint16_t* ZPtr1; uint16_t* ZPtr1;
SDL_Texture* Texture; SDL_Texture* Texture;
private:
static int pad(int width);
}; };
class zdrv class zdrv
{ {
public: public:
static int pad(int width);
static int create_zmap(zmap_header_type* zmap, int width, int height, int stride = -1);
static int destroy_zmap(zmap_header_type* zmap);
static void fill(zmap_header_type* zmap, int width, int height, int xOff, int yOff, uint16_t fillWord); static void fill(zmap_header_type* zmap, int width, int height, int xOff, int yOff, uint16_t fillWord);
static void paint(int width, int height, gdrv_bitmap8* dstBmp, int dstBmpXOff, int dstBmpYOff, static void paint(int width, int height, gdrv_bitmap8* dstBmp, int dstBmpXOff, int dstBmpYOff,
zmap_header_type* dstZMap, int dstZMapXOff, int dstZMapYOff, gdrv_bitmap8* srcBmp, int srcBmpXOff, zmap_header_type* dstZMap, int dstZMapXOff, int dstZMapYOff, gdrv_bitmap8* srcBmp, int srcBmpXOff,