Newer
Older
Radon / util / misc.lua
local _ = require("util.score")

local Solyd = require("modules.solyd")
local Canvases = require("modules.canvas")
local PixelCanvas = Canvases.PixelCanvas

local function tableSize(t)
    if type(t) ~= "table" then
        return nil
    end
    
    local count = 0
    for k, v in pairs(t) do
        count = count + 1
    end
    return count
end

---Renders a Solyd tree and bakes the canvases into one
function bakeToCanvas(rootComponent)
    local tree = Solyd.render(nil, rootComponent)
    local context = Solyd.getTopologicalContext(tree, { "canvas" })
    local minX, minY = math.huge, math.huge
    local maxX, maxY = -math.huge, -math.huge

    for _, canvas in ipairs(context.canvas) do
        minX = math.min(minX, canvas[2])
        minY = math.min(minY, canvas[3])
        maxX = math.max(maxX, canvas[2] + canvas[1].width - 1)
        maxY = math.max(maxY, canvas[3] + canvas[1].height - 1)
    end

    local canvas = PixelCanvas.new(maxX - minX + 1, maxY - minY + 1)
    canvas:composite(_.map(context.canvas, function(c)
        return {c[1], c[2] - minX + 1, c[3] - minY + 1}
    end))
    return canvas
end

return {
    tableSize = tableSize,
    bakeToCanvas = bakeToCanvas,
}