mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-16 00:12:51 +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 "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);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user