cc-stuff/ccpi.lua

63 lines
1.8 KiB
Lua
Raw Normal View History

2023-10-15 03:13:42 +03:00
local function load(path)
local image = { w = 0, h = 0, scale = 1.0, palette = {}, lines = {} }
local fp, err = io.open(path, "rb")
if not fp then return nil, err end
local magic = fp:read(4)
if magic ~= "CCPI" then
return nil, "Invalid header: expected CCPI got " .. magic
end
image.w, image.h = string.byte(fp:read(1)), string.byte(fp:read(1))
2023-10-15 03:24:29 +03:00
image.scale = 0.5 + string.byte(fp:read(1)) * 5 / 255
2023-10-15 03:13:42 +03:00
for i = 1, 16 do
2024-01-03 20:30:16 +03:00
image.palette[i] = bit.blshift(string.byte(fp:read(1)), 16)
image.palette[i] = bit.bor(image.palette[i], bit.blshift(string.byte(fp:read(1)), 8))
image.palette[i] = bit.bor(image.palette[i], string.byte(fp:read(1)))
2023-10-15 03:13:42 +03:00
end
for y = 1, image.h do
local line = { s = "", bg = "", fg = "" }
for x = 1, image.w do
line.s = line.s .. fp:read(1)
2023-12-20 19:59:28 +03:00
local char = fp:read(1)
if char == nil then
2024-01-03 20:30:16 +03:00
return nil, string.format("Failed to read color data for x=%d y=%d", x, y)
2023-12-20 19:59:28 +03:00
end
local color = string.byte(char)
2024-01-03 20:30:16 +03:00
line.bg = line.bg .. string.format("%x", bit.band(0xF, color))
line.fg = line.fg .. string.format("%x", bit.band(0xF, bit.brshift(color, 4)))
2023-10-15 03:13:42 +03:00
end
table.insert(image.lines, line)
end
fp:close()
return image
end
local function draw(img, ox, oy, monitor)
2024-01-03 20:30:16 +03:00
-- todo: add expect()
2023-10-15 03:13:42 +03:00
local t = monitor or term.current()
ox = ox or 1
oy = oy or 1
for i = 1, 16 do
2024-01-03 20:30:16 +03:00
t.setPaletteColor(bit.blshift(1, i - 1), img.palette[i])
2023-10-15 03:13:42 +03:00
end
2023-10-15 03:26:13 +03:00
t.setTextScale(img.scale)
2023-10-15 03:24:29 +03:00
2023-10-15 03:13:42 +03:00
for y = 1, img.h do
t.setCursorPos(ox, oy + y - 1)
t.blit(img.lines[y].s, img.lines[y].fg, img.lines[y].bg)
end
end
return {
load = load,
draw = draw
}