From 1c94fb0389b291e4cf4be2b9ba1c8e435dd1765d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 2 Nov 2023 15:06:56 +0000 Subject: [PATCH] Add: Mock sprite cache intialization. This fills up the sprite cache with SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT zero-size sprites, to allow GetSpriteSize() calls to continue from unit-tests. --- src/spritecache.cpp | 3 +-- src/spritecache_internal.h | 1 + src/tests/CMakeLists.txt | 2 ++ src/tests/mock_spritecache.cpp | 49 ++++++++++++++++++++++++++++++++++ src/tests/mock_spritecache.h | 15 +++++++++++ 5 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/tests/mock_spritecache.cpp create mode 100644 src/tests/mock_spritecache.h diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 43d8a95894..2cb32eb6c8 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -102,7 +102,6 @@ static uint _allocated_sprite_cache_size = 0; static int _compact_cache_counter; static void CompactSpriteCache(); -static void *AllocSprite(size_t mem_req); /** * Skip the given amount of sprite graphics data. @@ -831,7 +830,7 @@ static void DeleteEntryFromSpriteCache() DeleteEntryFromSpriteCache(best); } -static void *AllocSprite(size_t mem_req) +void *AllocSprite(size_t mem_req) { mem_req += sizeof(MemBlock); diff --git a/src/spritecache_internal.h b/src/spritecache_internal.h index 4268c1217d..6664f980b2 100644 --- a/src/spritecache_internal.h +++ b/src/spritecache_internal.h @@ -36,6 +36,7 @@ static inline bool IsMapgenSpriteID(SpriteID sprite) return IsInsideMM(sprite, SPR_MAPGEN_BEGIN, SPR_MAPGEN_END); } +void *AllocSprite(size_t mem_req); SpriteCache *AllocateSpriteCache(uint index); #endif /* SPRITECACHE_INTERNAL_H */ diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index ad7701b26b..18390c1eb8 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -2,6 +2,8 @@ add_test_files( landscape_partial_pixel_z.cpp math_func.cpp mock_fontcache.h + mock_spritecache.cpp + mock_spritecache.h string_func.cpp strings_func.cpp test_main.cpp diff --git a/src/tests/mock_spritecache.cpp b/src/tests/mock_spritecache.cpp new file mode 100644 index 0000000000..5a5910cfdd --- /dev/null +++ b/src/tests/mock_spritecache.cpp @@ -0,0 +1,49 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file mock_spritecache.cpp Mock sprite cache implementation. */ + +#include "../stdafx.h" + +#include "../blitter/factory.hpp" +#include "../core/math_func.hpp" +#include "../spritecache.h" +#include "../spritecache_internal.h" +#include "../table/sprites.h" + +static bool MockLoadNextSprite(int load_index) +{ + static Sprite *sprite = (Sprite *)AllocSprite(sizeof(*sprite)); + + bool is_mapgen = IsMapgenSpriteID(load_index); + + SpriteCache *sc = AllocateSpriteCache(load_index); + sc->file = nullptr; + sc->file_pos = 0; + sc->ptr = sprite; + sc->lru = 0; + sc->id = 0; + sc->type = is_mapgen ? SpriteType::MapGen : SpriteType::Normal; + sc->warned = false; + sc->control_flags = 0; + + /* Fill with empty sprites up until the default sprite count. */ + return (uint)load_index < SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT; +} + +void MockGfxLoadSprites() +{ + /* Force blitter 'null'. This is necessary for GfxInitSpriteMem() to function. */ + BlitterFactory::SelectBlitter("null"); + + GfxInitSpriteMem(); + + int load_index = 0; + while (MockLoadNextSprite(load_index)) { + load_index++; + } +} diff --git a/src/tests/mock_spritecache.h b/src/tests/mock_spritecache.h new file mode 100644 index 0000000000..6d715cf699 --- /dev/null +++ b/src/tests/mock_spritecache.h @@ -0,0 +1,15 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file mock_spritecache.h Mock sprite cache definition. */ + +#ifndef MOCK_SPRITECACHE_H +#define MOCK_SPRITECACHE_H + +void MockGfxLoadSprites(); + +#endif /* MOCK_SPRITECACHE_H */