From 8cd811cafd7cdfadb3c493d376827d8ba1e985fe Mon Sep 17 00:00:00 2001 From: Surma Date: Mon, 24 Aug 2020 12:43:12 +0100 Subject: [PATCH] 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