176 lines
4.8 KiB
Plaintext
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 |