Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. local Frames = {}
  2. local CurrentFrame = 0
  3.  
  4. local Versions = {}
  5. local CurrentVersion = 0
  6.  
  7.  
  8. function Canvas:addFrame()
  9. local key = tostring(math.random()):sub(3)
  10. local img = image(Canvas.width, Canvas.height) -- Create new empty image
  11. CurrentFrame = CurrentFrame + 1
  12.  
  13. saveImage("Documents:Pixelboy_"..key, img)
  14.  
  15. table.insert(Frames, CurrentFrame, key)
  16.  
  17. Version:saveState()
  18. end
  19.  
  20. function Canvas:deleteFrame(frame)
  21. frame = frame or CurrentFrame
  22.  
  23. if frame <= #Frames then
  24. table.remove(Frames, CurrentFrame, frame)
  25. CurrentFrame = math.max(CurrentFrame - 1, 1)
  26.  
  27. if #Frames == 0 then
  28. CurrentFrame = 0
  29. Canvas:addFrame()
  30. else
  31. Version:saveState()
  32. end
  33. end
  34. end
  35.  
  36.  
  37. -- Delete all data from previous project session
  38. function Version:clearAll()
  39. local list = assetList("Documents")
  40. for id, imgKey in ipairs(list) do
  41. if imgKey:find("Pixelboy_") then
  42. saveImage("Documents:"..imgKey, nil)
  43. end
  44. end
  45. end
  46.  
  47. function Version:saveState()
  48. -- Lua memory storage is restricted to ~4MB = 4096Kb on iPad. If Versions stack rises to high, lower it (this also cleans "Documents")
  49. while #Versions > 1 and collectgarbage("count") > 4096 do
  50. local whitelist = table.concat(Versions[2].Frames, " ")
  51. for imgKey, _ in pairs(Versions[1].Frames) do
  52. if not whitelist:find(imgKey) then
  53. saveImage("Documents:Pixelboy_"..imgKey, nil)
  54. end
  55. end
  56. table.remove(Versions, 1)
  57. collectgarbage()
  58. end
  59.  
  60. -- Undid some Versions until CurrentVersion -> Delete all redundant Versions from stack until #Versions
  61. if CurrentVersion then
  62. local whitelist = table.concat(Versions[CurrentVersion].Frames, " ")
  63. for id = CurrentVersion + 1, #Versions do
  64. for imgKey, pos in pairs(Versions[id].Frames) do
  65. if pos > 1 and not whitelist:find(imgKey) then
  66. saveImage("Documents:Pixelboy_"..imgKey, nil)
  67. end
  68. end
  69. Versions[id] = nil
  70. end
  71. CurrentVersion = nil
  72. end
  73.  
  74. -- Add new Version to the stack
  75. local frames = {}
  76. for pos, imgKey in ipairs(Frames) do
  77. frames[imgKey] = pos
  78. end
  79. table.insert(Versions, {CurrentFrame = CurrentFrame, Frames = frames})
  80. end
  81.  
  82. function Version:restoreState()
  83. if CurrentVersion then
  84. local action = Versions[CurrentVersion]
  85. CurrentFrame = action.CurrentFrame
  86. Frames = {}
  87.  
  88. for imgKey, pos in pairs(action.Frames) do
  89. Frames[pos] = imgKey
  90. end
  91.  
  92. Canvas.image = readImage("Documents:Pixelboy_"..Frames[CurrentFrame])
  93. end
  94. end
  95.  
  96. function Version:undo()
  97. if #Versions > 0 then
  98. CurrentVersion = math.max((CurrentVersion or #Versions) - 1, 1)
  99. Version:restoreState()
  100. end
  101. end
  102.  
  103. function Version:redo()
  104. if CurrentVersion then
  105. CurrentVersion = math.min(CurrentVersion + 1, #Versions)
  106. Version:restoreState()
  107.  
  108. if CurrentVersion == #Versions then CurrentVersion = nil end
  109. end
  110. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement