mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-08 15:30:00 +00:00
(svn r23881) -Codechange: Move GRF sprite decoding into a separate function.
This commit is contained in:
parent
9d72b47984
commit
5af68295b0
@ -17,6 +17,7 @@
|
||||
#include "table/strings.h"
|
||||
#include "../error.h"
|
||||
#include "../core/math_func.hpp"
|
||||
#include "../core/alloc_type.hpp"
|
||||
#include "grf.hpp"
|
||||
|
||||
extern const byte _palmap_w2d[];
|
||||
@ -41,30 +42,21 @@ static bool WarnCorruptSprite(uint8 file_slot, size_t file_pos, int line)
|
||||
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 */
|
||||
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);
|
||||
AutoFreePtr<byte> dest_orig(MallocT<byte>(num));
|
||||
byte *dest = dest_orig;
|
||||
const int dest_size = num;
|
||||
const int64 dest_size = num;
|
||||
|
||||
/* Read the file, which has some kind of compression */
|
||||
while (num > 0) {
|
||||
@ -145,7 +137,7 @@ bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot,
|
||||
|
||||
if (dest_size > sprite->width * sprite->height) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -183,3 +175,27 @@ bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot,
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user