From f396a5b784341142a180a285854d101e3087382f Mon Sep 17 00:00:00 2001 From: Jake Archibald Date: Tue, 6 Nov 2018 13:46:52 +0000 Subject: [PATCH] MozJPEG chroma subsampling and quality (#235) * Adding chroma subsampling for mozjpeg * Adding separate chroma quality. * Preact sometimes removes the inline styles, this fixes it. * Simplifying chroma subsample * Adding comments --- codecs/mozjpeg_enc/README.md | 4 ++ codecs/mozjpeg_enc/example.html | 12 ++-- codecs/mozjpeg_enc/mozjpeg_enc.cpp | 23 +++++++- codecs/mozjpeg_enc/mozjpeg_enc.js | 2 +- codecs/mozjpeg_enc/mozjpeg_enc.wasm | Bin 238594 -> 241369 bytes src/codecs/mozjpeg/encoder-meta.ts | 8 +++ src/codecs/mozjpeg/options.tsx | 83 ++++++++++++++++++++++++---- src/custom-els/RangeInput/index.ts | 2 + 8 files changed, 114 insertions(+), 20 deletions(-) diff --git a/codecs/mozjpeg_enc/README.md b/codecs/mozjpeg_enc/README.md index eeeb68d8..e7b99769 100644 --- a/codecs/mozjpeg_enc/README.md +++ b/codecs/mozjpeg_enc/README.md @@ -39,5 +39,9 @@ struct MozJpegOptions { bool trellis_opt_zero; bool trellis_opt_table; int trellis_loops; + bool auto_subsample; + int chroma_subsample; + bool separate_chroma_quality; + int chroma_quality; }; ``` diff --git a/codecs/mozjpeg_enc/example.html b/codecs/mozjpeg_enc/example.html index f8fe25d9..2cff900f 100644 --- a/codecs/mozjpeg_enc/example.html +++ b/codecs/mozjpeg_enc/example.html @@ -21,7 +21,7 @@ console.log('Version:', module.version().toString(16)); const image = await loadImage('../example.png'); const result = module.encode(image.data, image.width, image.height, { - quality: 40, + quality: 75, baseline: false, arithmetic: false, progressive: true, @@ -29,10 +29,14 @@ smoothing: 0, color_space: 3, quant_table: 3, - trellis_multipass: true, - trellis_opt_zero: true, - trellis_opt_table: true, + trellis_multipass: false, + trellis_opt_zero: false, + trellis_opt_table: false, trellis_loops: 1, + auto_subsample: true, + chroma_subsample: 2, + separate_chroma_quality: false, + chroma_quality: 75, }); const blob = new Blob([result], {type: 'image/jpeg'}); diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.cpp b/codecs/mozjpeg_enc/mozjpeg_enc.cpp index 6d916334..a2a31db5 100644 --- a/codecs/mozjpeg_enc/mozjpeg_enc.cpp +++ b/codecs/mozjpeg_enc/mozjpeg_enc.cpp @@ -29,6 +29,10 @@ struct MozJpegOptions { bool trellis_opt_zero; bool trellis_opt_table; int trellis_loops; + bool auto_subsample; + int chroma_subsample; + bool separate_chroma_quality; + int chroma_quality; }; int version() { @@ -119,9 +123,6 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio */ jpeg_set_defaults(&cinfo); - /* Now you can set any non-default parameters you wish to. - * Here we just illustrate the use of quality (quantization table) scaling: - */ jpeg_set_colorspace(&cinfo, (J_COLOR_SPACE) opts.color_space); if (opts.quant_table != -1) { @@ -142,11 +143,23 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio jpeg_c_set_bool_param(&cinfo, JBOOLEAN_TRELLIS_Q_OPT, opts.trellis_opt_table); jpeg_c_set_int_param(&cinfo, JINT_TRELLIS_NUM_LOOPS, opts.trellis_loops); + // A little hacky to build a string for this, but it means we can use set_quality_ratings which + // does some useful heuristic stuff. std::string quality_str = std::to_string(opts.quality); + + if (opts.separate_chroma_quality && opts.color_space == JCS_YCbCr) { + quality_str += "," + std::to_string(opts.chroma_quality); + } + char const *pqual = quality_str.c_str(); set_quality_ratings(&cinfo, (char*) pqual, opts.baseline); + if (!opts.auto_subsample && opts.color_space == JCS_YCbCr) { + cinfo.comp_info[0].h_samp_factor = opts.chroma_subsample; + cinfo.comp_info[0].v_samp_factor = opts.chroma_subsample; + } + if (!opts.baseline && opts.progressive) { jpeg_simple_progression(&cinfo); } else { @@ -209,6 +222,10 @@ EMSCRIPTEN_BINDINGS(my_module) { .field("trellis_opt_zero", &MozJpegOptions::trellis_opt_zero) .field("trellis_opt_table", &MozJpegOptions::trellis_opt_table) .field("trellis_loops", &MozJpegOptions::trellis_loops) + .field("chroma_subsample", &MozJpegOptions::chroma_subsample) + .field("auto_subsample", &MozJpegOptions::auto_subsample) + .field("separate_chroma_quality", &MozJpegOptions::separate_chroma_quality) + .field("chroma_quality", &MozJpegOptions::chroma_quality) ; function("version", &version); diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.js b/codecs/mozjpeg_enc/mozjpeg_enc.js index 243f73bc..de99f713 100644 --- a/codecs/mozjpeg_enc/mozjpeg_enc.js +++ b/codecs/mozjpeg_enc/mozjpeg_enc.js @@ -5,7 +5,7 @@ var mozjpeg_enc = (function() { function(mozjpeg_enc) { mozjpeg_enc = mozjpeg_enc || {}; -var Module=typeof mozjpeg_enc!=="undefined"?mozjpeg_enc:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",abort);Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="mozjpeg_enc.wast";var wasmBinaryFile="mozjpeg_enc.wasm";var asmjsCodeFile="mozjpeg_enc.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var key in EXCEPTIONS.infos){var ptr=+key;var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",(function(){}));dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined)str=stringSegment;else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0)HEAPU8[value+4+length]=endCharSwap}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(){return _llvm_exp2_f32.apply(null,arguments)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module["wasmTableSize"]=212;Module["wasmMaxTableSize"]=212;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall6":___syscall6,"__embind_finalize_value_object":__embind_finalize_value_object,"__embind_register_bool":__embind_register_bool,"__embind_register_emval":__embind_register_emval,"__embind_register_float":__embind_register_float,"__embind_register_function":__embind_register_function,"__embind_register_integer":__embind_register_integer,"__embind_register_memory_view":__embind_register_memory_view,"__embind_register_std_string":__embind_register_std_string,"__embind_register_std_wstring":__embind_register_std_wstring,"__embind_register_value_object":__embind_register_value_object,"__embind_register_value_object_field":__embind_register_value_object_field,"__embind_register_void":__embind_register_void,"__emval_decref":__emval_decref,"__emval_incref":__emval_incref,"__emval_take_value":__emval_take_value,"_abort":_abort,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_exit":_exit,"_getenv":_getenv,"_llvm_exp2_f64":_llvm_exp2_f64,"_pthread_getspecific":_pthread_getspecific,"_pthread_key_create":_pthread_key_create,"_pthread_once":_pthread_once,"_pthread_setspecific":_pthread_setspecific,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_bind_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_mozjpeg_enc_cpp=Module["__GLOBAL__sub_I_mozjpeg_enc_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_mozjpeg_enc_cpp"].apply(null,arguments)});var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var ___errno_location=Module["___errno_location"]=(function(){return Module["asm"]["___errno_location"].apply(null,arguments)});var ___getTypeName=Module["___getTypeName"]=(function(){return Module["asm"]["___getTypeName"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiii"].apply(null,arguments)});var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiii"].apply(null,arguments)});Module["asm"]=asm;Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() +var Module=typeof mozjpeg_enc!=="undefined"?mozjpeg_enc:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",abort);Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="mozjpeg_enc.wast";var wasmBinaryFile="mozjpeg_enc.wasm";var asmjsCodeFile="mozjpeg_enc.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var key in EXCEPTIONS.infos){var ptr=+key;var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",(function(){}));dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined)str=stringSegment;else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0)HEAPU8[value+4+length]=endCharSwap}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(){return _llvm_exp2_f32.apply(null,arguments)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module["wasmTableSize"]=212;Module["wasmMaxTableSize"]=212;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall6":___syscall6,"__embind_finalize_value_object":__embind_finalize_value_object,"__embind_register_bool":__embind_register_bool,"__embind_register_emval":__embind_register_emval,"__embind_register_float":__embind_register_float,"__embind_register_function":__embind_register_function,"__embind_register_integer":__embind_register_integer,"__embind_register_memory_view":__embind_register_memory_view,"__embind_register_std_string":__embind_register_std_string,"__embind_register_std_wstring":__embind_register_std_wstring,"__embind_register_value_object":__embind_register_value_object,"__embind_register_value_object_field":__embind_register_value_object_field,"__embind_register_void":__embind_register_void,"__emval_decref":__emval_decref,"__emval_incref":__emval_incref,"__emval_take_value":__emval_take_value,"_abort":_abort,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_exit":_exit,"_getenv":_getenv,"_llvm_exp2_f64":_llvm_exp2_f64,"_pthread_getspecific":_pthread_getspecific,"_pthread_key_create":_pthread_key_create,"_pthread_once":_pthread_once,"_pthread_setspecific":_pthread_setspecific,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_bind_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_mozjpeg_enc_cpp=Module["__GLOBAL__sub_I_mozjpeg_enc_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_mozjpeg_enc_cpp"].apply(null,arguments)});var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var ___errno_location=Module["___errno_location"]=(function(){return Module["asm"]["___errno_location"].apply(null,arguments)});var ___getTypeName=Module["___getTypeName"]=(function(){return Module["asm"]["___getTypeName"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiii"].apply(null,arguments)});var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiii"].apply(null,arguments)});Module["asm"]=asm;Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.wasm b/codecs/mozjpeg_enc/mozjpeg_enc.wasm index 2ea4dfcbbd7a3e47b01880fc5d4361606cd33e5a..e16595696bd87d2890a49d974b9efeeba2d548e3 100644 GIT binary patch delta 24873 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ðK^q@EY4Z7Wr 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 diff --git a/src/codecs/mozjpeg/encoder-meta.ts b/src/codecs/mozjpeg/encoder-meta.ts index b8cb8700..db33e2bc 100644 --- a/src/codecs/mozjpeg/encoder-meta.ts +++ b/src/codecs/mozjpeg/encoder-meta.ts @@ -17,6 +17,10 @@ export interface EncodeOptions { trellis_opt_zero: boolean; trellis_opt_table: boolean; trellis_loops: number; + auto_subsample: boolean; + chroma_subsample: number; + separate_chroma_quality: boolean; + chroma_quality: number; } export interface EncoderState { type: typeof type; options: EncodeOptions; } @@ -38,4 +42,8 @@ export const defaultOptions: EncodeOptions = { trellis_opt_zero: false, trellis_opt_table: false, trellis_loops: 1, + auto_subsample: true, + chroma_subsample: 2, + separate_chroma_quality: false, + chroma_quality: 75, }; diff --git a/src/codecs/mozjpeg/options.tsx b/src/codecs/mozjpeg/options.tsx index 2fcdd312..6fb09f6c 100644 --- a/src/codecs/mozjpeg/options.tsx +++ b/src/codecs/mozjpeg/options.tsx @@ -39,8 +39,13 @@ export default class MozJPEGEncoderOptions extends Component { trellis_multipass: inputFieldChecked(form.trellis_multipass, options.trellis_multipass), trellis_opt_zero: inputFieldChecked(form.trellis_opt_zero, options.trellis_opt_zero), trellis_opt_table: inputFieldChecked(form.trellis_opt_table, options.trellis_opt_table), + auto_subsample: inputFieldChecked(form.auto_subsample, options.auto_subsample), + separate_chroma_quality: + inputFieldChecked(form.separate_chroma_quality, options.separate_chroma_quality), // .value quality: inputFieldValueAsNumber(form.quality, options.quality), + chroma_quality: inputFieldValueAsNumber(form.chroma_quality, options.chroma_quality), + chroma_subsample: inputFieldValueAsNumber(form.chroma_subsample, options.chroma_subsample), smoothing: inputFieldValueAsNumber(form.smoothing, options.smoothing), color_space: inputFieldValueAsNumber(form.color_space, options.color_space), quant_table: inputFieldValueAsNumber(form.quant_table, options.quant_table), @@ -75,6 +80,72 @@ export default class MozJPEGEncoderOptions extends Component { {showAdvanced ?
+ + + {options.color_space === MozJpegColorSpace.YCbCr ? +
+ + + {options.auto_subsample ? null : +
+ + Subsample chroma by: + +
+ } +
+ + + {options.separate_chroma_quality ? +
+ + Chroma quality: + +
+ : null + } +
+
+ : null + } +
-