OpenTTD Source 20250704-master-gf23845805a
|
Caching of sprites. More...
#include "stdafx.h"
#include "spriteloader/grf.hpp"
#include "spriteloader/makeindexed.h"
#include "error_func.h"
#include "strings_func.h"
#include "zoom_func.h"
#include "settings_type.h"
#include "blitter/factory.hpp"
#include "core/math_func.hpp"
#include "video/video_driver.hpp"
#include "spritecache.h"
#include "spritecache_internal.h"
#include "table/sprites.h"
#include "table/palette_convert.h"
#include "safeguards.h"
Go to the source code of this file.
Data Structures | |
struct | GrfSpriteOffset |
Functions | |
static SpriteCache * | GetSpriteCache (uint index) |
SpriteCache * | AllocateSpriteCache (uint index) |
static SpriteFile * | GetCachedSpriteFileByName (const std::string &filename) |
Get the cached SpriteFile given the name of the file. | |
std::span< const std::unique_ptr< SpriteFile > > | GetCachedSpriteFiles () |
Get the list of cached SpriteFiles. | |
SpriteFile & | OpenCachedSpriteFile (const std::string &filename, Subdirectory subdir, bool palette_remap) |
Open/get the SpriteFile that is cached for use in the sprite cache. | |
bool | SkipSpriteData (SpriteFile &file, uint8_t type, uint16_t num) |
Skip the given amount of sprite graphics data. | |
bool | SpriteExists (SpriteID id) |
SpriteType | GetSpriteType (SpriteID sprite) |
Get the sprite type of a given sprite. | |
SpriteFile * | GetOriginFile (SpriteID sprite) |
Get the SpriteFile of a given sprite. | |
uint32_t | GetSpriteLocalID (SpriteID sprite) |
Get the GRF-local sprite id of a given sprite. | |
uint | GetSpriteCountForFile (const std::string &filename, SpriteID begin, SpriteID end) |
Count the sprites which originate from a specific file in a range of SpriteIDs. | |
SpriteID | GetMaxSpriteID () |
Get a reasonable (upper bound) estimate of the maximum SpriteID used in OpenTTD; there will be no sprites with a higher SpriteID, although there might be up to roughly a thousand unused SpriteIDs below this number. | |
static bool | ResizeSpriteIn (SpriteLoader::SpriteCollection &sprite, ZoomLevel src, ZoomLevel tgt) |
static void | ResizeSpriteOut (SpriteLoader::SpriteCollection &sprite, ZoomLevel zoom) |
static bool | PadSingleSprite (SpriteLoader::Sprite *sprite, ZoomLevel zoom, uint pad_left, uint pad_top, uint pad_right, uint pad_bottom) |
static bool | PadSprites (SpriteLoader::SpriteCollection &sprite, ZoomLevels sprite_avail, SpriteEncoder *encoder) |
static bool | ResizeSprites (SpriteLoader::SpriteCollection &sprite, ZoomLevels sprite_avail, SpriteEncoder *encoder) |
static void * | ReadRecolourSprite (SpriteFile &file, size_t file_pos, uint num, SpriteAllocator &allocator) |
Load a recolour sprite into memory. | |
static void * | ReadSprite (const SpriteCache *sc, SpriteID id, SpriteType sprite_type, SpriteAllocator &allocator, SpriteEncoder *encoder) |
Read a sprite from disk. | |
size_t | GetGRFSpriteOffset (uint32_t id) |
Get the file offset for a specific sprite in the sprite section of a GRF. | |
void | ReadGRFSpriteOffsets (SpriteFile &file) |
Parse the sprite section of GRFs. | |
bool | LoadNextSprite (SpriteID load_index, SpriteFile &file, uint file_sprite_id) |
Load a real or recolour sprite. | |
void | DupSprite (SpriteID old_spr, SpriteID new_spr) |
static void | DeleteEntriesFromSpriteCache (size_t to_remove) |
Delete entries from the sprite cache to remove the requested number of bytes. | |
void | IncreaseSpriteLRU () |
static void * | HandleInvalidSpriteRequest (SpriteID sprite, SpriteType requested, SpriteCache *sc, SpriteAllocator *allocator) |
Handles the case when a sprite of different type is requested than is present in the SpriteCache. | |
void * | GetRawSprite (SpriteID sprite, SpriteType type, SpriteAllocator *allocator, SpriteEncoder *encoder) |
Reads a sprite (from disk or sprite cache). | |
void | GfxInitSpriteMem () |
void | GfxClearSpriteCache () |
Remove all encoded sprites from the sprite cache without discarding sprite location information. | |
void | GfxClearFontSpriteCache () |
Remove all encoded font sprites from the sprite cache without discarding sprite location information. | |
Variables | |
uint | _sprite_cache_size = 4 |
static std::vector< SpriteCache > | _spritecache |
static size_t | _spritecache_bytes_used = 0 |
static uint32_t | _sprite_lru_counter |
static std::vector< std::unique_ptr< SpriteFile > > | _sprite_files |
static std::map< uint32_t, GrfSpriteOffset > | _grf_sprite_offsets |
Map from sprite numbers to position in the GRF file. | |
Caching of sprites.
Definition in file spritecache.cpp.
SpriteCache * AllocateSpriteCache | ( | uint | index | ) |
Definition at line 42 of file spritecache.cpp.
|
static |
Delete entries from the sprite cache to remove the requested number of bytes.
Sprite data is removed in order of LRU values. The total number of bytes removed may be larger than the number requested.
to_remove | Requested number of bytes to remove. |
Definition at line 710 of file spritecache.cpp.
References Debug, and SpriteCache::length.
Definition at line 690 of file spritecache.cpp.
|
static |
Get the cached SpriteFile given the name of the file.
filename | The name of the file at the disk. |
null
. Definition at line 61 of file spritecache.cpp.
Referenced by GetSpriteCountForFile(), and OpenCachedSpriteFile().
std::span< const std::unique_ptr< SpriteFile > > GetCachedSpriteFiles | ( | ) |
Get the list of cached SpriteFiles.
Definition at line 75 of file spritecache.cpp.
Referenced by SpriteAlignerWindow::UpdateWidgetSize().
size_t GetGRFSpriteOffset | ( | uint32_t | id | ) |
Get the file offset for a specific sprite in the sprite section of a GRF.
id | ID of the sprite to look up. |
Definition at line 555 of file spritecache.cpp.
References _grf_sprite_offsets.
SpriteID GetMaxSpriteID | ( | ) |
Get a reasonable (upper bound) estimate of the maximum SpriteID used in OpenTTD; there will be no sprites with a higher SpriteID, although there might be up to roughly a thousand unused SpriteIDs below this number.
Definition at line 202 of file spritecache.cpp.
Referenced by SpriteAlignerWindow::OnClick(), SpriteAlignerWindow::OnQueryTextFinished(), and UpdateCursorSize().
SpriteFile * GetOriginFile | ( | SpriteID | sprite | ) |
Get the SpriteFile of a given sprite.
sprite | The sprite to look at. |
Definition at line 152 of file spritecache.cpp.
References SpriteCache::file.
Referenced by SpriteAlignerWindow::DrawWidget(), and SpriteAlignerWindow::GetWidgetString().
void * GetRawSprite | ( | SpriteID | sprite, |
SpriteType | type, | ||
SpriteAllocator * | allocator, | ||
SpriteEncoder * | encoder | ||
) |
Reads a sprite (from disk or sprite cache).
If the sprite is not available or of wrong type, a fallback sprite is returned.
sprite | Sprite to read. |
type | Expected sprite type. |
allocator | Allocator function to use. Set to nullptr to use the usual sprite cache. |
encoder | Sprite encoder to use. Set to nullptr to use the currently active blitter. |
Definition at line 859 of file spritecache.cpp.
References Debug, SpriteCache::file, HandleInvalidSpriteRequest(), Invalid, SpriteCache::length, MapGen, ReadRecolourSprite(), ReadSprite(), Recolour, and SpriteCache::type.
Referenced by HandleInvalidSpriteRequest(), and ReadSprite().
|
inlinestatic |
Definition at line 37 of file spritecache.cpp.
Count the sprites which originate from a specific file in a range of SpriteIDs.
file | The loaded SpriteFile. |
begin | First sprite in range. |
end | First sprite not in range. |
Definition at line 176 of file spritecache.cpp.
References Debug, SpriteCache::file, and GetCachedSpriteFileByName().
Referenced by LoadSpriteTables().
uint32_t GetSpriteLocalID | ( | SpriteID | sprite | ) |
Get the GRF-local sprite id of a given sprite.
sprite | The sprite to look at. |
Definition at line 163 of file spritecache.cpp.
Referenced by SpriteAlignerWindow::DrawWidget(), NewGRFProfiler::EndResolve(), and SpriteAlignerWindow::GetWidgetString().
SpriteType GetSpriteType | ( | SpriteID | sprite | ) |
Get the sprite type of a given sprite.
sprite | The sprite to look at. |
Definition at line 141 of file spritecache.cpp.
References Invalid, and SpriteCache::type.
Referenced by SpriteAlignerWindow::OnClick(), and SpriteAlignerWindow::OnQueryTextFinished().
void GfxClearFontSpriteCache | ( | ) |
Remove all encoded font sprites from the sprite cache without discarding sprite location information.
Definition at line 929 of file spritecache.cpp.
References Font.
Referenced by AdjustGUIZoom().
void GfxClearSpriteCache | ( | ) |
Remove all encoded sprites from the sprite cache without discarding sprite location information.
Definition at line 915 of file spritecache.cpp.
References VideoDriver::ClearSystemSprites(), and VideoDriver::GetInstance().
Referenced by CheckBlitter().
void GfxInitSpriteMem | ( | ) |
Definition at line 901 of file spritecache.cpp.
|
static |
Handles the case when a sprite of different type is requested than is present in the SpriteCache.
For SpriteType::Font sprites, it is normal. In other cases, default sprite is loaded instead.
sprite | ID of loaded sprite |
requested | requested sprite type |
sc | the currently known sprite cache for the requested sprite |
Definition at line 814 of file spritecache.cpp.
References Debug, Font, GetRawSprite(), MapGen, Normal, Recolour, SpriteCache::type, and SpriteCache::warned.
Referenced by GetRawSprite().
void IncreaseSpriteLRU | ( | ) |
Definition at line 768 of file spritecache.cpp.
bool LoadNextSprite | ( | SpriteID | load_index, |
SpriteFile & | file, | ||
uint | file_sprite_id | ||
) |
Load a real or recolour sprite.
load_index | Global sprite index. |
file | GRF to load from. |
file_sprite_id | Sprite number in the GRF. |
container_version | Container version of the GRF. |
Definition at line 620 of file spritecache.cpp.
References _grf_sprite_offsets, SpriteCache::control_flags, SpriteCache::file, SpriteFile::GetContainerVersion(), RandomAccessFile::GetPos(), Invalid, SpriteCache::length, MapGen, MAX_SPRITES, Normal, RandomAccessFile::ReadByte(), RandomAccessFile::ReadDword(), RandomAccessFile::ReadWord(), Recolour, RandomAccessFile::SkipBytes(), SkipSpriteData(), SpriteCache::type, and SpriteCache::warned.
Referenced by LoadFontGlyph(), LoadGrfFile(), and LoadGrfFileIndexed().
SpriteFile & OpenCachedSpriteFile | ( | const std::string & | filename, |
Subdirectory | subdir, | ||
bool | palette_remap | ||
) |
Open/get the SpriteFile that is cached for use in the sprite cache.
filename | Name of the file at the disk. |
subdir | The sub directory to search this file in. |
palette_remap | Whether a palette remap needs to be performed for this file. |
Definition at line 87 of file spritecache.cpp.
References GetCachedSpriteFileByName(), and SpriteFile::SeekToBegin().
Referenced by LoadGrfFile(), LoadGrfFileIndexed(), and LoadNewGRFFile().
|
static |
Definition at line 272 of file spritecache.cpp.
|
static |
Definition at line 321 of file spritecache.cpp.
void ReadGRFSpriteOffsets | ( | SpriteFile & | file | ) |
Parse the sprite section of GRFs.
container_version | Container version of the GRF we're currently processing. |
Definition at line 564 of file spritecache.cpp.
References _grf_sprite_offsets, SpriteFile::GetContainerVersion(), RandomAccessFile::GetPos(), Palette, RandomAccessFile::ReadByte(), RandomAccessFile::ReadDword(), SCCF_ALLOW_ZOOM_MIN_1X_32BPP, SCCF_ALLOW_ZOOM_MIN_1X_PAL, SCCF_ALLOW_ZOOM_MIN_2X_32BPP, SCCF_ALLOW_ZOOM_MIN_2X_PAL, RandomAccessFile::SeekTo(), SetBit(), and RandomAccessFile::SkipBytes().
Referenced by LoadGrfFile(), LoadGrfFileIndexed(), and LoadNewGRFFileFromFile().
|
static |
Load a recolour sprite into memory.
file | GRF we're reading from. |
file_pos | Position within file. |
num | Size of the sprite in the GRF. |
allocator | Sprite allocator to use. |
Definition at line 423 of file spritecache.cpp.
References _palmap_d2w, SpriteAllocator::Allocate(), SpriteFile::NeedsPaletteRemap(), RandomAccessFile::ReadBlock(), and RandomAccessFile::SeekTo().
Referenced by GetRawSprite().
|
static |
Read a sprite from disk.
sc | Location of sprite. |
id | Sprite number. |
sprite_type | Type of sprite. |
allocator | Allocator function to use. |
encoder | Sprite encoder to use. |
Definition at line 461 of file spritecache.cpp.
References _font_zoom, SpriteAllocator::Allocate(), BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Any(), SpriteCache::control_flags, Sprite::data, Debug, SpriteEncoder::Encode(), SpriteCache::file, Font, SpriteFile::GetContainerVersion(), BlitterFactory::GetCurrentBlitter(), GetRawSprite(), Sprite::height, SpriteEncoder::Is32BppSupported(), SpriteLoaderGrf::LoadSprite(), SpriteLoaderMakeIndexed::LoadSprite(), SpriteLoader::CommonPixel::m, MapGen, Min, BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::None(), Normal, Recolour, SpriteCache::type, Sprite::width, Sprite::x_offs, and Sprite::y_offs.
Referenced by GetRawSprite().
|
static |
Definition at line 207 of file spritecache.cpp.
|
static |
Definition at line 236 of file spritecache.cpp.
|
static |
Definition at line 370 of file spritecache.cpp.
bool SkipSpriteData | ( | SpriteFile & | file, |
uint8_t | type, | ||
uint16_t | num | ||
) |
Skip the given amount of sprite graphics data.
type | the type of sprite (compressed etc) |
num | the amount of sprites to skip |
Definition at line 104 of file spritecache.cpp.
References RandomAccessFile::ReadByte(), and RandomAccessFile::SkipBytes().
Referenced by LoadNewGRFFileFromFile(), and LoadNextSprite().
bool SpriteExists | ( | SpriteID | id | ) |
Definition at line 127 of file spritecache.cpp.
|
static |
Map from sprite numbers to position in the GRF file.
Definition at line 548 of file spritecache.cpp.
Referenced by GetGRFSpriteOffset(), LoadNextSprite(), and ReadGRFSpriteOffsets().
uint _sprite_cache_size = 4 |
Definition at line 29 of file spritecache.cpp.
|
static |
Definition at line 35 of file spritecache.cpp.
|
static |
Definition at line 34 of file spritecache.cpp.
|
static |
Definition at line 32 of file spritecache.cpp.
|
static |
Definition at line 33 of file spritecache.cpp.