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;
51 ret = calloc(1, sizeof(tImage) + w * h * sampleSize);
59 ret->Format = IMGFMT_ARGB;
63 ret->Format = IMGFMT_RGB;
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;
94 if( fileOfs + len*sampleSize > Size ) {
95 memcpy(ret->Data + ofs*sampleSize, Buffer+fileOfs, Size-fileOfs);
99 memcpy(ret->Data + ofs*sampleSize, Buffer+fileOfs, len*sampleSize);
104 uint8_t tmp[sampleSize];
106 if( fileOfs + sampleSize > Size ) return ret;
108 for(i=0;i<sampleSize;i++)
109 tmp[i] = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
113 for(i=0;i<sampleSize;i++)
114 ret->Data[ofs++] = tmp[i];
122 // Alpha, Red, Green, Blue
123 for( i = 0; i < sampleSize; i++ )
126 while( ofs < w*h*sampleSize )
129 if( fileOfs + 1 > Size ) return ret;
130 len = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
134 if( fileOfs + 1 > Size ) return ret;
135 val = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
137 ret->Data[ofs] = val;
139 ret->Data[ofs] |= val;
144 if( fileOfs + 1 > Size ) return ret;
145 val = *(uint8_t*)Buffer+fileOfs; fileOfs += 1;
148 ret->Data[ofs] = val; ofs += sampleSize;
153 ret->Data[ofs] |= val; ofs += sampleSize;
162 fprintf(stderr, "Warning: Unknown compression scheme %i for SIF\n", comp);