From 917b68d6304636ccfbf7aa52daa108d3e071ae96 Mon Sep 17 00:00:00 2001 From: Muzychenko Andrey <33288308+k4zmu2a@users.noreply.github.com> Date: Thu, 28 Oct 2021 13:03:05 +0300 Subject: [PATCH] Added NN scaling for PINBALL2.MID. It does not scale well. Wii port should rather use non-compressed PB_MSGFT_bin. --- SpaceCadetPinball/GroupData.cpp | 6 +++++- SpaceCadetPinball/gdrv.cpp | 32 ++++++++++++++++++++++++++++++++ SpaceCadetPinball/gdrv.h | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/SpaceCadetPinball/GroupData.cpp b/SpaceCadetPinball/GroupData.cpp index 5ef2542..ee46dea 100644 --- a/SpaceCadetPinball/GroupData.cpp +++ b/SpaceCadetPinball/GroupData.cpp @@ -295,6 +295,7 @@ void DatFile::Finalize() IM_FREE(rcData); // PINBALL2.MID is an alternative font provided in 3DPB data + // Scaled down because it is too large for top text box /*auto file = pinball::make_path_name("PINBALL2.MID"); auto fileHandle = fopen(file.c_str(), "rb"); fseek(fileHandle, 0, SEEK_END); @@ -303,8 +304,11 @@ void DatFile::Finalize() fseek(fileHandle, 0, SEEK_SET); fread(rcData, 1, fileSize, fileHandle); fclose(fileHandle); + auto groupId = Groups.back()->GroupId + 1u; AddMsgFont(rcData, "pbmsg_ft"); - delete[] rcData;*/ + delete[] rcData; + for (auto i = groupId; i < Groups.size(); i++) + Groups[i]->GetBitmap(0)->ScaleIndexed(0.84f, 0.84f);*/ } for (auto group : Groups) diff --git a/SpaceCadetPinball/gdrv.cpp b/SpaceCadetPinball/gdrv.cpp index b060ca0..02d65c3 100644 --- a/SpaceCadetPinball/gdrv.cpp +++ b/SpaceCadetPinball/gdrv.cpp @@ -79,6 +79,38 @@ gdrv_bitmap8::~gdrv_bitmap8() } } +void gdrv_bitmap8::ScaleIndexed(float scaleX, float scaleY) +{ + if (!IndexedBmpPtr) + { + assertm(false, "Scaling non-indexed bitmap"); + return; + } + + int newWidht = static_cast(Width * scaleX), newHeight = static_cast(Height * scaleY); + if (Width == newWidht && Height == newHeight) + return; + + auto newIndBuf = new char[newHeight * newWidht]; + for (int dst = 0, y = 0; y < newHeight; y++) + { + for (int x = 0; x < newWidht; x++, dst++) + { + auto px = static_cast(x / scaleX); + auto py = static_cast(y / scaleY); + newIndBuf[dst] = IndexedBmpPtr[(py * IndexedStride) + px]; + } + } + + Stride = IndexedStride = Width = newWidht; + Height = newHeight; + + delete IndexedBmpPtr; + IndexedBmpPtr = newIndBuf; + delete BmpBufPtr1; + BmpBufPtr1 = new ColorRgba[Stride * Height]; +} + int gdrv::display_palette(ColorRgba* plt) { const uint32_t sysPaletteColors[] diff --git a/SpaceCadetPinball/gdrv.h b/SpaceCadetPinball/gdrv.h index e0da784..4d2d51f 100644 --- a/SpaceCadetPinball/gdrv.h +++ b/SpaceCadetPinball/gdrv.h @@ -42,6 +42,7 @@ struct gdrv_bitmap8 gdrv_bitmap8(int width, int height, bool indexed); gdrv_bitmap8(const struct dat8BitBmpHeader& header); ~gdrv_bitmap8(); + void ScaleIndexed(float scaleX, float scaleY); ColorRgba* BmpBufPtr1; char* IndexedBmpPtr; int Width;