var frame_thumb_size = 93 var frame_editor = {} var lastGif, lastWebm frame_editor.init = function(){ frame_editor.bind() } frame_editor.bind = function(){ $("#add-frame").click(add_frame) $("#frames").sortable({ start: drag_start, stop: drag_stop }); $(document).on("click","#frames .remove",remove_frame) $("#framecount").change(function(){ var val = $(this).int() if (val < 1 || isNaN(val)) $(this).val(val = 1) if (val == 1) $("#add-frame").html("+add frame") else $("#add-frame").html("+add frames") }) $("#frames").disableSelection(); $("#remove-all-frames").click(remove_all_frames) $("#weave-frames").click(weave_frames) $("#shuffle-frames").click(shuffle_frames) $("#reverse-frames").click(reverse_frames) $("#sort-frames").click(sort_frames) $("#render").click(render) $("#render-webm").click(render_webm) $("#save").click(save) $("#upload").click(upload) $("#background").change(function(){ document.body.style.backgroundColor = $("#background").string() }) } function add_frame(){ $("#render").enable() $("#render-webm").enable() 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(frame_thumb_size,frame_thumb_size).appendTo($el.find(".frame")[0]) $("#frames").append($el) } function add_frames(frame_count){ rendering = true var t = old_t - start_t - pause_t var frame_delay = ($("#frameinterval").float() || $("#framedelay").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() } 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 if ($("#frames canvas.fullsize").length == 0) { add_frame() } 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,#render-webm,#add-frame").disable() $("#workspace").find("img").remove() $("#workspace").find("video").remove() $("#rendered").show() // really bad results with neuquant? // status("quantizing") // encoder.quantize() status("encoding") try { encoder.encode() } catch (e) { $("#pause,#render,#render-webm,#add-frame").enable() rendering = false status(e) throw e } $("#render").html("rendering") } function render_webm (){ if (rendering) return if ($("#frames canvas.fullsize").length == 0) { add_frame() } rendering = true var $frames = $("#frames canvas.fullsize") var webm_encoder = new Whammy.Video($frames.length) $frames.each(function(){ var frame = cq(this.width, this.height).fillStyle($("#background").string()).fillRect(0,0,this.width, this.height).drawImage(this,0,0) webm_encoder.add(frame.canvas) }) $("#pause,#render,#render-webm,#add-frame").disable() $("#workspace").find("img").remove() $("#workspace").find("video").remove() $("#rendered").show() lastGif = null var output = lastWebm = webm_encoder.compile(); var video = document.createElement("video") video.src = (window.webkitURL || window.URL).createObjectURL(output); video.setAttribute("loop", true) video.setAttribute("autoplay", true) video.play() $("#workspace canvas").hide() $("#workspace").append(video) $("#uploaded-url").hide().val("") $("#uploaded-url + br").hide() $("#save,#upload,#rendered").show() $("#pause,#render,#render-webm,#add-frame,#save,#upload").enable() $("#render").html("render gif") rendering = false pause(true) } 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 lastWebm = null $("#workspace canvas").hide() $("#workspace").append(image) $("#uploaded-url").hide().val("") $("#uploaded-url + br").hide() $("#save,#upload,#rendered").show() $("#pause,#render,#render-webm,#add-frame,#save,#upload").enable() $("#render").html("render gif") rendering = false pause(true) })