Advertisement
HangMan23

drawing.lua

Sep 20th, 2019
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.98 KB | None | 0 0
  1. local drawing = {}
  2.  
  3. ------------------------------------------------
  4.  
  5. local EU = require("ExtraUtilits")
  6. local io = require("io")
  7. local computer = require("computer")
  8. local serialization = require("serialization")
  9. local fs = require("filesystem")
  10. local gpu = require("component").gpu
  11.  
  12. ------------------------------------------------
  13.  
  14. function drawing.draw(x, y, image)
  15.  
  16.   local field, width, height = image.field, image.width, image.height
  17.  
  18.   for i = 1, width do
  19.  
  20.     for j = 1, height do
  21.  
  22.       if field[i][j].symbol then
  23.  
  24.         if field[i][j].background ~= gpu.getBackground() then gpu.setBackground(field[i][j].background) end
  25.  
  26.         if field[i][j].foreground ~= gpu.getForeground() then gpu.setForeground(field[i][j].foreground) end
  27.          
  28.         gpu.set(x + i - 1, y + j - 1, field[i][j].symbol)
  29.  
  30.       end
  31.  
  32.     end
  33.  
  34.   end
  35.  
  36. end
  37.  
  38. ------------------------------------------------
  39.  
  40. function drawing.load(path)
  41.  
  42.   local file = io.open(path, "r")
  43.  
  44.   local data = serialization.unserialize(file:read())
  45.  
  46.   local w, h = data.w, data.h
  47.  
  48.   local field = {}
  49.  
  50.   for i = 1, w do
  51.  
  52.     field[i] = {}
  53.  
  54.     for j = 1, h do
  55.  
  56.       field[i][j] = {}
  57.  
  58.       local line = file:read()
  59.  
  60.       if line ~= "-" then
  61.  
  62.         local backstring = string.sub(line, 1, 3)
  63.         local forestring = string.sub(line, 4, 6)
  64.         local symbol = string.sub(line, 7, 7)
  65.  
  66.         local backgroundchars = {string.sub(backstring, 1, 1), string.sub(backstring, 2, 2), string.sub(backstring, 3, 3)}
  67.         local foregroundchars = {string.sub(forestring, 1, 1), string.sub(forestring, 2, 2), string.sub(forestring, 3, 3)}
  68.    
  69.         local backRGB = {string.byte(backgroundchars[1]) or 0, string.byte(backgroundchars[2]) or 0, string.byte(backgroundchars[3]) or 0}
  70.         local foreRGB = {string.byte(foregroundchars[1]) or 0, string.byte(foregroundchars[2]) or 0, string.byte(foregroundchars[3]) or 0}
  71.  
  72.         field[i][j].background = EU.Color.Pack(table.unpack(backRGB))
  73.         field[i][j].foreground = EU.Color.Pack(table.unpack(foreRGB))
  74.         field[i][j].symbol = symbol
  75.  
  76.       end
  77.  
  78.     end
  79.  
  80.   end
  81.  
  82.   file:close()
  83.  
  84.   return {field = field, width = w, height = h}
  85.  
  86. end
  87.  
  88. ------------------------------------------------
  89.  
  90. function drawing.save(field, w, h, path)
  91.  
  92.   local file = io.open(path, "wb")
  93.  
  94.   file:write(serialization.serialize({w = w, h = h}) .. "\n")
  95.  
  96.   for i = 1, w do
  97.  
  98.     for j = 1, h do
  99.  
  100.       if field[i][j].symbol then
  101.  
  102.         local background = {EU.Color.Extract(field[i][j].background)}
  103.         local foreground = {EU.Color.Extract(field[i][j].foreground)}
  104.         local symbol = field[i][j].symbol
  105.  
  106.         local back = string.char(background[1]) .. string.char(background[2]) .. string.char(background[3])
  107.         local fore = string.char(foreground[1]) .. string.char(foreground[2]) .. string.char(foreground[3])
  108.  
  109.         file:write(back .. fore .. symbol .. "\n")
  110.  
  111.       else
  112.  
  113.         file:write("-\n")
  114.  
  115.       end
  116.  
  117.     end
  118.  
  119.   end
  120.  
  121.   file:close()
  122.  
  123. end
  124.  
  125. ------------------------------------------------
  126.  
  127. function drawing.getPixel(image, x, y)
  128.  
  129.   if not image.field[x][y].symbol then return end
  130.  
  131.   local pixel = {}
  132.  
  133.   pixel.color = {}
  134.   pixel.color.background = {}
  135.   pixel.color.foreground = {}
  136.  
  137.   pixel.color.background.color = image.field[x][y].background
  138.   pixel.color.foreground.color = image.field[x][y].foreground
  139.  
  140.   pixel.color.background.r, pixel.color.background.g, pixel.color.background.b = EU.Color.Extract(pixel.color.background.color)
  141.   pixel.color.foreground.r, pixel.color.foreground.g, pixel.color.foreground.b = EU.Color.Extract(pixel.color.foreground.color)
  142.  
  143.   pixel.symbol = image.field[x][y].symbol
  144.  
  145.   return pixel
  146.  
  147. end
  148.  
  149. ------------------------------------------------
  150.  
  151. function drawing.setPixel(image, x, y, pixel)
  152.  
  153.   if not pixel then image.field[x][y].symbol = nil return image end
  154.  
  155.   image.field[x][y].background = pixel.color.background.color
  156.   image.field[x][y].foreground = pixel.color.foreground.color
  157.   image.field[x][y].symbol = pixel.symbol
  158.  
  159.   return image
  160.  
  161. end
  162.  
  163. ------------------------------------------------
  164.  
  165. function drawing.drawPixel(x, y, pixel)
  166.  
  167.   if not pixel then return end
  168.  
  169.   if pixel.color.background.color ~= gpu.getBackground() then gpu.setBackground(pixel.color.background.color) end
  170.   if pixel.color.foreground.color ~= gpu.getForeground() then gpu.setForeground(pixel.color.foreground.color) end
  171.   gpu.set(x, y, pixel.symbol)
  172.  
  173. end
  174.  
  175. ------------------------------------------------
  176.  
  177. function drawing.setScale(image, w, h)
  178.  
  179.   image.width, image.height = w, h
  180.  
  181.   return image
  182.  
  183. end
  184.  
  185. ------------------------------------------------
  186.  
  187. function drawing.clear(image)
  188.  
  189.   local width, height = image.width, image.height
  190.  
  191.   for i = 1, width do
  192.  
  193.     image.field[i] = {}
  194.  
  195.     for j = 1, height do
  196.  
  197.       image.field[i][j] = {}
  198.  
  199.     end
  200.  
  201.   end
  202.  
  203.   return image
  204.  
  205. end
  206.  
  207. ------------------------------------------------
  208.  
  209. function drawing.image(w, h)
  210.  
  211.   local image = {field = {}, width = w, height = h}
  212.  
  213.   image = drawing.clear(image)
  214.  
  215.   return image
  216.  
  217. end
  218.  
  219. function drawing.pixel(background, foreground, symbol)
  220.  
  221.   if not symbol then return nil end
  222.  
  223.   local pixel = {}
  224.  
  225.   pixel.color = {}
  226.   pixel.color.background = {}
  227.   pixel.color.foreground = {}
  228.  
  229.   pixel.color.background.color = background
  230.   pixel.color.foreground.color = foreground
  231.  
  232.   pixel.color.background.r, pixel.color.background.g, pixel.color.background.b = EU.Color.Extract(pixel.color.background.color)
  233.   pixel.color.foreground.r, pixel.color.foreground.g, pixel.color.foreground.b = EU.Color.Extract(pixel.color.foreground.color)
  234.  
  235.   pixel.symbol = symbol
  236.  
  237.   return pixel
  238.  
  239. end
  240.  
  241. ------------------------------------------------
  242.  
  243. function drawing.filter(image, filter)
  244.  
  245.   for x = 1, image.w do
  246.  
  247.     for y = 1, image.h do
  248.  
  249.       image[x][y] = filter(image[x][y])
  250.  
  251.     end
  252.  
  253.   end
  254.  
  255.   return image
  256.  
  257. end
  258.  
  259. ------------------------------------------------
  260.  
  261. return drawing
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement