mirror of
				https://github.com/LDDestroier/CC/
				synced 2025-10-31 15:32:59 +00:00 
			
		
		
		
	Update windont.lua
This commit is contained in:
		| @@ -24,18 +24,27 @@ local lval = { | |||||||
| 	end, | 	end, | ||||||
|  |  | ||||||
| 	-- check if space on screenBuffer is transparent | 	-- check if space on screenBuffer is transparent | ||||||
| 	check = function(buff, x, y, blitLayer) |  | ||||||
| 		if buff[blitLayer or 1][y] then | 	check = function(buffer, x, y, blitLayer) | ||||||
| 			return (blitLayer or buff[1][y][x]) and ( | 		if buffer[blitLayer or 1][y] then | ||||||
| 				(not buff[blitLayer or 2][y][x] or buff[blitLayer or 2][y][x] ~= "-") or | 			if blitLayer then | ||||||
| 				(not buff[blitLayer or 3][y][x] or buff[blitLayer or 3][y][x] ~= "-") | 				return (buffer[blitLayer][y][x] and buffer[blitLayer][y][x] ~= "-") | ||||||
| 			) and ( | 			else | ||||||
| 				not (buff[1][y][x] == " " and buff[3][y][x] == "-") | 				if (not buffer[2][y][x] or buffer[2][y][x] == "-") and (not buffer[3][y][x] or buffer[3][y][x] == "-") then | ||||||
| 			) | 					return false | ||||||
|  | 				elseif (not buffer[3][y][x] or buffer[3][y][x] == "-") and buffer[1][y][x] == " " then | ||||||
|  | 					return false | ||||||
|  | 				else | ||||||
|  | 					return true | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 	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) | ||||||
| @@ -67,23 +76,24 @@ windont.render = function(onlyX1, onlyX2, onlyY, ...) | |||||||
| 	local windows = {...} | 	local windows = {...} | ||||||
| 	local bT | 	local bT | ||||||
| 	local check = lval.check | 	local check = lval.check | ||||||
|  |  | ||||||
| 	local screenBuffer = {{}, {}, {}} | 	local screenBuffer = {{}, {}, {}} | ||||||
| 	local scr_x, scr_y | 	local scr_x, scr_y | ||||||
| 	local blitList = {}	-- list of blit commands per line | 	local blitList = {}	-- list of blit commands per line | ||||||
| 	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 | ||||||
|  |  | ||||||
| @@ -91,11 +101,12 @@ 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 newChar, newText, newBack	-- if the transformation function declares a new dot, this is it | 	local buffer							-- each window's buffer | ||||||
| 	local tBlit, tSetCursorPos		-- each baseTerm's blit and setCursorPos functions | 	local newChar, newText, newBack			-- if the transformation function declares a new dot, this is it | ||||||
|  | 	local oriChar, oriText, oriBack | ||||||
|  |  | ||||||
| 	local baseTerms = {} | 	local baseTerms = {} | ||||||
| 	for i = 1, #windows do | 	for i = 1, #windows do | ||||||
| @@ -108,8 +119,15 @@ 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() | ||||||
| 		tBlit = bT.blit | 		-- try entire buffer transformations | ||||||
| 		tSetCursorPos = bT.setCursorPos | 		for i = #windows, 1, -1 do | ||||||
|  | 			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] = {} | ||||||
| @@ -119,40 +137,41 @@ 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 | ||||||
| 							char_cy, text_cy, back_cy = cy, cy, cy | 							char_cy, text_cy, back_cy = cy, cy, cy | ||||||
|  |  | ||||||
|  | 							oriChar = (buffer[1][cy] or {})[cx] | ||||||
|  | 							oriText = (buffer[2][cy] or {})[cx] | ||||||
|  | 							oriBack = (buffer[3][cy] or {})[cx] | ||||||
|  |  | ||||||
| 							-- 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, newChar, windows[i].meta) | 								char_cx, char_cy, newChar = windows[i].meta.charTransformation(cx, cy, {oriChar, oriText, oriBack}, windows[i].meta) | ||||||
| 								char_cx = math.floor(char_cx or cx) | 								if char_cx ~= math_floor(char_cx) or char_cy ~= math_floor(char_cy) then | ||||||
| 								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 or cx) | ||||||
|  | 								char_cy = math_floor(char_cy or 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, newText, windows[i].meta) | 								text_cx, text_cy, newText = windows[i].meta.textTransformation(cx, cy, {oriChar, oriText, oriBack}, windows[i].meta) | ||||||
| 								text_cx = math.floor(text_cx or cx) | 								text_cx = math_floor(text_cx or cx) | ||||||
| 								text_cy = math.floor(text_cy or 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, newBack, windows[i].meta) | 								back_cx, back_cy, newBack = windows[i].meta.backTransformation(cx, cy, {oriChar, oriText, oriBack}, windows[i].meta) | ||||||
| 								back_cx = math.floor(back_cx or cx) | 								back_cx = math_floor(back_cx or cx) | ||||||
| 								back_cy = math.floor(back_cy or 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 | ||||||
| @@ -171,7 +190,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, x - 1, y) then | 					if check(screenBuffer, -1 + x, 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] | ||||||
| @@ -186,9 +205,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 | ||||||
| 				tSetCursorPos(k, y) | 				bT.setCursorPos(k, y) | ||||||
| 				tBlit(v[1], v[2], v[3]) | 				bT.blit(v[1], v[2], v[3]) | ||||||
| 				AMNT_OF_BLITS = AMNT_OF_BLITS + 1 | 				AMNT_OF_BLITS = 1 + AMNT_OF_BLITS | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
| @@ -197,7 +216,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 | ||||||
|  |  | ||||||
| @@ -220,10 +239,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 | ||||||
| @@ -232,12 +251,13 @@ 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 | ||||||
| @@ -282,7 +302,11 @@ 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(meta.x + initX - 1, meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1) | 			output.redraw( | ||||||
|  | 				-1 + meta.x + initX, | ||||||
|  | 				-1 + meta.x + meta.cursorX, | ||||||
|  | 				-1 + meta.y + meta.cursorY | ||||||
|  | 			) | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| @@ -299,7 +323,11 @@ windont.newWindow = function( x, y, width, height, misc ) | |||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if meta.alwaysRender then | 		if meta.alwaysRender then | ||||||
| 			output.redraw(meta.x + initX - 1, meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1) | 			output.redraw( | ||||||
|  | 				-1 + meta.x + initX, | ||||||
|  | 				-1 + meta.x + meta.cursorX, | ||||||
|  | 				-1 + meta.y + meta.cursorY | ||||||
|  | 			) | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| @@ -311,7 +339,10 @@ windont.newWindow = function( x, y, width, height, misc ) | |||||||
| 			if bT == output then | 			if bT == output then | ||||||
| 				bT = output.meta.baseTerm | 				bT = output.meta.baseTerm | ||||||
| 			end | 			end | ||||||
| 			bT.setCursorPos(meta.x + meta.cursorX - 1, meta.y + meta.cursorY - 1) | 			bT.setCursorPos( | ||||||
|  | 				-1 + meta.x + meta.cursorX, | ||||||
|  | 				-1 + meta.y + meta.cursorY | ||||||
|  | 			) | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| @@ -365,7 +396,12 @@ 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 | ||||||
| 			output.redraw(meta.x, meta.x + meta.width - 1, meta.y + meta.cursorY - 1) | 			bT.setCursorPos(meta.x, -1 + meta.y + meta.cursorY) | ||||||
|  | 			bT.blit( | ||||||
|  | 				(" "):rep(meta.width), | ||||||
|  | 				(meta.textColor):rep(meta.width), | ||||||
|  | 				(meta.backColor):rep(meta.width) | ||||||
|  | 			) | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| @@ -392,7 +428,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 | ||||||
| @@ -410,8 +446,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) .. ")") | ||||||
| @@ -426,8 +462,8 @@ windont.newWindow = function( x, y, width, height, misc ) | |||||||
|  |  | ||||||
| 	output.restoreCursor = function() | 	output.restoreCursor = function() | ||||||
| 		bT.setCursorPos( | 		bT.setCursorPos( | ||||||
| 			math.max(0, meta.x + meta.cursorX - 1), | 			math.max(0, -1 + meta.x + meta.cursorX), | ||||||
| 			math.max(0, meta.y + meta.cursorY - 1) | 			math.max(0, -1 + meta.y + meta.cursorY) | ||||||
| 		) | 		) | ||||||
| 		bT.setCursorBlink(meta.blink) | 		bT.setCursorBlink(meta.blink) | ||||||
| 	end | 	end | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 LDDestroier
					LDDestroier