summaryrefslogtreecommitdiff
path: root/gpu.lua
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2021-02-21 14:45:08 -0600
committercheapie <no-email-for-you@example.com>2021-02-21 14:45:08 -0600
commita5ca8f19b77d03f4897fe64ea70f3c9f7365034e (patch)
tree1daea979bb382948f678a46a99a1a6afac955a66 /gpu.lua
parentf62c9932b4b4fc9c74555448c8321c5cdd49edb6 (diff)
downloaddigistuff-a5ca8f19b77d03f4897fe64ea70f3c9f7365034e.tar
digistuff-a5ca8f19b77d03f4897fe64ea70f3c9f7365034e.tar.gz
digistuff-a5ca8f19b77d03f4897fe64ea70f3c9f7365034e.tar.bz2
digistuff-a5ca8f19b77d03f4897fe64ea70f3c9f7365034e.tar.xz
digistuff-a5ca8f19b77d03f4897fe64ea70f3c9f7365034e.zip
Add "sendregion" command to GPU
This allows part of a buffer to be sent instead of the whole thing, meaning that driving digiscreen arrays can now be done with fewer commands and no temporary buffers. This also greatly improves the speed of doing so, and I suppose also allows hardware-accelerated scrolling if your display is smaller than 64x64...
Diffstat (limited to 'gpu.lua')
-rw-r--r--gpu.lua27
1 files changed, 27 insertions, 0 deletions
diff --git a/gpu.lua b/gpu.lua
index 87ff6ea..9529002 100644
--- a/gpu.lua
+++ b/gpu.lua
@@ -201,6 +201,33 @@ local function runcommand(pos,meta,command)
if type(buffer) == "table" then
digiline:receptor_send(pos,digiline.rules.default,command.channel,buffer)
end
+ elseif command.command == "sendregion" then
+ if type(command.buffer) ~= "number" or type(command.channel) ~= "string" then return end
+ local bufnum = math.floor(command.buffer)
+ if bufnum < 0 or bufnum > 7 then return end
+ local buffer = meta:get_string("buffer"..bufnum)
+ if string.len(buffer) == 0 then return end
+ buffer = minetest.deserialize(buffer)
+ if type(buffer) ~= "table" then return end
+ if type(command.x1) ~= "number" or type(command.x2) ~= "number" or type(command.y1) ~= "number" or type(command.x2) ~= "number" then return end
+ local x1 = math.min(64,math.floor(command.x1))
+ local y1 = math.min(64,math.floor(command.y1))
+ local x2 = math.min(64,math.floor(command.x2))
+ local y2 = math.min(64,math.floor(command.y2))
+ if x1 < 1 or y1 < 1 or x2 < 1 or y2 < 1 then return end
+ x2 = math.min(x2,buffer.xsize)
+ y2 = math.min(y2,buffer.ysize)
+ if x1 > x2 or y1 > y2 then return end
+ local tempbuf = {}
+ for y=y1,y2,1 do
+ local dsty = y-y1+1
+ tempbuf[dsty] = {}
+ for x=x1,x2,1 do
+ local dstx = x-x1+1
+ tempbuf[dsty][dstx] = buffer[y][x]
+ end
+ end
+ digiline:receptor_send(pos,digiline.rules.default,command.channel,tempbuf)
elseif command.command == "drawrect" then
if type(command.buffer) ~= "number" or type(command.x1) ~= "number" or type(command.y1) ~= "number" or type(command.x2) ~= "number" or type(command.y2) ~= "number" then return end
local bufnum = math.floor(command.buffer)