Advertisement
Guest User

PIX.lua

a guest
Jan 19th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.10 KB | None | 0 0
  1. local shl = require("shell")
  2. local com = require("computer")
  3. local cmp = require("component")
  4. local uni = require("unicode")
  5. local trm = require("term")
  6. local gpu = cmp.gpu
  7. local args = shl.parse(...)
  8. local sym = {"▄", "▀", "█", " "}
  9.  
  10. BYTE = 0
  11.  
  12. function ItoB(integer, byte)
  13.   local str = ""
  14.   for i = 1, byte do
  15.     str = string.char(integer % 256)..str
  16.     integer = bit32.rshift(integer, 8)
  17.   end
  18.   return str
  19. end
  20.  
  21. function BtoI(str)
  22.   local integer = 0
  23.   for i=1, string.len(str) do
  24.     integer = bit32.lshift(integer, 8)  + string.byte(str, i)
  25.   end
  26.   return integer
  27. end
  28.  
  29. local function getMF(x, y, w, h)
  30.   local m = {}
  31.   local clr = {}  
  32.   local max = {"one", "two"}
  33.   local f, b
  34.  
  35.   for i = x, x + w - 1 do
  36.     m[i] = {}
  37.     for j = y, y + h - 1 do
  38.       _, f, b, _, _ = gpu.get(i, j)
  39.       m[i][j] = { f, b }      
  40.       if clr[m[i][j][1]] == nil then
  41.         clr[m[i][j][1]] = {}
  42.       end
  43.       if clr[m[i][j][1]][m[i][j][2]] == nil then
  44.         clr[m[i][j][1]][m[i][j][2]] = 0
  45.       end
  46.       clr[m[i][j][1]][m[i][j][2]] = clr[m[i][j][1]][m[i][j][2]] + 1
  47.     end
  48.   end
  49.  
  50.   clr["one"] = {}
  51.   clr["one"]["two"] = 0
  52.  
  53.   for i, _ in pairs(clr) do
  54.     for j, _ in pairs(clr[i]) do
  55.       if clr[max[1]][max[2]] < clr[i][j] then
  56.         max = {i, j}
  57.       end
  58.     end
  59.   end
  60.  
  61.   local matrix = {}
  62.  
  63.   for i, _ in pairs(m) do
  64.     for j, _ in pairs(m[i]) do
  65.       if m[i][j][1] ~= max[1] or m[i][j][2] ~= max[2] then
  66.         if matrix[j] == nil then
  67.           matrix[j] = {}
  68.         end
  69.         matrix[j][i] = m[i][j]
  70.       end
  71.     end
  72.   end  
  73.  
  74.   return matrix, {w, h, max[1], max[2]}
  75. end
  76.  
  77. function isLine(x, y)
  78.   if y ~= nil and (x[1] == y[1] and x[2] == y[2] or x[1] == y[2] and x[2] == y[1] or y[1] == y[2] and (x[1] == y[1] or x[2] == y[1])) then
  79.     return true
  80.   end
  81.   return false
  82. end
  83.  
  84. function getSym(x, y, s)
  85.   if x[1] == y[1] and x[2] == y[2] then
  86.     return sym[s[1]]
  87.   elseif y[1] == y[2] then
  88.     if x[1] == y[1] then
  89.       return sym[s[1] + 2]
  90.     else
  91.       return sym[5 - s[1]]
  92.     end
  93.   else
  94.     return sym[s[2]]
  95.   end
  96. end
  97.  
  98. local function getC(m)
  99.   local clr = {}
  100.   local f, b, s
  101.   local ind
  102.   local flag
  103.  
  104.   for i, _ in pairs(m) do
  105.     for j, _ in pairs(m[i]) do
  106.       f, b = m[i][j][1], m[i][j][2]      
  107.       if clr[b] ~= nil and clr[b][f] ~= nil then
  108.         f, b = b, f
  109.         s = {2, 1}
  110.       else
  111.         if clr[f] == nil then
  112.           clr[f] = {}
  113.         end
  114.         if clr[f][b] == nil then
  115.           clr[f][b] = {}
  116.         end
  117.         s = {1, 2}
  118.       end
  119.      
  120.       flag = false
  121.       ind = #clr[f][b] + 1
  122.      
  123.       if isLine(m[i][j], m[i][j-1]) then
  124.         clr[f][b][ind] = {j, i, sym[s[1]]}
  125.         local k = j - 1
  126.  
  127.         while isLine(m[i][j], m[i][k-1]) do
  128.           clr[f][b][ind][3] = getSym(m[i][j], m[i][k], s)..clr[f][b][ind][3]
  129.           m[i][k] = nil
  130.           clr[f][b][ind][1] = clr[f][b][ind][1] - 1
  131.           k = k - 1
  132.         end
  133.  
  134.         clr[f][b][ind][1] = clr[f][b][ind][1] - 1
  135.         clr[f][b][ind][3] = getSym(m[i][j], m[i][k], s)..clr[f][b][ind][3]
  136.         m[i][k] = nil
  137.         flag = true
  138.       end
  139.  
  140.  
  141.       if isLine(m[i][j], m[i][j+1]) then
  142.         if clr[f][b][ind] == nil then
  143.           clr[f][b][ind] = {j, i, sym[s[1]]}
  144.         end
  145.         local k = j + 1
  146.  
  147.         while isLine(m[i][j], m[i][k+1]) do
  148.           clr[f][b][ind][3] = clr[f][b][ind][3]..getSym(m[i][j], m[i][k], s)
  149.           m[i][k] = nil
  150.           k = k + 1
  151.         end
  152.  
  153.         clr[f][b][ind][3] = clr[f][b][ind][3]..getSym(m[i][j], m[i][k], s)
  154.         m[i][k] = nil
  155.         flag = true        
  156.      end
  157.       if flag then
  158.         m[i][j] = nil
  159.       end
  160.     end
  161.   end
  162.                  
  163.   for i, _ in pairs(m) do
  164.     for j, _ in pairs(m[i]) do
  165.       f, b = m[i][j][1], m[i][j][2]
  166.       if f == b  then
  167.         if clr[f] ~= nil then
  168.           local k, val = pairs(clr[f])
  169.           local key, _ = k(val)
  170.           clr[f][key][#clr[f][key] + 1] = {j, i, sym[3]}
  171.         else
  172.           clr[f] = {}
  173.           clr[f][b] = {}
  174.           clr[f][b][1] = {j, i, sym[3]}
  175.         end
  176.       elseif clr[b] ~= nil and clr[b][f] ~= nil then
  177.         clr[b][f][#clr[b][f] + 1] = {j, i, sym[2]}
  178.       else
  179.         if clr[f] == nil then
  180.           clr[f] = {}
  181.         end        
  182.         if clr[f][b] == nil then
  183.           clr[f][b] = {}
  184.         end
  185.         clr[f][b][#clr[f][b] + 1] = {j, i, sym[1]}
  186.       end      
  187.     end
  188.   end
  189.  
  190.   for i, _ in pairs(clr) do
  191.     for j, _ in pairs(clr[i]) do
  192.       if #clr[i][j] == {} then
  193.         clr[i][j] = nil
  194.       end
  195.     end
  196.     if #clr[i] == {} then
  197.       clr[i] = nil
  198.     end
  199.   end
  200.  
  201.   return clr
  202. end
  203.  
  204.  
  205. function codePIX(x, y, w, h)
  206.   local matrix, fone = getMF(x, y, w, h)  
  207.  
  208.   local clr = getC(matrix)
  209.  
  210.   file = io.open("tresh.PIX", "wb")
  211.  
  212.   file:write(ItoB(fone[1], 1)..ItoB(fone[2], 1)..ItoB(fone[3], 3)..ItoB(fone[4], 3)..ItoB(#clr, 2))
  213.   s(1 + 1 + 3 + 3 + 2)
  214.   for i, _ in pairs(clr) do
  215.     file:write(ItoB(i, 3)..ItoB(#clr[i], 2))
  216.     s(3 + 2)
  217.     for j, _ in pairs(clr[i]) do
  218.       file:write(ItoB(j, 3)..ItoB(#clr[i][j], 2))
  219.       s(3 + 2)
  220.       for k, _ in pairs(clr[i][j]) do
  221.         file:write(ItoB(clr[i][j][k][1], 1)..ItoB(clr[i][j][k][2], 1)..ItoB(#clr[i][j][k][3], 1))
  222.         s(1 + 1 + 1 + math.ceil(#clr[i][j][k][3] / 4))
  223.         local ind = 0
  224.         for l=1, #clr[i][j][k][3] do
  225.           for ij=1, #sym do
  226.             if uni.sub(#clr[i][j][k][3], l, l) == sym[ij] then
  227.               ind = ind + ij - 1
  228.             end
  229.           end
  230.         end
  231.         file:write(ItoB(ind, math.ceil(#clr[i][j][k][3] / 4)))
  232.       end
  233.     end
  234.   end
  235.  
  236.   file:close()
  237.  
  238.   return fone, clr
  239. end
  240.  
  241. function s(n)
  242.   BYTE = BYTE + n
  243. end
  244.  
  245. function drawPIX(fone, clr)
  246.   shl.execute("b")
  247.   shl.execute("cls")
  248.   time = com.uptime()
  249.   gpu.setForeground(fone[3])
  250.   gpu.setBackground(fone[4])
  251.   gpu.fill(1,1,fone[1],fone[2], "▄")
  252.   for i, _ in pairs(clr) do
  253.     gpu.setForeground(i)
  254.     for j, _ in pairs(clr[i]) do
  255.       gpu.setBackground(j)
  256.       for k, _ in pairs(clr[i][j]) do
  257.         gpu.set(clr[i][j][k][1], clr[i][j][k][2], clr[i][j][k][3])
  258.       end
  259.     end
  260.   end
  261.   time = com.uptime() - time
  262.   gpu.setForeground(0xffffff)
  263.   gpu.setBackground(0x000000)
  264.   print(time)
  265.   print(BYTE / 1024)
  266. end
  267.  
  268.  
  269.  
  270.  
  271. drawPIX(codePIX(tonumber(args[1]), tonumber(args[2]), tonumber(args[3]), tonumber(args[4])))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement