// 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; case 'close': self.close(); 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 delete encoder; delete data; };