8 //#include <image_sif.h>
9 #include <acess/sys.h> // DEBUGS
12 # define DEBUGS(v...) _SysDebug(v)
14 #define DEBUGS(...) do{}while(0)
34 static uint32_t flipendian32(uint32_t val)
36 return ((val >> 24) & 0xFF) << 0
37 | ((val >> 16) & 0xFF) << 8
38 | ((val >> 8) & 0xFF) << 16
39 | ((val >> 0) & 0xFF) << 24;
42 static void flip_buffer_endian(void *Data, size_t SampleSize, size_t Pixels)
49 uint32_t *data32 = Data;
51 *data32 = flipendian32(*data32);
59 tImage *Image_SIF_Parse(void *Buffer, size_t Size)
68 struct sHeader *hdr = Buffer;
70 DEBUGS("Image_SIF_Parse: (Buffer=%p, Size=0x%x)", Buffer, Size);
72 // Get magic word and determine byte ordering
73 if(hdr->Magic == 0x51F0) // Little Endian
75 else if(hdr->Magic == 0xF051) // Big Endian
78 DEBUGS(" Image_SIF_Parse: Magic invalid (0x%x)", hdr->Magic);
82 DEBUGS(" Image_SIF_Parse: bRevOrder = %i", bRevOrder);
85 comp = hdr->Flags & 7;
86 fmt = (hdr->Flags >> 3) & 7;
92 DEBUGS(" Image_SIF_Parse: Dimensions %ix%i", w, h);
97 case 0: // ARGB 32-bit Little Endian
101 case 1: // RGB 24-bit big endian
109 DEBUGS(" Image_SIF_Parse: sampleSize = %i, fmt = %i", sampleSize, fmt);
111 fileOfs = sizeof(struct sHeader);
114 ret = calloc(1, sizeof(tImage) + w * h * sampleSize);
118 for( ofs = 0; ofs < w*h*sampleSize; ofs ++ )
119 ret->Data[ofs] = 255;
123 // Uncompressed 32-bpp data
125 size_t idatsize = w*h*sampleSize;
126 if( idatsize > Size - fileOfs )
127 idatsize = Size - fileOfs;
128 memcpy(ret->Data, Buffer+fileOfs, idatsize);
130 flip_buffer_endian(ret->Data, sampleSize, w*h);
135 // (1 Flag, 7-bit size, 32-bit value)
138 while( ofs < w*h*sampleSize )
141 if( fileOfs + 1 > Size )
143 len = ((uint8_t*)Buffer)[fileOfs++];
149 if( fileOfs + sampleSize > Size )
151 memcpy(ret->Data+ofs, Buffer+fileOfs, sampleSize);
153 fileOfs += sampleSize;
158 if( fileOfs + sampleSize > Size )
163 memcpy(ret->Data+ofs, Buffer+fileOfs, sampleSize);
166 fileOfs += sampleSize;
170 flip_buffer_endian(ret->Data, sampleSize, w*h);
171 DEBUGS("Image_SIF_Parse: Complete at %i bytes", fileOfs);
175 // - Each channel is separately 1.7 RLE compressed
177 // Alpha, Red, Green, Blue
178 for( i = 0; i < sampleSize; i++ )
181 while( ofs < w*h*sampleSize )
184 if( fileOfs + 1 > Size ) return ret;
185 len = ((uint8_t*)Buffer)[fileOfs++];
189 if( fileOfs + 1 > Size ) return ret;
190 val = ((uint8_t*)Buffer)[fileOfs++];
191 ret->Data[ofs] = val;
196 if( fileOfs + 1 > Size ) return ret;
197 val = ((uint8_t*)Buffer)[fileOfs++];
199 ret->Data[ofs] = val;
208 fprintf(stderr, "Warning: Unknown compression scheme %i for SIF\n", comp);