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 47eeada2..b160d241 100644 Binary files a/codecs/mozjpeg/dec/mozjpeg_dec.wasm and b/codecs/mozjpeg/dec/mozjpeg_dec.wasm differ diff --git a/codecs/mozjpeg/enc/mozjpeg_enc.wasm b/codecs/mozjpeg/enc/mozjpeg_enc.wasm index d213e7fe..b2666522 100644 Binary files a/codecs/mozjpeg/enc/mozjpeg_enc.wasm and b/codecs/mozjpeg/enc/mozjpeg_enc.wasm differ