1 line
5.4 KiB
Plaintext
1 line
5.4 KiB
Plaintext
{"version":3,"file":"detectVideoAlphaMode.mjs","sources":["../../../src/utils/browser/detectVideoAlphaMode.ts"],"sourcesContent":["import type { ALPHA_MODES } from '../../rendering/renderers/shared/texture/const';\n\nlet promise: Promise<ALPHA_MODES> | undefined;\n\n/**\n * Helper for detecting the correct alpha mode for video textures.\n * For some reason, some browsers/devices/WebGL implementations premultiply the alpha\n * of a video before and then a second time if `UNPACK_PREMULTIPLY_ALPHA_WEBGL`\n * is true. So the video is premultiplied twice if the alpha mode is `UNPACK`.\n * In this case we need the alpha mode to be `PMA`. This function detects\n * the upload behavior by uploading a white 2x2 webm with 50% alpha\n * without `UNPACK_PREMULTIPLY_ALPHA_WEBGL` and then checking whether\n * the uploaded pixels are premultiplied.\n * @memberof utils\n * @function detectVideoAlphaMode\n * @returns {Promise<ALPHA_MODES>} The correct alpha mode for video textures.\n */\nexport async function detectVideoAlphaMode(): Promise<ALPHA_MODES>\n{\n promise ??= (async () =>\n {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl');\n\n if (!gl)\n {\n return 'premultiply-alpha-on-upload';\n }\n\n const video = await new Promise<HTMLVideoElement | null>((resolve) =>\n {\n const video = document.createElement('video');\n\n video.onloadeddata = () => resolve(video);\n video.onerror = () => resolve(null);\n video.autoplay = false;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n // eslint-disable-next-line max-len\n video.src = 'data:video/webm;base64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQJChYECGFOAZwEAAAAAAAHTEU2bdLpNu4tTq4QVSalmU6yBoU27i1OrhBZUrmtTrIHGTbuMU6uEElTDZ1OsggEXTbuMU6uEHFO7a1OsggG97AEAAAAAAABZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmoCrXsYMPQkBNgIRMYXZmV0GETGF2ZkSJiEBEAAAAAAAAFlSua8yuAQAAAAAAAEPXgQFzxYgAAAAAAAAAAZyBACK1nIN1bmSIgQCGhVZfVlA5g4EBI+ODhAJiWgDglLCBArqBApqBAlPAgQFVsIRVuYEBElTDZ9Vzc9JjwItjxYgAAAAAAAAAAWfInEWjh0VOQ09ERVJEh49MYXZjIGxpYnZweC12cDlnyKJFo4hEVVJBVElPTkSHlDAwOjAwOjAwLjA0MDAwMDAwMAAAH0O2dcfngQCgwqGggQAAAIJJg0IAABAAFgA4JBwYSgAAICAAEb///4r+AAB1oZ2mm+6BAaWWgkmDQgAAEAAWADgkHBhKAAAgIABIQBxTu2uRu4+zgQC3iveBAfGCAXHwgQM=';\n video.load();\n });\n\n if (!video)\n {\n return 'premultiply-alpha-on-upload';\n }\n\n const texture = gl.createTexture();\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n const framebuffer = gl.createFramebuffer();\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture,\n 0\n );\n\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);\n\n const pixel = new Uint8Array(4);\n\n gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);\n\n gl.deleteFramebuffer(framebuffer);\n gl.deleteTexture(texture);\n gl.getExtension('WEBGL_lose_context')?.loseContext();\n\n return pixel[0] <= pixel[3] ? 'premultiplied-alpha' : 'premultiply-alpha-on-upload';\n })();\n\n return promise;\n}\n"],"names":["video"],"mappings":";AAEA,IAAI,OAAA,CAAA;AAeJ,eAAsB,oBACtB,GAAA;AACI,EAAA,OAAA,KAAA,OAAA,GAAA,CAAa,YACb;AACI,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAC9C,IAAM,MAAA,EAAA,GAAK,MAAO,CAAA,UAAA,CAAW,OAAO,CAAA,CAAA;AAEpC,IAAA,IAAI,CAAC,EACL,EAAA;AACI,MAAO,OAAA,6BAAA,CAAA;AAAA,KACX;AAEA,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAI,OAAA,CAAiC,CAAC,OAC1D,KAAA;AACI,MAAMA,MAAAA,MAAAA,GAAQ,QAAS,CAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AAE5C,MAAAA,MAAM,CAAA,YAAA,GAAe,MAAM,OAAA,CAAQA,MAAK,CAAA,CAAA;AACxC,MAAAA,MAAM,CAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAI,CAAA,CAAA;AAClC,MAAAA,OAAM,QAAW,GAAA,KAAA,CAAA;AACjB,MAAAA,OAAM,WAAc,GAAA,WAAA,CAAA;AACpB,MAAAA,OAAM,OAAU,GAAA,MAAA,CAAA;AAEhB,MAAAA,OAAM,GAAM,GAAA,ysBAAA,CAAA;AACZ,MAAAA,OAAM,IAAK,EAAA,CAAA;AAAA,KACd,CAAA,CAAA;AAED,IAAA,IAAI,CAAC,KACL,EAAA;AACI,MAAO,OAAA,6BAAA,CAAA;AAAA,KACX;AAEA,IAAM,MAAA,OAAA,GAAU,GAAG,aAAc,EAAA,CAAA;AAEjC,IAAG,EAAA,CAAA,WAAA,CAAY,EAAG,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAErC,IAAM,MAAA,WAAA,GAAc,GAAG,iBAAkB,EAAA,CAAA;AAEzC,IAAG,EAAA,CAAA,eAAA,CAAgB,EAAG,CAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AAC9C,IAAG,EAAA,CAAA,oBAAA;AAAA,MACC,EAAG,CAAA,WAAA;AAAA,MACH,EAAG,CAAA,iBAAA;AAAA,MACH,EAAG,CAAA,UAAA;AAAA,MACH,OAAA;AAAA,MACA,CAAA;AAAA,KACJ,CAAA;AAEA,IAAG,EAAA,CAAA,WAAA,CAAY,EAAG,CAAA,8BAAA,EAAgC,KAAK,CAAA,CAAA;AACvD,IAAA,EAAA,CAAG,WAAY,CAAA,EAAA,CAAG,kCAAoC,EAAA,EAAA,CAAG,IAAI,CAAA,CAAA;AAC7D,IAAG,EAAA,CAAA,UAAA,CAAW,EAAG,CAAA,UAAA,EAAY,CAAG,EAAA,EAAA,CAAG,MAAM,EAAG,CAAA,IAAA,EAAM,EAAG,CAAA,aAAA,EAAe,KAAK,CAAA,CAAA;AAEzE,IAAM,MAAA,KAAA,GAAQ,IAAI,UAAA,CAAW,CAAC,CAAA,CAAA;AAE9B,IAAG,EAAA,CAAA,UAAA,CAAW,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,EAAG,CAAA,IAAA,EAAM,EAAG,CAAA,aAAA,EAAe,KAAK,CAAA,CAAA;AAE1D,IAAA,EAAA,CAAG,kBAAkB,WAAW,CAAA,CAAA;AAChC,IAAA,EAAA,CAAG,cAAc,OAAO,CAAA,CAAA;AACxB,IAAG,EAAA,CAAA,YAAA,CAAa,oBAAoB,CAAA,EAAG,WAAY,EAAA,CAAA;AAEnD,IAAA,OAAO,MAAM,CAAC,CAAA,IAAK,KAAM,CAAA,CAAC,IAAI,qBAAwB,GAAA,6BAAA,CAAA;AAAA,GACvD,GAAA,CAAA,CAAA;AAEH,EAAO,OAAA,OAAA,CAAA;AACX;;;;"} |