OpenTTD
Data Structures | Typedefs | Functions | Variables
spritecache.cpp File Reference

Caching of sprites. More...

#include "stdafx.h"
#include "fileio_func.h"
#include "spriteloader/grf.hpp"
#include "gfx_func.h"
#include "error.h"
#include "zoom_func.h"
#include "settings_type.h"
#include "blitter/factory.hpp"
#include "core/math_func.hpp"
#include "core/mem_func.hpp"
#include "table/sprites.h"
#include "table/strings.h"
#include "table/palette_convert.h"
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  SpriteCache
 
struct  MemBlock
 

Typedefs

typedef SimpleTinyEnumT< SpriteType, byte > SpriteTypeByte
 

Functions

static SpriteCacheGetSpriteCache (uint index)
 
static bool IsMapgenSpriteID (SpriteID sprite)
 
static SpriteCacheAllocateSpriteCache (uint index)
 
static void CompactSpriteCache ()
 Called when holes in the sprite cache should be removed. More...
 
static void * AllocSprite (size_t mem_req)
 
bool SkipSpriteData (byte type, uint16 num)
 Skip the given amount of sprite graphics data. More...
 
bool SpriteExists (SpriteID id)
 
SpriteType GetSpriteType (SpriteID sprite)
 Get the sprite type of a given sprite. More...
 
uint GetOriginFileSlot (SpriteID sprite)
 Get the (FIOS) file slot of a given sprite. More...
 
uint GetSpriteCountForSlot (uint file_slot, SpriteID begin, SpriteID end)
 Count the sprites which originate from a specific file slot in a range of SpriteIDs. More...
 
uint 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. More...
 
static bool ResizeSpriteIn (SpriteLoader::Sprite *sprite, ZoomLevel src, ZoomLevel tgt)
 
static void ResizeSpriteOut (SpriteLoader::Sprite *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::Sprite *sprite, uint8 sprite_avail)
 
static bool ResizeSprites (SpriteLoader::Sprite *sprite, uint8 sprite_avail, uint32 file_slot, uint32 file_pos)
 
static void * ReadRecolourSprite (uint16 file_slot, uint num)
 Load a recolour sprite into memory. More...
 
static void * ReadSprite (const SpriteCache *sc, SpriteID id, SpriteType sprite_type, AllocatorProc *allocator)
 Read a sprite from disk. More...
 
size_t GetGRFSpriteOffset (uint32 id)
 Get the file offset for a specific sprite in the sprite section of a GRF. More...
 
void ReadGRFSpriteOffsets (byte container_version)
 Parse the sprite section of GRFs. More...
 
bool LoadNextSprite (int load_index, byte file_slot, uint file_sprite_id, byte container_version)
 Load a real or recolour sprite. More...
 
void DupSprite (SpriteID old_spr, SpriteID new_spr)
 
 assert_compile (sizeof(MemBlock)==sizeof(size_t))
 
 assert_compile ((sizeof(size_t) &(sizeof(size_t) - 1))==0)
 
static MemBlockNextBlock (MemBlock *block)
 
static size_t GetSpriteCacheUsage ()
 
void IncreaseSpriteLRU ()
 
static void DeleteEntryFromSpriteCache (uint item)
 Delete a single entry from the sprite cache. More...
 
static void DeleteEntryFromSpriteCache ()
 
static void * HandleInvalidSpriteRequest (SpriteID sprite, SpriteType requested, SpriteCache *sc, AllocatorProc *allocator)
 Handles the case when a sprite of different type is requested than is present in the SpriteCache. More...
 
void * GetRawSprite (SpriteID sprite, SpriteType type, AllocatorProc *allocator)
 Reads a sprite (from disk or sprite cache). More...
 
static void GfxInitSpriteCache ()
 
void GfxInitSpriteMem ()
 
void GfxClearSpriteCache ()
 Remove all encoded sprites from the sprite cache without discarding sprite location information.
 

Variables

uint _sprite_cache_size = 4
 
static uint _spritecache_items = 0
 
static SpriteCache_spritecache = NULL
 
static uint _sprite_lru_counter
 
static MemBlock_spritecache_ptr
 
static uint _allocated_sprite_cache_size = 0
 
static int _compact_cache_counter
 
static std::map< uint32, size_t > _grf_sprite_offsets
 Map from sprite numbers to position in the GRF file. More...
 
static const size_t S_FREE_MASK = sizeof(size_t) - 1
 S_FREE_MASK is used to mask-out lower bits of MemBlock::size If they are non-zero, the block is free. More...
 

Detailed Description

Caching of sprites.

Definition in file spritecache.cpp.

Function Documentation

◆ CompactSpriteCache()

static void CompactSpriteCache ( )
static

Called when holes in the sprite cache should be removed.

That is accomplished by moving the cached data.

Definition at line 668 of file spritecache.cpp.

References DEBUG.

◆ DeleteEntryFromSpriteCache()

static void DeleteEntryFromSpriteCache ( uint  item)
static

Delete a single entry from the sprite cache.

Parameters
itemEntry to delete.

Definition at line 712 of file spritecache.cpp.

◆ GetGRFSpriteOffset()

size_t GetGRFSpriteOffset ( uint32  id)

Get the file offset for a specific sprite in the sprite section of a GRF.

Parameters
idID of the sprite to look up.
Returns
Position of the sprite in the sprite section or SIZE_MAX if no such sprite is present.

Definition at line 486 of file spritecache.cpp.

References _grf_sprite_offsets.

Referenced by LoadNextSprite().

◆ GetMaxSpriteID()

uint 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.

Note
It's actually the number of spritecache items.
Returns
maximum SpriteID

Definition at line 179 of file spritecache.cpp.

Referenced by SpriteAlignerWindow::OnClick(), SpriteAlignerWindow::OnQueryTextFinished(), and UpdateCursorSize().

◆ GetOriginFileSlot()

uint GetOriginFileSlot ( SpriteID  sprite)

Get the (FIOS) file slot of a given sprite.

Parameters
spriteThe sprite to look at.
Returns
the FIOS file slot

Definition at line 146 of file spritecache.cpp.

◆ GetRawSprite()

void* GetRawSprite ( SpriteID  sprite,
SpriteType  type,
AllocatorProc *  allocator 
)

Reads a sprite (from disk or sprite cache).

If the sprite is not available or of wrong type, a fallback sprite is returned.

Parameters
spriteSprite to read.
typeExpected sprite type.
allocatorAllocator function to use. Set to NULL to use the usual sprite cache.
Returns
Sprite raw data

Definition at line 843 of file spritecache.cpp.

◆ GetSpriteCountForSlot()

uint GetSpriteCountForSlot ( uint  file_slot,
SpriteID  begin,
SpriteID  end 
)

Count the sprites which originate from a specific file slot in a range of SpriteIDs.

Parameters
file_slotFIOS file slot.
beginFirst sprite in range.
endFirst sprite not in range.
Returns
Number of sprites.

Definition at line 159 of file spritecache.cpp.

◆ GetSpriteType()

SpriteType GetSpriteType ( SpriteID  sprite)

Get the sprite type of a given sprite.

Parameters
spriteThe sprite to look at.
Returns
the type of sprite.

Definition at line 135 of file spritecache.cpp.

Referenced by SpriteAlignerWindow::OnClick(), and SpriteAlignerWindow::OnQueryTextFinished().

◆ HandleInvalidSpriteRequest()

static void* HandleInvalidSpriteRequest ( SpriteID  sprite,
SpriteType  requested,
SpriteCache sc,
AllocatorProc *  allocator 
)
static

Handles the case when a sprite of different type is requested than is present in the SpriteCache.

For ST_FONT sprites, it is normal. In other cases, default sprite is loaded instead.

Parameters
spriteID of loaded sprite
requestedrequested sprite type
scthe currently known sprite cache for the requested sprite
Returns
fallback sprite
Note
this function will do usererror() in the case the fallback sprite isn't available

Definition at line 799 of file spritecache.cpp.

◆ LoadNextSprite()

bool LoadNextSprite ( int  load_index,
byte  file_slot,
uint  file_sprite_id,
byte  container_version 
)

Load a real or recolour sprite.

Parameters
load_indexGlobal sprite index.
file_slotGRF to load from.
file_sprite_idSprite number in the GRF.
container_versionContainer version of the GRF.
Returns
True if a valid sprite was loaded, false on any error.

Definition at line 528 of file spritecache.cpp.

References FioGetPos(), FioReadByte(), FioReadDword(), FioReadWord(), FioSkipBytes(), GetGRFSpriteOffset(), MAX_SPRITES, ReadRecolourSprite(), SkipSpriteData(), ST_INVALID, ST_NORMAL, ST_RECOLOUR, SpriteCache::type, and usererror().

Referenced by LoadGrfFile().

◆ ReadGRFSpriteOffsets()

void ReadGRFSpriteOffsets ( byte  container_version)

Parse the sprite section of GRFs.

Parameters
container_versionContainer version of the GRF we're currently processing.

Definition at line 495 of file spritecache.cpp.

References _grf_sprite_offsets, FioGetPos(), FioReadDword(), FioSeekTo(), and FioSkipBytes().

Referenced by LoadGrfFile(), and LoadGrfFileIndexed().

◆ ReadRecolourSprite()

static void* ReadRecolourSprite ( uint16  file_slot,
uint  num 
)
static

Load a recolour sprite into memory.

Parameters
file_slotGRF we're reading from.
numSize of the sprite in the GRF.
Returns
Sprite data.

Definition at line 367 of file spritecache.cpp.

Referenced by LoadNextSprite().

◆ ReadSprite()

static void* ReadSprite ( const SpriteCache sc,
SpriteID  id,
SpriteType  sprite_type,
AllocatorProc *  allocator 
)
static

Read a sprite from disk.

Parameters
scLocation of sprite.
idSprite number.
sprite_typeType of sprite.
allocatorAllocator function to use.
Returns
Read sprite data.

Definition at line 402 of file spritecache.cpp.

◆ SkipSpriteData()

bool SkipSpriteData ( byte  type,
uint16  num 
)

Skip the given amount of sprite graphics data.

Parameters
typethe type of sprite (compressed etc)
numthe amount of sprites to skip
Returns
true if the data could be correctly skipped.

Definition at line 98 of file spritecache.cpp.

References FioReadByte(), and FioSkipBytes().

Referenced by LoadNextSprite().

Variable Documentation

◆ _grf_sprite_offsets

std::map<uint32, size_t> _grf_sprite_offsets
static

Map from sprite numbers to position in the GRF file.

Definition at line 479 of file spritecache.cpp.

Referenced by GetGRFSpriteOffset(), and ReadGRFSpriteOffsets().

◆ S_FREE_MASK

const size_t S_FREE_MASK = sizeof(size_t) - 1
static

S_FREE_MASK is used to mask-out lower bits of MemBlock::size If they are non-zero, the block is free.

S_FREE_MASK has to ensure MemBlock is correctly aligned - it means 8B (S_FREE_MASK == 7) on 64bit systems!

Definition at line 611 of file spritecache.cpp.