From 5d35b289bbe6f0c7248e501b1bcc076a29b2fe46 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Mon, 23 Jan 2023 04:00:26 +0000 Subject: [PATCH] Skip creating half-size sprites for 1x1 items We never use these anyway --- Source/cursor.cpp | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/Source/cursor.cpp b/Source/cursor.cpp index 3ccd92432..181d02d75 100644 --- a/Source/cursor.cpp +++ b/Source/cursor.cpp @@ -29,7 +29,6 @@ #include "utils/attributes.h" #include "utils/language.h" #include "utils/sdl_bilinear_scale.hpp" -#include "utils/static_vector.hpp" #include "utils/surface_to_clx.hpp" #include "utils/utf8.hpp" @@ -111,9 +110,8 @@ const uint16_t InvItemHeight2[InvItems2Size] = { // clang-format on }; -constexpr size_t NumInvItems = InvItems1Size + InvItems2Size - (static_cast(CURSOR_FIRSTITEM) - 1); -StaticVector *HalfSizeItemSprites; -StaticVector *HalfSizeItemSpritesRed; +OptionalOwnedClxSpriteList *HalfSizeItemSprites; +OptionalOwnedClxSpriteList *HalfSizeItemSpritesRed; } // namespace @@ -175,20 +173,23 @@ Size GetInvItemSize(int cursId) ClxSprite GetHalfSizeItemSprite(int cursId) { - return (*HalfSizeItemSprites)[cursId][0]; + return (*HalfSizeItemSprites[cursId])[0]; } ClxSprite GetHalfSizeItemSpriteRed(int cursId) { - return (*HalfSizeItemSpritesRed)[cursId][0]; + return (*HalfSizeItemSpritesRed[cursId])[0]; } void CreateHalfSizeItemSprites() { if (HalfSizeItemSprites != nullptr) return; - HalfSizeItemSprites = new StaticVector; - HalfSizeItemSpritesRed = new StaticVector; + const int numInvItems = gbIsHellfire + ? InvItems1Size + InvItems2Size - (static_cast(CURSOR_FIRSTITEM) - 1) + : InvItems1Size + (static_cast(CURSOR_FIRSTITEM) - 1); + HalfSizeItemSprites = new OptionalOwnedClxSpriteList[numInvItems]; + HalfSizeItemSpritesRed = new OptionalOwnedClxSpriteList[numInvItems]; const uint8_t *redTrn = GetInfravisionTRN(); constexpr int MaxWidth = 28 * 3; @@ -196,7 +197,11 @@ void CreateHalfSizeItemSprites() OwnedSurface ownedItemSurface { MaxWidth, MaxHeight }; OwnedSurface ownedHalfSurface { MaxWidth / 2, MaxHeight / 2 }; - const auto createHalfSize = [&, redTrn](const ClxSprite itemSprite) { + const auto createHalfSize = [&, redTrn](const ClxSprite itemSprite, size_t outputIndex) { + if (itemSprite.width() <= 28 && itemSprite.height() <= 28) { + // Skip creating half-size sprites for 1x1 items because we always render them at full size anyway. + return; + } const Surface itemSurface = ownedItemSurface.subregion(0, 0, itemSprite.width(), itemSprite.height()); SDL_Rect itemSurfaceRect = MakeSdlRect(0, 0, itemSurface.w(), itemSurface.h()); SDL_SetClipRect(itemSurface.surface, &itemSurfaceRect); @@ -207,20 +212,21 @@ void CreateHalfSizeItemSprites() SDL_Rect halfSurfaceRect = MakeSdlRect(0, 0, halfSurface.w(), halfSurface.h()); SDL_SetClipRect(halfSurface.surface, &halfSurfaceRect); BilinearDownscaleByHalf8(itemSurface.surface, paletteTransparencyLookup, halfSurface.surface, 1); - HalfSizeItemSprites->emplace_back(SurfaceToClx(halfSurface, 1, 1)); + HalfSizeItemSprites[outputIndex].emplace(SurfaceToClx(halfSurface, 1, 1)); SDL_FillRect(itemSurface.surface, nullptr, 1); ClxDrawTRN(itemSurface, { 0, itemSurface.h() }, itemSprite, redTrn); BilinearDownscaleByHalf8(itemSurface.surface, paletteTransparencyLookup, halfSurface.surface, 1); - HalfSizeItemSpritesRed->emplace_back(SurfaceToClx(halfSurface, 1, 1)); + HalfSizeItemSpritesRed[outputIndex].emplace(SurfaceToClx(halfSurface, 1, 1)); }; - for (size_t i = static_cast(CURSOR_FIRSTITEM) - 1; i < InvItems1Size; ++i) { - createHalfSize((*pCursCels)[i]); + size_t outputIndex = 0; + for (size_t i = static_cast(CURSOR_FIRSTITEM) - 1; i < InvItems1Size; ++i, ++outputIndex) { + createHalfSize((*pCursCels)[i], outputIndex); } if (gbIsHellfire) { - for (size_t i = 0; i < InvItems2Size; ++i) { - createHalfSize((*pCursCels2)[i]); + for (size_t i = 0; i < InvItems2Size; ++i, ++outputIndex) { + createHalfSize((*pCursCels2)[i], outputIndex); } } } @@ -228,9 +234,9 @@ void CreateHalfSizeItemSprites() void FreeHalfSizeItemSprites() { if (HalfSizeItemSprites != nullptr) { - delete HalfSizeItemSprites; + delete[] HalfSizeItemSprites; HalfSizeItemSprites = nullptr; - delete HalfSizeItemSpritesRed; + delete[] HalfSizeItemSpritesRed; HalfSizeItemSpritesRed = nullptr; } }