오윤석

GIFEncoder npm에서 관리

...@@ -1368,9 +1368,7 @@ ...@@ -1368,9 +1368,7 @@
1368 "abbrev": { 1368 "abbrev": {
1369 "version": "1.1.1", 1369 "version": "1.1.1",
1370 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1370 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1371 - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1371 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
1372 - "dev": true,
1373 - "optional": true
1374 }, 1372 },
1375 "acorn": { 1373 "acorn": {
1376 "version": "7.4.1", 1374 "version": "7.4.1",
...@@ -1433,9 +1431,7 @@ ...@@ -1433,9 +1431,7 @@
1433 "ansi-regex": { 1431 "ansi-regex": {
1434 "version": "2.1.1", 1432 "version": "2.1.1",
1435 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1433 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1436 - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1434 + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
1437 - "dev": true,
1438 - "optional": true
1439 }, 1435 },
1440 "ansi-styles": { 1436 "ansi-styles": {
1441 "version": "3.2.1", 1437 "version": "3.2.1",
...@@ -1471,16 +1467,12 @@ ...@@ -1471,16 +1467,12 @@
1471 "aproba": { 1467 "aproba": {
1472 "version": "1.2.0", 1468 "version": "1.2.0",
1473 "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 1469 "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
1474 - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 1470 + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
1475 - "dev": true,
1476 - "optional": true
1477 }, 1471 },
1478 "are-we-there-yet": { 1472 "are-we-there-yet": {
1479 "version": "1.1.5", 1473 "version": "1.1.5",
1480 "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 1474 "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
1481 "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 1475 "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
1482 - "dev": true,
1483 - "optional": true,
1484 "requires": { 1476 "requires": {
1485 "delegates": "^1.0.0", 1477 "delegates": "^1.0.0",
1486 "readable-stream": "^2.0.6" 1478 "readable-stream": "^2.0.6"
...@@ -1670,8 +1662,7 @@ ...@@ -1670,8 +1662,7 @@
1670 "balanced-match": { 1662 "balanced-match": {
1671 "version": "1.0.2", 1663 "version": "1.0.2",
1672 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1664 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1673 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1665 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1674 - "dev": true
1675 }, 1666 },
1676 "base": { 1667 "base": {
1677 "version": "0.11.2", 1668 "version": "0.11.2",
...@@ -1760,7 +1751,6 @@ ...@@ -1760,7 +1751,6 @@
1760 "version": "1.1.11", 1751 "version": "1.1.11",
1761 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1752 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1762 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1753 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1763 - "dev": true,
1764 "requires": { 1754 "requires": {
1765 "balanced-match": "^1.0.0", 1755 "balanced-match": "^1.0.0",
1766 "concat-map": "0.0.1" 1756 "concat-map": "0.0.1"
...@@ -1861,8 +1851,6 @@ ...@@ -1861,8 +1851,6 @@
1861 "version": "2.7.0", 1851 "version": "2.7.0",
1862 "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.7.0.tgz", 1852 "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.7.0.tgz",
1863 "integrity": "sha512-pzCxtkHb+5su5MQjTtepMDlIOtaXo277x0C0u3nMOxtkhTyQ+h2yNKhlROAaDllWgRyePAUitC08sXw26Eb6aw==", 1853 "integrity": "sha512-pzCxtkHb+5su5MQjTtepMDlIOtaXo277x0C0u3nMOxtkhTyQ+h2yNKhlROAaDllWgRyePAUitC08sXw26Eb6aw==",
1864 - "dev": true,
1865 - "optional": true,
1866 "requires": { 1854 "requires": {
1867 "nan": "^2.14.0", 1855 "nan": "^2.14.0",
1868 "node-pre-gyp": "^0.15.0", 1856 "node-pre-gyp": "^0.15.0",
...@@ -1873,8 +1861,6 @@ ...@@ -1873,8 +1861,6 @@
1873 "version": "0.15.0", 1861 "version": "0.15.0",
1874 "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", 1862 "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz",
1875 "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", 1863 "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==",
1876 - "dev": true,
1877 - "optional": true,
1878 "requires": { 1864 "requires": {
1879 "detect-libc": "^1.0.2", 1865 "detect-libc": "^1.0.2",
1880 "mkdirp": "^0.5.3", 1866 "mkdirp": "^0.5.3",
...@@ -2014,9 +2000,7 @@ ...@@ -2014,9 +2000,7 @@
2014 "chownr": { 2000 "chownr": {
2015 "version": "1.1.4", 2001 "version": "1.1.4",
2016 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 2002 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
2017 - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 2003 + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
2018 - "dev": true,
2019 - "optional": true
2020 }, 2004 },
2021 "chrome-trace-event": { 2005 "chrome-trace-event": {
2022 "version": "1.0.3", 2006 "version": "1.0.3",
...@@ -2063,9 +2047,7 @@ ...@@ -2063,9 +2047,7 @@
2063 "code-point-at": { 2047 "code-point-at": {
2064 "version": "1.1.0", 2048 "version": "1.1.0",
2065 "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 2049 "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
2066 - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 2050 + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
2067 - "dev": true,
2068 - "optional": true
2069 }, 2051 },
2070 "collection-visit": { 2052 "collection-visit": {
2071 "version": "1.0.0", 2053 "version": "1.0.0",
...@@ -2129,15 +2111,12 @@ ...@@ -2129,15 +2111,12 @@
2129 "concat-map": { 2111 "concat-map": {
2130 "version": "0.0.1", 2112 "version": "0.0.1",
2131 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2113 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2132 - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 2114 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
2133 - "dev": true
2134 }, 2115 },
2135 "console-control-strings": { 2116 "console-control-strings": {
2136 "version": "1.1.0", 2117 "version": "1.1.0",
2137 "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 2118 "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
2138 - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", 2119 + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
2139 - "dev": true,
2140 - "optional": true
2141 }, 2120 },
2142 "convert-source-map": { 2121 "convert-source-map": {
2143 "version": "1.7.0", 2122 "version": "1.7.0",
...@@ -2176,9 +2155,7 @@ ...@@ -2176,9 +2155,7 @@
2176 "core-util-is": { 2155 "core-util-is": {
2177 "version": "1.0.2", 2156 "version": "1.0.2",
2178 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 2157 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2179 - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 2158 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
2180 - "dev": true,
2181 - "optional": true
2182 }, 2159 },
2183 "cross-spawn": { 2160 "cross-spawn": {
2184 "version": "7.0.3", 2161 "version": "7.0.3",
...@@ -2243,8 +2220,6 @@ ...@@ -2243,8 +2220,6 @@
2243 "version": "3.2.7", 2220 "version": "3.2.7",
2244 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2221 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
2245 "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2222 "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
2246 - "dev": true,
2247 - "optional": true,
2248 "requires": { 2223 "requires": {
2249 "ms": "^2.1.1" 2224 "ms": "^2.1.1"
2250 } 2225 }
...@@ -2260,8 +2235,6 @@ ...@@ -2260,8 +2235,6 @@
2260 "version": "4.2.1", 2235 "version": "4.2.1",
2261 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 2236 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
2262 "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 2237 "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
2263 - "dev": true,
2264 - "optional": true,
2265 "requires": { 2238 "requires": {
2266 "mimic-response": "^2.0.0" 2239 "mimic-response": "^2.0.0"
2267 } 2240 }
...@@ -2269,9 +2242,7 @@ ...@@ -2269,9 +2242,7 @@
2269 "deep-extend": { 2242 "deep-extend": {
2270 "version": "0.6.0", 2243 "version": "0.6.0",
2271 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 2244 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
2272 - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 2245 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
2273 - "dev": true,
2274 - "optional": true
2275 }, 2246 },
2276 "deep-is": { 2247 "deep-is": {
2277 "version": "0.1.3", 2248 "version": "0.1.3",
...@@ -2344,16 +2315,12 @@ ...@@ -2344,16 +2315,12 @@
2344 "delegates": { 2315 "delegates": {
2345 "version": "1.0.0", 2316 "version": "1.0.0",
2346 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 2317 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
2347 - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 2318 + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
2348 - "dev": true,
2349 - "optional": true
2350 }, 2319 },
2351 "detect-libc": { 2320 "detect-libc": {
2352 "version": "1.0.3", 2321 "version": "1.0.3",
2353 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 2322 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
2354 - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 2323 + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
2355 - "dev": true,
2356 - "optional": true
2357 }, 2324 },
2358 "domexception": { 2325 "domexception": {
2359 "version": "1.0.1", 2326 "version": "1.0.1",
...@@ -2382,6 +2349,11 @@ ...@@ -2382,6 +2349,11 @@
2382 "integrity": "sha512-XbklBVCDiUeho0PZQCjC25Ha6uBwqqJeyDhPLwLwfWRAo4x+FZFsmu1pPPkXT+B4MQMQoQULfyaMltDopfeiHQ==", 2349 "integrity": "sha512-XbklBVCDiUeho0PZQCjC25Ha6uBwqqJeyDhPLwLwfWRAo4x+FZFsmu1pPPkXT+B4MQMQoQULfyaMltDopfeiHQ==",
2383 "dev": true 2350 "dev": true
2384 }, 2351 },
2352 + "emitter-component": {
2353 + "version": "1.1.1",
2354 + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
2355 + "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY="
2356 + },
2385 "emojis-list": { 2357 "emojis-list": {
2386 "version": "3.0.0", 2358 "version": "3.0.0",
2387 "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 2359 "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
...@@ -2814,8 +2786,6 @@ ...@@ -2814,8 +2786,6 @@
2814 "version": "1.2.7", 2786 "version": "1.2.7",
2815 "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 2787 "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
2816 "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 2788 "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
2817 - "dev": true,
2818 - "optional": true,
2819 "requires": { 2789 "requires": {
2820 "minipass": "^2.6.0" 2790 "minipass": "^2.6.0"
2821 } 2791 }
...@@ -2829,8 +2799,7 @@ ...@@ -2829,8 +2799,7 @@
2829 "fs.realpath": { 2799 "fs.realpath": {
2830 "version": "1.0.0", 2800 "version": "1.0.0",
2831 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2801 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2832 - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2802 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
2833 - "dev": true
2834 }, 2803 },
2835 "fsevents": { 2804 "fsevents": {
2836 "version": "2.3.2", 2805 "version": "2.3.2",
...@@ -2849,8 +2818,6 @@ ...@@ -2849,8 +2818,6 @@
2849 "version": "2.7.4", 2818 "version": "2.7.4",
2850 "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 2819 "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
2851 "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 2820 "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
2852 - "dev": true,
2853 - "optional": true,
2854 "requires": { 2821 "requires": {
2855 "aproba": "^1.0.3", 2822 "aproba": "^1.0.3",
2856 "console-control-strings": "^1.0.0", 2823 "console-control-strings": "^1.0.0",
...@@ -2902,11 +2869,18 @@ ...@@ -2902,11 +2869,18 @@
2902 "assert-plus": "^1.0.0" 2869 "assert-plus": "^1.0.0"
2903 } 2870 }
2904 }, 2871 },
2872 + "gifencoder": {
2873 + "version": "2.0.1",
2874 + "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
2875 + "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==",
2876 + "requires": {
2877 + "canvas": "^2.2.0"
2878 + }
2879 + },
2905 "glob": { 2880 "glob": {
2906 "version": "7.1.6", 2881 "version": "7.1.6",
2907 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 2882 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
2908 "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 2883 "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
2909 - "dev": true,
2910 "requires": { 2884 "requires": {
2911 "fs.realpath": "^1.0.0", 2885 "fs.realpath": "^1.0.0",
2912 "inflight": "^1.0.4", 2886 "inflight": "^1.0.4",
...@@ -2997,9 +2971,7 @@ ...@@ -2997,9 +2971,7 @@
2997 "has-unicode": { 2971 "has-unicode": {
2998 "version": "2.0.1", 2972 "version": "2.0.1",
2999 "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 2973 "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
3000 - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 2974 + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
3001 - "dev": true,
3002 - "optional": true
3003 }, 2975 },
3004 "has-value": { 2976 "has-value": {
3005 "version": "1.0.0", 2977 "version": "1.0.0",
...@@ -3068,8 +3040,6 @@ ...@@ -3068,8 +3040,6 @@
3068 "version": "0.4.24", 3040 "version": "0.4.24",
3069 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 3041 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
3070 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 3042 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
3071 - "dev": true,
3072 - "optional": true,
3073 "requires": { 3043 "requires": {
3074 "safer-buffer": ">= 2.1.2 < 3" 3044 "safer-buffer": ">= 2.1.2 < 3"
3075 } 3045 }
...@@ -3078,8 +3048,6 @@ ...@@ -3078,8 +3048,6 @@
3078 "version": "3.0.3", 3048 "version": "3.0.3",
3079 "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 3049 "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
3080 "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 3050 "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
3081 - "dev": true,
3082 - "optional": true,
3083 "requires": { 3051 "requires": {
3084 "minimatch": "^3.0.4" 3052 "minimatch": "^3.0.4"
3085 } 3053 }
...@@ -3098,7 +3066,6 @@ ...@@ -3098,7 +3066,6 @@
3098 "version": "1.0.6", 3066 "version": "1.0.6",
3099 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 3067 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
3100 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 3068 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
3101 - "dev": true,
3102 "requires": { 3069 "requires": {
3103 "once": "^1.3.0", 3070 "once": "^1.3.0",
3104 "wrappy": "1" 3071 "wrappy": "1"
...@@ -3107,15 +3074,12 @@ ...@@ -3107,15 +3074,12 @@
3107 "inherits": { 3074 "inherits": {
3108 "version": "2.0.4", 3075 "version": "2.0.4",
3109 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 3076 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
3110 - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 3077 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
3111 - "dev": true
3112 }, 3078 },
3113 "ini": { 3079 "ini": {
3114 "version": "1.3.8", 3080 "version": "1.3.8",
3115 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 3081 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
3116 - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 3082 + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
3117 - "dev": true,
3118 - "optional": true
3119 }, 3083 },
3120 "interpret": { 3084 "interpret": {
3121 "version": "2.2.0", 3085 "version": "2.2.0",
...@@ -3239,8 +3203,6 @@ ...@@ -3239,8 +3203,6 @@
3239 "version": "1.0.0", 3203 "version": "1.0.0",
3240 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 3204 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
3241 "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 3205 "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
3242 - "dev": true,
3243 - "optional": true,
3244 "requires": { 3206 "requires": {
3245 "number-is-nan": "^1.0.0" 3207 "number-is-nan": "^1.0.0"
3246 } 3208 }
...@@ -3309,9 +3271,7 @@ ...@@ -3309,9 +3271,7 @@
3309 "isarray": { 3271 "isarray": {
3310 "version": "1.0.0", 3272 "version": "1.0.0",
3311 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3273 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3312 - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3274 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
3313 - "dev": true,
3314 - "optional": true
3315 }, 3275 },
3316 "isexe": { 3276 "isexe": {
3317 "version": "2.0.0", 3277 "version": "2.0.0",
...@@ -3611,15 +3571,12 @@ ...@@ -3611,15 +3571,12 @@
3611 "mimic-response": { 3571 "mimic-response": {
3612 "version": "2.1.0", 3572 "version": "2.1.0",
3613 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 3573 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
3614 - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", 3574 + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
3615 - "dev": true,
3616 - "optional": true
3617 }, 3575 },
3618 "minimatch": { 3576 "minimatch": {
3619 "version": "3.0.4", 3577 "version": "3.0.4",
3620 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 3578 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3621 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 3579 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3622 - "dev": true,
3623 "requires": { 3580 "requires": {
3624 "brace-expansion": "^1.1.7" 3581 "brace-expansion": "^1.1.7"
3625 } 3582 }
...@@ -3627,15 +3584,12 @@ ...@@ -3627,15 +3584,12 @@
3627 "minimist": { 3584 "minimist": {
3628 "version": "1.2.5", 3585 "version": "1.2.5",
3629 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 3586 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
3630 - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 3587 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
3631 - "dev": true
3632 }, 3588 },
3633 "minipass": { 3589 "minipass": {
3634 "version": "2.9.0", 3590 "version": "2.9.0",
3635 "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 3591 "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
3636 "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 3592 "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
3637 - "dev": true,
3638 - "optional": true,
3639 "requires": { 3593 "requires": {
3640 "safe-buffer": "^5.1.2", 3594 "safe-buffer": "^5.1.2",
3641 "yallist": "^3.0.0" 3595 "yallist": "^3.0.0"
...@@ -3645,8 +3599,6 @@ ...@@ -3645,8 +3599,6 @@
3645 "version": "1.3.3", 3599 "version": "1.3.3",
3646 "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 3600 "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
3647 "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 3601 "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
3648 - "dev": true,
3649 - "optional": true,
3650 "requires": { 3602 "requires": {
3651 "minipass": "^2.9.0" 3603 "minipass": "^2.9.0"
3652 } 3604 }
...@@ -3678,8 +3630,6 @@ ...@@ -3678,8 +3630,6 @@
3678 "version": "0.5.5", 3630 "version": "0.5.5",
3679 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 3631 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
3680 "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 3632 "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
3681 - "dev": true,
3682 - "optional": true,
3683 "requires": { 3633 "requires": {
3684 "minimist": "^1.2.5" 3634 "minimist": "^1.2.5"
3685 } 3635 }
...@@ -3687,16 +3637,12 @@ ...@@ -3687,16 +3637,12 @@
3687 "ms": { 3637 "ms": {
3688 "version": "2.1.3", 3638 "version": "2.1.3",
3689 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3639 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
3690 - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 3640 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
3691 - "dev": true,
3692 - "optional": true
3693 }, 3641 },
3694 "nan": { 3642 "nan": {
3695 "version": "2.14.2", 3643 "version": "2.14.2",
3696 "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", 3644 "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
3697 - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", 3645 + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
3698 - "dev": true,
3699 - "optional": true
3700 }, 3646 },
3701 "nanomatch": { 3647 "nanomatch": {
3702 "version": "1.2.13", 3648 "version": "1.2.13",
...@@ -3722,8 +3668,6 @@ ...@@ -3722,8 +3668,6 @@
3722 "version": "2.6.0", 3668 "version": "2.6.0",
3723 "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", 3669 "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
3724 "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", 3670 "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
3725 - "dev": true,
3726 - "optional": true,
3727 "requires": { 3671 "requires": {
3728 "debug": "^3.2.6", 3672 "debug": "^3.2.6",
3729 "iconv-lite": "^0.4.4", 3673 "iconv-lite": "^0.4.4",
...@@ -3746,8 +3690,6 @@ ...@@ -3746,8 +3690,6 @@
3746 "version": "4.0.3", 3690 "version": "4.0.3",
3747 "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 3691 "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
3748 "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 3692 "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
3749 - "dev": true,
3750 - "optional": true,
3751 "requires": { 3693 "requires": {
3752 "abbrev": "1", 3694 "abbrev": "1",
3753 "osenv": "^0.1.4" 3695 "osenv": "^0.1.4"
...@@ -3764,8 +3706,6 @@ ...@@ -3764,8 +3706,6 @@
3764 "version": "1.1.1", 3706 "version": "1.1.1",
3765 "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 3707 "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
3766 "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 3708 "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
3767 - "dev": true,
3768 - "optional": true,
3769 "requires": { 3709 "requires": {
3770 "npm-normalize-package-bin": "^1.0.1" 3710 "npm-normalize-package-bin": "^1.0.1"
3771 } 3711 }
...@@ -3773,16 +3713,12 @@ ...@@ -3773,16 +3713,12 @@
3773 "npm-normalize-package-bin": { 3713 "npm-normalize-package-bin": {
3774 "version": "1.0.1", 3714 "version": "1.0.1",
3775 "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 3715 "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
3776 - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", 3716 + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
3777 - "dev": true,
3778 - "optional": true
3779 }, 3717 },
3780 "npm-packlist": { 3718 "npm-packlist": {
3781 "version": "1.4.8", 3719 "version": "1.4.8",
3782 "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", 3720 "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
3783 "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", 3721 "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
3784 - "dev": true,
3785 - "optional": true,
3786 "requires": { 3722 "requires": {
3787 "ignore-walk": "^3.0.1", 3723 "ignore-walk": "^3.0.1",
3788 "npm-bundled": "^1.0.1", 3724 "npm-bundled": "^1.0.1",
...@@ -3802,8 +3738,6 @@ ...@@ -3802,8 +3738,6 @@
3802 "version": "4.1.2", 3738 "version": "4.1.2",
3803 "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 3739 "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
3804 "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 3740 "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
3805 - "dev": true,
3806 - "optional": true,
3807 "requires": { 3741 "requires": {
3808 "are-we-there-yet": "~1.1.2", 3742 "are-we-there-yet": "~1.1.2",
3809 "console-control-strings": "~1.1.0", 3743 "console-control-strings": "~1.1.0",
...@@ -3814,9 +3748,7 @@ ...@@ -3814,9 +3748,7 @@
3814 "number-is-nan": { 3748 "number-is-nan": {
3815 "version": "1.0.1", 3749 "version": "1.0.1",
3816 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 3750 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3817 - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 3751 + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
3818 - "dev": true,
3819 - "optional": true
3820 }, 3752 },
3821 "nwsapi": { 3753 "nwsapi": {
3822 "version": "2.2.0", 3754 "version": "2.2.0",
...@@ -3835,9 +3767,7 @@ ...@@ -3835,9 +3767,7 @@
3835 "object-assign": { 3767 "object-assign": {
3836 "version": "4.1.1", 3768 "version": "4.1.1",
3837 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3769 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3838 - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 3770 + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
3839 - "dev": true,
3840 - "optional": true
3841 }, 3771 },
3842 "object-copy": { 3772 "object-copy": {
3843 "version": "0.1.0", 3773 "version": "0.1.0",
...@@ -3915,7 +3845,6 @@ ...@@ -3915,7 +3845,6 @@
3915 "version": "1.4.0", 3845 "version": "1.4.0",
3916 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3846 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3917 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3847 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3918 - "dev": true,
3919 "requires": { 3848 "requires": {
3920 "wrappy": "1" 3849 "wrappy": "1"
3921 } 3850 }
...@@ -3947,23 +3876,17 @@ ...@@ -3947,23 +3876,17 @@
3947 "os-homedir": { 3876 "os-homedir": {
3948 "version": "1.0.2", 3877 "version": "1.0.2",
3949 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 3878 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
3950 - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 3879 + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
3951 - "dev": true,
3952 - "optional": true
3953 }, 3880 },
3954 "os-tmpdir": { 3881 "os-tmpdir": {
3955 "version": "1.0.2", 3882 "version": "1.0.2",
3956 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 3883 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
3957 - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 3884 + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
3958 - "dev": true,
3959 - "optional": true
3960 }, 3885 },
3961 "osenv": { 3886 "osenv": {
3962 "version": "0.1.5", 3887 "version": "0.1.5",
3963 "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 3888 "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
3964 "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 3889 "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
3965 - "dev": true,
3966 - "optional": true,
3967 "requires": { 3890 "requires": {
3968 "os-homedir": "^1.0.0", 3891 "os-homedir": "^1.0.0",
3969 "os-tmpdir": "^1.0.0" 3892 "os-tmpdir": "^1.0.0"
...@@ -4034,8 +3957,7 @@ ...@@ -4034,8 +3957,7 @@
4034 "path-is-absolute": { 3957 "path-is-absolute": {
4035 "version": "1.0.1", 3958 "version": "1.0.1",
4036 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3959 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
4037 - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3960 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
4038 - "dev": true
4039 }, 3961 },
4040 "path-key": { 3962 "path-key": {
4041 "version": "3.1.1", 3963 "version": "3.1.1",
...@@ -4102,9 +4024,7 @@ ...@@ -4102,9 +4024,7 @@
4102 "process-nextick-args": { 4024 "process-nextick-args": {
4103 "version": "2.0.1", 4025 "version": "2.0.1",
4104 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 4026 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
4105 - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 4027 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
4106 - "dev": true,
4107 - "optional": true
4108 }, 4028 },
4109 "psl": { 4029 "psl": {
4110 "version": "1.8.0", 4030 "version": "1.8.0",
...@@ -4139,8 +4059,6 @@ ...@@ -4139,8 +4059,6 @@
4139 "version": "1.2.8", 4059 "version": "1.2.8",
4140 "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 4060 "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
4141 "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 4061 "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
4142 - "dev": true,
4143 - "optional": true,
4144 "requires": { 4062 "requires": {
4145 "deep-extend": "^0.6.0", 4063 "deep-extend": "^0.6.0",
4146 "ini": "~1.3.0", 4064 "ini": "~1.3.0",
...@@ -4152,8 +4070,6 @@ ...@@ -4152,8 +4070,6 @@
4152 "version": "2.3.7", 4070 "version": "2.3.7",
4153 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 4071 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
4154 "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 4072 "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
4155 - "dev": true,
4156 - "optional": true,
4157 "requires": { 4073 "requires": {
4158 "core-util-is": "~1.0.0", 4074 "core-util-is": "~1.0.0",
4159 "inherits": "~2.0.3", 4075 "inherits": "~2.0.3",
...@@ -4404,8 +4320,6 @@ ...@@ -4404,8 +4320,6 @@
4404 "version": "2.7.1", 4320 "version": "2.7.1",
4405 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 4321 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
4406 "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 4322 "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
4407 - "dev": true,
4408 - "optional": true,
4409 "requires": { 4323 "requires": {
4410 "glob": "^7.1.3" 4324 "glob": "^7.1.3"
4411 } 4325 }
...@@ -4413,8 +4327,7 @@ ...@@ -4413,8 +4327,7 @@
4413 "safe-buffer": { 4327 "safe-buffer": {
4414 "version": "5.1.2", 4328 "version": "5.1.2",
4415 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 4329 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
4416 - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 4330 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
4417 - "dev": true
4418 }, 4331 },
4419 "safe-regex": { 4332 "safe-regex": {
4420 "version": "1.1.0", 4333 "version": "1.1.0",
...@@ -4429,16 +4342,12 @@ ...@@ -4429,16 +4342,12 @@
4429 "safer-buffer": { 4342 "safer-buffer": {
4430 "version": "2.1.2", 4343 "version": "2.1.2",
4431 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 4344 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
4432 - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 4345 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
4433 - "dev": true,
4434 - "optional": true
4435 }, 4346 },
4436 "sax": { 4347 "sax": {
4437 "version": "1.2.4", 4348 "version": "1.2.4",
4438 "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 4349 "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
4439 - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 4350 + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
4440 - "dev": true,
4441 - "optional": true
4442 }, 4351 },
4443 "saxes": { 4352 "saxes": {
4444 "version": "3.1.11", 4353 "version": "3.1.11",
...@@ -4464,8 +4373,7 @@ ...@@ -4464,8 +4373,7 @@
4464 "semver": { 4373 "semver": {
4465 "version": "5.7.1", 4374 "version": "5.7.1",
4466 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 4375 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
4467 - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 4376 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
4468 - "dev": true
4469 }, 4377 },
4470 "serialize-javascript": { 4378 "serialize-javascript": {
4471 "version": "5.0.1", 4379 "version": "5.0.1",
...@@ -4479,9 +4387,7 @@ ...@@ -4479,9 +4387,7 @@
4479 "set-blocking": { 4387 "set-blocking": {
4480 "version": "2.0.0", 4388 "version": "2.0.0",
4481 "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 4389 "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4482 - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 4390 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
4483 - "dev": true,
4484 - "optional": true
4485 }, 4391 },
4486 "set-value": { 4392 "set-value": {
4487 "version": "2.0.1", 4393 "version": "2.0.1",
...@@ -4535,22 +4441,17 @@ ...@@ -4535,22 +4441,17 @@
4535 "signal-exit": { 4441 "signal-exit": {
4536 "version": "3.0.3", 4442 "version": "3.0.3",
4537 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 4443 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
4538 - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 4444 + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
4539 - "dev": true
4540 }, 4445 },
4541 "simple-concat": { 4446 "simple-concat": {
4542 "version": "1.0.1", 4447 "version": "1.0.1",
4543 "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 4448 "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
4544 - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 4449 + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
4545 - "dev": true,
4546 - "optional": true
4547 }, 4450 },
4548 "simple-get": { 4451 "simple-get": {
4549 "version": "3.1.0", 4452 "version": "3.1.0",
4550 "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 4453 "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
4551 "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 4454 "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
4552 - "dev": true,
4553 - "optional": true,
4554 "requires": { 4455 "requires": {
4555 "decompress-response": "^4.2.0", 4456 "decompress-response": "^4.2.0",
4556 "once": "^1.3.1", 4457 "once": "^1.3.1",
...@@ -4805,12 +4706,18 @@ ...@@ -4805,12 +4706,18 @@
4805 "dev": true, 4706 "dev": true,
4806 "optional": true 4707 "optional": true
4807 }, 4708 },
4709 + "stream": {
4710 + "version": "0.0.2",
4711 + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
4712 + "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
4713 + "requires": {
4714 + "emitter-component": "^1.1.1"
4715 + }
4716 + },
4808 "string-width": { 4717 "string-width": {
4809 "version": "1.0.2", 4718 "version": "1.0.2",
4810 "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 4719 "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
4811 "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 4720 "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
4812 - "dev": true,
4813 - "optional": true,
4814 "requires": { 4721 "requires": {
4815 "code-point-at": "^1.0.0", 4722 "code-point-at": "^1.0.0",
4816 "is-fullwidth-code-point": "^1.0.0", 4723 "is-fullwidth-code-point": "^1.0.0",
...@@ -4821,8 +4728,6 @@ ...@@ -4821,8 +4728,6 @@
4821 "version": "1.1.1", 4728 "version": "1.1.1",
4822 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 4729 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4823 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 4730 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4824 - "dev": true,
4825 - "optional": true,
4826 "requires": { 4731 "requires": {
4827 "safe-buffer": "~5.1.0" 4732 "safe-buffer": "~5.1.0"
4828 } 4733 }
...@@ -4831,8 +4736,6 @@ ...@@ -4831,8 +4736,6 @@
4831 "version": "3.0.1", 4736 "version": "3.0.1",
4832 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 4737 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
4833 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 4738 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
4834 - "dev": true,
4835 - "optional": true,
4836 "requires": { 4739 "requires": {
4837 "ansi-regex": "^2.0.0" 4740 "ansi-regex": "^2.0.0"
4838 } 4741 }
...@@ -4846,9 +4749,7 @@ ...@@ -4846,9 +4749,7 @@
4846 "strip-json-comments": { 4749 "strip-json-comments": {
4847 "version": "2.0.1", 4750 "version": "2.0.1",
4848 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 4751 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
4849 - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 4752 + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
4850 - "dev": true,
4851 - "optional": true
4852 }, 4753 },
4853 "supports-color": { 4754 "supports-color": {
4854 "version": "5.5.0", 4755 "version": "5.5.0",
...@@ -4875,8 +4776,6 @@ ...@@ -4875,8 +4776,6 @@
4875 "version": "4.4.13", 4776 "version": "4.4.13",
4876 "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 4777 "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
4877 "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 4778 "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
4878 - "dev": true,
4879 - "optional": true,
4880 "requires": { 4779 "requires": {
4881 "chownr": "^1.1.1", 4780 "chownr": "^1.1.1",
4882 "fs-minipass": "^1.2.5", 4781 "fs-minipass": "^1.2.5",
...@@ -5144,9 +5043,7 @@ ...@@ -5144,9 +5043,7 @@
5144 "util-deprecate": { 5043 "util-deprecate": {
5145 "version": "1.0.2", 5044 "version": "1.0.2",
5146 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 5045 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5147 - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 5046 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
5148 - "dev": true,
5149 - "optional": true
5150 }, 5047 },
5151 "uuid": { 5048 "uuid": {
5152 "version": "3.4.0", 5049 "version": "3.4.0",
...@@ -5343,8 +5240,6 @@ ...@@ -5343,8 +5240,6 @@
5343 "version": "1.1.3", 5240 "version": "1.1.3",
5344 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 5241 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
5345 "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 5242 "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
5346 - "dev": true,
5347 - "optional": true,
5348 "requires": { 5243 "requires": {
5349 "string-width": "^1.0.2 || 2" 5244 "string-width": "^1.0.2 || 2"
5350 } 5245 }
...@@ -5365,8 +5260,7 @@ ...@@ -5365,8 +5260,7 @@
5365 "wrappy": { 5260 "wrappy": {
5366 "version": "1.0.2", 5261 "version": "1.0.2",
5367 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 5262 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
5368 - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 5263 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
5369 - "dev": true
5370 }, 5264 },
5371 "ws": { 5265 "ws": {
5372 "version": "7.4.4", 5266 "version": "7.4.4",
...@@ -5392,9 +5286,7 @@ ...@@ -5392,9 +5286,7 @@
5392 "yallist": { 5286 "yallist": {
5393 "version": "3.1.1", 5287 "version": "3.1.1",
5394 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 5288 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
5395 - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 5289 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
5396 - "dev": true,
5397 - "optional": true
5398 }, 5290 },
5399 "yocto-queue": { 5291 "yocto-queue": {
5400 "version": "0.1.0", 5292 "version": "0.1.0",
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
19 "webpack-cli": "^4.6.0" 19 "webpack-cli": "^4.6.0"
20 }, 20 },
21 "dependencies": { 21 "dependencies": {
22 - "@babel/plugin-proposal-class-properties": "^7.13.0" 22 + "@babel/plugin-proposal-class-properties": "^7.13.0",
23 + "gifencoder": "^2.0.1",
24 + "stream": "0.0.2"
23 } 25 }
24 } 26 }
......
1 -import GIF from "./lib/GIFEncoder"; 1 +import GIF from "gifencoder";
2 2
3 class GifGenerator { 3 class GifGenerator {
4 constructor(canvas) { 4 constructor(canvas) {
...@@ -7,32 +7,22 @@ class GifGenerator { ...@@ -7,32 +7,22 @@ class GifGenerator {
7 this.height = canvas.getHeight(); 7 this.height = canvas.getHeight();
8 this.gif = new GIF(this.width, this.height); 8 this.gif = new GIF(this.width, this.height);
9 9
10 - this.gif.writeHeader(); 10 + this.gif.start();
11 this.gif.setTransparent(null); 11 this.gif.setTransparent(null);
12 this.gif.setRepeat(0); 12 this.gif.setRepeat(0);
13 this.gif.setQuality(10); 13 this.gif.setQuality(10);
14 - this.gif.setDither(false);
15 - this.gif.setGlobalPalette(false);
16 } 14 }
17 15
18 addFrame(delay = 0) { 16 addFrame(delay = 0) {
19 this.gif.setDelay(delay); 17 this.gif.setDelay(delay);
20 - this.gif.addFrame( 18 + this.gif.addFrame(this.canvas.getContext());
21 - this.canvas.getContext().getImageData(0, 0, this.width, this.height).data
22 - );
23 } 19 }
24 20
25 render() { 21 render() {
26 this.gif.finish(); 22 this.gif.finish();
27 - const stream = this.gif.stream(); 23 + const byte = new Uint8Array(this.gif.out.data);
28 24
29 - let bytes = []; 25 + return new Blob([byte], { type: "image/gif" });
30 - stream.pages.map((page) => {
31 - bytes = bytes.concat([...page]);
32 - });
33 - bytes = new Uint8Array(bytes);
34 -
35 - return new Blob([bytes], { type: "image/gif" });
36 } 26 }
37 } 27 }
38 28
......
1 -/*
2 - GIFEncoder.js
3 -
4 - Authors
5 - Kevin Weiner (original Java version - kweiner@fmsware.com)
6 - Thibault Imbert (AS3 version - bytearray.org)
7 - Johan Nordberg (JS version - code@johan-nordberg.com)
8 -*/
9 -
10 -var NeuQuant = require("./TypedNeuQuant.js");
11 -var LZWEncoder = require("./LZWEncoder.js");
12 -
13 -function ByteArray() {
14 - this.page = -1;
15 - this.pages = [];
16 - this.newPage();
17 -}
18 -
19 -ByteArray.pageSize = 4096;
20 -ByteArray.charMap = {};
21 -
22 -for (var i = 0; i < 256; i++) ByteArray.charMap[i] = String.fromCharCode(i);
23 -
24 -ByteArray.prototype.newPage = function () {
25 - this.pages[++this.page] = new Uint8Array(ByteArray.pageSize);
26 - this.cursor = 0;
27 -};
28 -
29 -ByteArray.prototype.getData = function () {
30 - var rv = "";
31 - for (var p = 0; p < this.pages.length; p++) {
32 - for (var i = 0; i < ByteArray.pageSize; i++) {
33 - rv += ByteArray.charMap[this.pages[p][i]];
34 - }
35 - }
36 - return rv;
37 -};
38 -
39 -ByteArray.prototype.writeByte = function (val) {
40 - if (this.cursor >= ByteArray.pageSize) this.newPage();
41 - this.pages[this.page][this.cursor++] = val;
42 -};
43 -
44 -ByteArray.prototype.writeUTFBytes = function (string) {
45 - for (var l = string.length, i = 0; i < l; i++)
46 - this.writeByte(string.charCodeAt(i));
47 -};
48 -
49 -ByteArray.prototype.writeBytes = function (array, offset, length) {
50 - for (var l = length || array.length, i = offset || 0; i < l; i++)
51 - this.writeByte(array[i]);
52 -};
53 -
54 -function GIFEncoder(width, height) {
55 - // image size
56 - this.width = ~~width;
57 - this.height = ~~height;
58 -
59 - // transparent color if given
60 - this.transparent = null;
61 -
62 - // transparent index in color table
63 - this.transIndex = 0;
64 -
65 - // -1 = no repeat, 0 = forever. anything else is repeat count
66 - this.repeat = -1;
67 -
68 - // frame delay (hundredths)
69 - this.delay = 0;
70 -
71 - this.image = null; // current frame
72 - this.pixels = null; // BGR byte array from frame
73 - this.indexedPixels = null; // converted frame indexed to palette
74 - this.colorDepth = null; // number of bit planes
75 - this.colorTab = null; // RGB palette
76 - this.neuQuant = null; // NeuQuant instance that was used to generate this.colorTab.
77 - this.usedEntry = new Array(); // active palette entries
78 - this.palSize = 7; // color table size (bits-1)
79 - this.dispose = -1; // disposal code (-1 = use default)
80 - this.firstFrame = true;
81 - this.sample = 10; // default sample interval for quantizer
82 - this.dither = false; // default dithering
83 - this.globalPalette = false;
84 -
85 - this.out = new ByteArray();
86 -}
87 -
88 -/*
89 - Sets the delay time between each frame, or changes it for subsequent frames
90 - (applies to last frame added)
91 -*/
92 -GIFEncoder.prototype.setDelay = function (milliseconds) {
93 - this.delay = Math.round(milliseconds / 10);
94 -};
95 -
96 -/*
97 - Sets frame rate in frames per second.
98 -*/
99 -GIFEncoder.prototype.setFrameRate = function (fps) {
100 - this.delay = Math.round(100 / fps);
101 -};
102 -
103 -/*
104 - Sets the GIF frame disposal code for the last added frame and any
105 - subsequent frames.
106 -
107 - Default is 0 if no transparent color has been set, otherwise 2.
108 -*/
109 -GIFEncoder.prototype.setDispose = function (disposalCode) {
110 - if (disposalCode >= 0) this.dispose = disposalCode;
111 -};
112 -
113 -/*
114 - Sets the number of times the set of GIF frames should be played.
115 -
116 - -1 = play once
117 - 0 = repeat indefinitely
118 -
119 - Default is -1
120 -
121 - Must be invoked before the first image is added
122 -*/
123 -
124 -GIFEncoder.prototype.setRepeat = function (repeat) {
125 - this.repeat = repeat;
126 -};
127 -
128 -/*
129 - Sets the transparent color for the last added frame and any subsequent
130 - frames. Since all colors are subject to modification in the quantization
131 - process, the color in the final palette for each frame closest to the given
132 - color becomes the transparent color for that frame. May be set to null to
133 - indicate no transparent color.
134 -*/
135 -GIFEncoder.prototype.setTransparent = function (color) {
136 - this.transparent = color;
137 -};
138 -
139 -/*
140 - Adds next GIF frame. The frame is not written immediately, but is
141 - actually deferred until the next frame is received so that timing
142 - data can be inserted. Invoking finish() flushes all frames.
143 -*/
144 -GIFEncoder.prototype.addFrame = function (imageData) {
145 - this.image = imageData;
146 -
147 - this.colorTab =
148 - this.globalPalette && this.globalPalette.slice ? this.globalPalette : null;
149 -
150 - this.getImagePixels(); // convert to correct format if necessary
151 - this.analyzePixels(); // build color table & map pixels
152 -
153 - if (this.globalPalette === true) this.globalPalette = this.colorTab;
154 -
155 - if (this.firstFrame) {
156 - this.writeLSD(); // logical screen descriptior
157 - this.writePalette(); // global color table
158 - if (this.repeat >= 0) {
159 - // use NS app extension to indicate reps
160 - this.writeNetscapeExt();
161 - }
162 - }
163 -
164 - this.writeGraphicCtrlExt(); // write graphic control extension
165 - this.writeImageDesc(); // image descriptor
166 - if (!this.firstFrame && !this.globalPalette) this.writePalette(); // local color table
167 - this.writePixels(); // encode and write pixel data
168 -
169 - this.firstFrame = false;
170 -};
171 -
172 -/*
173 - Adds final trailer to the GIF stream, if you don't call the finish method
174 - the GIF stream will not be valid.
175 -*/
176 -GIFEncoder.prototype.finish = function () {
177 - this.out.writeByte(0x3b); // gif trailer
178 -};
179 -
180 -/*
181 - Sets quality of color quantization (conversion of images to the maximum 256
182 - colors allowed by the GIF specification). Lower values (minimum = 1)
183 - produce better colors, but slow processing significantly. 10 is the
184 - default, and produces good color mapping at reasonable speeds. Values
185 - greater than 20 do not yield significant improvements in speed.
186 -*/
187 -GIFEncoder.prototype.setQuality = function (quality) {
188 - if (quality < 1) quality = 1;
189 - this.sample = quality;
190 -};
191 -
192 -/*
193 - Sets dithering method. Available are:
194 - - FALSE no dithering
195 - - TRUE or FloydSteinberg
196 - - FalseFloydSteinberg
197 - - Stucki
198 - - Atkinson
199 - You can add '-serpentine' to use serpentine scanning
200 -*/
201 -GIFEncoder.prototype.setDither = function (dither) {
202 - if (dither === true) dither = "FloydSteinberg";
203 - this.dither = dither;
204 -};
205 -
206 -/*
207 - Sets global palette for all frames.
208 - You can provide TRUE to create global palette from first picture.
209 - Or an array of r,g,b,r,g,b,...
210 -*/
211 -GIFEncoder.prototype.setGlobalPalette = function (palette) {
212 - this.globalPalette = palette;
213 -};
214 -
215 -/*
216 - Returns global palette used for all frames.
217 - If setGlobalPalette(true) was used, then this function will return
218 - calculated palette after the first frame is added.
219 -*/
220 -GIFEncoder.prototype.getGlobalPalette = function () {
221 - return (
222 - (this.globalPalette &&
223 - this.globalPalette.slice &&
224 - this.globalPalette.slice(0)) ||
225 - this.globalPalette
226 - );
227 -};
228 -
229 -/*
230 - Writes GIF file header
231 -*/
232 -GIFEncoder.prototype.writeHeader = function () {
233 - this.out.writeUTFBytes("GIF89a");
234 -};
235 -
236 -/*
237 - Analyzes current frame colors and creates color map.
238 -*/
239 -GIFEncoder.prototype.analyzePixels = function () {
240 - if (!this.colorTab) {
241 - this.neuQuant = new NeuQuant(this.pixels, this.sample);
242 - this.neuQuant.buildColormap(); // create reduced palette
243 - this.colorTab = this.neuQuant.getColormap();
244 - }
245 -
246 - // map image pixels to new palette
247 - if (this.dither) {
248 - this.ditherPixels(
249 - this.dither.replace("-serpentine", ""),
250 - this.dither.match(/-serpentine/) !== null
251 - );
252 - } else {
253 - this.indexPixels();
254 - }
255 -
256 - this.pixels = null;
257 - this.colorDepth = 8;
258 - this.palSize = 7;
259 -
260 - // get closest match to transparent color if specified
261 - if (this.transparent !== null) {
262 - this.transIndex = this.findClosest(this.transparent, true);
263 - }
264 -};
265 -
266 -/*
267 - Index pixels, without dithering
268 -*/
269 -GIFEncoder.prototype.indexPixels = function (imgq) {
270 - var nPix = this.pixels.length / 3;
271 - this.indexedPixels = new Uint8Array(nPix);
272 - var k = 0;
273 - for (var j = 0; j < nPix; j++) {
274 - var index = this.findClosestRGB(
275 - this.pixels[k++] & 0xff,
276 - this.pixels[k++] & 0xff,
277 - this.pixels[k++] & 0xff
278 - );
279 - this.usedEntry[index] = true;
280 - this.indexedPixels[j] = index;
281 - }
282 -};
283 -
284 -/*
285 - Taken from http://jsbin.com/iXofIji/2/edit by PAEz
286 -*/
287 -GIFEncoder.prototype.ditherPixels = function (kernel, serpentine) {
288 - var kernels = {
289 - FalseFloydSteinberg: [
290 - [3 / 8, 1, 0],
291 - [3 / 8, 0, 1],
292 - [2 / 8, 1, 1],
293 - ],
294 - FloydSteinberg: [
295 - [7 / 16, 1, 0],
296 - [3 / 16, -1, 1],
297 - [5 / 16, 0, 1],
298 - [1 / 16, 1, 1],
299 - ],
300 - Stucki: [
301 - [8 / 42, 1, 0],
302 - [4 / 42, 2, 0],
303 - [2 / 42, -2, 1],
304 - [4 / 42, -1, 1],
305 - [8 / 42, 0, 1],
306 - [4 / 42, 1, 1],
307 - [2 / 42, 2, 1],
308 - [1 / 42, -2, 2],
309 - [2 / 42, -1, 2],
310 - [4 / 42, 0, 2],
311 - [2 / 42, 1, 2],
312 - [1 / 42, 2, 2],
313 - ],
314 - Atkinson: [
315 - [1 / 8, 1, 0],
316 - [1 / 8, 2, 0],
317 - [1 / 8, -1, 1],
318 - [1 / 8, 0, 1],
319 - [1 / 8, 1, 1],
320 - [1 / 8, 0, 2],
321 - ],
322 - };
323 -
324 - if (!kernel || !kernels[kernel]) {
325 - throw "Unknown dithering kernel: " + kernel;
326 - }
327 -
328 - var ds = kernels[kernel];
329 - var index = 0,
330 - height = this.height,
331 - width = this.width,
332 - data = this.pixels;
333 - var direction = serpentine ? -1 : 1;
334 -
335 - this.indexedPixels = new Uint8Array(this.pixels.length / 3);
336 -
337 - for (var y = 0; y < height; y++) {
338 - if (serpentine) direction = direction * -1;
339 -
340 - for (
341 - var x = direction == 1 ? 0 : width - 1, xend = direction == 1 ? width : 0;
342 - x !== xend;
343 - x += direction
344 - ) {
345 - index = y * width + x;
346 - // Get original colour
347 - var idx = index * 3;
348 - var r1 = data[idx];
349 - var g1 = data[idx + 1];
350 - var b1 = data[idx + 2];
351 -
352 - // Get converted colour
353 - idx = this.findClosestRGB(r1, g1, b1);
354 - this.usedEntry[idx] = true;
355 - this.indexedPixels[index] = idx;
356 - idx *= 3;
357 - var r2 = this.colorTab[idx];
358 - var g2 = this.colorTab[idx + 1];
359 - var b2 = this.colorTab[idx + 2];
360 -
361 - var er = r1 - r2;
362 - var eg = g1 - g2;
363 - var eb = b1 - b2;
364 -
365 - for (
366 - var i = direction == 1 ? 0 : ds.length - 1,
367 - end = direction == 1 ? ds.length : 0;
368 - i !== end;
369 - i += direction
370 - ) {
371 - var x1 = ds[i][1]; // *direction; // Should this by timesd by direction?..to make the kernel go in the opposite direction....got no idea....
372 - var y1 = ds[i][2];
373 - if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) {
374 - var d = ds[i][0];
375 - idx = index + x1 + y1 * width;
376 - idx *= 3;
377 -
378 - data[idx] = Math.max(0, Math.min(255, data[idx] + er * d));
379 - data[idx + 1] = Math.max(0, Math.min(255, data[idx + 1] + eg * d));
380 - data[idx + 2] = Math.max(0, Math.min(255, data[idx + 2] + eb * d));
381 - }
382 - }
383 - }
384 - }
385 -};
386 -
387 -/*
388 - Returns index of palette color closest to c
389 -*/
390 -GIFEncoder.prototype.findClosest = function (c, used) {
391 - return this.findClosestRGB(
392 - (c & 0xff0000) >> 16,
393 - (c & 0x00ff00) >> 8,
394 - c & 0x0000ff,
395 - used
396 - );
397 -};
398 -
399 -GIFEncoder.prototype.findClosestRGB = function (r, g, b, used) {
400 - if (this.colorTab === null) return -1;
401 -
402 - if (this.neuQuant && !used) {
403 - return this.neuQuant.lookupRGB(r, g, b);
404 - }
405 -
406 - var c = b | (g << 8) | (r << 16);
407 -
408 - var minpos = 0;
409 - var dmin = 256 * 256 * 256;
410 - var len = this.colorTab.length;
411 -
412 - for (var i = 0, index = 0; i < len; index++) {
413 - var dr = r - (this.colorTab[i++] & 0xff);
414 - var dg = g - (this.colorTab[i++] & 0xff);
415 - var db = b - (this.colorTab[i++] & 0xff);
416 - var d = dr * dr + dg * dg + db * db;
417 - if ((!used || this.usedEntry[index]) && d < dmin) {
418 - dmin = d;
419 - minpos = index;
420 - }
421 - }
422 -
423 - return minpos;
424 -};
425 -
426 -/*
427 - Extracts image pixels into byte array pixels
428 - (removes alphachannel from canvas imagedata)
429 -*/
430 -GIFEncoder.prototype.getImagePixels = function () {
431 - var w = this.width;
432 - var h = this.height;
433 - this.pixels = new Uint8Array(w * h * 3);
434 -
435 - var data = this.image;
436 - var srcPos = 0;
437 - var count = 0;
438 -
439 - for (var i = 0; i < h; i++) {
440 - for (var j = 0; j < w; j++) {
441 - this.pixels[count++] = data[srcPos++];
442 - this.pixels[count++] = data[srcPos++];
443 - this.pixels[count++] = data[srcPos++];
444 - srcPos++;
445 - }
446 - }
447 -};
448 -
449 -/*
450 - Writes Graphic Control Extension
451 -*/
452 -GIFEncoder.prototype.writeGraphicCtrlExt = function () {
453 - this.out.writeByte(0x21); // extension introducer
454 - this.out.writeByte(0xf9); // GCE label
455 - this.out.writeByte(4); // data block size
456 -
457 - var transp, disp;
458 - if (this.transparent === null) {
459 - transp = 0;
460 - disp = 0; // dispose = no action
461 - } else {
462 - transp = 1;
463 - disp = 2; // force clear if using transparent color
464 - }
465 -
466 - if (this.dispose >= 0) {
467 - disp = this.dispose & 7; // user override
468 - }
469 - disp <<= 2;
470 -
471 - // packed fields
472 - this.out.writeByte(
473 - 0 | // 1:3 reserved
474 - disp | // 4:6 disposal
475 - 0 | // 7 user input - 0 = none
476 - transp // 8 transparency flag
477 - );
478 -
479 - this.writeShort(this.delay); // delay x 1/100 sec
480 - this.out.writeByte(this.transIndex); // transparent color index
481 - this.out.writeByte(0); // block terminator
482 -};
483 -
484 -/*
485 - Writes Image Descriptor
486 -*/
487 -GIFEncoder.prototype.writeImageDesc = function () {
488 - this.out.writeByte(0x2c); // image separator
489 - this.writeShort(0); // image position x,y = 0,0
490 - this.writeShort(0);
491 - this.writeShort(this.width); // image size
492 - this.writeShort(this.height);
493 -
494 - // packed fields
495 - if (this.firstFrame || this.globalPalette) {
496 - // no LCT - GCT is used for first (or only) frame
497 - this.out.writeByte(0);
498 - } else {
499 - // specify normal LCT
500 - this.out.writeByte(
501 - 0x80 | // 1 local color table 1=yes
502 - 0 | // 2 interlace - 0=no
503 - 0 | // 3 sorted - 0=no
504 - 0 | // 4-5 reserved
505 - this.palSize // 6-8 size of color table
506 - );
507 - }
508 -};
509 -
510 -/*
511 - Writes Logical Screen Descriptor
512 -*/
513 -GIFEncoder.prototype.writeLSD = function () {
514 - // logical screen size
515 - this.writeShort(this.width);
516 - this.writeShort(this.height);
517 -
518 - // packed fields
519 - this.out.writeByte(
520 - 0x80 | // 1 : global color table flag = 1 (gct used)
521 - 0x70 | // 2-4 : color resolution = 7
522 - 0x00 | // 5 : gct sort flag = 0
523 - this.palSize // 6-8 : gct size
524 - );
525 -
526 - this.out.writeByte(0); // background color index
527 - this.out.writeByte(0); // pixel aspect ratio - assume 1:1
528 -};
529 -
530 -/*
531 - Writes Netscape application extension to define repeat count.
532 -*/
533 -GIFEncoder.prototype.writeNetscapeExt = function () {
534 - this.out.writeByte(0x21); // extension introducer
535 - this.out.writeByte(0xff); // app extension label
536 - this.out.writeByte(11); // block size
537 - this.out.writeUTFBytes("NETSCAPE2.0"); // app id + auth code
538 - this.out.writeByte(3); // sub-block size
539 - this.out.writeByte(1); // loop sub-block id
540 - this.writeShort(this.repeat); // loop count (extra iterations, 0=repeat forever)
541 - this.out.writeByte(0); // block terminator
542 -};
543 -
544 -/*
545 - Writes color table
546 -*/
547 -GIFEncoder.prototype.writePalette = function () {
548 - this.out.writeBytes(this.colorTab);
549 - var n = 3 * 256 - this.colorTab.length;
550 - for (var i = 0; i < n; i++) this.out.writeByte(0);
551 -};
552 -
553 -GIFEncoder.prototype.writeShort = function (pValue) {
554 - this.out.writeByte(pValue & 0xff);
555 - this.out.writeByte((pValue >> 8) & 0xff);
556 -};
557 -
558 -/*
559 - Encodes and writes pixel data
560 -*/
561 -GIFEncoder.prototype.writePixels = function () {
562 - var enc = new LZWEncoder(
563 - this.width,
564 - this.height,
565 - this.indexedPixels,
566 - this.colorDepth
567 - );
568 - enc.encode(this.out);
569 -};
570 -
571 -/*
572 - Retrieves the GIF stream
573 -*/
574 -GIFEncoder.prototype.stream = function () {
575 - return this.out;
576 -};
577 -
578 -module.exports = GIFEncoder;
1 -/*
2 - LZWEncoder.js
3 -
4 - Authors
5 - Kevin Weiner (original Java version - kweiner@fmsware.com)
6 - Thibault Imbert (AS3 version - bytearray.org)
7 - Johan Nordberg (JS version - code@johan-nordberg.com)
8 -
9 - Acknowledgements
10 - GIFCOMPR.C - GIF Image compression routines
11 - Lempel-Ziv compression based on 'compress'. GIF modifications by
12 - David Rowley (mgardi@watdcsu.waterloo.edu)
13 - GIF Image compression - modified 'compress'
14 - Based on: compress.c - File compression ala IEEE Computer, June 1984.
15 - By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)
16 - Jim McKie (decvax!mcvax!jim)
17 - Steve Davies (decvax!vax135!petsd!peora!srd)
18 - Ken Turkowski (decvax!decwrl!turtlevax!ken)
19 - James A. Woods (decvax!ihnp4!ames!jaw)
20 - Joe Orost (decvax!vax135!petsd!joe)
21 -*/
22 -
23 -var EOF = -1;
24 -var BITS = 12;
25 -var HSIZE = 5003; // 80% occupancy
26 -var masks = [
27 - 0x0000,
28 - 0x0001,
29 - 0x0003,
30 - 0x0007,
31 - 0x000f,
32 - 0x001f,
33 - 0x003f,
34 - 0x007f,
35 - 0x00ff,
36 - 0x01ff,
37 - 0x03ff,
38 - 0x07ff,
39 - 0x0fff,
40 - 0x1fff,
41 - 0x3fff,
42 - 0x7fff,
43 - 0xffff,
44 -];
45 -
46 -function LZWEncoder(width, height, pixels, colorDepth) {
47 - var initCodeSize = Math.max(2, colorDepth);
48 -
49 - var accum = new Uint8Array(256);
50 - var htab = new Int32Array(HSIZE);
51 - var codetab = new Int32Array(HSIZE);
52 -
53 - var cur_accum,
54 - cur_bits = 0;
55 - var a_count;
56 - var free_ent = 0; // first unused entry
57 - var maxcode;
58 -
59 - // block compression parameters -- after all codes are used up,
60 - // and compression rate changes, start over.
61 - var clear_flg = false;
62 -
63 - // Algorithm: use open addressing double hashing (no chaining) on the
64 - // prefix code / next character combination. We do a variant of Knuth's
65 - // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
66 - // secondary probe. Here, the modular division first probe is gives way
67 - // to a faster exclusive-or manipulation. Also do block compression with
68 - // an adaptive reset, whereby the code table is cleared when the compression
69 - // ratio decreases, but after the table fills. The variable-length output
70 - // codes are re-sized at this point, and a special CLEAR code is generated
71 - // for the decompressor. Late addition: construct the table according to
72 - // file size for noticeable speed improvement on small files. Please direct
73 - // questions about this implementation to ames!jaw.
74 - var g_init_bits, ClearCode, EOFCode;
75 -
76 - // Add a character to the end of the current packet, and if it is 254
77 - // characters, flush the packet to disk.
78 - function char_out(c, outs) {
79 - accum[a_count++] = c;
80 - if (a_count >= 254) flush_char(outs);
81 - }
82 -
83 - // Clear out the hash table
84 - // table clear for block compress
85 - function cl_block(outs) {
86 - cl_hash(HSIZE);
87 - free_ent = ClearCode + 2;
88 - clear_flg = true;
89 - output(ClearCode, outs);
90 - }
91 -
92 - // Reset code table
93 - function cl_hash(hsize) {
94 - for (var i = 0; i < hsize; ++i) htab[i] = -1;
95 - }
96 -
97 - function compress(init_bits, outs) {
98 - var fcode, c, i, ent, disp, hsize_reg, hshift;
99 -
100 - // Set up the globals: g_init_bits - initial number of bits
101 - g_init_bits = init_bits;
102 -
103 - // Set up the necessary values
104 - clear_flg = false;
105 - n_bits = g_init_bits;
106 - maxcode = MAXCODE(n_bits);
107 -
108 - ClearCode = 1 << (init_bits - 1);
109 - EOFCode = ClearCode + 1;
110 - free_ent = ClearCode + 2;
111 -
112 - a_count = 0; // clear packet
113 -
114 - ent = nextPixel();
115 -
116 - hshift = 0;
117 - for (fcode = HSIZE; fcode < 65536; fcode *= 2) ++hshift;
118 - hshift = 8 - hshift; // set hash code range bound
119 - hsize_reg = HSIZE;
120 - cl_hash(hsize_reg); // clear hash table
121 -
122 - output(ClearCode, outs);
123 -
124 - outer_loop: while ((c = nextPixel()) != EOF) {
125 - fcode = (c << BITS) + ent;
126 - i = (c << hshift) ^ ent; // xor hashing
127 - if (htab[i] === fcode) {
128 - ent = codetab[i];
129 - continue;
130 - } else if (htab[i] >= 0) {
131 - // non-empty slot
132 - disp = hsize_reg - i; // secondary hash (after G. Knott)
133 - if (i === 0) disp = 1;
134 - do {
135 - if ((i -= disp) < 0) i += hsize_reg;
136 - if (htab[i] === fcode) {
137 - ent = codetab[i];
138 - continue outer_loop;
139 - }
140 - } while (htab[i] >= 0);
141 - }
142 - output(ent, outs);
143 - ent = c;
144 - if (free_ent < 1 << BITS) {
145 - codetab[i] = free_ent++; // code -> hashtable
146 - htab[i] = fcode;
147 - } else {
148 - cl_block(outs);
149 - }
150 - }
151 -
152 - // Put out the final code.
153 - output(ent, outs);
154 - output(EOFCode, outs);
155 - }
156 -
157 - function encode(outs) {
158 - outs.writeByte(initCodeSize); // write "initial code size" byte
159 - remaining = width * height; // reset navigation variables
160 - curPixel = 0;
161 - compress(initCodeSize + 1, outs); // compress and write the pixel data
162 - outs.writeByte(0); // write block terminator
163 - }
164 -
165 - // Flush the packet to disk, and reset the accumulator
166 - function flush_char(outs) {
167 - if (a_count > 0) {
168 - outs.writeByte(a_count);
169 - outs.writeBytes(accum, 0, a_count);
170 - a_count = 0;
171 - }
172 - }
173 -
174 - function MAXCODE(n_bits) {
175 - return (1 << n_bits) - 1;
176 - }
177 -
178 - // Return the next pixel from the image
179 - function nextPixel() {
180 - if (remaining === 0) return EOF;
181 - --remaining;
182 - var pix = pixels[curPixel++];
183 - return pix & 0xff;
184 - }
185 -
186 - function output(code, outs) {
187 - cur_accum &= masks[cur_bits];
188 -
189 - if (cur_bits > 0) cur_accum |= code << cur_bits;
190 - else cur_accum = code;
191 -
192 - cur_bits += n_bits;
193 -
194 - while (cur_bits >= 8) {
195 - char_out(cur_accum & 0xff, outs);
196 - cur_accum >>= 8;
197 - cur_bits -= 8;
198 - }
199 -
200 - // If the next entry is going to be too big for the code size,
201 - // then increase it, if possible.
202 - if (free_ent > maxcode || clear_flg) {
203 - if (clear_flg) {
204 - maxcode = MAXCODE((n_bits = g_init_bits));
205 - clear_flg = false;
206 - } else {
207 - ++n_bits;
208 - if (n_bits == BITS) maxcode = 1 << BITS;
209 - else maxcode = MAXCODE(n_bits);
210 - }
211 - }
212 -
213 - if (code == EOFCode) {
214 - // At EOF, write the rest of the buffer.
215 - while (cur_bits > 0) {
216 - char_out(cur_accum & 0xff, outs);
217 - cur_accum >>= 8;
218 - cur_bits -= 8;
219 - }
220 - flush_char(outs);
221 - }
222 - }
223 -
224 - this.encode = encode;
225 -}
226 -
227 -module.exports = LZWEncoder;
1 -/* NeuQuant Neural-Net Quantization Algorithm
2 - * ------------------------------------------
3 - *
4 - * Copyright (c) 1994 Anthony Dekker
5 - *
6 - * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994.
7 - * See "Kohonen neural networks for optimal colour quantization"
8 - * in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367.
9 - * for a discussion of the algorithm.
10 - * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML
11 - *
12 - * Any party obtaining a copy of these files from the author, directly or
13 - * indirectly, is granted, free of charge, a full and unrestricted irrevocable,
14 - * world-wide, paid up, royalty-free, nonexclusive right and license to deal
15 - * in this software and documentation files (the "Software"), including without
16 - * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 - * and/or sell copies of the Software, and to permit persons who receive
18 - * copies from any such party to do so, with the only requirement being
19 - * that this copyright notice remain intact.
20 - *
21 - * (JavaScript port 2012 by Johan Nordberg)
22 - */
23 -
24 -function toInt(v) {
25 - return ~~v;
26 -}
27 -
28 -var ncycles = 100; // number of learning cycles
29 -var netsize = 256; // number of colors used
30 -var maxnetpos = netsize - 1;
31 -
32 -// defs for freq and bias
33 -var netbiasshift = 4; // bias for colour values
34 -var intbiasshift = 16; // bias for fractions
35 -var intbias = 1 << intbiasshift;
36 -var gammashift = 10;
37 -var gamma = 1 << gammashift;
38 -var betashift = 10;
39 -var beta = intbias >> betashift; /* beta = 1/1024 */
40 -var betagamma = intbias << (gammashift - betashift);
41 -
42 -// defs for decreasing radius factor
43 -var initrad = netsize >> 3; // for 256 cols, radius starts
44 -var radiusbiasshift = 6; // at 32.0 biased by 6 bits
45 -var radiusbias = 1 << radiusbiasshift;
46 -var initradius = initrad * radiusbias; //and decreases by a
47 -var radiusdec = 30; // factor of 1/30 each cycle
48 -
49 -// defs for decreasing alpha factor
50 -var alphabiasshift = 10; // alpha starts at 1.0
51 -var initalpha = 1 << alphabiasshift;
52 -var alphadec; // biased by 10 bits
53 -
54 -/* radbias and alpharadbias used for radpower calculation */
55 -var radbiasshift = 8;
56 -var radbias = 1 << radbiasshift;
57 -var alpharadbshift = alphabiasshift + radbiasshift;
58 -var alpharadbias = 1 << alpharadbshift;
59 -
60 -// four primes near 500 - assume no image has a length so large that it is
61 -// divisible by all four primes
62 -var prime1 = 499;
63 -var prime2 = 491;
64 -var prime3 = 487;
65 -var prime4 = 503;
66 -var minpicturebytes = 3 * prime4;
67 -
68 -/*
69 - Constructor: NeuQuant
70 -
71 - Arguments:
72 -
73 - pixels - array of pixels in RGB format
74 - samplefac - sampling factor 1 to 30 where lower is better quality
75 -
76 - >
77 - > pixels = [r, g, b, r, g, b, r, g, b, ..]
78 - >
79 -*/
80 -function NeuQuant(pixels, samplefac) {
81 - var network; // int[netsize][4]
82 - var netindex; // for network lookup - really 256
83 -
84 - // bias and freq arrays for learning
85 - var bias;
86 - var freq;
87 - var radpower;
88 -
89 - /*
90 - Private Method: init
91 -
92 - sets up arrays
93 - */
94 - function init() {
95 - network = [];
96 - netindex = [];
97 - bias = [];
98 - freq = [];
99 - radpower = [];
100 -
101 - var i, v;
102 - for (i = 0; i < netsize; i++) {
103 - v = (i << (netbiasshift + 8)) / netsize;
104 - network[i] = [v, v, v];
105 - freq[i] = intbias / netsize;
106 - bias[i] = 0;
107 - }
108 - }
109 -
110 - /*
111 - Private Method: unbiasnet
112 -
113 - unbiases network to give byte values 0..255 and record position i to prepare for sort
114 - */
115 - function unbiasnet() {
116 - for (var i = 0; i < netsize; i++) {
117 - network[i][0] >>= netbiasshift;
118 - network[i][1] >>= netbiasshift;
119 - network[i][2] >>= netbiasshift;
120 - network[i][3] = i; // record color number
121 - }
122 - }
123 -
124 - /*
125 - Private Method: altersingle
126 -
127 - moves neuron *i* towards biased (b,g,r) by factor *alpha*
128 - */
129 - function altersingle(alpha, i, b, g, r) {
130 - network[i][0] -= (alpha * (network[i][0] - b)) / initalpha;
131 - network[i][1] -= (alpha * (network[i][1] - g)) / initalpha;
132 - network[i][2] -= (alpha * (network[i][2] - r)) / initalpha;
133 - }
134 -
135 - /*
136 - Private Method: alterneigh
137 -
138 - moves neurons in *radius* around index *i* towards biased (b,g,r) by factor *alpha*
139 - */
140 - function alterneigh(radius, i, b, g, r) {
141 - var lo = Math.abs(i - radius);
142 - var hi = Math.min(i + radius, netsize);
143 -
144 - var j = i + 1;
145 - var k = i - 1;
146 - var m = 1;
147 -
148 - var p, a;
149 - while (j < hi || k > lo) {
150 - a = radpower[m++];
151 -
152 - if (j < hi) {
153 - p = network[j++];
154 - p[0] -= (a * (p[0] - b)) / alpharadbias;
155 - p[1] -= (a * (p[1] - g)) / alpharadbias;
156 - p[2] -= (a * (p[2] - r)) / alpharadbias;
157 - }
158 -
159 - if (k > lo) {
160 - p = network[k--];
161 - p[0] -= (a * (p[0] - b)) / alpharadbias;
162 - p[1] -= (a * (p[1] - g)) / alpharadbias;
163 - p[2] -= (a * (p[2] - r)) / alpharadbias;
164 - }
165 - }
166 - }
167 -
168 - /*
169 - Private Method: contest
170 -
171 - searches for biased BGR values
172 - */
173 - function contest(b, g, r) {
174 - /*
175 - finds closest neuron (min dist) and updates freq
176 - finds best neuron (min dist-bias) and returns position
177 - for frequently chosen neurons, freq[i] is high and bias[i] is negative
178 - bias[i] = gamma * ((1 / netsize) - freq[i])
179 - */
180 -
181 - var bestd = ~(1 << 31);
182 - var bestbiasd = bestd;
183 - var bestpos = -1;
184 - var bestbiaspos = bestpos;
185 -
186 - var i, n, dist, biasdist, betafreq;
187 - for (i = 0; i < netsize; i++) {
188 - n = network[i];
189 -
190 - dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);
191 - if (dist < bestd) {
192 - bestd = dist;
193 - bestpos = i;
194 - }
195 -
196 - biasdist = dist - (bias[i] >> (intbiasshift - netbiasshift));
197 - if (biasdist < bestbiasd) {
198 - bestbiasd = biasdist;
199 - bestbiaspos = i;
200 - }
201 -
202 - betafreq = freq[i] >> betashift;
203 - freq[i] -= betafreq;
204 - bias[i] += betafreq << gammashift;
205 - }
206 -
207 - freq[bestpos] += beta;
208 - bias[bestpos] -= betagamma;
209 -
210 - return bestbiaspos;
211 - }
212 -
213 - /*
214 - Private Method: inxbuild
215 -
216 - sorts network and builds netindex[0..255]
217 - */
218 - function inxbuild() {
219 - var i,
220 - j,
221 - p,
222 - q,
223 - smallpos,
224 - smallval,
225 - previouscol = 0,
226 - startpos = 0;
227 - for (i = 0; i < netsize; i++) {
228 - p = network[i];
229 - smallpos = i;
230 - smallval = p[1]; // index on g
231 - // find smallest in i..netsize-1
232 - for (j = i + 1; j < netsize; j++) {
233 - q = network[j];
234 - if (q[1] < smallval) {
235 - // index on g
236 - smallpos = j;
237 - smallval = q[1]; // index on g
238 - }
239 - }
240 - q = network[smallpos];
241 - // swap p (i) and q (smallpos) entries
242 - if (i != smallpos) {
243 - j = q[0];
244 - q[0] = p[0];
245 - p[0] = j;
246 - j = q[1];
247 - q[1] = p[1];
248 - p[1] = j;
249 - j = q[2];
250 - q[2] = p[2];
251 - p[2] = j;
252 - j = q[3];
253 - q[3] = p[3];
254 - p[3] = j;
255 - }
256 - // smallval entry is now in position i
257 -
258 - if (smallval != previouscol) {
259 - netindex[previouscol] = (startpos + i) >> 1;
260 - for (j = previouscol + 1; j < smallval; j++) netindex[j] = i;
261 - previouscol = smallval;
262 - startpos = i;
263 - }
264 - }
265 - netindex[previouscol] = (startpos + maxnetpos) >> 1;
266 - for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos; // really 256
267 - }
268 -
269 - /*
270 - Private Method: inxsearch
271 -
272 - searches for BGR values 0..255 and returns a color index
273 - */
274 - function inxsearch(b, g, r) {
275 - var a, p, dist;
276 -
277 - var bestd = 1000; // biggest possible dist is 256*3
278 - var best = -1;
279 -
280 - var i = netindex[g]; // index on g
281 - var j = i - 1; // start at netindex[g] and work outwards
282 -
283 - while (i < netsize || j >= 0) {
284 - if (i < netsize) {
285 - p = network[i];
286 - dist = p[1] - g; // inx key
287 - if (dist >= bestd) i = netsize;
288 - // stop iter
289 - else {
290 - i++;
291 - if (dist < 0) dist = -dist;
292 - a = p[0] - b;
293 - if (a < 0) a = -a;
294 - dist += a;
295 - if (dist < bestd) {
296 - a = p[2] - r;
297 - if (a < 0) a = -a;
298 - dist += a;
299 - if (dist < bestd) {
300 - bestd = dist;
301 - best = p[3];
302 - }
303 - }
304 - }
305 - }
306 - if (j >= 0) {
307 - p = network[j];
308 - dist = g - p[1]; // inx key - reverse dif
309 - if (dist >= bestd) j = -1;
310 - // stop iter
311 - else {
312 - j--;
313 - if (dist < 0) dist = -dist;
314 - a = p[0] - b;
315 - if (a < 0) a = -a;
316 - dist += a;
317 - if (dist < bestd) {
318 - a = p[2] - r;
319 - if (a < 0) a = -a;
320 - dist += a;
321 - if (dist < bestd) {
322 - bestd = dist;
323 - best = p[3];
324 - }
325 - }
326 - }
327 - }
328 - }
329 -
330 - return best;
331 - }
332 -
333 - /*
334 - Private Method: learn
335 -
336 - "Main Learning Loop"
337 - */
338 - function learn() {
339 - var i;
340 -
341 - var lengthcount = pixels.length;
342 - var alphadec = toInt(30 + (samplefac - 1) / 3);
343 - var samplepixels = toInt(lengthcount / (3 * samplefac));
344 - var delta = toInt(samplepixels / ncycles);
345 - var alpha = initalpha;
346 - var radius = initradius;
347 -
348 - var rad = radius >> radiusbiasshift;
349 -
350 - if (rad <= 1) rad = 0;
351 - for (i = 0; i < rad; i++)
352 - radpower[i] = toInt(
353 - alpha * (((rad * rad - i * i) * radbias) / (rad * rad))
354 - );
355 -
356 - var step;
357 - if (lengthcount < minpicturebytes) {
358 - samplefac = 1;
359 - step = 3;
360 - } else if (lengthcount % prime1 !== 0) {
361 - step = 3 * prime1;
362 - } else if (lengthcount % prime2 !== 0) {
363 - step = 3 * prime2;
364 - } else if (lengthcount % prime3 !== 0) {
365 - step = 3 * prime3;
366 - } else {
367 - step = 3 * prime4;
368 - }
369 -
370 - var b, g, r, j;
371 - var pix = 0; // current pixel
372 -
373 - i = 0;
374 - while (i < samplepixels) {
375 - b = (pixels[pix] & 0xff) << netbiasshift;
376 - g = (pixels[pix + 1] & 0xff) << netbiasshift;
377 - r = (pixels[pix + 2] & 0xff) << netbiasshift;
378 -
379 - j = contest(b, g, r);
380 -
381 - altersingle(alpha, j, b, g, r);
382 - if (rad !== 0) alterneigh(rad, j, b, g, r); // alter neighbours
383 -
384 - pix += step;
385 - if (pix >= lengthcount) pix -= lengthcount;
386 -
387 - i++;
388 -
389 - if (delta === 0) delta = 1;
390 - if (i % delta === 0) {
391 - alpha -= alpha / alphadec;
392 - radius -= radius / radiusdec;
393 - rad = radius >> radiusbiasshift;
394 -
395 - if (rad <= 1) rad = 0;
396 - for (j = 0; j < rad; j++)
397 - radpower[j] = toInt(
398 - alpha * (((rad * rad - j * j) * radbias) / (rad * rad))
399 - );
400 - }
401 - }
402 - }
403 -
404 - /*
405 - Method: buildColormap
406 -
407 - 1. initializes network
408 - 2. trains it
409 - 3. removes misconceptions
410 - 4. builds colorindex
411 - */
412 - function buildColormap() {
413 - init();
414 - learn();
415 - unbiasnet();
416 - inxbuild();
417 - }
418 - this.buildColormap = buildColormap;
419 -
420 - /*
421 - Method: getColormap
422 -
423 - builds colormap from the index
424 -
425 - returns array in the format:
426 -
427 - >
428 - > [r, g, b, r, g, b, r, g, b, ..]
429 - >
430 - */
431 - function getColormap() {
432 - var map = [];
433 - var index = [];
434 -
435 - for (var i = 0; i < netsize; i++) index[network[i][3]] = i;
436 -
437 - var k = 0;
438 - for (var l = 0; l < netsize; l++) {
439 - var j = index[l];
440 - map[k++] = network[j][0];
441 - map[k++] = network[j][1];
442 - map[k++] = network[j][2];
443 - }
444 - return map;
445 - }
446 - this.getColormap = getColormap;
447 -
448 - /*
449 - Method: lookupRGB
450 -
451 - looks for the closest *r*, *g*, *b* color in the map and
452 - returns its index
453 - */
454 - this.lookupRGB = inxsearch;
455 -}
456 -
457 -module.exports = NeuQuant;
1 -/* NeuQuant Neural-Net Quantization Algorithm
2 - * ------------------------------------------
3 - *
4 - * Copyright (c) 1994 Anthony Dekker
5 - *
6 - * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994.
7 - * See "Kohonen neural networks for optimal colour quantization"
8 - * in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367.
9 - * for a discussion of the algorithm.
10 - * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML
11 - *
12 - * Any party obtaining a copy of these files from the author, directly or
13 - * indirectly, is granted, free of charge, a full and unrestricted irrevocable,
14 - * world-wide, paid up, royalty-free, nonexclusive right and license to deal
15 - * in this software and documentation files (the "Software"), including without
16 - * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 - * and/or sell copies of the Software, and to permit persons who receive
18 - * copies from any such party to do so, with the only requirement being
19 - * that this copyright notice remain intact.
20 - *
21 - * (JavaScript port 2012 by Johan Nordberg)
22 - */
23 -
24 -var ncycles = 100; // number of learning cycles
25 -var netsize = 256; // number of colors used
26 -var maxnetpos = netsize - 1;
27 -
28 -// defs for freq and bias
29 -var netbiasshift = 4; // bias for colour values
30 -var intbiasshift = 16; // bias for fractions
31 -var intbias = 1 << intbiasshift;
32 -var gammashift = 10;
33 -var gamma = 1 << gammashift;
34 -var betashift = 10;
35 -var beta = intbias >> betashift; /* beta = 1/1024 */
36 -var betagamma = intbias << (gammashift - betashift);
37 -
38 -// defs for decreasing radius factor
39 -var initrad = netsize >> 3; // for 256 cols, radius starts
40 -var radiusbiasshift = 6; // at 32.0 biased by 6 bits
41 -var radiusbias = 1 << radiusbiasshift;
42 -var initradius = initrad * radiusbias; //and decreases by a
43 -var radiusdec = 30; // factor of 1/30 each cycle
44 -
45 -// defs for decreasing alpha factor
46 -var alphabiasshift = 10; // alpha starts at 1.0
47 -var initalpha = 1 << alphabiasshift;
48 -var alphadec; // biased by 10 bits
49 -
50 -/* radbias and alpharadbias used for radpower calculation */
51 -var radbiasshift = 8;
52 -var radbias = 1 << radbiasshift;
53 -var alpharadbshift = alphabiasshift + radbiasshift;
54 -var alpharadbias = 1 << alpharadbshift;
55 -
56 -// four primes near 500 - assume no image has a length so large that it is
57 -// divisible by all four primes
58 -var prime1 = 499;
59 -var prime2 = 491;
60 -var prime3 = 487;
61 -var prime4 = 503;
62 -var minpicturebytes = 3 * prime4;
63 -
64 -/*
65 - Constructor: NeuQuant
66 -
67 - Arguments:
68 -
69 - pixels - array of pixels in RGB format
70 - samplefac - sampling factor 1 to 30 where lower is better quality
71 -
72 - >
73 - > pixels = [r, g, b, r, g, b, r, g, b, ..]
74 - >
75 -*/
76 -function NeuQuant(pixels, samplefac) {
77 - var network; // int[netsize][4]
78 - var netindex; // for network lookup - really 256
79 -
80 - // bias and freq arrays for learning
81 - var bias;
82 - var freq;
83 - var radpower;
84 -
85 - /*
86 - Private Method: init
87 -
88 - sets up arrays
89 - */
90 - function init() {
91 - network = [];
92 - netindex = new Int32Array(256);
93 - bias = new Int32Array(netsize);
94 - freq = new Int32Array(netsize);
95 - radpower = new Int32Array(netsize >> 3);
96 -
97 - var i, v;
98 - for (i = 0; i < netsize; i++) {
99 - v = (i << (netbiasshift + 8)) / netsize;
100 - network[i] = new Float64Array([v, v, v, 0]);
101 - //network[i] = [v, v, v, 0]
102 - freq[i] = intbias / netsize;
103 - bias[i] = 0;
104 - }
105 - }
106 -
107 - /*
108 - Private Method: unbiasnet
109 -
110 - unbiases network to give byte values 0..255 and record position i to prepare for sort
111 - */
112 - function unbiasnet() {
113 - for (var i = 0; i < netsize; i++) {
114 - network[i][0] >>= netbiasshift;
115 - network[i][1] >>= netbiasshift;
116 - network[i][2] >>= netbiasshift;
117 - network[i][3] = i; // record color number
118 - }
119 - }
120 -
121 - /*
122 - Private Method: altersingle
123 -
124 - moves neuron *i* towards biased (b,g,r) by factor *alpha*
125 - */
126 - function altersingle(alpha, i, b, g, r) {
127 - network[i][0] -= (alpha * (network[i][0] - b)) / initalpha;
128 - network[i][1] -= (alpha * (network[i][1] - g)) / initalpha;
129 - network[i][2] -= (alpha * (network[i][2] - r)) / initalpha;
130 - }
131 -
132 - /*
133 - Private Method: alterneigh
134 -
135 - moves neurons in *radius* around index *i* towards biased (b,g,r) by factor *alpha*
136 - */
137 - function alterneigh(radius, i, b, g, r) {
138 - var lo = Math.abs(i - radius);
139 - var hi = Math.min(i + radius, netsize);
140 -
141 - var j = i + 1;
142 - var k = i - 1;
143 - var m = 1;
144 -
145 - var p, a;
146 - while (j < hi || k > lo) {
147 - a = radpower[m++];
148 -
149 - if (j < hi) {
150 - p = network[j++];
151 - p[0] -= (a * (p[0] - b)) / alpharadbias;
152 - p[1] -= (a * (p[1] - g)) / alpharadbias;
153 - p[2] -= (a * (p[2] - r)) / alpharadbias;
154 - }
155 -
156 - if (k > lo) {
157 - p = network[k--];
158 - p[0] -= (a * (p[0] - b)) / alpharadbias;
159 - p[1] -= (a * (p[1] - g)) / alpharadbias;
160 - p[2] -= (a * (p[2] - r)) / alpharadbias;
161 - }
162 - }
163 - }
164 -
165 - /*
166 - Private Method: contest
167 -
168 - searches for biased BGR values
169 - */
170 - function contest(b, g, r) {
171 - /*
172 - finds closest neuron (min dist) and updates freq
173 - finds best neuron (min dist-bias) and returns position
174 - for frequently chosen neurons, freq[i] is high and bias[i] is negative
175 - bias[i] = gamma * ((1 / netsize) - freq[i])
176 - */
177 -
178 - var bestd = ~(1 << 31);
179 - var bestbiasd = bestd;
180 - var bestpos = -1;
181 - var bestbiaspos = bestpos;
182 -
183 - var i, n, dist, biasdist, betafreq;
184 - for (i = 0; i < netsize; i++) {
185 - n = network[i];
186 -
187 - dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r);
188 - if (dist < bestd) {
189 - bestd = dist;
190 - bestpos = i;
191 - }
192 -
193 - biasdist = dist - (bias[i] >> (intbiasshift - netbiasshift));
194 - if (biasdist < bestbiasd) {
195 - bestbiasd = biasdist;
196 - bestbiaspos = i;
197 - }
198 -
199 - betafreq = freq[i] >> betashift;
200 - freq[i] -= betafreq;
201 - bias[i] += betafreq << gammashift;
202 - }
203 -
204 - freq[bestpos] += beta;
205 - bias[bestpos] -= betagamma;
206 -
207 - return bestbiaspos;
208 - }
209 -
210 - /*
211 - Private Method: inxbuild
212 -
213 - sorts network and builds netindex[0..255]
214 - */
215 - function inxbuild() {
216 - var i,
217 - j,
218 - p,
219 - q,
220 - smallpos,
221 - smallval,
222 - previouscol = 0,
223 - startpos = 0;
224 - for (i = 0; i < netsize; i++) {
225 - p = network[i];
226 - smallpos = i;
227 - smallval = p[1]; // index on g
228 - // find smallest in i..netsize-1
229 - for (j = i + 1; j < netsize; j++) {
230 - q = network[j];
231 - if (q[1] < smallval) {
232 - // index on g
233 - smallpos = j;
234 - smallval = q[1]; // index on g
235 - }
236 - }
237 - q = network[smallpos];
238 - // swap p (i) and q (smallpos) entries
239 - if (i != smallpos) {
240 - j = q[0];
241 - q[0] = p[0];
242 - p[0] = j;
243 - j = q[1];
244 - q[1] = p[1];
245 - p[1] = j;
246 - j = q[2];
247 - q[2] = p[2];
248 - p[2] = j;
249 - j = q[3];
250 - q[3] = p[3];
251 - p[3] = j;
252 - }
253 - // smallval entry is now in position i
254 -
255 - if (smallval != previouscol) {
256 - netindex[previouscol] = (startpos + i) >> 1;
257 - for (j = previouscol + 1; j < smallval; j++) netindex[j] = i;
258 - previouscol = smallval;
259 - startpos = i;
260 - }
261 - }
262 - netindex[previouscol] = (startpos + maxnetpos) >> 1;
263 - for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos; // really 256
264 - }
265 -
266 - /*
267 - Private Method: inxsearch
268 -
269 - searches for BGR values 0..255 and returns a color index
270 - */
271 - function inxsearch(b, g, r) {
272 - var a, p, dist;
273 -
274 - var bestd = 1000; // biggest possible dist is 256*3
275 - var best = -1;
276 -
277 - var i = netindex[g]; // index on g
278 - var j = i - 1; // start at netindex[g] and work outwards
279 -
280 - while (i < netsize || j >= 0) {
281 - if (i < netsize) {
282 - p = network[i];
283 - dist = p[1] - g; // inx key
284 - if (dist >= bestd) i = netsize;
285 - // stop iter
286 - else {
287 - i++;
288 - if (dist < 0) dist = -dist;
289 - a = p[0] - b;
290 - if (a < 0) a = -a;
291 - dist += a;
292 - if (dist < bestd) {
293 - a = p[2] - r;
294 - if (a < 0) a = -a;
295 - dist += a;
296 - if (dist < bestd) {
297 - bestd = dist;
298 - best = p[3];
299 - }
300 - }
301 - }
302 - }
303 - if (j >= 0) {
304 - p = network[j];
305 - dist = g - p[1]; // inx key - reverse dif
306 - if (dist >= bestd) j = -1;
307 - // stop iter
308 - else {
309 - j--;
310 - if (dist < 0) dist = -dist;
311 - a = p[0] - b;
312 - if (a < 0) a = -a;
313 - dist += a;
314 - if (dist < bestd) {
315 - a = p[2] - r;
316 - if (a < 0) a = -a;
317 - dist += a;
318 - if (dist < bestd) {
319 - bestd = dist;
320 - best = p[3];
321 - }
322 - }
323 - }
324 - }
325 - }
326 -
327 - return best;
328 - }
329 -
330 - /*
331 - Private Method: learn
332 -
333 - "Main Learning Loop"
334 - */
335 - function learn() {
336 - var i;
337 -
338 - var lengthcount = pixels.length;
339 - var alphadec = 30 + (samplefac - 1) / 3;
340 - var samplepixels = lengthcount / (3 * samplefac);
341 - var delta = ~~(samplepixels / ncycles);
342 - var alpha = initalpha;
343 - var radius = initradius;
344 -
345 - var rad = radius >> radiusbiasshift;
346 -
347 - if (rad <= 1) rad = 0;
348 - for (i = 0; i < rad; i++)
349 - radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad));
350 -
351 - var step;
352 - if (lengthcount < minpicturebytes) {
353 - samplefac = 1;
354 - step = 3;
355 - } else if (lengthcount % prime1 !== 0) {
356 - step = 3 * prime1;
357 - } else if (lengthcount % prime2 !== 0) {
358 - step = 3 * prime2;
359 - } else if (lengthcount % prime3 !== 0) {
360 - step = 3 * prime3;
361 - } else {
362 - step = 3 * prime4;
363 - }
364 -
365 - var b, g, r, j;
366 - var pix = 0; // current pixel
367 -
368 - i = 0;
369 - while (i < samplepixels) {
370 - b = (pixels[pix] & 0xff) << netbiasshift;
371 - g = (pixels[pix + 1] & 0xff) << netbiasshift;
372 - r = (pixels[pix + 2] & 0xff) << netbiasshift;
373 -
374 - j = contest(b, g, r);
375 -
376 - altersingle(alpha, j, b, g, r);
377 - if (rad !== 0) alterneigh(rad, j, b, g, r); // alter neighbours
378 -
379 - pix += step;
380 - if (pix >= lengthcount) pix -= lengthcount;
381 -
382 - i++;
383 -
384 - if (delta === 0) delta = 1;
385 - if (i % delta === 0) {
386 - alpha -= alpha / alphadec;
387 - radius -= radius / radiusdec;
388 - rad = radius >> radiusbiasshift;
389 -
390 - if (rad <= 1) rad = 0;
391 - for (j = 0; j < rad; j++)
392 - radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
393 - }
394 - }
395 - }
396 -
397 - /*
398 - Method: buildColormap
399 -
400 - 1. initializes network
401 - 2. trains it
402 - 3. removes misconceptions
403 - 4. builds colorindex
404 - */
405 - function buildColormap() {
406 - init();
407 - learn();
408 - unbiasnet();
409 - inxbuild();
410 - }
411 - this.buildColormap = buildColormap;
412 -
413 - /*
414 - Method: getColormap
415 -
416 - builds colormap from the index
417 -
418 - returns array in the format:
419 -
420 - >
421 - > [r, g, b, r, g, b, r, g, b, ..]
422 - >
423 - */
424 - function getColormap() {
425 - var map = [];
426 - var index = [];
427 -
428 - for (var i = 0; i < netsize; i++) index[network[i][3]] = i;
429 -
430 - var k = 0;
431 - for (var l = 0; l < netsize; l++) {
432 - var j = index[l];
433 - map[k++] = network[j][0];
434 - map[k++] = network[j][1];
435 - map[k++] = network[j][2];
436 - }
437 - return map;
438 - }
439 - this.getColormap = getColormap;
440 -
441 - /*
442 - Method: lookupRGB
443 -
444 - looks for the closest *r*, *g*, *b* color in the map and
445 - returns its index
446 - */
447 - this.lookupRGB = inxsearch;
448 -}
449 -
450 -module.exports = NeuQuant;