forked from hdragomir/facetogif
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgifwriter.worker.js
50 lines (42 loc) · 1.74 KB
/
gifwriter.worker.js
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
importScripts("GifWriter-0.1.0.js");
(function () {
"use strict";
var GifWriter = vividcode.image.GifWriter;
var IndexedColorImage = vividcode.image.IndexedColorImage;
var MedianCutColorReducer = vividcode.image.MedianCutColorReducer;
this.onmessage = function (evt) {
var msg = evt.data;
var imageDataList = msg.imageDataList;
var paletteSize = msg.paletteSize;
var delayTimeInMS = msg.delayTimeInMS;
var indexedColorImages = imageDataList.map(function (e) {
return convertImgDataToIndexedColorImage(e, paletteSize);
});
var push = [].push;
var os = {
buffer: [],
writeByte: function (b) { this.buffer.push(b) },
writeBytes: function (bb) { push.apply(this.buffer, bb) },
};
var gifWriter = new GifWriter(os);
gifWriter.writeHeader();
gifWriter.writeLogicalScreenInfo({ width: msg.width, height: msg.height });
gifWriter.writeLoopControlInfo(0);
indexedColorImages.forEach(function (img) {
gifWriter.writeTableBasedImageWithGraphicControl(img, { delayTimeInMS: delayTimeInMS });
});
gifWriter.writeTrailer();
this.postMessage({ bytes: new Uint8Array(os.buffer) });
};
function convertImgDataToIndexedColorImage(imgData, paletteSize) {
var reducer = new MedianCutColorReducer(imgData, paletteSize);
var paletteData = reducer.process();
var dat = Array.prototype.slice.call(imgData.data);
var indexedColorImageData = [];
for (var idx = 0, len = dat.length; idx < len; idx += 4) {
var d = dat.slice(idx, idx+4); // r,g,b,a
indexedColorImageData.push(reducer.map(d[0],d[1],d[2]));
}
return new IndexedColorImage({ width: imgData.width, height: imgData.height }, indexedColorImageData, paletteData);
}
}).call(this);