From 1f10dca00ede6abafa946a0b4c0524669d350136 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Mon, 25 Sep 2023 12:59:46 +0200 Subject: [PATCH] WebP: Rely on browser for rendering (#3862) --- src/global/helpers/messages.ts | 5 +- src/hooks/useThumbnail.ts | 28 +-------- src/lib/webp/webp_wasm.js | 1 - src/lib/webp/webp_wasm.wasm | Bin 126584 -> 0 bytes src/lib/webp/webp_wasm.worker.js | 51 ---------------- src/util/__mocks__/webpToPng.ts | 8 --- src/util/environmentWebp.ts | 22 ------- src/util/mediaLoader.ts | 19 +----- src/util/webpToPng.ts | 100 ------------------------------- src/util/windowEnvironment.ts | 2 - 10 files changed, 6 insertions(+), 230 deletions(-) delete mode 100644 src/lib/webp/webp_wasm.js delete mode 100644 src/lib/webp/webp_wasm.wasm delete mode 100644 src/lib/webp/webp_wasm.worker.js delete mode 100644 src/util/__mocks__/webpToPng.ts delete mode 100644 src/util/environmentWebp.ts delete mode 100644 src/util/webpToPng.ts diff --git a/src/global/helpers/messages.ts b/src/global/helpers/messages.ts index 844813856..9b84f6ee8 100644 --- a/src/global/helpers/messages.ts +++ b/src/global/helpers/messages.ts @@ -11,7 +11,7 @@ import { } from '../../config'; import { areSortedArraysIntersecting, unique } from '../../util/iteratees'; import { getServerTime } from '../../util/serverTime'; -import { IS_OPUS_SUPPORTED, isWebpSupported } from '../../util/windowEnvironment'; +import { IS_OPUS_SUPPORTED } from '../../util/windowEnvironment'; import { getGlobal } from '../index'; import { getChatTitle, isUserId } from './chats'; import { getUserFullName } from './users'; @@ -227,8 +227,7 @@ export function getMessageContentFilename(message: ApiMessage) { } if (content.sticker) { - const extension = content.sticker.isLottie ? 'tgs' : content.sticker.isVideo - ? 'webm' : isWebpSupported() ? 'webp' : 'png'; + const extension = content.sticker.isLottie ? 'tgs' : content.sticker.isVideo ? 'webm' : 'webp'; return `${content.sticker.id}.${extension}`; } diff --git a/src/hooks/useThumbnail.ts b/src/hooks/useThumbnail.ts index 3a8a3e962..54fc0887f 100644 --- a/src/hooks/useThumbnail.ts +++ b/src/hooks/useThumbnail.ts @@ -1,46 +1,24 @@ -import { useLayoutEffect, useMemo, useState } from '../lib/teact/teact'; +import { useMemo } from '../lib/teact/teact'; import { getGlobal } from '../global'; import type { ApiMessage, ApiSticker } from '../api/types'; -import { DEBUG } from '../config'; import { getMessageMediaThumbDataUri } from '../global/helpers'; import { selectTheme } from '../global/selectors'; -import { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng'; -import { isWebpSupported } from '../util/windowEnvironment'; export default function useThumbnail(media?: ApiMessage | ApiSticker) { const isMessage = media && 'content' in media; const thumbDataUri = isMessage ? getMessageMediaThumbDataUri(media) : media?.thumbnail?.dataUri; - const sticker = isMessage ? media.content?.sticker : media; - const shouldDecodeThumbnail = thumbDataUri && sticker && !isWebpSupported() && thumbDataUri.includes('image/webp'); - const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI); - const id = media?.id; - - useLayoutEffect(() => { - if (!shouldDecodeThumbnail) { - return; - } - - webpToPngBase64(`b64-${id}`, thumbDataUri!) - .then(setThumbnailDecoded) - .catch((err) => { - if (DEBUG) { - // eslint-disable-next-line no-console - console.error(err); - } - }); - }, [id, shouldDecodeThumbnail, thumbDataUri]); // TODO Find a way to update thumbnail on theme change const theme = selectTheme(getGlobal()); const dataUri = useMemo(() => { - const uri = shouldDecodeThumbnail ? thumbnailDecoded : thumbDataUri; + const uri = thumbDataUri; if (!uri || theme !== 'dark') return uri; return uri.replace('1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}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;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for getValue: "+type)}return null}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":157,"maximum":157+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}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 writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}var WASM_PAGE_SIZE=65536;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 DYNAMIC_BASE=5259680,DYNAMICTOP_PTR=16640;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":2147483648/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;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){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __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 preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}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);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="webp_wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}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)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){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()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}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();return{}}__ATINIT__.push({func:function(){___wasm_call_ctors()}});function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}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){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;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(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var asmLibraryArg={"a":___assert_fail,"b":_emscripten_memcpy_big,"c":_emscripten_resize_heap,"memory":wasmMemory,"table":wasmTable};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _version=Module["_version"]=function(){return(_version=Module["_version"]=Module["asm"]["e"]).apply(null,arguments)};var _getInfo=Module["_getInfo"]=function(){return(_getInfo=Module["_getInfo"]=Module["asm"]["f"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["g"]).apply(null,arguments)};var _decode=Module["_decode"]=function(){return(_decode=Module["_decode"]=Module["asm"]["h"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["i"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["j"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["k"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["l"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["m"]).apply(null,arguments)};Module["cwrap"]=cwrap;Module["getValue"]=getValue;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}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();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); diff --git a/src/lib/webp/webp_wasm.wasm b/src/lib/webp/webp_wasm.wasm deleted file mode 100644 index 33380c37d0fe0406ff05f2aaf0ec6fce6829c71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126584 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 diff --git a/src/lib/webp/webp_wasm.worker.js b/src/lib/webp/webp_wasm.worker.js deleted file mode 100644 index f8ec9cd71..000000000 --- a/src/lib/webp/webp_wasm.worker.js +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable */ -importScripts(new URL('./webp_wasm.js', import.meta.url)); - -Module.onRuntimeInitialized = async () => { - self.postMessage({ type: 'initialized' }); -}; - -self.onmessage = (event) => { - const { id, blob } = event.data; - const reader = new FileReader(); - - reader.addEventListener('loadend', () => { - const buffer = reader.result; - - const size = buffer.byteLength; - const thisPtr = Module._malloc(size); - Module.HEAPU8.set(new Uint8Array(buffer), thisPtr); - - const getInfo = Module.cwrap('getInfo', 'number', ['number', 'number']); - - const ptr = getInfo(thisPtr, size); - const success = !!Module.getValue(ptr, 'i32'); - if (!success) { - Module._free(ptr); - Module._free(thisPtr); - self.postMessage({ - type: 'result', id, width: 0, height: 0, result: null, - }); - return; - } - const width = Module.getValue(ptr + 4, 'i32'); - const height = Module.getValue(ptr + 8, 'i32'); - - Module._free(ptr); - - const decode = Module.cwrap('decode', 'number', ['number', 'number']); - - const resultPtr = decode(thisPtr, size); - - const resultView = new Uint8Array(Module.HEAPU8.buffer, resultPtr, width * height * 4); - const result = new Uint8ClampedArray(resultView); - Module._free(resultPtr); - Module._free(thisPtr); - - self.postMessage({ - type: 'result', id, width, height, result, - }); - }); - - reader.readAsArrayBuffer(blob); -}; diff --git a/src/util/__mocks__/webpToPng.ts b/src/util/__mocks__/webpToPng.ts deleted file mode 100644 index c592bb38c..000000000 --- a/src/util/__mocks__/webpToPng.ts +++ /dev/null @@ -1,8 +0,0 @@ -const webpToPng = { - webpToPng() { - }, - webpToPngBase64() { - }, -}; - -export default webpToPng; diff --git a/src/util/environmentWebp.ts b/src/util/environmentWebp.ts deleted file mode 100644 index 4bf20dbb3..000000000 --- a/src/util/environmentWebp.ts +++ /dev/null @@ -1,22 +0,0 @@ -let isWebpSupportedCache: boolean | undefined; - -export function isWebpSupported() { - return Boolean(isWebpSupportedCache); -} - -function testWebp(): Promise { - return new Promise((resolve) => { - const webp = new Image(); - // eslint-disable-next-line max-len - webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; - const handleLoadOrError = () => { - resolve(webp.height === 2); - }; - webp.onload = handleLoadOrError; - webp.onerror = handleLoadOrError; - }); -} - -testWebp().then((hasWebp) => { - isWebpSupportedCache = hasWebp; -}); diff --git a/src/util/mediaLoader.ts b/src/util/mediaLoader.ts index 5b47c7b64..5f9f6968b 100644 --- a/src/util/mediaLoader.ts +++ b/src/util/mediaLoader.ts @@ -15,9 +15,8 @@ import { callApi, cancelApiProgress } from '../api/gramjs'; import * as cacheApi from './cacheApi'; import { fetchBlob } from './files'; import { oggToWav } from './oggToWav'; -import { webpToPng } from './webpToPng'; import { - IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported, + IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, } from './windowEnvironment'; const asCacheApiType = { @@ -142,13 +141,6 @@ async function fetchFromCacheOrRemote( media = await oggToWav(media); } - if (cached.type === 'image/webp' && !isWebpSupported() && media) { - const mediaPng = await webpToPng(url, media); - if (mediaPng) { - media = mediaPng; - } - } - const prepared = prepareMedia(media); memoryCache.set(url, prepared); @@ -184,15 +176,6 @@ async function fetchFromCacheOrRemote( mimeType = media.type; } - if (mimeType === 'image/webp' && !isWebpSupported()) { - const blob = await fetchBlob(prepared as string); - URL.revokeObjectURL(prepared as string); - const media = await webpToPng(url, blob); - if (media) { - prepared = prepareMedia(media); - } - } - memoryCache.set(url, prepared); return prepared; diff --git a/src/util/webpToPng.ts b/src/util/webpToPng.ts deleted file mode 100644 index 0bdd4a194..000000000 --- a/src/util/webpToPng.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { blobToDataUri, dataUriToBlob } from './files'; -import { pause } from './schedulers'; -import { isWebpSupported } from './windowEnvironment'; - -const WORKER_INITIALIZATION_TIMEOUT = 2000; - -let canvas: HTMLCanvasElement; -let worker: IWebpWorker; - -export const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk' - + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII='; - -export async function webpToPng(url: string, blob: Blob): Promise { - initWebpWorker(); - - while (!worker.wasmReady) { - await pause(WORKER_INITIALIZATION_TIMEOUT); - } - - const { result, width, height } = await getDecodePromise(url, blob); - if (!width || !height) { - return undefined; - } - - return createPng({ result, width, height }); -} - -export async function webpToPngBase64(key: string, dataUri: string): Promise { - if (isWebpSupported() || dataUri.substr(0, 15) !== 'data:image/webp') { - return dataUri; - } - - initWebpWorker(); - - const pngBlob = await webpToPng(key, dataUriToBlob(dataUri)); - - if (!pngBlob) { - throw new Error(`Can't convert webp to png. Url: ${dataUri}`); - } - - return blobToDataUri(pngBlob); -} - -function initWebpWorker() { - if (!worker) { - worker = new Worker(new URL('../lib/webp/webp_wasm.worker.js', import.meta.url)) as IWebpWorker; - worker.wasmReady = false; - worker.onmessage = handleLibWebpMessage; - } -} - -function createPng({ result, width, height }: TEncodedImage): Promise { - if (!canvas) { - canvas = document.createElement('canvas'); - } - - return new Promise((resolve) => { - const img = new ImageData(result, width, height); - - canvas.width = width; - canvas.height = height; - const ctx = canvas.getContext('2d')!; - ctx.putImageData(img, 0, 0); - - canvas.toBlob((blob) => { - resolve(blob ?? undefined); - }, 'image/png', 1); - }); -} - -function handleLibWebpMessage(e: MessageEvent) { - const { id } = e.data; - switch (e.data.type) { - case 'initialized': { - worker.wasmReady = true; - break; - } - - case 'result': { - if (worker.requests.has(id)) { - const resolve = worker.requests.get(id)!; - - worker.requests.delete(id); - resolve(e.data!); - } - break; - } - } -} - -function getDecodePromise(url: string, blob: Blob): Promise { - return new Promise((resolve) => { - if (!worker.requests) { - worker.requests = new Map(); - } - - worker.requests.set(url, resolve); - worker.postMessage({ id: url, blob }); - }); -} diff --git a/src/util/windowEnvironment.ts b/src/util/windowEnvironment.ts index 2925e5438..23d68c6dc 100644 --- a/src/util/windowEnvironment.ts +++ b/src/util/windowEnvironment.ts @@ -4,8 +4,6 @@ import { PRODUCTION_HOSTNAME, } from '../config'; -export * from './environmentWebp'; - export function getPlatform() { const { userAgent, platform } = window.navigator;