2025-10-21 00:40:14 +02:00

176 lines
4.8 KiB
Plaintext

if mwm == nil then _G.mwm = {} end
function tabletext(text)
local tTable = {}
for a=1,string.len(text) do
tTable[a] = string.sub(text,a,a)
end
return tTable
end
to_colors, to_blit = {}, {}
for i = 1, 16 do
to_blit[2^(i-1)] = ("0123456789abcdef"):sub(i, i)
to_colors[("0123456789abcdef"):sub(i, i)] = 2^(i-1)
end
function mwm.newCvs(tX,tY)
local cvs = {}
cvs.rCvs = {}
cvs.oCvs = {}
cvs.orCvs = {}
cvs.color = colors.white
if tX == nil or tY == nil then
tX,tY = term.getSize()
end
for x=1,tX do
cvs.rCvs[x] = {}
for y=1,tY do
cvs.rCvs[x][y] = {"",term.getBackgroundColor()} -- empty pixel = ""
end
end
cvs.width = tX
cvs.height = tY
local function genCvs()
cvs.rCvs = {}
local tX,tY = cvs.width,cvs.height
for x=1,tX do
cvs.rCvs[x] = {}
for y=1,tY do
cvs.rCvs[x][y] = {"",term.getBackgroundColor()} -- empty pixel = ""
end
end
end
function cvs.setColor(color)
cvs.color = color
end
function cvs.rect(x,y,w,h,text,txtcolor)
if tonumber(x) == nil or tonumber(y) == nil or tonumber(w) == nil or tonumber(h) == nil then
return
end
if text ~= nil then
if txtcolor == nil then
txtcolor = colors.white
end
if type(text) == "string" then
text = {text}
end
for t=1,#text do
if string.len(text[t]) > w then
string.sub(text[t],1,w)
end
end
end
cvs.oCvs[#cvs.oCvs+1] = {type="rect",x=x,y=y,width=w,height=h,color=cvs.color,txt=text,txtcolor=txtcolor,ref=#cvs.oCvs+1}
return cvs.oCvs[#cvs.oCvs],true
end
function cvs.print(text,x,y)
if text == nil or tonumber(x) == nil or tonumber(y) == nil then
return
end
cvs.oCvs[#cvs.oCvs+1] = {type="text",txt=text,x=x,y=y,color=cvs.color}
return cvs.oCvs[#cvs.oCvs],true
end
cvs.write = cvs.print
function cvs.sprite(file,x,y,w,h)
if fs.exists(file) == false then
return
end
opensprite = fs.open(file,"r")
local sprite = opensprite.readAll()
opensprite.close()
sprite = textutils.unserialize(sprite)
if sprite == nil then return end
cvs.oCvs[#cvs.oCvs+1] = {type="sprite",texture=sprite,x=x,y=y,width=w,height=h}
return cvs.oCvs[#cvs.oCvs]
end
-- Support circle rendering. This can be done by calculating with math.cos how many pixels it is from one side of one y coord to the other side of the same y coord and putting that in a string. repeat this for every y coord then draw
function cvs.clear()
cvs.oCvs = {}
end
function cvs.render(trans,x1,y1,x2,y2)
if x1 == nil then x1 = 1 end
if y1 == nil then y1 = 1 end
if x2 == nil then x2 = cvs.width end
if y2 == nil then y2 = cvs.height end
genCvs()
bgcolor = term.getBackgroundColor()
for a=1,#cvs.oCvs do
local o = cvs.oCvs[a]
cvs.oCvs[a].ref = a
o.x = math.floor(o.x+0.5)
o.y = math.floor(o.y+0.5)
if o.type == "rect" then
for b=1,o.height do
for c=1,o.width do
local tX,tY = term.getSize()
if o.x+(c-1) <= tX and o.y+(b-1) <= tY and o.x+(c-1) > 0 and o.y+(b-1) > 0 then
cvs.rCvs[o.x+(c-1)][o.y+(b-1)] = {" ",o.color}
end
end
end
if o.txt ~= nil and o.txtcolor ~= nil then
for b=1,o.height do
if o.txt[b] ~= nil then
dObj = tabletext(o.txt[b])
for c=1,string.len(o.txt[b]) do
cvs.rCvs[o.x+(c-1)][o.y+(b-1)] = {dObj[c],o.color,o.txtcolor}
end
end
end
end
elseif o.type == "sprite" then
for b=1,o.height do
for c=1,o.width do
if o.texture[c] ~= nil then
local tX,tY = term.getSize()
if o.x+(c-1) <= tX and o.y+(b-1) <= tY and o.x+(c-1) > 0 and o.y+(b-1) > 0 and o.texture[c][b] ~= nil then
cvs.rCvs[o.x+(c-1)][o.y+(b-1)] = o.texture[c][b]
end
end
end
end
elseif o.type == "text" then
dObj = tabletext(o.txt)
for b=1,#dObj do
local tX,tY = term.getSize()
if o.x+(b-1) <= tX and o.y <= tY and o.x+(b-1) > 0 and o.y > 0 then
cvs.rCvs[o.x+(b-1)][o.y][1] = dObj[b]
cvs.rCvs[o.x+(b-1)][o.y][3] = o.color
end
end
end
end
for y=y1,y2 do
bl1 = ""
bl2 = ""
bl3 = ""
for x=x1,x2 do
if not (cvs.orCvs[x] ~= nil and cvs.orCvs[x][y] == cvs.rCvs[x][y]) then
if cvs.rCvs[x][y][1] == "" then
if term.current().getLine and trans then
local theline = {term.current().getLine(y)}
bl1 = bl1..string.sub(theline[1],x,x)
bl2 = bl2..string.sub(theline[2],x,x)
bl3 = bl3..string.sub(theline[3],x,x)
else
bl1 = bl1.." "
bl2 = bl2..0
bl3 = bl3..to_blit[cvs.rCvs[x][y][2]]
end
else
if cvs.rCvs[x][y][3] ~= nil then
bl2 = bl2..to_blit[cvs.rCvs[x][y][3]]
else
bl2 = bl2..0
end
bl1 = bl1..tostring(cvs.rCvs[x][y][1])
bl3 = bl3..to_blit[cvs.rCvs[x][y][2]]
end
end
end
term.setCursorPos(x1,y)
term.blit(bl1,bl2,bl3)
end
cvs.orCvs = cvs.rCvs
term.setBackgroundColor(bgcolor)
end
return cvs
end