#include <string.h>
#include <image.h>
//#include <image_sif.h>
-#include <acess/sys.h> // _SysDebug
+#include <acess/sys.h> // DEBUGS
+
+#if ENABLE_DEBUG
+# define DEBUGS(v...) _SysDebug(v)
+#else
+#define DEBUGS(...) do{}while(0)
+#endif
// === STRUCTURES ===
struct sHeader
return 0;
}
+static uint32_t flipendian32(uint32_t val)
+{
+ return ((val >> 24) & 0xFF) << 0
+ | ((val >> 16) & 0xFF) << 8
+ | ((val >> 8) & 0xFF) << 16
+ | ((val >> 0) & 0xFF) << 24;
+}
+
+static void flip_buffer_endian(void *Data, size_t SampleSize, size_t Pixels)
+{
+ if( SampleSize == 3 )
+ return ;
+
+ if( SampleSize == 4 )
+ {
+ uint32_t *data32 = Data;
+ while( Pixels -- ) {
+ *data32 = flipendian32(*data32);
+ data32 ++;
+ }
+ }
+}
+
/**
*/
tImage *Image_SIF_Parse(void *Buffer, size_t Size)
int sampleSize;
struct sHeader *hdr = Buffer;
- _SysDebug("Image_SIF_Parse: (Buffer=%p, Size=0x%x)", Buffer, Size);
+ DEBUGS("Image_SIF_Parse: (Buffer=%p, Size=0x%x)", Buffer, Size);
// Get magic word and determine byte ordering
if(hdr->Magic == 0x51F0) // Little Endian
else if(hdr->Magic == 0xF051) // Big Endian
bRevOrder = 1;
else {
- _SysDebug(" Image_SIF_Parse: Magic invalid (0x%x)", hdr->Magic);
+ DEBUGS(" Image_SIF_Parse: Magic invalid (0x%x)", hdr->Magic);
return NULL;
}
- _SysDebug(" Image_SIF_Parse: bRevOrder = %i", bRevOrder);
+ DEBUGS(" Image_SIF_Parse: bRevOrder = %i", bRevOrder);
// Read flags
comp = hdr->Flags & 7;
w = hdr->Width;
h = hdr->Height;
- _SysDebug(" Image_SIF_Parse: Dimensions %ix%i", w, h);
+ DEBUGS(" Image_SIF_Parse: Dimensions %ix%i", w, h);
// Get image format
switch(fmt)
return NULL;
}
- _SysDebug(" Image_SIF_Parse: sampleSize = %i, fmt = %i", sampleSize, fmt);
+ DEBUGS(" Image_SIF_Parse: sampleSize = %i, fmt = %i", sampleSize, fmt);
fileOfs = sizeof(struct sHeader);
switch(comp)
{
// Uncompressed 32-bpp data
- case 0:
- if( fileOfs + w*h*sampleSize > Size ) {
- memcpy(ret->Data, Buffer+fileOfs, Size-fileOfs);
- }
- else {
- memcpy(ret->Data, Buffer+fileOfs, w*h*sampleSize);
- }
+ case 0: {
+ size_t idatsize = w*h*sampleSize;
+ if( idatsize > Size - fileOfs )
+ idatsize = Size - fileOfs;
+ memcpy(ret->Data, Buffer+fileOfs, idatsize);
+ if(bRevOrder)
+ flip_buffer_endian(ret->Data, sampleSize, w*h);
return ret;
+ }
// 1.7.n*8 RLE
// (1 Flag, 7-bit size, 32-bit value)
fileOfs += sampleSize;
}
}
- _SysDebug("Image_SIF_Parse: Complete at %i bytes", fileOfs);
+ if(bRevOrder)
+ flip_buffer_endian(ret->Data, sampleSize, w*h);
+ DEBUGS("Image_SIF_Parse: Complete at %i bytes", fileOfs);
return ret;
// Channel 1.7.8 RLE
{
uint8_t len, val;
if( fileOfs + 1 > Size ) return ret;
- len = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
+ len = ((uint8_t*)Buffer)[fileOfs++];
if(len & 0x80) {
len &= 0x7F;
while(len--) {
if( fileOfs + 1 > Size ) return ret;
- val = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
- if(i == 0)
- ret->Data[ofs] = val;
- else
- ret->Data[ofs] |= val;
+ val = ((uint8_t*)Buffer)[fileOfs++];
+ ret->Data[ofs] = val;
ofs += sampleSize;
}
}
else {
if( fileOfs + 1 > Size ) return ret;
- val = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
- if(i == 0) {
- while(len--) {
- ret->Data[ofs] = val;
- ofs += sampleSize;
- }
- }
- else {
- while(len--) {
- ret->Data[ofs] |= val;
- ofs += sampleSize;
- }
+ val = ((uint8_t*)Buffer)[fileOfs++];
+ while(len--) {
+ ret->Data[ofs] = val;
+ ofs += sampleSize;
}
}
}