Skip to content

clean clean #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Aug 15, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
language: node_js
node_js:
- "stable"
23 changes: 13 additions & 10 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@ Polishing

Icons, Icon offsets for tools

Palette styling, editing palette colors

Preview window on large images

Thumbnail viewing mini-map rectangle

Responsive Design
Expand Down Expand Up @@ -42,11 +38,6 @@ Brush Options

Should symmetry be a per-brush option, along with brush sizes, etc?

Memory Usage
------------

Reduce memory usage in undo using dirty regions.

Platforms
---------

Expand Down Expand Up @@ -124,7 +115,19 @@ Display transparent preview as transparent instead of white
Done
====

Color Picker
Memory Usage
------------

Reduce memory usage in undo using dirty regions.

Misc
----

Palette styling, editing palette colors

Preview window on large images

Eye dropper

Better performance
------------------
Expand Down
46 changes: 27 additions & 19 deletions actions.coffee.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ Actions
=======

ByteArray = require "byte_array"
Facebook = require "facebook"
FileReading = require("./file_reading")
Hotkeys = require "hotkeys"
Modal = require("./modal")
Expand Down Expand Up @@ -156,6 +155,33 @@ Actions
editor.replay()
icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACZElEQVQ4T6WSX0hTcRTHz9XYTXEPRboC05qilK0N58N8kD1IIstyIHsYhReGrT9j4VOv+lgEQtCkB4ugZ8MSggXtIQXDl7pzLbOtYAij3D9r3Vt39+72vULSD+5bG+fhcs75nO853x9H//nj/vZPT0+nNE3rrNfr32KxWJcZ1+/3p1VV7arVap/j8fgpo2YfEI1Gf6H5CSBTpVLJVJckSYTmOcRoIpHoYwCRSEQHvQSAlQ/MqnwDj2KdlDrRlbb7dNxKdPnm2gHUJAFwr66u7g3fVxAOh0U0L6PAnxY6+9wWgXjNTrJGdM76lC62vqQRYfODoijzhsr19XUXAwiFQl/QvG0o+HrthzMvqTTQOEcNWi816kRHGzL0amZyA9N3Ee2iKJ5kAIIgbCHxBuGw3Prt6mg5SBVlh6rSWfpeGaGy1Eby7RsiFBgreNLpdA8DCAaDKShYRIyN3TvRb+GaScX/p7aDRWWqczV6eOGTiOZngExkMpkzDCAQCOSQLNlsNme5XDZ1IZlMyhiwBcDhXC7XwQDGx8dTSCziBud7Z567mxrhgkqkYP+p1gfU3sKRx3v3LYYsIyby+TyrwOfzGeS9G0gzXpeZC91DL4wVklDhKRQK7A2Gh4f3XECBtfnOEVMXFiaHNlCzi2ivVCqsC16v9x0ULCB5vWf+2GkzF96HRzfxWmMYMlWtVtl3MDg4qCOxhnBGl4aaLFwT1f51AV+z/a8l5JcAuSTLMvsS3W43BChXeZ5/ZLfbTV1YWVmhYrHoB+AxlB5iXHA4HJug240jZbPZATMC4B/R3IPmrK7r3UbNHy8zkCA9UyOUAAAAAElFTkSuQmCC"

"f6":
name: "Load Replay"
description: """
Load a replay from a remote URL.
"""
method: ({editor}) ->
url = prompt "Replay URL"

if url
editor.replay(url)

"ctrl+shift+s":
name: "Save State"
description: """
Download project file to your local filesystem.
"""
method: ({editor}) ->
if name = prompt("Name", "file")
data = editor.saveState()

blob = new Blob [JSON.stringify(data)],
type: "application/json"

saveAs blob, "#{name}.json"

icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4klEQVQ4T32T70tTURjHv8fpppuaQkuhlgU2f4wCs6b4QpxLod9BJSaYEOS7+gOiF/VCYvjKepf0IsFfU6wxUSNFiALJ9NWi7AelbmbX2qZzv9zdvT3nSOAMei6Xe++55/mc7/N9zmGgGBsb06Wnp19QVfVaMpkspaEjynZ4aOwLPZ8kEomppqamJJ+/Mxgll2s0mv6CgoJjhYWFMBgM0Ov1oESsr68jFAphcXERkiS9prFmgvhSABMTE9NlZWV1JpMJjLHdC4hvWZbh8XiwsLDQ09zc3JYCGB8fl2w2m1Gr1f4XEAgEMDk5udbS0rJvdwkCEAwGkZmZCZ1Oh4yMDFFCJBKB3++H1+tFcXExpqam1lpbW1MBo6OjUn19vTEcDot6Y7GYSOayuQfxeBxkMMxms1DQ1taWCnC73QLAJ/JknsgTHjz3I0cHRLZk5GdrsSJFwdKAbL0GisoQ2Iji5exSFXO5XJLdbjdyudFoVAC4H/cHf+KsrQSXjmfDPePF+eoDKQY/nV7D9NtvYCMjI1JDQ4Nxc3NT1MwB3Ic7vT9grynFjbo83H40h4e3KgUgJgNbtBsej/nw/vMy2PDwsNTY2ChM5ADaSAJwb+gXTlWVoKU2F4yuNOqwSgBFUalbgGPoO+Y/EMDpdAoAd5sDaNchKysLDlcAJyyH4PsdEslyUoFCN4dwk/mLb2UFbGBgQLJarUYKrK6uCh84oOOZHxXlJjKLNNNsWU4KOFegqAp9J6i9BOjt7T1DP5wWi8VQVFQk5PMdeb1zHvaTJbhSmwVZ2SIItYAvzBRkpmvR2beEWc8nKo6iu7v7MLXuLoEu07nYw89Cn6cQp6uO4mJtAt2z7dhrOMidwFp4Ge3WLnT1xzE9924bsDMcDkcOlVD8Klg5f/NcORor/JgJDCJPu1+ICMYkVOdfRUdPEi9m5v4F/IVVtE+8MZv0NXm6fJKcS2UkwMgDppIXLIKPS18hbSTwB3tLeq03+hLeAAAAAElFTkSuQmCC"

Actions.extras =
"F1":
name: "Help"
Expand Down Expand Up @@ -209,24 +235,6 @@ Actions
editor.notify "Error publishing image"
complete: ->

"ctrl+shift+s":
description: """
Download project file to your local filesystem.
"""
method: ({editor}) ->
if name = prompt("Name", "file")
data = editor.saveState()

# TODO: We may want to save history later
delete data.history

blob = new Blob [JSON.stringify(data)],
type: "application/json"

saveAs blob, "#{name}.json"

icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4klEQVQ4T32T70tTURjHv8fpppuaQkuhlgU2f4wCs6b4QpxLod9BJSaYEOS7+gOiF/VCYvjKepf0IsFfU6wxUSNFiALJ9NWi7AelbmbX2qZzv9zdvT3nSOAMei6Xe++55/mc7/N9zmGgGBsb06Wnp19QVfVaMpkspaEjynZ4aOwLPZ8kEomppqamJJ+/Mxgll2s0mv6CgoJjhYWFMBgM0Ov1oESsr68jFAphcXERkiS9prFmgvhSABMTE9NlZWV1JpMJjLHdC4hvWZbh8XiwsLDQ09zc3JYCGB8fl2w2m1Gr1f4XEAgEMDk5udbS0rJvdwkCEAwGkZmZCZ1Oh4yMDFFCJBKB3++H1+tFcXExpqam1lpbW1MBo6OjUn19vTEcDot6Y7GYSOayuQfxeBxkMMxms1DQ1taWCnC73QLAJ/JknsgTHjz3I0cHRLZk5GdrsSJFwdKAbL0GisoQ2Iji5exSFXO5XJLdbjdyudFoVAC4H/cHf+KsrQSXjmfDPePF+eoDKQY/nV7D9NtvYCMjI1JDQ4Nxc3NT1MwB3Ic7vT9grynFjbo83H40h4e3KgUgJgNbtBsej/nw/vMy2PDwsNTY2ChM5ADaSAJwb+gXTlWVoKU2F4yuNOqwSgBFUalbgGPoO+Y/EMDpdAoAd5sDaNchKysLDlcAJyyH4PsdEslyUoFCN4dwk/mLb2UFbGBgQLJarUYKrK6uCh84oOOZHxXlJjKLNNNsWU4KOFegqAp9J6i9BOjt7T1DP5wWi8VQVFQk5PMdeb1zHvaTJbhSmwVZ2SIItYAvzBRkpmvR2beEWc8nKo6iu7v7MLXuLoEu07nYw89Cn6cQp6uO4mJtAt2z7dhrOMidwFp4Ge3WLnT1xzE9924bsDMcDkcOlVD8Klg5f/NcORor/JgJDCJPu1+ICMYkVOdfRUdPEi9m5v4F/IVVtE+8MZv0NXm6fJKcS2UkwMgDppIXLIKPS18hbSTwB3tLeq03+hLeAAAAAElFTkSuQmCC"

"ctrl+l":
description: """
New layer
Expand Down
70 changes: 69 additions & 1 deletion command.coffee.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Command
=======

LZString = require "./lib/lz-string"
{extend} = require "util"

Commands that can be done/undone in the editor.
Expand Down Expand Up @@ -28,18 +29,46 @@ versions.
return command

C "Resize", (data) ->
if typeof data.imageData?.data is "string"
data.imageData = imageDataFromJSON(data.imageData)

if typeof data.imageDataPrevious?.data is "string"
data.imageDataPrevious = imageDataFromJSON(data.imageDataPrevious)

execute: ->
self.resize(data.size, data.imageData)

undo: ->
self.resize(data.sizePrevious, data.imageDataPrevious)

toJSON: ->
{imageData, imageDataPrevious, size, sizePrevious} = data

name: "Resize"
size: size
sizePrevious: sizePrevious
imageData: imageDataToJSON(imageData)
imageDataPrevious: imageDataToJSON(imageDataPrevious)

C "PutImageData", (data) ->
# TODO: Layers?
if typeof data.imageData.data is "string"
data.imageData = imageDataFromJSON(data.imageData)

if typeof data.imageDataPrevious.data is "string"
data.imageDataPrevious = imageDataFromJSON(data.imageDataPrevious)

execute: ->
self.putImageData(data.imageData, data.x, data.y)
undo: ->
self.putImageData(data.imageDataPrevious, data.x, data.y)
toJSON: ->
{x, y, imageData, imageDataPrevious} = data

name: "PutImageData"
x: x
y: y
imageData: imageDataToJSON(imageData)
imageDataPrevious: imageDataToJSON(imageDataPrevious)

C "Composite", (data) ->
if data.commands
Expand Down Expand Up @@ -75,3 +104,42 @@ versions.

self.Command.parse = (commandData) ->
self.Command[commandData.name](commandData)

Helpers
-------

imageDataToJSON = (imageData) ->
return unless imageData

data: serialize(imageData.data)
width: imageData.width
height: imageData.height

imageDataFromJSON = ({data, width, height}) ->
new ImageData deserialize(data), width, height

deserialize = (dataURL) ->
dataString = dataURL.substring(dataURL.indexOf(';') + 1)

binaryString = atob(LZString.decompressFromBase64 dataString)
length = binaryString.length
buffer = new ArrayBuffer length
view = new Uint8ClampedArray(buffer)

i = 0
while i < length
view[i] = binaryString.charCodeAt(i)
i += 1

return view

serialize = (bytes) ->
binary = ''
length = bytes.byteLength

i = 0
while i < length
binary += String.fromCharCode(bytes[i])
i += 1

LZString.compressToBase64 btoa(binary)
5 changes: 1 addition & 4 deletions drop.coffee.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@ Drop and Paste Events
Drop = (I={}, self=Core(I)) ->
callback = ({dataURL}) ->
loader.load(dataURL)
.then (imageData) ->
# TODO This coupling seems a little too tight
self.handlePaste loader.fromImageDataWithPalette(imageData, self.palette())
.then self.insertImageData

# TODO: Scope these events to the editor, not the entire page
$("html").dropImageReader callback
$(document).pasteImageReader callback

Expand Down
Loading