function add_frame(){
var frame_count = $("#framecount").int()
if (frame_count < 2) {
add_single_frame()
}
else {
add_frames(frame_count)
}
}
function add_single_frame(){
var $el = $("
")
$el.html( $("#frame-template").html() )
$el.attr('index', $("#frames div").length)
var frame = cc.clone().appendTo($el.find(".frame")[0])
frame.canvas.className = "fullsize"
frame.canvas.style.display = "none"
var thumb = cc.clone().resize(100,100).appendTo($el.find(".frame")[0])
$("#frames").append($el)
$("#render").enable()
}
function add_frames(frame_count){
rendering = true
var t = old_t - start_t - pause_t
var frame_delay = $("#frameinterval").float() * 1000
var frame
for (var i = 0; i < frame_count; i++) {
frame = giveFrame(t)
t += frame_delay
shade(frame, t)
add_single_frame()
}
rendering = false
}
function remove_frame(){
$(this).closest("div").remove()
if ($("#frames div").length == 0) {
$("#render").disable()
}
}
function remove_all_frames(){
$("#frames").empty()
}
function shuffle_frames(){
var shuffled = []
var $frames = $("#frames div")
$("#frames").empty().append(shuffle($frames))
}
function reverse_frames(){
var $frames = $("#frames div")
$("#frames").empty().append(reverse($frames))
}
function weave_frames(){
var $frames = $("#frames div")
$("#frames").empty().append(weave($frames))
}
function sort_frames(){
var $frames = $("#frames div")
var sorted = $frames.map(function(i,el){ console.log(i,el); return [[ el.getAttribute('index'), el ]] })
.sort(function(a,b){ return a[0]-b[0] })
.map(function(i,e){ console.log( e ); return e[1] })
$("#frames").empty().append(sorted)
}
function render (){
if (rendering) return
rendering = true
encoder.reset()
var delay = $("#framedelay").float() * 1000 || 100
$("#frames canvas.fullsize").each(function(){
var frame = cq(this.width, this.height).fillStyle($("#background").string()).fillRect(0,0,this.width, this.height).drawImage(this,0,0)
encoder.addFrame(frame.canvas, delay)
})
$("#pause,#render,#add-frame").disable()
$("#rendered").find("img").remove()
$("#rendered").show()
// really bad results with neuquant?
// status("quantizing")
// encoder.quantize()
status("encoding")
try {
encoder.encode()
} catch (e) {
$("#pause,#render,#add-frame").enable()
rendering = false
status(e)
throw e
}
$("#render").html("rendering")
}
function status(s){ $(".status").html(s) }
var encoder = new GifEncoder()
encoder.on("quantized", function(url){
status("encoding")
encoder.encode()
})
encoder.on("encoded-frame", function(done,count){
status("encoded " + done + " / " + count)
})
encoder.on("rendered", function(bytes){
status(filesize(bytes.length))
})
encoder.on("rendered-url", function(url){
var image = new Image ()
lastGif = image.src = url
$("#rendered").append(image)
$("#uploaded-url").hide().val("")
$("#save,#upload,#rendered").show()
$("#pause,#render,#add-frame,#save,#upload").enable()
$("#render").html("render")
rendering = false
pause(true)
})
function get_filename(){
var basename = $("#url").val().replace(/^.*\//,"").replace(/\..*$/,"").replace(/[^-_ a-zA-Z0-9]/g,"")
var username = user.username
var filename = basename + "-" + username + "-" + (+new Date()) + ".gif"
return filename.replace(/ /g,"_").replace(/-+/g,"-")
}
function save (){
if (! lastGif) return;
var filename = get_filename()
var blob = dataUriToBlob(lastGif)
saveAs(blob, filename);
}
function saveJSON (data, filename) {
var bytes = JSON.stringify(data)
var buf = new ArrayBuffer(bytes.length);
var arr = new Uint8Array(buf);
for (var i = 0; i < bytes.length; i++) {
arr[i] = bytes.charCodeAt(i);
}
var blob = new Blob([arr], { type: "text/json" });
blob.slice = blob.slice || blob.webkitSlice;
saveAs(blob, filename);
}
function upload(){
var filename = get_filename()
var username = user.username
var blob = dataUriToBlob(lastGif)
uploadImage({
blob: blob,
filename: filename,
username: username,
success: function(data){
// data.url
// data.filesize
// data.success
console.log(data);
status("uploaded");
$("#uploaded-url").show().focus().val(data.url)
},
error: function(data){
console.log(data)
status("error uploading: " + data.error)
}
});
}