Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
b4c7792a93 | |||
2a31a1bd84 | |||
2c560659a7 | |||
8155fc2f1f | |||
c5446f234c | |||
bb6893e025 | |||
83d5357ac0 | |||
90706159fc | |||
c78f0c3747 | |||
0ba4b7cbd6 | |||
259597a70b | |||
18b2bd1135 | |||
e60ffddfd7 | |||
d808c72798 | |||
fcde9633ab | |||
e581075f64 | |||
eb08d0049a | |||
eed44dff97 | |||
93474b025e | |||
5df81ad062 | |||
e00814ebe2 | |||
4dab94686a | |||
d9f65701e1 | |||
2c9f447399 | |||
0e76dffaad | |||
246d3ed6b3 | |||
df28fd434c | |||
7e97b36249 | |||
c2218bce90 | |||
045cb14c54 | |||
44a5b4921a | |||
18f7591c6a | |||
b8d0d5202d | |||
e26d8895a4 | |||
b5ad52cfcf | |||
e1dd2796c1 | |||
98bc151907 | |||
36d23644aa | |||
3697635bae | |||
de1eb76226 |
66
codecs/jxl/Makefile
Normal file
66
codecs/jxl/Makefile
Normal file
@ -0,0 +1,66 @@
|
||||
CODEC_URL = https://gitlab.com/wg1/jpeg-xl.git
|
||||
CODEC_VERSION = 4d70bd58fbcb758b61446aba447fedd9177a00c9
|
||||
CODEC_DIR = node_modules/jxl
|
||||
CODEC_BUILD_DIR := $(CODEC_DIR)/build
|
||||
CODEC_OUT := $(CODEC_BUILD_DIR)/lib/libjxl.a
|
||||
|
||||
OUT_JS = enc/jxl_enc.js dec/jxl_dec.js
|
||||
OUT_WASM = $(OUT_JS:.js=.wasm)
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: $(OUT_JS)
|
||||
|
||||
%.js: %.cpp $(LIBAOM_OUT) $(CODEC_OUT)
|
||||
$(CXX) \
|
||||
-I $(CODEC_DIR) \
|
||||
-I $(CODEC_DIR)/lib \
|
||||
-I $(CODEC_DIR)/lib/include \
|
||||
-I $(CODEC_BUILD_DIR)/lib/include \
|
||||
-I $(CODEC_DIR)/third_party/highway \
|
||||
-I $(CODEC_DIR)/third_party/skcms \
|
||||
-I $(CODEC_DIR)/third_party/brunsli \
|
||||
-I $(CODEC_DIR)/third_party/brunsli/c/include \
|
||||
${CXXFLAGS} \
|
||||
${LDFLAGS} \
|
||||
--bind \
|
||||
--closure 1 \
|
||||
-s ALLOW_MEMORY_GROWTH=1 \
|
||||
-s MODULARIZE=1 \
|
||||
-s 'EXPORT_NAME="$(basename $(@F))"' \
|
||||
-o $@ \
|
||||
$+ \
|
||||
$(CODEC_BUILD_DIR)/artifacts/libbrunslienc-static.bc \
|
||||
$(CODEC_BUILD_DIR)/artifacts/libbrunslicommon-static.bc \
|
||||
$(CODEC_BUILD_DIR)/artifacts/libbrunslidec-static.bc \
|
||||
$(CODEC_BUILD_DIR)/third_party/brotli/libbrotlidec-static.a \
|
||||
$(CODEC_BUILD_DIR)/third_party/brotli/libbrotlienc-static.a \
|
||||
$(CODEC_BUILD_DIR)/third_party/brotli/libbrotlicommon-static.a \
|
||||
$(CODEC_BUILD_DIR)/third_party/libskcms.a \
|
||||
$(CODEC_BUILD_DIR)/third_party/highway/libhwy.a
|
||||
|
||||
$(CODEC_OUT): $(CODEC_DIR)/CMakeLists.txt
|
||||
mkdir -p $(CODEC_BUILD_DIR)
|
||||
cd $(CODEC_BUILD_DIR) && \
|
||||
emcmake cmake ../ && \
|
||||
$(MAKE) jxl-static
|
||||
|
||||
$(CODEC_DIR)/CMakeLists.txt: $(CODEC_DIR)
|
||||
|
||||
$(CODEC_DIR):
|
||||
# The JXL repository doesn’t have version tags or anything yet,
|
||||
# so we have to pin to a specific commit for now. This implies we
|
||||
# can’t use --recursive, as we will change commit after checkout (it
|
||||
# seems you can’t clone a specific commit directly), and it also means
|
||||
# we can’t use --depth 1 because we want to change commits.
|
||||
# The JXL code base also relies on submodules so we can’t just download
|
||||
# a .tar.gz from GitLab.
|
||||
mkdir -p $@
|
||||
git clone $(CODEC_URL) $@
|
||||
cd $@ && \
|
||||
git reset --hard $(CODEC_VERSION) && \
|
||||
git submodule update --init --recursive
|
||||
|
||||
clean:
|
||||
$(RM) $(OUT_JS) $(OUT_WASM)
|
||||
$(MAKE) -C $(CODEC_BUILD_DIR) clean
|
80
codecs/jxl/dec/jxl_dec.cpp
Normal file
80
codecs/jxl/dec/jxl_dec.cpp
Normal file
@ -0,0 +1,80 @@
|
||||
#include <emscripten/bind.h>
|
||||
#include <emscripten/val.h>
|
||||
|
||||
#include <jxl/decode.h>
|
||||
#include "lib/jxl/color_encoding_internal.h"
|
||||
|
||||
#include "skcms.h"
|
||||
|
||||
using namespace emscripten;
|
||||
|
||||
thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray");
|
||||
thread_local const val ImageData = val::global("ImageData");
|
||||
|
||||
// R, G, B, A
|
||||
#define COMPONENTS_PER_PIXEL 4
|
||||
|
||||
#define EXPECT_TRUE(a) \
|
||||
if (!(a)) \
|
||||
return val::null();
|
||||
|
||||
#define EXPECT_EQ(a, b) EXPECT_TRUE((a) == (b));
|
||||
|
||||
val decode(std::string data) {
|
||||
std::unique_ptr<JxlDecoder,
|
||||
std::integral_constant<decltype(&JxlDecoderDestroy), JxlDecoderDestroy>>
|
||||
dec(JxlDecoderCreate(nullptr));
|
||||
EXPECT_EQ(JXL_DEC_SUCCESS,
|
||||
JxlDecoderSubscribeEvents(
|
||||
dec.get(), JXL_DEC_BASIC_INFO | JXL_DEC_COLOR_ENCODING | JXL_DEC_FULL_IMAGE));
|
||||
|
||||
auto next_in = (const uint8_t*)data.c_str();
|
||||
auto avail_in = data.size();
|
||||
EXPECT_EQ(JXL_DEC_BASIC_INFO, JxlDecoderProcessInput(dec.get(), &next_in, &avail_in));
|
||||
JxlBasicInfo info;
|
||||
EXPECT_EQ(JXL_DEC_SUCCESS, JxlDecoderGetBasicInfo(dec.get(), &info));
|
||||
size_t pixel_count = info.xsize * info.ysize;
|
||||
size_t component_count = pixel_count * COMPONENTS_PER_PIXEL;
|
||||
|
||||
EXPECT_EQ(JXL_DEC_COLOR_ENCODING, JxlDecoderProcessInput(dec.get(), &next_in, &avail_in));
|
||||
size_t icc_size;
|
||||
EXPECT_EQ(JXL_DEC_SUCCESS,
|
||||
JxlDecoderGetICCProfileSize(dec.get(), JXL_COLOR_PROFILE_TARGET_DATA, &icc_size));
|
||||
std::vector<uint8_t> icc_profile(icc_size);
|
||||
EXPECT_EQ(JXL_DEC_SUCCESS,
|
||||
JxlDecoderGetColorAsICCProfile(dec.get(), JXL_COLOR_PROFILE_TARGET_DATA,
|
||||
icc_profile.data(), icc_profile.size()));
|
||||
|
||||
auto float_pixels = std::make_unique<float[]>(component_count);
|
||||
static const JxlPixelFormat format = {COMPONENTS_PER_PIXEL, JXL_LITTLE_ENDIAN, JXL_TYPE_FLOAT};
|
||||
EXPECT_EQ(JXL_DEC_SUCCESS, JxlDecoderSetImageOutBuffer(dec.get(), &format, float_pixels.get(),
|
||||
component_count * sizeof(float)));
|
||||
EXPECT_EQ(JXL_DEC_FULL_IMAGE, JxlDecoderProcessInput(dec.get(), &next_in, &avail_in));
|
||||
|
||||
auto byte_pixels = std::make_unique<uint8_t[]>(component_count);
|
||||
// Convert to sRGB.
|
||||
skcms_ICCProfile jxl_profile;
|
||||
// If the image is encoded in its original color space, the decoded data will be in the color
|
||||
// space defined by the decoded ICC profile. Otherwise, it is in Linear sRGB. TODO: the decoded
|
||||
// color profile should also be Linear sRGB if !uses_original_profile.
|
||||
if (info.uses_original_profile) {
|
||||
EXPECT_TRUE(skcms_Parse(icc_profile.data(), icc_profile.size(), &jxl_profile));
|
||||
} else {
|
||||
auto s = jxl::ColorEncoding::LinearSRGB(/*gray=*/false);
|
||||
EXPECT_TRUE(s.CreateICC());
|
||||
EXPECT_TRUE(skcms_Parse(s.ICC().data(), s.ICC().size(), &jxl_profile));
|
||||
}
|
||||
EXPECT_TRUE(skcms_Transform(
|
||||
float_pixels.get(), skcms_PixelFormat_RGBA_ffff,
|
||||
info.alpha_premultiplied ? skcms_AlphaFormat_PremulAsEncoded : skcms_AlphaFormat_Unpremul,
|
||||
&jxl_profile, byte_pixels.get(), skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul,
|
||||
skcms_sRGB_profile(), pixel_count));
|
||||
|
||||
return ImageData.new_(
|
||||
Uint8ClampedArray.new_(typed_memory_view(component_count, byte_pixels.get())), info.xsize,
|
||||
info.ysize);
|
||||
}
|
||||
|
||||
EMSCRIPTEN_BINDINGS(my_module) {
|
||||
function("decode", &decode);
|
||||
}
|
5
codecs/jxl/dec/jxl_dec.d.ts
vendored
Normal file
5
codecs/jxl/dec/jxl_dec.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
interface JXLModule extends EmscriptenWasm.Module {
|
||||
decode(data: BufferSource): ImageData | null;
|
||||
}
|
||||
|
||||
export default function(opts: EmscriptenWasm.ModuleOpts): Promise<JXLModule>;
|
69
codecs/jxl/dec/jxl_dec.js
Normal file
69
codecs/jxl/dec/jxl_dec.js
Normal file
@ -0,0 +1,69 @@
|
||||
|
||||
var jxl_dec = (function() {
|
||||
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
|
||||
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
|
||||
return (
|
||||
function(jxl_dec) {
|
||||
jxl_dec = jxl_dec || {};
|
||||
|
||||
|
||||
var d;d||(d=typeof jxl_dec !== 'undefined' ? jxl_dec : {});var aa,ba;d.ready=new Promise(function(a,b){aa=a;ba=b});var r={},t;for(t in d)d.hasOwnProperty(t)&&(r[t]=d[t]);var ca="./this.program",u=!1,v=!1,da=!1,ea=!1;u="object"===typeof window;v="function"===typeof importScripts;da="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;ea=!u&&!da&&!v;var w="",x,z,fa,ha;
|
||||
if(da)w=v?require("path").dirname(w)+"/":__dirname+"/",x=function(a,b){fa||(fa=require("fs"));ha||(ha=require("path"));a=ha.normalize(a);return fa.readFileSync(a,b?null:"utf8")},z=function(a){a=x(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||A("Assertion failed: undefined");return a},1<process.argv.length&&(ca=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(a){throw a;}),process.on("unhandledRejection",A),d.inspect=function(){return"[Emscripten Module object]"};
|
||||
else if(ea)"undefined"!=typeof read&&(x=function(a){return read(a)}),z=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");"object"===typeof a||A("Assertion failed: undefined");return a},"undefined"!==typeof print&&("undefined"===typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!==typeof printErr?printErr:print);else if(u||v)v?w=self.location.href:document.currentScript&&(w=document.currentScript.src),_scriptDir&&
|
||||
(w=_scriptDir),0!==w.indexOf("blob:")?w=w.substr(0,w.lastIndexOf("/")+1):w="",x=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},v&&(z=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});var ia=d.print||console.log.bind(console),B=d.printErr||console.warn.bind(console);for(t in r)r.hasOwnProperty(t)&&(d[t]=r[t]);r=null;d.thisProgram&&(ca=d.thisProgram);var D;
|
||||
d.wasmBinary&&(D=d.wasmBinary);var noExitRuntime;d.noExitRuntime&&(noExitRuntime=d.noExitRuntime);"object"!==typeof WebAssembly&&A("no native wasm support detected");var E,ja=new WebAssembly.Table({initial:273,maximum:273,element:"anyfunc"}),ka=!1,la="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;
|
||||
function ma(a,b,c){var e=b+c;for(c=b;a[c]&&!(c>=e);)++c;if(16<c-b&&a.subarray&&la)return la.decode(a.subarray(b,c));for(e="";b<c;){var f=a[b++];if(f&128){var g=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var l=a[b++]&63;f=224==(f&240)?(f&15)<<12|g<<6|l:(f&7)<<18|g<<12|l<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e}
|
||||
function na(a,b,c){var e=F;if(0<c){c=b+c-1;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var oa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0;
|
||||
function pa(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&G[c];)++c;c<<=1;if(32<c-a&&oa)return oa.decode(F.subarray(a,c));c=0;for(e="";;){var f=H[a+2*c>>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function qa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f<c;++f)H[b>>1]=a.charCodeAt(f),b+=2;H[b>>1]=0;return b-e}function ra(a){return 2*a.length}
|
||||
function sa(a,b){for(var c=0,e="";!(c>=b/4);){var f=I[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function ta(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}I[b>>2]=g;b+=4;if(b+4>c)break}I[b>>2]=0;return b-e}
|
||||
function ua(a){for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&++c;b+=4}return b}var J,L,F,H,G,I,M,va,wa;function xa(a){J=a;d.HEAP8=L=new Int8Array(a);d.HEAP16=H=new Int16Array(a);d.HEAP32=I=new Int32Array(a);d.HEAPU8=F=new Uint8Array(a);d.HEAPU16=G=new Uint16Array(a);d.HEAPU32=M=new Uint32Array(a);d.HEAPF32=va=new Float32Array(a);d.HEAPF64=wa=new Float64Array(a)}var ya=d.INITIAL_MEMORY||16777216;d.wasmMemory?E=d.wasmMemory:E=new WebAssembly.Memory({initial:ya/65536,maximum:32768});
|
||||
E&&(J=E.buffer);ya=J.byteLength;xa(J);I[755496]=8265024;function N(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b(d);else{var c=b.$;"number"===typeof c?void 0===b.X?d.dynCall_v(c):d.dynCall_vi(c,b.X):c(void 0===b.X?null:b.X)}}}var za=[],Aa=[],Ba=[],Ca=[];function Da(){var a=d.preRun.shift();za.unshift(a)}var Ea=Math.ceil,Fa=Math.floor,O=0,Ga=null,Q=null;d.preloadedImages={};d.preloadedAudios={};
|
||||
function A(a){if(d.onAbort)d.onAbort(a);B(a);ka=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s ASSERTIONS=1 for more info.");ba(a);throw a;}function Ha(a){var b=R;return String.prototype.startsWith?b.startsWith(a):0===b.indexOf(a)}function Ia(){return Ha("data:application/octet-stream;base64,")}var R="jxl_dec.wasm";if(!Ia()){var Ja=R;R=d.locateFile?d.locateFile(Ja,w):w+Ja}
|
||||
function Ka(){try{if(D)return new Uint8Array(D);if(z)return z(R);throw"both async and sync fetching of the wasm failed";}catch(a){A(a)}}function La(){return D||!u&&!v||"function"!==typeof fetch||Ha("file://")?new Promise(function(a){a(Ka())}):fetch(R,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+R+"'";return a.arrayBuffer()}).catch(function(){return Ka()})}Aa.push({$:function(){Ma()}});
|
||||
function Na(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var Oa=void 0;function S(a){for(var b="";F[a];)b+=Oa[F[a++]];return b}var T={},U={},V={};function Pa(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}
|
||||
function Qa(a,b){a=Pa(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Ra(a){var b=Error,c=Qa(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}
|
||||
var Sa=void 0;function W(a){throw new Sa(a);}var Ta=void 0;function Ua(a,b){function c(k){k=b(k);if(k.length!==e.length)throw new Ta("Mismatched type converter count");for(var h=0;h<e.length;++h)X(e[h],k[h])}var e=[];e.forEach(function(k){V[k]=a});var f=Array(a.length),g=[],l=0;a.forEach(function(k,h){U.hasOwnProperty(k)?f[h]=U[k]:(g.push(k),T.hasOwnProperty(k)||(T[k]=[]),T[k].push(function(){f[h]=U[k];++l;l===g.length&&c(f)}))});0===g.length&&c(f)}
|
||||
function X(a,b,c){c=c||{};if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var e=b.name;a||W('type "'+e+'" must have a positive integer typeid pointer');if(U.hasOwnProperty(a)){if(c.aa)return;W("Cannot register type '"+e+"' twice")}U[a]=b;delete V[a];T.hasOwnProperty(a)&&(b=T[a],delete T[a],b.forEach(function(f){f()}))}var Va=[],Y=[{},{value:void 0},{value:null},{value:!0},{value:!1}];
|
||||
function Wa(a){4<a&&0===--Y[a].Y&&(Y[a]=void 0,Va.push(a))}function Xa(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Va.length?Va.pop():Y.length;Y[b]={Y:1,value:a};return b}}function Ya(a){return this.fromWireType(M[a>>2])}function Za(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}
|
||||
function bb(a,b){switch(b){case 2:return function(c){return this.fromWireType(va[c>>2])};case 3:return function(c){return this.fromWireType(wa[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function cb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=Qa(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c}
|
||||
function db(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function eb(a,b){var c=d;if(void 0===c[a].V){var e=c[a];c[a]=function(){c[a].V.hasOwnProperty(arguments.length)||W("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].V+")!");return c[a].V[arguments.length].apply(this,arguments)};c[a].V=[];c[a].V[e.Z]=e}}
|
||||
function fb(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].V&&void 0!==d[a].V[c])&&W("Cannot register public name '"+a+"' twice"),eb(a,a),d.hasOwnProperty(c)&&W("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].V[c]=b):(d[a]=b,void 0!==c&&(d[a].da=c))}function gb(a,b){for(var c=[],e=0;e<a;e++)c.push(I[(b>>2)+e]);return c}
|
||||
function hb(a,b){a=S(a);var c=d["dynCall_"+a];for(var e=[],f=1;f<a.length;++f)e.push("a"+f);f="return function dynCall_"+(a+"_"+b)+"("+e.join(", ")+") {\n";f+=" return dynCall(rawFunction"+(e.length?", ":"")+e.join(", ")+");\n";c=(new Function("dynCall","rawFunction",f+"};\n"))(c,b);"function"!==typeof c&&W("unknown function pointer with signature "+a+": "+b);return c}var ib=void 0;function jb(a){a=kb(a);var b=S(a);Z(a);return b}
|
||||
function lb(a,b){function c(g){f[g]||U[g]||(V[g]?V[g].forEach(c):(e.push(g),f[g]=!0))}var e=[],f={};b.forEach(c);throw new ib(a+": "+e.map(jb).join([", "]));}function mb(a,b,c){switch(b){case 0:return c?function(e){return L[e]}:function(e){return F[e]};case 1:return c?function(e){return H[e>>1]}:function(e){return G[e>>1]};case 2:return c?function(e){return I[e>>2]}:function(e){return M[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var nb={};
|
||||
function ob(){return"object"===typeof globalThis?globalThis:Function("return this")()}function pb(a,b){var c=U[a];void 0===c&&W(b+" has unknown type "+jb(a));return c}var qb={},rb={};function sb(){if(!tb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in rb)a[b]=rb[b];var c=[];for(b in a)c.push(b+"="+a[b]);tb=c}return tb}
|
||||
for(var tb,ub=[null,[],[]],vb=Array(256),wb=0;256>wb;++wb)vb[wb]=String.fromCharCode(wb);Oa=vb;Sa=d.BindingError=Ra("BindingError");Ta=d.InternalError=Ra("InternalError");d.count_emval_handles=function(){for(var a=0,b=5;b<Y.length;++b)void 0!==Y[b]&&++a;return a};d.get_first_emval=function(){for(var a=5;a<Y.length;++a)if(void 0!==Y[a])return Y[a];return null};ib=d.UnboundTypeError=Ra("UnboundTypeError");
|
||||
var yb={f:function(){},p:function(a,b,c,e,f){var g=Na(c);b=S(b);X(a,{name:b,fromWireType:function(l){return!!l},toWireType:function(l,k){return k?e:f},argPackAdvance:8,readValueFromPointer:function(l){if(1===c)var k=L;else if(2===c)k=H;else if(4===c)k=I;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(k[l>>g])},W:null})},y:function(a,b){b=S(b);X(a,{name:b,fromWireType:function(c){var e=Y[c].value;Wa(c);return e},toWireType:function(c,e){return Xa(e)},argPackAdvance:8,
|
||||
readValueFromPointer:Ya,W:null})},o:function(a,b,c){c=Na(c);b=S(b);X(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+Za(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:bb(b,c),W:null})},r:function(a,b,c,e,f,g){var l=gb(b,c);a=S(a);f=hb(e,f);fb(a,function(){lb("Cannot call "+a+" due to unbound types",l)},b-1);Ua(l,function(k){var h=[k[0],null].concat(k.slice(1)),n=k=a,p=f,
|
||||
q=h.length;2>q&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,C=!1,m=1;m<h.length;++m)if(null!==h[m]&&void 0===h[m].W){C=!0;break}var $a="void"!==h[0].name,K="",P="";for(m=0;m<q-2;++m)K+=(0!==m?", ":"")+"arg"+m,P+=(0!==m?", ":"")+"arg"+m+"Wired";n="return function "+Pa(n)+"("+K+") {\nif (arguments.length !== "+(q-2)+") {\nthrowBindingError('function "+n+" called with ' + arguments.length + ' arguments, expected "+(q-2)+" args!');\n}\n";
|
||||
C&&(n+="var destructors = [];\n");var ab=C?"destructors":"null";K="throwBindingError invoker fn runDestructors retType classParam".split(" ");p=[W,p,g,db,h[0],h[1]];y&&(n+="var thisWired = classParam.toWireType("+ab+", this);\n");for(m=0;m<q-2;++m)n+="var arg"+m+"Wired = argType"+m+".toWireType("+ab+", arg"+m+"); // "+h[m+2].name+"\n",K.push("argType"+m),p.push(h[m+2]);y&&(P="thisWired"+(0<P.length?", ":"")+P);n+=($a?"var rv = ":"")+"invoker(fn"+(0<P.length?", ":"")+P+");\n";if(C)n+="runDestructors(destructors);\n";
|
||||
else for(m=y?1:2;m<h.length;++m)q=1===m?"thisWired":"arg"+(m-2)+"Wired",null!==h[m].W&&(n+=q+"_dtor("+q+"); // "+h[m].name+"\n",K.push(q+"_dtor"),p.push(h[m].W));$a&&(n+="var ret = retType.fromWireType(rv);\nreturn ret;\n");K.push(n+"}\n");h=cb(K).apply(null,p);m=b-1;if(!d.hasOwnProperty(k))throw new Ta("Replacing nonexistant public symbol");void 0!==d[k].V&&void 0!==m?d[k].V[m]=h:(d[k]=h,d[k].Z=m);return[]})},b:function(a,b,c,e,f){function g(n){return n}b=S(b);-1===f&&(f=4294967295);var l=Na(c);
|
||||
if(0===e){var k=32-8*c;g=function(n){return n<<k>>>k}}var h=-1!=b.indexOf("unsigned");X(a,{name:b,fromWireType:g,toWireType:function(n,p){if("number"!==typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+Za(p)+'" to '+this.name);if(p<e||p>f)throw new TypeError('Passing a number "'+Za(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:mb(b,l,0!==e),W:null})},
|
||||
a:function(a,b,c){function e(g){g>>=2;var l=M;return new f(J,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=S(c);X(a,{name:c,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{aa:!0})},h:function(a,b){b=S(b);var c="std::string"===b;X(a,{name:b,fromWireType:function(e){var f=M[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==F[k]){g=g?ma(F,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;
|
||||
g=k+1}}else{h=Array(f);for(l=0;l<f;++l)h[l]=String.fromCharCode(F[e+4+l]);h=h.join("")}Z(e);return h},toWireType:function(e,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var g="string"===typeof f;g||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array||W("Cannot pass non-string to std::string");var l=(c&&g?function(){for(var n=0,p=0;p<f.length;++p){var q=f.charCodeAt(p);55296<=q&&57343>=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++n:n=2047>=q?n+2:65535>=
|
||||
q?n+3:n+4}return n}:function(){return f.length})(),k=xb(4+l+1);M[k>>2]=l;if(c&&g)na(f,k+4,l+1);else if(g)for(g=0;g<l;++g){var h=f.charCodeAt(g);255<h&&(Z(k),W("String has UTF-16 code units that do not fit in 8 bits"));F[k+4+g]=h}else for(g=0;g<l;++g)F[k+4+g]=f[g];null!==e&&e.push(Z,k);return k},argPackAdvance:8,readValueFromPointer:Ya,W:function(e){Z(e)}})},g:function(a,b,c){c=S(c);if(2===b){var e=pa;var f=qa;var g=ra;var l=function(){return G};var k=1}else 4===b&&(e=sa,f=ta,g=ua,l=function(){return M},
|
||||
k=2);X(a,{name:c,fromWireType:function(h){for(var n=M[h>>2],p=l(),q,y=h+4,C=0;C<=n;++C){var m=h+4+C*b;if(C==n||0==p[m>>k])y=e(y,m-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=m+b}Z(h);return q},toWireType:function(h,n){"string"!==typeof n&&W("Cannot pass non-string to C++ string type "+c);var p=g(n),q=xb(4+p+b);M[q>>2]=p>>k;f(n,q+4,p+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Ya,W:function(h){Z(h)}})},q:function(a,b){b=S(b);X(a,{ba:!0,name:b,argPackAdvance:0,
|
||||
fromWireType:function(){},toWireType:function(){}})},d:Wa,e:function(a){if(0===a)return Xa(ob());var b=nb[a];a=void 0===b?S(a):b;return Xa(ob()[a])},j:function(a){4<a&&(Y[a].Y+=1)},k:function(a,b,c,e){a||W("Cannot use deleted val. handle = "+a);a=Y[a].value;var f=qb[b];if(!f){f="";for(var g=0;g<b;++g)f+=(0!==g?", ":"")+"arg"+g;var l="return function emval_allocator_"+b+"(constructor, argTypes, args) {\n";for(g=0;g<b;++g)l+="var argType"+g+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+
|
||||
g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(pb,d,Xa);qb[b]=f}return f(a,c,e)},i:function(){A()},u:function(a,b,c){F.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=F.length;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,
|
||||
a,e);0<e%65536&&(e+=65536-e%65536);a:{try{E.grow(Math.min(2147483648,e)-J.byteLength+65535>>>16);xa(E.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},v:function(a,b){var c=0;sb().forEach(function(e,f){var g=b+c;f=I[a+4*f>>2]=g;for(g=0;g<e.length;++g)L[f++>>0]=e.charCodeAt(g);L[f>>0]=0;c+=e.length+1});return 0},w:function(a,b){var c=sb();I[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});I[b>>2]=e;return 0},x:function(){return 0},s:function(){},n:function(a,b,c,e){for(var f=
|
||||
0,g=0;g<c;g++){for(var l=I[b+8*g>>2],k=I[b+(8*g+4)>>2],h=0;h<k;h++){var n=F[l+h],p=ub[a];0===n||10===n?((1===a?ia:B)(ma(p,0)),p.length=0):p.push(n)}f+=k}I[e>>2]=f;return 0},memory:E,l:function(a){a=+a;return 0<=a?+Fa(a+.5):+Ea(a-.5)},m:function(a){a=+a;return 0<=a?+Fa(a+.5):+Ea(a-.5)},t:function(){},table:ja};
|
||||
(function(){function a(f){d.asm=f.exports;O--;d.monitorRunDependencies&&d.monitorRunDependencies(O);0==O&&(null!==Ga&&(clearInterval(Ga),Ga=null),Q&&(f=Q,Q=null,f()))}function b(f){a(f.instance)}function c(f){return La().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var e={a:yb};O++;d.monitorRunDependencies&&d.monitorRunDependencies(O);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return B("Module.instantiateWasm callback failed with error: "+
|
||||
f),!1}(function(){if(D||"function"!==typeof WebAssembly.instantiateStreaming||Ia()||Ha("file://")||"function"!==typeof fetch)return c(b);fetch(R,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})();
|
||||
var Ma=d.___wasm_call_ctors=function(){return(Ma=d.___wasm_call_ctors=d.asm.z).apply(null,arguments)},xb=d._malloc=function(){return(xb=d._malloc=d.asm.A).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.B).apply(null,arguments)},kb=d.___getTypeName=function(){return(kb=d.___getTypeName=d.asm.C).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.D).apply(null,arguments)};
|
||||
d.dynCall_iii=function(){return(d.dynCall_iii=d.asm.E).apply(null,arguments)};d.dynCall_vii=function(){return(d.dynCall_vii=d.asm.F).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.G).apply(null,arguments)};d.dynCall_iidiiii=function(){return(d.dynCall_iidiiii=d.asm.H).apply(null,arguments)};d.dynCall_iiiiiii=function(){return(d.dynCall_iiiiiii=d.asm.I).apply(null,arguments)};d.dynCall_viii=function(){return(d.dynCall_viii=d.asm.J).apply(null,arguments)};
|
||||
d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.K).apply(null,arguments)};d.dynCall_viiii=function(){return(d.dynCall_viiii=d.asm.L).apply(null,arguments)};d.dynCall_v=function(){return(d.dynCall_v=d.asm.M).apply(null,arguments)};d.dynCall_viiiiiii=function(){return(d.dynCall_viiiiiii=d.asm.N).apply(null,arguments)};d.dynCall_viiiiii=function(){return(d.dynCall_viiiiii=d.asm.O).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.P).apply(null,arguments)};
|
||||
d.dynCall_iiiii=function(){return(d.dynCall_iiiii=d.asm.Q).apply(null,arguments)};d.dynCall_iiji=function(){return(d.dynCall_iiji=d.asm.R).apply(null,arguments)};d.dynCall_iifi=function(){return(d.dynCall_iifi=d.asm.S).apply(null,arguments)};d.dynCall_jiji=function(){return(d.dynCall_jiji=d.asm.T).apply(null,arguments)};d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.U).apply(null,arguments)};var zb;Q=function Ab(){zb||Bb();zb||(Q=Ab)};
|
||||
function Bb(){function a(){if(!zb&&(zb=!0,d.calledRun=!0,!ka)){N(Aa);N(Ba);aa(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();Ca.unshift(b)}N(Ca)}}if(!(0<O)){if(d.preRun)for("function"==typeof d.preRun&&(d.preRun=[d.preRun]);d.preRun.length;)Da();N(za);0<O||(d.setStatus?(d.setStatus("Running..."),setTimeout(function(){setTimeout(function(){d.setStatus("")},1);a()},1)):a())}}
|
||||
d.run=Bb;if(d.preInit)for("function"==typeof d.preInit&&(d.preInit=[d.preInit]);0<d.preInit.length;)d.preInit.pop()();noExitRuntime=!0;Bb();
|
||||
|
||||
|
||||
return jxl_dec.ready
|
||||
}
|
||||
);
|
||||
})();
|
||||
if (typeof exports === 'object' && typeof module === 'object')
|
||||
module.exports = jxl_dec;
|
||||
else if (typeof define === 'function' && define['amd'])
|
||||
define([], function() { return jxl_dec; });
|
||||
else if (typeof exports === 'object')
|
||||
exports["jxl_dec"] = jxl_dec;
|
||||
|
BIN
codecs/jxl/dec/jxl_dec.wasm
Normal file
BIN
codecs/jxl/dec/jxl_dec.wasm
Normal file
Binary file not shown.
56
codecs/jxl/enc/jxl_enc.cpp
Normal file
56
codecs/jxl/enc/jxl_enc.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
#include <emscripten/bind.h>
|
||||
#include <emscripten/val.h>
|
||||
|
||||
#include "lib/jxl/enc_file.h"
|
||||
#include "lib/jxl/external_image.h"
|
||||
|
||||
using namespace emscripten;
|
||||
|
||||
thread_local const val Uint8Array = val::global("Uint8Array");
|
||||
|
||||
struct JXLOptions {
|
||||
// 1 = slowest
|
||||
// 7 = fastest
|
||||
int speed;
|
||||
float quality;
|
||||
};
|
||||
|
||||
val encode(std::string image, int width, int height, JXLOptions options) {
|
||||
jxl::CompressParams cparams;
|
||||
jxl::PassesEncoderState passes_enc_state;
|
||||
jxl::CodecInOut io;
|
||||
jxl::PaddedBytes bytes;
|
||||
jxl::ImageBundle* main = &io.Main();
|
||||
|
||||
cparams.speed_tier = static_cast<jxl::SpeedTier>(options.speed);
|
||||
cparams.butteraugli_distance = options.quality;
|
||||
|
||||
io.metadata.SetAlphaBits(8);
|
||||
|
||||
uint8_t* inBuffer = (uint8_t*)image.c_str();
|
||||
|
||||
auto result = jxl::ConvertImage(
|
||||
jxl::Span<const uint8_t>(reinterpret_cast<const uint8_t*>(image.data()), image.size()), width,
|
||||
height, jxl::ColorEncoding::SRGB(/*is_gray=*/false), /*has_alpha=*/true,
|
||||
/*alpha_is_premultiplied=*/false, /*bits_per_alpha=*/8, /*bits_per_sample=*/8,
|
||||
/*big_endian=*/false, /*flipped_y=*/false, /*pool=*/nullptr, main);
|
||||
|
||||
if (!result) {
|
||||
return val::null();
|
||||
}
|
||||
|
||||
auto js_result = val::null();
|
||||
if (EncodeFile(cparams, &io, &passes_enc_state, &bytes)) {
|
||||
js_result = Uint8Array.new_(typed_memory_view(bytes.size(), bytes.data()));
|
||||
}
|
||||
|
||||
return js_result;
|
||||
}
|
||||
|
||||
EMSCRIPTEN_BINDINGS(my_module) {
|
||||
value_object<JXLOptions>("JXLOptions")
|
||||
.field("speed", &JXLOptions::speed)
|
||||
.field("quality", &JXLOptions::quality);
|
||||
|
||||
function("encode", &encode);
|
||||
}
|
7
codecs/jxl/enc/jxl_enc.d.ts
vendored
Normal file
7
codecs/jxl/enc/jxl_enc.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
import { EncodeOptions } from '../../../src/codecs/jxl/encoder-meta';
|
||||
|
||||
interface JXLModule extends EmscriptenWasm.Module {
|
||||
encode(data: BufferSource, width: number, height: number, options: EncodeOptions): Uint8Array | null;
|
||||
}
|
||||
|
||||
export default function(opts: EmscriptenWasm.ModuleOpts): Promise<JXLModule>;
|
115
codecs/jxl/enc/jxl_enc.js
Normal file
115
codecs/jxl/enc/jxl_enc.js
Normal file
@ -0,0 +1,115 @@
|
||||
|
||||
var jxl_enc = (function() {
|
||||
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
|
||||
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
|
||||
return (
|
||||
function(jxl_enc) {
|
||||
jxl_enc = jxl_enc || {};
|
||||
|
||||
|
||||
var f;f||(f=typeof jxl_enc !== 'undefined' ? jxl_enc : {});var aa,ba;f.ready=new Promise(function(a,b){aa=a;ba=b});var p={},t;for(t in f)f.hasOwnProperty(t)&&(p[t]=f[t]);var ca="./this.program",da=!1,w=!1,ea=!1,fa=!1;da="object"===typeof window;w="function"===typeof importScripts;ea="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;fa=!da&&!ea&&!w;var z="",ha,ia,ka,la;
|
||||
if(ea)z=w?require("path").dirname(z)+"/":__dirname+"/",ha=function(a,b){ka||(ka=require("fs"));la||(la=require("path"));a=la.normalize(a);return ka.readFileSync(a,b?null:"utf8")},ia=function(a){a=ha(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a},1<process.argv.length&&(ca=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(a){throw a;}),process.on("unhandledRejection",A),f.inspect=function(){return"[Emscripten Module object]"};else if(fa)"undefined"!=
|
||||
typeof read&&(ha=function(a){return read(a)}),ia=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");assert("object"===typeof a);return a},"undefined"!==typeof print&&("undefined"===typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!==typeof printErr?printErr:print);else if(da||w)w?z=self.location.href:document.currentScript&&(z=document.currentScript.src),_scriptDir&&(z=_scriptDir),0!==z.indexOf("blob:")?z=z.substr(0,
|
||||
z.lastIndexOf("/")+1):z="",ha=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},w&&(ia=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});var ma=f.print||console.log.bind(console),B=f.printErr||console.warn.bind(console);for(t in p)p.hasOwnProperty(t)&&(f[t]=p[t]);p=null;f.thisProgram&&(ca=f.thisProgram);var na;f.wasmBinary&&(na=f.wasmBinary);var noExitRuntime;
|
||||
f.noExitRuntime&&(noExitRuntime=f.noExitRuntime);"object"!==typeof WebAssembly&&A("no native wasm support detected");var C,oa=new WebAssembly.Table({initial:780,maximum:780,element:"anyfunc"}),pa=!1;function assert(a,b){a||A("Assertion failed: "+b)}var qa="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;
|
||||
function D(a,b,c){var d=b+c;for(c=b;a[c]&&!(c>=d);)++c;if(16<c-b&&a.subarray&&qa)return qa.decode(a.subarray(b,c));for(d="";b<c;){var e=a[b++];if(e&128){var g=a[b++]&63;if(192==(e&224))d+=String.fromCharCode((e&31)<<6|g);else{var k=a[b++]&63;e=224==(e&240)?(e&15)<<12|g<<6|k:(e&7)<<18|g<<12|k<<6|a[b++]&63;65536>e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}return d}
|
||||
function ra(a,b,c,d){if(!(0<d))return 0;var e=c;d=c+d-1;for(var g=0;g<a.length;++g){var k=a.charCodeAt(g);if(55296<=k&&57343>=k){var m=a.charCodeAt(++g);k=65536+((k&1023)<<10)|m&1023}if(127>=k){if(c>=d)break;b[c++]=k}else{if(2047>=k){if(c+1>=d)break;b[c++]=192|k>>6}else{if(65535>=k){if(c+2>=d)break;b[c++]=224|k>>12}else{if(c+3>=d)break;b[c++]=240|k>>18;b[c++]=128|k>>12&63}b[c++]=128|k>>6&63}b[c++]=128|k&63}}b[c]=0;return c-e}
|
||||
function sa(a){for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=d&&(d=65536+((d&1023)<<10)|a.charCodeAt(++c)&1023);127>=d?++b:b=2047>=d?b+2:65535>=d?b+3:b+4}return b}var ta="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function ua(a,b){var c=a>>1;for(var d=c+b/2;!(c>=d)&&va[c];)++c;c<<=1;if(32<c-a&&ta)return ta.decode(E.subarray(a,c));c=0;for(d="";;){var e=G[a+2*c>>1];if(0==e||c==b/2)return d;++c;d+=String.fromCharCode(e)}}
|
||||
function wa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e<c;++e)G[b>>1]=a.charCodeAt(e),b+=2;G[b>>1]=0;return b-d}function xa(a){return 2*a.length}function ya(a,b){for(var c=0,d="";!(c>=b/4);){var e=H[a+4*c>>2];if(0==e)break;++c;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}return d}
|
||||
function za(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e<a.length;++e){var g=a.charCodeAt(e);if(55296<=g&&57343>=g){var k=a.charCodeAt(++e);g=65536+((g&1023)<<10)|k&1023}H[b>>2]=g;b+=4;if(b+4>c)break}H[b>>2]=0;return b-d}function Aa(a){for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=d&&++c;b+=4}return b}var I,J,E,G,va,H,K,Ba,Ca;
|
||||
function Da(a){I=a;f.HEAP8=J=new Int8Array(a);f.HEAP16=G=new Int16Array(a);f.HEAP32=H=new Int32Array(a);f.HEAPU8=E=new Uint8Array(a);f.HEAPU16=va=new Uint16Array(a);f.HEAPU32=K=new Uint32Array(a);f.HEAPF32=Ba=new Float32Array(a);f.HEAPF64=Ca=new Float64Array(a)}var Ea=f.INITIAL_MEMORY||16777216;f.wasmMemory?C=f.wasmMemory:C=new WebAssembly.Memory({initial:Ea/65536,maximum:32768});C&&(I=C.buffer);Ea=I.byteLength;Da(I);H[771892]=8330608;
|
||||
function Fa(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b(f);else{var c=b.eb;"number"===typeof c?void 0===b.Ma?f.dynCall_v(c):f.dynCall_vi(c,b.Ma):c(void 0===b.Ma?null:b.Ma)}}}var Ga=[],Ha=[],Ia=[],Ja=[];function Ka(){var a=f.preRun.shift();Ga.unshift(a)}var La=Math.abs,Ma=Math.ceil,Na=Math.floor,Oa=Math.min,L=0,Pa=null,Qa=null;f.preloadedImages={};f.preloadedAudios={};
|
||||
function A(a){if(f.onAbort)f.onAbort(a);B(a);pa=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s ASSERTIONS=1 for more info.");ba(a);throw a;}function Ra(a){var b=M;return String.prototype.startsWith?b.startsWith(a):0===b.indexOf(a)}function Sa(){return Ra("data:application/octet-stream;base64,")}var M="jxl_enc.wasm";if(!Sa()){var Ta=M;M=f.locateFile?f.locateFile(Ta,z):z+Ta}
|
||||
function Ua(){try{if(na)return new Uint8Array(na);if(ia)return ia(M);throw"both async and sync fetching of the wasm failed";}catch(a){A(a)}}function Va(){return na||!da&&!w||"function"!==typeof fetch||Ra("file://")?new Promise(function(a){a(Ua())}):fetch(M,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+M+"'";return a.arrayBuffer()}).catch(function(){return Ua()})}var N,Wa;Ha.push({eb:function(){Xa()}});function Ya(){return 0<Ya.Ia}
|
||||
function Za(a,b){for(var c=0,d=a.length-1;0<=d;d--){var e=a[d];"."===e?a.splice(d,1):".."===e?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a}function $a(a){var b="/"===a.charAt(0),c="/"===a.substr(-1);(a=Za(a.split("/").filter(function(d){return!!d}),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a}
|
||||
function ab(a){var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1);a=b[0];b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b}function bb(a){if("/"===a)return"/";var b=a.lastIndexOf("/");return-1===b?a:a.substr(b+1)}
|
||||
function cb(){for(var a="",b=!1,c=arguments.length-1;-1<=c&&!b;c--){b=0<=c?arguments[c]:"/";if("string"!==typeof b)throw new TypeError("Arguments to path.resolve must be strings");if(!b)return"";a=b+"/"+a;b="/"===b.charAt(0)}a=Za(a.split("/").filter(function(d){return!!d}),!b).join("/");return(b?"/":"")+a||"."}var db=[];function eb(a,b){db[a]={input:[],output:[],Ba:b};fb(a,gb)}
|
||||
var gb={open:function(a){var b=db[a.node.rdev];if(!b)throw new O(43);a.tty=b;a.seekable=!1},close:function(a){a.tty.Ba.flush(a.tty)},flush:function(a){a.tty.Ba.flush(a.tty)},read:function(a,b,c,d){if(!a.tty||!a.tty.Ba.Xa)throw new O(60);for(var e=0,g=0;g<d;g++){try{var k=a.tty.Ba.Xa(a.tty)}catch(m){throw new O(29);}if(void 0===k&&0===e)throw new O(6);if(null===k||void 0===k)break;e++;b[c+g]=k}e&&(a.node.timestamp=Date.now());return e},write:function(a,b,c,d){if(!a.tty||!a.tty.Ba.Oa)throw new O(60);
|
||||
try{for(var e=0;e<d;e++)a.tty.Ba.Oa(a.tty,b[c+e])}catch(g){throw new O(29);}d&&(a.node.timestamp=Date.now());return e}},ib={Xa:function(a){if(!a.input.length){var b=null;if(ea){var c=Buffer.Ia?Buffer.Ia(256):new Buffer(256),d=0;try{d=ka.readSync(process.stdin.fd,c,0,256,null)}catch(e){if(-1!=e.toString().indexOf("EOF"))d=0;else throw e;}0<d?b=c.slice(0,d).toString("utf-8"):b=null}else"undefined"!=typeof window&&"function"==typeof window.prompt?(b=window.prompt("Input: "),null!==b&&(b+="\n")):"function"==
|
||||
typeof readline&&(b=readline(),null!==b&&(b+="\n"));if(!b)return null;a.input=hb(b,!0)}return a.input.shift()},Oa:function(a,b){null===b||10===b?(ma(D(a.output,0)),a.output=[]):0!=b&&a.output.push(b)},flush:function(a){a.output&&0<a.output.length&&(ma(D(a.output,0)),a.output=[])}},jb={Oa:function(a,b){null===b||10===b?(B(D(a.output,0)),a.output=[]):0!=b&&a.output.push(b)},flush:function(a){a.output&&0<a.output.length&&(B(D(a.output,0)),a.output=[])}},P={ta:null,ya:function(){return P.createNode(null,
|
||||
"/",16895,0)},createNode:function(a,b,c,d){if(24576===(c&61440)||4096===(c&61440))throw new O(63);P.ta||(P.ta={dir:{node:{za:P.pa.za,va:P.pa.va,lookup:P.pa.lookup,Fa:P.pa.Fa,rename:P.pa.rename,unlink:P.pa.unlink,rmdir:P.pa.rmdir,readdir:P.pa.readdir,symlink:P.pa.symlink},stream:{Aa:P.qa.Aa}},file:{node:{za:P.pa.za,va:P.pa.va},stream:{Aa:P.qa.Aa,read:P.qa.read,write:P.qa.write,Ra:P.qa.Ra,Ya:P.qa.Ya,Ha:P.qa.Ha}},link:{node:{za:P.pa.za,va:P.pa.va,readlink:P.pa.readlink},stream:{}},Sa:{node:{za:P.pa.za,
|
||||
va:P.pa.va},stream:kb}});c=lb(a,b,c,d);16384===(c.mode&61440)?(c.pa=P.ta.dir.node,c.qa=P.ta.dir.stream,c.oa={}):32768===(c.mode&61440)?(c.pa=P.ta.file.node,c.qa=P.ta.file.stream,c.ra=0,c.oa=null):40960===(c.mode&61440)?(c.pa=P.ta.link.node,c.qa=P.ta.link.stream):8192===(c.mode&61440)&&(c.pa=P.ta.Sa.node,c.qa=P.ta.Sa.stream);c.timestamp=Date.now();a&&(a.oa[b]=c);return c},xb:function(a){if(a.oa&&a.oa.subarray){for(var b=[],c=0;c<a.ra;++c)b.push(a.oa[c]);return b}return a.oa},yb:function(a){return a.oa?
|
||||
a.oa.subarray?a.oa.subarray(0,a.ra):new Uint8Array(a.oa):new Uint8Array(0)},Ta:function(a,b){var c=a.oa?a.oa.length:0;c>=b||(b=Math.max(b,c*(1048576>c?2:1.125)>>>0),0!=c&&(b=Math.max(b,256)),c=a.oa,a.oa=new Uint8Array(b),0<a.ra&&a.oa.set(c.subarray(0,a.ra),0))},nb:function(a,b){if(a.ra!=b)if(0==b)a.oa=null,a.ra=0;else{if(!a.oa||a.oa.subarray){var c=a.oa;a.oa=new Uint8Array(b);c&&a.oa.set(c.subarray(0,Math.min(b,a.ra)))}else if(a.oa||(a.oa=[]),a.oa.length>b)a.oa.length=b;else for(;a.oa.length<b;)a.oa.push(0);
|
||||
a.ra=b}},pa:{za:function(a){var b={};b.dev=8192===(a.mode&61440)?a.id:1;b.ino=a.id;b.mode=a.mode;b.nlink=1;b.uid=0;b.gid=0;b.rdev=a.rdev;16384===(a.mode&61440)?b.size=4096:32768===(a.mode&61440)?b.size=a.ra:40960===(a.mode&61440)?b.size=a.link.length:b.size=0;b.atime=new Date(a.timestamp);b.mtime=new Date(a.timestamp);b.ctime=new Date(a.timestamp);b.bb=4096;b.blocks=Math.ceil(b.size/b.bb);return b},va:function(a,b){void 0!==b.mode&&(a.mode=b.mode);void 0!==b.timestamp&&(a.timestamp=b.timestamp);void 0!==
|
||||
b.size&&P.nb(a,b.size)},lookup:function(){throw mb[44];},Fa:function(a,b,c,d){return P.createNode(a,b,c,d)},rename:function(a,b,c){if(16384===(a.mode&61440)){try{var d=nb(b,c)}catch(g){}if(d)for(var e in d.oa)throw new O(55);}delete a.parent.oa[a.name];a.name=c;b.oa[c]=a;a.parent=b},unlink:function(a,b){delete a.oa[b]},rmdir:function(a,b){var c=nb(a,b),d;for(d in c.oa)throw new O(55);delete a.oa[b]},readdir:function(a){var b=[".",".."],c;for(c in a.oa)a.oa.hasOwnProperty(c)&&b.push(c);return b},symlink:function(a,
|
||||
b,c){a=P.createNode(a,b,41471,0);a.link=c;return a},readlink:function(a){if(40960!==(a.mode&61440))throw new O(28);return a.link}},qa:{read:function(a,b,c,d,e){var g=a.node.oa;if(e>=a.node.ra)return 0;a=Math.min(a.node.ra-e,d);if(8<a&&g.subarray)b.set(g.subarray(e,e+a),c);else for(d=0;d<a;d++)b[c+d]=g[e+d];return a},write:function(a,b,c,d,e,g){b.buffer===J.buffer&&(g=!1);if(!d)return 0;a=a.node;a.timestamp=Date.now();if(b.subarray&&(!a.oa||a.oa.subarray)){if(g)return a.oa=b.subarray(c,c+d),a.ra=d;
|
||||
if(0===a.ra&&0===e)return a.oa=b.slice(c,c+d),a.ra=d;if(e+d<=a.ra)return a.oa.set(b.subarray(c,c+d),e),d}P.Ta(a,e+d);if(a.oa.subarray&&b.subarray)a.oa.set(b.subarray(c,c+d),e);else for(g=0;g<d;g++)a.oa[e+g]=b[c+g];a.ra=Math.max(a.ra,e+d);return d},Aa:function(a,b,c){1===c?b+=a.position:2===c&&32768===(a.node.mode&61440)&&(b+=a.node.ra);if(0>b)throw new O(28);return b},Ra:function(a,b,c){P.Ta(a.node,b+c);a.node.ra=Math.max(a.node.ra,b+c)},Ya:function(a,b,c,d,e,g){assert(0===b);if(32768!==(a.node.mode&
|
||||
61440))throw new O(43);a=a.node.oa;if(g&2||a.buffer!==I){if(0<d||d+c<a.length)a.subarray?a=a.subarray(d,d+c):a=Array.prototype.slice.call(a,d,d+c);d=!0;g=16384*Math.ceil(c/16384);for(b=ob(g);c<g;)J[b+c++]=0;c=b;if(!c)throw new O(48);J.set(a,c)}else d=!1,c=a.byteOffset;return{Fb:c,$a:d}},Ha:function(a,b,c,d,e){if(32768!==(a.node.mode&61440))throw new O(43);if(e&2)return 0;P.qa.write(a,b,0,d,c,!1);return 0}}},pb=null,qb={},Q=[],rb=1,sb=null,tb=!0,ub={},O=null,mb={};
|
||||
function R(a,b){a=cb("/",a);b=b||{};if(!a)return{path:"",node:null};var c={Wa:!0,Pa:0},d;for(d in c)void 0===b[d]&&(b[d]=c[d]);if(8<b.Pa)throw new O(32);a=Za(a.split("/").filter(function(k){return!!k}),!1);var e=pb;c="/";for(d=0;d<a.length;d++){var g=d===a.length-1;if(g&&b.parent)break;e=nb(e,a[d]);c=$a(c+"/"+a[d]);e.Ga&&(!g||g&&b.Wa)&&(e=e.Ga.root);if(!g||b.Va)for(g=0;40960===(e.mode&61440);)if(e=vb(c),c=cb(ab(c),e),e=R(c,{Pa:b.Pa}).node,40<g++)throw new O(32);}return{path:c,node:e}}
|
||||
function wb(a){for(var b;;){if(a===a.parent)return a=a.ya.Za,b?"/"!==a[a.length-1]?a+"/"+b:a+b:a;b=b?a.name+"/"+b:a.name;a=a.parent}}function xb(a,b){for(var c=0,d=0;d<b.length;d++)c=(c<<5)-c+b.charCodeAt(d)|0;return(a+c>>>0)%sb.length}function nb(a,b){var c;if(c=(c=yb(a,"x"))?c:a.pa.lookup?0:2)throw new O(c,a);for(c=sb[xb(a.id,b)];c;c=c.kb){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.pa.lookup(a,b)}
|
||||
function lb(a,b,c,d){a=new zb(a,b,c,d);b=xb(a.parent.id,a.name);a.kb=sb[b];return sb[b]=a}var Ab={r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218};function Bb(a){var b=["r","w","rw"][a&3];a&512&&(b+="w");return b}function yb(a,b){if(tb)return 0;if(-1===b.indexOf("r")||a.mode&292){if(-1!==b.indexOf("w")&&!(a.mode&146)||-1!==b.indexOf("x")&&!(a.mode&73))return 2}else return 2;return 0}
|
||||
function Cb(a,b){try{return nb(a,b),20}catch(c){}return yb(a,"wx")}function Db(){var a=4096;for(var b=0;b<=a;b++)if(!Q[b])return b;throw new O(33);}function Eb(a){Fb||(Fb=function(){},Fb.prototype={});var b=new Fb,c;for(c in a)b[c]=a[c];a=b;b=Db();a.fd=b;return Q[b]=a}var kb={open:function(a){a.qa=qb[a.node.rdev].qa;a.qa.open&&a.qa.open(a)},Aa:function(){throw new O(70);}};function fb(a,b){qb[a]={qa:b}}
|
||||
function Gb(a,b){var c="/"===b,d=!b;if(c&&pb)throw new O(10);if(!c&&!d){var e=R(b,{Wa:!1});b=e.path;e=e.node;if(e.Ga)throw new O(10);if(16384!==(e.mode&61440))throw new O(54);}b={type:a,Db:{},Za:b,jb:[]};a=a.ya(b);a.ya=b;b.root=a;c?pb=a:e&&(e.Ga=b,e.ya&&e.ya.jb.push(b))}function Hb(a,b,c){var d=R(a,{parent:!0}).node;a=bb(a);if(!a||"."===a||".."===a)throw new O(28);var e=Cb(d,a);if(e)throw new O(e);if(!d.pa.Fa)throw new O(63);return d.pa.Fa(d,a,b,c)}function S(a){Hb(a,16895,0)}
|
||||
function Ib(a,b,c){"undefined"===typeof c&&(c=b,b=438);Hb(a,b|8192,c)}function Jb(a,b){if(!cb(a))throw new O(44);var c=R(b,{parent:!0}).node;if(!c)throw new O(44);b=bb(b);var d=Cb(c,b);if(d)throw new O(d);if(!c.pa.symlink)throw new O(63);c.pa.symlink(c,b,a)}function vb(a){a=R(a).node;if(!a)throw new O(44);if(!a.pa.readlink)throw new O(28);return cb(wb(a.parent),a.pa.readlink(a))}
|
||||
function Kb(a,b){if(""===a)throw new O(44);if("string"===typeof b){var c=Ab[b];if("undefined"===typeof c)throw Error("Unknown file open mode: "+b);b=c}var d=b&64?("undefined"===typeof d?438:d)&4095|32768:0;if("object"===typeof a)var e=a;else{a=$a(a);try{e=R(a,{Va:!(b&131072)}).node}catch(k){}}c=!1;if(b&64)if(e){if(b&128)throw new O(20);}else e=Hb(a,d,0),c=!0;if(!e)throw new O(44);8192===(e.mode&61440)&&(b&=-513);if(b&65536&&16384!==(e.mode&61440))throw new O(54);if(!c&&(d=e?40960===(e.mode&61440)?
|
||||
32:16384===(e.mode&61440)&&("r"!==Bb(b)||b&512)?31:yb(e,Bb(b)):44))throw new O(d);if(b&512){d=e;var g;"string"===typeof d?g=R(d,{Va:!0}).node:g=d;if(!g.pa.va)throw new O(63);if(16384===(g.mode&61440))throw new O(31);if(32768!==(g.mode&61440))throw new O(28);if(d=yb(g,"w"))throw new O(d);g.pa.va(g,{size:0,timestamp:Date.now()})}b&=-131713;e=Eb({node:e,path:wb(e),flags:b,seekable:!0,position:0,qa:e.qa,wb:[],error:!1});e.qa.open&&e.qa.open(e);!f.logReadFiles||b&1||(Lb||(Lb={}),a in Lb||(Lb[a]=1,B("FS.trackingDelegate error on read file: "+
|
||||
a)));try{ub.onOpenFile&&(e=0,1!==(b&2097155)&&(e|=1),0!==(b&2097155)&&(e|=2),ub.onOpenFile(a,e))}catch(k){B("FS.trackingDelegate['onOpenFile']('"+a+"', flags) threw an exception: "+k.message)}}function Mb(a,b,c){if(null===a.fd)throw new O(8);if(!a.seekable||!a.qa.Aa)throw new O(70);if(0!=c&&1!=c&&2!=c)throw new O(28);a.position=a.qa.Aa(a,b,c);a.wb=[]}
|
||||
function Nb(){O||(O=function(a,b){this.node=b;this.ob=function(c){this.Ea=c};this.ob(a);this.message="FS error"},O.prototype=Error(),O.prototype.constructor=O,[44].forEach(function(a){mb[a]=new O(a);mb[a].stack="<generic error, no stack>"}))}var Ob;function Pb(a,b){var c=0;a&&(c|=365);b&&(c|=146);return c}
|
||||
function Qb(a,b,c){a=$a("/dev/"+a);var d=Pb(!!b,!!c);Rb||(Rb=64);var e=Rb++<<8|0;fb(e,{open:function(g){g.seekable=!1},close:function(){c&&c.buffer&&c.buffer.length&&c(10)},read:function(g,k,m,l){for(var q=0,r=0;r<l;r++){try{var u=b()}catch(x){throw new O(29);}if(void 0===u&&0===q)throw new O(6);if(null===u||void 0===u)break;q++;k[m+r]=u}q&&(g.node.timestamp=Date.now());return q},write:function(g,k,m,l){for(var q=0;q<l;q++)try{c(k[m+q])}catch(r){throw new O(29);}l&&(g.node.timestamp=Date.now());return q}});
|
||||
Ib(a,d,e)}var Rb,Sb={},Fb,Lb,Tb={};function Ub(a){a=Q[a];if(!a)throw new O(8);return a}var Vb={};function Wb(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function Xb(a){return this.fromWireType(K[a>>2])}var T={},U={},Yb={};function Zb(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}
|
||||
function $b(a,b){a=Zb(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function ac(a){var b=Error,c=$b(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+"\n"+d.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}
|
||||
var bc=void 0;function cc(a,b,c){function d(m){m=c(m);if(m.length!==a.length)throw new bc("Mismatched type converter count");for(var l=0;l<a.length;++l)V(a[l],m[l])}a.forEach(function(m){Yb[m]=b});var e=Array(b.length),g=[],k=0;b.forEach(function(m,l){U.hasOwnProperty(m)?e[l]=U[m]:(g.push(m),T.hasOwnProperty(m)||(T[m]=[]),T[m].push(function(){e[l]=U[m];++k;k===g.length&&d(e)}))});0===g.length&&d(e)}
|
||||
function dc(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var ec=void 0;function W(a){for(var b="";E[a];)b+=ec[E[a++]];return b}var fc=void 0;function X(a){throw new fc(a);}
|
||||
function V(a,b,c){c=c||{};if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var d=b.name;a||X('type "'+d+'" must have a positive integer typeid pointer');if(U.hasOwnProperty(a)){if(c.ib)return;X("Cannot register type '"+d+"' twice")}U[a]=b;delete Yb[a];T.hasOwnProperty(a)&&(b=T[a],delete T[a],b.forEach(function(e){e()}))}var hc=[],Y=[{},{value:void 0},{value:null},{value:!0},{value:!1}];
|
||||
function ic(a){4<a&&0===--Y[a].Qa&&(Y[a]=void 0,hc.push(a))}function jc(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=hc.length?hc.pop():Y.length;Y[b]={Qa:1,value:a};return b}}function kc(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}
|
||||
function lc(a,b){switch(b){case 2:return function(c){return this.fromWireType(Ba[c>>2])};case 3:return function(c){return this.fromWireType(Ca[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function mc(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=$b(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c}
|
||||
function nc(a,b){var c=f;if(void 0===c[a].ua){var d=c[a];c[a]=function(){c[a].ua.hasOwnProperty(arguments.length)||X("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].ua+")!");return c[a].ua[arguments.length].apply(this,arguments)};c[a].ua=[];c[a].ua[d.ab]=d}}
|
||||
function oc(a,b,c){f.hasOwnProperty(a)?((void 0===c||void 0!==f[a].ua&&void 0!==f[a].ua[c])&&X("Cannot register public name '"+a+"' twice"),nc(a,a),f.hasOwnProperty(c)&&X("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),f[a].ua[c]=b):(f[a]=b,void 0!==c&&(f[a].Cb=c))}function pc(a,b){for(var c=[],d=0;d<a;d++)c.push(H[(b>>2)+d]);return c}
|
||||
function qc(a,b){a=W(a);var c=f["dynCall_"+a];for(var d=[],e=1;e<a.length;++e)d.push("a"+e);e="return function dynCall_"+(a+"_"+b)+"("+d.join(", ")+") {\n";e+=" return dynCall(rawFunction"+(d.length?", ":"")+d.join(", ")+");\n";c=(new Function("dynCall","rawFunction",e+"};\n"))(c,b);"function"!==typeof c&&X("unknown function pointer with signature "+a+": "+b);return c}var rc=void 0;function sc(a){a=tc(a);var b=W(a);Z(a);return b}
|
||||
function uc(a,b){function c(g){e[g]||U[g]||(Yb[g]?Yb[g].forEach(c):(d.push(g),e[g]=!0))}var d=[],e={};b.forEach(c);throw new rc(a+": "+d.map(sc).join([", "]));}function vc(a,b,c){switch(b){case 0:return c?function(d){return J[d]}:function(d){return E[d]};case 1:return c?function(d){return G[d>>1]}:function(d){return va[d>>1]};case 2:return c?function(d){return H[d>>2]}:function(d){return K[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var wc={};
|
||||
function xc(){return"object"===typeof globalThis?globalThis:Function("return this")()}function yc(a,b){var c=U[a];void 0===c&&X(b+" has unknown type "+sc(a));return c}var zc={},Ac={};function Bc(){if(!Cc){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in Ac)a[b]=Ac[b];var c=[];for(b in a)c.push(b+"="+a[b]);Cc=c}return Cc}var Cc;
|
||||
function Dc(a){return 0===a%4&&(0!==a%100||0===a%400)}function Ec(a,b){for(var c=0,d=0;d<=b;c+=a[d++]);return c}var Fc=[31,29,31,30,31,30,31,31,30,31,30,31],Gc=[31,28,31,30,31,30,31,31,30,31,30,31];function Hc(a,b){for(a=new Date(a.getTime());0<b;){var c=a.getMonth(),d=(Dc(a.getFullYear())?Fc:Gc)[c];if(b>d-a.getDate())b-=d-a.getDate()+1,a.setDate(1),11>c?a.setMonth(c+1):(a.setMonth(0),a.setFullYear(a.getFullYear()+1));else{a.setDate(a.getDate()+b);break}}return a}
|
||||
function Ic(a,b,c,d){function e(h,n,v){for(h="number"===typeof h?h.toString():h||"";h.length<n;)h=v[0]+h;return h}function g(h,n){return e(h,n,"0")}function k(h,n){function v(F){return 0>F?-1:0<F?1:0}var y;0===(y=v(h.getFullYear()-n.getFullYear()))&&0===(y=v(h.getMonth()-n.getMonth()))&&(y=v(h.getDate()-n.getDate()));return y}function m(h){switch(h.getDay()){case 0:return new Date(h.getFullYear()-1,11,29);case 1:return h;case 2:return new Date(h.getFullYear(),0,3);case 3:return new Date(h.getFullYear(),
|
||||
0,2);case 4:return new Date(h.getFullYear(),0,1);case 5:return new Date(h.getFullYear()-1,11,31);case 6:return new Date(h.getFullYear()-1,11,30)}}function l(h){h=Hc(new Date(h.sa+1900,0,1),h.La);var n=new Date(h.getFullYear()+1,0,4),v=m(new Date(h.getFullYear(),0,4));n=m(n);return 0>=k(v,h)?0>=k(n,h)?h.getFullYear()+1:h.getFullYear():h.getFullYear()-1}var q=H[d+40>>2];d={ub:H[d>>2],tb:H[d+4>>2],Ja:H[d+8>>2],Da:H[d+12>>2],Ca:H[d+16>>2],sa:H[d+20>>2],Ka:H[d+24>>2],La:H[d+28>>2],Gb:H[d+32>>2],sb:H[d+
|
||||
36>>2],vb:q?q?D(E,q,void 0):"":""};c=c?D(E,c,void 0):"";q={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var r in q)c=c.replace(new RegExp(r,"g"),q[r]);var u="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
|
||||
x="January February March April May June July August September October November December".split(" ");q={"%a":function(h){return u[h.Ka].substring(0,3)},"%A":function(h){return u[h.Ka]},"%b":function(h){return x[h.Ca].substring(0,3)},"%B":function(h){return x[h.Ca]},"%C":function(h){return g((h.sa+1900)/100|0,2)},"%d":function(h){return g(h.Da,2)},"%e":function(h){return e(h.Da,2," ")},"%g":function(h){return l(h).toString().substring(2)},"%G":function(h){return l(h)},"%H":function(h){return g(h.Ja,
|
||||
2)},"%I":function(h){h=h.Ja;0==h?h=12:12<h&&(h-=12);return g(h,2)},"%j":function(h){return g(h.Da+Ec(Dc(h.sa+1900)?Fc:Gc,h.Ca-1),3)},"%m":function(h){return g(h.Ca+1,2)},"%M":function(h){return g(h.tb,2)},"%n":function(){return"\n"},"%p":function(h){return 0<=h.Ja&&12>h.Ja?"AM":"PM"},"%S":function(h){return g(h.ub,2)},"%t":function(){return"\t"},"%u":function(h){return h.Ka||7},"%U":function(h){var n=new Date(h.sa+1900,0,1),v=0===n.getDay()?n:Hc(n,7-n.getDay());h=new Date(h.sa+1900,h.Ca,h.Da);return 0>
|
||||
k(v,h)?g(Math.ceil((31-v.getDate()+(Ec(Dc(h.getFullYear())?Fc:Gc,h.getMonth()-1)-31)+h.getDate())/7),2):0===k(v,n)?"01":"00"},"%V":function(h){var n=new Date(h.sa+1901,0,4),v=m(new Date(h.sa+1900,0,4));n=m(n);var y=Hc(new Date(h.sa+1900,0,1),h.La);return 0>k(y,v)?"53":0>=k(n,y)?"01":g(Math.ceil((v.getFullYear()<h.sa+1900?h.La+32-v.getDate():h.La+1-v.getDate())/7),2)},"%w":function(h){return h.Ka},"%W":function(h){var n=new Date(h.sa,0,1),v=1===n.getDay()?n:Hc(n,0===n.getDay()?1:7-n.getDay()+1);h=
|
||||
new Date(h.sa+1900,h.Ca,h.Da);return 0>k(v,h)?g(Math.ceil((31-v.getDate()+(Ec(Dc(h.getFullYear())?Fc:Gc,h.getMonth()-1)-31)+h.getDate())/7),2):0===k(v,n)?"01":"00"},"%y":function(h){return(h.sa+1900).toString().substring(2)},"%Y":function(h){return h.sa+1900},"%z":function(h){h=h.sb;var n=0<=h;h=Math.abs(h)/60;return(n?"+":"-")+String("0000"+(h/60*100+h%60)).slice(-4)},"%Z":function(h){return h.vb},"%%":function(){return"%"}};for(r in q)0<=c.indexOf(r)&&(c=c.replace(new RegExp(r,"g"),q[r](d)));r=
|
||||
hb(c,!1);if(r.length>b)return 0;J.set(r,a);return r.length-1}function zb(a,b,c,d){a||(a=this);this.parent=a;this.ya=a.ya;this.Ga=null;this.id=rb++;this.name=b;this.mode=c;this.pa={};this.qa={};this.rdev=d}Object.defineProperties(zb.prototype,{read:{get:function(){return 365===(this.mode&365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}}});Nb();sb=Array(4096);Gb(P,"/");S("/tmp");S("/home");
|
||||
S("/home/web_user");
|
||||
(function(){S("/dev");fb(259,{read:function(){return 0},write:function(d,e,g,k){return k}});Ib("/dev/null",259);eb(1280,ib);eb(1536,jb);Ib("/dev/tty",1280);Ib("/dev/tty1",1536);if("object"===typeof crypto&&"function"===typeof crypto.getRandomValues){var a=new Uint8Array(1);var b=function(){crypto.getRandomValues(a);return a[0]}}else if(ea)try{var c=require("crypto");b=function(){return c.randomBytes(1)[0]}}catch(d){}b||(b=function(){A("random_device")});Qb("random",b);Qb("urandom",b);S("/dev/shm");
|
||||
S("/dev/shm/tmp")})();S("/proc");S("/proc/self");S("/proc/self/fd");Gb({ya:function(){var a=lb("/proc/self","fd",16895,73);a.pa={lookup:function(b,c){var d=Q[+c];if(!d)throw new O(8);b={parent:null,ya:{Za:"fake"},pa:{readlink:function(){return d.path}}};return b.parent=b}};return a}},"/proc/self/fd");bc=f.InternalError=ac("InternalError");for(var Jc=Array(256),Kc=0;256>Kc;++Kc)Jc[Kc]=String.fromCharCode(Kc);ec=Jc;fc=f.BindingError=ac("BindingError");
|
||||
f.count_emval_handles=function(){for(var a=0,b=5;b<Y.length;++b)void 0!==Y[b]&&++a;return a};f.get_first_emval=function(){for(var a=5;a<Y.length;++a)if(void 0!==Y[a])return Y[a];return null};rc=f.UnboundTypeError=ac("UnboundTypeError");function hb(a,b){var c=Array(sa(a)+1);a=ra(a,c,0,c.length);b&&(c.length=a);return c}
|
||||
var Mc={t:function(a){return ob(a)},G:function(){},q:function(a){"uncaught_exception"in Ya?Ya.Ia++:Ya.Ia=1;throw a;},x:function(){H[Lc()>>2]=63;return-1},w:function(a,b){try{if(-1===(a|0)||0===b)var c=-28;else{var d=Tb[a];if(d&&b===d.Ab){var e=Q[d.fd];if(d.Eb&2){var g=d.flags,k=d.offset,m=E.slice(a,a+b);e&&e.qa.Ha&&e.qa.Ha(e,m,k,b,g)}Tb[a]=null;d.$a&&Z(d.Bb)}c=0}return c}catch(l){return"undefined"!==typeof Sb&&l instanceof O||A(l),-l.Ea}},n:function(a){var b=Vb[a];delete Vb[a];var c=b.lb,d=b.mb,e=
|
||||
b.Ua,g=e.map(function(k){return k.hb}).concat(e.map(function(k){return k.qb}));cc([a],g,function(k){var m={};e.forEach(function(l,q){var r=k[q],u=l.fb,x=l.gb,h=k[q+e.length],n=l.pb,v=l.rb;m[l.cb]={read:function(y){return r.fromWireType(u(x,y))},write:function(y,F){var ja=[];n(v,y,h.toWireType(ja,F));Wb(ja)}}});return[{name:b.name,fromWireType:function(l){var q={},r;for(r in m)q[r]=m[r].read(l);d(l);return q},toWireType:function(l,q){for(var r in m)if(!(r in q))throw new TypeError('Missing field: "'+
|
||||
r+'"');var u=c();for(r in m)m[r].write(u,q[r]);null!==l&&l.push(d,u);return u},argPackAdvance:8,readValueFromPointer:Xb,wa:d}]})},C:function(a,b,c,d,e){var g=dc(c);b=W(b);V(a,{name:b,fromWireType:function(k){return!!k},toWireType:function(k,m){return m?d:e},argPackAdvance:8,readValueFromPointer:function(k){if(1===c)var m=J;else if(2===c)m=G;else if(4===c)m=H;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(m[k>>g])},wa:null})},B:function(a,b){b=W(b);V(a,{name:b,fromWireType:function(c){var d=
|
||||
Y[c].value;ic(c);return d},toWireType:function(c,d){return jc(d)},argPackAdvance:8,readValueFromPointer:Xb,wa:null})},j:function(a,b,c){c=dc(c);b=W(b);V(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,e){if("number"!==typeof e&&"boolean"!==typeof e)throw new TypeError('Cannot convert "'+kc(e)+'" to '+this.name);return e},argPackAdvance:8,readValueFromPointer:lc(b,c),wa:null})},m:function(a,b,c,d,e,g){var k=pc(b,c);a=W(a);e=qc(d,e);oc(a,function(){uc("Cannot call "+a+" due to unbound types",
|
||||
k)},b-1);cc([],k,function(m){var l=[m[0],null].concat(m.slice(1)),q=m=a,r=e,u=l.length;2>u&&X("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var x=null!==l[1]&&!1,h=!1,n=1;n<l.length;++n)if(null!==l[n]&&void 0===l[n].wa){h=!0;break}var v="void"!==l[0].name,y="",F="";for(n=0;n<u-2;++n)y+=(0!==n?", ":"")+"arg"+n,F+=(0!==n?", ":"")+"arg"+n+"Wired";q="return function "+Zb(q)+"("+y+") {\nif (arguments.length !== "+(u-2)+") {\nthrowBindingError('function "+q+" called with ' + arguments.length + ' arguments, expected "+
|
||||
(u-2)+" args!');\n}\n";h&&(q+="var destructors = [];\n");var ja=h?"destructors":"null";y="throwBindingError invoker fn runDestructors retType classParam".split(" ");r=[X,r,g,Wb,l[0],l[1]];x&&(q+="var thisWired = classParam.toWireType("+ja+", this);\n");for(n=0;n<u-2;++n)q+="var arg"+n+"Wired = argType"+n+".toWireType("+ja+", arg"+n+"); // "+l[n+2].name+"\n",y.push("argType"+n),r.push(l[n+2]);x&&(F="thisWired"+(0<F.length?", ":"")+F);q+=(v?"var rv = ":"")+"invoker(fn"+(0<F.length?", ":"")+F+");\n";
|
||||
if(h)q+="runDestructors(destructors);\n";else for(n=x?1:2;n<l.length;++n)u=1===n?"thisWired":"arg"+(n-2)+"Wired",null!==l[n].wa&&(q+=u+"_dtor("+u+"); // "+l[n].name+"\n",y.push(u+"_dtor"),r.push(l[n].wa));v&&(q+="var ret = retType.fromWireType(rv);\nreturn ret;\n");y.push(q+"}\n");l=mc(y).apply(null,r);n=b-1;if(!f.hasOwnProperty(m))throw new bc("Replacing nonexistant public symbol");void 0!==f[m].ua&&void 0!==n?f[m].ua[n]=l:(f[m]=l,f[m].ab=n);return[]})},b:function(a,b,c,d,e){function g(q){return q}
|
||||
b=W(b);-1===e&&(e=4294967295);var k=dc(c);if(0===d){var m=32-8*c;g=function(q){return q<<m>>>m}}var l=-1!=b.indexOf("unsigned");V(a,{name:b,fromWireType:g,toWireType:function(q,r){if("number"!==typeof r&&"boolean"!==typeof r)throw new TypeError('Cannot convert "'+kc(r)+'" to '+this.name);if(r<d||r>e)throw new TypeError('Passing a number "'+kc(r)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+e+"]!");return l?r>>>0:r|0},argPackAdvance:8,readValueFromPointer:vc(b,
|
||||
k,0!==d),wa:null})},a:function(a,b,c){function d(g){g>>=2;var k=K;return new e(I,k[g+1],k[g])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=W(c);V(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{ib:!0})},k:function(a,b){b=W(b);var c="std::string"===b;V(a,{name:b,fromWireType:function(d){var e=K[d>>2];if(c)for(var g=d+4,k=0;k<=e;++k){var m=d+4+k;if(k==e||0==E[m]){g=g?D(E,g,m-g):"";if(void 0===l)var l=g;else l+=String.fromCharCode(0),
|
||||
l+=g;g=m+1}}else{l=Array(e);for(k=0;k<e;++k)l[k]=String.fromCharCode(E[d+4+k]);l=l.join("")}Z(d);return l},toWireType:function(d,e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));var g="string"===typeof e;g||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array||X("Cannot pass non-string to std::string");var k=(c&&g?function(){return sa(e)}:function(){return e.length})(),m=ob(4+k+1);K[m>>2]=k;if(c&&g)ra(e,E,m+4,k+1);else if(g)for(g=0;g<k;++g){var l=e.charCodeAt(g);255<l&&
|
||||
(Z(m),X("String has UTF-16 code units that do not fit in 8 bits"));E[m+4+g]=l}else for(g=0;g<k;++g)E[m+4+g]=e[g];null!==d&&d.push(Z,m);return m},argPackAdvance:8,readValueFromPointer:Xb,wa:function(d){Z(d)}})},g:function(a,b,c){c=W(c);if(2===b){var d=ua;var e=wa;var g=xa;var k=function(){return va};var m=1}else 4===b&&(d=ya,e=za,g=Aa,k=function(){return K},m=2);V(a,{name:c,fromWireType:function(l){for(var q=K[l>>2],r=k(),u,x=l+4,h=0;h<=q;++h){var n=l+4+h*b;if(h==q||0==r[n>>m])x=d(x,n-x),void 0===
|
||||
u?u=x:(u+=String.fromCharCode(0),u+=x),x=n+b}Z(l);return u},toWireType:function(l,q){"string"!==typeof q&&X("Cannot pass non-string to C++ string type "+c);var r=g(q),u=ob(4+r+b);K[u>>2]=r>>m;e(q,u+4,r+b);null!==l&&l.push(Z,u);return u},argPackAdvance:8,readValueFromPointer:Xb,wa:function(l){Z(l)}})},o:function(a,b,c,d,e,g){Vb[a]={name:W(b),lb:qc(c,d),mb:qc(e,g),Ua:[]}},h:function(a,b,c,d,e,g,k,m,l,q){Vb[a].Ua.push({cb:W(b),hb:c,fb:qc(d,e),gb:g,qb:k,pb:qc(m,l),rb:q})},D:function(a,b){b=W(b);V(a,{zb:!0,
|
||||
name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},e:ic,F:function(a){if(0===a)return jc(xc());var b=wc[a];a=void 0===b?W(a):b;return jc(xc()[a])},E:function(a){4<a&&(Y[a].Qa+=1)},p:function(a,b,c,d){a||X("Cannot use deleted val. handle = "+a);a=Y[a].value;var e=zc[b];if(!e){e="";for(var g=0;g<b;++g)e+=(0!==g?", ":"")+"arg"+g;var k="return function emval_allocator_"+b+"(constructor, argTypes, args) {\n";for(g=0;g<b;++g)k+="var argType"+g+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+
|
||||
g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";e=(new Function("requireRegisteredType","Module","__emval_register",k+("var obj = new constructor("+e+");\nreturn __emval_register(obj);\n}\n")))(yc,f,jc);zc[b]=e}return e(a,c,d)},l:function(){A()},u:function(a,b,c){E.copyWithin(a,b,b+c)},d:function(a){a>>>=0;var b=E.length;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216,
|
||||
a,d);0<d%65536&&(d+=65536-d%65536);a:{try{C.grow(Math.min(2147483648,d)-I.byteLength+65535>>>16);Da(C.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},y:function(a,b){var c=0;Bc().forEach(function(d,e){var g=b+c;e=H[a+4*e>>2]=g;for(g=0;g<d.length;++g)J[e++>>0]=d.charCodeAt(g);J[e>>0]=0;c+=d.length+1});return 0},z:function(a,b){var c=Bc();H[a>>2]=c.length;var d=0;c.forEach(function(e){d+=e.length+1});H[b>>2]=d;return 0},A:function(a){try{var b=Ub(a);if(null===b.fd)throw new O(8);
|
||||
b.Na&&(b.Na=null);try{b.qa.close&&b.qa.close(b)}catch(c){throw c;}finally{Q[b.fd]=null}b.fd=null;return 0}catch(c){return"undefined"!==typeof Sb&&c instanceof O||A(c),c.Ea}},r:function(a,b,c,d,e){try{var g=Ub(a);a=4294967296*c+(b>>>0);if(-9007199254740992>=a||9007199254740992<=a)return-61;Mb(g,a,d);Wa=[g.position>>>0,(N=g.position,1<=+La(N)?0<N?(Oa(+Na(N/4294967296),4294967295)|0)>>>0:~~+Ma((N-+(~~N>>>0))/4294967296)>>>0:0)];H[e>>2]=Wa[0];H[e+4>>2]=Wa[1];g.Na&&0===a&&0===d&&(g.Na=null);return 0}catch(k){return"undefined"!==
|
||||
typeof Sb&&k instanceof O||A(k),k.Ea}},i:function(a,b,c,d){try{a:{for(var e=Ub(a),g=a=0;g<c;g++){var k=e,m=H[b+8*g>>2],l=H[b+(8*g+4)>>2],q=void 0,r=J;if(0>l||0>q)throw new O(28);if(null===k.fd)throw new O(8);if(0===(k.flags&2097155))throw new O(8);if(16384===(k.node.mode&61440))throw new O(31);if(!k.qa.write)throw new O(28);k.seekable&&k.flags&1024&&Mb(k,0,2);var u="undefined"!==typeof q;if(!u)q=k.position;else if(!k.seekable)throw new O(70);var x=k.qa.write(k,r,m,l,q,void 0);u||(k.position+=x);try{if(k.path&&
|
||||
ub.onWriteToFile)ub.onWriteToFile(k.path)}catch(v){B("FS.trackingDelegate['onWriteToFile']('"+k.path+"') threw an exception: "+v.message)}var h=x;if(0>h){var n=-1;break a}a+=h}n=a}H[d>>2]=n;return 0}catch(v){return"undefined"!==typeof Sb&&v instanceof O||A(v),v.Ea}},memory:C,f:function(a){a=+a;return 0<=a?+Na(a+.5):+Ma(a-.5)},c:function(a){a=+a;return 0<=a?+Na(a+.5):+Ma(a-.5)},s:function(){},v:function(a,b,c,d){return Ic(a,b,c,d)},table:oa};
|
||||
(function(){function a(e){f.asm=e.exports;L--;f.monitorRunDependencies&&f.monitorRunDependencies(L);0==L&&(null!==Pa&&(clearInterval(Pa),Pa=null),Qa&&(e=Qa,Qa=null,e()))}function b(e){a(e.instance)}function c(e){return Va().then(function(g){return WebAssembly.instantiate(g,d)}).then(e,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var d={a:Mc};L++;f.monitorRunDependencies&&f.monitorRunDependencies(L);if(f.instantiateWasm)try{return f.instantiateWasm(d,a)}catch(e){return B("Module.instantiateWasm callback failed with error: "+
|
||||
e),!1}(function(){if(na||"function"!==typeof WebAssembly.instantiateStreaming||Sa()||Ra("file://")||"function"!==typeof fetch)return c(b);fetch(M,{credentials:"same-origin"}).then(function(e){return WebAssembly.instantiateStreaming(e,d).then(b,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})();
|
||||
var Xa=f.___wasm_call_ctors=function(){return(Xa=f.___wasm_call_ctors=f.asm.H).apply(null,arguments)},ob=f._malloc=function(){return(ob=f._malloc=f.asm.I).apply(null,arguments)},Z=f._free=function(){return(Z=f._free=f.asm.J).apply(null,arguments)},Lc=f.___errno_location=function(){return(Lc=f.___errno_location=f.asm.K).apply(null,arguments)},tc=f.___getTypeName=function(){return(tc=f.___getTypeName=f.asm.L).apply(null,arguments)};
|
||||
f.___embind_register_native_and_builtin_types=function(){return(f.___embind_register_native_and_builtin_types=f.asm.M).apply(null,arguments)};f.dynCall_i=function(){return(f.dynCall_i=f.asm.N).apply(null,arguments)};f.dynCall_vi=function(){return(f.dynCall_vi=f.asm.O).apply(null,arguments)};f.dynCall_iii=function(){return(f.dynCall_iii=f.asm.P).apply(null,arguments)};f.dynCall_viii=function(){return(f.dynCall_viii=f.asm.Q).apply(null,arguments)};
|
||||
f.dynCall_fii=function(){return(f.dynCall_fii=f.asm.R).apply(null,arguments)};f.dynCall_viif=function(){return(f.dynCall_viif=f.asm.S).apply(null,arguments)};f.dynCall_iiiiii=function(){return(f.dynCall_iiiiii=f.asm.T).apply(null,arguments)};f.dynCall_viiiii=function(){return(f.dynCall_viiiii=f.asm.U).apply(null,arguments)};f.dynCall_iidiiii=function(){return(f.dynCall_iidiiii=f.asm.V).apply(null,arguments)};f.dynCall_vii=function(){return(f.dynCall_vii=f.asm.W).apply(null,arguments)};
|
||||
f.dynCall_ii=function(){return(f.dynCall_ii=f.asm.X).apply(null,arguments)};f.dynCall_iiiiiii=function(){return(f.dynCall_iiiiiii=f.asm.Y).apply(null,arguments)};f.dynCall_viiii=function(){return(f.dynCall_viiii=f.asm.Z).apply(null,arguments)};f.dynCall_iiii=function(){return(f.dynCall_iiii=f.asm._).apply(null,arguments)};f.dynCall_viiiiiii=function(){return(f.dynCall_viiiiiii=f.asm.$).apply(null,arguments)};f.dynCall_viijii=function(){return(f.dynCall_viijii=f.asm.aa).apply(null,arguments)};
|
||||
f.dynCall_v=function(){return(f.dynCall_v=f.asm.ba).apply(null,arguments)};f.dynCall_iiiii=function(){return(f.dynCall_iiiii=f.asm.ca).apply(null,arguments)};f.dynCall_fi=function(){return(f.dynCall_fi=f.asm.da).apply(null,arguments)};f.dynCall_viiiiii=function(){return(f.dynCall_viiiiii=f.asm.ea).apply(null,arguments)};f.dynCall_iiji=function(){return(f.dynCall_iiji=f.asm.fa).apply(null,arguments)};f.dynCall_iifi=function(){return(f.dynCall_iifi=f.asm.ga).apply(null,arguments)};
|
||||
f.dynCall_jiji=function(){return(f.dynCall_jiji=f.asm.ha).apply(null,arguments)};f.dynCall_iiiiiiiii=function(){return(f.dynCall_iiiiiiiii=f.asm.ia).apply(null,arguments)};f.dynCall_iiiiiiii=function(){return(f.dynCall_iiiiiiii=f.asm.ja).apply(null,arguments)};f.dynCall_iiiiiijj=function(){return(f.dynCall_iiiiiijj=f.asm.ka).apply(null,arguments)};f.dynCall_iiiiij=function(){return(f.dynCall_iiiiij=f.asm.la).apply(null,arguments)};
|
||||
f.dynCall_iiiiid=function(){return(f.dynCall_iiiiid=f.asm.ma).apply(null,arguments)};f.dynCall_iiiiijj=function(){return(f.dynCall_iiiiijj=f.asm.na).apply(null,arguments)};var Nc;Qa=function Oc(){Nc||Pc();Nc||(Qa=Oc)};
|
||||
function Pc(){function a(){if(!Nc&&(Nc=!0,f.calledRun=!0,!pa)){f.noFSInit||Ob||(Ob=!0,Nb(),f.stdin=f.stdin,f.stdout=f.stdout,f.stderr=f.stderr,f.stdin?Qb("stdin",f.stdin):Jb("/dev/tty","/dev/stdin"),f.stdout?Qb("stdout",null,f.stdout):Jb("/dev/tty","/dev/stdout"),f.stderr?Qb("stderr",null,f.stderr):Jb("/dev/tty1","/dev/stderr"),Kb("/dev/stdin","r"),Kb("/dev/stdout","w"),Kb("/dev/stderr","w"));Fa(Ha);tb=!1;Fa(Ia);aa(f);if(f.onRuntimeInitialized)f.onRuntimeInitialized();if(f.postRun)for("function"==
|
||||
typeof f.postRun&&(f.postRun=[f.postRun]);f.postRun.length;){var b=f.postRun.shift();Ja.unshift(b)}Fa(Ja)}}if(!(0<L)){if(f.preRun)for("function"==typeof f.preRun&&(f.preRun=[f.preRun]);f.preRun.length;)Ka();Fa(Ga);0<L||(f.setStatus?(f.setStatus("Running..."),setTimeout(function(){setTimeout(function(){f.setStatus("")},1);a()},1)):a())}}f.run=Pc;if(f.preInit)for("function"==typeof f.preInit&&(f.preInit=[f.preInit]);0<f.preInit.length;)f.preInit.pop()();noExitRuntime=!0;Pc();
|
||||
|
||||
|
||||
return jxl_enc.ready
|
||||
}
|
||||
);
|
||||
})();
|
||||
if (typeof exports === 'object' && typeof module === 'object')
|
||||
module.exports = jxl_enc;
|
||||
else if (typeof define === 'function' && define['amd'])
|
||||
define([], function() { return jxl_enc; });
|
||||
else if (typeof exports === 'object')
|
||||
exports["jxl_enc"] = jxl_enc;
|
||||
|
BIN
codecs/jxl/enc/jxl_enc.wasm
Normal file
BIN
codecs/jxl/enc/jxl_enc.wasm
Normal file
Binary file not shown.
6
codecs/jxl/package.json
Normal file
6
codecs/jxl/package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "jxl",
|
||||
"scripts": {
|
||||
"build": "../build-cpp.sh"
|
||||
}
|
||||
}
|
47
codecs/wp2/Makefile
Normal file
47
codecs/wp2/Makefile
Normal file
@ -0,0 +1,47 @@
|
||||
CODEC_URL = https://chromium.googlesource.com/codecs/libwebp2/+archive/c90b5b476004c9a98731ae1c175cebab5de50fbf.tar.gz
|
||||
CODEC_DIR = node_modules/wp2
|
||||
CODEC_BUILD_DIR := $(CODEC_DIR)/.build
|
||||
CODEC_OUT := $(CODEC_BUILD_DIR)/libwebp2.a
|
||||
|
||||
OUT_JS = enc/wp2_enc.js dec/wp2_dec.js
|
||||
OUT_WASM = $(OUT_JS:.js=.wasm)
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: $(OUT_JS)
|
||||
|
||||
%.js: %.cpp $(CODEC_OUT)
|
||||
$(CXX) \
|
||||
-I $(CODEC_DIR) \
|
||||
${CXXFLAGS} \
|
||||
${LDFLAGS} \
|
||||
--bind \
|
||||
--closure 1 \
|
||||
-s ALLOW_MEMORY_GROWTH=1 \
|
||||
-s MODULARIZE=1 \
|
||||
-s 'EXPORT_NAME="$(basename $(@F))"' \
|
||||
-o $@ \
|
||||
$+
|
||||
|
||||
$(CODEC_OUT): $(CODEC_BUILD_DIR)/Makefile
|
||||
cd $(CODEC_BUILD_DIR) && \
|
||||
$(MAKE)
|
||||
|
||||
$(CODEC_BUILD_DIR)/Makefile: $(CODEC_DIR)/CMakeLists.txt
|
||||
mkdir -p $(CODEC_BUILD_DIR)
|
||||
cd $(CODEC_BUILD_DIR) && \
|
||||
emcmake cmake \
|
||||
-DWP2_ENABLE_SIMD=0 \
|
||||
-DWP2_BUILD_TESTS=0 \
|
||||
-DWP2_ENABLE_TESTS=0 \
|
||||
-DWP2_BUILD_EXAMPLES=0 \
|
||||
-DWP2_BUILD_EXTRAS=0 \
|
||||
../
|
||||
|
||||
$(CODEC_DIR)/CMakeLists.txt:
|
||||
mkdir -p $(CODEC_DIR)
|
||||
curl -sL $(CODEC_URL) | tar xz -C $(CODEC_DIR)
|
||||
|
||||
clean:
|
||||
$(RM) $(OUT_JS) $(OUT_WASM)
|
||||
$(MAKE) -C $(CODEC_BUILD_DIR) clean
|
17
codecs/wp2/dec/README.md
Normal file
17
codecs/wp2/dec/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# WebP2 decoder
|
||||
|
||||
- Source: <https://chromium.googlesource.com/codecs/libwebp2>
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Docker
|
||||
|
||||
## Example
|
||||
|
||||
N/A
|
||||
|
||||
## API
|
||||
|
||||
### `ImageData decode(uint8_t* image_buffer, int image_width, int image_height)`
|
||||
|
||||
Decodes the given WebP2 buffer into raw RGBA represented as an `ImageData`.
|
24
codecs/wp2/dec/wp2_dec.cpp
Normal file
24
codecs/wp2/dec/wp2_dec.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include <emscripten/bind.h>
|
||||
#include <emscripten/val.h>
|
||||
#include <cstdio>
|
||||
#include "src/wp2/decode.h"
|
||||
|
||||
using namespace emscripten;
|
||||
|
||||
thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray");
|
||||
thread_local const val ImageData = val::global("ImageData");
|
||||
|
||||
val decode(std::string image_in) {
|
||||
WP2::ArgbBuffer buffer(WP2_rgbA_32);
|
||||
WP2Status status = WP2::Decode(image_in, &buffer);
|
||||
if (status != WP2_STATUS_OK) {
|
||||
return val::null();
|
||||
}
|
||||
return ImageData.new_(
|
||||
Uint8ClampedArray.new_(typed_memory_view(buffer.stride * buffer.height, buffer.GetRow8(0))),
|
||||
buffer.width, buffer.height);
|
||||
}
|
||||
|
||||
EMSCRIPTEN_BINDINGS(my_module) {
|
||||
function("decode", &decode);
|
||||
}
|
5
codecs/wp2/dec/wp2_dec.d.ts
vendored
Normal file
5
codecs/wp2/dec/wp2_dec.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
interface WP2Module extends EmscriptenWasm.Module {
|
||||
decode(data: BufferSource): ImageData | null;
|
||||
}
|
||||
|
||||
export default function(opts: EmscriptenWasm.ModuleOpts): Promise<WP2Module>;
|
69
codecs/wp2/dec/wp2_dec.js
Normal file
69
codecs/wp2/dec/wp2_dec.js
Normal file
@ -0,0 +1,69 @@
|
||||
|
||||
var wp2_dec = (function() {
|
||||
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
|
||||
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
|
||||
return (
|
||||
function(wp2_dec) {
|
||||
wp2_dec = wp2_dec || {};
|
||||
|
||||
|
||||
var d;d||(d=typeof wp2_dec !== 'undefined' ? wp2_dec : {});var aa,ba;d.ready=new Promise(function(a,b){aa=a;ba=b});var r={},t;for(t in d)d.hasOwnProperty(t)&&(r[t]=d[t]);var u=!1,v=!1,ca=!1,da=!1;u="object"===typeof window;v="function"===typeof importScripts;ca="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;da=!u&&!ca&&!v;var w="",x,z,ea,fa;
|
||||
if(ca)w=v?require("path").dirname(w)+"/":__dirname+"/",x=function(a,b){ea||(ea=require("fs"));fa||(fa=require("path"));a=fa.normalize(a);return ea.readFileSync(a,b?null:"utf8")},z=function(a){a=x(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||A("Assertion failed: undefined");return a},1<process.argv.length&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),process.on("uncaughtException",function(a){throw a;}),process.on("unhandledRejection",A),d.inspect=function(){return"[Emscripten Module object]"};
|
||||
else if(da)"undefined"!=typeof read&&(x=function(a){return read(a)}),z=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");"object"===typeof a||A("Assertion failed: undefined");return a},"undefined"!==typeof print&&("undefined"===typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!==typeof printErr?printErr:print);else if(u||v)v?w=self.location.href:document.currentScript&&(w=document.currentScript.src),_scriptDir&&
|
||||
(w=_scriptDir),0!==w.indexOf("blob:")?w=w.substr(0,w.lastIndexOf("/")+1):w="",x=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},v&&(z=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});var ha=d.print||console.log.bind(console),B=d.printErr||console.warn.bind(console);for(t in r)r.hasOwnProperty(t)&&(d[t]=r[t]);r=null;var D;d.wasmBinary&&(D=d.wasmBinary);var noExitRuntime;
|
||||
d.noExitRuntime&&(noExitRuntime=d.noExitRuntime);"object"!==typeof WebAssembly&&A("no native wasm support detected");var E,ia=new WebAssembly.Table({initial:270,maximum:270,element:"anyfunc"}),ja=!1,ka="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;
|
||||
function la(a,b,c){var e=b+c;for(c=b;a[c]&&!(c>=e);)++c;if(16<c-b&&a.subarray&&ka)return ka.decode(a.subarray(b,c));for(e="";b<c;){var f=a[b++];if(f&128){var g=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var l=a[b++]&63;f=224==(f&240)?(f&15)<<12|g<<6|l:(f&7)<<18|g<<12|l<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e}
|
||||
function ma(a,b,c){var e=F;if(0<c){c=b+c-1;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var na="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0;
|
||||
function oa(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&G[c];)++c;c<<=1;if(32<c-a&&na)return na.decode(F.subarray(a,c));c=0;for(e="";;){var f=H[a+2*c>>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function pa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f<c;++f)H[b>>1]=a.charCodeAt(f),b+=2;H[b>>1]=0;return b-e}function qa(a){return 2*a.length}
|
||||
function ra(a,b){for(var c=0,e="";!(c>=b/4);){var f=I[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function sa(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}I[b>>2]=g;b+=4;if(b+4>c)break}I[b>>2]=0;return b-e}
|
||||
function ta(a){for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&++c;b+=4}return b}var J,ua,F,H,G,I,L,va,wa;function xa(a){J=a;d.HEAP8=ua=new Int8Array(a);d.HEAP16=H=new Int16Array(a);d.HEAP32=I=new Int32Array(a);d.HEAPU8=F=new Uint8Array(a);d.HEAPU16=G=new Uint16Array(a);d.HEAPU32=L=new Uint32Array(a);d.HEAPF32=va=new Float32Array(a);d.HEAPF64=wa=new Float64Array(a)}var ya=d.INITIAL_MEMORY||16777216;d.wasmMemory?E=d.wasmMemory:E=new WebAssembly.Memory({initial:ya/65536,maximum:32768});
|
||||
E&&(J=E.buffer);ya=J.byteLength;xa(J);I[32956]=5374864;function M(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b(d);else{var c=b.ea;"number"===typeof c?void 0===b.$?d.dynCall_v(c):d.dynCall_vi(c,b.$):c(void 0===b.$?null:b.$)}}}var za=[],Aa=[],Ba=[],Ca=[];function Da(){var a=d.preRun.shift();za.unshift(a)}var Ea=Math.ceil,Fa=Math.floor,N=0,Ga=null,O=null;d.preloadedImages={};d.preloadedAudios={};
|
||||
function A(a){if(d.onAbort)d.onAbort(a);B(a);ja=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s ASSERTIONS=1 for more info.");ba(a);throw a;}function Ha(a){var b=Q;return String.prototype.startsWith?b.startsWith(a):0===b.indexOf(a)}function Ia(){return Ha("data:application/octet-stream;base64,")}var Q="wp2_dec.wasm";if(!Ia()){var Ja=Q;Q=d.locateFile?d.locateFile(Ja,w):w+Ja}
|
||||
function Ka(){try{if(D)return new Uint8Array(D);if(z)return z(Q);throw"both async and sync fetching of the wasm failed";}catch(a){A(a)}}function La(){return D||!u&&!v||"function"!==typeof fetch||Ha("file://")?new Promise(function(a){a(Ka())}):fetch(Q,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+Q+"'";return a.arrayBuffer()}).catch(function(){return Ka()})}Aa.push({ea:function(){Ma()}});function R(){return 0<R.ba}
|
||||
function Na(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var Oa=void 0;function S(a){for(var b="";F[a];)b+=Oa[F[a++]];return b}var T={},U={},V={};function Pa(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}
|
||||
function Qa(a,b){a=Pa(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Ra(a){var b=Error,c=Qa(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}
|
||||
var Sa=void 0;function W(a){throw new Sa(a);}var Ta=void 0;function Ua(a,b){function c(k){k=b(k);if(k.length!==e.length)throw new Ta("Mismatched type converter count");for(var h=0;h<e.length;++h)X(e[h],k[h])}var e=[];e.forEach(function(k){V[k]=a});var f=Array(a.length),g=[],l=0;a.forEach(function(k,h){U.hasOwnProperty(k)?f[h]=U[k]:(g.push(k),T.hasOwnProperty(k)||(T[k]=[]),T[k].push(function(){f[h]=U[k];++l;l===g.length&&c(f)}))});0===g.length&&c(f)}
|
||||
function X(a,b,c){c=c||{};if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var e=b.name;a||W('type "'+e+'" must have a positive integer typeid pointer');if(U.hasOwnProperty(a)){if(c.fa)return;W("Cannot register type '"+e+"' twice")}U[a]=b;delete V[a];T.hasOwnProperty(a)&&(b=T[a],delete T[a],b.forEach(function(f){f()}))}var Va=[],Y=[{},{value:void 0},{value:null},{value:!0},{value:!1}];
|
||||
function Wa(a){4<a&&0===--Y[a].aa&&(Y[a]=void 0,Va.push(a))}function Za(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Va.length?Va.pop():Y.length;Y[b]={aa:1,value:a};return b}}function $a(a){return this.fromWireType(L[a>>2])}function ab(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}
|
||||
function bb(a,b){switch(b){case 2:return function(c){return this.fromWireType(va[c>>2])};case 3:return function(c){return this.fromWireType(wa[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function cb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=Qa(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c}
|
||||
function db(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function eb(a,b){var c=d;if(void 0===c[a].Y){var e=c[a];c[a]=function(){c[a].Y.hasOwnProperty(arguments.length)||W("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].Y+")!");return c[a].Y[arguments.length].apply(this,arguments)};c[a].Y=[];c[a].Y[e.da]=e}}
|
||||
function fb(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].Y&&void 0!==d[a].Y[c])&&W("Cannot register public name '"+a+"' twice"),eb(a,a),d.hasOwnProperty(c)&&W("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].Y[c]=b):(d[a]=b,void 0!==c&&(d[a].ha=c))}function gb(a,b){for(var c=[],e=0;e<a;e++)c.push(I[(b>>2)+e]);return c}
|
||||
function hb(a,b){a=S(a);var c=d["dynCall_"+a];for(var e=[],f=1;f<a.length;++f)e.push("a"+f);f="return function dynCall_"+(a+"_"+b)+"("+e.join(", ")+") {\n";f+=" return dynCall(rawFunction"+(e.length?", ":"")+e.join(", ")+");\n";c=(new Function("dynCall","rawFunction",f+"};\n"))(c,b);"function"!==typeof c&&W("unknown function pointer with signature "+a+": "+b);return c}var ib=void 0;function jb(a){a=kb(a);var b=S(a);Z(a);return b}
|
||||
function lb(a,b){function c(g){f[g]||U[g]||(V[g]?V[g].forEach(c):(e.push(g),f[g]=!0))}var e=[],f={};b.forEach(c);throw new ib(a+": "+e.map(jb).join([", "]));}function mb(a,b,c){switch(b){case 0:return c?function(e){return ua[e]}:function(e){return F[e]};case 1:return c?function(e){return H[e>>1]}:function(e){return G[e>>1]};case 2:return c?function(e){return I[e>>2]}:function(e){return L[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var nb={};
|
||||
function ob(){return"object"===typeof globalThis?globalThis:Function("return this")()}function pb(a,b){var c=U[a];void 0===c&&W(b+" has unknown type "+jb(a));return c}for(var qb={},rb=[null,[],[]],sb=Array(256),tb=0;256>tb;++tb)sb[tb]=String.fromCharCode(tb);Oa=sb;Sa=d.BindingError=Ra("BindingError");Ta=d.InternalError=Ra("InternalError");d.count_emval_handles=function(){for(var a=0,b=5;b<Y.length;++b)void 0!==Y[b]&&++a;return a};
|
||||
d.get_first_emval=function(){for(var a=5;a<Y.length;++a)if(void 0!==Y[a])return Y[a];return null};ib=d.UnboundTypeError=Ra("UnboundTypeError");
|
||||
var vb={t:function(a){return ub(a)},g:function(){},s:function(a){"uncaught_exception"in R?R.ba++:R.ba=1;throw a;},y:function(a,b,c,e,f){var g=Na(c);b=S(b);X(a,{name:b,fromWireType:function(l){return!!l},toWireType:function(l,k){return k?e:f},argPackAdvance:8,readValueFromPointer:function(l){if(1===c)var k=ua;else if(2===c)k=H;else if(4===c)k=I;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(k[l>>g])},Z:null})},x:function(a,b){b=S(b);X(a,{name:b,fromWireType:function(c){var e=
|
||||
Y[c].value;Wa(c);return e},toWireType:function(c,e){return Za(e)},argPackAdvance:8,readValueFromPointer:$a,Z:null})},n:function(a,b,c){c=Na(c);b=S(b);X(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+ab(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:bb(b,c),Z:null})},u:function(a,b,c,e,f,g){var l=gb(b,c);a=S(a);f=hb(e,f);fb(a,function(){lb("Cannot call "+a+" due to unbound types",
|
||||
l)},b-1);Ua(l,function(k){var h=[k[0],null].concat(k.slice(1)),n=k=a,p=f,q=h.length;2>q&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,C=!1,m=1;m<h.length;++m)if(null!==h[m]&&void 0===h[m].Z){C=!0;break}var Xa="void"!==h[0].name,K="",P="";for(m=0;m<q-2;++m)K+=(0!==m?", ":"")+"arg"+m,P+=(0!==m?", ":"")+"arg"+m+"Wired";n="return function "+Pa(n)+"("+K+") {\nif (arguments.length !== "+(q-2)+") {\nthrowBindingError('function "+n+" called with ' + arguments.length + ' arguments, expected "+
|
||||
(q-2)+" args!');\n}\n";C&&(n+="var destructors = [];\n");var Ya=C?"destructors":"null";K="throwBindingError invoker fn runDestructors retType classParam".split(" ");p=[W,p,g,db,h[0],h[1]];y&&(n+="var thisWired = classParam.toWireType("+Ya+", this);\n");for(m=0;m<q-2;++m)n+="var arg"+m+"Wired = argType"+m+".toWireType("+Ya+", arg"+m+"); // "+h[m+2].name+"\n",K.push("argType"+m),p.push(h[m+2]);y&&(P="thisWired"+(0<P.length?", ":"")+P);n+=(Xa?"var rv = ":"")+"invoker(fn"+(0<P.length?", ":"")+P+");\n";
|
||||
if(C)n+="runDestructors(destructors);\n";else for(m=y?1:2;m<h.length;++m)q=1===m?"thisWired":"arg"+(m-2)+"Wired",null!==h[m].Z&&(n+=q+"_dtor("+q+"); // "+h[m].name+"\n",K.push(q+"_dtor"),p.push(h[m].Z));Xa&&(n+="var ret = retType.fromWireType(rv);\nreturn ret;\n");K.push(n+"}\n");h=cb(K).apply(null,p);m=b-1;if(!d.hasOwnProperty(k))throw new Ta("Replacing nonexistant public symbol");void 0!==d[k].Y&&void 0!==m?d[k].Y[m]=h:(d[k]=h,d[k].da=m);return[]})},b:function(a,b,c,e,f){function g(n){return n}
|
||||
b=S(b);-1===f&&(f=4294967295);var l=Na(c);if(0===e){var k=32-8*c;g=function(n){return n<<k>>>k}}var h=-1!=b.indexOf("unsigned");X(a,{name:b,fromWireType:g,toWireType:function(n,p){if("number"!==typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+ab(p)+'" to '+this.name);if(p<e||p>f)throw new TypeError('Passing a number "'+ab(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:mb(b,
|
||||
l,0!==e),Z:null})},a:function(a,b,c){function e(g){g>>=2;var l=L;return new f(J,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=S(c);X(a,{name:c,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{fa:!0})},o:function(a,b){b=S(b);var c="std::string"===b;X(a,{name:b,fromWireType:function(e){var f=L[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==F[k]){g=g?la(F,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),
|
||||
h+=g;g=k+1}}else{h=Array(f);for(l=0;l<f;++l)h[l]=String.fromCharCode(F[e+4+l]);h=h.join("")}Z(e);return h},toWireType:function(e,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var g="string"===typeof f;g||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array||W("Cannot pass non-string to std::string");var l=(c&&g?function(){for(var n=0,p=0;p<f.length;++p){var q=f.charCodeAt(p);55296<=q&&57343>=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++n:n=2047>=q?n+
|
||||
2:65535>=q?n+3:n+4}return n}:function(){return f.length})(),k=ub(4+l+1);L[k>>2]=l;if(c&&g)ma(f,k+4,l+1);else if(g)for(g=0;g<l;++g){var h=f.charCodeAt(g);255<h&&(Z(k),W("String has UTF-16 code units that do not fit in 8 bits"));F[k+4+g]=h}else for(g=0;g<l;++g)F[k+4+g]=f[g];null!==e&&e.push(Z,k);return k},argPackAdvance:8,readValueFromPointer:$a,Z:function(e){Z(e)}})},h:function(a,b,c){c=S(c);if(2===b){var e=oa;var f=pa;var g=qa;var l=function(){return G};var k=1}else 4===b&&(e=ra,f=sa,g=ta,l=function(){return L},
|
||||
k=2);X(a,{name:c,fromWireType:function(h){for(var n=L[h>>2],p=l(),q,y=h+4,C=0;C<=n;++C){var m=h+4+C*b;if(C==n||0==p[m>>k])y=e(y,m-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=m+b}Z(h);return q},toWireType:function(h,n){"string"!==typeof n&&W("Cannot pass non-string to C++ string type "+c);var p=g(n),q=ub(4+p+b);L[q>>2]=p>>k;f(n,q+4,p+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:$a,Z:function(h){Z(h)}})},z:function(a,b){b=S(b);X(a,{ga:!0,name:b,argPackAdvance:0,
|
||||
fromWireType:function(){},toWireType:function(){}})},e:Wa,f:function(a){if(0===a)return Za(ob());var b=nb[a];a=void 0===b?S(a):b;return Za(ob()[a])},i:function(a){4<a&&(Y[a].aa+=1)},j:function(a,b,c,e){a||W("Cannot use deleted val. handle = "+a);a=Y[a].value;var f=qb[b];if(!f){f="";for(var g=0;g<b;++g)f+=(0!==g?", ":"")+"arg"+g;var l="return function emval_allocator_"+b+"(constructor, argTypes, args) {\n";for(g=0;g<b;++g)l+="var argType"+g+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+
|
||||
g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(pb,d,Za);qb[b]=f}return f(a,c,e)},l:function(){A()},w:function(a,b,c){F.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=F.length;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,
|
||||
a,e);0<e%65536&&(e+=65536-e%65536);a:{try{E.grow(Math.min(2147483648,e)-J.byteLength+65535>>>16);xa(E.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},m:function(a,b,c,e){for(var f=0,g=0;g<c;g++){for(var l=I[b+8*g>>2],k=I[b+(8*g+4)>>2],h=0;h<k;h++){var n=F[l+h],p=rb[a];0===n||10===n?((1===a?ha:B)(la(p,0)),p.length=0):p.push(n)}f+=k}I[e>>2]=f;return 0},memory:E,p:function(){return 0},r:function(){return 0},q:function(){},B:function(){return 6},A:function(){},k:function(a){a=+a;return 0<=
|
||||
a?+Fa(a+.5):+Ea(a-.5)},d:function(a){a=+a;return 0<=a?+Fa(a+.5):+Ea(a-.5)},v:function(){},table:ia};
|
||||
(function(){function a(f){d.asm=f.exports;N--;d.monitorRunDependencies&&d.monitorRunDependencies(N);0==N&&(null!==Ga&&(clearInterval(Ga),Ga=null),O&&(f=O,O=null,f()))}function b(f){a(f.instance)}function c(f){return La().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var e={a:vb};N++;d.monitorRunDependencies&&d.monitorRunDependencies(N);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return B("Module.instantiateWasm callback failed with error: "+
|
||||
f),!1}(function(){if(D||"function"!==typeof WebAssembly.instantiateStreaming||Ia()||Ha("file://")||"function"!==typeof fetch)return c(b);fetch(Q,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})();
|
||||
var Ma=d.___wasm_call_ctors=function(){return(Ma=d.___wasm_call_ctors=d.asm.C).apply(null,arguments)},ub=d._malloc=function(){return(ub=d._malloc=d.asm.D).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.E).apply(null,arguments)},kb=d.___getTypeName=function(){return(kb=d.___getTypeName=d.asm.F).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.G).apply(null,arguments)};
|
||||
d.dynCall_iii=function(){return(d.dynCall_iii=d.asm.H).apply(null,arguments)};d.dynCall_vii=function(){return(d.dynCall_vii=d.asm.I).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.J).apply(null,arguments)};d.dynCall_viii=function(){return(d.dynCall_viii=d.asm.K).apply(null,arguments)};d.dynCall_viiiiiiii=function(){return(d.dynCall_viiiiiiii=d.asm.L).apply(null,arguments)};d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.M).apply(null,arguments)};
|
||||
d.dynCall_viiiiiii=function(){return(d.dynCall_viiiiiii=d.asm.N).apply(null,arguments)};d.dynCall_viiiiiiiii=function(){return(d.dynCall_viiiiiiiii=d.asm.O).apply(null,arguments)};d.dynCall_viiii=function(){return(d.dynCall_viiii=d.asm.P).apply(null,arguments)};d.dynCall_viiiiii=function(){return(d.dynCall_viiiiii=d.asm.Q).apply(null,arguments)};d.dynCall_iidiiii=function(){return(d.dynCall_iidiiii=d.asm.R).apply(null,arguments)};d.dynCall_v=function(){return(d.dynCall_v=d.asm.S).apply(null,arguments)};
|
||||
d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.T).apply(null,arguments)};d.dynCall_iiiiii=function(){return(d.dynCall_iiiiii=d.asm.U).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.V).apply(null,arguments)};d.dynCall_iiiii=function(){return(d.dynCall_iiiii=d.asm.W).apply(null,arguments)};d.dynCall_jiji=function(){return(d.dynCall_jiji=d.asm.X).apply(null,arguments)};var wb;O=function xb(){wb||yb();wb||(O=xb)};
|
||||
function yb(){function a(){if(!wb&&(wb=!0,d.calledRun=!0,!ja)){M(Aa);M(Ba);aa(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();Ca.unshift(b)}M(Ca)}}if(!(0<N)){if(d.preRun)for("function"==typeof d.preRun&&(d.preRun=[d.preRun]);d.preRun.length;)Da();M(za);0<N||(d.setStatus?(d.setStatus("Running..."),setTimeout(function(){setTimeout(function(){d.setStatus("")},1);a()},1)):a())}}
|
||||
d.run=yb;if(d.preInit)for("function"==typeof d.preInit&&(d.preInit=[d.preInit]);0<d.preInit.length;)d.preInit.pop()();noExitRuntime=!0;yb();
|
||||
|
||||
|
||||
return wp2_dec.ready
|
||||
}
|
||||
);
|
||||
})();
|
||||
if (typeof exports === 'object' && typeof module === 'object')
|
||||
module.exports = wp2_dec;
|
||||
else if (typeof define === 'function' && define['amd'])
|
||||
define([], function() { return wp2_dec; });
|
||||
else if (typeof exports === 'object')
|
||||
exports["wp2_dec"] = wp2_dec;
|
||||
|
BIN
codecs/wp2/dec/wp2_dec.wasm
Normal file
BIN
codecs/wp2/dec/wp2_dec.wasm
Normal file
Binary file not shown.
17
codecs/wp2/enc/README.md
Normal file
17
codecs/wp2/enc/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# WebP2 encoder
|
||||
|
||||
- Source: <https://chromium.googlesource.com/codecs/libwebp2>
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Docker
|
||||
|
||||
## Example
|
||||
|
||||
N/A
|
||||
|
||||
## API
|
||||
|
||||
### `UInt8Array encode(uint8_t* image_buffer, int image_width, int image_height, WP2::EncoderConfig config)`
|
||||
|
||||
Encodes the given image with given dimension to WebP2.
|
38
codecs/wp2/enc/wp2_enc.cpp
Normal file
38
codecs/wp2/enc/wp2_enc.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
#include <emscripten/bind.h>
|
||||
#include <emscripten/val.h>
|
||||
#include <cstdio>
|
||||
#include "src/wp2/encode.h"
|
||||
|
||||
using namespace emscripten;
|
||||
|
||||
thread_local const val Uint8Array = val::global("Uint8Array");
|
||||
|
||||
val encode(std::string image_in, int image_width, int image_height, WP2::EncoderConfig config) {
|
||||
uint8_t* image_buffer = (uint8_t*)image_in.c_str();
|
||||
WP2::ArgbBuffer src = WP2::ArgbBuffer();
|
||||
WP2Status status =
|
||||
src.Import(WP2_rgbA_32, // Format. WP2_RGBA_32 is the same but NOT premultiplied alpha
|
||||
image_width, image_height, image_buffer, 4 * image_width);
|
||||
if (status != WP2_STATUS_OK) {
|
||||
return val::null();
|
||||
}
|
||||
|
||||
WP2::MemoryWriter memory_writer;
|
||||
status = WP2::Encode(src, &memory_writer, config);
|
||||
if (status != WP2_STATUS_OK) {
|
||||
return val::null();
|
||||
}
|
||||
|
||||
return Uint8Array.new_(typed_memory_view(memory_writer.size_, memory_writer.mem_));
|
||||
}
|
||||
|
||||
EMSCRIPTEN_BINDINGS(my_module) {
|
||||
value_object<WP2::EncoderConfig>("WP2EncoderConfig")
|
||||
.field("quality", &WP2::EncoderConfig::quality)
|
||||
.field("alpha_quality", &WP2::EncoderConfig::alpha_quality)
|
||||
.field("speed", &WP2::EncoderConfig::speed)
|
||||
.field("pass", &WP2::EncoderConfig::pass)
|
||||
.field("sns", &WP2::EncoderConfig::sns);
|
||||
|
||||
function("encode", &encode);
|
||||
}
|
7
codecs/wp2/enc/wp2_enc.d.ts
vendored
Normal file
7
codecs/wp2/enc/wp2_enc.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
import { EncodeOptions } from '../../../src/codecs/wp2/encoder-meta';
|
||||
|
||||
interface WP2Module extends EmscriptenWasm.Module {
|
||||
encode(data: BufferSource, width: number, height: number, options: EncodeOptions): Uint8Array | null;
|
||||
}
|
||||
|
||||
export default function(opts: EmscriptenWasm.ModuleOpts): Promise<WP2Module>;
|
73
codecs/wp2/enc/wp2_enc.js
Normal file
73
codecs/wp2/enc/wp2_enc.js
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
var wp2_enc = (function() {
|
||||
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
|
||||
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
|
||||
return (
|
||||
function(wp2_enc) {
|
||||
wp2_enc = wp2_enc || {};
|
||||
|
||||
|
||||
var c;c||(c=typeof wp2_enc !== 'undefined' ? wp2_enc : {});var aa,ba;c.ready=new Promise(function(a,b){aa=a;ba=b});var r={},t;for(t in c)c.hasOwnProperty(t)&&(r[t]=c[t]);var u=!1,v=!1,ca=!1,da=!1;u="object"===typeof window;v="function"===typeof importScripts;ca="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;da=!u&&!ca&&!v;var w="",y,B,ea,fa;
|
||||
if(ca)w=v?require("path").dirname(w)+"/":__dirname+"/",y=function(a,b){ea||(ea=require("fs"));fa||(fa=require("path"));a=fa.normalize(a);return ea.readFileSync(a,b?null:"utf8")},B=function(a){a=y(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||C("Assertion failed: undefined");return a},1<process.argv.length&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),process.on("uncaughtException",function(a){throw a;}),process.on("unhandledRejection",C),c.inspect=function(){return"[Emscripten Module object]"};
|
||||
else if(da)"undefined"!=typeof read&&(y=function(a){return read(a)}),B=function(a){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,"binary");"object"===typeof a||C("Assertion failed: undefined");return a},"undefined"!==typeof print&&("undefined"===typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!==typeof printErr?printErr:print);else if(u||v)v?w=self.location.href:document.currentScript&&(w=document.currentScript.src),_scriptDir&&
|
||||
(w=_scriptDir),0!==w.indexOf("blob:")?w=w.substr(0,w.lastIndexOf("/")+1):w="",y=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},v&&(B=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});var ha=c.print||console.log.bind(console),D=c.printErr||console.warn.bind(console);for(t in r)r.hasOwnProperty(t)&&(c[t]=r[t]);r=null;var E;c.wasmBinary&&(E=c.wasmBinary);var noExitRuntime;
|
||||
c.noExitRuntime&&(noExitRuntime=c.noExitRuntime);"object"!==typeof WebAssembly&&C("no native wasm support detected");var F,ia=new WebAssembly.Table({initial:432,maximum:432,element:"anyfunc"}),ka=!1,la="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;
|
||||
function H(a,b,d){var e=b+d;for(d=b;a[d]&&!(d>=e);)++d;if(16<d-b&&a.subarray&&la)return la.decode(a.subarray(b,d));for(e="";b<d;){var f=a[b++];if(f&128){var g=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var l=a[b++]&63;f=224==(f&240)?(f&15)<<12|g<<6|l:(f&7)<<18|g<<12|l<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e}
|
||||
function ma(a,b,d){var e=I;if(0<d){d=b+d-1;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=d)break;e[b++]=g}else{if(2047>=g){if(b+1>=d)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=d)break;e[b++]=224|g>>12}else{if(b+3>=d)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var na="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0;
|
||||
function oa(a,b){var d=a>>1;for(var e=d+b/2;!(d>=e)&&J[d];)++d;d<<=1;if(32<d-a&&na)return na.decode(I.subarray(a,d));d=0;for(e="";;){var f=K[a+2*d>>1];if(0==f||d==b/2)return e;++d;e+=String.fromCharCode(f)}}function pa(a,b,d){void 0===d&&(d=2147483647);if(2>d)return 0;d-=2;var e=b;d=d<2*a.length?d/2:a.length;for(var f=0;f<d;++f)K[b>>1]=a.charCodeAt(f),b+=2;K[b>>1]=0;return b-e}function qa(a){return 2*a.length}
|
||||
function ra(a,b){for(var d=0,e="";!(d>=b/4);){var f=L[a+4*d>>2];if(0==f)break;++d;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function sa(a,b,d){void 0===d&&(d=2147483647);if(4>d)return 0;var e=b;d=e+d-4;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}L[b>>2]=g;b+=4;if(b+4>d)break}L[b>>2]=0;return b-e}
|
||||
function ta(a){for(var b=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);55296<=e&&57343>=e&&++d;b+=4}return b}var M,ua,I,K,J,L,N,va,wa;function xa(a){M=a;c.HEAP8=ua=new Int8Array(a);c.HEAP16=K=new Int16Array(a);c.HEAP32=L=new Int32Array(a);c.HEAPU8=I=new Uint8Array(a);c.HEAPU16=J=new Uint16Array(a);c.HEAPU32=N=new Uint32Array(a);c.HEAPF32=va=new Float32Array(a);c.HEAPF64=wa=new Float64Array(a)}var ya=c.INITIAL_MEMORY||16777216;c.wasmMemory?F=c.wasmMemory:F=new WebAssembly.Memory({initial:ya/65536,maximum:32768});
|
||||
F&&(M=F.buffer);ya=M.byteLength;xa(M);L[35016]=5383104;function za(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b(c);else{var d=b.pa;"number"===typeof d?void 0===b.ja?c.dynCall_v(d):c.dynCall_vi(d,b.ja):d(void 0===b.ja?null:b.ja)}}}var Aa=[],Ba=[],Ca=[],Da=[];function Ea(){var a=c.preRun.shift();Aa.unshift(a)}var Fa=Math.ceil,Ga=Math.floor,O=0,Ha=null,P=null;c.preloadedImages={};c.preloadedAudios={};
|
||||
function C(a){if(c.onAbort)c.onAbort(a);D(a);ka=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s ASSERTIONS=1 for more info.");ba(a);throw a;}function Ia(a){var b=Q;return String.prototype.startsWith?b.startsWith(a):0===b.indexOf(a)}function Ja(){return Ia("data:application/octet-stream;base64,")}var Q="wp2_enc.wasm";if(!Ja()){var Ka=Q;Q=c.locateFile?c.locateFile(Ka,w):w+Ka}
|
||||
function La(){try{if(E)return new Uint8Array(E);if(B)return B(Q);throw"both async and sync fetching of the wasm failed";}catch(a){C(a)}}function Ma(){return E||!u&&!v||"function"!==typeof fetch||Ia("file://")?new Promise(function(a){a(La())}):fetch(Q,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+Q+"'";return a.arrayBuffer()}).catch(function(){return La()})}Ba.push({pa:function(){Na()}});function Oa(){return 0<Oa.ma}var Pa={};
|
||||
function Qa(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function Ra(a){return this.fromWireType(N[a>>2])}var R={},S={},Sa={};function Ta(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function Ua(a,b){a=Ta(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}
|
||||
function Va(a){var b=Error,d=Ua(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});d.prototype=Object.create(b.prototype);d.prototype.constructor=d;d.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return d}var Wa=void 0;
|
||||
function Xa(a,b,d){function e(k){k=d(k);if(k.length!==a.length)throw new Wa("Mismatched type converter count");for(var h=0;h<a.length;++h)T(a[h],k[h])}a.forEach(function(k){Sa[k]=b});var f=Array(b.length),g=[],l=0;b.forEach(function(k,h){S.hasOwnProperty(k)?f[h]=S[k]:(g.push(k),R.hasOwnProperty(k)||(R[k]=[]),R[k].push(function(){f[h]=S[k];++l;l===g.length&&e(f)}))});0===g.length&&e(f)}
|
||||
function Ya(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var Za=void 0;function U(a){for(var b="";I[a];)b+=Za[I[a++]];return b}var $a=void 0;function V(a){throw new $a(a);}
|
||||
function T(a,b,d){d=d||{};if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var e=b.name;a||V('type "'+e+'" must have a positive integer typeid pointer');if(S.hasOwnProperty(a)){if(d.ta)return;V("Cannot register type '"+e+"' twice")}S[a]=b;delete Sa[a];R.hasOwnProperty(a)&&(b=R[a],delete R[a],b.forEach(function(f){f()}))}var ab=[],X=[{},{value:void 0},{value:null},{value:!0},{value:!1}];
|
||||
function bb(a){4<a&&0===--X[a].ka&&(X[a]=void 0,ab.push(a))}function cb(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=ab.length?ab.pop():X.length;X[b]={ka:1,value:a};return b}}function db(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}
|
||||
function eb(a,b){switch(b){case 2:return function(d){return this.fromWireType(va[d>>2])};case 3:return function(d){return this.fromWireType(wa[d>>3])};default:throw new TypeError("Unknown float type: "+a);}}function fb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var d=Ua(b.name||"unknownFunctionName",function(){});d.prototype=b.prototype;d=new d;a=b.apply(d,a);return a instanceof Object?a:d}
|
||||
function gb(a,b){var d=c;if(void 0===d[a].ha){var e=d[a];d[a]=function(){d[a].ha.hasOwnProperty(arguments.length)||V("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+d[a].ha+")!");return d[a].ha[arguments.length].apply(this,arguments)};d[a].ha=[];d[a].ha[e.na]=e}}
|
||||
function hb(a,b,d){c.hasOwnProperty(a)?((void 0===d||void 0!==c[a].ha&&void 0!==c[a].ha[d])&&V("Cannot register public name '"+a+"' twice"),gb(a,a),c.hasOwnProperty(d)&&V("Cannot register multiple overloads of a function with the same number of arguments ("+d+")!"),c[a].ha[d]=b):(c[a]=b,void 0!==d&&(c[a].Aa=d))}function ib(a,b){for(var d=[],e=0;e<a;e++)d.push(L[(b>>2)+e]);return d}
|
||||
function Y(a,b){a=U(a);var d=c["dynCall_"+a];for(var e=[],f=1;f<a.length;++f)e.push("a"+f);f="return function dynCall_"+(a+"_"+b)+"("+e.join(", ")+") {\n";f+=" return dynCall(rawFunction"+(e.length?", ":"")+e.join(", ")+");\n";d=(new Function("dynCall","rawFunction",f+"};\n"))(d,b);"function"!==typeof d&&V("unknown function pointer with signature "+a+": "+b);return d}var jb=void 0;function kb(a){a=lb(a);var b=U(a);Z(a);return b}
|
||||
function mb(a,b){function d(g){f[g]||S[g]||(Sa[g]?Sa[g].forEach(d):(e.push(g),f[g]=!0))}var e=[],f={};b.forEach(d);throw new jb(a+": "+e.map(kb).join([", "]));}function nb(a,b,d){switch(b){case 0:return d?function(e){return ua[e]}:function(e){return I[e]};case 1:return d?function(e){return K[e>>1]}:function(e){return J[e>>1]};case 2:return d?function(e){return L[e>>2]}:function(e){return N[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var ob={};
|
||||
function pb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function qb(a,b){var d=S[a];void 0===d&&V(b+" has unknown type "+kb(a));return d}var rb={},sb=[null,[],[]];Wa=c.InternalError=Va("InternalError");for(var tb=Array(256),ub=0;256>ub;++ub)tb[ub]=String.fromCharCode(ub);Za=tb;$a=c.BindingError=Va("BindingError");c.count_emval_handles=function(){for(var a=0,b=5;b<X.length;++b)void 0!==X[b]&&++a;return a};
|
||||
c.get_first_emval=function(){for(var a=5;a<X.length;++a)if(void 0!==X[a])return X[a];return null};jb=c.UnboundTypeError=Va("UnboundTypeError");
|
||||
var wb={q:function(a,b,d,e){C("Assertion failed: "+(a?H(I,a,void 0):"")+", at: "+[b?b?H(I,b,void 0):"":"unknown filename",d,e?e?H(I,e,void 0):"":"unknown function"])},B:function(a){return vb(a)},H:function(){},A:function(a){"uncaught_exception"in Oa?Oa.ma++:Oa.ma=1;throw a;},p:function(a){var b=Pa[a];delete Pa[a];var d=b.ua,e=b.va,f=b.la,g=f.map(function(l){return l.sa}).concat(f.map(function(l){return l.xa}));Xa([a],g,function(l){var k={};f.forEach(function(h,m){var n=l[m],q=h.qa,x=h.ra,z=l[m+f.length],
|
||||
p=h.wa,ja=h.ya;k[h.oa]={read:function(A){return n.fromWireType(q(x,A))},write:function(A,G){var W=[];p(ja,A,z.toWireType(W,G));Qa(W)}}});return[{name:b.name,fromWireType:function(h){var m={},n;for(n in k)m[n]=k[n].read(h);e(h);return m},toWireType:function(h,m){for(var n in k)if(!(n in m))throw new TypeError('Missing field: "'+n+'"');var q=d();for(n in k)k[n].write(q,m[n]);null!==h&&h.push(e,q);return q},argPackAdvance:8,readValueFromPointer:Ra,ia:e}]})},y:function(a,b,d,e,f){var g=Ya(d);b=U(b);
|
||||
T(a,{name:b,fromWireType:function(l){return!!l},toWireType:function(l,k){return k?e:f},argPackAdvance:8,readValueFromPointer:function(l){if(1===d)var k=ua;else if(2===d)k=K;else if(4===d)k=L;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(k[l>>g])},ia:null})},x:function(a,b){b=U(b);T(a,{name:b,fromWireType:function(d){var e=X[d].value;bb(d);return e},toWireType:function(d,e){return cb(e)},argPackAdvance:8,readValueFromPointer:Ra,ia:null})},j:function(a,b,d){d=Ya(d);
|
||||
b=U(b);T(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+db(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:eb(b,d),ia:null})},o:function(a,b,d,e,f,g){var l=ib(b,d);a=U(a);f=Y(e,f);hb(a,function(){mb("Cannot call "+a+" due to unbound types",l)},b-1);Xa([],l,function(k){var h=[k[0],null].concat(k.slice(1)),m=k=a,n=f,q=h.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");
|
||||
for(var x=null!==h[1]&&!1,z=!1,p=1;p<h.length;++p)if(null!==h[p]&&void 0===h[p].ia){z=!0;break}var ja="void"!==h[0].name,A="",G="";for(p=0;p<q-2;++p)A+=(0!==p?", ":"")+"arg"+p,G+=(0!==p?", ":"")+"arg"+p+"Wired";m="return function "+Ta(m)+"("+A+") {\nif (arguments.length !== "+(q-2)+") {\nthrowBindingError('function "+m+" called with ' + arguments.length + ' arguments, expected "+(q-2)+" args!');\n}\n";z&&(m+="var destructors = [];\n");var W=z?"destructors":"null";A="throwBindingError invoker fn runDestructors retType classParam".split(" ");
|
||||
n=[V,n,g,Qa,h[0],h[1]];x&&(m+="var thisWired = classParam.toWireType("+W+", this);\n");for(p=0;p<q-2;++p)m+="var arg"+p+"Wired = argType"+p+".toWireType("+W+", arg"+p+"); // "+h[p+2].name+"\n",A.push("argType"+p),n.push(h[p+2]);x&&(G="thisWired"+(0<G.length?", ":"")+G);m+=(ja?"var rv = ":"")+"invoker(fn"+(0<G.length?", ":"")+G+");\n";if(z)m+="runDestructors(destructors);\n";else for(p=x?1:2;p<h.length;++p)q=1===p?"thisWired":"arg"+(p-2)+"Wired",null!==h[p].ia&&(m+=q+"_dtor("+q+"); // "+h[p].name+
|
||||
"\n",A.push(q+"_dtor"),n.push(h[p].ia));ja&&(m+="var ret = retType.fromWireType(rv);\nreturn ret;\n");A.push(m+"}\n");h=fb(A).apply(null,n);p=b-1;if(!c.hasOwnProperty(k))throw new Wa("Replacing nonexistant public symbol");void 0!==c[k].ha&&void 0!==p?c[k].ha[p]=h:(c[k]=h,c[k].na=p);return[]})},b:function(a,b,d,e,f){function g(m){return m}b=U(b);-1===f&&(f=4294967295);var l=Ya(d);if(0===e){var k=32-8*d;g=function(m){return m<<k>>>k}}var h=-1!=b.indexOf("unsigned");T(a,{name:b,fromWireType:g,toWireType:function(m,
|
||||
n){if("number"!==typeof n&&"boolean"!==typeof n)throw new TypeError('Cannot convert "'+db(n)+'" to '+this.name);if(n<e||n>f)throw new TypeError('Passing a number "'+db(n)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?n>>>0:n|0},argPackAdvance:8,readValueFromPointer:nb(b,l,0!==e),ia:null})},a:function(a,b,d){function e(g){g>>=2;var l=N;return new f(M,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,
|
||||
Uint32Array,Float32Array,Float64Array][b];d=U(d);T(a,{name:d,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{ta:!0})},l:function(a,b){b=U(b);var d="std::string"===b;T(a,{name:b,fromWireType:function(e){var f=N[e>>2];if(d)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==I[k]){g=g?H(I,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;g=k+1}}else{h=Array(f);for(l=0;l<f;++l)h[l]=String.fromCharCode(I[e+4+l]);h=h.join("")}Z(e);return h},toWireType:function(e,f){f instanceof
|
||||
ArrayBuffer&&(f=new Uint8Array(f));var g="string"===typeof f;g||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array||V("Cannot pass non-string to std::string");var l=(d&&g?function(){for(var m=0,n=0;n<f.length;++n){var q=f.charCodeAt(n);55296<=q&&57343>=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++n)&1023);127>=q?++m:m=2047>=q?m+2:65535>=q?m+3:m+4}return m}:function(){return f.length})(),k=vb(4+l+1);N[k>>2]=l;if(d&&g)ma(f,k+4,l+1);else if(g)for(g=0;g<l;++g){var h=f.charCodeAt(g);
|
||||
255<h&&(Z(k),V("String has UTF-16 code units that do not fit in 8 bits"));I[k+4+g]=h}else for(g=0;g<l;++g)I[k+4+g]=f[g];null!==e&&e.push(Z,k);return k},argPackAdvance:8,readValueFromPointer:Ra,ia:function(e){Z(e)}})},f:function(a,b,d){d=U(d);if(2===b){var e=oa;var f=pa;var g=qa;var l=function(){return J};var k=1}else 4===b&&(e=ra,f=sa,g=ta,l=function(){return N},k=2);T(a,{name:d,fromWireType:function(h){for(var m=N[h>>2],n=l(),q,x=h+4,z=0;z<=m;++z){var p=h+4+z*b;if(z==m||0==n[p>>k])x=e(x,p-x),void 0===
|
||||
q?q=x:(q+=String.fromCharCode(0),q+=x),x=p+b}Z(h);return q},toWireType:function(h,m){"string"!==typeof m&&V("Cannot pass non-string to C++ string type "+d);var n=g(m),q=vb(4+n+b);N[q>>2]=n>>k;f(m,q+4,n+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Ra,ia:function(h){Z(h)}})},r:function(a,b,d,e,f,g){Pa[a]={name:U(b),ua:Y(d,e),va:Y(f,g),la:[]}},e:function(a,b,d,e,f,g,l,k,h,m){Pa[a].la.push({oa:U(b),sa:d,qa:Y(e,f),ra:g,xa:l,wa:Y(k,h),ya:m})},z:function(a,b){b=U(b);T(a,{za:!0,
|
||||
name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},k:bb,G:function(a){if(0===a)return cb(pb());var b=ob[a];a=void 0===b?U(a):b;return cb(pb()[a])},n:function(a){4<a&&(X[a].ka+=1)},u:function(a,b,d,e){a||V("Cannot use deleted val. handle = "+a);a=X[a].value;var f=rb[b];if(!f){f="";for(var g=0;g<b;++g)f+=(0!==g?", ":"")+"arg"+g;var l="return function emval_allocator_"+b+"(constructor, argTypes, args) {\n";for(g=0;g<b;++g)l+="var argType"+g+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+
|
||||
g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(qb,c,cb);rb[b]=f}return f(a,d,e)},h:function(){C()},v:function(a,b,d){I.copyWithin(a,b,b+d)},d:function(a){a>>>=0;var b=I.length;if(2147483648<a)return!1;for(var d=1;4>=d;d*=2){var e=b*(1+.2/d);e=Math.min(e,a+100663296);e=Math.max(16777216,
|
||||
a,e);0<e%65536&&(e+=65536-e%65536);a:{try{F.grow(Math.min(2147483648,e)-M.byteLength+65535>>>16);xa(F.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},w:function(){return 0},s:function(){},i:function(a,b,d,e){for(var f=0,g=0;g<d;g++){for(var l=L[b+8*g>>2],k=L[b+(8*g+4)>>2],h=0;h<k;h++){var m=I[l+h],n=sb[a];0===m||10===m?((1===a?ha:D)(H(n,0)),n.length=0):n.push(m)}f+=k}L[e>>2]=f;return 0},memory:F,m:function(){return 0},F:function(){return 0},E:function(){},D:function(){return 6},
|
||||
C:function(){},g:function(a){a=+a;return 0<=a?+Ga(a+.5):+Fa(a-.5)},c:function(a){a=+a;return 0<=a?+Ga(a+.5):+Fa(a-.5)},t:function(){},table:ia};
|
||||
(function(){function a(f){c.asm=f.exports;O--;c.monitorRunDependencies&&c.monitorRunDependencies(O);0==O&&(null!==Ha&&(clearInterval(Ha),Ha=null),P&&(f=P,P=null,f()))}function b(f){a(f.instance)}function d(f){return Ma().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){D("failed to asynchronously prepare wasm: "+g);C(g)})}var e={a:wb};O++;c.monitorRunDependencies&&c.monitorRunDependencies(O);if(c.instantiateWasm)try{return c.instantiateWasm(e,a)}catch(f){return D("Module.instantiateWasm callback failed with error: "+
|
||||
f),!1}(function(){if(E||"function"!==typeof WebAssembly.instantiateStreaming||Ja()||Ia("file://")||"function"!==typeof fetch)return d(b);fetch(Q,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){D("wasm streaming compile failed: "+g);D("falling back to ArrayBuffer instantiation");return d(b)})})})();return{}})();
|
||||
var Na=c.___wasm_call_ctors=function(){return(Na=c.___wasm_call_ctors=c.asm.I).apply(null,arguments)},vb=c._malloc=function(){return(vb=c._malloc=c.asm.J).apply(null,arguments)},Z=c._free=function(){return(Z=c._free=c.asm.K).apply(null,arguments)},lb=c.___getTypeName=function(){return(lb=c.___getTypeName=c.asm.L).apply(null,arguments)};c.___embind_register_native_and_builtin_types=function(){return(c.___embind_register_native_and_builtin_types=c.asm.M).apply(null,arguments)};
|
||||
c.dynCall_i=function(){return(c.dynCall_i=c.asm.N).apply(null,arguments)};c.dynCall_vi=function(){return(c.dynCall_vi=c.asm.O).apply(null,arguments)};c.dynCall_fii=function(){return(c.dynCall_fii=c.asm.P).apply(null,arguments)};c.dynCall_viif=function(){return(c.dynCall_viif=c.asm.Q).apply(null,arguments)};c.dynCall_iii=function(){return(c.dynCall_iii=c.asm.R).apply(null,arguments)};c.dynCall_viii=function(){return(c.dynCall_viii=c.asm.S).apply(null,arguments)};
|
||||
c.dynCall_iiiiii=function(){return(c.dynCall_iiiiii=c.asm.T).apply(null,arguments)};c.dynCall_viiiii=function(){return(c.dynCall_viiiii=c.asm.U).apply(null,arguments)};c.dynCall_vii=function(){return(c.dynCall_vii=c.asm.V).apply(null,arguments)};c.dynCall_viiiiiii=function(){return(c.dynCall_viiiiiii=c.asm.W).apply(null,arguments)};c.dynCall_viiiiiiiii=function(){return(c.dynCall_viiiiiiiii=c.asm.X).apply(null,arguments)};c.dynCall_ii=function(){return(c.dynCall_ii=c.asm.Y).apply(null,arguments)};
|
||||
c.dynCall_viiiiiiii=function(){return(c.dynCall_viiiiiiii=c.asm.Z).apply(null,arguments)};c.dynCall_viiii=function(){return(c.dynCall_viiii=c.asm._).apply(null,arguments)};c.dynCall_viiiiii=function(){return(c.dynCall_viiiiii=c.asm.$).apply(null,arguments)};c.dynCall_iidiiii=function(){return(c.dynCall_iidiiii=c.asm.aa).apply(null,arguments)};c.dynCall_iiiii=function(){return(c.dynCall_iiiii=c.asm.ba).apply(null,arguments)};c.dynCall_v=function(){return(c.dynCall_v=c.asm.ca).apply(null,arguments)};
|
||||
c.dynCall_fi=function(){return(c.dynCall_fi=c.asm.da).apply(null,arguments)};c.dynCall_iiii=function(){return(c.dynCall_iiii=c.asm.ea).apply(null,arguments)};c.dynCall_iiiiiiiiii=function(){return(c.dynCall_iiiiiiiiii=c.asm.fa).apply(null,arguments)};c.dynCall_jiji=function(){return(c.dynCall_jiji=c.asm.ga).apply(null,arguments)};var xb;P=function yb(){xb||zb();xb||(P=yb)};
|
||||
function zb(){function a(){if(!xb&&(xb=!0,c.calledRun=!0,!ka)){za(Ba);za(Ca);aa(c);if(c.onRuntimeInitialized)c.onRuntimeInitialized();if(c.postRun)for("function"==typeof c.postRun&&(c.postRun=[c.postRun]);c.postRun.length;){var b=c.postRun.shift();Da.unshift(b)}za(Da)}}if(!(0<O)){if(c.preRun)for("function"==typeof c.preRun&&(c.preRun=[c.preRun]);c.preRun.length;)Ea();za(Aa);0<O||(c.setStatus?(c.setStatus("Running..."),setTimeout(function(){setTimeout(function(){c.setStatus("")},1);a()},1)):a())}}
|
||||
c.run=zb;if(c.preInit)for("function"==typeof c.preInit&&(c.preInit=[c.preInit]);0<c.preInit.length;)c.preInit.pop()();noExitRuntime=!0;zb();
|
||||
|
||||
|
||||
return wp2_enc.ready
|
||||
}
|
||||
);
|
||||
})();
|
||||
if (typeof exports === 'object' && typeof module === 'object')
|
||||
module.exports = wp2_enc;
|
||||
else if (typeof define === 'function' && define['amd'])
|
||||
define([], function() { return wp2_enc; });
|
||||
else if (typeof exports === 'object')
|
||||
exports["wp2_enc"] = wp2_enc;
|
||||
|
BIN
codecs/wp2/enc/wp2_enc.wasm
Normal file
BIN
codecs/wp2/enc/wp2_enc.wasm
Normal file
Binary file not shown.
6
codecs/wp2/package.json
Normal file
6
codecs/wp2/package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "wp2",
|
||||
"scripts": {
|
||||
"build": "../build-cpp.sh"
|
||||
}
|
||||
}
|
@ -1,18 +1,24 @@
|
||||
import { builtinDecode, sniffMimeType, canDecodeImageType } from '../lib/util';
|
||||
import Processor from './processor';
|
||||
|
||||
export async function decodeImage(blob: Blob, processor: Processor): Promise<ImageData> {
|
||||
export async function decodeImage(
|
||||
blob: Blob,
|
||||
processor: Processor,
|
||||
): Promise<ImageData> {
|
||||
const mimeType = await sniffMimeType(blob);
|
||||
const canDecode = await canDecodeImageType(mimeType);
|
||||
|
||||
try {
|
||||
if (!canDecode) {
|
||||
if (mimeType === 'image/webp2') return await processor.wp2Decode(blob);
|
||||
if (mimeType === 'image/avif') return await processor.avifDecode(blob);
|
||||
if (mimeType === 'image/webp') return await processor.webpDecode(blob);
|
||||
if (mimeType === 'image/jpegxl') return await processor.jxlDecode(blob);
|
||||
// If it's not one of those types, fall through and try built-in decoding for a laugh.
|
||||
}
|
||||
return await builtinDecode(blob);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
throw Error("Couldn't decode image");
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,9 @@ import * as identity from './identity/encoder-meta';
|
||||
import * as oxiPNG from './oxipng/encoder-meta';
|
||||
import * as mozJPEG from './mozjpeg/encoder-meta';
|
||||
import * as webP from './webp/encoder-meta';
|
||||
import * as wp2 from './wp2/encoder-meta';
|
||||
import * as avif from './avif/encoder-meta';
|
||||
import * as jxl from './jxl/encoder-meta';
|
||||
import * as browserPNG from './browser-png/encoder-meta';
|
||||
import * as browserJPEG from './browser-jpeg/encoder-meta';
|
||||
import * as browserWebP from './browser-webp/encoder-meta';
|
||||
@ -21,7 +23,9 @@ export type EncoderState =
|
||||
oxiPNG.EncoderState |
|
||||
mozJPEG.EncoderState |
|
||||
webP.EncoderState |
|
||||
wp2.EncoderState |
|
||||
avif.EncoderState |
|
||||
jxl.EncoderState |
|
||||
browserPNG.EncoderState |
|
||||
browserJPEG.EncoderState |
|
||||
browserWebP.EncoderState |
|
||||
@ -36,7 +40,9 @@ export type EncoderOptions =
|
||||
oxiPNG.EncodeOptions |
|
||||
mozJPEG.EncodeOptions |
|
||||
webP.EncodeOptions |
|
||||
wp2.EncodeOptions |
|
||||
avif.EncodeOptions |
|
||||
jxl.EncodeOptions |
|
||||
browserPNG.EncodeOptions |
|
||||
browserJPEG.EncodeOptions |
|
||||
browserWebP.EncodeOptions |
|
||||
@ -53,7 +59,9 @@ export const encoderMap = {
|
||||
[oxiPNG.type]: oxiPNG,
|
||||
[mozJPEG.type]: mozJPEG,
|
||||
[webP.type]: webP,
|
||||
[wp2.type]: wp2,
|
||||
[avif.type]: avif,
|
||||
[jxl.type]: jxl,
|
||||
[browserPNG.type]: browserPNG,
|
||||
[browserJPEG.type]: browserJPEG,
|
||||
[browserWebP.type]: browserWebP,
|
||||
|
7
src/codecs/jxl/decoder-meta.ts
Normal file
7
src/codecs/jxl/decoder-meta.ts
Normal file
@ -0,0 +1,7 @@
|
||||
export const name = 'WASM JPEG XL Decoder';
|
||||
|
||||
const supportedMimeTypes = ['image/jpegxl'];
|
||||
|
||||
export function canHandleMimeType(mimeType: string): boolean {
|
||||
return supportedMimeTypes.includes(mimeType);
|
||||
}
|
16
src/codecs/jxl/decoder.ts
Normal file
16
src/codecs/jxl/decoder.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import jxl_dec, { JXLModule } from '../../../codecs/jxl/dec/jxl_dec';
|
||||
import wasmUrl from '../../../codecs/jxl/dec/jxl_dec.wasm';
|
||||
import { initEmscriptenModule } from '../util';
|
||||
|
||||
let emscriptenModule: Promise<JXLModule>;
|
||||
|
||||
export async function decode(data: ArrayBuffer): Promise<ImageData> {
|
||||
if (!emscriptenModule) emscriptenModule = initEmscriptenModule(jxl_dec, wasmUrl);
|
||||
|
||||
const module = await emscriptenModule;
|
||||
const result = module.decode(data);
|
||||
if (!result) {
|
||||
throw new Error('Decoding error');
|
||||
}
|
||||
return result;
|
||||
}
|
16
src/codecs/jxl/encoder-meta.ts
Normal file
16
src/codecs/jxl/encoder-meta.ts
Normal file
@ -0,0 +1,16 @@
|
||||
export interface EncodeOptions {
|
||||
speed: number;
|
||||
quality: number;
|
||||
}
|
||||
|
||||
export interface EncoderState { type: typeof type; options: EncodeOptions; }
|
||||
|
||||
export const type = 'jxl';
|
||||
export const label = 'JPEG XL (beta)';
|
||||
export const mimeType = 'image/jpegxl';
|
||||
export const extension = 'jxl';
|
||||
// These come from struct WebPConfig in encode.h.
|
||||
export const defaultOptions: EncodeOptions = {
|
||||
speed: 5,
|
||||
quality: 1,
|
||||
};
|
19
src/codecs/jxl/encoder.ts
Normal file
19
src/codecs/jxl/encoder.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import jxl_enc, { JXLModule } from '../../../codecs/jxl/enc/jxl_enc';
|
||||
import wasmUrl from '../../../codecs/jxl/enc/jxl_enc.wasm';
|
||||
import { EncodeOptions } from './encoder-meta';
|
||||
import { initEmscriptenModule } from '../util';
|
||||
|
||||
let emscriptenModule: Promise<JXLModule>;
|
||||
|
||||
export async function encode(data: ImageData, options: EncodeOptions): Promise<ArrayBuffer> {
|
||||
if (!emscriptenModule) emscriptenModule = initEmscriptenModule(jxl_enc, wasmUrl);
|
||||
|
||||
const module = await emscriptenModule;
|
||||
const result = module.encode(data.data, data.width, data.height, options);
|
||||
if (!result) {
|
||||
throw new Error('Encoding error');
|
||||
}
|
||||
|
||||
// wasm can’t run on SharedArrayBuffers, so we hard-cast to ArrayBuffer.
|
||||
return result.buffer as ArrayBuffer;
|
||||
}
|
65
src/codecs/jxl/options.tsx
Normal file
65
src/codecs/jxl/options.tsx
Normal file
@ -0,0 +1,65 @@
|
||||
import { h, Component } from 'preact';
|
||||
import { bind } from '../../lib/initial-util';
|
||||
import { inputFieldValueAsNumber, preventDefault } from '../../lib/util';
|
||||
import { EncodeOptions } from './encoder-meta';
|
||||
import * as style from '../../components/Options/style.scss';
|
||||
// import Checkbox from '../../components/checkbox';
|
||||
// import Expander from '../../components/expander';
|
||||
// import Select from '../../components/select';
|
||||
import Range from '../../components/range';
|
||||
// import linkState from 'linkstate';
|
||||
|
||||
interface Props {
|
||||
options: EncodeOptions;
|
||||
onChange(newOptions: EncodeOptions): void;
|
||||
}
|
||||
|
||||
interface State {}
|
||||
|
||||
export default class JXLEncoderOptions extends Component<Props, State> {
|
||||
state: State = {};
|
||||
|
||||
@bind
|
||||
onChange(event: Event) {
|
||||
const form = (event.currentTarget as HTMLInputElement).closest(
|
||||
'form',
|
||||
) as HTMLFormElement;
|
||||
const { options } = this.props;
|
||||
|
||||
const newOptions: EncodeOptions = {
|
||||
// Copy over options the form doesn't care about, eg emulate_jpeg_size
|
||||
...options,
|
||||
speed: inputFieldValueAsNumber(form.speed, options.speed),
|
||||
quality: inputFieldValueAsNumber(form.quality, options.quality),
|
||||
};
|
||||
this.props.onChange(newOptions);
|
||||
}
|
||||
|
||||
render({ options }: Props) {
|
||||
return (
|
||||
<form class={style.optionsSection} onSubmit={preventDefault}>
|
||||
<div class={style.optionOneCell}>
|
||||
<Range
|
||||
name="speed"
|
||||
min="1"
|
||||
max="7"
|
||||
value={options.speed}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Speed:
|
||||
</Range>
|
||||
<Range
|
||||
name="quality"
|
||||
min="0.5"
|
||||
max="8"
|
||||
step="0.1"
|
||||
value={options.quality}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Quality:
|
||||
</Range>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
}
|
||||
}
|
@ -82,6 +82,22 @@ async function webpDecode(data: ArrayBuffer): Promise<ImageData> {
|
||||
return timed('webpDecode', () => decode(data));
|
||||
}
|
||||
|
||||
async function wp2Encode(
|
||||
data: ImageData, options: import('../wp2/encoder-meta').EncodeOptions,
|
||||
): Promise<ArrayBuffer> {
|
||||
const { encode } = await import(
|
||||
/* webpackChunkName: "process-wp2-enc" */
|
||||
'../wp2/encoder');
|
||||
return timed('wp2Encode', () => encode(data, options));
|
||||
}
|
||||
|
||||
async function wp2Decode(data: ArrayBuffer): Promise<ImageData> {
|
||||
const { decode } = await import(
|
||||
/* webpackChunkName: "process-wp2-dec" */
|
||||
'../wp2/decoder');
|
||||
return timed('wp2Decode', () => decode(data));
|
||||
}
|
||||
|
||||
async function avifEncode(
|
||||
data: ImageData, options: import('../avif/encoder-meta').EncodeOptions,
|
||||
): Promise<ArrayBuffer> {
|
||||
@ -98,6 +114,22 @@ async function avifDecode(data: ArrayBuffer): Promise<ImageData> {
|
||||
return timed('avifDencode', () => decode(data));
|
||||
}
|
||||
|
||||
async function jxlEncode(
|
||||
data: ImageData, options: import('../jxl/encoder-meta').EncodeOptions,
|
||||
): Promise<ArrayBuffer> {
|
||||
const { encode } = await import(
|
||||
/* webpackChunkName: "process-jxl-enc" */
|
||||
'../jxl/encoder');
|
||||
return timed('jxlEncode', () => encode(data, options));
|
||||
}
|
||||
|
||||
async function jxlDecode(data: ArrayBuffer): Promise<ImageData> {
|
||||
const { decode } = await import(
|
||||
/* webpackChunkName: "process-jxl-dec" */
|
||||
'../jxl/decoder');
|
||||
return timed('jxlDecode', () => decode(data));
|
||||
}
|
||||
|
||||
const exports = {
|
||||
mozjpegEncode,
|
||||
quantize,
|
||||
@ -106,8 +138,12 @@ const exports = {
|
||||
oxiPngEncode,
|
||||
webpEncode,
|
||||
webpDecode,
|
||||
wp2Encode,
|
||||
wp2Decode,
|
||||
avifEncode,
|
||||
avifDecode,
|
||||
jxlEncode,
|
||||
jxlDecode,
|
||||
};
|
||||
export type ProcessorWorkerApi = typeof exports;
|
||||
|
||||
|
@ -4,7 +4,9 @@ import { canvasEncode, blobToArrayBuffer } from '../lib/util';
|
||||
import { EncodeOptions as MozJPEGEncoderOptions } from './mozjpeg/encoder-meta';
|
||||
import { EncodeOptions as OxiPNGEncoderOptions } from './oxipng/encoder-meta';
|
||||
import { EncodeOptions as WebPEncoderOptions } from './webp/encoder-meta';
|
||||
import { EncodeOptions as WP2EncoderOptions } from './wp2/encoder-meta';
|
||||
import { EncodeOptions as AvifEncoderOptions } from './avif/encoder-meta';
|
||||
import { EncodeOptions as JXLEncoderOptions } from './jxl/encoder-meta';
|
||||
import { EncodeOptions as BrowserJPEGOptions } from './browser-jpeg/encoder-meta';
|
||||
import { EncodeOptions as BrowserWebpEncodeOptions } from './browser-webp/encoder-meta';
|
||||
import { BrowserResizeOptions, VectorResizeOptions } from './resize/processor-meta';
|
||||
@ -156,12 +158,23 @@ export default class Processor {
|
||||
return this._workerApi!.webpEncode(data, opts);
|
||||
}
|
||||
|
||||
@Processor._processingJob({ needsWorker: true })
|
||||
wp2Encode(data: ImageData, opts: WP2EncoderOptions): Promise<ArrayBuffer> {
|
||||
return this._workerApi!.wp2Encode(data, opts);
|
||||
}
|
||||
|
||||
@Processor._processingJob({ needsWorker: true })
|
||||
async webpDecode(blob: Blob): Promise<ImageData> {
|
||||
const data = await blobToArrayBuffer(blob);
|
||||
return this._workerApi!.webpDecode(data);
|
||||
}
|
||||
|
||||
@Processor._processingJob({ needsWorker: true })
|
||||
async wp2Decode(blob: Blob): Promise<ImageData> {
|
||||
const data = await blobToArrayBuffer(blob);
|
||||
return this._workerApi!.wp2Decode(data);
|
||||
}
|
||||
|
||||
@Processor._processingJob({ needsWorker: true })
|
||||
async avifDecode(blob: Blob): Promise<ImageData> {
|
||||
const data = await blobToArrayBuffer(blob);
|
||||
@ -173,6 +186,17 @@ export default class Processor {
|
||||
return this._workerApi!.avifEncode(data, opts);
|
||||
}
|
||||
|
||||
@Processor._processingJob({ needsWorker: true })
|
||||
jxlEncode(data: ImageData, opts: JXLEncoderOptions): Promise<ArrayBuffer> {
|
||||
return this._workerApi!.jxlEncode(data, opts);
|
||||
}
|
||||
|
||||
@Processor._processingJob({ needsWorker: true })
|
||||
async jxlDecode(blob: Blob): Promise<ImageData> {
|
||||
const data = await blobToArrayBuffer(blob);
|
||||
return this._workerApi!.jxlDecode(data);
|
||||
}
|
||||
|
||||
// Not-worker jobs:
|
||||
|
||||
@Processor._processingJob()
|
||||
|
7
src/codecs/wp2/decoder-meta.ts
Normal file
7
src/codecs/wp2/decoder-meta.ts
Normal file
@ -0,0 +1,7 @@
|
||||
export const name = 'WASM WP2 Decoder';
|
||||
|
||||
const supportedMimeTypes = ['image/webp2'];
|
||||
|
||||
export function canHandleMimeType(mimeType: string): boolean {
|
||||
return supportedMimeTypes.includes(mimeType);
|
||||
}
|
16
src/codecs/wp2/decoder.ts
Normal file
16
src/codecs/wp2/decoder.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import wp2_dec, { WP2Module } from '../../../codecs/wp2/dec/wp2_dec';
|
||||
import wasmUrl from '../../../codecs/wp2/dec/wp2_dec.wasm';
|
||||
import { initEmscriptenModule } from '../util';
|
||||
|
||||
let emscriptenModule: Promise<WP2Module>;
|
||||
|
||||
export async function decode(data: ArrayBuffer): Promise<ImageData> {
|
||||
if (!emscriptenModule) emscriptenModule = initEmscriptenModule(wp2_dec, wasmUrl);
|
||||
|
||||
const module = await emscriptenModule;
|
||||
const result = module.decode(data);
|
||||
if (!result) {
|
||||
throw new Error('Decoding error');
|
||||
}
|
||||
return result;
|
||||
}
|
20
src/codecs/wp2/encoder-meta.ts
Normal file
20
src/codecs/wp2/encoder-meta.ts
Normal file
@ -0,0 +1,20 @@
|
||||
export interface EncodeOptions {
|
||||
quality: number;
|
||||
alpha_quality: number;
|
||||
speed: number;
|
||||
pass: number;
|
||||
sns: number;
|
||||
}
|
||||
export interface EncoderState { type: typeof type; options: EncodeOptions; }
|
||||
|
||||
export const type = 'wp2';
|
||||
export const label = 'WebP 2 (unstable)';
|
||||
export const mimeType = 'image/webp2';
|
||||
export const extension = 'wp2';
|
||||
export const defaultOptions: EncodeOptions = {
|
||||
quality: 75,
|
||||
alpha_quality: 100,
|
||||
speed: 5,
|
||||
pass: 1,
|
||||
sns: 50,
|
||||
};
|
20
src/codecs/wp2/encoder.ts
Normal file
20
src/codecs/wp2/encoder.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import wp2_enc, { WP2Module } from '../../../codecs/wp2/enc/wp2_enc';
|
||||
import wasmUrl from '../../../codecs/wp2/enc/wp2_enc.wasm';
|
||||
import { EncodeOptions } from './encoder-meta';
|
||||
import { initEmscriptenModule } from '../util';
|
||||
|
||||
let emscriptenModule: Promise<WP2Module>;
|
||||
|
||||
export async function encode(data: ImageData, options: EncodeOptions): Promise<ArrayBuffer> {
|
||||
if (!emscriptenModule) emscriptenModule = initEmscriptenModule(wp2_enc, wasmUrl);
|
||||
|
||||
const module = await emscriptenModule;
|
||||
const result = module.encode(data.data, data.width, data.height, options);
|
||||
|
||||
if (!result) {
|
||||
throw new Error('Encoding error');
|
||||
}
|
||||
|
||||
// wasm can’t run on SharedArrayBuffers, so we hard-cast to ArrayBuffer.
|
||||
return result.buffer as ArrayBuffer;
|
||||
}
|
105
src/codecs/wp2/options.tsx
Normal file
105
src/codecs/wp2/options.tsx
Normal file
@ -0,0 +1,105 @@
|
||||
import { h, Component } from 'preact';
|
||||
import { bind } from '../../lib/initial-util';
|
||||
import { inputFieldValueAsNumber, preventDefault } from '../../lib/util';
|
||||
import { EncodeOptions } from './encoder-meta';
|
||||
import * as style from '../../components/Options/style.scss';
|
||||
import Range from '../../components/range';
|
||||
|
||||
interface Props {
|
||||
options: EncodeOptions;
|
||||
onChange(newOptions: EncodeOptions): void;
|
||||
}
|
||||
|
||||
interface State {
|
||||
showAdvanced: boolean;
|
||||
}
|
||||
|
||||
export default class WP2EncoderOptions extends Component<Props, State> {
|
||||
state: State = {
|
||||
showAdvanced: false,
|
||||
};
|
||||
|
||||
@bind
|
||||
onChange(event: Event) {
|
||||
const form = (event.currentTarget as HTMLInputElement).closest(
|
||||
'form',
|
||||
) as HTMLFormElement;
|
||||
const { options } = this.props;
|
||||
const newOptions: EncodeOptions = {
|
||||
quality: inputFieldValueAsNumber(form.quality, options.quality),
|
||||
alpha_quality: inputFieldValueAsNumber(form.alpha_quality, options.alpha_quality),
|
||||
speed: inputFieldValueAsNumber(form.speed, options.speed),
|
||||
pass: inputFieldValueAsNumber(form.pass, options.pass),
|
||||
sns: inputFieldValueAsNumber(form.sns, options.sns),
|
||||
|
||||
};
|
||||
this.props.onChange(newOptions);
|
||||
}
|
||||
|
||||
render({ options }: Props) {
|
||||
return (
|
||||
<form class={style.optionsSection} onSubmit={preventDefault}>
|
||||
<div class={style.optionOneCell}>
|
||||
<Range
|
||||
name="quality"
|
||||
min="0"
|
||||
max="100"
|
||||
step="1"
|
||||
value={options.quality}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Quality:
|
||||
</Range>
|
||||
</div>
|
||||
<div class={style.optionOneCell}>
|
||||
<Range
|
||||
name="alpha_quality"
|
||||
min="0"
|
||||
max="100"
|
||||
step="1"
|
||||
value={options.alpha_quality}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Alpha Quality:
|
||||
</Range>
|
||||
</div>
|
||||
<div class={style.optionOneCell}>
|
||||
<Range
|
||||
name="speed"
|
||||
min="0"
|
||||
max="9"
|
||||
step="1"
|
||||
value={options.speed}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Speed:
|
||||
</Range>
|
||||
</div>
|
||||
<div class={style.optionOneCell}>
|
||||
<Range
|
||||
name="pass"
|
||||
min="1"
|
||||
max="10"
|
||||
step="1"
|
||||
value={options.pass}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Pass:
|
||||
</Range>
|
||||
</div>
|
||||
<div class={style.optionOneCell}>
|
||||
<Range
|
||||
name="sns"
|
||||
min="0"
|
||||
max="100"
|
||||
step="1"
|
||||
value={options.sns}
|
||||
onInput={this.onChange}
|
||||
>
|
||||
Spatial noise shaping:
|
||||
</Range>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
}
|
||||
}
|
@ -7,7 +7,9 @@ import OxiPNGEncoderOptions from '../../codecs/oxipng/options';
|
||||
import MozJpegEncoderOptions from '../../codecs/mozjpeg/options';
|
||||
import BrowserJPEGEncoderOptions from '../../codecs/browser-jpeg/options';
|
||||
import WebPEncoderOptions from '../../codecs/webp/options';
|
||||
import WP2EncoderOptions from '../../codecs/wp2/options';
|
||||
import AvifEncoderOptions from '../../codecs/avif/options';
|
||||
import JXLEncoderOptions from '../../codecs/jxl/options';
|
||||
import BrowserWebPEncoderOptions from '../../codecs/browser-webp/options';
|
||||
|
||||
import QuantizerOptionsComponent from '../../codecs/imagequant/options';
|
||||
@ -17,7 +19,9 @@ import * as identity from '../../codecs/identity/encoder-meta';
|
||||
import * as oxiPNG from '../../codecs/oxipng/encoder-meta';
|
||||
import * as mozJPEG from '../../codecs/mozjpeg/encoder-meta';
|
||||
import * as webP from '../../codecs/webp/encoder-meta';
|
||||
import * as wp2 from '../../codecs/wp2/encoder-meta';
|
||||
import * as avif from '../../codecs/avif/encoder-meta';
|
||||
import * as jxl from '../../codecs/jxl/encoder-meta';
|
||||
import * as browserPNG from '../../codecs/browser-png/encoder-meta';
|
||||
import * as browserJPEG from '../../codecs/browser-jpeg/encoder-meta';
|
||||
import * as browserWebP from '../../codecs/browser-webp/encoder-meta';
|
||||
@ -49,7 +53,9 @@ const encoderOptionsComponentMap: {
|
||||
[oxiPNG.type]: OxiPNGEncoderOptions,
|
||||
[mozJPEG.type]: MozJpegEncoderOptions,
|
||||
[webP.type]: WebPEncoderOptions,
|
||||
[wp2.type]: WP2EncoderOptions,
|
||||
[avif.type]: AvifEncoderOptions,
|
||||
[jxl.type]: JXLEncoderOptions,
|
||||
[browserPNG.type]: undefined,
|
||||
[browserJPEG.type]: BrowserJPEGEncoderOptions,
|
||||
[browserWebP.type]: BrowserWebPEncoderOptions,
|
||||
|
@ -10,7 +10,9 @@ import * as identity from '../../codecs/identity/encoder-meta';
|
||||
import * as oxiPNG from '../../codecs/oxipng/encoder-meta';
|
||||
import * as mozJPEG from '../../codecs/mozjpeg/encoder-meta';
|
||||
import * as webP from '../../codecs/webp/encoder-meta';
|
||||
import * as wp2 from '../../codecs/wp2/encoder-meta';
|
||||
import * as avif from '../../codecs/avif/encoder-meta';
|
||||
import * as jxl from '../../codecs/jxl/encoder-meta';
|
||||
import * as browserPNG from '../../codecs/browser-png/encoder-meta';
|
||||
import * as browserJPEG from '../../codecs/browser-jpeg/encoder-meta';
|
||||
import * as browserWebP from '../../codecs/browser-webp/encoder-meta';
|
||||
@ -137,7 +139,9 @@ async function compressImage(
|
||||
case oxiPNG.type: return processor.oxiPngEncode(image, encodeData.options);
|
||||
case mozJPEG.type: return processor.mozjpegEncode(image, encodeData.options);
|
||||
case webP.type: return processor.webpEncode(image, encodeData.options);
|
||||
case wp2.type: return processor.wp2Encode(image, encodeData.options);
|
||||
case avif.type: return processor.avifEncode(image, encodeData.options);
|
||||
case jxl.type: return processor.jxlEncode(image, encodeData.options);
|
||||
case browserPNG.type: return processor.browserPngEncode(image);
|
||||
case browserJPEG.type: return processor.browserJpegEncode(image, encodeData.options);
|
||||
case browserWebP.type: return processor.browserWebpEncode(image, encodeData.options);
|
||||
|
@ -129,7 +129,9 @@ const magicNumberToMimeType = new Map<RegExp, string>([
|
||||
[/^II*/, 'image/tiff'],
|
||||
[/^MM\x00*/, 'image/tiff'],
|
||||
[/^RIFF....WEBPVP8[LX ]/, 'image/webp'],
|
||||
[/^\xF4\xFF\x6F/, 'image/webp2'],
|
||||
[/^\x00\x00\x00 ftypavif\x00\x00\x00\x00/, 'image/avif'],
|
||||
[/^\xff\x0a/, 'image/jpegxl'],
|
||||
]);
|
||||
|
||||
export async function sniffMimeType(blob: Blob): Promise<string> {
|
||||
|
Reference in New Issue
Block a user