MeXaN1cK

PIXconv

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