|
OpenTTD Source
1.10.0-RC1
|
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 |
Functions | |
| static SpriteCache * | GetSpriteCache (uint index) |
| static bool | IsMapgenSpriteID (SpriteID sprite) |
| static SpriteCache * | AllocateSpriteCache (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... | |
| uint32 | GetSpriteLocalID (SpriteID sprite) |
| Get the GRF-local sprite id 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 MemBlock * | NextBlock (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 = nullptr |
| 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... | |
Caching of sprites.
Definition in file spritecache.cpp.
|
static |
Called when holes in the sprite cache should be removed.
That is accomplished by moving the cached data.
Definition at line 675 of file spritecache.cpp.
References DEBUG.
|
static |
Delete a single entry from the sprite cache.
| item | Entry to delete. |
Definition at line 719 of file spritecache.cpp.
| size_t GetGRFSpriteOffset | ( | uint32 | 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 493 of file spritecache.cpp.
References _grf_sprite_offsets.
Referenced by LoadNextSprite().
| 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.
Definition at line 186 of file spritecache.cpp.
Referenced by SpriteAlignerWindow::OnClick(), SpriteAlignerWindow::OnQueryTextFinished(), and UpdateCursorSize().
| uint GetOriginFileSlot | ( | SpriteID | sprite | ) |
Get the (FIOS) file slot of a given sprite.
| sprite | The sprite to look at. |
Definition at line 142 of file spritecache.cpp.
| 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.
| sprite | Sprite to read. |
| type | Expected sprite type. |
| allocator | Allocator function to use. Set to nullptr to use the usual sprite cache. |
Definition at line 850 of file spritecache.cpp.
Count the sprites which originate from a specific file slot in a range of SpriteIDs.
| file_slot | FIOS file slot. |
| begin | First sprite in range. |
| end | First sprite not in range. |
Definition at line 166 of file spritecache.cpp.
| uint32 GetSpriteLocalID | ( | SpriteID | sprite | ) |
Get the GRF-local sprite id of a given sprite.
| sprite | The sprite to look at. |
Definition at line 153 of file spritecache.cpp.
| SpriteType GetSpriteType | ( | SpriteID | sprite | ) |
Get the sprite type of a given sprite.
| sprite | The sprite to look at. |
Definition at line 131 of file spritecache.cpp.
Referenced by SpriteAlignerWindow::OnClick(), and SpriteAlignerWindow::OnQueryTextFinished().
|
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.
| sprite | ID of loaded sprite |
| requested | requested sprite type |
| sc | the currently known sprite cache for the requested sprite |
Definition at line 806 of file spritecache.cpp.
| bool LoadNextSprite | ( | int | load_index, |
| byte | file_slot, | ||
| uint | file_sprite_id, | ||
| byte | container_version | ||
| ) |
Load a real or recolour sprite.
| load_index | Global sprite index. |
| file_slot | GRF to load from. |
| file_sprite_id | Sprite number in the GRF. |
| container_version | Container version of the GRF. |
Definition at line 535 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().
| void ReadGRFSpriteOffsets | ( | byte | container_version | ) |
Parse the sprite section of GRFs.
| container_version | Container version of the GRF we're currently processing. |
Definition at line 502 of file spritecache.cpp.
References _grf_sprite_offsets, FioGetPos(), FioReadDword(), FioSeekTo(), and FioSkipBytes().
Referenced by LoadGrfFile(), and LoadGrfFileIndexed().
|
static |
Load a recolour sprite into memory.
| file_slot | GRF we're reading from. |
| num | Size of the sprite in the GRF. |
Definition at line 374 of file spritecache.cpp.
Referenced by LoadNextSprite().
|
static |
Read a sprite from disk.
| sc | Location of sprite. |
| id | Sprite number. |
| sprite_type | Type of sprite. |
| allocator | Allocator function to use. |
Definition at line 409 of file spritecache.cpp.
| bool SkipSpriteData | ( | byte | type, |
| uint16 | 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 94 of file spritecache.cpp.
References FioReadByte(), and FioSkipBytes().
Referenced by LoadNextSprite().
|
static |
Map from sprite numbers to position in the GRF file.
Definition at line 486 of file spritecache.cpp.
Referenced by GetGRFSpriteOffset(), and ReadGRFSpriteOffsets().
|
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 618 of file spritecache.cpp.