Advertisement
MeXaN1cK

JPGdraw

Mar 1st, 2017
447
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.48 KB | None | 0 0
  1. local cmp = require("component")
  2. local com = require("computer")
  3. local gpu = cmp.gpu
  4. local trm = require("term")
  5. local shl = require("shell")
  6. local args = shl.parse(...)
  7.  
  8. HEX = "0123456789ABCDEF"
  9. --[[             MARKER                 ]]
  10.  
  11. function R(ind)
  12.   return STR:byte(ind) % 16
  13. end
  14.  
  15. function L(ind)
  16.   return math.floor( STR:byte(ind) / 16 )
  17. end
  18.  
  19. function getB(ind) local right, left = R(ind) + 1, L(ind) + 1
  20.   return HEX:sub(left, left)..HEX:sub(right, right)
  21. end
  22.  
  23. function Common()
  24.   i = len
  25. end
  26.  
  27. function DB() local IDI, x, y = R(i) + 1, 1, 1
  28.   i = i + 1
  29.   while i < len do
  30.     while y > 1 and x < 8 do
  31.       masDB[IDI][y][x] = STR:byte(i) i = i + 1
  32.       y, x = y - 1, x + 1
  33.     end
  34.     if y <= 8 and x <= 8 then
  35.       masDB[IDI][y][x] = STR:byte(i) i = i + 1
  36.     end
  37.     if x == 8 then y = y + 1
  38.     else x = x + 1 end
  39.     while y < 8 and x > 1 do
  40.       masDB[IDI][y][x] = STR:byte(i) i = i + 1
  41.       y, x = y + 1, x - 1
  42.     end
  43.     if y <= 8 and x <= 8 then
  44.       masDB[IDI][y][x] = STR:byte(i) i = i + 1
  45.     end
  46.     if y == 8 then x = x + 1
  47.     else y = y + 1  end
  48.   end
  49. end
  50.  
  51. function DA() local YCbCr, BYTECODE, BYTEpos, comp = {}, "", 1, STR:byte(i)
  52.   local function DrawFrame(coordX, coordY) local Y, Cb_avr, Cr_avr, value
  53.     local function getTable(INDEX) local DC_ind, AC_ind, x, y, TABLE = YCbCr[INDEX][1], YCbCr[INDEX][2], 1, 1, {{}, {}, {}, {}, {}, {}, {}, {}}
  54.       local CODE
  55.       local function getKEY(ACDC_TABLE) local key = ""
  56.         while ACDC_TABLE[key] == nil do
  57.           key = key..BYTECODE:sub(BYTEpos, BYTEpos)
  58.           BYTEpos = BYTEpos + 1
  59.         end
  60.         return ACDC_TABLE[key]
  61.       end
  62.  
  63.       local function getCOEF(VALUE) local COEF = 0
  64.    
  65.         CODE = BYTECODE:sub(BYTEpos, BYTEpos + VALUE - 1)
  66.         BYTEpos = BYTEpos + VALUE
  67.         for j=1, #CODE do
  68.           COEF = COEF * 2 + tonumber(CODE:sub(j, j))
  69.         end
  70.         if #CODE ~= 0 and CODE:sub(1, 1) == "0" then
  71.           COEF = COEF - 2 ^ #CODE + 1
  72.         end
  73.         return COEF
  74.       end
  75.  
  76.       local function step(n)
  77.     TABLE[y][x] = n * masDB[QUAT[INDEX] + 1][y][x]
  78.         if (x + y) % 2 == 1 then
  79.           if y == 8 then x = x + 1
  80.           elseif x == 1 then y = y + 1
  81.           else x, y = x - 1, y + 1
  82.           end
  83.         else
  84.           if x == 8 then y = y + 1
  85.           elseif y == 1 then x = x + 1
  86.           else x, y = x + 1, y - 1
  87.           end
  88.         end
  89.       end
  90.       --[[          DC Coeficient        ]]
  91.       value = getKEY(AC_DC[0][DC_ind])
  92.       step(getCOEF(value) + YCbCr[INDEX][3])
  93.     YCbCr[INDEX][3] = TABLE[1][1] / masDB[QUAT[INDEX] + 1][1][1]
  94.      --[[          AC Coeficient         ]]
  95.       if AC_DC[1][AC_ind] ~= nil then
  96.         while TABLE[8][8] == nil do
  97.           value = getKEY(AC_DC[1][AC_ind])
  98.           if value == 0 then break
  99.           end
  100.           for j=1, math.floor(value / 16) do
  101.             step(0)      
  102.           end
  103.           step(getCOEF(value % 16) or 0)
  104.         end
  105.       end
  106.       while TABLE[8][8] == nil do
  107.         step(0)
  108.       end
  109.       return TABLE
  110.     end
  111.    
  112.     local function getPIXEL(l, j)
  113.       local function RGB(Yval, Cbval, Crval)
  114.         local function SSS(val)
  115.           local ost
  116.           val, ost = math.modf(val)
  117.           if ost > 0.5 then
  118.             val = val + 1
  119.           end
  120.           return math.max(0, math.min(255, val))
  121.         end
  122.         return SSS(Yval + 1.402 * Crval + 128) * 2 ^ 16 + SSS(Yval - 0.34414 * Cbval - 0.71414 * Crval + 128) * 2 ^ 8 + SSS(Yval + 1.772 * Cbval + 128)
  123.       end
  124.       return RGB(Y[DCT[1][1] * math.floor((l - 1) / 8) + math.ceil(j / 8)][(l - 1) % 8 + 1][(j - 1) % 8 + 1], Cb_avr[math.ceil(l / DCT[1][2])][math.ceil(j / DCT[1][1])], Cr_avr[math.ceil(l / DCT[1][2])][math.ceil(j / DCT[1][1])])
  125.     end
  126.  
  127.     local function ODCP(arr) local arr1 = {{}, {}, {}, {}, {}, {}, {}, {}}
  128.     local function getC(var)
  129.         if var == 0 then return 1 / math.sqrt(2) end
  130.         return 1
  131.       end
  132.       local function getSyx(x, y) local Syx = 0
  133.         for u = 0, 7 do
  134.           local COSU = getC(u) * math.cos(((2 * x + 1) * u * math.pi) / 16)
  135.           for v = 0, 7 do
  136.             Syx = Syx + COSU * getC(v) * math.cos(((2 * y + 1) * v * math.pi) / 16) * arr[u+1][v+1]
  137.           end
  138.         end
  139.         return Syx / 4
  140.       end
  141.  
  142.       for l=1, 8 do
  143.         for j=1, 8 do
  144.           arr1[l][j] = getSyx(l - 1, j - 1)
  145.         end
  146.       end
  147.       return arr1
  148.     end
  149.    
  150.     Y = {}
  151.   for l=1, DCT[1][1] * DCT[1][2] do
  152.       Y[l] = ODCP(getTable(1))
  153.     end
  154.     Cb_avr = ODCP(getTable(2))
  155.     Cr_avr = ODCP(getTable(3))
  156.     for l=1, 4 * DCT[1][2] do
  157.       for j=1, 8 * DCT[1][1] do
  158.         gpu.setBackground(getPIXEL(l*2-1, j))
  159.         gpu.setForeground(getPIXEL(l*2, j))
  160.         gpu.set(j + coordX - 1,l + coordY - 1,"▄")
  161.       end
  162.     end
  163.   end
  164.  
  165.   local function getBITCODE(value) local tmp = ""
  166.     for j=1, 8 do
  167.       tmp = tostring(value % 2)..tmp
  168.       value = math.floor(value / 2)    
  169.     end
  170.     return tmp
  171.   end
  172.  
  173.   i = i + 1
  174.   if comp ~= 3 then
  175.     print("ERROR in FF DA") os.exit()
  176.   end
  177.   YCbCr = {{L(i + 1), R(i + 1), 0}, {L(i + 3), R(i + 3), 0}, {L(i + 5), R(i + 5), 0}}
  178.   i = len
  179.   local j = i
  180.   while j < #STR - 1 do
  181.     if STR:byte(j) == 255 then BYTECODE, j = BYTECODE.."11111111", j + 1
  182.     else BYTECODE = BYTECODE..getBITCODE(STR:byte(j))
  183.     end
  184.     j = j + 1
  185.   end
  186.   for I = 1, math.ceil(HEIGHT / (8 * DCT[1][2])) do
  187.     for J = 1, math.ceil(WIDTH / (8 * DCT[1][1])) do
  188.       DrawFrame((J - 1) * 8 * DCT[1][1] + 1, (I - 1) * 4 * DCT[1][2] + 1)
  189.     end
  190.   end
  191. end
  192.  
  193. function C0()
  194.   QUAT, i = {}, i + 1
  195.   HEIGHT = STR:byte(i) * 256 + STR:byte(i + 1) i = i + 2
  196.   WIDTH = STR:byte(i) * 256 + STR:byte(i + 1) i = i + 3
  197.   gpu.setResolution(WIDTH, math.floor(HEIGHT / 2))
  198.   DCT = {}
  199.   for j=1, STR:byte(i-1) do
  200.     i = i + 3
  201.     DCT[j] = {L(i - 2), R(i - 2)}
  202.     QUAT[j] = STR:byte(i-1)
  203.   end
  204.   i = len
  205. end
  206.  
  207. function C4() local TREE, TREEpos, TREElevel, TREEpath, class, index, HAFF = {[0] = -1}, 0, 0, "", L(i), R(i), {}
  208.   i, AC_DC[class][index] = i + 1, {}
  209.   local function AddTree(VAL)
  210.     local function ADD(VALUE)
  211.       if TREElevel ~= VAL - 1 then
  212.         TREEpath = TREEpath..tostring(VALUE)
  213.         TREElevel = TREElevel + 1
  214.         TREEpos = TREEpos * 2 + 1 + VALUE
  215.         TREE[TREEpos] = -1
  216.         return AddTree(VAL)
  217.       else
  218.         TREE[TREEpos * 2 + 1 + VALUE] = 0
  219.         AC_DC[class][index][TREEpath..tostring(VALUE)] = STR:byte(i)
  220.         i = i + 1
  221.       end
  222.     end
  223.     if TREE[TREEpos * 2 + 1] == nil then ADD(0)
  224.     elseif TREE[TREEpos * 2 + 2] == nil then ADD(1)
  225.     else
  226.       TREElevel = TREElevel - 1
  227.       TREEpath = TREEpath:sub(1, -2)
  228.       TREEpos = math.floor((TREEpos - 1) / 2)
  229.       return AddTree(VAL)
  230.     end
  231.   end
  232.  
  233.   for j=1, 16 do
  234.     HAFF[j], i = STR:byte(i), i + 1    
  235.   end
  236.   for j=1, 16 do
  237.     for k=1, HAFF[j] do
  238.       AddTree(j)
  239.     end
  240.   end
  241.   i = len
  242. end
  243.  
  244.  
  245. AC_DC = {[0] = {}, [1] = {}}
  246. MF = {["DB"] = DB, ["C0"] = C0, ["C1"] = C0, ["C2"] = C0, ["C3"] = C0, ["C4"] = C4, ["DA"] = DA, ["FE"] = FE}
  247. masDB = {{{}, {}, {}, {}, {}, {}, {}, {}}, {{}, {}, {}, {}, {}, {}, {}, {}}}
  248. i = 3
  249.  
  250. file = io.open(args[1], "rb")
  251. STR = file:read("*a")
  252. file:close()
  253. if getB(1) ~= "FF" or getB(2) ~= "D8" then
  254.   print("Error: incorrect contents of the file.")
  255.   os.exit()
  256. end
  257. while i < #STR - 1  do
  258.   idin = getB(i+1)
  259.   i = i + 2
  260.   len = i + STR:byte(i) * 256 + STR:byte(i + 1)
  261.   i = i + 2
  262.   (MF[idin] or Common)()
  263. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement