Advertisement
dalvorsn

Untitled

May 11th, 2012
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.31 KB | None | 0 0
  1. SpriteReader = {}
  2.  
  3. sprite_size = 32
  4. sprite_data_size = sprite_size * sprite_size * 4
  5.  
  6.  
  7. --[[
  8.     * Inicia classe com atributo do tipo userdata 'data'
  9.     * Seta atributos default e le data no modo "*a"
  10. --]]
  11. function SpriteReader:load(data)
  12.     attr = {version = 0, numberOfSprites = 0, posByte = 1,file = data, data = data:read("*a"), id = 1}
  13.     return setmetatable(attr, {__index = self})
  14. end
  15.  
  16. --[[
  17.     * Pega os valores minimo e maximos para numero de bytes fornecidos
  18.     * signed é uma variavel boolean, quando true rearranja os limites para tipo signed
  19. --]]
  20. function SpriteReader:getRanges(byte, signed)
  21.     local min, max = 0, 0
  22.     for var = byte, 1, -1 do
  23.         max = max +(2 ^ (8 * var))
  24.     end
  25.     if(signed)then
  26.         min, max = -max/2, max/2
  27.     end
  28.     return min, not signed and (max - 1) or max
  29. end
  30.  
  31. --[[
  32.     * le byte a byte somando seus valores 'byte' numero de vezes
  33.     * se signed é true, reajusta o valor para signed
  34. --]]
  35. function SpriteReader:readBytes(byte, signed)
  36.     local min, _ = self:getRanges(byte, signed)
  37.     local value = self:nextByte()
  38.     for var = 2, byte do
  39.         value = value + (self:nextByte() ^ 2)
  40.     end
  41.     return (value + min)
  42. end
  43.  
  44. --[[
  45.     * le 'posByte', que é um atributo de controle, serve apaenas para armazenar o proximo byte
  46.     * reajusta 'posByte' para posição seguinte
  47.     * retorna 'byte'
  48. --]]
  49. function SpriteReader:nextByte()
  50.     local byte = self.data:byte(self.posByte)
  51.     self.posByte = self.posByte + 1
  52.     return tonumber(byte)
  53. end
  54.  
  55. --[[
  56.     * faz a leitura byte a byte 8 vezes somando seus valores pela progressão:
  57.     * (byte) ^ 1 + (byte) ^ 2 + ... + (byte) ^ n
  58.     * valido para todos unsigneds abaixo
  59. --]]
  60. function SpriteReader:getUint64()
  61.     return self:readBytes(8, false)
  62. end
  63.  
  64. function SpriteReader:getUint32()
  65.     return self:readBytes(4, false)
  66. end
  67.  
  68. function SpriteReader:getUint16()
  69.     return self:readBytes(2, false)
  70. end
  71.  
  72. function SpriteReader:getUint8()
  73.     return self:readBytes(1, false)
  74. end
  75.  
  76. --[[
  77.     * segue a mesma lógica anterior, com uma unica diferença
  78.     * o valor final é reajustado para signed
  79. --]]
  80. function SpriteReader:getInt64()
  81.     return self:readBytes(8, true)
  82. end
  83.  
  84. function SpriteReader:getInt32()
  85.     return self:readBytes(4, true)
  86. end
  87.  
  88. function SpriteReader:getInt16()
  89.     return self:readBytes(2, true)
  90. end
  91.  
  92. function SpriteReader:getInt8()
  93.     return self:readBytes(1, true)
  94. end
  95.  
  96. --[[
  97.     * fecha o atributo file
  98. --]]
  99. function SpriteReader:closeData()
  100.     return self.file:close()
  101. end
  102.  
  103.  
  104. function SpriteReader:getImage(id)
  105.  
  106.     local offset = (((id-1) * 4) + 6)
  107.     self.posByte = offset
  108.     local spriteAddress = self:getUint32()
  109.     self.posByte = spriteAddress
  110.     -- skip
  111.     self:getInt8()
  112.     self:getInt8()
  113.     self:getInt8()
  114.    
  115.     local pixelDataSize = self:getUint16()
  116.     local image = SpriteWriter:new(id)
  117.     image:addMagicNumber()
  118.     image.file:write(0x00)
  119.     image.file:write(0x00)
  120.     image.file:write(0x00)
  121.     image.file:write(0x00)
  122.     image.file:write(spriteAddress)
  123.    
  124.     local read_ = 0
  125.     local writePos = 0
  126.     while(read_ < pixelDataSize) do
  127.        
  128.         local transparentPixels = self:getUint16()
  129.         local coloredPixels = self:getUint16()
  130.        
  131.         for i = 0, transparentPixels do
  132.             image.file:write(0x00)
  133.             image.file:write(0x00)
  134.             image.file:write(0x00)
  135.             image.file:write(0x00)
  136.             writePos = writePos + 4
  137.         end
  138.        
  139.         for i = 0, coloredPixels do
  140.             image.file:write(self:getUint8())
  141.             image.file:write(self:getUint8())
  142.             image.file:write(self:getUint8())
  143.             image.file:write(0xFF)
  144.             writePos = writePos + 4
  145.         end
  146.         read_ = read_ + 4 + (3 * coloredPixels)
  147.     end
  148.     while writePos < pixelDataSize do
  149.         image.file:write(0x00)
  150.         image.file:write(0x00)
  151.         image.file:write(0x00)
  152.         image.file:write(0x00)
  153.         writePos = writePos + 4
  154.     end
  155.     return image.file
  156. end
  157.  
  158. SpriteWriter = {}
  159.  
  160. function SpriteWriter:new(fileName)
  161.     local file = io.open(fileName..".bmp", "wp")
  162.     return setmetatable({file = file}, {__index = self})
  163. end
  164.    
  165. function SpriteWriter:addMagicNumber()
  166.     self.file:write(0x42)
  167.     self.file:write(0x4D)
  168. end
  169.  
  170.  
  171.     local file = io.open("./ka.spr", "rb")
  172.     reader = SpriteReader:load(file)
  173.     reader.version = reader:getUint32()
  174.     reader.numberOfSprites = reader:getUint16()
  175.     io.write("Version: ",reader.version,"\nNumber Of Sprites: ", reader.numberOfSprites)
  176.     for id = 1, reader.numberOfSprites do
  177.         local img = reader:getImage(id)
  178.         img:close()
  179.     end
  180.    
  181.     reader:closeData()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement