(svn r23881) -Codechange: Move GRF sprite decoding into a separate function.

This commit is contained in:
michi_cc 2012-02-04 13:28:40 +00:00
parent 9d72b47984
commit 5af68295b0

View File

@ -17,6 +17,7 @@
#include "table/strings.h" #include "table/strings.h"
#include "../error.h" #include "../error.h"
#include "../core/math_func.hpp" #include "../core/math_func.hpp"
#include "../core/alloc_type.hpp"
#include "grf.hpp" #include "grf.hpp"
extern const byte _palmap_w2d[]; extern const byte _palmap_w2d[];
@ -41,30 +42,21 @@ static bool WarnCorruptSprite(uint8 file_slot, size_t file_pos, int line)
return false; return false;
} }
bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, size_t file_pos, SpriteType sprite_type) /**
* Decode the image data of a single sprite.
* @param[in,out] sprite Filled with the sprite image data.
* @param file_slot File slot.
* @param file_pos File position.
* @param sprite_type Type of the sprite we're decoding.
* @param num Size of the decompressed sprite.
* @param type Type of the encoded sprite.
* @return True if the sprite was successfully loaded.
*/
bool DecodeSingleSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, size_t file_pos, SpriteType sprite_type, int64 num, byte type)
{ {
/* Open the right file and go to the correct position */ AutoFreePtr<byte> dest_orig(MallocT<byte>(num));
FioSeekToFile(file_slot, file_pos);
/* Read the size and type */
int num = FioReadWord();
byte type = FioReadByte();
/* Type 0xFF indicates either a colourmap or some other non-sprite info; we do not handle them here */
if (type == 0xFF) return false;
sprite->height = FioReadByte();
sprite->width = FioReadWord();
sprite->x_offs = FioReadWord();
sprite->y_offs = FioReadWord();
/* 0x02 indicates it is a compressed sprite, so we can't rely on 'num' to be valid.
* In case it is uncompressed, the size is 'num' - 8 (header-size). */
num = (type & 0x02) ? sprite->width * sprite->height : num - 8;
byte *dest_orig = AllocaM(byte, num);
byte *dest = dest_orig; byte *dest = dest_orig;
const int dest_size = num; const int64 dest_size = num;
/* Read the file, which has some kind of compression */ /* Read the file, which has some kind of compression */
while (num > 0) { while (num > 0) {
@ -145,7 +137,7 @@ bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot,
if (dest_size > sprite->width * sprite->height) { if (dest_size > sprite->width * sprite->height) {
static byte warning_level = 0; static byte warning_level = 0;
DEBUG(sprite, warning_level, "Ignoring %i unused extra bytes from the sprite from %s at position %i", dest_size - sprite->width * sprite->height, FioGetFilename(file_slot), (int)file_pos); DEBUG(sprite, warning_level, "Ignoring " OTTD_PRINTF64 " unused extra bytes from the sprite from %s at position %i", dest_size - sprite->width * sprite->height, FioGetFilename(file_slot), (int)file_pos);
warning_level = 6; warning_level = 6;
} }
@ -183,3 +175,27 @@ bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot,
return true; return true;
} }
bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, size_t file_pos, SpriteType sprite_type)
{
/* Open the right file and go to the correct position */
FioSeekToFile(file_slot, file_pos);
/* Read the size and type */
int num = FioReadWord();
byte type = FioReadByte();
/* Type 0xFF indicates either a colourmap or some other non-sprite info; we do not handle them here */
if (type == 0xFF) return false;
sprite->height = FioReadByte();
sprite->width = FioReadWord();
sprite->x_offs = FioReadWord();
sprite->y_offs = FioReadWord();
/* 0x02 indicates it is a compressed sprite, so we can't rely on 'num' to be valid.
* In case it is uncompressed, the size is 'num' - 8 (header-size). */
num = (type & 0x02) ? sprite->width * sprite->height : num - 8;
return DecodeSingleSprite(sprite, file_slot, file_pos, sprite_type, num, type);
}