summaryrefslogtreecommitdiff
path: root/js/vendor/gif-encode/worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/vendor/gif-encode/worker.js')
-rw-r--r--js/vendor/gif-encode/worker.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/js/vendor/gif-encode/worker.js b/js/vendor/gif-encode/worker.js
new file mode 100644
index 0000000..b2f32d4
--- /dev/null
+++ b/js/vendor/gif-encode/worker.js
@@ -0,0 +1,88 @@
+importScripts('LZWEncoder.js', 'NeuQuant.js', 'GIFEncoder.js');
+
+self.onmessage = function(event) {
+ var data = event.data;
+ var task = data['task'];
+ switch (task) {
+ case 'encode':
+ encode (data);
+ break;
+ case 'quantize':
+ quantize(data);
+ break;
+ }
+}
+
+function log(msg) {
+ self.postMessage({
+ task: 'message',
+ message: msg
+ });
+}
+
+function quantize (data) {
+ var imageData = data["imageData"];
+ var pixels = discardAlphaChannel( imageData.data );
+
+ var nq = new NeuQuant (pixels, pixels.length, 1);
+ var colortab = nq.process();
+
+ self.postMessage({
+ task: 'quantize',
+ neuquant: nq.save(),
+ colortab: colortab
+ });
+}
+
+function discardAlphaChannel( imageData ) {
+ var pixels = [];
+
+ for ( var i = 0, b = 0, _len = imageData.length; i < _len; b += 4 ) {
+ pixels[i++] = imageData[b];
+ pixels[i++] = imageData[b+1];
+ pixels[i++] = imageData[b+2];
+ }
+ return pixels;
+}
+
+function encode (data) {
+ var frame_index = data["frame_index"];
+ var frame_length = data["frame_length"];
+ var height = data["height"];
+ var width = data["width"];
+ var imageData = data["imageData"];
+ var delay = data["delay"];
+ var neuquant = data["neuquant"];
+ var colortab = data["colortab"];
+
+ // Create a new GIFEncoder for every new worker
+ var encoder = new GIFEncoder();
+ encoder.setRepeat(0); // loop forever
+ encoder.setQuality(1);
+ encoder.setSize(width, height);
+ encoder.setDelay(delay);
+
+ if (frame_index == 0) {
+ encoder.start();
+ }
+ else {
+ encoder.cont();
+ encoder.setProperties(true, false); //started, firstFrame
+ }
+
+ // Load the neural net here because the color table gets clobbered by encoder.start();
+ encoder.setNeuquant(neuquant, colortab);
+ encoder.addFrame(imageData, true);
+
+ if(frame_length == frame_index) {
+ encoder.finish();
+ }
+
+ self.postMessage({
+ task: 'encode',
+ frame_index: frame_index,
+ frame_data: encoder.stream().getData()
+ });
+ // on the page, search for the GIF89a to see the frame_index
+};
+