From d87eff7645c151c2f4365c2515c71f4e56ed71ca Mon Sep 17 00:00:00 2001 From: Aryan Pingle <49340972+aryanpingle@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:58:59 +0530 Subject: [PATCH] Adding the Quite OK Image (QOI) Codec (#1384) --- codecs/qoi/Makefile | 42 ++++++++++++++++++ codecs/qoi/dec/qoi_dec.cpp | 30 +++++++++++++ codecs/qoi/dec/qoi_dec.d.ts | 7 +++ codecs/qoi/dec/qoi_dec.js | 16 +++++++ codecs/qoi/dec/qoi_dec.wasm | Bin 0 -> 16485 bytes codecs/qoi/enc/qoi_enc.cpp | 36 +++++++++++++++ codecs/qoi/enc/qoi_enc.d.ts | 14 ++++++ codecs/qoi/enc/qoi_enc.js | 16 +++++++ codecs/qoi/enc/qoi_enc.wasm | Bin 0 -> 16577 bytes codecs/qoi/package.json | 7 +++ src/client/lazy-app/Compress/index.tsx | 3 ++ src/client/lazy-app/util/index.ts | 1 + src/features/decoders/qoi/worker/qoiDecode.ts | 19 ++++++++ src/features/encoders/qoi/client/index.tsx | 11 +++++ .../encoders/qoi/client/missing-types.d.ts | 13 ++++++ src/features/encoders/qoi/shared/meta.ts | 19 ++++++++ .../encoders/qoi/shared/missing-types.d.ts | 13 ++++++ .../encoders/qoi/worker/missing-types.d.ts | 13 ++++++ src/features/encoders/qoi/worker/qoiEncode.ts | 35 +++++++++++++++ 19 files changed, 295 insertions(+) create mode 100644 codecs/qoi/Makefile create mode 100644 codecs/qoi/dec/qoi_dec.cpp create mode 100644 codecs/qoi/dec/qoi_dec.d.ts create mode 100644 codecs/qoi/dec/qoi_dec.js create mode 100644 codecs/qoi/dec/qoi_dec.wasm create mode 100644 codecs/qoi/enc/qoi_enc.cpp create mode 100644 codecs/qoi/enc/qoi_enc.d.ts create mode 100644 codecs/qoi/enc/qoi_enc.js create mode 100644 codecs/qoi/enc/qoi_enc.wasm create mode 100644 codecs/qoi/package.json create mode 100644 src/features/decoders/qoi/worker/qoiDecode.ts create mode 100644 src/features/encoders/qoi/client/index.tsx create mode 100644 src/features/encoders/qoi/client/missing-types.d.ts create mode 100644 src/features/encoders/qoi/shared/meta.ts create mode 100644 src/features/encoders/qoi/shared/missing-types.d.ts create mode 100644 src/features/encoders/qoi/worker/missing-types.d.ts create mode 100644 src/features/encoders/qoi/worker/qoiEncode.ts diff --git a/codecs/qoi/Makefile b/codecs/qoi/Makefile new file mode 100644 index 00000000..c93dbde1 --- /dev/null +++ b/codecs/qoi/Makefile @@ -0,0 +1,42 @@ +CODEC_URL = https://github.com/phoboslab/qoi/archive/8d35d93cdca85d2868246c2a8a80a1e2c16ba2a8.tar.gz + +CODEC_DIR = node_modules/qoi +CODEC_BUILD_DIR:= $(CODEC_DIR)/build +ENVIRONMENT = worker + +OUT_JS = enc/qoi_enc.js dec/qoi_dec.js +OUT_WASM := $(OUT_JS:.js=.wasm) + +.PHONY: all clean + +all: $(OUT_JS) + +$(filter enc/%,$(OUT_JS)): enc/qoi_enc.o +$(filter dec/%,$(OUT_JS)): dec/qoi_dec.o + +# ALL .js FILES +$(OUT_JS): + $(LD) \ + $(LDFLAGS) \ + --bind \ + -s ENVIRONMENT=$(ENVIRONMENT) \ + -s EXPORT_ES6=1 \ + -o $@ \ + $+ + +# ALL .o FILES +%.o: %.cpp $(CODEC_DIR) + $(CXX) -c \ + $(CXXFLAGS) \ + -I $(CODEC_DIR) \ + -o $@ \ + $< + +# CREATE DIRECTORY +$(CODEC_DIR): + mkdir -p $(CODEC_DIR) + curl -sL $(CODEC_URL) | tar xz --strip 1 -C $(CODEC_DIR) + +clean: + $(RM) $(OUT_JS) $(OUT_WASM) + $(MAKE) -C $(CODEC_DIR) clean diff --git a/codecs/qoi/dec/qoi_dec.cpp b/codecs/qoi/dec/qoi_dec.cpp new file mode 100644 index 00000000..9793ca39 --- /dev/null +++ b/codecs/qoi/dec/qoi_dec.cpp @@ -0,0 +1,30 @@ +#include +#include + +#define QOI_IMPLEMENTATION +#include "qoi.h" + +using namespace emscripten; + +thread_local const val Uint8ClampedArray = val::global("Uint8ClampedArray"); +thread_local const val ImageData = val::global("ImageData"); + +val decode(std::string qoiimage) { + qoi_desc desc; + uint8_t* rgba = (uint8_t*)qoi_decode(qoiimage.c_str(), qoiimage.length(), &desc, 4); + + // Resultant width and height stored in descriptor + int decodedWidth = desc.width; + int decodedHeight = desc.height; + + val result = ImageData.new_( + Uint8ClampedArray.new_(typed_memory_view(4 * decodedWidth * decodedHeight, rgba)), + decodedWidth, decodedHeight); + free(rgba); + + return result; +} + +EMSCRIPTEN_BINDINGS(my_module) { + function("decode", &decode); +} diff --git a/codecs/qoi/dec/qoi_dec.d.ts b/codecs/qoi/dec/qoi_dec.d.ts new file mode 100644 index 00000000..cc44202d --- /dev/null +++ b/codecs/qoi/dec/qoi_dec.d.ts @@ -0,0 +1,7 @@ +export interface QOIModule extends EmscriptenWasm.Module { + decode(data: BufferSource): ImageData | null; +} + +declare var moduleFactory: EmscriptenWasm.ModuleFactory; + +export default moduleFactory; diff --git a/codecs/qoi/dec/qoi_dec.js b/codecs/qoi/dec/qoi_dec.js new file mode 100644 index 00000000..712838bd --- /dev/null +++ b/codecs/qoi/dec/qoi_dec.js @@ -0,0 +1,16 @@ + +var Module = (function() { + var _scriptDir = import.meta.url; + + return ( +function(Module) { + Module = Module || {}; + +var Module=typeof Module!=="undefined"?Module:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var UTF8Decoder=new TextDecoder("utf8");function UTF8ToString(ptr,maxBytesToRead){if(!ptr)return"";var maxPtr=ptr+maxBytesToRead;for(var end=ptr;!(end>=maxPtr)&&HEAPU8[end];)++end;return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=new TextDecoder("utf-16le");function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}if(Module["locateFile"]){var wasmBinaryFile="qoi_dec.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{var wasmBinaryFile=new URL("qoi_dec.wasm",import.meta.url).toString()}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["s"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["y"];addOnInit(Module["asm"]["t"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function _atexit(func,arg){}function ___cxa_thread_atexit(a0,a1){return _atexit(a0,a1)}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");var asmLibraryArg={"e":___cxa_thread_atexit,"p":__embind_register_bigint,"m":__embind_register_bool,"r":__embind_register_emval,"l":__embind_register_float,"o":__embind_register_function,"b":__embind_register_integer,"a":__embind_register_memory_view,"h":__embind_register_std_string,"f":__embind_register_std_wstring,"n":__embind_register_void,"c":__emval_decref,"d":__emval_get_global,"i":__emval_incref,"j":__emval_new,"k":_abort,"q":_emscripten_memcpy_big,"g":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["t"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["u"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["v"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["w"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["x"]).apply(null,arguments)};var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); + + + return Module.ready +} +); +})(); +export default Module; \ No newline at end of file diff --git a/codecs/qoi/dec/qoi_dec.wasm b/codecs/qoi/dec/qoi_dec.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ab1316a615fd3ca2aa926e3c8bf578482d314f73 GIT binary patch literal 16485 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 +#include + +#define QOI_IMPLEMENTATION +#include "qoi.h" + +using namespace emscripten; + +struct QoiOptions {}; + +thread_local const val Uint8Array = val::global("Uint8Array"); + +val encode(std::string buffer, int width, int height, QoiOptions options) { + int compressedSizeInBytes; + qoi_desc desc; + desc.width = width; + desc.height = height; + desc.channels = 4; + desc.colorspace = QOI_SRGB; + + uint8_t* encodedData = (uint8_t*)qoi_encode(buffer.c_str(), &desc, &compressedSizeInBytes); + if (encodedData == NULL) + return val::null(); + + auto js_result = + Uint8Array.new_(typed_memory_view(compressedSizeInBytes, (const uint8_t*)encodedData)); + free(encodedData); + + return js_result; +} + +EMSCRIPTEN_BINDINGS(my_module) { + value_object("QoiOptions"); + + function("encode", &encode); +} diff --git a/codecs/qoi/enc/qoi_enc.d.ts b/codecs/qoi/enc/qoi_enc.d.ts new file mode 100644 index 00000000..fa28aa48 --- /dev/null +++ b/codecs/qoi/enc/qoi_enc.d.ts @@ -0,0 +1,14 @@ +export interface EncodeOptions {} + +export interface QoiModule extends EmscriptenWasm.Module { + encode( + data: BufferSource, + width: number, + height: number, + options: EncodeOptions, + ): Uint8Array; +} + +declare var moduleFactory: EmscriptenWasm.ModuleFactory; + +export default moduleFactory; diff --git a/codecs/qoi/enc/qoi_enc.js b/codecs/qoi/enc/qoi_enc.js new file mode 100644 index 00000000..af084529 --- /dev/null +++ b/codecs/qoi/enc/qoi_enc.js @@ -0,0 +1,16 @@ + +var Module = (function() { + var _scriptDir = import.meta.url; + + return ( +function(Module) { + Module = Module || {}; + +var Module=typeof Module!=="undefined"?Module:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var UTF8Decoder=new TextDecoder("utf8");function UTF8ToString(ptr,maxBytesToRead){if(!ptr)return"";var maxPtr=ptr+maxBytesToRead;for(var end=ptr;!(end>=maxPtr)&&HEAPU8[end];)++end;return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=new TextDecoder("utf-16le");function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}if(Module["locateFile"]){var wasmBinaryFile="qoi_enc.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{var wasmBinaryFile=new URL("qoi_enc.wasm",import.meta.url).toString()}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["u"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["A"];addOnInit(Module["asm"]["v"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function _atexit(func,arg){}function ___cxa_thread_atexit(a0,a1){return _atexit(a0,a1)}var structRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");var asmLibraryArg={"t":___cxa_thread_atexit,"m":__embind_finalize_value_object,"p":__embind_register_bigint,"i":__embind_register_bool,"r":__embind_register_emval,"g":__embind_register_float,"l":__embind_register_function,"b":__embind_register_integer,"a":__embind_register_memory_view,"h":__embind_register_std_string,"e":__embind_register_std_wstring,"n":__embind_register_value_object,"j":__embind_register_void,"c":__emval_decref,"s":__emval_get_global,"k":__emval_incref,"o":__emval_new,"f":_abort,"q":_emscripten_memcpy_big,"d":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["v"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["w"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["x"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["y"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["z"]).apply(null,arguments)};var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); + + + return Module.ready +} +); +})(); +export default Module; \ No newline at end of file diff --git a/codecs/qoi/enc/qoi_enc.wasm b/codecs/qoi/enc/qoi_enc.wasm new file mode 100644 index 0000000000000000000000000000000000000000..35efdfcd9e1858b2599f1fd1048035deef3fad6d GIT binary patch literal 16577 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 bBZV*yXW1=I(yNy2T|k%GP4(W-m)u%ce)CfXm& zvVTbRZHeuT=lr=zwUb?+Ql9iF<*1N&AU^2rlPQyW$kj}eh*@R3q6z9;*9R@7aH!7U zM(lB}sD_Ez>3C>}#3>13*b(jz>?U;z!)A?N61krA>AW*pQ~~QLfW2j;t5d% zSZO@OIIgoa%d$o5R0)=^xcVL;pX?r;M1A1s^cQe8-J|Qj6UepO(H%6naI(DUQlr;6 zEo{LIEgSFJ(&nwQ?C|yv0u6c_5Euq$`D;ypE4V|Z<;Z^Z%FdbD33WG94~`~C*$6X* zme~2LmYpfI1mLlhgQnJ~qP$jVtXdVU9kivHYlj`Ru+Ih>uy~4AN}!@ zbv~@z;Ce|dJ4LQ^fd_<4`CHcEh$8DblH$82s%}A+qb%UKnWE&e&mg6a`G?5abWZ&b zq4Jy|Rm=JANV`nN#1M;Djo zm|{46bhhJuYia)Bi=FwU3#)yw)92<^+#^d%i|*|C)zd5U7dvM!96Po)x7Y_+T)OZ% zx7s;#?AYV0ot63S&EWX4!_%8??>JK4o>_YAk;Sv_?1j@yXU@8{rTH_P_Bns{{L;!3 zvupEbAHUn^|KxQaZ$9Vs;W+H|ANG*!2xV;B0SSxmn%!ZS_j)dY9G-p;3_Ak|#T`f9 z1I5k&lKc*b?5b4&Gx0w%w>p1%Hc0mF9xHdoQ!3}qK+>@HLCVfxLDfF#t`0eO_|Sl^ zJLjHlIEql`=H1#nx9<0Wd5!zKnAh(iJ+mM8&}TY#%+4M;d}Q#nCr>~0nc2gKb&A=} z%G`Ws_2lW}$C>;1+~VTW>AB9*iYAU9?=C-bcy@LW!R+a!^XHc?oP6Ms!-5h$&#-4P z;@t0X)lbClE9H25BF=3g;@q`FFadhQ`}+IF`}h{Tk6(+Ii7wu|>PGJSp!d_OTM&PG z^;*oD5o)9POYa}|{8rraTW~Ye!~N!VxDOxdyS+Q`dJrPn+=qTVH2CcB;Q?1AQ3tp) zJHyR&;hx$V4ygrvf4?&vtO{`7-x;pcg-eHbJO}Iv_zvz2*Y3i7c4xT7F5KsLhCAPd z`^wI6k9Og{y))dIF5FwdeWvsA&J!2U&dy(WbV)*-ojrZ&(%d8SYlm^Ev#aOk&(HRr zb9|HcROZ~P$o)315AeHr*`1(RoLgPpyiV|^fc-4L`nk%r%2j43RYOD$ayH{Sf^T{B zu?uJB&Y!)|nOhvhD10xJ_|{nWWyY`b`$#!{lkw?t{5Ior; + +export default async function decode(blob: Blob): Promise { + if (!emscriptenModule) { + emscriptenModule = initEmscriptenModule(qoiDecoder); + } + + const [module, data] = await Promise.all([ + emscriptenModule, + blobToArrayBuffer(blob), + ]); + + const result = module.decode(data); + if (!result) throw new Error('Decoding error'); + return result; +} diff --git a/src/features/encoders/qoi/client/index.tsx b/src/features/encoders/qoi/client/index.tsx new file mode 100644 index 00000000..f40bc4ce --- /dev/null +++ b/src/features/encoders/qoi/client/index.tsx @@ -0,0 +1,11 @@ +import { EncodeOptions } from '../shared/meta'; +import type WorkerBridge from 'client/lazy-app/worker-bridge'; + +export function encode( + signal: AbortSignal, + workerBridge: WorkerBridge, + imageData: ImageData, + options: EncodeOptions, +) { + return workerBridge.qoiEncode(signal, imageData, options); +} diff --git a/src/features/encoders/qoi/client/missing-types.d.ts b/src/features/encoders/qoi/client/missing-types.d.ts new file mode 100644 index 00000000..c729fd74 --- /dev/null +++ b/src/features/encoders/qoi/client/missing-types.d.ts @@ -0,0 +1,13 @@ +/** + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// diff --git a/src/features/encoders/qoi/shared/meta.ts b/src/features/encoders/qoi/shared/meta.ts new file mode 100644 index 00000000..72d46178 --- /dev/null +++ b/src/features/encoders/qoi/shared/meta.ts @@ -0,0 +1,19 @@ +/** + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { EncodeOptions } from 'codecs/qoi/enc/qoi_enc'; +export { EncodeOptions }; + +export const label = 'QOI'; +export const mimeType = 'image/qoi'; +export const extension = 'qoi'; +export const defaultOptions: EncodeOptions = {}; diff --git a/src/features/encoders/qoi/shared/missing-types.d.ts b/src/features/encoders/qoi/shared/missing-types.d.ts new file mode 100644 index 00000000..c729fd74 --- /dev/null +++ b/src/features/encoders/qoi/shared/missing-types.d.ts @@ -0,0 +1,13 @@ +/** + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// diff --git a/src/features/encoders/qoi/worker/missing-types.d.ts b/src/features/encoders/qoi/worker/missing-types.d.ts new file mode 100644 index 00000000..c729fd74 --- /dev/null +++ b/src/features/encoders/qoi/worker/missing-types.d.ts @@ -0,0 +1,13 @@ +/** + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// diff --git a/src/features/encoders/qoi/worker/qoiEncode.ts b/src/features/encoders/qoi/worker/qoiEncode.ts new file mode 100644 index 00000000..ef671b43 --- /dev/null +++ b/src/features/encoders/qoi/worker/qoiEncode.ts @@ -0,0 +1,35 @@ +/** + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import qoiEncoder, { QoiModule } from 'codecs/qoi/enc/qoi_enc'; +import type { EncodeOptions } from '../shared/meta'; +import { initEmscriptenModule } from 'features/worker-utils'; + +let emscriptenModule: Promise; + +async function init() { + return initEmscriptenModule(qoiEncoder); +} + +export default async function encode( + data: ImageData, + options: EncodeOptions, +): Promise { + if (!emscriptenModule) { + emscriptenModule = init(); + } + + const module = await emscriptenModule; + const resultView = module.encode(data.data, data.width, data.height, options); + // wasm can’t run on SharedArrayBuffers, so we hard-cast to ArrayBuffer. + return resultView.buffer as ArrayBuffer; +}