84 lines
2.4 KiB
GDScript
84 lines
2.4 KiB
GDScript
var INDEX_FORMAT := globals.INDEX_FORMAT
|
|
|
|
static func ByteArray(size: int) -> PoolByteArray:
|
|
var arr := PoolByteArray()
|
|
arr.resize(size)
|
|
return arr
|
|
|
|
static func mode7_to_tile(data: PoolByteArray) -> Image:
|
|
# Easy one, it's just straight data left-to-right, top-to-bottom
|
|
var tile := Image.new()
|
|
tile.create_from_data(8, 8, false, Image.FORMAT_L8, data)
|
|
return tile
|
|
|
|
static func mode7_compressed_to_tile(data: PoolByteArray, tile_palette: int = 0) -> Image:
|
|
# 4 bits per pixel.
|
|
var tdata := ByteArray(64)
|
|
for i in 32:
|
|
var b := data[i]
|
|
var j: int = i*2
|
|
tdata[j] = (b & 0x0F) | tile_palette
|
|
tdata[j+1] = (b >> 4) | tile_palette
|
|
return mode7_to_tile(tdata)
|
|
|
|
static func _4plane_to_tile(data: PoolByteArray) -> Image:
|
|
var tdata := ByteArray(64)
|
|
for i in range(64):
|
|
var j = (i/8)*2
|
|
var x = 7 - (i%8)
|
|
tdata[i] = (data[j] >> x & 1) | ((data[j+1] >> x & 1)<<1) | ((data[j+16] >> x & 1)<<2) | ((data[j+17] >> x & 1)<<3)
|
|
var tile := Image.new()
|
|
tile.create_from_data(8, 8, false, Image.FORMAT_L8, tdata)
|
|
return tile
|
|
|
|
static func _3plane_to_tile(data: PoolByteArray) -> Image:
|
|
var tdata := ByteArray(64)
|
|
for i in range(64):
|
|
var j = (i/8)*2
|
|
var x = 7 - (i%8)
|
|
tdata[i] = (data[j] >> x & 1) | ((data[j+1] >> x & 1)<<1) | ((data[(i/8)+16] >> x & 1)<<2)
|
|
var tile := Image.new()
|
|
tile.create_from_data(8, 8, false, Image.FORMAT_L8, tdata)
|
|
return tile
|
|
|
|
static func _2plane_to_tile(data: PoolByteArray) -> Image:
|
|
var tdata := ByteArray(64)
|
|
for i in range(64):
|
|
var j = (i/8)*2
|
|
var x = 7 - (i%8)
|
|
tdata[i] = (data[j] >> x & 1) | ((data[j+1] >> x & 1)<<1)
|
|
var tile := Image.new()
|
|
tile.create_from_data(8, 8, false, Image.FORMAT_L8, tdata)
|
|
return tile
|
|
|
|
static func _1plane_to_tile(data: PoolByteArray) -> Image:
|
|
var tdata := ByteArray(64)
|
|
for i in range(64):
|
|
var x = 7 - (i%8)
|
|
tdata[i] = (data[i/8] >> x & 1)
|
|
var tile := Image.new()
|
|
tile.create_from_data(8, 8, false, Image.FORMAT_L8, tdata)
|
|
return tile
|
|
|
|
static func get_tile(rom: File, offset: int, length: int) -> Image:
|
|
rom.seek(offset)
|
|
var data := rom.get_buffer(length)
|
|
var planes := length / 8
|
|
match planes:
|
|
4:
|
|
return _4plane_to_tile(data)
|
|
3:
|
|
return _3plane_to_tile(data)
|
|
2:
|
|
return _2plane_to_tile(data)
|
|
_:
|
|
return _1plane_to_tile(data)
|
|
|
|
static func bgr555_to_color(short: int) -> Color:
|
|
var color = Color()
|
|
color.a = 1
|
|
color.r = ((short & 0x1F) / 31.0)
|
|
color.g = (((short >> 5) & 0x1F) / 31.0)
|
|
color.b = (((short >> 10) & 0x1F) / 31.0)
|
|
return color
|