Usermode/ld-acess - Fix constness in FD_ISSET
[tpg/acess2.git] / Usermode / Libraries / libimage_sif.so_src / main.c
index 014a316..176db8d 100644 (file)
@@ -6,7 +6,13 @@
 #include <string.h>
 #include <image.h>
 //#include <image_sif.h>
-#include <acess/sys.h> // _SysDebug
+#include <acess/sys.h> // DEBUGS
+
+#if ENABLE_DEBUG
+# define DEBUGS(v...)  _SysDebug(v)
+#else
+#define        DEBUGS(...)     do{}while(0)
+#endif
 
 // === STRUCTURES ===
 struct sHeader
@@ -25,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)
@@ -38,7 +67,7 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size)
         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
@@ -46,11 +75,11 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size)
        else if(hdr->Magic == 0xF051)   // Big Endian
                bRevOrder = 1;
        else {
-               _SysDebug(" Image_SIF_Parse: Magic invalid (0x%x)", hdr->Magic);
+               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;
@@ -60,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)
@@ -77,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);
        
@@ -92,14 +121,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,7 +166,9 @@ tImage *Image_SIF_Parse(void *Buffer, size_t Size)
                                fileOfs += sampleSize;
                        }
                }
-               _SysDebug("Image_SIF_Parse: Complete at %i bytes", fileOfs);
+               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
@@ -150,33 +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;
                                        }
                                }
                        }

UCC git Repository :: git.ucc.asn.au