From c23d1091e71b86c34c15e42ae85da0e449280a39 Mon Sep 17 00:00:00 2001 From: Surma Date: Fri, 21 Aug 2020 16:31:04 +0100 Subject: [PATCH 1/7] Implement decoder --- codecs/{mozjpeg_enc => mozjpeg}/Makefile | 2 +- codecs/{mozjpeg_enc => mozjpeg}/README.md | 0 codecs/mozjpeg/dec/example.html | 18 ++++ codecs/mozjpeg/dec/mozjpeg_dec.cpp | 74 ++++++++++++++ codecs/mozjpeg/dec/mozjpeg_dec.js | 69 +++++++++++++ codecs/mozjpeg/dec/mozjpeg_dec.wasm | Bin 0 -> 140258 bytes .../{mozjpeg_enc => mozjpeg/enc}/example.html | 0 .../enc}/mozjpeg_enc.cpp | 23 ----- .../enc}/mozjpeg_enc.d.ts | 0 .../enc}/mozjpeg_enc.js | 94 +++++++++--------- .../enc}/mozjpeg_enc.wasm | Bin 217799 -> 217878 bytes .../package-lock.json | 0 codecs/{mozjpeg_enc => mozjpeg}/package.json | 0 13 files changed, 209 insertions(+), 71 deletions(-) rename codecs/{mozjpeg_enc => mozjpeg}/Makefile (96%) rename codecs/{mozjpeg_enc => mozjpeg}/README.md (100%) create mode 100644 codecs/mozjpeg/dec/example.html create mode 100644 codecs/mozjpeg/dec/mozjpeg_dec.cpp create mode 100644 codecs/mozjpeg/dec/mozjpeg_dec.js create mode 100644 codecs/mozjpeg/dec/mozjpeg_dec.wasm rename codecs/{mozjpeg_enc => mozjpeg/enc}/example.html (100%) rename codecs/{mozjpeg_enc => mozjpeg/enc}/mozjpeg_enc.cpp (92%) rename codecs/{mozjpeg_enc => mozjpeg/enc}/mozjpeg_enc.d.ts (100%) rename codecs/{mozjpeg_enc => mozjpeg/enc}/mozjpeg_enc.js (58%) rename codecs/{mozjpeg_enc => mozjpeg/enc}/mozjpeg_enc.wasm (80%) rename codecs/{mozjpeg_enc => mozjpeg}/package-lock.json (100%) rename codecs/{mozjpeg_enc => mozjpeg}/package.json (100%) diff --git a/codecs/mozjpeg_enc/Makefile b/codecs/mozjpeg/Makefile similarity index 96% rename from codecs/mozjpeg_enc/Makefile rename to codecs/mozjpeg/Makefile index 30b5ca0e..7e76fc1a 100644 --- a/codecs/mozjpeg_enc/Makefile +++ b/codecs/mozjpeg/Makefile @@ -2,7 +2,7 @@ CODEC_URL := https://github.com/mozilla/mozjpeg/archive/v3.3.1.tar.gz CODEC_DIR := node_modules/mozjpeg CODEC_OUT_RELATIVE := .libs/libjpeg.a rdswitch.o CODEC_OUT := $(addprefix $(CODEC_DIR)/, $(CODEC_OUT_RELATIVE)) -OUT_JS := mozjpeg_enc.js +OUT_JS := enc/mozjpeg_enc.js dec/mozjpeg_dec.js OUT_WASM := $(OUT_JS:.js=.wasm) .PHONY: all clean diff --git a/codecs/mozjpeg_enc/README.md b/codecs/mozjpeg/README.md similarity index 100% rename from codecs/mozjpeg_enc/README.md rename to codecs/mozjpeg/README.md diff --git a/codecs/mozjpeg/dec/example.html b/codecs/mozjpeg/dec/example.html new file mode 100644 index 00000000..8cf396d7 --- /dev/null +++ b/codecs/mozjpeg/dec/example.html @@ -0,0 +1,18 @@ + + + diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.cpp b/codecs/mozjpeg/dec/mozjpeg_dec.cpp new file mode 100644 index 00000000..f350d779 --- /dev/null +++ b/codecs/mozjpeg/dec/mozjpeg_dec.cpp @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "jpeglib.h" + +extern "C" { +#include "cdjpeg.h" +} + +using namespace emscripten; + +thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray"); +thread_local const val ImageData = val::global("ImageData"); + +val decode(std::string image_in) { + uint8_t* image_buffer = (uint8_t*)image_in.c_str(); + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + /* Initialize the JPEG decompression object with default error handling. */ + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + + jpeg_mem_src(&cinfo, image_buffer, image_in.length()); + /* Read file header, set default decompression parameters */ + jpeg_read_header(&cinfo, TRUE); + // Force RGB decoding, even for grayscale images + cinfo.out_color_space = JCS_RGB; + jpeg_start_decompress(&cinfo); + + // Prepare output buffer + size_t output_size = cinfo.output_width * cinfo.output_height * 4; + auto output_buffer = new uint8_t[output_size]; + uint8_t* row_ptr = &output_buffer[0]; + auto stride = cinfo.output_width * 4; + + /* Process data */ + while (cinfo.output_scanline < cinfo.output_height) { + jpeg_read_scanlines(&cinfo, &row_ptr, 1); + // Turn that row from RGB into RGBA. I’m starting at the end so + // I can do it in-place. + for (int32_t x = cinfo.output_width - 1; x >= 0; x--) { + // RGB channels + for (auto i = 0; i < 3; i++) { + row_ptr[x * 4 + i] = row_ptr[x * 3 + i]; + } + // Alpha channel + row_ptr[x * 4 + 3] = 255; + } + row_ptr += stride; + } + jpeg_finish_decompress(&cinfo); + + /* Step 7: release JPEG compression object */ + + auto data = Uint8ClampedArray.new_(typed_memory_view(output_size, output_buffer)); + auto js_result = ImageData.new_(data, cinfo.output_width, cinfo.output_height); + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + delete[] output_buffer; + + /* And we're done! */ + return js_result; +} + +EMSCRIPTEN_BINDINGS(my_module) { + function("decode", &decode); +} diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.js b/codecs/mozjpeg/dec/mozjpeg_dec.js new file mode 100644 index 00000000..aa35869b --- /dev/null +++ b/codecs/mozjpeg/dec/mozjpeg_dec.js @@ -0,0 +1,69 @@ + +var mozjpeg_dec = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(mozjpeg_dec) { + mozjpeg_dec = mozjpeg_dec || {}; + + +var d;d||(d=typeof mozjpeg_dec !== 'undefined' ? mozjpeg_dec : {});var aa,ba;d.ready=new Promise(function(a,b){aa=a;ba=b});var r={},t;for(t in d)d.hasOwnProperty(t)&&(r[t]=d[t]);var ca="./this.program";function u(a,b){throw b;}var v=!1,w=!1,da=!1,ea=!1;v="object"===typeof window;w="function"===typeof importScripts;da="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;ea=!v&&!da&&!w;var x="",z,A,fa,ha; +if(da)x=w?require("path").dirname(x)+"/":__dirname+"/",z=function(a,b){fa||(fa=require("fs"));ha||(ha=require("path"));a=ha.normalize(a);return fa.readFileSync(a,b?null:"utf8")},A=function(a){a=z(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||B("Assertion failed: undefined");return a},1=e);)++c;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 oa(a,b,c){var e=G;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var pa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; +function qa(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&H[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function ra(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;I[b>>1]=0;return b-e}function sa(a){return 2*a.length} +function ta(a,b){for(var c=0,e="";!(c>=b/4);){var f=J[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function ua(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}J[b>>2]=g;b+=4;if(b+4>c)break}J[b>>2]=0;return b-e} +function va(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}var L,M,G,I,H,J,N,wa,xa;function ya(a){L=a;d.HEAP8=M=new Int8Array(a);d.HEAP16=I=new Int16Array(a);d.HEAP32=J=new Int32Array(a);d.HEAPU8=G=new Uint8Array(a);d.HEAPU16=H=new Uint16Array(a);d.HEAPU32=N=new Uint32Array(a);d.HEAPF32=wa=new Float32Array(a);d.HEAPF64=xa=new Float64Array(a)}var za=d.INITIAL_MEMORY||16777216;d.wasmMemory?F=d.wasmMemory:F=new WebAssembly.Memory({initial:za/65536,maximum:32768}); +F&&(L=F.buffer);za=L.byteLength;ya(L);J[3100]=5255440;function O(a){for(;0=b?"_"+a:a} +function Ra(a,b){a=Qa(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Sa(a){var b=Error,c=Ra(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c} +var Ta=void 0;function W(a){throw new Ta(a);}var Ua=void 0;function Va(a,b){function c(k){k=b(k);if(k.length!==e.length)throw new Ua("Mismatched type converter count");for(var h=0;h>2])}function $a(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a} +function cb(a,b){switch(b){case 2:return function(c){return this.fromWireType(wa[c>>2])};case 3:return function(c){return this.fromWireType(xa[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function db(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=Ra(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} +function eb(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function fb(a,b){var c=d;if(void 0===c[a].S){var e=c[a];c[a]=function(){c[a].S.hasOwnProperty(arguments.length)||W("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].S+")!");return c[a].S[arguments.length].apply(this,arguments)};c[a].S=[];c[a].S[e.X]=e}} +function gb(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].S&&void 0!==d[a].S[c])&&W("Cannot register public name '"+a+"' twice"),fb(a,a),d.hasOwnProperty(c)&&W("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].S[c]=b):(d[a]=b,void 0!==c&&(d[a].aa=c))}function hb(a,b){for(var c=[],e=0;e>2)+e]);return c} +function ib(a,b){a=T(a);var c=d["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return H[e>>1]};case 2:return c?function(e){return J[e>>2]}:function(e){return N[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var ob={}; +function pb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function qb(a,b){var c=V[a];void 0===c&&W(b+" has unknown type "+kb(a));return c}var rb={},sb={};function tb(){if(!ub){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in sb)a[b]=sb[b];var c=[];for(b in a)c.push(b+"="+a[b]);ub=c}return ub} +for(var ub,vb=[null,[],[]],wb=Array(256),xb=0;256>xb;++xb)wb[xb]=String.fromCharCode(xb);Oa=wb;Ta=d.BindingError=Sa("BindingError");Ua=d.InternalError=Sa("InternalError");d.count_emval_handles=function(){for(var a=0,b=5;b>g])},T:null})},x:function(a,b){b=T(b);X(a,{name:b,fromWireType:function(c){var e= +Y[c].value;Xa(c);return e},toWireType:function(c,e){return Ya(e)},argPackAdvance:8,readValueFromPointer:Za,T:null})},g:function(a,b,c){c=Na(c);b=T(b);X(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+$a(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:cb(b,c),T:null})},n:function(a,b,c,e,f,g){var l=hb(b,c);a=T(a);f=ib(e,f);gb(a,function(){mb("Cannot call "+a+" due to unbound types", +l)},b-1);Va(l,function(k){var h=[k[0],null].concat(k.slice(1)),n=k=a,p=f,q=h.length;2>q&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,C=!1,m=1;m>>k}}var h=-1!=b.indexOf("unsigned");X(a,{name:b,fromWireType:g,toWireType:function(n,p){if("number"!==typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+$a(p)+'" to '+this.name);if(pf)throw new TypeError('Passing a number "'+$a(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:nb(b, +l,0!==e),T:null})},a:function(a,b,c){function e(g){g>>=2;var l=N;return new f(L,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=T(c);X(a,{name:c,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{Z:!0})},h:function(a,b){b=T(b);var c="std::string"===b;X(a,{name:b,fromWireType:function(e){var f=N[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==G[k]){g=g?na(G,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0), +h+=g;g=k+1}}else{h=Array(f);for(l=0;l=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++n:n=2047>=q?n+ +2:65535>=q?n+3:n+4}return n}:function(){return f.length})(),k=yb(4+l+1);N[k>>2]=l;if(c&&g)oa(f,k+4,l+1);else if(g)for(g=0;g>2],p=l(),q,y=h+4,C=0;C<=n;++C){var m=h+4+C*b;if(C==n||0==p[m>>k])y=e(y,m-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=m+b}Z(h);return q},toWireType:function(h,n){"string"!==typeof n&&W("Cannot pass non-string to C++ string type "+c);var p=g(n),q=yb(4+p+b);N[q>>2]=p>>k;f(n,q+4,p+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Za,T:function(h){Z(h)}})},j:function(a,b){b=T(b);X(a,{$:!0,name:b,argPackAdvance:0,fromWireType:function(){}, +toWireType:function(){}})},u:Xa,z:function(a){if(0===a)return Ya(pb());var b=ob[a];a=void 0===b?T(a):b;return Ya(pb()[a])},o: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",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(qb,d,Ya);rb[b]=f}return f(a,c,e)},s:function(){B()},r:function(a,b,c){G.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=G.length;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>>16);ya(F.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},t:function(a,b){var c=0;tb().forEach(function(e,f){var g=b+c;f=J[a+4*f>>2]=g;for(g=0;g>0]=e.charCodeAt(g);M[f>>0]=0;c+=e.length+1});return 0},v:function(a,b){var c=tb();J[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});J[b>>2]=e;return 0},k:function(a){if(!noExitRuntime&&(la=!0,d.onExit))d.onExit(a);u(a,new ia(a))}, +w:function(){return 0},p:function(){},f:function(a,b,c,e){for(var f=0,g=0;g>2],k=J[b+(8*g+4)>>2],h=0;h>2]=f;return 0},memory:F,q:function(){},table:ka}; +(function(){function a(f){d.asm=f.exports;Q--;d.monitorRunDependencies&&d.monitorRunDependencies(Q);0==Q&&(null!==Fa&&(clearInterval(Fa),Fa=null),R&&(f=R,R=null,f()))}function b(f){a(f.instance)}function c(f){return Ka().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){D("failed to asynchronously prepare wasm: "+g);B(g)})}var e={a:zb};Q++;d.monitorRunDependencies&&d.monitorRunDependencies(Q);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return D("Module.instantiateWasm callback failed with error: "+ +f),!1}(function(){if(E||"function"!==typeof WebAssembly.instantiateStreaming||Ha()||Ga("file://")||"function"!==typeof fetch)return c(b);fetch(S,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){D("wasm streaming compile failed: "+g);D("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})(); +var La=d.___wasm_call_ctors=function(){return(La=d.___wasm_call_ctors=d.asm.A).apply(null,arguments)},yb=d._malloc=function(){return(yb=d._malloc=d.asm.B).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.C).apply(null,arguments)},lb=d.___getTypeName=function(){return(lb=d.___getTypeName=d.asm.D).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.E).apply(null,arguments)}; +d.dynCall_iii=function(){return(d.dynCall_iii=d.asm.F).apply(null,arguments)};d.dynCall_vii=function(){return(d.dynCall_vii=d.asm.G).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.H).apply(null,arguments)};d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.I).apply(null,arguments)};d.dynCall_iiiiii=function(){return(d.dynCall_iiiiii=d.asm.J).apply(null,arguments)};d.dynCall_iiiiiii=function(){return(d.dynCall_iiiiiii=d.asm.K).apply(null,arguments)}; +d.dynCall_iiiii=function(){return(d.dynCall_iiiii=d.asm.L).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.M).apply(null,arguments)};d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.N).apply(null,arguments)};d.dynCall_viiii=function(){return(d.dynCall_viiii=d.asm.O).apply(null,arguments)};d.dynCall_viiiiiii=function(){return(d.dynCall_viiiiiii=d.asm.P).apply(null,arguments)};d.dynCall_jiji=function(){return(d.dynCall_jiji=d.asm.Q).apply(null,arguments)}; +d.dynCall_viiiiii=function(){return(d.dynCall_viiiiii=d.asm.R).apply(null,arguments)};var Ab;function ia(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}R=function Bb(){Ab||Cb();Ab||(R=Bb)}; +function Cb(){function a(){if(!Ab&&(Ab=!0,d.calledRun=!0,!la)){O(Ba);O(Ca);aa(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();Da.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
r=$0iv=Lp&ZaTqAyrHJB1r;>R2kn&K!k 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%0Dk4dot8UnR_k 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 YUQJ%tKwYmg{uku}3pPB#)>^Os2J`p_GXMYp literal 0 HcmV?d00001 diff --git a/codecs/mozjpeg_enc/example.html b/codecs/mozjpeg/enc/example.html similarity index 100% rename from codecs/mozjpeg_enc/example.html rename to codecs/mozjpeg/enc/example.html diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.cpp b/codecs/mozjpeg/enc/mozjpeg_enc.cpp similarity index 92% rename from codecs/mozjpeg_enc/mozjpeg_enc.cpp rename to codecs/mozjpeg/enc/mozjpeg_enc.cpp index 27388587..719094dd 100644 --- a/codecs/mozjpeg_enc/mozjpeg_enc.cpp +++ b/codecs/mozjpeg/enc/mozjpeg_enc.cpp @@ -14,12 +14,6 @@ extern "C" { using namespace emscripten; -// MozJPEG doesn’t expose a numeric version, so I have to do some fun C macro -// hackery to turn it into a string. More details here: -// https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html -#define xstr(s) str(s) -#define str(s) #s - struct MozJpegOptions { int quality; bool baseline; @@ -39,22 +33,6 @@ struct MozJpegOptions { int chroma_quality; }; -int version() { - char buffer[] = xstr(MOZJPEG_VERSION); - int version = 0; - int last_index = 0; - for (int i = 0; i < strlen(buffer); i++) { - if (buffer[i] == '.') { - buffer[i] = '\0'; - version = version << 8 | atoi(&buffer[last_index]); - buffer[i] = '.'; - last_index = i + 1; - } - } - version = version << 8 | atoi(&buffer[last_index]); - return version; -} - thread_local const val Uint8Array = val::global("Uint8Array"); val encode(std::string image_in, int image_width, int image_height, MozJpegOptions opts) { @@ -228,6 +206,5 @@ EMSCRIPTEN_BINDINGS(my_module) { .field("separate_chroma_quality", &MozJpegOptions::separate_chroma_quality) .field("chroma_quality", &MozJpegOptions::chroma_quality); - function("version", &version); function("encode", &encode); } diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.d.ts b/codecs/mozjpeg/enc/mozjpeg_enc.d.ts similarity index 100% rename from codecs/mozjpeg_enc/mozjpeg_enc.d.ts rename to codecs/mozjpeg/enc/mozjpeg_enc.d.ts diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.js b/codecs/mozjpeg/enc/mozjpeg_enc.js similarity index 58% rename from codecs/mozjpeg_enc/mozjpeg_enc.js rename to codecs/mozjpeg/enc/mozjpeg_enc.js index 7c6d20f6..ff106f8a 100644 --- a/codecs/mozjpeg_enc/mozjpeg_enc.js +++ b/codecs/mozjpeg/enc/mozjpeg_enc.js @@ -7,56 +7,56 @@ function(mozjpeg_enc) { mozjpeg_enc = mozjpeg_enc || {}; -var d;d||(d=typeof mozjpeg_enc !== 'undefined' ? mozjpeg_enc : {});var aa;d.ready=new Promise(function(a){aa=a});var r={},t;for(t in d)d.hasOwnProperty(t)&&(r[t]=d[t]);var ba="./this.program";function u(a,b){throw b;}var v=!1,w=!1,ca=!1,da=!1;v="object"===typeof window;w="function"===typeof importScripts;ca="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;da=!v&&!ca&&!w;var x="",B,C,ea,fa; -if(ca)x=w?require("path").dirname(x)+"/":__dirname+"/",B=function(a,b){ea||(ea=require("fs"));fa||(fa=require("path"));a=fa.normalize(a);return ea.readFileSync(a,b?null:"utf8")},C=function(a){a=B(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||D("Assertion failed: undefined");return a},1=e);)++c;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 oa(a,b,c){var e=I;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var pa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; -function qa(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&ra[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function sa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;J[b>>1]=0;return b-e}function ta(a){return 2*a.length} -function ua(a,b){for(var c=0,e="";!(c>=b/4);){var f=K[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function va(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}K[b>>2]=g;b+=4;if(b+4>c)break}K[b>>2]=0;return b-e} -function wa(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}var L,M,I,J,ra,K,N,xa,ya;function za(a){L=a;d.HEAP8=M=new Int8Array(a);d.HEAP16=J=new Int16Array(a);d.HEAP32=K=new Int32Array(a);d.HEAPU8=I=new Uint8Array(a);d.HEAPU16=ra=new Uint16Array(a);d.HEAPU32=N=new Uint32Array(a);d.HEAPF32=xa=new Float32Array(a);d.HEAPF64=ya=new Float64Array(a)}var Aa=d.INITIAL_MEMORY||16777216;d.wasmMemory?H=d.wasmMemory:H=new WebAssembly.Memory({initial:Aa/65536,maximum:32768}); -H&&(L=H.buffer);Aa=L.byteLength;za(L);K[22876]=5334544;function Ba(a){for(;0>2])}var R={},S={},Sa={};function Ta(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function Ua(a,b){a=Ta(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)} -function Va(a){var b=Error,c=Ua(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});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 Wa=void 0; -function Xa(a,b,c){function e(k){k=c(k);if(k.length!==a.length)throw new Wa("Mismatched type converter count");for(var h=0;h>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=Ua(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){var c=d;if(void 0===c[a].Y){var e=c[a];c[a]=function(){c[a].Y.hasOwnProperty(arguments.length)||V("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].Y+")!");return c[a].Y[arguments.length].apply(this,arguments)};c[a].Y=[];c[a].Y[e.ea]=e}} -function hb(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].Y&&void 0!==d[a].Y[c])&&V("Cannot register public name '"+a+"' twice"),gb(a,a),d.hasOwnProperty(c)&&V("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].Y[c]=b):(d[a]=b,void 0!==c&&(d[a].ra=c))}function ib(a,b){for(var c=[],e=0;e>2)+e]);return c} -function Y(a,b){a=U(a);var c=d["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return ra[e>>1]};case 2:return c?function(e){return K[e>>2]}:function(e){return N[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var ob={}; -function pb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function qb(a,b){var c=S[a];void 0===c&&V(b+" has unknown type "+kb(a));return c}var rb={},sb={};function tb(){if(!ub){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ba||"./this.program"},b;for(b in sb)a[b]=sb[b];var c=[];for(b in a)c.push(b+"="+a[b]);ub=c}return ub} -var ub,vb=[null,[],[]];Wa=d.InternalError=Va("InternalError");for(var wb=Array(256),xb=0;256>xb;++xb)wb[xb]=String.fromCharCode(xb);Za=wb;$a=d.BindingError=Va("BindingError");d.count_emval_handles=function(){for(var a=0,b=5;b>g])},Z:null})},w:function(a,b){b=U(b);T(a,{name:b,fromWireType:function(c){var e=X[c].value;bb(c);return e},toWireType:function(c,e){return cb(e)},argPackAdvance:8,readValueFromPointer:Ra,Z:null})},h:function(a,b,c){c=Ya(c);b=U(b);T(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+db(f)+ -'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:eb(b,c),Z:null})},e:function(a,b,c,e,f,g){var l=ib(b,c);a=U(a);f=Y(e,f);hb(a,function(){mb("Cannot call "+a+" due to unbound types",l)},b-1);Xa([],l,function(k){var h=[k[0],null].concat(k.slice(1)),m=k=a,n=f,q=h.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,z=!1,p=1;p=e);)++c;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 pa(a,b,c){var e=I;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var qa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; +function ra(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&sa[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function ta(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;J[b>>1]=0;return b-e}function ua(a){return 2*a.length} +function va(a,b){for(var c=0,e="";!(c>=b/4);){var f=K[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function wa(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}K[b>>2]=g;b+=4;if(b+4>c)break}K[b>>2]=0;return b-e} +function xa(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}var L,M,I,J,sa,K,N,ya,za;function Aa(a){L=a;d.HEAP8=M=new Int8Array(a);d.HEAP16=J=new Int16Array(a);d.HEAP32=K=new Int32Array(a);d.HEAPU8=I=new Uint8Array(a);d.HEAPU16=sa=new Uint16Array(a);d.HEAPU32=N=new Uint32Array(a);d.HEAPF32=ya=new Float32Array(a);d.HEAPF64=za=new Float64Array(a)}var Ba=d.INITIAL_MEMORY||16777216;d.wasmMemory?H=d.wasmMemory:H=new WebAssembly.Memory({initial:Ba/65536,maximum:32768}); +H&&(L=H.buffer);Ba=L.byteLength;Aa(L);K[22876]=5334544;function Ca(a){for(;0>2])}var R={},S={},Ta={};function Ua(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function Va(a,b){a=Ua(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)} +function Wa(a){var b=Error,c=Va(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}var Xa=void 0; +function Ya(a,b,c){function e(k){k=c(k);if(k.length!==a.length)throw new Xa("Mismatched type converter count");for(var h=0;h>2])};case 3:return function(c){return this.fromWireType(za[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function gb(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=Va(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} +function hb(a,b){var c=d;if(void 0===c[a].Y){var e=c[a];c[a]=function(){c[a].Y.hasOwnProperty(arguments.length)||V("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].Y+")!");return c[a].Y[arguments.length].apply(this,arguments)};c[a].Y=[];c[a].Y[e.ea]=e}} +function ib(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].Y&&void 0!==d[a].Y[c])&&V("Cannot register public name '"+a+"' twice"),hb(a,a),d.hasOwnProperty(c)&&V("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].Y[c]=b):(d[a]=b,void 0!==c&&(d[a].ra=c))}function jb(a,b){for(var c=[],e=0;e>2)+e]);return c} +function Y(a,b){a=U(a);var c=d["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return sa[e>>1]};case 2:return c?function(e){return K[e>>2]}:function(e){return N[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var pb={}; +function qb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function rb(a,b){var c=S[a];void 0===c&&V(b+" has unknown type "+lb(a));return c}var sb={},tb={};function ub(){if(!vb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in tb)a[b]=tb[b];var c=[];for(b in a)c.push(b+"="+a[b]);vb=c}return vb} +var vb,wb=[null,[],[]];Xa=d.InternalError=Wa("InternalError");for(var xb=Array(256),yb=0;256>yb;++yb)xb[yb]=String.fromCharCode(yb);$a=xb;ab=d.BindingError=Wa("BindingError");d.count_emval_handles=function(){for(var a=0,b=5;b>g])},Z:null})},w:function(a,b){b=U(b);T(a,{name:b,fromWireType:function(c){var e=X[c].value;cb(c);return e},toWireType:function(c,e){return db(e)},argPackAdvance:8,readValueFromPointer:Sa,Z:null})},h:function(a,b,c){c=Za(c);b=U(b);T(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+eb(f)+ +'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:fb(b,c),Z:null})},e:function(a,b,c,e,f,g){var l=jb(b,c);a=U(a);f=Y(e,f);ib(a,function(){nb("Cannot call "+a+" due to unbound types",l)},b-1);Ya([],l,function(k){var h=[k[0],null].concat(k.slice(1)),m=k=a,n=f,q=h.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,z=!1,p=1;p>>k}}var h=-1!=b.indexOf("unsigned");T(a,{name:b,fromWireType:g,toWireType:function(m,n){if("number"!==typeof n&&"boolean"!==typeof n)throw new TypeError('Cannot convert "'+db(n)+ -'" to '+this.name);if(nf)throw new TypeError('Passing a number "'+db(n)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?n>>>0:n|0},argPackAdvance:8,readValueFromPointer:nb(b,l,0!==e),Z:null})},a:function(a,b,c){function e(g){g>>=2;var l=N;return new f(L,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=U(c);T(a,{name:c,fromWireType:e,argPackAdvance:8, -readValueFromPointer:e},{ka:!0})},i:function(a,b){b=U(b);var c="std::string"===b;T(a,{name:b,fromWireType:function(e){var f=N[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(0==I[k]||l==f){g=g?na(I,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;g=k+1}}else{h=Array(f);for(l=0;l=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++n)&1023);127>=q?++m:m=2047>=q?m+2:65535>=q?m+3:m+4}return m}:function(){return f.length})(),k=yb(4+l+1);N[k>>2]=l;if(c&&g)oa(f,k+4,l+1);else if(g)for(g=0;g>2],n=l(),q,y=h+4,z=0;z<=m;++z){var p=h+4+z*b;if(0==n[p>>k]||z==m)y=e(y,p-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=p+b}Z(h);return q},toWireType:function(h, -m){"string"!==typeof m&&V("Cannot pass non-string to C++ string type "+c);var n=g(m),q=yb(4+n+b);N[q>>2]=n>>k;f(m,q+4,n+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Ra,Z:function(h){Z(h)}})},m:function(a,b,c,e,f,g){Pa[a]={name:U(b),la:Y(c,e),ma:Y(f,g),da:[]}},f:function(a,b,c,e,f,g,l,k,h,m){Pa[a].da.push({fa:U(b),ja:c,ha:Y(e,f),ia:g,oa:l,na:Y(k,h),pa:m})},y:function(a,b){b=U(b);T(a,{qa:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},v:bb, -B:function(a){if(0===a)return cb(pb());var b=ob[a];a=void 0===b?U(a):b;return cb(pb()[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",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(qb,d,cb);rb[b]=f}return f(a,c,e)},r:function(){D()},q:function(a,b,c){I.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=I.length;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>>16);za(H.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},s:function(a,b){var c=0;tb().forEach(function(e,f){var g=b+c;f=K[a+4*f>>2]=g;for(g=0;g>0]=e.charCodeAt(g);M[f>>0]=0;c+=e.length+1});return 0},t:function(a,b){var c=tb();K[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});K[b>>2]=e;return 0},z:function(a){if(!noExitRuntime&&(la=!0,d.onExit))d.onExit(a);u(a,new ha(a))},u:function(){return 0},o:function(){},g:function(a, -b,c,e){for(var f=0,g=0;g>2],k=K[b+(8*g+4)>>2],h=0;h>2]=f;return 0},memory:H,p:function(){},table:ja}; -(function(){function a(f){d.asm=f.exports;O--;d.monitorRunDependencies&&d.monitorRunDependencies(O);0==O&&(null!==Ha&&(clearInterval(Ha),Ha=null),P&&(f=P,P=null,f()))}function b(f){a(f.instance)}function c(f){return Ma().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){E("failed to asynchronously prepare wasm: "+g);D(g)})}var e={a:zb};O++;d.monitorRunDependencies&&d.monitorRunDependencies(O);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return E("Module.instantiateWasm callback failed with error: "+ -f),!1}(function(){if(G||"function"!==typeof WebAssembly.instantiateStreaming||Ja()||Ia("file://")||"function"!==typeof fetch)return c(b);fetch(Q,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){E("wasm streaming compile failed: "+g);E("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})(); -var Na=d.___wasm_call_ctors=function(){return(Na=d.___wasm_call_ctors=d.asm.D).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.E).apply(null,arguments)},yb=d._malloc=function(){return(yb=d._malloc=d.asm.F).apply(null,arguments)},lb=d.___getTypeName=function(){return(lb=d.___getTypeName=d.asm.G).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.H).apply(null,arguments)}; +A.push(m+"}\n");h=gb(A).apply(null,n);p=b-1;if(!d.hasOwnProperty(k))throw new Xa("Replacing nonexistant public symbol");void 0!==d[k].Y&&void 0!==p?d[k].Y[p]=h:(d[k]=h,d[k].ea=p);return[]})},b:function(a,b,c,e,f){function g(m){return m}b=U(b);-1===f&&(f=4294967295);var l=Za(c);if(0===e){var k=32-8*c;g=function(m){return m<>>k}}var h=-1!=b.indexOf("unsigned");T(a,{name:b,fromWireType:g,toWireType:function(m,n){if("number"!==typeof n&&"boolean"!==typeof n)throw new TypeError('Cannot convert "'+eb(n)+ +'" to '+this.name);if(nf)throw new TypeError('Passing a number "'+eb(n)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?n>>>0:n|0},argPackAdvance:8,readValueFromPointer:ob(b,l,0!==e),Z:null})},a:function(a,b,c){function e(g){g>>=2;var l=N;return new f(L,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=U(c);T(a,{name:c,fromWireType:e,argPackAdvance:8, +readValueFromPointer:e},{ka:!0})},i:function(a,b){b=U(b);var c="std::string"===b;T(a,{name:b,fromWireType:function(e){var f=N[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==I[k]){g=g?oa(I,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;g=k+1}}else{h=Array(f);for(l=0;l=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++n)&1023);127>=q?++m:m=2047>=q?m+2:65535>=q?m+3:m+4}return m}:function(){return f.length})(),k=zb(4+l+1);N[k>>2]=l;if(c&&g)pa(f,k+4,l+1);else if(g)for(g=0;g>2],n=l(),q,y=h+4,z=0;z<=m;++z){var p=h+4+z*b;if(z==m||0==n[p>>k])y=e(y,p-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=p+b}Z(h);return q},toWireType:function(h, +m){"string"!==typeof m&&V("Cannot pass non-string to C++ string type "+c);var n=g(m),q=zb(4+n+b);N[q>>2]=n>>k;f(m,q+4,n+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Sa,Z:function(h){Z(h)}})},m:function(a,b,c,e,f,g){Qa[a]={name:U(b),la:Y(c,e),ma:Y(f,g),da:[]}},f:function(a,b,c,e,f,g,l,k,h,m){Qa[a].da.push({fa:U(b),ja:c,ha:Y(e,f),ia:g,oa:l,na:Y(k,h),pa:m})},y:function(a,b){b=U(b);T(a,{qa:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},v:cb, +B:function(a){if(0===a)return db(qb());var b=pb[a];a=void 0===b?U(a):b;return db(qb()[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",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(rb,d,db);sb[b]=f}return f(a,c,e)},r:function(){D()},q:function(a,b,c){I.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=I.length;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>>16);Aa(H.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},s:function(a,b){var c=0;ub().forEach(function(e,f){var g=b+c;f=K[a+4*f>>2]=g;for(g=0;g>0]=e.charCodeAt(g);M[f>>0]=0;c+=e.length+1});return 0},t:function(a,b){var c=ub();K[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});K[b>>2]=e;return 0},z:function(a){if(!noExitRuntime&&(ma=!0,d.onExit))d.onExit(a);u(a,new ia(a))},u:function(){return 0},o:function(){},g:function(a, +b,c,e){for(var f=0,g=0;g>2],k=K[b+(8*g+4)>>2],h=0;h>2]=f;return 0},memory:H,p:function(){},table:la}; +(function(){function a(f){d.asm=f.exports;O--;d.monitorRunDependencies&&d.monitorRunDependencies(O);0==O&&(null!==Ia&&(clearInterval(Ia),Ia=null),P&&(f=P,P=null,f()))}function b(f){a(f.instance)}function c(f){return Na().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){E("failed to asynchronously prepare wasm: "+g);D(g)})}var e={a:Ab};O++;d.monitorRunDependencies&&d.monitorRunDependencies(O);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return E("Module.instantiateWasm callback failed with error: "+ +f),!1}(function(){if(G||"function"!==typeof WebAssembly.instantiateStreaming||Ka()||Ja("file://")||"function"!==typeof fetch)return c(b);fetch(Q,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){E("wasm streaming compile failed: "+g);E("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})(); +var Oa=d.___wasm_call_ctors=function(){return(Oa=d.___wasm_call_ctors=d.asm.D).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.E).apply(null,arguments)},zb=d._malloc=function(){return(zb=d._malloc=d.asm.F).apply(null,arguments)},mb=d.___getTypeName=function(){return(mb=d.___getTypeName=d.asm.G).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.H).apply(null,arguments)}; d.dynCall_i=function(){return(d.dynCall_i=d.asm.I).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.J).apply(null,arguments)};d.dynCall_iii=function(){return(d.dynCall_iii=d.asm.K).apply(null,arguments)};d.dynCall_viii=function(){return(d.dynCall_viii=d.asm.L).apply(null,arguments)};d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.M).apply(null,arguments)};d.dynCall_iiiiii=function(){return(d.dynCall_iiiiii=d.asm.N).apply(null,arguments)}; d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.O).apply(null,arguments)};d.dynCall_vii=function(){return(d.dynCall_vii=d.asm.P).apply(null,arguments)};d.dynCall_iiiiiii=function(){return(d.dynCall_iiiiiii=d.asm.Q).apply(null,arguments)};d.dynCall_iiiii=function(){return(d.dynCall_iiiii=d.asm.R).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.S).apply(null,arguments)};d.dynCall_viiiiiiii=function(){return(d.dynCall_viiiiiiii=d.asm.T).apply(null,arguments)}; -d.dynCall_viiii=function(){return(d.dynCall_viiii=d.asm.U).apply(null,arguments)};d.dynCall_viiiiiii=function(){return(d.dynCall_viiiiiii=d.asm.V).apply(null,arguments)};d.dynCall_jiji=function(){return(d.dynCall_jiji=d.asm.W).apply(null,arguments)};d.dynCall_viiiiii=function(){return(d.dynCall_viiiiii=d.asm.X).apply(null,arguments)};var Ab;function ha(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}P=function Bb(){Ab||Cb();Ab||(P=Bb)}; -function Cb(){function a(){if(!Ab&&(Ab=!0,d.calledRun=!0,!la)){Ba(Da);Ba(Ea);aa(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();Fa.unshift(b)}Ba(Fa)}}if(!(0NIJj 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 bOU_-o?7ZbGR-UhWF8aWl-iagYWxM;oQ7b<) delta 8244 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 N`LpUxY{{RUIATa;{ diff --git a/codecs/mozjpeg_enc/package-lock.json b/codecs/mozjpeg/package-lock.json similarity index 100% rename from codecs/mozjpeg_enc/package-lock.json rename to codecs/mozjpeg/package-lock.json diff --git a/codecs/mozjpeg_enc/package.json b/codecs/mozjpeg/package.json similarity index 100% rename from codecs/mozjpeg_enc/package.json rename to codecs/mozjpeg/package.json From 6b007a02352118e2769235f7ac2b2b67a32b109d Mon Sep 17 00:00:00 2001 From: Surma Date: Fri, 21 Aug 2020 16:33:58 +0100 Subject: [PATCH 2/7] Update paths for Squoosh PWA --- src/codecs/mozjpeg/encoder.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codecs/mozjpeg/encoder.ts b/src/codecs/mozjpeg/encoder.ts index c6390f06..78557937 100644 --- a/src/codecs/mozjpeg/encoder.ts +++ b/src/codecs/mozjpeg/encoder.ts @@ -1,5 +1,5 @@ -import mozjpeg_enc, { MozJPEGModule } from '../../../codecs/mozjpeg_enc/mozjpeg_enc'; -import wasmUrl from '../../../codecs/mozjpeg_enc/mozjpeg_enc.wasm'; +import mozjpeg_enc, { MozJPEGModule } from '../../../codecs/mozjpeg/enc/mozjpeg_enc'; +import wasmUrl from '../../../codecs/mozjpeg/enc/mozjpeg_enc.wasm'; import { EncodeOptions } from './encoder-meta'; import { initEmscriptenModule } from '../util'; From 4e090ea2f8b2ede915e2413a1fa37371bc784cc4 Mon Sep 17 00:00:00 2001 From: Surma Date: Fri, 21 Aug 2020 16:43:36 +0100 Subject: [PATCH 3/7] Remove unnecessary includes --- codecs/mozjpeg/dec/mozjpeg_dec.cpp | 5 ----- codecs/mozjpeg/enc/mozjpeg_enc.cpp | 5 ----- codecs/mozjpeg/enc/mozjpeg_enc.js | 22 +++++++++++----------- codecs/mozjpeg/enc/mozjpeg_enc.wasm | Bin 217878 -> 217513 bytes 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.cpp b/codecs/mozjpeg/dec/mozjpeg_dec.cpp index f350d779..882cf7ad 100644 --- a/codecs/mozjpeg/dec/mozjpeg_dec.cpp +++ b/codecs/mozjpeg/dec/mozjpeg_dec.cpp @@ -1,10 +1,5 @@ #include #include -#include -#include -#include -#include -#include #include "config.h" #include "jpeglib.h" diff --git a/codecs/mozjpeg/enc/mozjpeg_enc.cpp b/codecs/mozjpeg/enc/mozjpeg_enc.cpp index 719094dd..cb4419cb 100644 --- a/codecs/mozjpeg/enc/mozjpeg_enc.cpp +++ b/codecs/mozjpeg/enc/mozjpeg_enc.cpp @@ -1,10 +1,5 @@ #include #include -#include -#include -#include -#include -#include #include "config.h" #include "jpeglib.h" diff --git a/codecs/mozjpeg/enc/mozjpeg_enc.js b/codecs/mozjpeg/enc/mozjpeg_enc.js index ff106f8a..c3c6355c 100644 --- a/codecs/mozjpeg/enc/mozjpeg_enc.js +++ b/codecs/mozjpeg/enc/mozjpeg_enc.js @@ -11,13 +11,13 @@ var d;d||(d=typeof mozjpeg_enc !== 'undefined' ? mozjpeg_enc : {});var aa,ba;d.r if(da)x=w?require("path").dirname(x)+"/":__dirname+"/",B=function(a,b){fa||(fa=require("fs"));ha||(ha=require("path"));a=ha.normalize(a);return fa.readFileSync(a,b?null:"utf8")},C=function(a){a=B(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||D("Assertion failed: undefined");return a},1=e);)++c;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 pa(a,b,c){var e=I;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var qa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; function ra(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&sa[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function ta(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;J[b>>1]=0;return b-e}function ua(a){return 2*a.length} function va(a,b){for(var c=0,e="";!(c>=b/4);){var f=K[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function wa(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}K[b>>2]=g;b+=4;if(b+4>c)break}K[b>>2]=0;return b-e} function xa(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}var L,M,I,J,sa,K,N,ya,za;function Aa(a){L=a;d.HEAP8=M=new Int8Array(a);d.HEAP16=J=new Int16Array(a);d.HEAP32=K=new Int32Array(a);d.HEAPU8=I=new Uint8Array(a);d.HEAPU16=sa=new Uint16Array(a);d.HEAPU32=N=new Uint32Array(a);d.HEAPF32=ya=new Float32Array(a);d.HEAPF64=za=new Float64Array(a)}var Ba=d.INITIAL_MEMORY||16777216;d.wasmMemory?H=d.wasmMemory:H=new WebAssembly.Memory({initial:Ba/65536,maximum:32768}); -H&&(L=H.buffer);Ba=L.byteLength;Aa(L);K[22876]=5334544;function Ca(a){for(;0>2])}var R={},S={},Ta={};function Ua(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function Va(a,b){a=Ua(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)} @@ -33,27 +33,27 @@ function Y(a,b){a=U(a);var c=d["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return sa[e>>1]};case 2:return c?function(e){return K[e>>2]}:function(e){return N[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var pb={}; function qb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function rb(a,b){var c=S[a];void 0===c&&V(b+" has unknown type "+lb(a));return c}var sb={},tb={};function ub(){if(!vb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in tb)a[b]=tb[b];var c=[];for(b in a)c.push(b+"="+a[b]);vb=c}return vb} var vb,wb=[null,[],[]];Xa=d.InternalError=Wa("InternalError");for(var xb=Array(256),yb=0;256>yb;++yb)xb[yb]=String.fromCharCode(yb);$a=xb;ab=d.BindingError=Wa("BindingError");d.count_emval_handles=function(){for(var a=0,b=5;b>g])},Z:null})},w:function(a,b){b=U(b);T(a,{name:b,fromWireType:function(c){var e=X[c].value;cb(c);return e},toWireType:function(c,e){return db(e)},argPackAdvance:8,readValueFromPointer:Sa,Z:null})},h:function(a,b,c){c=Za(c);b=U(b);T(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+eb(f)+ -'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:fb(b,c),Z:null})},e:function(a,b,c,e,f,g){var l=jb(b,c);a=U(a);f=Y(e,f);ib(a,function(){nb("Cannot call "+a+" due to unbound types",l)},b-1);Ya([],l,function(k){var h=[k[0],null].concat(k.slice(1)),m=k=a,n=f,q=h.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,z=!1,p=1;p>g])},Z:null})},w:function(a,b){b=U(b);T(a,{name:b,fromWireType:function(c){var e=X[c].value;cb(c);return e},toWireType:function(c,e){return db(e)},argPackAdvance:8,readValueFromPointer:Sa,Z:null})},g:function(a,b,c){c=Za(c);b=U(b);T(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+eb(f)+ +'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:fb(b,c),Z:null})},k:function(a,b,c,e,f,g){var l=jb(b,c);a=U(a);f=Y(e,f);ib(a,function(){nb("Cannot call "+a+" due to unbound types",l)},b-1);Ya([],l,function(k){var h=[k[0],null].concat(k.slice(1)),m=k=a,n=f,q=h.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,z=!1,p=1;p>>k}}var h=-1!=b.indexOf("unsigned");T(a,{name:b,fromWireType:g,toWireType:function(m,n){if("number"!==typeof n&&"boolean"!==typeof n)throw new TypeError('Cannot convert "'+eb(n)+ '" to '+this.name);if(nf)throw new TypeError('Passing a number "'+eb(n)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?n>>>0:n|0},argPackAdvance:8,readValueFromPointer:ob(b,l,0!==e),Z:null})},a:function(a,b,c){function e(g){g>>=2;var l=N;return new f(L,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=U(c);T(a,{name:c,fromWireType:e,argPackAdvance:8, -readValueFromPointer:e},{ka:!0})},i:function(a,b){b=U(b);var c="std::string"===b;T(a,{name:b,fromWireType:function(e){var f=N[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==I[k]){g=g?oa(I,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;g=k+1}}else{h=Array(f);for(l=0;l>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==I[k]){g=g?oa(I,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;g=k+1}}else{h=Array(f);for(l=0;l=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++n)&1023);127>=q?++m:m=2047>=q?m+2:65535>=q?m+3:m+4}return m}:function(){return f.length})(),k=zb(4+l+1);N[k>>2]=l;if(c&&g)pa(f,k+4,l+1);else if(g)for(g=0;g>2],n=l(),q,y=h+4,z=0;z<=m;++z){var p=h+4+z*b;if(z==m||0==n[p>>k])y=e(y,p-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=p+b}Z(h);return q},toWireType:function(h, -m){"string"!==typeof m&&V("Cannot pass non-string to C++ string type "+c);var n=g(m),q=zb(4+n+b);N[q>>2]=n>>k;f(m,q+4,n+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Sa,Z:function(h){Z(h)}})},m:function(a,b,c,e,f,g){Qa[a]={name:U(b),la:Y(c,e),ma:Y(f,g),da:[]}},f:function(a,b,c,e,f,g,l,k,h,m){Qa[a].da.push({fa:U(b),ja:c,ha:Y(e,f),ia:g,oa:l,na:Y(k,h),pa:m})},y:function(a,b){b=U(b);T(a,{qa:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},v:cb, -B:function(a){if(0===a)return db(qb());var b=pb[a];a=void 0===b?U(a):b;return db(qb()[a])},k:function(a){4>> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+ +m){"string"!==typeof m&&V("Cannot pass non-string to C++ string type "+c);var n=g(m),q=zb(4+n+b);N[q>>2]=n>>k;f(m,q+4,n+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Sa,Z:function(h){Z(h)}})},m:function(a,b,c,e,f,g){Qa[a]={name:U(b),la:Y(c,e),ma:Y(f,g),da:[]}},e:function(a,b,c,e,f,g,l,k,h,m){Qa[a].da.push({fa:U(b),ja:c,ha:Y(e,f),ia:g,oa:l,na:Y(k,h),pa:m})},y:function(a,b){b=U(b);T(a,{qa:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},v:cb, +B:function(a){if(0===a)return db(qb());var b=pb[a];a=void 0===b?U(a):b;return db(qb()[a])},j: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",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(rb,d,db);sb[b]=f}return f(a,c,e)},r:function(){D()},q:function(a,b,c){I.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=I.length;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>>16);Aa(H.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},s:function(a,b){var c=0;ub().forEach(function(e,f){var g=b+c;f=K[a+4*f>>2]=g;for(g=0;g>0]=e.charCodeAt(g);M[f>>0]=0;c+=e.length+1});return 0},t:function(a,b){var c=ub();K[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});K[b>>2]=e;return 0},z:function(a){if(!noExitRuntime&&(ma=!0,d.onExit))d.onExit(a);u(a,new ia(a))},u:function(){return 0},o:function(){},g:function(a, +e)-L.byteLength+65535>>>16);Aa(H.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},s:function(a,b){var c=0;ub().forEach(function(e,f){var g=b+c;f=K[a+4*f>>2]=g;for(g=0;g>0]=e.charCodeAt(g);M[f>>0]=0;c+=e.length+1});return 0},t:function(a,b){var c=ub();K[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});K[b>>2]=e;return 0},z:function(a){if(!noExitRuntime&&(ma=!0,d.onExit))d.onExit(a);u(a,new ia(a))},u:function(){return 0},o:function(){},f:function(a, b,c,e){for(var f=0,g=0;g>2],k=K[b+(8*g+4)>>2],h=0;h>2]=f;return 0},memory:H,p:function(){},table:la}; (function(){function a(f){d.asm=f.exports;O--;d.monitorRunDependencies&&d.monitorRunDependencies(O);0==O&&(null!==Ia&&(clearInterval(Ia),Ia=null),P&&(f=P,P=null,f()))}function b(f){a(f.instance)}function c(f){return Na().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){E("failed to asynchronously prepare wasm: "+g);D(g)})}var e={a:Ab};O++;d.monitorRunDependencies&&d.monitorRunDependencies(O);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return E("Module.instantiateWasm callback failed with error: "+ f),!1}(function(){if(G||"function"!==typeof WebAssembly.instantiateStreaming||Ka()||Ja("file://")||"function"!==typeof fetch)return c(b);fetch(Q,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){E("wasm streaming compile failed: "+g);E("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})(); var Oa=d.___wasm_call_ctors=function(){return(Oa=d.___wasm_call_ctors=d.asm.D).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.E).apply(null,arguments)},zb=d._malloc=function(){return(zb=d._malloc=d.asm.F).apply(null,arguments)},mb=d.___getTypeName=function(){return(mb=d.___getTypeName=d.asm.G).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.H).apply(null,arguments)}; -d.dynCall_i=function(){return(d.dynCall_i=d.asm.I).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.J).apply(null,arguments)};d.dynCall_iii=function(){return(d.dynCall_iii=d.asm.K).apply(null,arguments)};d.dynCall_viii=function(){return(d.dynCall_viii=d.asm.L).apply(null,arguments)};d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.M).apply(null,arguments)};d.dynCall_iiiiii=function(){return(d.dynCall_iiiiii=d.asm.N).apply(null,arguments)}; -d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.O).apply(null,arguments)};d.dynCall_vii=function(){return(d.dynCall_vii=d.asm.P).apply(null,arguments)};d.dynCall_iiiiiii=function(){return(d.dynCall_iiiiiii=d.asm.Q).apply(null,arguments)};d.dynCall_iiiii=function(){return(d.dynCall_iiiii=d.asm.R).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.S).apply(null,arguments)};d.dynCall_viiiiiiii=function(){return(d.dynCall_viiiiiiii=d.asm.T).apply(null,arguments)}; +d.dynCall_i=function(){return(d.dynCall_i=d.asm.I).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.J).apply(null,arguments)};d.dynCall_iii=function(){return(d.dynCall_iii=d.asm.K).apply(null,arguments)};d.dynCall_viii=function(){return(d.dynCall_viii=d.asm.L).apply(null,arguments)};d.dynCall_iiiiii=function(){return(d.dynCall_iiiiii=d.asm.M).apply(null,arguments)};d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.N).apply(null,arguments)}; +d.dynCall_vii=function(){return(d.dynCall_vii=d.asm.O).apply(null,arguments)};d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.P).apply(null,arguments)};d.dynCall_iiiiiii=function(){return(d.dynCall_iiiiiii=d.asm.Q).apply(null,arguments)};d.dynCall_iiiii=function(){return(d.dynCall_iiiii=d.asm.R).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.S).apply(null,arguments)};d.dynCall_viiiiiiii=function(){return(d.dynCall_viiiiiiii=d.asm.T).apply(null,arguments)}; d.dynCall_viiii=function(){return(d.dynCall_viiii=d.asm.U).apply(null,arguments)};d.dynCall_viiiiiii=function(){return(d.dynCall_viiiiiii=d.asm.V).apply(null,arguments)};d.dynCall_jiji=function(){return(d.dynCall_jiji=d.asm.W).apply(null,arguments)};d.dynCall_viiiiii=function(){return(d.dynCall_viiiiii=d.asm.X).apply(null,arguments)};var Bb;function ia(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}P=function Cb(){Bb||Db();Bb||(P=Cb)}; function Db(){function a(){if(!Bb&&(Bb=!0,d.calledRun=!0,!ma)){Ca(Ea);Ca(Fa);aa(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();Ga.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 Te2VbjoWUXdj*V-S&wT#}xRNky delta 12952 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 From 8cd811cafd7cdfadb3c493d376827d8ba1e985fe Mon Sep 17 00:00:00 2001 From: Surma Date: Mon, 24 Aug 2020 12:43:12 +0100 Subject: [PATCH 4/7] Review --- codecs/mozjpeg/dec/mozjpeg_dec.cpp | 40 ++++++++++------------------ codecs/mozjpeg/dec/mozjpeg_dec.js | 8 +++--- codecs/mozjpeg/dec/mozjpeg_dec.wasm | Bin 140258 -> 140503 bytes codecs/mozjpeg/enc/mozjpeg_enc.wasm | Bin 217513 -> 217513 bytes 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.cpp b/codecs/mozjpeg/dec/mozjpeg_dec.cpp index 882cf7ad..6c08a9f9 100644 --- a/codecs/mozjpeg/dec/mozjpeg_dec.cpp +++ b/codecs/mozjpeg/dec/mozjpeg_dec.cpp @@ -15,52 +15,40 @@ thread_local const val ImageData = val::global("ImageData"); val decode(std::string image_in) { uint8_t* image_buffer = (uint8_t*)image_in.c_str(); - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - /* Initialize the JPEG decompression object with default error handling. */ + jpeg_decompress_struct cinfo; + jpeg_error_mgr jerr; + // Initialize the JPEG decompression object with default error handling. cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_mem_src(&cinfo, image_buffer, image_in.length()); - /* Read file header, set default decompression parameters */ + // Read file header, set default decompression parameters jpeg_read_header(&cinfo, TRUE); - // Force RGB decoding, even for grayscale images - cinfo.out_color_space = JCS_RGB; + // Force RGBA decoding, even for grayscale images + cinfo.out_color_space = JCS_EXT_RGBA; jpeg_start_decompress(&cinfo); // Prepare output buffer size_t output_size = cinfo.output_width * cinfo.output_height * 4; - auto output_buffer = new uint8_t[output_size]; - uint8_t* row_ptr = &output_buffer[0]; + std::vector output_buffer(output_size); auto stride = cinfo.output_width * 4; - /* Process data */ + // Process data while (cinfo.output_scanline < cinfo.output_height) { - jpeg_read_scanlines(&cinfo, &row_ptr, 1); - // Turn that row from RGB into RGBA. I’m starting at the end so - // I can do it in-place. - for (int32_t x = cinfo.output_width - 1; x >= 0; x--) { - // RGB channels - for (auto i = 0; i < 3; i++) { - row_ptr[x * 4 + i] = row_ptr[x * 3 + i]; - } - // Alpha channel - row_ptr[x * 4 + 3] = 255; - } - row_ptr += stride; + uint8_t* ptr = &output_buffer[stride * cinfo.output_scanline]; + jpeg_read_scanlines(&cinfo, &ptr, 1); } jpeg_finish_decompress(&cinfo); - /* Step 7: release JPEG compression object */ + // Step 7: release JPEG compression object - auto data = Uint8ClampedArray.new_(typed_memory_view(output_size, output_buffer)); + auto data = Uint8ClampedArray.new_(typed_memory_view(output_size, &output_buffer[0])); auto js_result = ImageData.new_(data, cinfo.output_width, cinfo.output_height); - /* This is an important step since it will release a good deal of memory. */ + // This is an important step since it will release a good deal of memory. jpeg_destroy_decompress(&cinfo); - delete[] output_buffer; - /* And we're done! */ + // And we're done! return js_result; } diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.js b/codecs/mozjpeg/dec/mozjpeg_dec.js index aa35869b..463e0cb9 100644 --- a/codecs/mozjpeg/dec/mozjpeg_dec.js +++ b/codecs/mozjpeg/dec/mozjpeg_dec.js @@ -17,7 +17,7 @@ function oa(a,b,c){var e=G;if(0>1;for(var e=c+b/2;!(c>=e)&&H[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function ra(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;I[b>>1]=0;return b-e}function sa(a){return 2*a.length} function ta(a,b){for(var c=0,e="";!(c>=b/4);){var f=J[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function ua(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}J[b>>2]=g;b+=4;if(b+4>c)break}J[b>>2]=0;return b-e} function va(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}var L,M,G,I,H,J,N,wa,xa;function ya(a){L=a;d.HEAP8=M=new Int8Array(a);d.HEAP16=I=new Int16Array(a);d.HEAP32=J=new Int32Array(a);d.HEAPU8=G=new Uint8Array(a);d.HEAPU16=H=new Uint16Array(a);d.HEAPU32=N=new Uint32Array(a);d.HEAPF32=wa=new Float32Array(a);d.HEAPF64=xa=new Float64Array(a)}var za=d.INITIAL_MEMORY||16777216;d.wasmMemory?F=d.wasmMemory:F=new WebAssembly.Memory({initial:za/65536,maximum:32768}); -F&&(L=F.buffer);za=L.byteLength;ya(L);J[3100]=5255440;function O(a){for(;0=b?"_"+a:a} @@ -32,8 +32,8 @@ function ib(a,b){a=T(a);var c=d["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return H[e>>1]};case 2:return c?function(e){return J[e>>2]}:function(e){return N[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var ob={}; function pb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function qb(a,b){var c=V[a];void 0===c&&W(b+" has unknown type "+kb(a));return c}var rb={},sb={};function tb(){if(!ub){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"===typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in sb)a[b]=sb[b];var c=[];for(b in a)c.push(b+"="+a[b]);ub=c}return ub} for(var ub,vb=[null,[],[]],wb=Array(256),xb=0;256>xb;++xb)wb[xb]=String.fromCharCode(xb);Oa=wb;Ta=d.BindingError=Sa("BindingError");Ua=d.InternalError=Sa("InternalError");d.count_emval_handles=function(){for(var a=0,b=5;b>g])},T:null})},x:function(a,b){b=T(b);X(a,{name:b,fromWireType:function(c){var e= -Y[c].value;Xa(c);return e},toWireType:function(c,e){return Ya(e)},argPackAdvance:8,readValueFromPointer:Za,T:null})},g:function(a,b,c){c=Na(c);b=T(b);X(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+$a(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:cb(b,c),T:null})},n:function(a,b,c,e,f,g){var l=hb(b,c);a=T(a);f=ib(e,f);gb(a,function(){mb("Cannot call "+a+" due to unbound types", +var zb={o:function(a){return yb(a)},i:function(){},n:function(a){"uncaught_exception"in Ma?Ma.W++:Ma.W=1;throw a;},y:function(a,b,c,e,f){var g=Na(c);b=T(b);X(a,{name:b,fromWireType:function(l){return!!l},toWireType:function(l,k){return k?e:f},argPackAdvance:8,readValueFromPointer:function(l){if(1===c)var k=M;else if(2===c)k=I;else if(4===c)k=J;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(k[l>>g])},T:null})},x:function(a,b){b=T(b);X(a,{name:b,fromWireType:function(c){var e= +Y[c].value;Xa(c);return e},toWireType:function(c,e){return Ya(e)},argPackAdvance:8,readValueFromPointer:Za,T:null})},g:function(a,b,c){c=Na(c);b=T(b);X(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+$a(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:cb(b,c),T:null})},l:function(a,b,c,e,f,g){var l=hb(b,c);a=T(a);f=ib(e,f);gb(a,function(){mb("Cannot call "+a+" due to unbound types", l)},b-1);Va(l,function(k){var h=[k[0],null].concat(k.slice(1)),n=k=a,p=f,q=h.length;2>q&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,C=!1,m=1;m>=2;var l=N;return new f(L, h+=g;g=k+1}}else{h=Array(f);for(l=0;l=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++n:n=2047>=q?n+ 2:65535>=q?n+3:n+4}return n}:function(){return f.length})(),k=yb(4+l+1);N[k>>2]=l;if(c&&g)oa(f,k+4,l+1);else if(g)for(g=0;g>2],p=l(),q,y=h+4,C=0;C<=n;++C){var m=h+4+C*b;if(C==n||0==p[m>>k])y=e(y,m-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=m+b}Z(h);return q},toWireType:function(h,n){"string"!==typeof n&&W("Cannot pass non-string to C++ string type "+c);var p=g(n),q=yb(4+p+b);N[q>>2]=p>>k;f(n,q+4,p+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Za,T:function(h){Z(h)}})},j:function(a,b){b=T(b);X(a,{$:!0,name:b,argPackAdvance:0,fromWireType:function(){}, -toWireType:function(){}})},u:Xa,z:function(a){if(0===a)return Ya(pb());var b=ob[a];a=void 0===b?T(a):b;return Ya(pb()[a])},o:function(a){4>> 2) + "+g+'], "parameter '+g+ +toWireType:function(){}})},u:Xa,z:function(a){if(0===a)return Ya(pb());var b=ob[a];a=void 0===b?T(a):b;return Ya(pb()[a])},m: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",l+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(qb,d,Ya);rb[b]=f}return f(a,c,e)},s:function(){B()},r:function(a,b,c){G.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=G.length;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>>16);ya(F.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},t:function(a,b){var c=0;tb().forEach(function(e,f){var g=b+c;f=J[a+4*f>>2]=g;for(g=0;g>0]=e.charCodeAt(g);M[f>>0]=0;c+=e.length+1});return 0},v:function(a,b){var c=tb();J[a>>2]=c.length;var e=0;c.forEach(function(f){e+=f.length+1});J[b>>2]=e;return 0},k:function(a){if(!noExitRuntime&&(la=!0,d.onExit))d.onExit(a);u(a,new ia(a))}, w:function(){return 0},p:function(){},f:function(a,b,c,e){for(var f=0,g=0;g>2],k=J[b+(8*g+4)>>2],h=0;h>2]=f;return 0},memory:F,q:function(){},table:ka}; diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.wasm b/codecs/mozjpeg/dec/mozjpeg_dec.wasm index 47eeada20d18e53b779afb9ed0e988e8331042e0..b160d2415dd6a88f980482341551f2ad3cfdcf8e 100644 GIT binary patch delta 7442 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 Df^B#- delta 7297 zcma)A33wDm_ODmnbA+A=&6Sg*XOchyBq1�Tj~VUY7_8ETSk#P#6LUB%*?naK|O9 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 Lr30U0uUz>*r6GCs diff --git a/codecs/mozjpeg/enc/mozjpeg_enc.wasm b/codecs/mozjpeg/enc/mozjpeg_enc.wasm index d213e7febd05e165e908d2160dd04d5b30bda865..b2666522a70abbe67cddaa2dea6c5956bf76bff9 100644 GIT binary patch delta 23 fcmZ3vn0Mu3-i8*&7N#xCN7)%owjX0>e(VVVZ376Y delta 23 fcmZ3vn0Mu3-i8*&7N#xCN7)$-w;y9?e(VVVZ0-oA From 75275a5596d60a53c5c9bc1550d384e9a5de8891 Mon Sep 17 00:00:00 2001 From: Surma Date: Mon, 24 Aug 2020 14:00:38 +0100 Subject: [PATCH 5/7] Update codecs/mozjpeg/dec/mozjpeg_dec.cpp Co-authored-by: Ingvar Stepanyan --- codecs/mozjpeg/dec/mozjpeg_dec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.cpp b/codecs/mozjpeg/dec/mozjpeg_dec.cpp index 6c08a9f9..fc2d9bcb 100644 --- a/codecs/mozjpeg/dec/mozjpeg_dec.cpp +++ b/codecs/mozjpeg/dec/mozjpeg_dec.cpp @@ -42,7 +42,7 @@ val decode(std::string image_in) { // Step 7: release JPEG compression object - auto data = Uint8ClampedArray.new_(typed_memory_view(output_size, &output_buffer[0])); + auto data = Uint8ClampedArray.new_(typed_memory_view(output_buffer.size(), output_buffer.data())); auto js_result = ImageData.new_(data, cinfo.output_width, cinfo.output_height); // This is an important step since it will release a good deal of memory. From ee561bb00efde3740c3d847fedb101bfcbe2bb8e Mon Sep 17 00:00:00 2001 From: Surma Date: Mon, 24 Aug 2020 14:03:44 +0100 Subject: [PATCH 6/7] Allow more than one scanline at a time --- codecs/mozjpeg/dec/mozjpeg_dec.cpp | 2 +- codecs/mozjpeg/dec/mozjpeg_dec.wasm | Bin 140503 -> 140504 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.cpp b/codecs/mozjpeg/dec/mozjpeg_dec.cpp index fc2d9bcb..5e024971 100644 --- a/codecs/mozjpeg/dec/mozjpeg_dec.cpp +++ b/codecs/mozjpeg/dec/mozjpeg_dec.cpp @@ -36,7 +36,7 @@ val decode(std::string image_in) { // Process data while (cinfo.output_scanline < cinfo.output_height) { uint8_t* ptr = &output_buffer[stride * cinfo.output_scanline]; - jpeg_read_scanlines(&cinfo, &ptr, 1); + jpeg_read_scanlines(&cinfo, &ptr, cinfo.output_height); } jpeg_finish_decompress(&cinfo); diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.wasm b/codecs/mozjpeg/dec/mozjpeg_dec.wasm index b160d2415dd6a88f980482341551f2ad3cfdcf8e..2be11264aaaed48e04284d3401fae088b46b0f39 100644 GIT binary patch delta 1237 zcmXw2e@vBC7(UPWzI*Qn-$lQx{7TS$T(291p}281|3E(r1xpHM<=n(67Ie9SBGUxq zX4K{u8G4wvHCI$*^oIr<;}TH(2o@|rBLZ`6ZMv)!#6e7cSnGV3I)6Oxd*1hX-m^XD zoUwl8M!(W<719iyW&u32N`ciHzG`WhLW0YtC{$G~#7c+~3z_LOIc$lQDiX2VW!Yj; zSPqS(ij^IwPO973`!s<@5!Oq$gepQKizQS`q?ptgn>7SJ7`3-LscPG^3dKU2@ZC-NMc`#wr%G zR^qg>rp7h9B|(vNtD7n!Slm?Bi7p9=gAi4h4dSMDQGrP99-W%XdeN307IBO&$D7@F zS_O|=fGN;CF2c*2OC^TZSydG*Ep3GW7oTnIw6MOe&v;9x23FK7;vMd4#3LkHmD?rWQX0bX?dipf~@V;n@w82K3mEasxD1B368z=Uz z9feMf26(g|%*5`dzx-eLP9*WPmYP^cy#_5|9TS^;PB}yP7VL;poJA6wpl!k_i&vPT zEDjW?cyw9o2##r|&S0#gLLWv{^}kbFpzSl&a&SaJoFD}=(|f98ahfLV7sIqmg3R;p z7t7o}-3)efY6DA~(%A4{7jcXi%|u8z&f?});so0=m&k@@vlsX5N#)g@!SxO0D1H2NbV#C@CZjhGK7Tn`3sVE1GAJ{_fg{UAPAddg(%G3a*l zZEEHI!GpMn*8`qhTu?-W7n;leQ8glQ-``S=8o#3&)q!Wvp)ksyc^P{Ht@Wsp1NE0t LxhsH27>)lIlfY`% delta 1189 zcmXYwe@snxfeSqKLm0fF1TSLAsaVVO*|&Qbg-ab&IznQ(F-CWQ3`T1 z(%C{2UgoXViWO#T#l+XRCZzlA#RTogd#Llr=Xsy^`95doe4qEd zI$#?eu$?>&00|x0L#l3;I6@FbwuuswNG)WUQ zPB(dk>WTgq`H69Heds|qx{%n9#IMka^GNK#*Ek3NkEgA7#5r{|5o6-mthC$v0o4=546WFy zM9a^Lp&%z2gGf`?nhA5NI=N_xuJYlwVBXbkwW;QQh10@^+m}B}QbxMPMK&2!7s;Yd zvMrD?yRI0_MGo^<< zVGrLsyOJAob*SV+b1qa0%l)n3gL6Y7=`Sq+dwm)HD1eM#*bxa-`Gy_%djV>^Lm^m! zecpQ^@@DPy9SoIs6&|l&7}hNFm~)JmbF>G`xtT|Zndcx#pARM8%rFf2V#D!WI;y;X zzJw1Ssxf7o3`#Z6oVL%~T!0U--)9u!m`%p3CD5Y1ydFnGTL8sF^A2iGRrTnqMJH|A m`_EA{`l1?88tR*9L8I!eZ^34trxmrC{FMVEK6-$Wn12Dkc4plG From cd33a2f759908d70aaa5536a8aec5eacae45f666 Mon Sep 17 00:00:00 2001 From: Surma Date: Mon, 24 Aug 2020 14:21:35 +0100 Subject: [PATCH 7/7] Fine. Count the lines. --- codecs/mozjpeg/dec/mozjpeg_dec.cpp | 4 +++- codecs/mozjpeg/dec/mozjpeg_dec.wasm | Bin 140504 -> 140515 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.cpp b/codecs/mozjpeg/dec/mozjpeg_dec.cpp index 5e024971..3123bf1a 100644 --- a/codecs/mozjpeg/dec/mozjpeg_dec.cpp +++ b/codecs/mozjpeg/dec/mozjpeg_dec.cpp @@ -34,9 +34,11 @@ val decode(std::string image_in) { auto stride = cinfo.output_width * 4; // Process data + auto buffer_lines_available = cinfo.output_height; while (cinfo.output_scanline < cinfo.output_height) { uint8_t* ptr = &output_buffer[stride * cinfo.output_scanline]; - jpeg_read_scanlines(&cinfo, &ptr, cinfo.output_height); + auto lines_read = jpeg_read_scanlines(&cinfo, &ptr, buffer_lines_available); + buffer_lines_available -= lines_read; } jpeg_finish_decompress(&cinfo); diff --git a/codecs/mozjpeg/dec/mozjpeg_dec.wasm b/codecs/mozjpeg/dec/mozjpeg_dec.wasm index 2be11264aaaed48e04284d3401fae088b46b0f39..e0bdb1fa45edb9173a4bfe368c666afae679fb2d 100644 GIT binary patch delta 165 zcmca{lH>77jt#L)jLe(km|~b1*Kgj*~!h@GFTiL6d5PK-sUBx#Hhfa!PLW; zWdSQMBvn3gapF?zB%fS3!I9GOZK zS($+x1!fH<1_c%c)*PTI914sIOpY5Evw$Q=mI9-|e#UG?ppXXB9wsHIA(aFu*GA6&@<|VAapuyC`m}LeexD{9& z1+r8aHV16qVaC`pne*KaPeuhM4W=bbN-Ul%4j|?NCP$_cMOJ1YM}b*`i9vx;fi(xH kn?r%gaRXx(kmSfxU=i34*0+aA39i4H_x*O>_l(y}0o}SM8UO$Q