Sprite cache: Allow caching only required subset of sprite zoom levels
Enable for blitters based on 32bpp_optimized or SSE
This commit is contained in:
@@ -11,25 +11,30 @@
|
||||
#define SPRITECACHE_H
|
||||
|
||||
#include "gfx_type.h"
|
||||
#include "zoom_type.h"
|
||||
#include "spriteloader/spriteloader.hpp"
|
||||
#include "3rdparty/cpp-btree/btree_map.h"
|
||||
|
||||
/** Data structure describing a sprite. */
|
||||
struct Sprite {
|
||||
uint32 size; ///< Size of the allocation for this sprite structure
|
||||
uint16 height; ///< Height of the sprite.
|
||||
uint16 width; ///< Width of the sprite.
|
||||
int16 x_offs; ///< Number of pixels to shift the sprite to the right.
|
||||
int16 y_offs; ///< Number of pixels to shift the sprite downwards.
|
||||
uint8 missing_zoom_levels; ///< Bitmask of zoom levels missing in data
|
||||
Sprite *next = nullptr; ///< Next sprite structure, this is the only member which may be changed after the sprite has been inserted in the sprite cache
|
||||
byte data[]; ///< Sprite data.
|
||||
};
|
||||
|
||||
/*
|
||||
* Allow skipping sprites with zoom < ZOOM_LVL_OUT_4X, for sprite min zoom setting at 1x, if ZOOM_LVL_OUT_4X bit of present zoom levels is set.
|
||||
* Allow skipping sprites with zoom < ZOOM_LVL_OUT_2X, for sprite min zoom setting at 2x, if either ZOOM_LVL_OUT_4X or ZOOM_LVL_OUT_2X bits of present zoom levels are set.
|
||||
*/
|
||||
enum SpriteCacheCtrlFlags {
|
||||
SCCF_WARNED = 0, ///< True iff the user has been warned about incorrect use of this sprite.
|
||||
SCCF_HAS_NON_PALETTE = 1, ///< True iff there is at least one non-paletter sprite present (such that 32bpp mode can be used).
|
||||
SCCF_ALLOW_ZOOM_MIN_1X_PAL = 2, ///< Allow use of sprite min zoom setting at 1x in palette mode.
|
||||
SCCF_ALLOW_ZOOM_MIN_1X_32BPP = 3, ///< Allow use of sprite min zoom setting at 1x in 32bpp mode.
|
||||
SCCF_ALLOW_ZOOM_MIN_2X_PAL = 4, ///< Allow use of sprite min zoom setting at 2x in palette mode.
|
||||
SCCF_ALLOW_ZOOM_MIN_2X_32BPP = 5, ///< Allow use of sprite min zoom setting at 2x in 32bpp mode.
|
||||
SCC_PAL_ZOOM_START = 0, ///< Start bit of present zoom levels in palette mode.
|
||||
SCC_32BPP_ZOOM_START = 6, ///< Start bit of present zoom levels in 32bpp mode.
|
||||
SCCF_WARNED = 12, ///< True iff the user has been warned about incorrect use of this sprite.
|
||||
};
|
||||
|
||||
extern uint _sprite_cache_size;
|
||||
@@ -37,7 +42,7 @@ extern uint _sprite_cache_size;
|
||||
typedef void *AllocatorProc(size_t size);
|
||||
|
||||
void *SimpleSpriteAlloc(size_t size);
|
||||
void *GetRawSprite(SpriteID sprite, SpriteType type, AllocatorProc *allocator = nullptr, SpriteEncoder *encoder = nullptr);
|
||||
void *GetRawSprite(SpriteID sprite, SpriteType type, uint8 zoom_levels, AllocatorProc *allocator = nullptr, SpriteEncoder *encoder = nullptr);
|
||||
bool SpriteExists(SpriteID sprite);
|
||||
|
||||
SpriteType GetSpriteType(SpriteID sprite);
|
||||
@@ -46,17 +51,16 @@ uint32 GetSpriteLocalID(SpriteID sprite);
|
||||
uint GetSpriteCountForFile(const std::string &filename, SpriteID begin, SpriteID end);
|
||||
uint GetMaxSpriteID();
|
||||
|
||||
|
||||
static inline const Sprite *GetSprite(SpriteID sprite, SpriteType type)
|
||||
static inline const Sprite *GetSprite(SpriteID sprite, SpriteType type, uint8 zoom_levels)
|
||||
{
|
||||
dbg_assert(type != SpriteType::Recolour);
|
||||
return (Sprite*)GetRawSprite(sprite, type);
|
||||
return (Sprite*)GetRawSprite(sprite, type, zoom_levels);
|
||||
}
|
||||
|
||||
static inline const byte *GetNonSprite(SpriteID sprite, SpriteType type)
|
||||
{
|
||||
dbg_assert(type == SpriteType::Recolour);
|
||||
return (byte*)GetRawSprite(sprite, type);
|
||||
return (byte*)GetRawSprite(sprite, type, UINT8_MAX);
|
||||
}
|
||||
|
||||
void GfxInitSpriteMem();
|
||||
@@ -94,9 +98,14 @@ public:
|
||||
this->cache.clear();
|
||||
}
|
||||
|
||||
inline void CacheSprite(SpriteID sprite, SpriteType type)
|
||||
inline void CacheSprite(SpriteID sprite, SpriteType type, ZoomLevel zoom_level)
|
||||
{
|
||||
this->cache[sprite | (static_cast<uint32>(type) << 29)] = GetRawSprite(sprite, type);
|
||||
this->cache[sprite | (static_cast<uint32>(type) << 29)] = GetRawSprite(sprite, type, ZoomMask(zoom_level));
|
||||
}
|
||||
|
||||
inline void CacheRecolourSprite(SpriteID sprite)
|
||||
{
|
||||
this->cache[sprite | (static_cast<uint32>(SpriteType::Recolour) << 29)] = GetRawSprite(sprite, SpriteType::Recolour, 0);
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user