UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 5.5 kB
{"version":3,"file":"detectVideoAlphaMode.mjs","sources":["../../../src/utils/browser/detectVideoAlphaMode.ts"],"sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { DOMAdapter } from '../../environment/adapter';\n\nimport 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 * @category utils\n * @internal\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 = DOMAdapter.get().createCanvas(1, 1);\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":";;;AAKA,IAAI,OAAA;AAeJ,eAAsB,oBAAA,GACtB;AACI,EAAA,OAAA,KAAA,OAAA,GAAA,CAAa,YACb;AACI,IAAA,MAAM,SAAS,UAAA,CAAW,GAAA,EAAI,CAAE,YAAA,CAAa,GAAG,CAAC,CAAA;AACjD,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAEpC,IAAA,IAAI,CAAC,EAAA,EACL;AACI,MAAA,OAAO,6BAAA;AAAA,IACX;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAI,OAAA,CAAiC,CAAC,OAAA,KAC1D;AACI,MAAA,MAAMA,MAAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAE5C,MAAAA,MAAAA,CAAM,YAAA,GAAe,MAAM,OAAA,CAAQA,MAAK,CAAA;AACxC,MAAAA,MAAAA,CAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAI,CAAA;AAClC,MAAAA,OAAM,QAAA,GAAW,KAAA;AACjB,MAAAA,OAAM,WAAA,GAAc,WAAA;AACpB,MAAAA,OAAM,OAAA,GAAU,MAAA;AAEhB,MAAAA,OAAM,GAAA,GAAM,ysBAAA;AACZ,MAAAA,OAAM,IAAA,EAAK;AAAA,IACf,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,KAAA,EACL;AACI,MAAA,OAAO,6BAAA;AAAA,IACX;AAEA,IAAA,MAAM,OAAA,GAAU,GAAG,aAAA,EAAc;AAEjC,IAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA;AAErC,IAAA,MAAM,WAAA,GAAc,GAAG,iBAAA,EAAkB;AAEzC,IAAA,EAAA,CAAG,eAAA,CAAgB,EAAA,CAAG,WAAA,EAAa,WAAW,CAAA;AAC9C,IAAA,EAAA,CAAG,oBAAA;AAAA,MACC,EAAA,CAAG,WAAA;AAAA,MACH,EAAA,CAAG,iBAAA;AAAA,MACH,EAAA,CAAG,UAAA;AAAA,MACH,OAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,8BAAA,EAAgC,KAAK,CAAA;AACvD,IAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,kCAAA,EAAoC,EAAA,CAAG,IAAI,CAAA;AAC7D,IAAA,EAAA,CAAG,UAAA,CAAW,EAAA,CAAG,UAAA,EAAY,CAAA,EAAG,EAAA,CAAG,MAAM,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,aAAA,EAAe,KAAK,CAAA;AAEzE,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,CAAC,CAAA;AAE9B,IAAA,EAAA,CAAG,UAAA,CAAW,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,aAAA,EAAe,KAAK,CAAA;AAE1D,IAAA,EAAA,CAAG,kBAAkB,WAAW,CAAA;AAChC,IAAA,EAAA,CAAG,cAAc,OAAO,CAAA;AACxB,IAAA,EAAA,CAAG,YAAA,CAAa,oBAAoB,CAAA,EAAG,WAAA,EAAY;AAEnD,IAAA,OAAO,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,IAAI,qBAAA,GAAwB,6BAAA;AAAA,EAC1D,CAAA,GAAG,CAAA;AAEH,EAAA,OAAO,OAAA;AACX;;;;"}