318 lines
10 KiB
Plaintext
318 lines
10 KiB
Plaintext
--:Minify:--
|
|
local kernel=...
|
|
if not kernel.cct then return end
|
|
|
|
local plt={
|
|
[0]=0x000000,0x0b0b0b,0x222222,0x444444,0x555555,0x777777,0x888888,0xaaaaaa,
|
|
0xbbbbbb,0xdddddd,0xeeeeee,0x00000b,0x000022,0x000044,0x000055,0x000077,
|
|
0x000088,0x0000aa,0x0000bb,0x0000dd,0x0000ee,0x000b00,0x002200,0x004400,
|
|
0x005500,0x007700,0x008800,0x00aa00,0x00bb00,0x00dd00,0x00ee00,0x0b0000,
|
|
0x220000,0x440000,0x550000,0x770000,0x880000,0xaa0000,0xbb0000,0xdd0000,
|
|
0xee0000,0x000033,0x000066,0x000099,0x0000cc,0x0000ff,0x003300,0x003333,
|
|
0x003366,0x003399,0x0033cc,0x0033ff,0x006600,0x006633,0x006666,0x006699,
|
|
0x0066cc,0x0066ff,0x009900,0x009933,0x009966,0x009999,0x0099cc,0x0099ff,
|
|
0x00cc00,0x00cc33,0x00cc66,0x00cc99,0x00cccc,0x00ccff,0x00ff00,0x00ff33,
|
|
0x00ff66,0x00ff99,0x00ffcc,0x00ffff,0x330000,0x330033,0x330066,0x330099,
|
|
0x3300cc,0x3300ff,0x333300,0x333333,0x333366,0x333399,0x3333cc,0x3333ff,
|
|
0x336600,0x336633,0x336666,0x336699,0x3366cc,0x3366ff,0x339900,0x339933,
|
|
0x339966,0x339999,0x3399cc,0x3399ff,0x33cc00,0x33cc33,0x33cc66,0x33cc99,
|
|
0x33cccc,0x33ccff,0x33ff00,0x33ff33,0x33ff66,0x33ff99,0x33ffcc,0x33ffff,
|
|
0x660000,0x660033,0x660066,0x660099,0x6600cc,0x6600ff,0x663300,0x663333,
|
|
0x663366,0x663399,0x6633cc,0x6633ff,0x666600,0x666633,0x666666,0x666699,
|
|
0x6666cc,0x6666ff,0x669900,0x669933,0x669966,0x669999,0x6699cc,0x6699ff,
|
|
0x66cc00,0x66cc33,0x66cc66,0x66cc99,0x66cccc,0x66ccff,0x66ff00,0x66ff33,
|
|
0x66ff66,0x66ff99,0x66ffcc,0x66ffff,0x990000,0x990033,0x990066,0x990099,
|
|
0x9900cc,0x9900ff,0x993300,0x993333,0x993366,0x993399,0x9933cc,0x9933ff,
|
|
0x996600,0x996633,0x996666,0x996699,0x9966cc,0x9966ff,0x999900,0x999933,
|
|
0x999966,0x999999,0x9999cc,0x9999ff,0x99cc00,0x99cc33,0x99cc66,0x99cc99,
|
|
0x99cccc,0x99ccff,0x99ff00,0x99ff33,0x99ff66,0x99ff99,0x99ffcc,0x99ffff,
|
|
0xcc0000,0xcc0033,0xcc0066,0xcc0099,0xcc00cc,0xcc00ff,0xcc3300,0xcc3333,
|
|
0xcc3366,0xcc3399,0xcc33cc,0xcc33ff,0xcc6600,0xcc6633,0xcc6666,0xcc6699,
|
|
0xcc66cc,0xcc66ff,0xcc9900,0xcc9933,0xcc9966,0xcc9999,0xcc99cc,0xcc99ff,
|
|
0xcccc00,0xcccc33,0xcccc66,0xcccc99,0xcccccc,0xccccff,0xccff00,0xccff33,
|
|
0xccff66,0xccff99,0xccffcc,0xccffff,0xff0000,0xff0033,0xff0066,0xff0099,
|
|
0xff00cc,0xff00ff,0xff3300,0xff3333,0xff3366,0xff3399,0xff33cc,0xff33ff,
|
|
0xff6600,0xff6633,0xff6666,0xff6699,0xff66cc,0xff66ff,0xff9900,0xff9933,
|
|
0xff9966,0xff9999,0xff99cc,0xff99ff,0xffcc00,0xffcc33,0xffcc66,0xffcc99,
|
|
0xffcccc,0xffccff,0xffff00,0xffff33,0xffff66,0xffff99,0xffffcc,0xffffff,
|
|
}
|
|
|
|
local iplt={}
|
|
for i=0, #plt do
|
|
iplt[plt[i]]=i
|
|
end
|
|
local l1f,l1d,l2,ops={},{},{},0
|
|
|
|
local function findClosest(tbl, target)
|
|
local closest = nil
|
|
local smallestDiff = math.huge
|
|
|
|
for k, _ in pairs(tbl) do
|
|
if k==target then return k end
|
|
local diff = math.abs(k - target)
|
|
if diff < smallestDiff then
|
|
smallestDiff = diff
|
|
closest = k
|
|
end
|
|
end
|
|
|
|
return closest
|
|
end
|
|
|
|
local function aprox(c24)
|
|
ops = ops + 1
|
|
|
|
if ops % 1024 == 0 then
|
|
l1d = {}
|
|
l1f = {}
|
|
end
|
|
|
|
if ops % 8192 == 0 then
|
|
l2 = {}
|
|
end
|
|
|
|
if l2[c24] ~= nil then
|
|
return l2[c24]
|
|
end
|
|
|
|
if l1d[c24] ~= nil then
|
|
l1f[c24] = l1f[c24] + 1
|
|
|
|
if l1f[c24] >= 16 then
|
|
l2[c24] = l1d[c24]
|
|
l1d[c24] = nil
|
|
l1f[c24] = nil
|
|
return l2[c24]
|
|
end
|
|
|
|
return l1d[c24]
|
|
end
|
|
|
|
local closestKey = findClosest(iplt, c24)
|
|
if not closestKey then return nil end
|
|
|
|
local value = iplt[closestKey]
|
|
|
|
l1d[c24] = value
|
|
l1f[c24] = 1
|
|
|
|
return value
|
|
end
|
|
|
|
local function splitFramebufferToStrings(fb, w)
|
|
local rows = {}
|
|
|
|
for i = 1, #fb, w do
|
|
local row_chars = {}
|
|
for j = 0, w - 1 do
|
|
local val = fb[i + j]
|
|
if val ~= nil then
|
|
table.insert(row_chars, string.char(aprox(val)))
|
|
else
|
|
break
|
|
end
|
|
end
|
|
table.insert(rows, table.concat(row_chars))
|
|
end
|
|
|
|
return rows
|
|
end
|
|
|
|
local function creategfx(term, id)
|
|
local active=false
|
|
term.setGraphicsMode(2)
|
|
for i=0, #plt do
|
|
term.setPaletteColor(i,plt[i])
|
|
end
|
|
term.setGraphicsMode(false)
|
|
term.setPaletteColor(0x1, 0xFFFFFF)
|
|
term.setPaletteColor(0x2, 0xFF0000)
|
|
term.setPaletteColor(0x4, 0x00FF00)
|
|
term.setPaletteColor(0x8, 0x0000FF)
|
|
term.setPaletteColor(0x10, 0x00FFFF)
|
|
term.setPaletteColor(0x20, 0xFF00FF)
|
|
term.setPaletteColor(0x40, 0xFFFF00)
|
|
term.setPaletteColor(0x80, 0xFF6D00)
|
|
term.setPaletteColor(0x100, 0x6DFF55)
|
|
term.setPaletteColor(0x200, 0x24FFFF)
|
|
term.setPaletteColor(0x400, 0x924900)
|
|
term.setPaletteColor(0x800, 0x6D6D55)
|
|
term.setPaletteColor(0x1000, 0xDBDBAA)
|
|
term.setPaletteColor(0x2000, 0x6D00FF)
|
|
term.setPaletteColor(0x4000, 0xB6FF00)
|
|
term.setPaletteColor(0x8000, 0x000000)
|
|
local handle={
|
|
gplt=function()
|
|
return setmetatable({},{__index=plt,__usermeta=false,__pairs=function() return pairs(plt) end})
|
|
end,
|
|
spixel=function(x,y,c)
|
|
term.setPixel(x,y,aprox(c))
|
|
end,
|
|
gpixel=function(x,y)
|
|
return term.getPixel()
|
|
end,
|
|
drawFB=function(x,y,fb,w)
|
|
local f=splitFramebufferToStrings(fb,w)
|
|
term.drawPixels(x,y,f)
|
|
end,
|
|
box=function(x,y,w,h,c,fill)
|
|
c=aprox(c)
|
|
if not fill then
|
|
term.drawPixels(x,y,c,w,1)
|
|
term.drawPixels(x,y,c,1,h)
|
|
term.drawPixels(x+w-1,y,c,1,h)
|
|
term.drawPixels(x,y+h-1,c,w,1)
|
|
else
|
|
term.drawPixels(x,y,c,w,h)
|
|
end
|
|
end,
|
|
circle=function(xc,yc,r,c,fill)
|
|
c=aprox(c)
|
|
if not fill then
|
|
local x = 0
|
|
local y = r
|
|
local d = 3 - 2 * r
|
|
|
|
-- Helper function to plot all 8 symmetric points
|
|
local function plot8Points(x, y)
|
|
term.setPixel(xc + x, yc + y, c)
|
|
term.setPixel(xc - x, yc + y, c)
|
|
term.setPixel(xc + x, yc - y, c)
|
|
term.setPixel(xc - x, yc - y, c)
|
|
term.setPixel(xc + y, yc + x, c)
|
|
term.setPixel(xc - y, yc + x, c)
|
|
term.setPixel(xc + y, yc - x, c)
|
|
term.setPixel(xc - y, yc - x, c)
|
|
end
|
|
|
|
plot8Points(x, y)
|
|
|
|
while y >= x do
|
|
x = x + 1
|
|
if d > 0 then
|
|
y = y - 1
|
|
d = d + 4 * (x - y) + 10
|
|
else
|
|
d = d + 4 * x + 6
|
|
end
|
|
plot8Points(x, y)
|
|
end
|
|
else
|
|
local x = 0
|
|
local y = r
|
|
local d = 3 - 2 * r
|
|
|
|
-- Helper to fill rows using symmetry
|
|
local function fillRows(x, y)
|
|
-- Width is (2 * coordinate) + 1 to include the center column
|
|
local strX = string.rep(string.char(c), 2 * x + 1)
|
|
local strY = string.rep(string.char(c), 2 * y + 1)
|
|
-- Draw the horizontal spans
|
|
term.drawPixels(xc - x, yc + y, {strX})
|
|
term.drawPixels(xc - x, yc - y, {strX})
|
|
term.drawPixels(xc - y, yc + x, {strY})
|
|
term.drawPixels(xc - y, yc - x, {strY})
|
|
end
|
|
|
|
fillRows(x, y)
|
|
|
|
while y >= x do
|
|
x = x + 1
|
|
if d > 0 then
|
|
y = y - 1
|
|
d = d + 4 * (x - y) + 10
|
|
else
|
|
d = d + 4 * x + 6
|
|
end
|
|
fillRows(x, y)
|
|
end
|
|
end
|
|
end,
|
|
line=function(x1,y1,x2,y2,c)
|
|
x1=math.floor(x1+0.5)
|
|
y1=math.floor(y1+0.5)
|
|
x2=math.floor(x2+0.5)
|
|
y2=math.floor(y2+0.5)
|
|
|
|
c=aprox(c)
|
|
|
|
local w,h=term.getSize(2)
|
|
|
|
local dx=math.abs(x2-x1)
|
|
local dy=math.abs(y2-y1)
|
|
|
|
local sx=x1<x2 and 1 or -1
|
|
local sy=y1<y2 and 1 or -1
|
|
|
|
local err=dx-dy
|
|
|
|
while true do
|
|
|
|
if 0<x1 and x1<=w and 0<y1 and y1<=h then
|
|
term.setPixel(x1,y1,c)
|
|
end
|
|
|
|
if x1==x2 and y1==y2 then
|
|
break
|
|
end
|
|
|
|
local e2=2*err
|
|
|
|
if e2>-dy then
|
|
err=err-dy
|
|
x1=x1+sx
|
|
end
|
|
|
|
if e2<dx then
|
|
err=err+dx
|
|
y1=y1+sy
|
|
end
|
|
|
|
end
|
|
end,
|
|
setMode=function(state)
|
|
if state then
|
|
term.setGraphicsMode(2)
|
|
for i=0, #plt do
|
|
term.setPaletteColor(i,plt[i])
|
|
end
|
|
active=true
|
|
else
|
|
term.setGraphicsMode(false)
|
|
term.setPaletteColor(0x1, 0xFFFFFF)
|
|
term.setPaletteColor(0x2, 0xFF0000)
|
|
term.setPaletteColor(0x4, 0x00FF00)
|
|
term.setPaletteColor(0x8, 0x0000FF)
|
|
term.setPaletteColor(0x10, 0x00FFFF)
|
|
term.setPaletteColor(0x20, 0xFF00FF)
|
|
term.setPaletteColor(0x40, 0xFFFF00)
|
|
term.setPaletteColor(0x80, 0xFF6D00)
|
|
term.setPaletteColor(0x100, 0x6DFF55)
|
|
term.setPaletteColor(0x200, 0x24FFFF)
|
|
term.setPaletteColor(0x400, 0x924900)
|
|
term.setPaletteColor(0x800, 0x6D6D55)
|
|
term.setPaletteColor(0x1000, 0xDBDBAA)
|
|
term.setPaletteColor(0x2000, 0x6D00FF)
|
|
term.setPaletteColor(0x4000, 0xB6FF00)
|
|
term.setPaletteColor(0x8000, 0x000000)
|
|
active=false
|
|
end
|
|
end,
|
|
getMode=function()
|
|
return active
|
|
end,
|
|
size=function()
|
|
return term.getSize(2)
|
|
end,
|
|
drawRun=function(y,x1,x2,c)
|
|
term.drawPixels(x1,y,c,{string.rep(string.char(aprox(c)),x1-x2)})
|
|
end
|
|
}
|
|
return handle
|
|
end
|
|
|
|
for id,obj in pairs(kernel.cct.term) do
|
|
if obj.setGraphicsMode then
|
|
kernel.cct.gfx[id]=creategfx(obj, id)
|
|
end
|
|
end |