@ -292,7 +292,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
if ( ! sprite_loader . LoadSprite ( & sprite , file_slot , file_pos , sprite_type ) ) {
if ( id = = SPR_IMG_QUERY ) usererror ( " Okay... something went horribly wrong. I couldn't load the fallback sprite. What should I do? " ) ;
return ( void * ) GetRawSprite ( SPR_IMG_QUERY , ST_NORMAL );
return ( void * ) GetRawSprite ( SPR_IMG_QUERY , ST_NORMAL , allocator );
}
return BlitterFactoryBase : : GetCurrentBlitter ( ) - > Encode ( & sprite , allocator ) ;
}
@ -530,7 +530,7 @@ static void *AllocSprite(size_t mem_req)
* @ return fallback sprite
* @ note this function will do usererror ( ) in the case the fallback sprite isn ' t available
*/
static void * HandleInvalidSpriteRequest ( SpriteID sprite , SpriteType requested , SpriteCache * sc )
static void * HandleInvalidSpriteRequest ( SpriteID sprite , SpriteType requested , SpriteCache * sc , AllocatorProc * allocator )
{
static const char * const sprite_types [ ] = {
" normal " , // ST_NORMAL
@ -542,7 +542,7 @@ static void *HandleInvalidSpriteRequest(SpriteID sprite, SpriteType requested, S
SpriteType available = sc - > type ;
if ( requested = = ST_FONT & & available = = ST_NORMAL ) {
if ( sc - > ptr = = NULL ) sc - > type = ST_FONT ;
return GetRawSprite ( sprite , sc - > type );
return GetRawSprite ( sprite , sc - > type , allocator );
}
byte warning_level = sc - > warned ? 6 : 0 ;
@ -554,10 +554,10 @@ static void *HandleInvalidSpriteRequest(SpriteID sprite, SpriteType requested, S
if ( sprite = = SPR_IMG_QUERY ) usererror ( " Uhm, would you be so kind not to load a NewGRF that makes the 'query' sprite a non-normal sprite? " ) ;
/* FALL THROUGH */
case ST_FONT :
return GetRawSprite ( SPR_IMG_QUERY , ST_NORMAL );
return GetRawSprite ( SPR_IMG_QUERY , ST_NORMAL , allocator );
case ST_RECOLOUR :
if ( sprite = = PALETTE_TO_DARK_BLUE ) usererror ( " Uhm, would you be so kind not to load a NewGRF that makes the 'PALETTE_TO_DARK_BLUE' sprite a non-remap sprite? " ) ;
return GetRawSprite ( PALETTE_TO_DARK_BLUE , ST_RECOLOUR );
return GetRawSprite ( PALETTE_TO_DARK_BLUE , ST_RECOLOUR , allocator );
case ST_MAPGEN :
/* this shouldn't happen, overriding of ST_MAPGEN sprites is checked in LoadNextSprite()
* ( the only case the check fails is when these sprites weren ' t even loaded . . . ) */
@ -566,7 +566,15 @@ static void *HandleInvalidSpriteRequest(SpriteID sprite, SpriteType requested, S
}
}
void * GetRawSprite ( SpriteID sprite , SpriteType type )
/**
* Reads a sprite ( from disk or sprite cache ) .
* If the sprite is not available or of wrong type , a fallback sprite is returned .
* @ param sprite Sprite to read .
* @ param type Expected sprite type .
* @ param allocator Allocator function to use . Set to NULL to use the usual sprite cache .
* @ return Sprite raw data
*/
void * GetRawSprite ( SpriteID sprite , SpriteType type , AllocatorProc * allocator )
{
assert ( IsMapgenSpriteID ( sprite ) = = ( type = = ST_MAPGEN ) ) ;
assert ( type < ST_INVALID ) ;
@ -580,15 +588,22 @@ void *GetRawSprite(SpriteID sprite, SpriteType type)
SpriteCache * sc = GetSpriteCache ( sprite ) ;
if ( sc - > type ! = type ) return HandleInvalidSpriteRequest ( sprite , type , sc ) ;
if ( sc - > type ! = type ) return HandleInvalidSpriteRequest ( sprite , type , sc , allocator ) ;
if ( allocator = = NULL ) {
/* Load sprite into/from spritecache */
/* Update LRU */
sc - > lru = + + _sprite_lru_counter ;
/* Update LRU */
sc - > lru = + + _sprite_lru_counter ;
/* Load the sprite, if it is not loaded, yet */
if ( sc - > ptr = = NULL ) sc - > ptr = ReadSprite ( sc , sprite , type , AllocSprite ) ;
/* Load the sprite, if it is not loaded, yet */
if ( sc - > ptr = = NULL ) sc - > ptr = ReadSprite ( sc , sprite , type , AllocSprite ) ;
return sc - > ptr ;
return sc - > ptr ;
} else {
/* Do not use the spritecache, but a different allocator. */
return ReadSprite ( sc , sprite , type , allocator ) ;
}
}