diff Texture.cpp @ 61:05e4b4bd4d64

Savegame preview thumbnails
author Nomad
date Fri, 26 Oct 2012 03:27:59 +0200
parents 79a30ee1ecdb
children b39bdc150e90
line wrap: on
line diff
--- a/Texture.cpp	Fri Oct 26 02:42:38 2012 +0200
+++ b/Texture.cpp	Fri Oct 26 03:27:59 2012 +0200
@@ -1114,315 +1114,194 @@
 //----- (0040EAD8) --------------------------------------------------------
 unsigned int RGBTexture::LoadFromFILE(FILE *pFile, unsigned int mode, unsigned int bCloseFile)
 {
-  RGBTexture *v4; // esi@1
-  unsigned int result; // eax@2
-  unsigned int v6; // ebx@3
-  unsigned __int16 v7; // cx@5
-  unsigned __int16 v8; // ax@5
-  unsigned int v9; // eax@5
-  char v10; // zf@5
-  signed int v11; // ecx@14
-  int v12; // ebx@19
-  signed int v13; // ecx@19
-  int v14; // ebx@52
-  unsigned __int16 *v15; // edi@52
-  __int16 v16; // ax@54
-  unsigned __int16 *v17; // edi@59
-  __int16 v18; // ax@61
-  unsigned __int16 *v19; // edi@66
-  unsigned __int16 v20; // ax@68
-  int v21; // eax@73
-  char DstBuf[60]; // [sp+Ch] [bp-90h]@3
-  char pColorMap[48]; // [sp+48h] [bp-54h]@3
-  PCXHeader1 pcxh1; // [sp+78h] [bp-24h]@3
-  PCXHeader2 pcxh2; // [sp+88h] [bp-14h]@3
-  int v26; // [sp+90h] [bp-Ch]@51
-  int v27; // [sp+94h] [bp-8h]@54
-  unsigned __int8 v28; // [sp+9Bh] [bp-1h]@54
+  signed int result; // eax@2
+  unsigned char test_byte; // edx@3
+  //unsigned int read_offset; // ebx@37
+  unsigned int row_position; // edi@40
+  unsigned char value; // cl@63
+  char count; // [sp+50h] [bp-Ch]@43
+  unsigned short current_line; // [sp+54h] [bp-8h]@38
+  unsigned short *dec_position; 
+  unsigned short *temp_dec_position; 
+  PCXHeader1 psx_head1;
+  PCXHeader2 psx_head2;
+	short int width, height;
+	BYTE  color_map[48];	// Colormap for 16-color images
 
-  v4 = this;
   if (!pFile)
     return 1;
+  
+ 
+ fread(&psx_head1, 1, 16, pFile);
+ fread(&color_map, 1, 48, pFile);
+ fread(&psx_head2, 1, 6, pFile);
+
+  if (psx_head1.bpp!=8)
+		return 3; 
+ uWidth=(short int )(psx_head1.right-psx_head1.left+1);  // word @ 000014
+ uHeight=(short int )(psx_head1.bottom-psx_head1.up+1);  // word @ 000016
  
 
-    fread(&pcxh1, 1u, 1u, pFile);
-    fread(&pcxh1.version, 1u, 1u, pFile);
-    fread(&pcxh1.encoding, 1u, 1u, pFile);
-    fread(&pcxh1.bpp, 1u, 1u, pFile);
-    v6 = 2;
-    fread(&pcxh1.left, 2u, 1u, pFile);
-    fread(&pcxh1.up, 2u, 1u, pFile);
-    fread(&pcxh1.right, 2u, 1u, pFile);
-    fread(&pcxh1.bottom, 2u, 1u, pFile);
-    fread(&pcxh1.hres, 2u, 1u, pFile);
-    fread(&pcxh1.vres, 2u, 1u, pFile);
-    fread(pColorMap, 0x30u, 1u, pFile);
-    fread(&pcxh2, 1u, 1u, pFile);
-    fread(&pcxh2.planes, 1u, 1u, pFile);
-    fread(&pcxh2.pitch, 2u, 1u, pFile);
-    fread(&pcxh2.palette_info, 2u, 1u, pFile);
-    fread(DstBuf, 58u, 1u, pFile);
-    if ( pcxh1.bpp == 8 )
-    {
-      v7 = pcxh1.right - pcxh1.left + 1;
-      v8 = pcxh1.bottom - pcxh1.up;
-      v4->uWidth = v7;
-      ++v8;
-      v4->uHeight = v8;
-      v9 = (signed __int16)v7 * (signed __int16)v8;
-      v10 = mode == 0;
-      v4->uNumPixels = v9;
-      if ( v10 )
+ uNumPixels=uWidth*uHeight;		  // dword @ 000010
+
+
+      if ( mode == 0 )
       {
-        if ( v4->pPixels )
+        if ( pPixels )
         {
-          pAllocator->FreeChunk(v4->pPixels);
-          v4->pPixels = 0;
+          pAllocator->FreeChunk(pPixels);
+          pPixels = 0;
         }
-        v4->pPixels = (unsigned __int16 *)pAllocator->AllocNamedChunk(
-                                            v4->pPixels,
-                                            2 * v4->uNumPixels + 4,
-                                            v4->pName);
-        v6 = 2;
+        pPixels = (unsigned __int16 *)pAllocator->AllocNamedChunk(
+                                            pPixels,
+                                            2 * uNumPixels + 4,
+                                            pName);
       }
       else
       {
         if ( mode != 1 && mode == 2 )
         {
-          operator new(2 * v9 + 4);
-          v4->pPixels = 0;
-          *(unsigned int *)&v4->field_20 |= 1u;
+          pPixels = (unsigned __int16 *)malloc((uNumPixels + 2) * sizeof(unsigned __int16));
+          field_20 |= 1;
         }
       }
-      if ( v4->pPixels )
+
+
+
+
+      auto pOutPixels = pPixels;
+ 
+ memset(pOutPixels, 0, uNumPixels * sizeof(__int16));
+
+  short i=1;
+  while ( (1<<i) !=uWidth)
+  {
+	  ++i;
+      if (i >= 15)
+	  break;
+  }
+  field_18=i;
+  short i_=1;
+  while ( (1<<i_) !=uHeight)
+  {
+	  ++i_;
+      if (i_ >= 15)
+	  break;
+  }
+  field_1A=i_;
+  switch (field_18)
+	  {
+  case 2:   field_1C = 3;    break;
+  case 3:   field_1C = 7;    break;
+  case 4:   field_1C = 15;   break;
+  case 5:   field_1C = 31;   break;
+  case 6:   field_1C = 63;   break;
+  case 7:   field_1C = 127;  break;
+  case 8:   field_1C = 255;  break;
+  case 9:   field_1C = 511;  break;
+  case 10:  field_1C = 1023; break;
+  case 11:  field_1C = 2047; break;
+  case 12:  field_1C = 4095; break;
+	  }
+
+  switch (field_1A)
+	  {
+  case 2:   field_1E = 3;    break;
+  case 3:   field_1E = 7;    break;
+  case 4:   field_1E = 15;   break;
+  case 5:   field_1E = 31;   break;
+  case 6:   field_1E = 63;   break;
+  case 7:   field_1E = 127;  break;
+  case 8:   field_1E = 255;  break;
+  case 9:   field_1E = 511;  break;
+  case 10:  field_1E = 1023; break;
+  case 11:  field_1E = 2047; break;
+  case 12:  field_1E = 4095; break;
+	  }
+
+
+  fseek(pFile, 128 - 70, SEEK_CUR);
+
+
+  for (uint y = 0; y < uHeight; ++y)
+  {
+    unsigned __int16 *pDst = pPixels + y * uWidth;
+
+    uint x = 0;
+    do
+    {
+      uint ctrl = 0;
+      fread(&ctrl, 1, 1, pFile);
+      if ((ctrl & 0xC0) == 0xC0)
       {
-        v11 = 1;
-        while ( 1 << v11 != v4->uWidth )
-        {
-          ++v11;
-          if ( v11 >= 15 )
-            goto LABEL_19;
-        }
-        v4->field_18 = v11;
-LABEL_19:
-        v12 = v4->uHeight;
-        v13 = 1;
-        while ( 1 << v13 != v12 )
-        {
-          ++v13;
-          if ( v13 >= 15 )
-            goto LABEL_24;
-        }
-        v4->field_1A = v13;
-LABEL_24:
-        switch ( v4->field_18 )
-        {
-          case 2:
-            v4->field_1C = 3;
-            break;
-          case 3:
-            v4->field_1C = 7;
-            break;
-          case 4:
-            v4->field_1C = 15;
-            break;
-          case 5:
-            v4->field_1C = 31;
-            break;
-          case 6:
-            v4->field_1C = 63;
-            break;
-          case 7:
-            v4->field_1C = 127;
-            break;
-          case 8:
-            v4->field_1C = 255;
-            break;
-          case 9:
-            v4->field_1C = 511;
-            break;
-          case 10:
-            v4->field_1C = 1023;
-            break;
-          case 11:
-            v4->field_1C = 2047;
-            break;
-          case 12:
-            v4->field_1C = 4095;
-            break;
-          default:
-            break;
-        }
-        switch ( v4->field_1A )
-        {
-          case 2:
-            v4->field_1E = 3;
-            break;
-          case 3:
-            v4->field_1E = 7;
-            break;
-          case 4:
-            v4->field_1E = 15;
-            break;
-          case 5:
-            v4->field_1E = 31;
-            break;
-          case 6:
-            v4->field_1E = 63;
-            break;
-          case 7:
-            v4->field_1E = 127;
-            break;
-          case 8:
-            v4->field_1E = 255;
-            break;
-          case 9:
-            v4->field_1E = 511;
-            break;
-          case 10:
-            v4->field_1E = 1023;
-            break;
-          case 11:
-            v4->field_1E = 2047;
-            break;
-          case 12:
-            v4->field_1E = 4095;
-            break;
-          default:
-            break;
-        }
-        if ( pcxh2.planes == 1 )
-          Abortf("24bit PCX Only!");
-        if ( pcxh2.planes == 3 )
-        {
-          v26 = 0;
-          if ( v12 > 0 )
-          {
-            do
-            {
-              v14 = 0;
-              v15 = &v4->pPixels[v26 * v4->uWidth];
-              if ( pcxh2.pitch )
-              {
-                do
-                {
-                  fread((char *)&mode + 3, 1u, 1u, pFile);
-                  if ( (BYTE3(mode) & 0xC0) == -64 )
-                  {
-                    BYTE3(mode) &= 0x3Fu;
-                    fread(&v28, 1u, 1u, pFile);
-                    v27 = 0;
-                    v16 = v28;
-                    if ( BYTE3(mode) )
-                    {
-                      do
-                      {
-                        ++v14;
-                        *v15 = LOWORD(pRenderer->uTargetRMask) & (v16 << (pRenderer->uTargetGBits
-                                                                       + pRenderer->uTargetRBits
-                                                                       + pRenderer->uTargetBBits
-                                                                       - 8));
-                        ++v15;
-                        ++v27;
-                      }
-                      while ( v27 < BYTE3(mode) );
-                    }
-                  }
-                  else
-                  {
-                    ++v14;
-                    *v15 = LOWORD(pRenderer->uTargetRMask) & (BYTE3(mode) << (pRenderer->uTargetGBits
-                                                                           + pRenderer->uTargetRBits
-                                                                           + pRenderer->uTargetBBits
-                                                                           - 8));
-                    ++v15;
-                  }
-                }
-                while ( v14 < (unsigned __int16)pcxh2.pitch );
-              }
-              v17 = &v4->pPixels[v26 * v4->uWidth];
-              while ( v14 < 2 * (unsigned __int16)pcxh2.pitch )
-              {
-                fread((char *)&mode + 3, 1u, 1u, pFile);
-                if ( (BYTE3(mode) & 0xC0) == -64 )
-                {
-                  BYTE3(mode) &= 0x3Fu;
-                  fread(&v28, 1u, 1u, pFile);
-                  v27 = 0;
-                  v18 = v28;
-                  if ( BYTE3(mode) )
-                  {
-                    do
-                    {
-                      *v17 |= pRenderer->uTargetGMask & (unsigned __int16)(v18 << (pRenderer->uTargetGBits
-                                                                                + pRenderer->uTargetBBits
-                                                                                - 8));
-                      ++v14;
-                      ++v17;
-                      ++v27;
-                    }
-                    while ( v27 < BYTE3(mode) );
-                  }
-                }
-                else
-                {
-                  *v17 |= pRenderer->uTargetGMask & (unsigned __int16)(BYTE3(mode) << (pRenderer->uTargetGBits
-                                                                                    + pRenderer->uTargetBBits
-                                                                                    - 8));
-                  ++v14;
-                  ++v17;
-                }
-              }
-              v19 = &v4->pPixels[v26 * v4->uWidth];
-              while ( v14 < 3 * (unsigned __int16)pcxh2.pitch )
-              {
-                fread((char *)&mode + 3, 1u, 1u, pFile);
-                if ( (BYTE3(mode) & 0xC0) == -64 )
-                {
-                  BYTE3(mode) &= 0x3Fu;
-                  fread(&v28, 1u, 1u, pFile);
-                  v27 = 0;
-                  v20 = v28;
-                  if ( BYTE3(mode) )
-                  {
-                    do
-                    {
-                      *v19 |= v20 >> (8 - pRenderer->uTargetBBits);
-                      ++v14;
-                      ++v19;
-                      ++v27;
-                    }
-                    while ( v27 < BYTE3(mode) );
-                  }
-                }
-                else
-                {
-                  *v19 |= BYTE3(mode) >> (8 - pRenderer->uTargetBBits);
-                  ++v14;
-                  ++v19;
-                }
-              }
-              v21 = v4->uHeight;
-              ++v26;
-            }
-            while ( v26 < v21 );
-          }
-        }
-        if ( bCloseFile )
-          fclose(pFile);
-        result = 0;
+        uint uNumPixels = ctrl & 0x3F;
+        uint clr = 0;
+        fread(&clr, 1, 1, pFile);
+        for (uint i = 0; i < uNumPixels; ++i)
+          pDst[x++] = pRenderer->uTargetRMask & (clr << (pRenderer->uTargetGBits +
+                                                         pRenderer->uTargetRBits +
+                                                         pRenderer->uTargetBBits - 8));
       }
       else
       {
-        result = v6;
+        pDst[x++] = pRenderer->uTargetRMask & (ctrl << (pRenderer->uTargetGBits +
+                                                        pRenderer->uTargetRBits +
+                                                        pRenderer->uTargetBBits - 8));
       }
-    }
-    else
+    } while (x < psx_head2.pitch);
+
+
+
+
+
+    x = 0;
+    do
     {
-      result = 3;
-    }
+      uint ctrl = 0;
+      fread(&ctrl, 1, 1, pFile);
+      if ((ctrl & 0xC0) == 0xC0)
+      {
+        uint uNumPixels = ctrl & 0x3F;
+        uint clr = 0;
+        fread(&clr, 1, 1, pFile);
+        for (uint i = 0; i < uNumPixels; ++i)
+          pDst[x++] |= pRenderer->uTargetGMask & (clr << (pRenderer->uTargetGBits +
+                                                         pRenderer->uTargetBBits - 8));
+      }
+      else
+      {
+        pDst[x++] |= pRenderer->uTargetGMask & (ctrl << (pRenderer->uTargetGBits +
+                                                        pRenderer->uTargetBBits - 8));
+      }
+    } while (x < psx_head2.pitch);
+ 
+
+
+
 
-  return result;
+    x = 0;
+    do
+    {
+      uint ctrl = 0;
+      fread(&ctrl, 1, 1, pFile);
+      if ((ctrl & 0xC0) == 0xC0)
+      {
+        uint uNumPixels = ctrl & 0x3F;
+        uint clr = 0;
+        fread(&clr, 1, 1, pFile);
+        for (uint i = 0; i < uNumPixels; ++i)
+          pDst[x++] |= pRenderer->uTargetBMask & (clr >> (8 - pRenderer->uTargetBBits));
+      }
+      else
+      {
+        pDst[x++] |= pRenderer->uTargetBMask & (ctrl >> (8 - pRenderer->uTargetRBits));
+      }
+    } while (x < psx_head2.pitch);
+  }
+
+  if (bCloseFile)
+    fclose(pFile);
+  return 0;
 }
 
 //----- (0040E51F) --------------------------------------------------------