uint16_t flags;
uint16_t w, h;
int ofs, i;
- tImage_SIF *ret;
+ tImage *ret;
int bRevOrder;
int fileOfs = 0;
int comp, fmt;
w = *(uint16_t*)Buffer+fileOfs; fileOfs += 2;
h = *(uint16_t*)Buffer+fileOfs; fileOfs += 2;
-
- // Allocate space
- ret = calloc(1, sizeof(tImage) + w * h * sampleSize);
- ret->Width = w;
- ret->Height = h;
-
// Get image format
switch(fmt)
{
- case 0: // ARGB
- ret->Format = IMGFMT_ARGB;
+ case 0: // ARGB 32-bit Little Endian
+ fmt = IMGFMT_BGRA;
sampleSize = 4;
break;
- case 1: // RGB
- ret->Format = IMGFMT_RGB;
+ case 1: // RGB 24-bit big endian
+ fmt = IMGFMT_RGB;
sampleSize = 3;
break;
default:
return NULL;
}
+ // Allocate space
+ ret = calloc(1, sizeof(tImage) + w * h * sampleSize);
+ ret->Width = w;
+ ret->Height = h;
+ ret->Format = fmt;
+
switch(comp)
{
// Uncompressed 32-bpp data
uint8_t len;
if( fileOfs + 1 > Size ) return ret;
len = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
+ // Verbatim
if(len & 0x80) {
len &= 0x7F;
if( fileOfs + len*sampleSize > Size ) {
}
ofs += len;
}
+ // RLE
else {
uint8_t tmp[sampleSize];
return ret;
// Channel 1.7.8 RLE
+ // - Each channel is separately 1.7 RLE compressed
case 3:
// Alpha, Red, Green, Blue
for( i = 0; i < sampleSize; i++ )