X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibimage_sif.so_src%2Fmain.c;h=61136a1c33cc99d3971d59e831b2284264000bc9;hb=2610c32930309a73308f64731a05f2e83487b731;hp=014a316c25a86ba2fb1a39fe4b569c88d3a4c950;hpb=0d7ef9be9848d9599b0fb81fd77bf1bc77264508;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libimage_sif.so_src/main.c b/Usermode/Libraries/libimage_sif.so_src/main.c index 014a316c..61136a1c 100644 --- a/Usermode/Libraries/libimage_sif.so_src/main.c +++ b/Usermode/Libraries/libimage_sif.so_src/main.c @@ -8,6 +8,8 @@ //#include #include // _SysDebug +#define _SysDebug(...) do{}while(0) + // === STRUCTURES === struct sHeader { @@ -25,6 +27,29 @@ int SoMain(void) 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) @@ -92,14 +117,15 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) 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) @@ -136,6 +162,8 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) fileOfs += sampleSize; } } + if(bRevOrder) + flip_buffer_endian(ret->Data, sampleSize, w*h); _SysDebug("Image_SIF_Parse: Complete at %i bytes", fileOfs); return ret; @@ -150,33 +178,22 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) { 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; } } }