1
0
mirror of https://github.com/LDDestroier/CC/ synced 2025-06-03 03:54:04 +00:00

Added extra input to transformation functions

Now, the third argument for char/text/back transformation functions will be the char/text/back located on the X/Y position of the buffer. If there is no such position on the window's buffer, it will be `nil`.
The `setCursorPos` function now floors inputs so as to not break when receiving non-integer arguments.
This commit is contained in:
LDDestroier 2020-01-05 21:55:51 -05:00 committed by GitHub
parent 74bffa981d
commit 4f52154f34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -36,9 +36,6 @@ local lval = {
end end
} }
local table_insert = table.insert
local math_floor = math.floor
for i = 1, 16 do for i = 1, 16 do
lval.to_blit[2 ^ (i - 1)] = ("0123456789abcdef"):sub(i, i) lval.to_blit[2 ^ (i - 1)] = ("0123456789abcdef"):sub(i, i)
lval.to_colors[("0123456789abcdef"):sub(i, i)] = 2 ^ (i - 1) lval.to_colors[("0123456789abcdef"):sub(i, i)] = 2 ^ (i - 1)
@ -76,17 +73,17 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
local c = 1 -- current blitList entry local c = 1 -- current blitList entry
if type(onlyY) == "table" then if type(onlyY) == "table" then
table_insert(windows, 1, onlyY) table.insert(windows, 1, onlyY)
onlyY = nil onlyY = nil
end end
if type(onlyX2) == "table" then if type(onlyX2) == "table" then
table_insert(windows, 1, onlyX2) table.insert(windows, 1, onlyX2)
onlyX2 = nil onlyX2 = nil
end end
if type(onlyX1) == "table" then if type(onlyX1) == "table" then
table_insert(windows, 1, onlyX1) table.insert(windows, 1, onlyX1)
onlyX1 = nil onlyX1 = nil
end end
@ -94,11 +91,11 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
local AMNT_OF_BLITS = 0 -- how many blit calls are there? local AMNT_OF_BLITS = 0 -- how many blit calls are there?
local cx, cy -- each window's absolute X and Y local cx, cy -- each window's absolute X and Y
local char_cx, text_cx, back_cx -- each window's transformed absolute X's in table form local char_cx, text_cx, back_cx -- each window's transformed absolute X's in table form
local char_cy, text_cy, back_cy -- each window's transformed absolute X's in table form local char_cy, text_cy, back_cy -- each window's transformed absolute X's in table form
local buffer -- each window's buffer local newChar, newText, newBack -- if the transformation function declares a new dot, this is it
local newChar, newText, newBack, newBuff -- if the transformation function declares a new dot, this is it local tBlit, tSetCursorPos -- each baseTerm's blit and setCursorPos functions
local baseTerms = {} local baseTerms = {}
for i = 1, #windows do for i = 1, #windows do
@ -111,15 +108,8 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
bT = output.meta.baseTerm bT = output.meta.baseTerm
end end
scr_x, scr_y = bT.getSize() scr_x, scr_y = bT.getSize()
-- try entire buffer transformations tBlit = bT.blit
for i = #windows, 1, -1 do tSetCursorPos = bT.setCursorPos
if bT_list[i] then
if windows[i].meta.metaTransformation then
-- metaTransformation functions needn't return a value
windows[i].meta.metaTransformation(windows[i].meta)
end
end
end
for y = onlyY or 1, onlyY or scr_y do for y = onlyY or 1, onlyY or scr_y do
screenBuffer[1][y] = {} screenBuffer[1][y] = {}
screenBuffer[2][y] = {} screenBuffer[2][y] = {}
@ -129,10 +119,13 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
for x = onlyX1 or 1, math.min(scr_x, onlyX2 or scr_x) do for x = onlyX1 or 1, math.min(scr_x, onlyX2 or scr_x) do
for i = #windows, 1, -1 do for i = #windows, 1, -1 do
if bT_list[i] then if bT_list[i] then
newChar, newText, newBack = nil
if windows[i].meta.visible then if windows[i].meta.visible then
buffer = windows[i].meta.buffer buffer = windows[i].meta.buffer
newChar = (buffer[1][y] or {})[x]
newText = (buffer[2][y] or {})[x]
newBack = (buffer[3][y] or {})[x]
cx = 1 + x + -windows[i].meta.x cx = 1 + x + -windows[i].meta.x
cy = 1 + y + -windows[i].meta.y cy = 1 + y + -windows[i].meta.y
char_cx, text_cx, back_cx = cx, cx, cx char_cx, text_cx, back_cx = cx, cx, cx
@ -140,26 +133,26 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
-- try char transformation -- try char transformation
if windows[i].meta.charTransformation then if windows[i].meta.charTransformation then
char_cx, char_cy, newChar = windows[i].meta.charTransformation(cx, cy, windows[i].meta) char_cx, char_cy, newChar = windows[i].meta.charTransformation(cx, cy, newChar, windows[i].meta)
if char_cx ~= math_floor(char_cx) or char_cy ~= math_floor(char_cy) then char_cx = math.floor(char_cx or cx)
char_cy = math.floor(char_cy or cy)
if char_cx ~= math.floor(char_cx) or char_cy ~= math.floor(char_cy) then
newChar = " " newChar = " "
end end
char_cx = math_floor(char_cx)
char_cy = math_floor(char_cy)
end end
-- try text transformation -- try text transformation
if windows[i].meta.textTransformation then if windows[i].meta.textTransformation then
text_cx, text_cy, newText = windows[i].meta.textTransformation(cx, cy, windows[i].meta) text_cx, text_cy, newText = windows[i].meta.textTransformation(cx, cy, newText, windows[i].meta)
text_cx = math_floor(text_cx) text_cx = math.floor(text_cx or cx)
text_cy = math_floor(text_cy) text_cy = math.floor(text_cy or cy)
end end
-- try back transformation -- try back transformation
if windows[i].meta.backTransformation then if windows[i].meta.backTransformation then
back_cx, back_cy, newBack = windows[i].meta.backTransformation(cx, cy, windows[i].meta) back_cx, back_cy, newBack = windows[i].meta.backTransformation(cx, cy, newBack, windows[i].meta)
back_cx = math_floor(back_cx) back_cx = math.floor(back_cx or cx)
back_cy = math_floor(back_cy) back_cy = math.floor(back_cy or cy)
end end
if check(buffer, char_cx, char_cy) or check(buffer, text_cx, text_cy) or check(buffer, back_cx, back_cy) then if check(buffer, char_cx, char_cy) or check(buffer, text_cx, text_cy) or check(buffer, back_cx, back_cy) then
@ -178,7 +171,7 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
screenBuffer[3][y][x] = screenBuffer[3][y][x] or windont.default.backColor screenBuffer[3][y][x] = screenBuffer[3][y][x] or windont.default.backColor
if check(screenBuffer, x, y) then if check(screenBuffer, x, y) then
if check(screenBuffer, -1 + x, y) then if check(screenBuffer, x - 1, y) then
blitList[c][1] = blitList[c][1] .. screenBuffer[1][y][x] blitList[c][1] = blitList[c][1] .. screenBuffer[1][y][x]
blitList[c][2] = blitList[c][2] .. screenBuffer[2][y][x] blitList[c][2] = blitList[c][2] .. screenBuffer[2][y][x]
blitList[c][3] = blitList[c][3] .. screenBuffer[3][y][x] blitList[c][3] = blitList[c][3] .. screenBuffer[3][y][x]
@ -193,9 +186,9 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
end end
end end
for k,v in pairs(blitList) do for k,v in pairs(blitList) do
bT.setCursorPos(k, y) tSetCursorPos(k, y)
bT.blit(v[1], v[2], v[3]) tBlit(v[1], v[2], v[3])
AMNT_OF_BLITS = 1 + AMNT_OF_BLITS AMNT_OF_BLITS = AMNT_OF_BLITS + 1
end end
end end
end end
@ -204,7 +197,7 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...)
windont.info.BLIT_CALLS = AMNT_OF_BLITS windont.info.BLIT_CALLS = AMNT_OF_BLITS
windont.info.LAST_RENDER_WINDOWS = windows windont.info.LAST_RENDER_WINDOWS = windows
windont.info.LAST_RENDER_TIME = cTime windont.info.LAST_RENDER_TIME = cTime
windont.info.LAST_RENDER_DURATION = lval.getTime() + -cTime windont.info.LAST_RENDER_DURATION = lval.getTime() - cTime
end end
@ -227,10 +220,10 @@ windont.newWindow = function( x, y, width, height, misc )
local output = {} local output = {}
misc = misc or {} misc = misc or {}
local meta = { local meta = {
x = lval.expect(x, 1), -- x position of the window x = lval.expect(x, 1), -- x position of the window
y = lval.expect(y, 1), -- y position of the window y = lval.expect(y, 1), -- y position of the window
width = width, -- width of the buffer width = width, -- width of the buffer
height = height, -- height of the buffer height = height, -- height of the buffer
buffer = lval.expect(misc.buffer, {}, "table"), -- stores contents of terminal in buffer[1][y][x] format buffer = lval.expect(misc.buffer, {}, "table"), -- stores contents of terminal in buffer[1][y][x] format
renderBuddies = lval.expect(misc.renderBuddies, {}, "table"), -- renders any other window objects stored here after rendering here renderBuddies = lval.expect(misc.renderBuddies, {}, "table"), -- renders any other window objects stored here after rendering here
baseTerm = lval.expect(misc.baseTerm, windont.default.baseTerm, "table"), -- base terminal for which this window draws on baseTerm = lval.expect(misc.baseTerm, windont.default.baseTerm, "table"), -- base terminal for which this window draws on
@ -239,13 +232,12 @@ windont.newWindow = function( x, y, width, height, misc )
charTransformation = lval.expect(misc.charTransformation, nil, "function"), -- function that transforms the characters of the window charTransformation = lval.expect(misc.charTransformation, nil, "function"), -- function that transforms the characters of the window
textTransformation = lval.expect(misc.textTransformation, nil, "function"), -- function that transforms the text colors of the window textTransformation = lval.expect(misc.textTransformation, nil, "function"), -- function that transforms the text colors of the window
backTransformation = lval.expect(misc.backTransformation, nil, "function"), -- function that transforms the BG colors of the window backTransformation = lval.expect(misc.backTransformation, nil, "function"), -- function that transforms the BG colors of the window
metaTransformation = lval.expect(misc.miscTransformation, nil, "function"), -- function that transforms the whole output.meta function
cursorX = lval.expect(misc.cursorX, 1), cursorX = lval.expect(misc.cursorX, 1),
cursorY = lval.expect(misc.cursorY, 1), cursorY = lval.expect(misc.cursorY, 1),
textColor = lval.expect(misc.textColor, windont.default.textColor, "string"), -- current text color textColor = lval.expect(misc.textColor, windont.default.textColor, "string"), -- current text color
backColor = lval.expect(misc.backColor, windont.default.backColor, "string"), -- current background color backColor = lval.expect(misc.backColor, windont.default.backColor, "string"), -- current background color
blink = lval.expect(misc.blink, windont.default.blink, "boolean"), -- cursor blink blink = lval.expect(misc.blink, windont.default.blink, "boolean"), -- cursor blink
alwaysRender = lval.expect(misc.alwaysRender, windont.default.alwaysRender, "boolean"), -- render after every terminal operation alwaysRender = lval.expect(misc.alwaysRender, windont.default.alwaysRender, "boolean"), -- render after every terminal operation
@ -290,11 +282,7 @@ windont.newWindow = function( x, y, width, height, misc )
meta.cursorX = meta.cursorX + 1 meta.cursorX = meta.cursorX + 1
end end
if meta.alwaysRender then if meta.alwaysRender then
output.redraw( output.redraw(meta.x + initX - 1, meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1)
-1 + meta.x + initX,
-1 + meta.x + meta.cursorX,
-1 + meta.y + meta.cursorY
)
end end
end end
@ -311,26 +299,19 @@ windont.newWindow = function( x, y, width, height, misc )
end end
end end
if meta.alwaysRender then if meta.alwaysRender then
output.redraw( output.redraw(meta.x + initX - 1, meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1)
-1 + meta.x + initX,
-1 + meta.x + meta.cursorX,
-1 + meta.y + meta.cursorY
)
end end
end end
output.setCursorPos = function(x, y) output.setCursorPos = function(x, y)
assert(type(x) == "number", "argument #1 must be number, got " .. type(x)) assert(type(x) == "number", "argument #1 must be number, got " .. type(x))
assert(type(y) == "number", "argument #2 must be number, got " .. type(y)) assert(type(y) == "number", "argument #2 must be number, got " .. type(y))
meta.cursorX, meta.cursorY = x, y meta.cursorX, meta.cursorY = math.floor(x), math.floor(y)
if meta.alwaysRender then if meta.alwaysRender then
if bT == output then if bT == output then
bT = output.meta.baseTerm bT = output.meta.baseTerm
end end
bT.setCursorPos( bT.setCursorPos(meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1)
-1 + meta.x + meta.cursorX,
-1 + meta.y + meta.cursorY
)
end end
end end
@ -384,12 +365,7 @@ windont.newWindow = function( x, y, width, height, misc )
meta.buffer[3][meta.cursorY] = nil meta.buffer[3][meta.cursorY] = nil
meta.buffer = meta.newBuffer(meta.width, meta.height, " ", meta.textColor, meta.backColor, meta.buffer) meta.buffer = meta.newBuffer(meta.width, meta.height, " ", meta.textColor, meta.backColor, meta.buffer)
if meta.alwaysRender then if meta.alwaysRender then
bT.setCursorPos(meta.x, -1 + meta.y + meta.cursorY) output.redraw(meta.x, meta.x + meta.width - 1, meta.y + meta.cursorY - 1)
bT.blit(
(" "):rep(meta.width),
(meta.textColor):rep(meta.width),
(meta.backColor):rep(meta.width)
)
end end
end end
@ -416,7 +392,7 @@ windont.newWindow = function( x, y, width, height, misc )
meta.buffer = meta.newBuffer(meta.width, meta.height, " ", meta.textColor, meta.backColor) meta.buffer = meta.newBuffer(meta.width, meta.height, " ", meta.textColor, meta.backColor)
end end
if meta.alwaysRender then if meta.alwaysRender then
if math_floor(amplitude) ~= 0 then if math.floor(amplitude) ~= 0 then
output.redraw() output.redraw()
end end
end end
@ -434,8 +410,8 @@ windont.newWindow = function( x, y, width, height, misc )
output.reposition = function(x, y, width, height) output.reposition = function(x, y, width, height)
assert(type(x) == "number", "bad argument #1 (expected number, got " .. type(x) .. ")") assert(type(x) == "number", "bad argument #1 (expected number, got " .. type(x) .. ")")
assert(type(y) == "number", "bad argument #2 (expected number, got " .. type(y) .. ")") assert(type(y) == "number", "bad argument #2 (expected number, got " .. type(y) .. ")")
meta.x = math_floor(x) meta.x = math.floor(x)
meta.y = math_floor(y) meta.y = math.floor(y)
if width then if width then
assert(type(width) == "number", "bad argument #3 (expected number, got " .. type(width) .. ")") assert(type(width) == "number", "bad argument #3 (expected number, got " .. type(width) .. ")")
assert(type(height) == "number", "bad argument #4 (expected number, got " .. type(height) .. ")") assert(type(height) == "number", "bad argument #4 (expected number, got " .. type(height) .. ")")
@ -450,8 +426,8 @@ windont.newWindow = function( x, y, width, height, misc )
output.restoreCursor = function() output.restoreCursor = function()
bT.setCursorPos( bT.setCursorPos(
math.max(0, -1 + meta.x + meta.cursorX), math.max(0, meta.x + meta.cursorX - 1),
math.max(0, -1 + meta.y + meta.cursorY) math.max(0, meta.y + meta.cursorY - 1)
) )
bT.setCursorBlink(meta.blink) bT.setCursorBlink(meta.blink)
end end