1 line
4.4 KiB
Plaintext
1 line
4.4 KiB
Plaintext
{"version":3,"file":"detectVideoAlphaMode.mjs","sources":["../../src/browser/detectVideoAlphaMode.ts"],"sourcesContent":["import { ALPHA_MODES } from '@pixi/constants';\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 PIXI.utils\n * @function detectVideoAlphaMode\n * @returns {Promise<PIXI.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 ALPHA_MODES.UNPACK;\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 ALPHA_MODES.UNPACK;\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] ? ALPHA_MODES.PMA : ALPHA_MODES.UNPACK;\n })();\n\n return promise;\n}\n"],"names":["video"],"mappings":";AAEA,IAAI;AAeJ,eAAsB,uBACtB;AACI,SAAA,YAAA,WAAa,YACb;AAEI,UAAM,KADS,SAAS,cAAc,QAAQ,EAC5B,WAAW,OAAO;AAEpC,QAAI,CAAC;AAED,aAAO,YAAY;AAGvB,UAAM,QAAQ,MAAM,IAAI,QAAiC,CAAC,YAC1D;AACUA,YAAAA,SAAQ,SAAS,cAAc,OAAO;AAE5CA,aAAM,eAAe,MAAM,QAAQA,MAAK,GACxCA,OAAM,UAAU,MAAM,QAAQ,IAAI,GAClCA,OAAM,WAAW,IACjBA,OAAM,cAAc,aACpBA,OAAM,UAAU,QAEhBA,OAAM,MAAM,2sBACZA,OAAM,KAAK;AAAA,IAAA,CACd;AAED,QAAI,CAAC;AAED,aAAO,YAAY;AAGjB,UAAA,UAAU,GAAG;AAEhB,OAAA,YAAY,GAAG,YAAY,OAAO;AAE/B,UAAA,cAAc,GAAG;AAEvB,OAAG,gBAAgB,GAAG,aAAa,WAAW,GAC9C,GAAG;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACJ,GAEA,GAAG,YAAY,GAAG,gCAAgC,EAAK,GACvD,GAAG,YAAY,GAAG,oCAAoC,GAAG,IAAI,GAC7D,GAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,KAAK;AAEnE,UAAA,QAAQ,IAAI,WAAW,CAAC;AAE9B,WAAA,GAAG,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,eAAe,KAAK,GAE1D,GAAG,kBAAkB,WAAW,GAChC,GAAG,cAAc,OAAO,GACxB,GAAG,aAAa,oBAAoB,GAAG,eAEhC,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,YAAY,MAAM,YAAY;AAAA,EAAA,GAGzD,IAAA;AACX;"} |