X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibimage_sif.so_src%2Fmain.c;h=176db8d7391b7f6273855e13527e3a8f12f443e0;hb=eff15be7c050cd7c614b52b997161558bfbc7ab9;hp=4ce0a2d362d04b31203100844858379c761993f3;hpb=c3a2920bab79e0a41b45c74b883367437ab1dd6d;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 4ce0a2d3..176db8d7 100644 --- a/Usermode/Libraries/libimage_sif.so_src/main.c +++ b/Usermode/Libraries/libimage_sif.so_src/main.c @@ -6,6 +6,13 @@ #include #include //#include +#include // DEBUGS + +#if ENABLE_DEBUG +# define DEBUGS(v...) _SysDebug(v) +#else +#define DEBUGS(...) do{}while(0) +#endif // === STRUCTURES === struct sHeader @@ -24,6 +31,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) @@ -34,10 +64,10 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) int bRevOrder; int fileOfs = 0; int comp, fmt; - int sampleSize = 4; + 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 @@ -45,10 +75,11 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) else if(hdr->Magic == 0xF051) // Big Endian bRevOrder = 1; else { + 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; @@ -58,7 +89,7 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) 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) @@ -75,7 +106,7 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) 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); @@ -84,56 +115,60 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size) ret->Width = w; ret->Height = h; ret->Format = fmt; + for( ofs = 0; ofs < w*h*sampleSize; ofs ++ ) + ret->Data[ofs] = 255; 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) case 1: ofs = 0; - while( ofs < w*h ) + while( ofs < w*h*sampleSize ) { uint8_t len; - if( fileOfs + 1 > Size ) return ret; - len = *(uint8_t*)Buffer+fileOfs; fileOfs += 1; + if( fileOfs + 1 > Size ) + return ret; + len = ((uint8_t*)Buffer)[fileOfs++]; // Verbatim if(len & 0x80) { len &= 0x7F; - if( fileOfs + len*sampleSize > Size ) { - memcpy(ret->Data + ofs*sampleSize, Buffer+fileOfs, Size-fileOfs); - return ret; + while( len -- ) + { + if( fileOfs + sampleSize > Size ) + return ret; + memcpy(ret->Data+ofs, Buffer+fileOfs, sampleSize); + ofs += sampleSize; + fileOfs += sampleSize; } - else { - memcpy(ret->Data + ofs*sampleSize, Buffer+fileOfs, len*sampleSize); - } - ofs += len; } // RLE else { - uint8_t tmp[sampleSize]; - - if( fileOfs + sampleSize > Size ) return ret; - - for(i=0;i Size ) + return ret; - i = 0; - while(len--) { - for(i=0;iData[ofs++] = tmp[i]; + while( len -- ) + { + memcpy(ret->Data+ofs, Buffer+fileOfs, sampleSize); + ofs += sampleSize; } + fileOfs += sampleSize; } } + 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 @@ -147,31 +182,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; } } }