Changeset - r28097:8fabfd93220f
[Not reviewed]
master
0 2 1
Peter Nelson - 12 months ago 2023-11-03 18:48:34
peter1138@openttd.org
Add: Expose minimal parts of SpriteCache internals.

These parts are needed to be able to mock the SpriteCache for unit-tests.
3 files changed with 45 insertions and 17 deletions:
0 comments (0 inline, 0 general)
src/CMakeLists.txt
Show inline comments
 
@@ -395,12 +395,13 @@ add_files(
 
    sound_func.h
 
    sound_type.h
 
    sprite.cpp
 
    sprite.h
 
    spritecache.cpp
 
    spritecache.h
 
    spritecache_internal.h
 
    station.cpp
 
    station_base.h
 
    station_cmd.cpp
 
    station_cmd.h
 
    station_func.h
 
    station_gui.cpp
src/spritecache.cpp
Show inline comments
 
@@ -16,49 +16,35 @@
 
#include "zoom_func.h"
 
#include "settings_type.h"
 
#include "blitter/factory.hpp"
 
#include "core/math_func.hpp"
 
#include "core/mem_func.hpp"
 
#include "video/video_driver.hpp"
 
#include "spritecache.h"
 
#include "spritecache_internal.h"
 

	
 
#include "table/sprites.h"
 
#include "table/strings.h"
 
#include "table/palette_convert.h"
 

	
 
#include "safeguards.h"
 

	
 
/* Default of 4MB spritecache */
 
uint _sprite_cache_size = 4;
 

	
 
struct SpriteCache {
 
	void *ptr;
 
	size_t file_pos;
 
	SpriteFile *file;    ///< The file the sprite in this entry can be found in.
 
	uint32_t id;
 
	int16_t lru;
 
	SpriteType type;     ///< In some cases a single sprite is misused by two NewGRFs. Once as real sprite and once as recolour sprite. If the recolour sprite gets into the cache it might be drawn as real sprite which causes enormous trouble.
 
	bool warned;         ///< True iff the user has been warned about incorrect use of this sprite
 
	byte control_flags;  ///< Control flags, see SpriteCacheCtrlFlags
 
};
 

	
 

	
 
static uint _spritecache_items = 0;
 
static SpriteCache *_spritecache = nullptr;
 
static std::vector<std::unique_ptr<SpriteFile>> _sprite_files;
 

	
 
static inline SpriteCache *GetSpriteCache(uint index)
 
{
 
	return &_spritecache[index];
 
}
 

	
 
static inline bool IsMapgenSpriteID(SpriteID sprite)
 
{
 
	return IsInsideMM(sprite, SPR_MAPGEN_BEGIN, SPR_MAPGEN_END);
 
}
 

	
 
static SpriteCache *AllocateSpriteCache(uint index)
 
SpriteCache *AllocateSpriteCache(uint index)
 
{
 
	if (index >= _spritecache_items) {
 
		/* Add another 1024 items to the 'pool' */
 
		uint items = Align(index + 1, 1024);
 

	
 
		Debug(sprite, 4, "Increasing sprite cache to {} items ({} bytes)", items, items * sizeof(*_spritecache));
src/spritecache_internal.h
Show inline comments
 
new file 100644
 
/*
 
 * 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 <http://www.gnu.org/licenses/>.
 
 */
 

	
 
/** @file spritecache_internal.h Internal functions to cache sprites in memory. */
 

	
 
#ifndef SPRITECACHE_INTERNAL_H
 
#define SPRITECACHE_INTERNAL_H
 

	
 
#include "stdafx.h"
 

	
 
#include "core/math_func.hpp"
 
#include "gfx_type.h"
 
#include "spriteloader/spriteloader.hpp"
 

	
 
#include "table/sprites.h"
 

	
 
/* These declarations are internal to spritecache but need to be exposed for unit-tests. */
 

	
 
struct SpriteCache {
 
	void *ptr;
 
	size_t file_pos;
 
	SpriteFile *file;    ///< The file the sprite in this entry can be found in.
 
	uint32_t id;
 
	int16_t lru;
 
	SpriteType type;     ///< In some cases a single sprite is misused by two NewGRFs. Once as real sprite and once as recolour sprite. If the recolour sprite gets into the cache it might be drawn as real sprite which causes enormous trouble.
 
	bool warned;         ///< True iff the user has been warned about incorrect use of this sprite
 
	byte control_flags;  ///< Control flags, see SpriteCacheCtrlFlags
 
};
 

	
 
static inline bool IsMapgenSpriteID(SpriteID sprite)
 
{
 
	return IsInsideMM(sprite, SPR_MAPGEN_BEGIN, SPR_MAPGEN_END);
 
}
 

	
 
SpriteCache *AllocateSpriteCache(uint index);
 

	
 
#endif /* SPRITECACHE_INTERNAL_H */
0 comments (0 inline, 0 general)