Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SpriteReader = {}
- sprite_size = 32
- sprite_data_size = sprite_size * sprite_size * 4
- --[[
- * Inicia classe com atributo do tipo userdata 'data'
- * Seta atributos default e le data no modo "*a"
- --]]
- function SpriteReader:load(data)
- attr = {version = 0, numberOfSprites = 0, posByte = 1,file = data, data = data:read("*a"), id = 1}
- return setmetatable(attr, {__index = self})
- end
- --[[
- * Pega os valores minimo e maximos para numero de bytes fornecidos
- * signed é uma variavel boolean, quando true rearranja os limites para tipo signed
- --]]
- function SpriteReader:getRanges(byte, signed)
- local min, max = 0, 0
- for var = byte, 1, -1 do
- max = max +(2 ^ (8 * var))
- end
- if(signed)then
- min, max = -max/2, max/2
- end
- return min, not signed and (max - 1) or max
- end
- --[[
- * le byte a byte somando seus valores 'byte' numero de vezes
- * se signed é true, reajusta o valor para signed
- --]]
- function SpriteReader:readBytes(byte, signed)
- local min, _ = self:getRanges(byte, signed)
- local value = self:nextByte()
- for var = 2, byte do
- value = value + (self:nextByte() ^ 2)
- end
- return (value + min)
- end
- --[[
- * le 'posByte', que é um atributo de controle, serve apaenas para armazenar o proximo byte
- * reajusta 'posByte' para posição seguinte
- * retorna 'byte'
- --]]
- function SpriteReader:nextByte()
- local byte = self.data:byte(self.posByte)
- self.posByte = self.posByte + 1
- return tonumber(byte)
- end
- --[[
- * faz a leitura byte a byte 8 vezes somando seus valores pela progressão:
- * (byte) ^ 1 + (byte) ^ 2 + ... + (byte) ^ n
- * valido para todos unsigneds abaixo
- --]]
- function SpriteReader:getUint64()
- return self:readBytes(8, false)
- end
- function SpriteReader:getUint32()
- return self:readBytes(4, false)
- end
- function SpriteReader:getUint16()
- return self:readBytes(2, false)
- end
- function SpriteReader:getUint8()
- return self:readBytes(1, false)
- end
- --[[
- * segue a mesma lógica anterior, com uma unica diferença
- * o valor final é reajustado para signed
- --]]
- function SpriteReader:getInt64()
- return self:readBytes(8, true)
- end
- function SpriteReader:getInt32()
- return self:readBytes(4, true)
- end
- function SpriteReader:getInt16()
- return self:readBytes(2, true)
- end
- function SpriteReader:getInt8()
- return self:readBytes(1, true)
- end
- --[[
- * fecha o atributo file
- --]]
- function SpriteReader:closeData()
- return self.file:close()
- end
- function SpriteReader:getImage(id)
- local offset = (((id-1) * 4) + 6)
- self.posByte = offset
- local spriteAddress = self:getUint32()
- self.posByte = spriteAddress
- -- skip
- self:getInt8()
- self:getInt8()
- self:getInt8()
- local pixelDataSize = self:getUint16()
- local image = SpriteWriter:new(id)
- image:addMagicNumber()
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(spriteAddress)
- local read_ = 0
- local writePos = 0
- while(read_ < pixelDataSize) do
- local transparentPixels = self:getUint16()
- local coloredPixels = self:getUint16()
- for i = 0, transparentPixels do
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(0x00)
- writePos = writePos + 4
- end
- for i = 0, coloredPixels do
- image.file:write(self:getUint8())
- image.file:write(self:getUint8())
- image.file:write(self:getUint8())
- image.file:write(0xFF)
- writePos = writePos + 4
- end
- read_ = read_ + 4 + (3 * coloredPixels)
- end
- while writePos < pixelDataSize do
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(0x00)
- image.file:write(0x00)
- writePos = writePos + 4
- end
- return image.file
- end
- SpriteWriter = {}
- function SpriteWriter:new(fileName)
- local file = io.open(fileName..".bmp", "wp")
- return setmetatable({file = file}, {__index = self})
- end
- function SpriteWriter:addMagicNumber()
- self.file:write(0x42)
- self.file:write(0x4D)
- end
- local file = io.open("./ka.spr", "rb")
- reader = SpriteReader:load(file)
- reader.version = reader:getUint32()
- reader.numberOfSprites = reader:getUint16()
- io.write("Version: ",reader.version,"\nNumber Of Sprites: ", reader.numberOfSprites)
- for id = 1, reader.numberOfSprites do
- local img = reader:getImage(id)
- img:close()
- end
- reader:closeData()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement