390 lines
9.7 KiB
Lua
390 lines
9.7 KiB
Lua
local sub,rep = string.sub,string.rep
|
|
|
|
local function frame(base, manager)
|
|
local w, h = 0, 0
|
|
local t,fg,bg = {}, {}, {}
|
|
local x, y = 1,1
|
|
|
|
local data = {}
|
|
|
|
local function recalculateSize()
|
|
for y=1,h do
|
|
if(t[y]==nil)then
|
|
t[y] = rep(" ", w)
|
|
else
|
|
t[y] = t[y]..rep(" ", w-#t[y])
|
|
end
|
|
if(fg[y]==nil)then
|
|
fg[y] = rep("0", w)
|
|
else
|
|
fg[y] = fg[y]..rep("0", w-#fg[y])
|
|
end
|
|
if(bg[y]==nil)then
|
|
bg[y] = rep("f", w)
|
|
else
|
|
bg[y] = bg[y]..rep("f", w-#bg[y])
|
|
end
|
|
end
|
|
end
|
|
|
|
local addText = function(text, _x, _y)
|
|
x = _x or x
|
|
y = _y or y
|
|
if(t[y]==nil)then
|
|
t[y] = rep(" ", x-1)..text..rep(" ", w-(#text+x))
|
|
else
|
|
t[y] = sub(t[y], 1, x-1)..rep(" ", x-#t[y])..text..sub(t[y], x+#text, w)
|
|
end
|
|
if(#t[y]>w)then w = #t[y] end
|
|
if(y > h)then h = y end
|
|
manager.updateSize(w, h)
|
|
end
|
|
|
|
local addBg = function(b, _x, _y)
|
|
x = _x or x
|
|
y = _y or y
|
|
if(bg[y]==nil)then
|
|
bg[y] = rep("f", x-1)..b..rep("f", w-(#b+x))
|
|
else
|
|
bg[y] = sub(bg[y], 1, x-1)..rep("f", x-#bg[y])..b..sub(bg[y], x+#b, w)
|
|
end
|
|
if(#bg[y]>w)then w = #bg[y] end
|
|
if(y > h)then h = y end
|
|
manager.updateSize(w, h)
|
|
end
|
|
|
|
local addFg = function(f, _x, _y)
|
|
x = _x or x
|
|
y = _y or y
|
|
if(fg[y]==nil)then
|
|
fg[y] = rep("0", x-1)..f..rep("0", w-(#f+x))
|
|
else
|
|
fg[y] = sub(fg[y], 1, x-1)..rep("0", x-#fg[y])..f..sub(fg[y], x+#f, w)
|
|
end
|
|
if(#fg[y]>w)then w = #fg[y] end
|
|
if(y > h)then h = y end
|
|
manager.updateSize(w, h)
|
|
end
|
|
|
|
local function setFrame(frm)
|
|
data = {}
|
|
t, fg, bg = {}, {}, {}
|
|
for k,v in pairs(base)do
|
|
if(type(k)=="string")then
|
|
data[k] = v
|
|
else
|
|
t[k], fg[k], bg[k] = v[1], v[2], v[3]
|
|
end
|
|
end
|
|
manager.updateSize(w, h)
|
|
end
|
|
|
|
if(base~=nil)then
|
|
if(#base>0)then
|
|
w = #base[1][1]
|
|
h = #base
|
|
setFrame(base)
|
|
end
|
|
end
|
|
|
|
return {
|
|
recalculateSize = recalculateSize,
|
|
setFrame = setFrame,
|
|
|
|
getFrame = function()
|
|
local f = {}
|
|
|
|
for k,v in pairs(t)do
|
|
table.insert(f, {v, fg[k], bg[k]})
|
|
end
|
|
|
|
for k,v in pairs(data)do
|
|
f[k] = v
|
|
end
|
|
|
|
return f, w, h
|
|
end,
|
|
|
|
getImage = function()
|
|
local i = {}
|
|
for k,v in pairs(t)do
|
|
table.insert(i, {v, fg[k], bg[k]})
|
|
end
|
|
return i
|
|
end,
|
|
|
|
setFrameData = function(key, value)
|
|
if(value~=nil)then
|
|
data[key] = value
|
|
else
|
|
if(type(key)=="table")then
|
|
data = key
|
|
end
|
|
end
|
|
end,
|
|
|
|
setFrameImage = function(imgData)
|
|
for k,v in pairs(imgData.t)do
|
|
t[k] = imgData.t[k]
|
|
fg[k] = imgData.fg[k]
|
|
bg[k] = imgData.bg[k]
|
|
end
|
|
end,
|
|
|
|
getFrameImage = function()
|
|
return {t = t, fg = fg, bg = bg}
|
|
end,
|
|
|
|
getFrameData = function(key)
|
|
if(key~=nil)then
|
|
return data[key]
|
|
else
|
|
return data
|
|
end
|
|
end,
|
|
|
|
blit = function(text, fgCol, bgCol, x, y)
|
|
addText(text, x, y)
|
|
addFg(fgCol, x, y)
|
|
addBg(bgCol, x, y)
|
|
end,
|
|
|
|
text = addText,
|
|
fg = addFg,
|
|
bg = addBg,
|
|
|
|
getSize = function()
|
|
return w, h
|
|
end,
|
|
|
|
setSize = function(_w, _h)
|
|
local nt,nfg,nbg = {}, {}, {}
|
|
for _y=1,_h do
|
|
if(t[_y]~=nil)then
|
|
nt[_y] = sub(t[_y], 1, _w)..rep(" ", _w - w)
|
|
else
|
|
nt[_y] = rep(" ", _w)
|
|
end
|
|
if(fg[_y]~=nil)then
|
|
nfg[_y] = sub(fg[_y], 1, _w)..rep("0", _w - w)
|
|
else
|
|
nfg[_y] = rep("0", _w)
|
|
end
|
|
if(bg[_y]~=nil)then
|
|
nbg[_y] = sub(bg[_y], 1, _w)..rep("f", _w - w)
|
|
else
|
|
nbg[_y] = rep("f", _w)
|
|
end
|
|
end
|
|
t, fg, bg = nt, nfg, nbg
|
|
w, h = _w, _h
|
|
end,
|
|
}
|
|
end
|
|
|
|
return function(img)
|
|
local frames = {}
|
|
local metadata = {creator="Bimg Library by NyoriE", date=os.date("!%Y-%m-%dT%TZ")}
|
|
local width,height = 0, 0
|
|
|
|
if(img~=nil)then
|
|
if(img[1][1][1]~=nil)then
|
|
width,height = metadata.width or #img[1][1][1], metadata.height or #img[1]
|
|
end
|
|
end
|
|
|
|
local manager = {}
|
|
|
|
local function addFrame(id, data)
|
|
id = id or #frames+1
|
|
local f = frame(data, manager)
|
|
table.insert(frames, id, f)
|
|
if(data==nil)then
|
|
frames[id].setSize(width, height)
|
|
end
|
|
return f
|
|
end
|
|
|
|
local function removeFrame(id)
|
|
table.remove(frames, id or #frames)
|
|
end
|
|
|
|
local function moveFrame(id, dir)
|
|
local f = frames[id]
|
|
if(f~=nil)then
|
|
local newId = id+dir
|
|
if(newId>=1)and(newId<=#frames)then
|
|
table.remove(frames, id)
|
|
table.insert(frames, newId, f)
|
|
end
|
|
end
|
|
end
|
|
|
|
manager = {
|
|
updateSize = function(w, h, force)
|
|
local changed = force==true and true or false
|
|
if(w > width)then changed = true width = w end
|
|
if(h > height)then changed = true height = h end
|
|
if(changed)then
|
|
for k,v in pairs(frames)do
|
|
v.setSize(width, height)
|
|
v.recalculateSize()
|
|
end
|
|
end
|
|
end,
|
|
|
|
text = function(frame, text, x, y)
|
|
local f = frames[frame]
|
|
if(f==nil)then
|
|
f = addFrame(frame)
|
|
end
|
|
f.text(text, x, y)
|
|
end,
|
|
|
|
fg = function(frame, fg, x, y)
|
|
local f = frames[frame]
|
|
if(f==nil)then
|
|
f = addFrame(frame)
|
|
end
|
|
f.fg(fg, x, y)
|
|
end,
|
|
|
|
bg = function(frame, bg, x, y)
|
|
local f = frames[frame]
|
|
if(f==nil)then
|
|
f = addFrame(frame)
|
|
end
|
|
f.bg(bg, x, y)
|
|
end,
|
|
|
|
blit = function(frame, text, fg, bg, x, y)
|
|
local f = frames[frame]
|
|
if(f==nil)then
|
|
f = addFrame(frame)
|
|
end
|
|
f.blit(text, fg, bg, x, y)
|
|
end,
|
|
|
|
setSize = function(w, h)
|
|
width = w
|
|
height = h
|
|
for k,v in pairs(frames)do
|
|
v.setSize(w, h)
|
|
end
|
|
end,
|
|
|
|
getFrame = function(id)
|
|
if(frames[id]~=nil)then
|
|
return frames[id].getFrame()
|
|
end
|
|
end,
|
|
|
|
getFrameObjects = function()
|
|
return frames
|
|
end,
|
|
|
|
getFrames = function()
|
|
local f = {}
|
|
for k,v in pairs(frames)do
|
|
local frame = v.getFrame()
|
|
table.insert(f, frame)
|
|
end
|
|
return f
|
|
end,
|
|
|
|
getFrameObject = function(id)
|
|
return frames[id]
|
|
end,
|
|
|
|
addFrame = function(id)
|
|
if(#frames<=1)then
|
|
if(metadata.animated==nil)then
|
|
metadata.animated = true
|
|
end
|
|
if(metadata.secondsPerFrame==nil)then
|
|
metadata.secondsPerFrame = 0.2
|
|
end
|
|
end
|
|
return addFrame(id)
|
|
end,
|
|
|
|
removeFrame = removeFrame,
|
|
|
|
moveFrame = moveFrame,
|
|
|
|
setFrameData = function(id, key, value)
|
|
if(frames[id]~=nil)then
|
|
frames[id].setFrameData(key, value)
|
|
end
|
|
end,
|
|
|
|
getFrameData = function(id, key)
|
|
if(frames[id]~=nil)then
|
|
return frames[id].getFrameData(key)
|
|
end
|
|
end,
|
|
|
|
getSize = function()
|
|
return width, height
|
|
end,
|
|
|
|
setAnimation = function(anim)
|
|
metadata.animation = anim
|
|
end,
|
|
|
|
setMetadata = function(key, val)
|
|
if(val~=nil)then
|
|
metadata[key] = val
|
|
else
|
|
if(type(key)=="table")then
|
|
metadata = key
|
|
end
|
|
end
|
|
end,
|
|
|
|
getMetadata = function(key)
|
|
if(key~=nil)then
|
|
return metadata[key]
|
|
else
|
|
return metadata
|
|
end
|
|
end,
|
|
|
|
createBimg = function()
|
|
local bimg = {}
|
|
for k,v in pairs(frames)do
|
|
local f = v.getFrame()
|
|
table.insert(bimg, f)
|
|
end
|
|
for k,v in pairs(metadata)do
|
|
bimg[k] = v
|
|
end
|
|
bimg.width = width
|
|
bimg.height = height
|
|
return bimg
|
|
end,
|
|
}
|
|
|
|
if(img~=nil)then
|
|
for k,v in pairs(img)do
|
|
if(type(k)=="string")then
|
|
metadata[k] = v
|
|
end
|
|
end
|
|
if(metadata.width==nil)or(metadata.height==nil)then
|
|
width = metadata.width or #img[1][1][1]
|
|
height = metadata.height or #img[1]
|
|
manager.updateSize(width, height, true)
|
|
end
|
|
|
|
for k,v in pairs(img)do
|
|
if(type(k)=="number")then
|
|
addFrame(k, v)
|
|
end
|
|
end
|
|
else
|
|
addFrame(1)
|
|
end
|
|
|
|
return manager
|
|
end |