spritecache.c
branch0.5
changeset 5513 0d3227e250eb
parent 5509 0b111f4e6dc9
equal deleted inserted replaced
5512:52869fa67090 5513:0d3227e250eb
    82 	return _sprite_file_pos[id] != 0 || id == 0;
    82 	return _sprite_file_pos[id] != 0 || id == 0;
    83 }
    83 }
    84 
    84 
    85 static void* AllocSprite(size_t);
    85 static void* AllocSprite(size_t);
    86 
    86 
    87 static void* ReadSprite(SpriteID id)
    87 static void* ReadSprite(SpriteID id, bool real_sprite)
    88 {
    88 {
    89 	uint num;
    89 	uint num;
    90 	byte type;
    90 	byte type;
    91 	uint32 filepos = _sprite_file_pos[id];
    91 	uint32 filepos = _sprite_file_pos[id];
    92 
    92 
   102 	FioSeekToFile(filepos);
   102 	FioSeekToFile(filepos);
   103 
   103 
   104 	num  = FioReadWord();
   104 	num  = FioReadWord();
   105 	type = FioReadByte();
   105 	type = FioReadByte();
   106 	if (type == 0xFF) {
   106 	if (type == 0xFF) {
   107 		byte* dest = AllocSprite(num);
   107 		byte* dest;
       
   108 
       
   109 		if (real_sprite) {
       
   110 			static byte warning_level = 0;
       
   111 			DEBUG(misc, warning_level) ("Tried to load non sprite #%d as a real sprite. Probable cause: NewGRF interference", id);
       
   112 			warning_level = 6;
       
   113 			if (id == SPR_IMG_QUERY) error("Uhm, would you be so kind not to load a NewGRF that makes the 'query' sprite a non- sprite?");
       
   114 			return (void*)GetSprite(SPR_IMG_QUERY);
       
   115 		}
       
   116 
       
   117 		dest = AllocSprite(num);
   108 
   118 
   109 		_sprite_ptr[id] = dest;
   119 		_sprite_ptr[id] = dest;
   110 		FioReadBlock(dest, num);
   120 		FioReadBlock(dest, num);
   111 
   121 
   112 		return dest;
   122 		return dest;
   113 	} else {
   123 	} else {
   114 		uint height = FioReadByte();
   124 		uint height = FioReadByte();
   115 		uint width  = FioReadWord();
   125 		uint width  = FioReadWord();
   116 		Sprite* sprite;
   126 		Sprite* sprite;
   117 		byte* dest;
   127 		byte* dest;
       
   128 
       
   129 		if (!real_sprite) {
       
   130 			static byte warning_level = 0;
       
   131 			DEBUG(misc, warning_level) ("Tried to load real sprite #%d as a non sprite. Probable cause: NewGRF interference", id);
       
   132 			warning_level = 6;
       
   133 		}
   118 
   134 
   119 		num = (type & 0x02) ? width * height : num - 8;
   135 		num = (type & 0x02) ? width * height : num - 8;
   120 		sprite = AllocSprite(sizeof(*sprite) + num);
   136 		sprite = AllocSprite(sizeof(*sprite) + num);
   121 		_sprite_ptr[id] = sprite;
   137 		_sprite_ptr[id] = sprite;
   122 		sprite->info   = type;
   138 		sprite->info   = type;
   422 	MAP(4120, 4125, _fence_map)
   438 	MAP(4120, 4125, _fence_map)
   423 	return s;
   439 	return s;
   424 }
   440 }
   425 #endif
   441 #endif
   426 
   442 
   427 const void *GetRawSprite(SpriteID sprite)
   443 const void *GetRawSprite(SpriteID sprite, bool real_sprite)
   428 {
   444 {
   429 	void* p;
   445 	void* p;
   430 
   446 
   431 	assert(sprite < MAX_SPRITES);
   447 	assert(sprite < MAX_SPRITES);
   432 
   448 
   442 	_sprite_lru[sprite] = 0;
   458 	_sprite_lru[sprite] = 0;
   443 #endif
   459 #endif
   444 
   460 
   445 	p = _sprite_ptr[sprite];
   461 	p = _sprite_ptr[sprite];
   446 	// Load the sprite, if it is not loaded, yet
   462 	// Load the sprite, if it is not loaded, yet
   447 	if (p == NULL) p = ReadSprite(sprite);
   463 	if (p == NULL) p = ReadSprite(sprite, real_sprite);
   448 	return p;
   464 	return p;
   449 }
   465 }
   450 
   466 
   451 
   467 
   452 void GfxInitSpriteMem(void)
   468 void GfxInitSpriteMem(void)