summaryrefslogtreecommitdiff
path: root/js/gif-encode/worker.js
blob: ef30ae5fece83456099e4f75892a72d22a2445b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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
}