diff --git a/codecs/imagequant/imagequant.cpp b/codecs/imagequant/imagequant.cpp index bed1fd87..2150174c 100644 --- a/codecs/imagequant/imagequant.cpp +++ b/codecs/imagequant/imagequant.cpp @@ -16,37 +16,41 @@ int version() { const val Uint8ClampedArray = val::global("Uint8ClampedArray"); +#define liq_ptr(T) std::unique_ptr> + +using liq_attr_ptr = liq_ptr(liq_attr); +using liq_image_ptr = liq_ptr(liq_image); +using liq_result_ptr = liq_ptr(liq_result); + +liq_result_ptr liq_image_quantize(liq_image* image, liq_attr* attr) { + liq_result* res = nullptr; + liq_image_quantize(image, attr, &res); + return liq_result_ptr(res); +} + val quantize(std::string rawimage, int image_width, int image_height, int num_colors, float dithering) { - const uint8_t* image_buffer = (uint8_t*)rawimage.c_str(); + auto image_buffer = (const liq_color*)rawimage.c_str(); int size = image_width * image_height; - liq_attr* attr = liq_attr_create(); - liq_image* image = liq_image_create_rgba(attr, image_buffer, image_width, image_height, 0); - liq_set_max_colors(attr, num_colors); - liq_result* res = nullptr; - liq_image_quantize(image, attr, &res); - liq_set_dithering_level(res, dithering); - uint8_t* image8bit = (uint8_t*)malloc(size); - uint8_t* result = (uint8_t*)malloc(size * 4); - liq_write_remapped_image(res, image, image8bit, size); - const liq_palette* pal = liq_get_palette(res); + liq_attr_ptr attr(liq_attr_create()); + liq_image_ptr image( + liq_image_create_rgba(attr.get(), image_buffer, image_width, image_height, 0)); + liq_set_max_colors(attr.get(), num_colors); + auto res = liq_image_quantize(image.get(), attr.get()); + liq_set_dithering_level(res.get(), dithering); + std::vector image8bit(size); + std::vector result(size); + liq_write_remapped_image(res.get(), image.get(), image8bit.data(), image8bit.size()); + auto pal = liq_get_palette(res.get()); // Turn palletted image back into an RGBA image for (int i = 0; i < size; i++) { - result[i * 4 + 0] = pal->entries[image8bit[i]].r; - result[i * 4 + 1] = pal->entries[image8bit[i]].g; - result[i * 4 + 2] = pal->entries[image8bit[i]].b; - result[i * 4 + 3] = pal->entries[image8bit[i]].a; + result[i] = pal->entries[image8bit[i]]; } - free(image8bit); - liq_result_destroy(res); - liq_image_destroy(image); - liq_attr_destroy(attr); - val js_result = Uint8ClampedArray.new_(typed_memory_view(image_width * image_height * 4, result)); - free(result); - return js_result; + return Uint8ClampedArray.new_( + typed_memory_view(result.size() * sizeof(liq_color), (const uint8_t*)result.data())); } const liq_color zx_colors[] = { @@ -73,12 +77,11 @@ const liq_color zx_colors[] = { * and bright. */ val zx_quantize(std::string rawimage, int image_width, int image_height, float dithering) { - const uint8_t* image_buffer = (uint8_t*)rawimage.c_str(); + auto image_buffer = (const liq_color*)rawimage.c_str(); int size = image_width * image_height; - int bytes_per_pixel = 4; - uint8_t block[8 * 8 * bytes_per_pixel]; - uint8_t* result = (uint8_t*)malloc(size * bytes_per_pixel); - uint8_t* image8bit = (uint8_t*)malloc(8 * 8); + liq_color block[8 * 8]; + uint8_t image8bit[8 * 8]; + std::vector result(size); // For each 8x8 grid for (int block_start_y = 0; block_start_y < image_height; block_start_y += 8) { @@ -101,25 +104,22 @@ val zx_quantize(std::string rawimage, int image_width, int image_height, float d // For each pixel in that block: for (int y = block_start_y; y < block_start_y + block_height; y++) { for (int x = block_start_x; x < block_start_x + block_width; x++) { - int pixel_start = (y * image_width * bytes_per_pixel) + (x * bytes_per_pixel); + int pixel_start = (y * image_width) + x; int smallest_distance = INT_MAX; int winning_index = -1; // Copy pixel data for quantizing later block[block_index++] = image_buffer[pixel_start]; - block[block_index++] = image_buffer[pixel_start + 1]; - block[block_index++] = image_buffer[pixel_start + 2]; - block[block_index++] = image_buffer[pixel_start + 3]; // Which zx color is this pixel closest to? for (int color_index = 0; color_index < 15; color_index++) { liq_color color = zx_colors[color_index]; + liq_color pixel = image_buffer[pixel_start]; // Using Euclidean distance. LibQuant has better methods, but it // requires conversion to LAB, so I don't think it's worth it. - int distance = pow(color.r - image_buffer[pixel_start + 0], 2) + - pow(color.g - image_buffer[pixel_start + 1], 2) + - pow(color.b - image_buffer[pixel_start + 2], 2); + int distance = + pow(color.r - pixel.r, 2) + pow(color.g - pixel.g, 2) + pow(color.b - pixel.b, 2); if (distance < smallest_distance) { winning_index = color_index; @@ -183,41 +183,30 @@ val zx_quantize(std::string rawimage, int image_width, int image_height, float d } // Quantize - liq_attr* attr = liq_attr_create(); - liq_image* image = liq_image_create_rgba(attr, block, block_width, block_height, 0); - liq_set_max_colors(attr, 2); - liq_image_add_fixed_color(image, zx_colors[first_color_index]); - liq_image_add_fixed_color(image, zx_colors[second_color_index]); - liq_result* res = nullptr; - liq_image_quantize(image, attr, &res); - liq_set_dithering_level(res, dithering); - liq_write_remapped_image(res, image, image8bit, size); - const liq_palette* pal = liq_get_palette(res); + liq_attr_ptr attr(liq_attr_create()); + liq_image_ptr image(liq_image_create_rgba(attr.get(), block, block_width, block_height, 0)); + liq_set_max_colors(attr.get(), 2); + liq_image_add_fixed_color(image.get(), zx_colors[first_color_index]); + liq_image_add_fixed_color(image.get(), zx_colors[second_color_index]); + auto res = liq_image_quantize(image.get(), attr.get()); + liq_set_dithering_level(res.get(), dithering); + liq_write_remapped_image(res.get(), image.get(), image8bit, size); + auto pal = liq_get_palette(res.get()); // Turn palletted image back into an RGBA image, and write it into the // full size result image. for (int y = 0; y < block_height; y++) { for (int x = 0; x < block_width; x++) { int image8BitPos = y * block_width + x; - int resultStartPos = ((block_start_y + y) * bytes_per_pixel * image_width) + - ((block_start_x + x) * bytes_per_pixel); - result[resultStartPos + 0] = pal->entries[image8bit[image8BitPos]].r; - result[resultStartPos + 1] = pal->entries[image8bit[image8BitPos]].g; - result[resultStartPos + 2] = pal->entries[image8bit[image8BitPos]].b; - result[resultStartPos + 3] = pal->entries[image8bit[image8BitPos]].a; + int resultStartPos = ((block_start_y + y) * image_width) + (block_start_x + x); + result[resultStartPos] = pal->entries[image8bit[image8BitPos]]; } } - - liq_result_destroy(res); - liq_image_destroy(image); - liq_attr_destroy(attr); } } - free(image8bit); - val js_result = Uint8ClampedArray.new_(typed_memory_view(size * 4, result)); - free(result); - return js_result; + return Uint8ClampedArray.new_( + typed_memory_view(result.size() * sizeof(liq_color), (const uint8_t*)result.data())); } EMSCRIPTEN_BINDINGS(my_module) { diff --git a/codecs/imagequant/imagequant.js b/codecs/imagequant/imagequant.js index 9cac4d86..9a675ae2 100644 --- a/codecs/imagequant/imagequant.js +++ b/codecs/imagequant/imagequant.js @@ -6,66 +6,52 @@ var imagequant = (function() { function(imagequant) { imagequant = imagequant || {}; -var e;e||(e=typeof imagequant !== 'undefined' ? imagequant : {});var r={},t;for(t in e)e.hasOwnProperty(t)&&(r[t]=e[t]);var aa=!1,z=!1,ba=!1,ca=!1;aa="object"===typeof window;z="function"===typeof importScripts;ba="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;ca=!aa&&!ba&&!z;var A="",da,B,ea,ha; -if(ba)A=z?require("path").dirname(A)+"/":__dirname+"/",da=function(a,b){ea||(ea=require("fs"));ha||(ha=require("path"));a=ha.normalize(a);return ea.readFileSync(a,b?null:"utf8")},B=function(a){a=da(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||C("Assertion failed: undefined");return a},1=d);)++c;if(16f?d+=String.fromCharCode(f):(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else d+=String.fromCharCode(f)}return d} -function na(a,b,c){var d=H;if(0=g){var n=a.charCodeAt(++f);g=65536+((g&1023)<<10)|n&1023}if(127>=g){if(b>=c)break;d[b++]=g}else{if(2047>=g){if(b+1>=c)break;d[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;d[b++]=224|g>>12}else{if(b+3>=c)break;d[b++]=240|g>>18;d[b++]=128|g>>12&63}d[b++]=128|g>>6&63}d[b++]=128|g&63}}d[b]=0}}var oa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; -function pa(a){var b;for(b=a>>1;I[b];)++b;b<<=1;if(32>1];if(0==d)return c;++b;c+=String.fromCharCode(d)}}function qa(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 f=0;f>1]=a.charCodeAt(f),b+=2;I[b>>1]=0;return b-d}function ra(a){return 2*a.length} -function sa(a){for(var b=0,c="";;){var d=J[a+4*b>>2];if(0==d)return c;++b;65536<=d?(d-=65536,c+=String.fromCharCode(55296|d>>10,56320|d&1023)):c+=String.fromCharCode(d)}}function ta(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var f=0;f=g){var n=a.charCodeAt(++f);g=65536+((g&1023)<<10)|n&1023}J[b>>2]=g;b+=4;if(b+4>c)break}J[b>>2]=0;return b-d} -function ua(a){for(var b=0,c=0;c=d&&++c;b+=4}return b}var K,va,H,I,wa,J,L,xa,ya;function za(a){K=a;e.HEAP8=va=new Int8Array(a);e.HEAP16=I=new Int16Array(a);e.HEAP32=J=new Int32Array(a);e.HEAPU8=H=new Uint8Array(a);e.HEAPU16=wa=new Uint16Array(a);e.HEAPU32=L=new Uint32Array(a);e.HEAPF32=xa=new Float32Array(a);e.HEAPF64=ya=new Float64Array(a)}var Aa=e.INITIAL_MEMORY||16777216;e.wasmMemory?G=e.wasmMemory:G=new WebAssembly.Memory({initial:Aa/65536}); -G&&(K=G.buffer);Aa=K.byteLength;za(K);J[1548]=5249232;function Ba(a){for(;0=b?"_"+a:a} -function Sa(a,b){a=Ra(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Ta(a){var b=Error,c=Sa(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 Ua=void 0;function S(a){throw new Ua(a);}var Va=void 0;function Wa(a){throw new Va(a);}function Xa(a,b,c){function d(h){h=c(h);h.length!==a.length&&Wa("Mismatched type converter count");for(var k=0;k>2])}function rb(a,b,c){if(b===c)return a;if(void 0===c.Z)return null;a=rb(a,b,c.Z);return null===a?null:c.ra(a)}var sb={}; -function tb(a,b){for(void 0===b&&S("ptr should not be undefined");a.Z;)b=a.ha(b),a=a.Z;return sb[b]}function ub(a,b){b.W&&b.U||Wa("makeClassHandle requires ptr and ptrType");!!b.Y!==!!b.X&&Wa("Both smartPtrType and smartPtr must be specified");b.count={value:1};return cb(Object.create(a,{T:{value:b}}))} -function W(a,b,c,d){this.name=a;this.V=b;this.la=c;this.ia=d;this.ja=!1;this.da=this.ya=this.xa=this.oa=this.za=this.wa=void 0;void 0!==b.Z?this.toWireType=mb:(this.toWireType=d?lb:ob,this.aa=null)}function vb(a,b,c){e.hasOwnProperty(a)||Wa("Replacing nonexistant public symbol");void 0!==e[a].$&&void 0!==c?e[a].$[c]=b:(e[a]=b,e[a].pa=c)} -function X(a,b){a=P(a);var c=e["dynCall_"+a];for(var d=[],f=1;f>2])};case 3:return function(c){return this.fromWireType(ya[c>>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 c=Sa(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} -function Gb(a,b){for(var c=[],d=0;d>2)+d]);return c}function Hb(a,b,c){switch(b){case 0:return c?function(d){return va[d]}:function(d){return H[d]};case 1:return c?function(d){return I[d>>1]}:function(d){return wa[d>>1]};case 2:return c?function(d){return J[d>>2]}:function(d){return L[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}for(var Ib=[null,[],[]],Jb=Array(256),Kb=0;256>Kb;++Kb)Jb[Kb]=String.fromCharCode(Kb);Pa=Jb;Ua=e.BindingError=Ta("BindingError"); -Va=e.InternalError=Ta("InternalError");U.prototype.isAliasOf=function(a){if(!(this instanceof U&&a instanceof U))return!1;var b=this.T.W.V,c=this.T.U,d=a.T.W.V;for(a=a.T.U;b.Z;)c=b.ha(c),b=b.Z;for(;d.Z;)a=d.ha(a),d=d.Z;return b===d&&c===a};U.prototype.clone=function(){this.T.U||Za(this);if(this.T.ga)return this.T.count.value+=1,this;var a=cb(Object.create(Object.getPrototypeOf(this),{T:{value:Ya(this.T)}}));a.T.count.value+=1;a.T.ea=!1;return a}; -U.prototype["delete"]=function(){this.T.U||Za(this);this.T.ea&&!this.T.ga&&S("Object already scheduled for deletion");ab(this);bb(this.T);this.T.ga||(this.T.X=void 0,this.T.U=void 0)};U.prototype.isDeleted=function(){return!this.T.U};U.prototype.deleteLater=function(){this.T.U||Za(this);this.T.ea&&!this.T.ga&&S("Object already scheduled for deletion");eb.push(this);1===eb.length&&db&&db(fb);this.T.ea=!0;return this};W.prototype.ua=function(a){this.oa&&(a=this.oa(a));return a}; -W.prototype.na=function(a){this.da&&this.da(a)};W.prototype.argPackAdvance=8;W.prototype.readValueFromPointer=pb;W.prototype.deleteObject=function(a){if(null!==a)a["delete"]()}; -W.prototype.fromWireType=function(a){function b(){return this.ja?ub(this.V.ba,{W:this.wa,U:c,Y:this,X:a}):ub(this.V.ba,{W:this,U:a})}var c=this.ua(a);if(!c)return this.na(a),null;var d=tb(this.V,c);if(void 0!==d){if(0===d.T.count.value)return d.T.U=c,d.T.X=a,d.clone();d=d.clone();this.na(a);return d}d=this.V.ta(c);d=gb[d];if(!d)return b.call(this);d=this.ia?d.qa:d.pointerType;var f=rb(c,this.V,d.V);return null===f?b.call(this):this.ja?ub(d.V.ba,{W:d,U:f,Y:this,X:a}):ub(d.V.ba,{W:d,U:f})}; -e.getInheritedInstanceCount=function(){return Object.keys(sb).length};e.getLiveInheritedInstances=function(){var a=[],b;for(b in sb)sb.hasOwnProperty(b)&&a.push(sb[b]);return a};e.flushPendingDeletes=fb;e.setDelayFunction=function(a){db=a;eb.length&&db&&db(fb)};wb=e.UnboundTypeError=Ta("UnboundTypeError");e.count_emval_handles=function(){for(var a=0,b=5;b>g])},aa:null})},p:function(a,b,c,d,f,g,n,h,k,l,m,q,v){m=P(m);g=X(f,g);h&&(h=X(n, -h));l&&(l=X(k,l));v=X(q,v);var u=Ra(m);ib(u,function(){zb("Cannot construct "+m+" due to unbound types",[d])});Xa([a,b,c],d?[d]:[],function(p){p=p[0];if(d){var w=p.V;var x=w.ba}else x=U.prototype;p=Sa(u,function(){if(Object.getPrototypeOf(this)!==y)throw new Ua("Use 'new' to construct "+m);if(void 0===D.fa)throw new Ua(m+" has no accessible constructor");var qb=D.fa[arguments.length];if(void 0===qb)throw new Ua("Tried to invoke ctor of "+m+" with invalid number of parameters ("+arguments.length+") - expected ("+ -Object.keys(D.fa).toString()+") parameters instead!");return qb.apply(this,arguments)});var y=Object.create(x,{constructor:{value:p}});p.prototype=y;var D=new jb(m,p,y,v,w,g,h,l);w=new W(m,D,!0,!1);x=new W(m+"*",D,!1,!1);var fa=new W(m+" const*",D,!1,!0);gb[a]={pointerType:x,qa:fa};vb(u,p);return[w,x,fa]})},e:function(a,b,c,d,f,g,n,h,k,l){b=P(b);f=X(d,f);Xa([],[a],function(m){m=m[0];var q=m.name+"."+b,v={get:function(){zb("Cannot access "+q+" due to unbound types",[c,n])},enumerable:!0,configurable:!0}; -k?v.set=function(){zb("Cannot access "+q+" due to unbound types",[c,n])}:v.set=function(){S(q+" is a read-only property")};Object.defineProperty(m.V.ba,b,v);Xa([],k?[c,n]:[c],function(u){var p=u[0],w={get:function(){var y=Bb(this,m,q+" getter");return p.fromWireType(f(g,y))},enumerable:!0};if(k){k=X(h,k);var x=u[1];w.set=function(y){var D=Bb(this,m,q+" setter"),fa=[];k(l,D,x.toWireType(fa,y));Ab(fa)}}Object.defineProperty(m.V.ba,b,w);return[]});return[]})},t:function(a,b){b=P(b);T(a,{name:b,fromWireType:function(c){var d= -Z[c].value;Db(c);return d},toWireType:function(c,d){return nb(d)},argPackAdvance:8,readValueFromPointer:pb,aa:null})},h:function(a,b,c){c=Oa(c);b=P(b);T(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+V(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Eb(b,c),aa:null})},d:function(a,b,c,d,f,g){var n=Gb(b,c);a=P(a);f=X(d,f);ib(a,function(){zb("Cannot call "+a+" due to unbound types", -n)},b-1);Xa([],n,function(h){var k=[h[0],null].concat(h.slice(1)),l=h=a,m=f,q=k.length;2>q&&S("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var v=null!==k[1]&&!1,u=!1,p=1;p>>h}}var k=-1!=b.indexOf("unsigned");T(a,{name:b, -fromWireType:g,toWireType:function(l,m){if("number"!==typeof m&&"boolean"!==typeof m)throw new TypeError('Cannot convert "'+V(m)+'" to '+this.name);if(mf)throw new TypeError('Passing a number "'+V(m)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+f+"]!");return k?m>>>0:m|0},argPackAdvance:8,readValueFromPointer:Hb(b,n,0!==d),aa:null})},a:function(a,b,c){function d(g){g>>=2;var n=L;return new f(K,n[g+1],n[g])}var f=[Int8Array,Uint8Array, -Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=P(c);T(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{va:!0})},i:function(a,b){b=P(b);var c="std::string"===b;T(a,{name:b,fromWireType:function(d){var f=L[d>>2];if(c){var g=H[d+4+f],n=0;0!=g&&(n=g,H[d+4+f]=0);var h=d+4;for(g=0;g<=f;++g){var k=d+4+g;if(0==H[k]){h=h?ma(H,h,void 0):"";if(void 0===l)var l=h;else l+=String.fromCharCode(0),l+=h;h=k+1}}0!=n&&(H[d+4+f]=n)}else{l=Array(f);for(g=0;g=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++m)&1023);127>=q?++l:l=2047>=q?l+2:65535>=q?l+3:l+4}return l}:function(){return f.length})(), -h=Lb(4+n+1);L[h>>2]=n;if(c&&g)na(f,h+4,n+1);else if(g)for(g=0;g>2],m=n(),q=m[k+4+l*b>>h],v=0;0!=q&&(v=q,m[k+4+l*b>>h]=0);var u=k+4;for(q=0;q<=l;++q){var p=k+4+q*b;if(0==m[p>>h]){u=d(u);if(void 0===w)var w=u;else w+=String.fromCharCode(0),w+=u;u=p+b}}0!=v&&(m[k+4+l*b>>h]=v);Y(k);return w},toWireType:function(k,l){"string"!==typeof l&&S("Cannot pass non-string to C++ string type "+c);var m=g(l),q=Lb(4+m+b);L[q>>2]=m>>h;f(l,q+4,m+b);null!==k&&k.push(Y,q);return q},argPackAdvance:8,readValueFromPointer:pb,aa:function(k){Y(k)}})},v:function(a,b){b=P(b);T(a,{Aa:!0, -name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},g:Db,w:function(a){4=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216,a,d);0>16);za(G.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},l:function(){return 0},q:function(){},j:function(a,b,c,d){for(var f=0,g=0;g>2],h=J[b+(8*g+4)>>2],k=0;k>2]=f;return 0},memory:G,r:function(){},table:ja},Nb=function(){function a(f){e.asm=f.exports;M--;e.monitorRunDependencies&&e.monitorRunDependencies(M);0==M&&(null!==Ha&&(clearInterval(Ha), -Ha=null),N&&(f=N,N=null,f()))}function b(f){a(f.instance)}function c(f){return La().then(function(g){return WebAssembly.instantiate(g,d)}).then(f,function(g){E("failed to asynchronously prepare wasm: "+g);C(g)})}var d={a:Mb};M++;e.monitorRunDependencies&&e.monitorRunDependencies(M);if(e.instantiateWasm)try{return e.instantiateWasm(d,a)}catch(f){return E("Module.instantiateWasm callback failed with error: "+f),!1}(function(){if(F||"function"!==typeof WebAssembly.instantiateStreaming||Ia()||"function"!== -typeof fetch)return c(b);fetch(O,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,d).then(b,function(g){E("wasm streaming compile failed: "+g);E("falling back to ArrayBuffer instantiation");c(b)})})})();return{}}();e.asm=Nb; -var Ma=e.___wasm_call_ctors=function(){return(Ma=e.___wasm_call_ctors=e.asm.x).apply(null,arguments)},Lb=e._malloc=function(){return(Lb=e._malloc=e.asm.y).apply(null,arguments)},Y=e._free=function(){return(Y=e._free=e.asm.z).apply(null,arguments)},yb=e.___getTypeName=function(){return(yb=e.___getTypeName=e.asm.A).apply(null,arguments)};e.___embind_register_native_and_builtin_types=function(){return(e.___embind_register_native_and_builtin_types=e.asm.B).apply(null,arguments)}; -e.dynCall_ii=function(){return(e.dynCall_ii=e.asm.C).apply(null,arguments)};e.dynCall_vi=function(){return(e.dynCall_vi=e.asm.D).apply(null,arguments)};e.dynCall_iii=function(){return(e.dynCall_iii=e.asm.E).apply(null,arguments)};e.dynCall_viii=function(){return(e.dynCall_viii=e.asm.F).apply(null,arguments)};e.dynCall_iiiiiif=function(){return(e.dynCall_iiiiiif=e.asm.G).apply(null,arguments)};e.dynCall_viiiiif=function(){return(e.dynCall_viiiiif=e.asm.H).apply(null,arguments)}; -e.dynCall_iiiiif=function(){return(e.dynCall_iiiiif=e.asm.I).apply(null,arguments)};e.dynCall_viiiif=function(){return(e.dynCall_viiiif=e.asm.J).apply(null,arguments)};e.dynCall_i=function(){return(e.dynCall_i=e.asm.K).apply(null,arguments)};e.dynCall_vii=function(){return(e.dynCall_vii=e.asm.L).apply(null,arguments)};e.dynCall_vif=function(){return(e.dynCall_vif=e.asm.M).apply(null,arguments)};e.dynCall_iidiiii=function(){return(e.dynCall_iidiiii=e.asm.N).apply(null,arguments)}; -e.dynCall_iiii=function(){return(e.dynCall_iiii=e.asm.O).apply(null,arguments)};e.dynCall_jiji=function(){return(e.dynCall_jiji=e.asm.P).apply(null,arguments)};e.dynCall_viiiiii=function(){return(e.dynCall_viiiiii=e.asm.Q).apply(null,arguments)};e.dynCall_viiiii=function(){return(e.dynCall_viiiii=e.asm.R).apply(null,arguments)};e.dynCall_viiii=function(){return(e.dynCall_viiii=e.asm.S).apply(null,arguments)};e.asm=Nb;var Ob; -e.then=function(a){if(Ob)a(e);else{var b=e.onRuntimeInitialized;e.onRuntimeInitialized=function(){b&&b();a(e)}}return e};N=function Pb(){Ob||Qb();Ob||(N=Pb)}; -function Qb(){function a(){if(!Ob&&(Ob=!0,e.calledRun=!0,!ka)){Ba(Da);Ba(Ea);if(e.onRuntimeInitialized)e.onRuntimeInitialized();if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();Fa.unshift(b)}Ba(Fa)}}if(!(0=e);)++d;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e} +function ka(a,b,d){var e=E;if(0=g){var m=a.charCodeAt(++f);g=65536+((g&1023)<<10)|m&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 la="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; +function ma(a){var b;for(b=a>>1;F[b];)++b;b<<=1;if(32>1];if(0==e)return d;++b;d+=String.fromCharCode(e)}}function na(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>1]=a.charCodeAt(f),b+=2;F[b>>1]=0;return b-e}function oa(a){return 2*a.length} +function pa(a){for(var b=0,d="";;){var e=G[a+4*b>>2];if(0==e)return d;++b;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}}function qa(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=g){var m=a.charCodeAt(++f);g=65536+((g&1023)<<10)|m&1023}G[b>>2]=g;b+=4;if(b+4>d)break}G[b>>2]=0;return b-e} +function ra(a){for(var b=0,d=0;d=e&&++d;b+=4}return b}var H,sa,E,F,ta,G,I,ua,va;function wa(a){H=a;c.HEAP8=sa=new Int8Array(a);c.HEAP16=F=new Int16Array(a);c.HEAP32=G=new Int32Array(a);c.HEAPU8=E=new Uint8Array(a);c.HEAPU16=ta=new Uint16Array(a);c.HEAPU32=I=new Uint32Array(a);c.HEAPF32=ua=new Float32Array(a);c.HEAPF64=va=new Float64Array(a)}var xa=c.INITIAL_MEMORY||16777216;c.wasmMemory?D=c.wasmMemory:D=new WebAssembly.Memory({initial:xa/65536}); +D&&(H=D.buffer);xa=H.byteLength;wa(H);G[1468]=5248912;function J(a){for(;0=b?"_"+a:a} +function Na(a,b){a=Ma(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Oa(a){var b=Error,d=Na(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 Pa=void 0;function V(a){throw new Pa(a);}var Qa=void 0;function Ra(a,b){function d(h){h=b(h);if(h.length!==e.length)throw new Qa("Mismatched type converter count");for(var k=0;k>2])}function Xa(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a} +function Ya(a,b){switch(b){case 2:return function(d){return this.fromWireType(ua[d>>2])};case 3:return function(d){return this.fromWireType(va[d>>3])};default:throw new TypeError("Unknown float type: "+a);}}function Za(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=Na(b.name||"unknownFunctionName",function(){});d.prototype=b.prototype;d=new d;a=b.apply(d,a);return a instanceof Object?a:d} +function $a(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function ab(a,b){var d=c;if(void 0===d[a].R){var e=d[a];d[a]=function(){d[a].R.hasOwnProperty(arguments.length)||V("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+d[a].R+")!");return d[a].R[arguments.length].apply(this,arguments)};d[a].R=[];d[a].R[e.W]=e}} +function bb(a,b,d){c.hasOwnProperty(a)?((void 0===d||void 0!==c[a].R&&void 0!==c[a].R[d])&&V("Cannot register public name '"+a+"' twice"),ab(a,a),c.hasOwnProperty(d)&&V("Cannot register multiple overloads of a function with the same number of arguments ("+d+")!"),c[a].R[d]=b):(c[a]=b,void 0!==d&&(c[a].$=d))}function cb(a,b){for(var d=[],e=0;e>2)+e]);return d} +function db(a,b){a=S(a);var d=c["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return ta[e>>1]};case 2:return d?function(e){return G[e>>2]}:function(e){return I[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var jb={}; +function kb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function lb(a,b){var d=U[a];void 0===d&&V(b+" has unknown type "+fb(a));return d}for(var mb={},nb=[null,[],[]],ob=Array(256),pb=0;256>pb;++pb)ob[pb]=String.fromCharCode(pb);Ka=ob;Pa=c.BindingError=Oa("BindingError");Qa=c.InternalError=Oa("InternalError");c.count_emval_handles=function(){for(var a=0,b=5;b>g])},S:null})},r:function(a,b){b=S(b);W(a,{name:b,fromWireType:function(d){var e=X[d].value; +Ta(d);return e},toWireType:function(d,e){return Va(e)},argPackAdvance:8,readValueFromPointer:Wa,S:null})},g:function(a,b,d){d=Ja(d);b=S(b);W(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+Xa(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Ya(b,d),S:null})},d:function(a,b,d,e,f,g){var m=cb(b,d);a=S(a);f=db(e,f);bb(a,function(){hb("Cannot call "+a+" due to unbound types", +m)},b-1);Ra(m,function(h){var k=[h[0],null].concat(h.slice(1)),l=h=a,p=f,q=k.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var K=null!==k[1]&&!1,y=!1,n=1;n>>h}}var k=-1!=b.indexOf("unsigned");W(a,{name:b,fromWireType:g,toWireType:function(l,p){if("number"!==typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+Xa(p)+'" to '+this.name);if(pf)throw new TypeError('Passing a number "'+Xa(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return k?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:ib(b, +m,0!==e),S:null})},a:function(a,b,d){function e(g){g>>=2;var m=I;return new f(H,m[g+1],m[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];d=S(d);W(a,{name:d,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{Y:!0})},h:function(a,b){b=S(b);var d="std::string"===b;W(a,{name:b,fromWireType:function(e){var f=I[e>>2];if(d){var g=E[e+4+f],m=0;0!=g&&(m=g,E[e+4+f]=0);var h=e+4;for(g=0;g<=f;++g){var k=e+4+g;if(0==E[k]){h=h?ja(E,h,void 0):""; +if(void 0===l)var l=h;else l+=String.fromCharCode(0),l+=h;h=k+1}}0!=m&&(E[e+4+f]=m)}else{l=Array(f);for(g=0;g=q&& +(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++l:l=2047>=q?l+2:65535>=q?l+3:l+4}return l}:function(){return f.length})(),h=qb(4+m+1);I[h>>2]=m;if(d&&g)ka(f,h+4,m+1);else if(g)for(g=0;g>2],p=m(),q=p[k+4+l*b>>h],K=0;0!=q&&(K=q,p[k+4+l*b>>h]=0);var y=k+4;for(q=0;q<=l;++q){var n=k+4+q*b;if(0==p[n>>h]){y=e(y);if(void 0===L)var L=y;else L+=String.fromCharCode(0),L+=y;y=n+b}}0!=K&&(p[k+4+l*b>>h]=K);Y(k);return L},toWireType:function(k,l){"string"!==typeof l&&V("Cannot pass non-string to C++ string type "+d);var p=g(l),q=qb(4+p+b);I[q>>2]=p>>h;f(l, +q+4,p+b);null!==k&&k.push(Y,q);return q},argPackAdvance:8,readValueFromPointer:Wa,S:function(k){Y(k)}})},t:function(a,b){b=S(b);W(a,{Z:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},u:Ta,v:function(a){if(0===a)return Va(kb());var b=jb[a];a=void 0===b?S(a):b;return Va(kb()[a])},k:function(a){4> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",m+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(lb,c,Va);mb[b]=f}return f(a,d,e)},j:function(){A()},q:function(a,b,d){E.copyWithin(a,b,b+d)}, +c:function(a){var b=E.length;if(2147418112=d;d*=2){var e=b*(1+.2/d);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>16);wa(D.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},i:function(){return 0},n:function(){},f:function(a,b,d,e){for(var f=0,g=0;g>2],h=G[b+(8*g+4)>>2],k=0;k>2]=f;return 0},memory:D,o:function(){},table:fa},sb=function(){function a(f){c.asm=f.exports;N--;c.monitorRunDependencies&&c.monitorRunDependencies(N);0==N&&(null!==Da&&(clearInterval(Da),Da=null),O&&(f=O,O=null,f()))}function b(f){a(f.instance)}function d(f){return Ha().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var e={a:rb};N++;c.monitorRunDependencies&&c.monitorRunDependencies(N); +if(c.instantiateWasm)try{return c.instantiateWasm(e,a)}catch(f){return B("Module.instantiateWasm callback failed with error: "+f),!1}(function(){if(C||"function"!==typeof WebAssembly.instantiateStreaming||Ea()||"function"!==typeof fetch)return d(b);fetch(P,{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");d(b)})})})();return{}}();c.asm=sb; +var Ia=c.___wasm_call_ctors=function(){return(Ia=c.___wasm_call_ctors=c.asm.w).apply(null,arguments)},qb=c._malloc=function(){return(qb=c._malloc=c.asm.x).apply(null,arguments)},Y=c._free=function(){return(Y=c._free=c.asm.y).apply(null,arguments)},gb=c.___getTypeName=function(){return(gb=c.___getTypeName=c.asm.z).apply(null,arguments)};c.___embind_register_native_and_builtin_types=function(){return(c.___embind_register_native_and_builtin_types=c.asm.A).apply(null,arguments)}; +c.dynCall_vi=function(){return(c.dynCall_vi=c.asm.B).apply(null,arguments)};c.dynCall_iiiiiif=function(){return(c.dynCall_iiiiiif=c.asm.C).apply(null,arguments)};c.dynCall_viiiiif=function(){return(c.dynCall_viiiiif=c.asm.D).apply(null,arguments)};c.dynCall_iiiiif=function(){return(c.dynCall_iiiiif=c.asm.E).apply(null,arguments)};c.dynCall_viiiif=function(){return(c.dynCall_viiiif=c.asm.F).apply(null,arguments)};c.dynCall_ii=function(){return(c.dynCall_ii=c.asm.G).apply(null,arguments)}; +c.dynCall_i=function(){return(c.dynCall_i=c.asm.H).apply(null,arguments)};c.dynCall_iii=function(){return(c.dynCall_iii=c.asm.I).apply(null,arguments)};c.dynCall_vif=function(){return(c.dynCall_vif=c.asm.J).apply(null,arguments)};c.dynCall_iidiiii=function(){return(c.dynCall_iidiiii=c.asm.K).apply(null,arguments)};c.dynCall_vii=function(){return(c.dynCall_vii=c.asm.L).apply(null,arguments)};c.dynCall_iiii=function(){return(c.dynCall_iiii=c.asm.M).apply(null,arguments)}; +c.dynCall_jiji=function(){return(c.dynCall_jiji=c.asm.N).apply(null,arguments)};c.dynCall_viiiiii=function(){return(c.dynCall_viiiiii=c.asm.O).apply(null,arguments)};c.dynCall_viiiii=function(){return(c.dynCall_viiiii=c.asm.P).apply(null,arguments)};c.dynCall_viiii=function(){return(c.dynCall_viiii=c.asm.Q).apply(null,arguments)};c.asm=sb;var Z;c.then=function(a){if(Z)a(c);else{var b=c.onRuntimeInitialized;c.onRuntimeInitialized=function(){b&&b();a(c)}}return c};O=function tb(){Z||ub();Z||(O=tb)}; +function ub(){function a(){if(!Z&&(Z=!0,c.calledRun=!0,!ha)){J(za);J(Aa);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();Ba.unshift(b)}J(Ba)}}if(!(0