isogen-cd2025/canvas.lua

53 lines
1.1 KiB
Lua
Raw Normal View History

2024-05-19 10:39:00 +02:00
local transparent = { a=0, r=0, g=0, b=0 }
local Canvas = {}
local Canvas_mt = { __index = Canvas }
-- x and y is 0-based
function Canvas:get_index(x, y)
return (self.width * y) + x + 1
end
2024-05-22 10:32:27 +02:00
function Canvas:add_pixel(x, y, fg)
fg.a = fg.a or 255
local i = self:get_index(x, y)
local bg = self.png_data[i]
local a = fg.a / 255
local ai = 1 - a
self.png_data[i] = {
r = ((fg.r * a) + (bg.r * ai)),
g = ((fg.g * a) + (bg.g * ai)),
b = ((fg.b * a) + (bg.b * ai)),
a = math.max(bg.a, fg.a)
}
end
2024-05-19 10:39:00 +02:00
function Canvas:set_pixel(x, y, colorspec)
local i = self:get_index(x, y)
self.png_data[i] = colorspec
end
function Canvas:get_pixel(x, y)
local i = self:get_index(x, y)
return self.png_data[i]
end
function Canvas:png()
return minetest.encode_png(self.width, self.height, self.png_data)
end
function isogen.create_canvas(width, height)
local png_data = {}
for i=1,width*height do
png_data[i] = transparent
end
local self = {
png_data = png_data,
width = width,
height = height
}
return setmetatable(self, Canvas_mt)
end