Advertisement
Guest User

Untitled

a guest
Mar 8th, 2016
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.89 KB | None | 0 0
  1.         public static Bitmap UnswizzleWithPalette(GMIO imageInfo, byte[] data, Dictionary<int, RGBA> palette)
  2.         {
  3.             //Inizializzo un buffer per l'intera lunghezza dei dati
  4.             byte[] buffer = new byte[data.Length];
  5.  
  6.             int w = (imageInfo.TextureWidth * imageInfo.BitPerPixel) / 8;
  7.  
  8.             //Lunghezza del tile
  9.             int lineSize = 16;
  10.             //Grandezza del tile ( 16 colonne, 8 righe se ricordo bene )
  11.             int tileSize = lineSize * 8;
  12.  
  13.             //Numero di blocchi da 8 di righe?
  14.             int rowBlocks = w / lineSize;
  15.  
  16.             //Same as Upper
  17.             int totalBlocksX = w / lineSize;
  18.             //Numero di blocchi che formano l'altezza? Non saprei come definirlo in termine tecnico...
  19.             int totalBlocksY = imageInfo.TextureHeight / 8;
  20.  
  21.             for (int blockY = 0; blockY < totalBlocksY; blockY++)
  22.             {
  23.                 for (int blockX = 0; blockX < totalBlocksX; blockX++)
  24.                 {
  25.                     //Dove inizia il blocco corrente
  26.                     int block_index = blockX + blockY * rowBlocks;
  27.                     //Indirizzo al blocco corrente
  28.                     int block_address = (block_index * tileSize) % imageInfo.Palette.PointerPalette;
  29.  
  30.                     for (int y = 0; y < 8; y++)
  31.                         for (int x = 0; x < lineSize; x++)
  32.                         {
  33.                             //Pixel corrente X sulla riga
  34.                             int absolutex = x + blockX * lineSize;
  35.                             //Pixel Corrente Y sulla colonna?
  36.                             int absolutey = y + blockY * 8;
  37.  
  38.                             //Il punto corretto in cui dev'essere posizionato il pixel, moltiplicato per non so cosa
  39.                             buffer[absolutex + absolutey * w] =
  40.                                 data[block_address + x + y * lineSize];
  41.                             //Il pixel si trova all'indirizzo di questo blocco, più x ed y, che si spostano a seconda della lunghezza della riga                              
  42.                         }
  43.                 }
  44.             }
  45.  
  46.             //Dati "extra" vicino alla fine dello stream?
  47.             int start = totalBlocksY*rowBlocks*lineSize*8;
  48.             for (int i = start; i < data.Length; i++)
  49.                 buffer[i] = data[i];
  50.  
  51.             //Risetto i pixel nel giusto ordine
  52.             Bitmap bmp = new Bitmap(imageInfo.TextureWidth, imageInfo.TextureHeight);
  53.             int cont = 0;
  54.             for (int i = 0; i < imageInfo.TextureHeight; i++)
  55.             {
  56.                 for (int j = 0; j < imageInfo.TextureWidth; j++)
  57.                 {
  58.                     if (imageInfo.BitPerPixel == 8)
  59.                     {
  60.                         var colorPixel = palette[buffer[cont]];
  61.                         bmp.SetPixel(j, i, Color.FromArgb(colorPixel.A, colorPixel.R, colorPixel.G, colorPixel.B));
  62.                     }
  63.                     else if (imageInfo.BitPerPixel == 4)
  64.                     {
  65.                         //4 Bit Per Pixel Codec: se i byte sono letti come Little Endian, bisogna leggere i primi 4 bit e gli ultimi 4 bit del
  66.                         //singolo byte per poter ricavare i due pixel vicini che ricostruiscono correttamente l'immagine.
  67.                         //Info: nibble
  68.                         var firstPixel = buffer[cont] & 0x0F;
  69.                         var secondPixel = buffer[cont] >> 4;
  70.  
  71.                         var colorPixel = palette[firstPixel];
  72.                         bmp.SetPixel(j, i, Color.FromArgb(255, colorPixel.R, colorPixel.G, colorPixel.B));
  73.  
  74.                         colorPixel = palette[secondPixel];
  75.                         bmp.SetPixel(++j, i, Color.FromArgb(255, colorPixel.R, colorPixel.G, colorPixel.B));
  76.                     }
  77.  
  78.                     cont++;
  79.                 }
  80.             }
  81.  
  82.             return bmp;
  83.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement