8 //#include <image_sif.h>
18 tImage *Image_SIF_Parse(void *Buffer, size_t Size)
30 // Get magic word and determine byte ordering
31 magic = *(uint16_t*)Buffer+fileOfs; fileOfs += 2;
34 else if(magic == 0xF051)
41 flags = *(uint16_t*)Buffer+fileOfs; fileOfs += 2;
43 fmt = (flags >> 3) & 7;
46 w = *(uint16_t*)Buffer+fileOfs; fileOfs += 2;
47 h = *(uint16_t*)Buffer+fileOfs; fileOfs += 2;
52 case 0: // ARGB 32-bit Little Endian
56 case 1: // RGB 24-bit big endian
66 ret = calloc(1, sizeof(tImage) + w * h * sampleSize);
73 // Uncompressed 32-bpp data
75 if( fileOfs + w*h*sampleSize > Size ) {
76 memcpy(ret->Data, Buffer+fileOfs, Size-fileOfs);
79 memcpy(ret->Data, Buffer+fileOfs, w*h*sampleSize);
84 // (1 Flag, 7-bit size, 32-bit value)
90 if( fileOfs + 1 > Size ) return ret;
91 len = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
95 if( fileOfs + len*sampleSize > Size ) {
96 memcpy(ret->Data + ofs*sampleSize, Buffer+fileOfs, Size-fileOfs);
100 memcpy(ret->Data + ofs*sampleSize, Buffer+fileOfs, len*sampleSize);
106 uint8_t tmp[sampleSize];
108 if( fileOfs + sampleSize > Size ) return ret;
110 for(i=0;i<sampleSize;i++)
111 tmp[i] = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
115 for(i=0;i<sampleSize;i++)
116 ret->Data[ofs++] = tmp[i];
123 // - Each channel is separately 1.7 RLE compressed
125 // Alpha, Red, Green, Blue
126 for( i = 0; i < sampleSize; i++ )
129 while( ofs < w*h*sampleSize )
132 if( fileOfs + 1 > Size ) return ret;
133 len = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
137 if( fileOfs + 1 > Size ) return ret;
138 val = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
140 ret->Data[ofs] = val;
142 ret->Data[ofs] |= val;
147 if( fileOfs + 1 > Size ) return ret;
148 val = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
151 ret->Data[ofs] = val; ofs += sampleSize;
156 ret->Data[ofs] |= val; ofs += sampleSize;
165 fprintf(stderr, "Warning: Unknown compression scheme %i for SIF\n", comp);