@applemusic-like-lyrics/core 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/dist/amll-core.cjs +6 -6
- package/dist/amll-core.cjs.map +1 -1
- package/dist/amll-core.js +229 -190
- package/dist/amll-core.js.map +1 -1
- package/dist/bg-render/base.d.ts +6 -6
- package/dist/bg-render/eplor-renderer.d.ts +1 -2
- package/dist/bg-render/index.d.ts +1 -1
- package/dist/bg-render/pixi-renderer.d.ts +1 -1
- package/dist/utils/resource.d.ts +4 -0
- package/package.json +8 -5
package/dist/amll-core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amll-core.cjs","sources":["../src/bg-render/base.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/shaders/base.vert.glsl?raw","../src/bg-render/shaders/base.frag.glsl?raw","../src/bg-render/shaders/blend.frag.glsl?raw","../src/bg-render/shaders/eplor.frag.glsl?raw","../src/bg-render/shaders/noise.frag.glsl?raw","../src/assets/noise 5.png?inline","../src/bg-render/eplor-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/derivative.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/utils/matrix.ts","../../../node_modules/bezier-easing/src/index.js","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { Disposable, HasElement } from \"../interfaces\";\n\nexport abstract class AbstractBaseRenderer implements Disposable, HasElement {\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tabstract setFlowSpeed(speed: number): void;\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tabstract setRenderScale(scale: number): void;\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tabstract setAlbumImage(albumUrl: string): Promise<void>;\n\t/**\n\t * 设置低频的音量大小,范围在 80hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t *\n\t * 部分渲染器会根据音量大小调整背景效果(例如根据鼓点跳动)\n\t *\n\t * 如果无法获取到类似的数据,请传入 1.0 作为默认值,或不做任何处理(默认值即 1.0)\n\t * @param volume 低频的音量大小,范围在 50hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t */\n\tabstract setLowFreqVolume(volume: number): void;\n\t/**\n\t * 设置背景是否根据“是否有歌词”这个特征调整自身效果,例如有歌词时会变得更加活跃\n\t *\n\t * 部分渲染器会根据这个特征调整自身效果\n\t *\n\t * 如果不确定是否需要赋值或无法知晓是否包含歌词,请传入 true 或不做任何处理(默认值为 true)\n\t *\n\t * @param hasLyric 是否有歌词,如不确定是否需要赋值,请传入 true 或不做任何处理(默认值为 true)\n\t */\n\tabstract setHasLyric(hasLyric: boolean): void;\n\tabstract dispose(): void;\n\tabstract getElement(): HTMLElement;\n}\n\nexport abstract class BaseRenderer extends AbstractBaseRenderer {\n\tprivate observer: ResizeObserver;\n\tprotected flowSpeed = 2;\n\tprotected currerntRenderScale = 0.75;\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper();\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst width = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientWidth * window.devicePixelRatio * this.currerntRenderScale,\n\t\t\t);\n\t\t\tconst height = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientHeight *\n\t\t\t\t\twindow.devicePixelRatio *\n\t\t\t\t\tthis.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.onResize(width, height);\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t}\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tthis.onResize(\n\t\t\tthis.canvas.clientWidth *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t\tthis.canvas.clientHeight *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t);\n\t}\n\t/**\n\t * 当画板元素大小发生变化时此函数会被调用\n\t * 可以在此处重设和渲染器相关的尺寸设置\n\t * 考虑到初始化的时候元素不一定在文档中或出于某些特殊样式状态,尺寸长宽有可能会为 0,请注意进行特判处理\n\t * @param width 画板元素实际的物理像素宽度,有可能为 0\n\t * @param height 画板元素实际的物理像素高度,有可能为 0\n\t */\n\tprotected onResize(width: number, height: number): void {\n\t\tthis.canvas.width = width;\n\t\tthis.canvas.height = height;\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tabstract setAlbumImage(albumUrl: string): Promise<void>;\n\tdispose(): void {\n\t\tthis.observer.disconnect();\n\t\tthis.canvas.remove();\n\t}\n}\n","import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { BulgePinchFilter } from \"@pixi/filter-bulge-pinch\";\nimport { BaseRenderer } from \"./base\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer extends BaseRenderer {\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t\tlastContainer.destroy(true);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 1,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.maxFPS = 30;\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\n\tprotected override onResize(width: number, height: number): void {\n\t\tsuper.onResize(width, height);\n\t\tthis.app.resize();\n\t\tthis.rebuildFilters();\n\t}\n\n\toverride setRenderScale(scale: number) {\n\t\tsuper.setRenderScale(scale);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst maxBorder = Math.max(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters?.forEach((filter) => {\n\t\t\tfilter.destroy();\n\t\t});\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tif (Math.random() > 0.5) {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\toverride setStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\n\toverride pause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\n\toverride resume() {\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setLowFreqVolume(_volume: number): void {\n\t\t// NOOP\n\t}\n\n\toverride setHasLyric(_hasLyric: boolean): void {\n\t\t// NOOP\n\t}\n\n\toverride async setAlbumImage(albumUrl: string) {\n\t\tif (albumUrl.trim().length === 0) return;\n\t\tconst img = new Image();\n\t\timg.src = albumUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tawait img.decode();\n\t\t\t\ttex = Texture.from(img, {\n\t\t\t\t\tresourceOptions: {\n\t\t\t\t\t\tautoLoad: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait tex.baseTexture.resource.load();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumUrl,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = undefined;\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!tex) return;\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(container);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n}\n","export default \"#version 300 es\\nprecision highp float;\\n\\nin vec2 v_coord;\\nout vec2 f_v_coord;\\n\\nvoid main() {\\n gl_Position = vec4(v_coord, 0.0f, 1.0f);\\n f_v_coord = (vec2(v_coord.x, v_coord.y) + vec2(1.0f, 1.0f)) / 2.0f;\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 coord = f_v_coord;\\n fragColor = texture(src, coord);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nuniform float lerp;\\nuniform float scale;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n if(scale < 1.0f) {\\n tex_coord /= scale;\\n }\\n vec4 srcColor = texture(src, tex_coord);\\n fragColor = mix(vec4(srcColor.xyz, 0.0f), srcColor, lerp);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;uniform float IIIlllllllIIIllIl,lIIIlllllIllIl,IIIlllIlIIllll;uniform sampler2D IlllIIlIlllIll;uniform vec2 IIlIlIIlIlIllI,IllIlllIlIIlllI;out vec4 lIIlIIIIIlIlIlllIIIIlIIl;float lIlIIllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII-=0.;return sin(IIIlIIlIIIlllIII);}float lIlIlllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII+=acos(0.);return sin(IIIlIIlIIIlllIII);}mat2 lIIllIIlIIIllIl(float IIIlIIlIIIlllIII){return mat2(lIlIlllllIllIll(IIIlIIlIIIlllIII),-lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII));}mat2 lIIllIIlIIIlllI(float IIIlIIlIIIlllIII){return mat2(lIlIIllllIllIll(IIIlIIlIIIlllIII),-lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII));}float IllllIIlIllII(float llIIllIllIIIllI){return fract(lIlIIllllIllIll(llIIllIllIIIllI)*43758.5453);}float llIlIIllllIII(vec2 IIIlIIlIIIlllIII){vec2 IIllIlIIlllI=floor(IIIlIIlIIIlllIII),lIlIllIIIIIlIl=fract(IIIlIIlIIIlllIII);lIlIllIIIIIlIl=lIlIllIIIIIlIl*lIlIllIIIIIlIl*(3.-2.*lIlIllIIIIIlIl);float lIlIlIlIlIlIIl=IIllIlIIlllI.x+IIllIlIIlllI.y*57.;return mix(mix(IllllIIlIllII(lIlIlIlIlIlIIl),IllllIIlIllII(lIlIlIlIlIlIIl+1.),lIlIllIIIIIlIl.x),mix(IllllIIlIllII(lIlIlIlIlIlIIl+57.),IllllIIlIllII(lIlIlIlIlIlIIl+58.),lIlIllIIIIIlIl.x),lIlIllIIIIIlIl.y);}vec2 lllIIIIIIllIlIIIlI(vec2 IlllIIlIIIIlIIII,float lIIIIlllIIIIllIlIlI,vec2 IlIlIIIIlIlllIlIII){float lIIlIllIIIlIl=llIlIIllllIII(IlllIIlIIIIlIIII*vec2(1)*3.5+.1)*4.2831*mix(.2,1.,IIIlllllllIIIllIl);IlllIIlIIIIlIIII+=vec2(-1,.5);lIIlIllIIIlIl-=lIIIIlllIIIIllIlIlI;return vec2(lIlIlllllIllIll(lIIlIllIIIlIl),lIlIIllllIllIll(lIIlIllIIIlIl));}const mat3 lIIllIIIlllIl=mat3(1.,.02,.002,.02,1.,.008,.002,.02,1.),lIIIlllIIIIll=mat3(1.022,-.02,-.002,-.02,1.028,-.008,-.002,-.02,1.022);void main(){vec2 lIIIlIIllIlIIlI=lIlIIllllIllIll(lIIIlllllIllIl*.2)*.01+.5+gl_FragCoord.xy/IIlIlIIlIlIllI.xy,lIIllIIlIIIllI=lIIIlIIllIlIIlI*.77f+IllIlllIlIIlllI;lIIllIIlIIIllI.x*=IIlIlIIlIlIllI.x/IIlIlIIlIlIllI.y;float lIIlIIlIIlIIIlII=gl_FragCoord.x/max(IIlIlIIlIlIllI.x,IIlIlIIlIlIllI.y),lIIIlIllIllIlIIl=0.f;vec3 lIIIlIlIIIlIlIIl=vec3(0);vec2 lIlIIlIlIIIllIll=lIIllIIlIIIllI;for(int IllIlIIlIIlllllIIIl=0;IllIlIIlIIlllllIIIl<8;IllIlIIlIIlllllIIIl++){bool lIlIlIIllIllIIll=IllIlIIlIIlllllIIIl%2==0;vec2 lIlllIlllIlllII=lllIIIIIIllIlIIIlI(lIIllIIlIIIllI,lIIlIIlIIlIIIlII,lIIIlIIllIlIIlI),lIllIIlIIlIIIll=lIlllIlllIlllII;float lIIlIlIIlIIlIllI=float(IllIlIIlIIlllllIIIl)/8.f;vec3 llIIlIIIIlIIlIII=texture(IlllIIlIlllIll,-lIIIlllllIllIl*.01+.8*lIIllIIlIIIllI*lIIllIIlIIIllIl(-lIIIlllllIllIl*.2)+vec2(IIIlllIlIIllll*.3*(float(lIlIlIIllIllIIll)*2.-1.)*lIIllIIlIIIlllI(lIIIlllllIllIl*.2+1.5))).xyz;lIIIlIlIIIlIlIIl+=llIIlIIIIlIIlIII;lIIIlIllIllIlIIl+=4.f*lIIlIlIIlIIlIllI*(1.f-lIIlIlIIlIIlIllI);lIIllIIlIIIllI+=.01f*lIllIIlIIlIIIll*(lIlIIllllIllIll(lIIIlllllIllIl)*4.8+.8);lIlIIlIlIIIllIll+=.05f*lIllIIlIIlIIIll;}lIIIlIlIIIlIlIIl/=lIIIlIllIllIlIIl;lIIIlIlIIIlIlIIl*=1.6f;lIIIlIlIIIlIlIIl=1.f-exp(-lIIIlIlIIIlIlIIl);lIIIlIlIIIlIlIIl=pow(lIIIlIlIIIlIlIIl,vec3(2.2));lIIIlIlIIIlIlIIl*=.8f;lIIlIIIIIlIlIlllIIIIlIIl=vec4(lIIIlIlIIIlIlIIl,1);}\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\n/* Gradient noise from Jorge Jimenez's presentation: */\\n/* http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare */\\nfloat gradientNoise(in vec2 uv) {\\n return fract(52.9829189f * fract(dot(uv, vec2(0.06711056f, 0.00583715f))));\\n}\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n float dither = (1.0f / 255.0f) * gradientNoise(gl_FragCoord.xy) - (0.5f / 255.0f);\\n vec4 color = texture(src, tex_coord);\\n color += dither;\\n fragColor = color;\\n}\\n\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAYUklEQVR4nH3bV89VVRcF4IX7qNgVe8WKvaIiNsCuYCKCSEg0JCYm/gTjzf4R3njhlRdeWKKi2AvYEBV7b1ixY2+ofPuZcbwxXzie5OQ9Z5+11pxzjDHnKnu/k0477bSN+++/fzvyyCPbdttt17766qu2YcOG9ttvv7U33nijffHFF23atGntgAMOaN98803bc88926RJk9pnn31W10855ZT2888/1/vrr79ur732Wjv00EPbgQce2NavX99eeOGF+nvmmWfWuD4fc8wx1ffDDz9sTz31VPv000/bRx99VL/vsssu7eCDDy57hxxySPv222/L1saNG9vatWsbX19++eXyhb9//PFH23HHHdsHH3zQLrrooorjxRdfrPbG+/jjj9u6devaX3/91aZMmdImT57cdt1114lYu5133rnfeuut28yZM9t+++3XVq9e3T7//PMa9Ljjjqu/m222WTn73HPPtR122KF99913bcsttyyQnnzyybbbbrvVm4MMAe37778vUATIkaOPPrqCe+KJJ9qPP/7Ydt9993bvvfe2lStXtvfee69ttdVW7bzzzmvbbLNN++STT9rUqVPL7jvvvNP+/PPP8o1NNn7//fcakx3XL7300moPyC222KL8ev/99ws8Y2s3xFmAIpD9H374of36669txBEIvf3224UmR1w74YQTyhlgHHTQQeU845Bfs2ZN23fffcsQRn/55Zf6jQJOP/30GvjLL78sMPbee+8y6rM2gvPea6+9yg7Htt1223bSSSe1nXbaqWwC+K677iq2qMU1yqKK0WhUAWGREruuq3GBw8dVq1ZV4Pvss08744wzSgns/fTTT+UzoigIAL53gyM95P7+++9Cj1OQz+ACwb7PHAGA3133phKyY/TVV1+t3zHEAUa8t99++1IDJwAsKFIWkFQQOFaeffbZ9u6775aTgBXskKIVhDEBSxFJCaznOoCpNdJHGlvGNRa5s8N3PiLg5JNPbt1goNfIYKeeemo74ogjKmC5yxlIY/D5559v999/f8nxrLPOqsCBwknIkxcmpISXYFesWFGqIlNKck3bGTNmFNDyltPaUBXnsMWGfKZCeQto/QQqmOnTpxegvvNVH4G7Jg4AG4P8qVM6jCN5JDc5QYZyHHrynFGd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\"","import { Disposable } from \"../interfaces\";\nimport { BaseRenderer } from \"./base\";\nimport vertShader from \"./shaders/base.vert.glsl?raw\";\nimport fragShader from \"./shaders/base.frag.glsl?raw\";\nimport blendShader from \"./shaders/blend.frag.glsl?raw\";\nimport eplorShader from \"./shaders/eplor.frag.glsl?raw\";\nimport noiseShader from \"./shaders/noise.frag.glsl?raw\";\nimport noiseImage from \"../assets/noise 5.png?inline\";\n\nconst NOISE_IMAGE_DATA = (() => {\n\tconst img = document.createElement(\"img\");\n\timg.src = noiseImage;\n\treturn img;\n})();\n\nfunction blurImage(imageData: ImageData, radius: number, quality: number) {\n\tconst pixels = imageData.data;\n\tconst width = imageData.width;\n\tconst height = imageData.height;\n\n\tlet rsum: number;\n\tlet gsum: number;\n\tlet bsum: number;\n\tlet asum: number;\n\tlet x: number;\n\tlet y: number;\n\tlet i: number;\n\tlet p: number;\n\tlet p1: number;\n\tlet p2: number;\n\tlet yp: number;\n\tlet yi: number;\n\tlet yw: number;\n\tconst wm = width - 1;\n\tconst hm = height - 1;\n\tconst rad1x = radius + 1;\n\tconst divx = radius + rad1x;\n\tconst rad1y = radius + 1;\n\tconst divy = radius + rad1y;\n\tconst div2 = 1 / (divx * divy);\n\n\tconst r: number[] = [];\n\tconst g: number[] = [];\n\tconst b: number[] = [];\n\tconst a: number[] = [];\n\n\tconst vmin: number[] = [];\n\tconst vmax: number[] = [];\n\n\twhile (quality-- > 0) {\n\t\tyw = yi = 0;\n\n\t\tfor (y = 0; y < height; y++) {\n\t\t\trsum = pixels[yw] * rad1x;\n\t\t\tgsum = pixels[yw + 1] * rad1x;\n\t\t\tbsum = pixels[yw + 2] * rad1x;\n\t\t\tasum = pixels[yw + 3] * rad1x;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\tp = yw + ((i > wm ? wm : i) << 2);\n\t\t\t\trsum += pixels[p++];\n\t\t\t\tgsum += pixels[p++];\n\t\t\t\tbsum += pixels[p++];\n\t\t\t\tasum += pixels[p];\n\t\t\t}\n\n\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\tr[yi] = rsum;\n\t\t\t\tg[yi] = gsum;\n\t\t\t\tb[yi] = bsum;\n\t\t\t\ta[yi] = asum;\n\n\t\t\t\tif (y === 0) {\n\t\t\t\t\tvmin[x] = Math.min(x + rad1x, wm) << 2;\n\t\t\t\t\tvmax[x] = Math.max(x - radius, 0) << 2;\n\t\t\t\t}\n\n\t\t\t\tp1 = yw + vmin[x];\n\t\t\t\tp2 = yw + vmax[x];\n\n\t\t\t\trsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tgsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tbsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tasum += pixels[p1] - pixels[p2];\n\n\t\t\t\tyi++;\n\t\t\t}\n\t\t\tyw += width << 2;\n\t\t}\n\n\t\tfor (x = 0; x < width; x++) {\n\t\t\typ = x;\n\t\t\trsum = r[yp] * rad1y;\n\t\t\tgsum = g[yp] * rad1y;\n\t\t\tbsum = b[yp] * rad1y;\n\t\t\tasum = a[yp] * rad1y;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\typ += i > hm ? 0 : width;\n\t\t\t\trsum += r[yp];\n\t\t\t\tgsum += g[yp];\n\t\t\t\tbsum += b[yp];\n\t\t\t\tasum += a[yp];\n\t\t\t}\n\n\t\t\tyi = x << 2;\n\t\t\tfor (y = 0; y < height; y++) {\n\t\t\t\tpixels[yi] = (rsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 1] = (gsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 2] = (bsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 3] = (asum * div2 + 0.5) | 0;\n\n\t\t\t\tif (x === 0) {\n\t\t\t\t\tvmin[y] = Math.min(y + rad1y, hm) * width;\n\t\t\t\t\tvmax[y] = Math.max(y - radius, 0) * width;\n\t\t\t\t}\n\n\t\t\t\tp1 = x + vmin[y];\n\t\t\t\tp2 = x + vmax[y];\n\n\t\t\t\trsum += r[p1] - r[p2];\n\t\t\t\tgsum += g[p1] - g[p2];\n\t\t\t\tbsum += b[p1] - b[p2];\n\t\t\t\tasum += a[p1] - a[p2];\n\n\t\t\t\tyi += width << 2;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction saturateImage(imageData: ImageData, saturation: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tconst gray = r * 0.3 + g * 0.59 + b * 0.11;\n\t\tpixels[i] = gray * (1 - saturation) + r * saturation;\n\t\tpixels[i + 1] = gray * (1 - saturation) + g * saturation;\n\t\tpixels[i + 2] = gray * (1 - saturation) + b * saturation;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction brightnessImage(imageData: ImageData, brightness: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = r * brightness;\n\t\tpixels[i + 1] = g * brightness;\n\t\tpixels[i + 2] = b * brightness;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction contrastImage(imageData: ImageData, contrast: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = (r - 128) * contrast + 128;\n\t\tpixels[i + 1] = (g - 128) * contrast + 128;\n\t\tpixels[i + 2] = (b - 128) * contrast + 128;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nclass GLProgram implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprogram: WebGLProgram;\n\tprivate vertexShader: WebGLShader;\n\tprivate fragmentShader: WebGLShader;\n\tprivate coordPos: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\tvertexShaderSource: string,\n\t\tfragmentShaderSource: string,\n\t\tprivate readonly label = \"unknown\",\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.vertexShader = this.createShader(gl.VERTEX_SHADER, vertexShaderSource);\n\t\tthis.fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tfragmentShaderSource,\n\t\t);\n\t\tthis.program = this.createProgram();\n\n\t\tconst coordPos = gl.getAttribLocation(this.program, \"v_coord\");\n\t\tif (coordPos === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get attribute location v_coord for \"${this.label}\"`,\n\t\t\t);\n\t\tthis.coordPos = coordPos;\n\t}\n\tprivate createShader(type: number, source: string) {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type);\n\t\tif (!shader) throw new Error(\"Failed to create shader\");\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to compile shader for type ${type} \"${\n\t\t\t\t\tthis.label\n\t\t\t\t}\": ${gl.getShaderInfoLog(shader)}`,\n\t\t\t);\n\t\t}\n\t\treturn shader;\n\t}\n\tprivate createProgram() {\n\t\tconst gl = this.gl;\n\t\tconst program = gl.createProgram();\n\t\tif (!program) throw new Error(\"Failed to create program\");\n\t\tgl.attachShader(program, this.vertexShader);\n\t\tgl.attachShader(program, this.fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tgl.validateProgram(program);\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst errLog = gl.getProgramInfoLog(program);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow new Error(`Failed to link program \"${this.label}\": ${errLog}`);\n\t\t}\n\t\treturn program;\n\t}\n\tuse() {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tgl.vertexAttribPointer(this.coordPos, 2, gl.FLOAT, false, 0, 0);\n\t\tgl.enableVertexAttribArray(this.coordPos);\n\t}\n\tprivate notFoundUniforms: Set<string> = new Set();\n\tprivate warnUniformNotFound(name: string) {\n\t\tif (this.notFoundUniforms.has(name)) return;\n\t\tthis.notFoundUniforms.add(name);\n\t\tconsole.warn(\n\t\t\t`Failed to get uniform location for program \"${this.label}\": ${name}`,\n\t\t);\n\t}\n\tsetUniform1f(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1f(location, value);\n\t}\n\tsetUniform2f(name: string, value1: number, value2: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform2f(location, value1, value2);\n\t}\n\tsetUniform1i(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1i(location, value);\n\t}\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteShader(this.vertexShader);\n\t\tgl.deleteShader(this.fragmentShader);\n\t\tgl.deleteProgram(this.program);\n\t}\n}\n\nclass Framebuffer implements Disposable {\n\tprivate fb: WebGLFramebuffer;\n\tprivate tex: WebGLTexture;\n\tprivate _size: [number, number];\n\tget size() {\n\t\treturn this._size;\n\t}\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\twidth: number,\n\t\theight: number,\n\t) {\n\t\tthis._size = [width, height];\n\t\tconst fb = gl.createFramebuffer();\n\t\tif (!fb) throw new Error(\"Can't create framebuffer\");\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.fb = fb;\n\t\tthis.tex = tex;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\tgl.framebufferTexture2D(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\tgl.TEXTURE_2D,\n\t\t\ttex,\n\t\t\t0,\n\t\t);\n\t\tthis.resize(width, height);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tresize(width: number, height: number) {\n\t\tconst gl = this.gl;\n\t\tthis.bind();\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.tex);\n\t\tif (gl.getExtension(\"EXT_color_buffer_float\")) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA32F,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.FLOAT,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} else {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.fb);\n\t}\n\tactive(texture: number = this.gl.TEXTURE0) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\tdispose(): void {\n\t\tthis.gl.deleteFramebuffer(this.fb);\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nclass GLBuffer implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprivate buffer: WebGLBuffer;\n\tprivate type: number;\n\tprivate data: ArrayBufferView;\n\tprivate usage: number;\n\tprivate length: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\ttype: number,\n\t\tdata: ArrayBufferView,\n\t\tusage: number,\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.type = type;\n\t\tthis.data = data;\n\t\tthis.usage = usage;\n\t\tconst buffer = gl.createBuffer();\n\t\tif (!buffer) throw new Error(\"Failed to create buffer\");\n\t\tthis.buffer = buffer;\n\t\tthis.length = data.byteLength;\n\t\tgl.bindBuffer(type, this.buffer);\n\t\tgl.bufferData(type, data, usage);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindBuffer(this.type, this.buffer);\n\t}\n\t// update(data: ArrayBufferView) {\n\t// const gl = this.gl;\n\t// gl.bindBuffer(this.type, this.buffer);\n\t// gl.bufferSubData(this.type, 0, data);\n\t// this.data = data;\n\t// }\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteBuffer(this.buffer);\n\t}\n}\n\nclass AlbumTexture implements Disposable {\n\tprivate albumTexture: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\tprivate mainProgram: GLProgram,\n\t\tprivate vertexBuffer: GLBuffer,\n\t\tprivate indexBuffer: GLBuffer,\n\t\talbumImageData: ImageData,\n\t) {\n\t\tconst albumTexture = gl.createTexture();\n\t\tif (!albumTexture) throw new Error(\"Failed to create texture\");\n\t\tthis.albumTexture = albumTexture;\n\t\tgl.bindTexture(gl.TEXTURE_2D, albumTexture);\n\t\tgl.texImage2D(\n\t\t\tgl.TEXTURE_2D,\n\t\t\t0,\n\t\t\tgl.RGBA,\n\t\t\tgl.RGBA,\n\t\t\tgl.UNSIGNED_BYTE,\n\t\t\talbumImageData,\n\t\t);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\n\tdraw(sampler: string) {\n\t\tconst gl = this.gl;\n\t\tthis.mainProgram.use();\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.albumTexture);\n\t\tthis.mainProgram.setUniform1i(sampler, 0);\n\t\tgl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.albumTexture);\n\t}\n}\n\nclass NoiseTexture implements Disposable {\n\tprivate tex: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(private gl: WebGL2RenderingContext) {\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.tex = tex;\n\t\tNOISE_IMAGE_DATA.decode().then(() => {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tNOISE_IMAGE_DATA,\n\t\t\t);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t});\n\t}\n\n\tactive(texture: number = this.gl.TEXTURE1) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nexport class EplorRenderer extends BaseRenderer {\n\tprivate hasLyric = true;\n\tprivate hasLyricValue = 1;\n\tprivate maxFPS = 30;\n\tprivate lastTickTime = 0;\n\tprivate lastFrameTime = 0;\n\tprivate _lowFreqVolume = 1;\n\tprivate paused = false;\n\tprivate staticMode = false;\n\tprivate gl: WebGL2RenderingContext = this.setupGL();\n\tprivate reduceImageSizeCanvas = new OffscreenCanvas(128, 128);\n\tprivate tickHandle = 0;\n\tprivate sprites: AlbumTexture[] = [];\n\tprivate ampTransition = 0;\n\tprivate playTime = 0;\n\tprivate frameTime = 0;\n\tprivate IllIlllIlIIlllI: number[] = [-0.1, 0.0];\n\tprivate onTick(tickTime: number) {\n\t\tthis.tickHandle = 0;\n\t\tif (this.paused) return;\n\n\t\tconst delta = tickTime - this.lastTickTime;\n\t\tconst frameDelta = tickTime - this.lastFrameTime;\n\t\tthis.lastFrameTime = tickTime;\n\t\tif (delta < 1000 / this.maxFPS) {\n\t\t\tthis.requestTick();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hasLyric) this.playTime += frameDelta * this.flowSpeed * 0.2;\n\t\tthis.frameTime += frameDelta;\n\n\t\tif (!(this.onRedraw(this.playTime, frameDelta) && this.staticMode)) {\n\t\t\tthis.requestTick();\n\t\t}\n\n\t\tthis.lastTickTime = tickTime;\n\n\t\tthis.ampTransition;\n\t}\n\n\tprivate mainProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\teplorShader,\n\t\t\"main\",\n\t);\n\tprivate blendProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tblendShader,\n\t\t\"blend\",\n\t);\n\tprivate copyProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tfragShader,\n\t\t\"copy\",\n\t);\n\tprivate noiseProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tnoiseShader,\n\t\t\"noise\",\n\t);\n\n\tprivate static readonly rawVertexBuffer = new Float32Array([\n\t\t-1, -1, 1, -1, -1, 1, 1, 1,\n\t]);\n\n\tprivate static readonly rawIndexBuffer = new Uint16Array([0, 1, 2, 1, 2, 3]);\n\n\tprivate vertexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ARRAY_BUFFER,\n\t\tEplorRenderer.rawVertexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate indexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ELEMENT_ARRAY_BUFFER,\n\t\tEplorRenderer.rawIndexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate noiseTexture = new NoiseTexture(this.gl);\n\n\tprivate fb: [Framebuffer, Framebuffer];\n\tprivate historyFrameBuffer: Framebuffer[] = [];\n\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tconst gl = this.gl;\n\t\tgl.enable(this.gl.BLEND);\n\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\tthis.requestTick();\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tconst width =\n\t\t\tbounds.width * window.devicePixelRatio * this.currerntRenderScale;\n\t\tconst height =\n\t\t\tbounds.height * window.devicePixelRatio * this.currerntRenderScale;\n\t\tthis.fb = [\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t];\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.bind();\n\t\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\t}\n\t\tthis.historyFrameBuffer = new Array(2)\n\t\t\t.fill(0)\n\t\t\t.map(() => new Framebuffer(this.gl, width, height));\n\t\tthis.onResize(width, height);\n\t}\n\tprivate _currentSize = [0, 0];\n\tprivate _targetSize = [0, 0];\n\tprivate renderSize = [0, 0];\n\tprivate pixelSize = [0, 0];\n\n\tprotected override onResize(width: number, height: number): void {\n\t\t// super.onResize(width, height);\n\t\tthis._targetSize = [\n\t\t\tMath.max(1, Math.round(width)),\n\t\t\tMath.max(1, Math.round(height)),\n\t\t];\n\t\tif (this.staticMode) this.requestTick();\n\t}\n\n\tprivate checkResize() {\n\t\tif (\n\t\t\tthis._currentSize[0] === this._targetSize[0] &&\n\t\t\tthis._currentSize[1] === this._targetSize[1]\n\t\t)\n\t\t\treturn;\n\t\tthis._currentSize = [...this._targetSize];\n\t\tconst [width, height] = this._targetSize;\n\t\tconst realWidth = Math.round(\n\t\t\tMath.max(width / this.currerntRenderScale, width),\n\t\t);\n\t\tconst realHeight = Math.round(\n\t\t\tMath.max(height / this.currerntRenderScale, height),\n\t\t);\n\t\tthis.renderSize = [width, height];\n\t\tthis.canvas.width = realWidth;\n\t\tthis.canvas.height = realHeight;\n\t\tthis.pixelSize = [realWidth, realHeight];\n\t\tthis.gl.viewport(0, 0, realWidth, realHeight);\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.resize(width, height);\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.resize(realWidth, realHeight);\n\t\t}\n\t}\n\n\tprivate requestTick() {\n\t\tif (!this.tickHandle)\n\t\t\tthis.tickHandle = requestAnimationFrame((t) => this.onTick(t));\n\t}\n\n\tprivate drawScreen() {\n\t\tthis.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tprivate bindDefaultFrameBuffer() {\n\t\tthis.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\t}\n\n\tprivate onRedraw(tickTime: number, delta: number) {\n\t\tthis.checkResize();\n\t\tthis.hasLyricValue =\n\t\t\t(this.hasLyricValue * 19 + (this.hasLyric ? 1 : 0)) / 20;\n\t\tconst gl = this.gl;\n\t\tthis.vertexBuffer.bind();\n\t\tthis.indexBuffer.bind();\n\n\t\tthis.mainProgram.use();\n\t\tthis.noiseTexture.active();\n\t\tthis.mainProgram.setUniform1i(\"noisetex\", 1);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IIlIlIIlIlIllI\",\n\t\t\tthis.renderSize[0],\n\t\t\tthis.renderSize[1],\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"lIIIlllllIllIl\",\n\t\t\tthis.hasLyric ? tickTime / 1000 : 0,\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\"IIIlllllllIIIllIl\", this.hasLyricValue);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"IIIlllIlIIllll\",\n\t\t\tthis.hasLyric ? this._lowFreqVolume : 0.0,\n\t\t);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IllIlllIlIIlllI\",\n\t\t\tthis.IllIlllIlIIlllI[0],\n\t\t\tthis.IllIlllIlIIlllI[1],\n\t\t);\n\t\tconst [fba, fbb] = this.fb;\n\t\tfbb.bind();\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\tfor (const sprite of this.sprites) {\n\t\t\tfba.bind();\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\t\tthis.mainProgram.use();\n\t\t\tsprite.draw(\"IlllIIlIlllIll\");\n\n\t\t\tfbb.bind();\n\n\t\t\tthis.blendProgram.use();\n\t\t\tfba.active();\n\t\t\tthis.blendProgram.setUniform1i(\"src\", 0);\n\t\t\tthis.blendProgram.setUniform1f(\"lerp\", sprite.alpha);\n\t\t\tthis.blendProgram.setUniform1f(\"scale\", this.currerntRenderScale);\n\t\t\tthis.drawScreen();\n\n\t\t\tsprite.alpha = Math.min(1, sprite.alpha + delta / 200);\n\t\t}\n\n\t\t// 增加噪点以缓解色带现象\n\t\tthis.noiseProgram.use();\n\t\tthis.noiseProgram.setUniform1i(\"src\", 0);\n\t\t// this.noiseProgram.setUniform2f(\n\t\t// \t\"renderSize\",\n\t\t// \tthis.renderSize[0],\n\t\t// \tthis.renderSize[1],\n\t\t// );\n\t\t// this.noiseProgram.setUniform1f(\"frameTime\", this.frameTime);\n\t\tfba.bind();\n\t\tfbb.active();\n\t\tthis.bindDefaultFrameBuffer();\n\t\tthis.drawScreen();\n\n\t\tif (this.sprites.length > 1) {\n\t\t\tconst coveredIndex = this.sprites[this.sprites.length - 1];\n\t\t\tif (coveredIndex.alpha >= 1) {\n\t\t\t\tfor (const deleted of this.sprites.splice(0, this.sprites.length - 1)) {\n\t\t\t\t\tdeleted.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst isOnlyOneSprite =\n\t\t\tthis.sprites.length === 1 && this.sprites[0].alpha >= 1;\n\t\tconst isTweeningValues = this.hasLyric\n\t\t\t? this.hasLyricValue > 0.00001\n\t\t\t: this.hasLyricValue < 0.99999;\n\t\treturn isOnlyOneSprite || !isTweeningValues;\n\t}\n\n\tprivate copyFrameBuffer(src: Framebuffer, dst: Framebuffer | null = null) {\n\t\tif (src === dst) return;\n\t\tsrc.active(this.gl.TEXTURE0);\n\t\tthis.copyProgram.use();\n\t\tif (dst) {\n\t\t\tdst.bind();\n\t\t} else {\n\t\t\tthis.bindDefaultFrameBuffer();\n\t\t}\n\t\tthis.copyProgram.setUniform1i(\"src\", 0);\n\t\t// this.copyProgram.setUniform1f(\"scale\", scale);\n\t\tthis.drawScreen();\n\t}\n\n\tprivate setupGL() {\n\t\tconst gl = this.canvas.getContext(\"webgl2\", {\n\t\t\talpha: true,\n\t\t\tdepth: false,\n\t\t\tpowerPreference: \"low-power\",\n\t\t});\n\t\tif (!gl) throw new Error(\"WebGL2 not supported\");\n\t\tthis.gl = gl;\n\t\tgl.enable(gl.BLEND);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\t\tif (!gl.getExtension(\"EXT_color_buffer_float\"))\n\t\t\tconsole.warn(\"EXT_color_buffer_float not supported\");\n\t\tif (!gl.getExtension(\"EXT_float_blend\"))\n\t\t\tconsole.warn(\"EXT_float_blend not supported\");\n\t\tif (!gl.getExtension(\"OES_texture_float_linear\"))\n\t\t\tconsole.warn(\"OES_texture_float_linear not supported\");\n\n\t\treturn gl;\n\t}\n\n\toverride setLowFreqVolume(volume: number): void {\n\t\tthis._lowFreqVolume = volume;\n\t}\n\n\toverride setStaticMode(enable: boolean): void {\n\t\tthis.staticMode = enable;\n\t\tthis.lastFrameTime = performance.now();\n\t\tthis.requestTick();\n\t}\n\toverride setFPS(fps: number): void {\n\t\tthis.maxFPS = fps;\n\t}\n\toverride pause(): void {\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t\tthis.paused = true;\n\t}\n\toverride resume(): void {\n\t\tthis.paused = false;\n\t\tthis.requestTick();\n\t}\n\tprivate loadImage(imageUrl: string): Promise<HTMLImageElement> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst img = document.createElement(\"img\");\n\t\t\timg.onload = () => resolve(img);\n\t\t\timg.onerror = reject;\n\t\t\timg.src = imageUrl;\n\t\t\timg.crossOrigin = \"anonymous\";\n\t\t});\n\t}\n\toverride async setAlbumImage(albumUrl: string): Promise<void> {\n\t\tif (albumUrl.trim().length === 0) return;\n\t\tlet remainRetryTimes = 5;\n\t\tlet img: HTMLImageElement | null = null;\n\t\twhile (!img && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\timg = await this.loadImage(albumUrl);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumUrl,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!img) return;\n\t\t// resize image\n\t\tconst c = this.reduceImageSizeCanvas;\n\t\tconst ctx = c.getContext(\"2d\");\n\t\tif (!ctx) throw new Error(\"Failed to create canvas context\");\n\t\tctx.clearRect(0, 0, c.width, c.height);\n\t\t// const baseFilter = \"saturate(3) contrast(0.8) saturate(8) brightness(0.4)\";\n\t\tconst blurRadius = 10;\n\t\t// Safari 不支持 filter\n\t\t// ctx.filter = baseFilter;\n\t\tconst imgw = img.naturalWidth;\n\t\tconst imgh = img.naturalHeight;\n\t\tctx.drawImage(img, 0, 0, imgw, imgh, 0, 0, c.width, c.height);\n\t\t// ctx.fillStyle = \"white\";\n\t\t// ctx.fillRect(0, 0, c.width, c.height);\n\t\tconst imageData = ctx.getImageData(0, 0, c.width, c.height);\n\t\tcontrastImage(imageData, 0.8);\n\t\tsaturateImage(imageData, 1.5);\n\t\t//\t\tcontrastImage(imageData, 0.8);\n\t\t//\t\tbrightnessImage(imageData, 0.9);\n\t\tblurImage(imageData, blurRadius, 4);\n\t\tconst sprite = new AlbumTexture(\n\t\t\tthis.gl,\n\t\t\tthis.mainProgram,\n\t\t\tthis.vertexBuffer,\n\t\t\tthis.indexBuffer,\n\t\t\timageData,\n\t\t);\n\t\tthis.sprites.push(sprite);\n\t\tthis.playTime = Math.random() * 100000;\n\t\tthis.lastFrameTime = performance.now();\n\t\tconsole.info(Math.random() * 10000);\n\t\tconst r = Number.parseInt((Math.random() * 10000).toFixed(0)) % 3;\n\t\tif (r === 0) {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t\t// this.IllIlllIlIIlllI = [-1.1, -.9];\n\t\t} else if (r === 1) {\n\t\t\t// this.IllIlllIlIIlllI = [-0.3, -0.2];\n\t\t\tthis.IllIlllIlIIlllI = [-1.1, -0.9];\n\t\t} else {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t}\n\t\tthis.requestTick();\n\t}\n\n\toverride setHasLyric(hasLyric: boolean): void {\n\t\tthis.hasLyric = hasLyric;\n\t\tthis.requestTick();\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.vertexBuffer.dispose();\n\t\tthis.indexBuffer.dispose();\n\t\tthis.noiseTexture.dispose();\n\t\tfor (const s of this.sprites) {\n\t\t\ts.dispose();\n\t\t}\n\t\tthis.copyProgram.dispose();\n\t\tthis.blendProgram.dispose();\n\t\tthis.mainProgram.dispose();\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nexport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nimport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nexport { PixiRenderer } from \"./pixi-renderer\";\nexport { EplorRenderer } from \"./eplor-renderer\";\n\nexport class BackgroundRender<Renderer extends BaseRenderer>\n\timplements AbstractBaseRenderer\n{\n\tprivate element: HTMLCanvasElement;\n\tprivate renderer: Renderer;\n\tconstructor(renderer: Renderer, canvas: HTMLCanvasElement) {\n\t\tthis.renderer = renderer;\n\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t\tcanvas.style.contain = \"strict\";\n\t}\n\n\tstatic new<Renderer extends BaseRenderer>(type: {\n\t\tnew (canvas: HTMLCanvasElement): Renderer;\n\t}): BackgroundRender<Renderer> {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\treturn new BackgroundRender(new type(canvas), canvas);\n\t}\n\n\tsetRenderScale(scale: number): void {\n\t\tthis.renderer.setRenderScale(scale);\n\t}\n\n\tsetFlowSpeed(speed: number): void {\n\t\tthis.renderer.setFlowSpeed(speed);\n\t}\n\tsetStaticMode(enable: boolean): void {\n\t\tthis.renderer.setStaticMode(enable);\n\t}\n\tsetFPS(fps: number): void {\n\t\tthis.renderer.setFPS(fps);\n\t}\n\tpause(): void {\n\t\tthis.renderer.pause();\n\t}\n\tresume(): void {\n\t\tthis.renderer.resume();\n\t}\n\tsetLowFreqVolume(volume: number): void {\n\t\tthis.renderer.setLowFreqVolume(volume);\n\t}\n\tsetHasLyric(hasLyric: boolean): void {\n\t\tthis.renderer.setHasLyric(hasLyric);\n\t}\n\tsetAlbumImage(albumUrl: string): Promise<void> {\n\t\treturn this.renderer.setAlbumImage(albumUrl);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tthis.renderer.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","export function derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nexport function getVelocity(f: (t: number) => number): (t: number) => number {\n\treturn derivative(f);\n}\n","import { getVelocity } from \"./derivative\";\n\n/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate getV2: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t\tthis.getV2 = getVelocity(this.getV);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.getV2(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t}\n\tconst damping_frequency = Math.sqrt(4.0 * mass * stiffness - damping ** 2.0);\n\tconst leftover =\n\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\tconst dfm = (0.5 * damping_frequency) / mass;\n\tconst dm = -(0.5 * damping) / mass;\n\treturn (t: seconds) => {\n\t\tt -= delay;\n\t\tif (t < 0) return from;\n\t\treturn (\n\t\t\tto -\n\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\tMath.E ** (t * dm)\n\t\t);\n\t};\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < 0 || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate playing = true;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate interludeTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tpause() {\n\t\tthis.playing = false;\n\t}\n\tresume() {\n\t\tthis.playing = true;\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.playing) return;\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left.toFixed(\n\t\t\t2,\n\t\t)}px, ${this.top.toFixed(2)}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t20 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - ((1000 - currentDuration) / 1000) ** 2;\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst dotsDuration = Math.max(0, interludeDuration - 750);\n\n\t\t\t\tscale = Math.max(0, scale) * 0.7;\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - dotsDuration / 3) * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (dotsDuration / 3) * 2) * 3) / dotsDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","// biome-ignore format: matrix\nexport type Matrix4 = [\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n];\n\nexport function createMatrix4(): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n}\n\nexport function scaleMatrix4(\n\tm: Matrix4,\n\tscale = 1,\n\torigin = { x: 0, y: 0 },\n): Matrix4 {\n\tconst [ox, oy] = [origin.x, origin.y];\n\t// biome-ignore format: matrix\n\treturn [\n m[0] * scale , m[1] * scale , m[2] * scale , m[3],\n m[4] * scale , m[5] * scale , m[6] * scale , m[7],\n m[8] * scale , m[9] * scale , m[10] * scale, m[11],\n m[12] - ox * scale + ox, m[13] - oy * scale + oy, m[14] , m[15]\n ];\n}\n\nexport function translateMatrix4(m: Matrix4, x = 0, y = 0, z = 0): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n m[0] , m[1] , m[2] , m[3] ,\n m[4] , m[5] , m[6] , m[7] ,\n m[8] , m[9] , m[10] , m[11],\n m[12] + x, m[13] + y, m[14] + z, m[15]\n ];\n}\n\nexport function matrix4ToCSS(m: Matrix4, fractionDigits = 4): string {\n\tconst format = (n: number, i: number) => n.toFixed(fractionDigits);\n\treturn `matrix3d(${m.map(format).join(\", \")})`;\n}\n","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { createMatrix4, matrix4ToCSS, scaleMatrix4 } from \"../utils/matrix\";\nimport { Spring } from \"../utils/spring\";\nimport bezier from \"bezier-easing\";\nimport { WebAnimationSpring } from \"../utils/wa-spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\nenum EmphasizeAnimationMethod {\n\tFloatAndGlow = \"float-and-glow\",\n\tFloatOnly = \"float-only\",\n}\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\tmaskAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tpadding: number;\n\tshouldEmphasize: boolean;\n}\n\nconst ANIMATION_FRAME_QUANTITY = 32;\n\nconst norNum = (min: number, max: number) => (x: number) =>\n\tMath.min(1, Math.max(0, (x - min) / (max - min)));\nconst EMP_EASING_MID = 0.4;\nconst beginNum = norNum(0, EMP_EASING_MID);\nconst endNum = norNum(EMP_EASING_MID, 1);\n\nconst makeEmpEasing = (mid: number) => {\n\tconst bezIn = bezier(0.3, 0, 0.25, 1);\n\tconst bezOut = bezier(0.5, 0, 0.3, 1);\n\treturn (x: number) => (x < mid ? bezIn(beginNum(x)) : 1 - bezOut(endNum(x)));\n};\nconst defaultEmpEasing = makeEmpEasing(EMP_EASING_MID);\n\n// function generateFadeGradient(\n// \twidth: number,\n// \tpadding = 0,\n// \tbright = \"rgba(0,0,0,0.85)\",\n// \tdark = \"rgba(0,0,0,0.25)\",\n// ): [string, number] {\n// \tconst totalAspect = 2 + width + padding;\n// \tconst widthInTotal = width / totalAspect;\n// \tconst leftPos = (1 - widthInTotal) / 2;\n// \treturn [\n// \t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n// \t\t\tleftPos * 100\n// \t\t}%,${bright} ${(leftPos + widthInTotal) * 100}%,${dark} ${\n// \t\t\t(leftPos + widthInTotal) * 100\n// \t\t}%)`,\n// \t\ttotalAspect,\n// \t];\n// }\n\nfunction generateFadeGradient(\n\twidth: number,\n\tpadding = 0,\n\tbright = \"rgba(0,0,0,0.85)\",\n\tdark = \"rgba(0,0,0,0.25)\",\n): [string, number] {\n\tconst totalAspect = 2 + width + padding;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar so\", \"sweet\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"], \"so\", \"sweet\"]\nfunction chunkAndSplitLyricWords(\n\twords: LyricWord[],\n): (LyricWord | LyricWord[])[] {\n\tconst resplitedWords: LyricWord[] = [];\n\n\tfor (const w of words) {\n\t\tconst realLength = w.word.replace(/\\s/g, \"\").length;\n\t\tconst splited = w.word.split(\" \").filter((v) => v.trim().length > 0);\n\t\tif (splited.length > 1) {\n\t\t\tif (w.word.startsWith(\" \")) {\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet charPos = 0;\n\t\t\tfor (const s of splited) {\n\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\tword: s,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tw.startTime + (charPos / realLength) * (w.endTime - w.startTime),\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tw.startTime +\n\t\t\t\t\t\t((charPos + s.length) / realLength) * (w.endTime - w.startTime),\n\t\t\t\t};\n\t\t\t\tresplitedWords.push(word);\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t\tcharPos += s.length;\n\t\t\t}\n\t\t\tif (!w.word.endsWith(\" \")) {\n\t\t\t\tresplitedWords.pop();\n\t\t\t}\n\t\t} else {\n\t\t\tresplitedWords.push(w);\n\t\t}\n\t}\n\n\tlet wordChunk: string[] = [];\n\tlet wChunk: LyricWord[] = [];\n\tconst result: (LyricWord | LyricWord[])[] = [];\n\n\tfor (const w of resplitedWords) {\n\t\tconst word = w.word;\n\t\twordChunk.push(word);\n\t\twChunk.push(w);\n\t\tif (word.length > 0 && word.trim().length === 0) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\tresult.push(w);\n\t\t\twordChunk = [];\n\t\t\twChunk = [];\n\t\t} else if (\n\t\t\t!/^\\s*[^\\s]*\\s*$/.test(wordChunk.join(\"\")) ||\n\t\t\tCJKEXP.test(word)\n\t\t) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\twordChunk = [word];\n\t\t\twChunk = [w];\n\t\t}\n\t}\n\n\tif (wChunk.length === 1) {\n\t\tresult.push(wChunk[0]);\n\t} else {\n\t\tresult.push(wChunk);\n\t}\n\n\treturn result;\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn (\n\t\tword.endTime - word.startTime >= 1000 &&\n\t\tword.word.trim().length <= 7 &&\n\t\tword.word.trim().length >= 1\n\t);\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent\n\t\t? evt\n\t\t: never;\n};\ntype MouseEventTypes = MouseEventMap[keyof MouseEventMap];\ntype MouseEventListener = (\n\tthis: LyricLineEl,\n\tev: RawLyricLineMouseEvent,\n) => void;\n\nexport class LyricLineEl extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\t// readonly lineWebAnimationTransforms = {\n\t// \tposX: new WebAnimationSpring(this.element, \"transform\", (v) => `translateX(${v.toFixed(1)}px)`),\n\t// \tposY: new WebAnimationSpring(this.element, \"transform\", (v) => `translateY(${v.toFixed(1)}px)`),\n\t// \tscale: new WebAnimationSpring(this.element, \"transform\", (v) => `scale(${v.toFixed(4)})`, 1),\n\t// };\n\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis._prevParentEl = lyricPlayer.getElement();\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate listenersMap = new Map<string, Set<MouseEventListener>>();\n\tprivate readonly onMouseEvent = (e: MouseEvent) => {\n\t\tconst wrapped = new RawLyricLineMouseEvent(this, e);\n\t\tfor (const listener of this.listenersMap.get(e.type) ?? []) {\n\t\t\tlistener.call(this, wrapped);\n\t\t}\n\t\tif (!this.dispatchEvent(wrapped) || wrapped.defaultPrevented) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn false;\n\t\t}\n\t};\n\n\taddMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | AddEventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type) ?? new Set();\n\t\t\tif (listeners.size === 0)\n\t\t\t\tthis.element.addEventListener(type, this.onMouseEvent, options);\n\t\t\tlisteners.add(callback);\n\t\t\tthis.listenersMap.set(type, listeners);\n\t\t}\n\t}\n\n\tremoveMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | EventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t\tif (listeners.size === 0)\n\t\t\t\t\tthis.element.removeEventListener(type, this.onMouseEvent, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isEnabled = false;\n\tenable(maskAnimationTime = this.lyricLine.startTime) {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t\tmain.classList.add(\"active\");\n\t}\n\tdisable(maskAnimationTime = 0) {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t\tmain.classList.remove(\"active\");\n\t}\n\tresume() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t}\n\tpause() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t}\n\tsetMaskAnimationState(maskAnimationTime = 0) {\n\t\tconst t = maskAnimationTime - this.lyricLine.startTime;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(this.totalDuration, Math.max(0, t));\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\tif (t >= 0 && t < this.totalDuration) a.play();\n\t\t\t\telse a.pause();\n\t\t\t}\n\t\t}\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate _prevParentEl: HTMLElement | null = null;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tif (this._prevParentEl) {\n\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\tthis._prevParentEl = null;\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tif (this.element.parentElement) {\n\t\t\tthis._prevParentEl = this.element.parentElement;\n\t\t\tthis.element.remove();\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = \"\";\n\t\t// if (this.lyricPlayer.getEnableSpring()) {\n\t\tstyle += `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px) scale(${this.lineTransforms.scale\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(4)});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\t// 如果是非动态歌词,那么就不需要分词了\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tconst chunkedWords = chunkAndSplitLyricWords(this.lyricLine.words);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\t// 多个没有空格的单词组合成的一个单词数组\n\t\t\t\tif (chunk.length === 0) continue;\n\t\t\t\tconst merged = chunk.reduce(\n\t\t\t\t\t(a, b) => {\n\t\t\t\t\t\ta.endTime = Math.max(a.endTime, b.endTime);\n\t\t\t\t\t\ta.startTime = Math.min(a.startTime, b.startTime);\n\t\t\t\t\t\ta.word += b.word;\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t},\n\t\t\t\t\t{ word: \"\", startTime: Infinity, endTime: -Infinity },\n\t\t\t\t);\n\t\t\t\tconst emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, shouldEmphasize(merged));\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\twrapperWordEl.classList.add(\"emphasize-wrapper\");\n\t\t\t\tconst characterElements: HTMLElement[] = [];\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\t// const mainWordFloatAnimation = this.initFloatAnimation(\n\t\t\t\t\t// \tmerged,\n\t\t\t\t\t// \tmainWordEl,\n\t\t\t\t\t// );\n\t\t\t\t\tif (emp) {\n\t\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\t\tfor (const char of word.word.trim().split(\"\")) {\n\t\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\t\tcharacterElements.push(charEl);\n\t\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: charEls,\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(merged, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmainWordEl.innerText = word.word;\n\t\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: [],\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(word, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\twrapperWordEl.appendChild(mainWordEl);\n\t\t\t\t}\n\t\t\t\tif (emp) {\n\t\t\t\t\tthis.splittedWords[\n\t\t\t\t\t\tthis.splittedWords.length - 1\n\t\t\t\t\t].elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharacterElements,\n\t\t\t\t\t\t\tmerged.endTime - merged.startTime,\n\t\t\t\t\t\t\tmerged.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (merged.word.trimStart() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(wrapperWordEl);\n\t\t\t\tif (merged.word.trimEnd() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t} else if (chunk.word.trim().length === 0) {\n\t\t\t\t// 纯空格\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\t// 单个单词\n\t\t\t\tconst emp = shouldEmphasize(chunk);\n\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t...chunk,\n\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\tsubElements: [],\n\t\t\t\t\telementAnimations: [this.initFloatAnimation(chunk, mainWordEl)],\n\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t};\n\t\t\t\tif (emp) {\n\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\tfor (const char of chunk.word.trim().split(\"\")) {\n\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t}\n\t\t\t\t\trealWord.subElements = charEls;\n\t\t\t\t\tconst duration = Math.abs(realWord.endTime - realWord.startTime);\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharEls,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\trealWord.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// realWord.elementAnimations = this.initEmphasizeAnimation(realWord);\n\t\t\t\t} else {\n\t\t\t\t\tmainWordEl.innerText = chunk.word.trim();\n\t\t\t\t}\n\t\t\t\tif (chunk.word.trimStart() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(mainWordEl);\n\t\t\t\tif (chunk.word.trimEnd() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t}\n\t\t}\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tlet up = 0.05;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tup *= 2;\n\t\t}\n\t\tif (shouldEmphasize(word) && duration < 1200) {\n\t\t\tup = 0;\n\t\t}\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: `translateY(${-up}em)`,\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t\teasing: \"ease-out\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\t// 按照原 Apple Music 参考,强调效果只应用缩放、轻微左右位移和辉光效果,原主要的悬浮位移效果不变\n\t// 为了避免产生锯齿抖动感,使用 matrix3d 来实现缩放和位移\n\tprivate initEmphasizeAnimation(\n\t\tcharacterElements: HTMLElement[],\n\t\tduration: number,\n\t\tdelay: number,\n\t): Animation[] {\n\t\tconst de = Math.max(0, delay);\n\t\tconst du = Math.max(1000, duration);\n\n\t\tlet method = EmphasizeAnimationMethod.FloatAndGlow;\n\n\t\tif (du < 1200) {\n\t\t\tmethod = EmphasizeAnimationMethod.FloatOnly;\n\t\t}\n\n\t\tlet result: Animation[] = [];\n\n\t\tswitch (method) {\n\t\t\tcase EmphasizeAnimationMethod.FloatAndGlow: {\n\t\t\t\tlet amount = 0;\n\t\t\t\tlet blur = 0;\n\t\t\t\tif (du >= 1200 && du < 2000) {\n\t\t\t\t\tamount = 0.7;\n\t\t\t\t\tblur = 0.5;\n\t\t\t\t} else if (du >= 2000 && du < 3000) {\n\t\t\t\t\tamount = 0.8;\n\t\t\t\t\tblur = 0.6;\n\t\t\t\t} else if (du >= 3000 && du < 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t} else if (du >= 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t}\n\t\t\t\tconst animateDu = Number.isFinite(du) ? Math.max(du * 1.2, 2000) : 0;\n\t\t\t\tconst empEasing = makeEmpEasing(EMP_EASING_MID);\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 3 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = empEasing(x);\n\t\t\t\t\t\t\tconst transX = Math.sin(x * Math.PI * 2);\n\t\t\t\t\t\t\tconst glowLevel =\n\t\t\t\t\t\t\t\tMath.max(0, x < EMP_EASING_MID ? y / 2 : y - 0.5) * blur;\n\t\t\t\t\t\t\t// const floatLevel =\n\t\t\t\t\t\t\t// \tMath.max(0, x < EMP_EASING_MID ? y : y - 0.5);\n\n\t\t\t\t\t\t\tconst mat = scaleMatrix4(createMatrix4(), 1 + y * 0.1 * amount);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `${matrix4ToCSS(mat, 4)} translate(${\n\t\t\t\t\t\t\t\t\ttransX * 0.005 * amount\n\t\t\t\t\t\t\t\t}em,${-y * 0.05}em)`,\n\t\t\t\t\t\t\t\ttextShadow: `rgba(255, 255, 255, ${glowLevel}) 0 0 10px`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: animateDu,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-and-glow-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase EmphasizeAnimationMethod.FloatOnly: {\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 1.5 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = x < EMP_EASING_MID ? defaultEmpEasing(x) : 1;\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `translateY(${-y * 0.05}em)`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: Number.isFinite(du) ? du * 2 : 0,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-only-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\tprivate get totalDuration() {\n\t\treturn this.lyricLine.endTime - this.lyricLine.startTime;\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst el = word.mainElement;\n\t\t\tif (el) {\n\t\t\t\tword.padding = parseFloat(getComputedStyle(el).paddingLeft);\n\t\t\t\tword.width = el.clientWidth - word.padding * 2;\n\t\t\t\tword.height = el.clientHeight - word.padding * 2;\n\t\t\t} else {\n\t\t\t\tword.width = 0;\n\t\t\t\tword.height = 0;\n\t\t\t\tword.padding = 0;\n\t\t\t}\n\t\t}\n\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\tthis.generateWebAnimationBasedMaskImage();\n\t\t} else {\n\t\t\tthis.generateCalcBasedMaskImage();\n\t\t}\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tprivate generateCalcBasedMaskImage() {\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + fadeWidth;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t}\n\t}\n\tprivate generateWebAnimationBasedMaskImage() {\n\t\tconst totalDuration = this.totalDuration;\n\t\tthis.splittedWords.forEach((word, i) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\t// TODO: 可选配置渐变宽度\n\t\t\t\t// Apple Music for iPad 上是 `word.height / 2`\n\t\t\t\t// Apple Music for Android 上是 `word.height`\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / (word.width + word.padding * 2),\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\t// 为了尽可能将渐变动画在相连的每个单词间近似衔接起来\n\t\t\t\t// 要综合每个单词的效果时间和间隙生成动画帧数组\n\t\t\t\tconst widthBeforeSelf =\n\t\t\t\t\tthis.splittedWords.slice(0, i).reduce((a, b) => a + b.width, 0) +\n\t\t\t\t\t(this.splittedWords[0] ? fadeWidth : 0);\n\t\t\t\tconst minOffset = -(word.width + word.padding * 2 + fadeWidth);\n\t\t\t\tconst clampOffset = (x: number) => Math.max(minOffset, Math.min(0, x));\n\t\t\t\tlet curPos = -widthBeforeSelf - word.width - word.padding - fadeWidth;\n\t\t\t\tlet timeOffset = 0;\n\t\t\t\tconst frames: Keyframe[] = [];\n\t\t\t\tlet lastPos = curPos;\n\t\t\t\tlet lastTime = 0;\n\t\t\t\tconst pushFrame = () => {\n\t\t\t\t\tconst moveOffset = curPos - lastPos;\n\t\t\t\t\tconst time = Math.max(0, Math.min(1, timeOffset));\n\t\t\t\t\tconst duration = time - lastTime;\n\t\t\t\t\tconst d = Math.abs(duration / moveOffset);\n\t\t\t\t\t// 因为有可能会和之前的动画有边界\n\t\t\t\t\tif (curPos > minOffset && lastPos < minOffset) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos - minOffset) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(lastPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tif (curPos > 0 && lastPos < 0) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\toffset: time,\n\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t};\n\t\t\t\t\tframes.push(frame);\n\t\t\t\t\tlastPos = curPos;\n\t\t\t\t\tlastTime = time;\n\t\t\t\t};\n\t\t\t\tpushFrame();\n\t\t\t\tlet lastTimeStamp = 0;\n\t\t\t\tthis.splittedWords.forEach((otherWord, j) => {\n\t\t\t\t\t// 停顿\n\t\t\t\t\t{\n\t\t\t\t\t\tconst curTimeStamp = otherWord.startTime - this.lyricLine.startTime;\n\t\t\t\t\t\tconst staticDuration = curTimeStamp - lastTimeStamp;\n\t\t\t\t\t\ttimeOffset += staticDuration / totalDuration;\n\t\t\t\t\t\tif (staticDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp = curTimeStamp;\n\t\t\t\t\t}\n\t\t\t\t\t// 移动\n\t\t\t\t\t{\n\t\t\t\t\t\tconst fadeDuration = otherWord.endTime - otherWord.startTime;\n\t\t\t\t\t\ttimeOffset += fadeDuration / totalDuration;\n\t\t\t\t\t\tcurPos += otherWord.width;\n\t\t\t\t\t\tif (j === 0) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 1.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === this.splittedWords.length - 1) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 0.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fadeDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp += fadeDuration;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\t\ta.cancel();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst ani = wordEl.animate(frames, {\n\t\t\t\t\t\tduration: totalDuration || 1,\n\t\t\t\t\t\tid: `fade-word-${word.word}-${i}`,\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.pause();\n\t\t\t\t\tword.maskAnimations = [ani];\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.warn(\"应用渐变动画发生错误\", frames, totalDuration, err);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tconst roundedBlur = Math.round(blur);\n\t\tconst beforeInSight = this.isInSight;\n\t\tconst enableSpring = this.lyricPlayer.getEnableSpring();\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\ttrans.style.opacity = `${opacity / 2}`;\n\t\troman.style.opacity = `${opacity / 2}`;\n\t\tif (force || !enableSpring) {\n\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\t// this.lineWebAnimationTransforms.posX.setTargetPosition(left);\n\t\t\t// this.lineWebAnimationTransforms.posY.setTargetPosition(top);\n\t\t\t// this.lineWebAnimationTransforms.scale.setTargetPosition(scale);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!enableSpring) {\n\t\t\t\tconst afterInSight = this.isInSight;\n\t\t\t\tif (beforeInSight || afterInSight) {\n\t\t\t\t\tthis.show();\n\t\t\t\t} else {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t} else this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\t// this.lineWebAnimationTransforms.posX.stop();\n\t\t\t// this.lineWebAnimationTransforms.posY.stop();\n\t\t\t// this.lineWebAnimationTransforms.scale.stop();\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, roundedBlur)) {\n\t\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, roundedBlur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t_getDebugTargetPos(): string {\n\t\treturn `[位移: ${this.left}, ${this.top}; 缩放: ${this.scale}; 延时: ${this.delay}]`;\n\t}\n\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || r < 0 || t > pb || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport {\n\tLyricLineEl,\n\tRawLyricLineMouseEvent,\n\tshouldEmphasize,\n} from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\n/**\n * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素\n */\nexport class LyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\t/**\n\t\t * 歌词行索引\n\t\t */\n\t\tpublic readonly lineIndex: number,\n\t\t/**\n\t\t * 歌词行元素\n\t\t */\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(`line-${event.type}`, event);\n\t}\n}\n\nexport interface LyricLineMouseEventListener {\n\t(evt: LyricLineMouseEvent): void;\n}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: WeakMap<LyricLineEl, [number, number]> =\n\t\tnew WeakMap();\n\tprivate lyricLinesIndexes: WeakMap<LyricLineEl, number> = new WeakMap();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate hidePassedLines = false;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 16.5,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate emUnit = Math.max(Math.min(innerHeight * 0.05, innerWidth * 0.1), 12);\n\tprivate padding = this.emUnit;\n\tprivate enableBlur = true;\n\tprivate enableScale = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\tprivate scrollBoundary = [0, 0];\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\tprivate readonly onLineClickedHandler = (e: RawLyricLineMouseEvent) => {\n\t\tconst evt = new LyricLineMouseEvent(\n\t\t\tthis.lyricLinesIndexes.get(e.line) ?? -1,\n\t\t\te.line,\n\t\t\te,\n\t\t);\n\t\tif (!this.dispatchEvent(evt)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\t/**\n\t * 是否启用歌词行缩放效果,默认启用\n\t *\n\t * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果\n\t *\n\t * 此效果对性能影响微乎其微,推荐启用\n\t * @param enable 是否启用歌词行缩放效果\n\t */\n\tsetEnableScale(enable = true) {\n\t\tthis.enableScale = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 获取当前是否启用了歌词行缩放效果\n\t * @returns 是否启用歌词行缩放效果\n\t */\n\tgetEnableScale() {\n\t\treturn this.enableScale;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(min(6vh, 8vw), 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t\t\"&:hover\": {\n\t\t\t\t\"& $lyricLine\": {\n\t\t\t\t\tfilter: \"unset !important\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\tbackfaceVisibility: \"hidden\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\theight: \"fit-content\",\n\t\t\tpadding: \"2vh 1.05em\",\n\t\t\tmargin: \"0 -1em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tborderRadius: \"8px\",\n\t\t\t\"&:has(>*):hover\": {\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t\tboxShadow: \"0 0 0 8px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t\t\"&:has(>*):active\": {\n\t\t\t\tboxShadow: \"0 0 0 4px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 1em\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.4,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span, span.emphasize-wrapper\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twillChange: \"transform,display,mask-image\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\"&.emphasize, span.emphasize\": {\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t\"& > span\": {\n\t\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(0.5em, 10px)\",\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\topacity: 0.3,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition:\n\t\t\t\t\t\"filter 0.25s, transform 0.5s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate _baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\tpublic get baseFontSize() {\n\t\treturn this._baseFontSize;\n\t}\n\tprivate isPageVisible = true;\n\tprivate onPageShow = () => {\n\t\tthis.isPageVisible = true;\n\t\tthis.setCurrentTime(this.currentTime, true);\n\t};\n\tprivate onPageHide = () => {\n\t\tthis.isPageVisible = false;\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\twindow.addEventListener(\"pagehide\", this.onPageHide);\n\t\tlet startScrollY = 0;\n\t\tlet direction: \"up\" | \"down\" | \"none\" = \"none\";\n\t\tlet startTouchPosY = 0;\n\t\tlet startScrollTime = 0;\n\t\tlet scrollSpeed = 0;\n\t\tlet scrollId = Symbol(\"amll-scroll\");\n\t\tlet lastMoveY = 0;\n\t\tlet lastDragTime = 0;\n\t\tthis.element.addEventListener(\"touchstart\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\tstartTouchPosY = evt.touches[0].screenY;\n\t\t\t\tlastMoveY = startTouchPosY;\n\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\tscrollSpeed = 0;\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchmove\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tconst touchScreenY = evt.touches[0].screenY;\n\t\t\t\tconst delta = touchScreenY - startTouchPosY;\n\t\t\t\tconst lastDelta = touchScreenY - lastMoveY;\n\t\t\t\tconst targetDirection =\n\t\t\t\t\tlastDelta > 0 ? \"down\" : lastDelta < 0 ? \"up\" : \"none\";\n\t\t\t\tif (direction !== targetDirection) {\n\t\t\t\t\tdirection = targetDirection;\n\t\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\t\tstartTouchPosY = touchScreenY;\n\t\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset = startScrollY - delta;\n\t\t\t\t}\n\t\t\t\tlastMoveY = touchScreenY;\n\t\t\t\tlastDragTime = Date.now();\n\t\t\t\tthis.limitScrollOffset();\n\t\t\t\tthis.calcLayout(true);\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchend\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartTouchPosY = 0;\n\t\t\t\tconst curTime = Date.now();\n\t\t\t\tif (curTime - lastDragTime > 100) return this.endScrollHandler();\n\t\t\t\tconst scrollDuration = curTime - startScrollTime;\n\t\t\t\tscrollSpeed =\n\t\t\t\t\t((this.scrollOffset - startScrollY) / scrollDuration) * 1000;\n\t\t\t\tlet lt = 0;\n\t\t\t\tconst curScrollId = Symbol(\"amll-scroll\");\n\t\t\t\tscrollId = curScrollId;\n\t\t\t\tconst onScrollFrame = (dt: number) => {\n\t\t\t\t\tlt ||= dt;\n\t\t\t\t\tif (scrollId === curScrollId && this.beginScrollHandler()) {\n\t\t\t\t\t\tthis.scrollOffset += (scrollSpeed * (dt - lt)) / 1000;\n\t\t\t\t\t\tscrollSpeed *= 0.99;\n\t\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tMath.abs(scrollSpeed) > 1 &&\n\t\t\t\t\t\t\t!this.scrollBoundary.includes(this.scrollOffset)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.endScrollHandler();\n\t\t\t\t\t\tlt = dt;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t}\n\tprivate beginScrollHandler() {\n\t\tconst allowed = this.allowScroll;\n\t\tif (allowed) {\n\t\t\tthis.isScrolled = true;\n\t\t\tthis.invokedByScrollEvent = true;\n\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\tthis.isScrolled = false;\n\t\t\t\tthis.scrollOffset = 0;\n\t\t\t}, 5000);\n\t\t}\n\t\treturn allowed;\n\t}\n\tprivate endScrollHandler() {\n\t\tthis.invokedByScrollEvent = false;\n\t}\n\tprivate limitScrollOffset() {\n\t\tthis.scrollOffset = Math.max(\n\t\t\tMath.min(this.scrollBoundary[1], this.scrollOffset),\n\t\t\tthis.scrollBoundary[0],\n\t\t);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tMath.max(currentTime, this.processedLines[0].startTime - 250),\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tthis._baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\t// style += \"--amll-player-time:\";\n\t\t// style += this.currentTime;\n\t\t// style += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否隐藏已经播放过的歌词行,默认不隐藏\n\t * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏\n\t */\n\tsetHidePassedLines(hide: boolean) {\n\t\tthis.hidePassedLines = hide;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tfor (const line of lines) {\n\t\t\tfor (const word of line.words) {\n\t\t\t\tword.word = word.word.replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\n\t\t\t\tif (i === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...line,\n\t\t\t\t};\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tthis.lyricLinesEl.forEach((line) => {\n\t\t\tline.removeMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tline.removeMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\tline.dispose();\n\t\t});\n\t\t// const prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line) => {\n\t\t\t// if (this.lyricLinesEl[i]) {\n\t\t\t// \tthis.lyricLinesEl[i].setLine(line);\n\t\t\t// \treturn this.lyricLinesEl[i];\n\t\t\t// } else {\n\t\t\tconst lineEl = new LyricLineEl(this, line);\n\t\t\tlineEl.addMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tlineEl.addMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\treturn lineEl;\n\t\t\t// }\n\t\t});\n\t\t// while (prevLinesEl.length > this.processedLines.length) {\n\t\t// \tconst rest = prevLinesEl.pop();\n\t\t// \trest?.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t// \trest?.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t// \trest?.dispose();\n\t\t// }\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tthis.lyricLinesIndexes.set(el, i);\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重置用户滚动状态\n\t *\n\t * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置\n\t */\n\tresetScroll() {\n\t\tthis.isScrolled = false;\n\t\tthis.scrollOffset = 0;\n\t\tthis.invokedByScrollEvent = false;\n\t\tclearTimeout(this.scrolledHandler);\n\t\tthis.scrolledHandler = 0;\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.emUnit = parseFloat(getComputedStyle(this.element).fontSize);\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = this.enableScale ? 0.95 : 1;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tthis.scrollBoundary[0] = -scrollOffset;\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\t// console.groupCollapsed(\"calcLayout\");\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(this.padding - 20, curPos + 10);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1] + 40;\n\t\t\t}\n\t\t\tlet targetOpacity = 1;\n\t\t\tif (!isActive && i <= (interlude ? interlude[2] : this.scrollToIndex)) {\n\t\t\t\tif (this.hidePassedLines) {\n\t\t\t\t\ttargetOpacity = 0;\n\t\t\t\t} else if (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.15;\n\t\t\t\t}\n\t\t\t} else if (hasBuffered) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.5;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet blurLevel = 0;\n\t\t\tif (this.enableBlur) {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tblurLevel = 0;\n\t\t\t\t} else {\n\t\t\t\t\tblurLevel = 1;\n\t\t\t\t\tif (i < this.scrollToIndex) {\n\t\t\t\t\t\tblurLevel += Math.abs(this.scrollToIndex - i) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblurLevel += Math.abs(\n\t\t\t\t\t\t\ti - Math.max(this.scrollToIndex, latestIndex),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tblurLevel = 0;\n\t\t\t}\n\t\t\tel.setTransform(\n\t\t\t\tthis.padding,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\ttargetOpacity,\n\t\t\t\tblurLevel * 1.5,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\t// console.log(i, el._getDebugTargetPos());\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\tthis.scrollBoundary[1] = curPos + this.scrollOffset - this.size[1] / 2;\n\t\t// console.groupEnd();\n\t\tthis.bottomLine.setTransform(this.padding, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tif (!this.isPageVisible) return;\n\t\tif (!this._getIsNonDynamic() && !this.supportMaskImage)\n\t\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\tif (isSeek) {\n\t\t\tfor (const line of this.lyricLinesEl) {\n\t\t\t\tline.setMaskAnimationState(time);\n\t\t\t}\n\t\t}\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst nextMainLine = this.processedLines[lastHotId + 2];\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.min(\n\t\t\t\t\t\tMath.max(line.endTime, nextMainLine?.startTime ?? Number.MAX_VALUE),\n\t\t\t\t\t\tMath.max(line.endTime, nextLine?.endTime),\n\t\t\t\t\t);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable(time);\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable(time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable(time);\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\t// function debugLog() {\n\t\t\t// \tconsole.groupCollapsed(\"setCurrentTime\", time);\n\t\t\t// \tconsole.log(\"removedIds\", removedIds);\n\t\t\t// \tconsole.log(\"addedIds\", addedIds);\n\t\t\t// \tconsole.groupEnd();\n\t\t\t// }\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\t// debugLog();\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.calcLayout();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * 暂停部分效果演出,目前会暂停播放间奏点的动画\n\t */\n\tpause() {\n\t\tthis.interludeDots.pause();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.pause();\n\t\t}\n\t}\n\t/**\n\t * 恢复部分效果演出,目前会恢复播放间奏点的动画\n\t */\n\tresume() {\n\t\tthis.interludeDots.resume();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.resume();\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tif (!this.isPageVisible) return;\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["AbstractBaseRenderer","BaseRenderer","canvas","__publicField","width","height","scale","speed","TimedContainer","Container","PixiRenderer","delta","lastContainer","s1","s2","s3","s4","maxSize","Application","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","_a","filter","BlurFilter","BulgePinchFilter","enable","fps","_volume","_hasLyric","albumUrl","img","remainRetryTimes","tex","_b","Texture","error","container","Sprite","vertShader","fragShader","blendShader","eplorShader","noiseShader","noiseImage","NOISE_IMAGE_DATA","blurImage","imageData","radius","quality","pixels","rsum","gsum","bsum","asum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1x","divx","rad1y","divy","div2","r","g","b","a","vmin","vmax","saturateImage","saturation","gray","contrastImage","contrast","GLProgram","gl","vertexShaderSource","fragmentShaderSource","label","coordPos","type","source","shader","program","errLog","name","value","location","value1","value2","Framebuffer","fb","texture","GLBuffer","data","usage","buffer","AlbumTexture","mainProgram","vertexBuffer","indexBuffer","albumImageData","albumTexture","sampler","NoiseTexture","_EplorRenderer","bounds","tickTime","frameDelta","realWidth","realHeight","t","fba","fbb","sprite","deleted","isOnlyOneSprite","isTweeningValues","src","dst","volume","imageUrl","resolve","reject","c","ctx","blurRadius","imgw","imgh","hasLyric","s","EplorRenderer","BackgroundRender","renderer","eqSet","xs","ys","derivative","f","getVelocity","Spring","currentPosition","curV","solveSpring","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","damping_frequency","dfm","dm","BottomLineEl","lyricPlayer","style","left","top","force","l","pr","pb","easeInOutBack","clamp","min","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dotsDuration","dot0Opacity","dot1Opacity","dot2Opacity","createMatrix4","scaleMatrix4","m","origin","ox","oy","matrix4ToCSS","fractionDigits","format","n","NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","mY1","mY2","sampleValues","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope","CJKEXP","ANIMATION_FRAME_QUANTITY","norNum","EMP_EASING_MID","beginNum","endNum","makeEmpEasing","mid","bezIn","bezier","bezOut","defaultEmpEasing","generateFadeGradient","padding","bright","dark","totalAspect","widthInTotal","leftPos","chunkAndSplitLyricWords","words","resplitedWords","w","realLength","splited","v","charPos","word","wordChunk","wChunk","result","shouldEmphasize","RawLyricLineMouseEvent","line","event","LyricLineEl","lyricLine","wrapped","listener","main","trans","roman","callback","options","listeners","maskAnimationTime","size","chunkedWords","chunk","merged","emp","wrapperWordEl","characterElements","mainWordEl","charEls","char","charEl","realWord","duration","wordEl","up","de","du","method","amount","blur","animateDu","empEasing","el","arr","wordDe","frames","_","transX","glowLevel","mat","ani","fadeWidth","maskImage","totalAspectStr","maskPos","totalDuration","widthBeforeSelf","minOffset","clampOffset","curPos","timeOffset","lastPos","lastTime","pushFrame","moveOffset","time","d","staticTime","frame","lastTimeStamp","otherWord","j","curTimeStamp","staticDuration","fadeDuration","err","opacity","roundedBlur","beforeInSight","enableSpring","afterInSight","jss","create","preset","LyricLineMouseEvent","lineIndex","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","startScrollY","direction","startTouchPosY","startScrollTime","scrollSpeed","scrollId","lastMoveY","lastDragTime","touchScreenY","lastDelta","targetDirection","curTime","scrollDuration","lt","curScrollId","onScrollFrame","dt","allowed","currentTime","_c","hide","lines","pv","cv","lastLine","pastLine","nextLine","lastWord","lineEl","reflow","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","blurLevel","alignAnchor","alignPosition","isSeek","removedHotIds","removedIds","addedIds","lastHotId","nextMainLine","startTime","endTime","id","deltaS"],"mappings":"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","x_google_ignoreList":[16]}
|
|
1
|
+
{"version":3,"file":"amll-core.cjs","sources":["../src/bg-render/base.ts","../src/utils/resource.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/shaders/base.vert.glsl?raw","../src/bg-render/shaders/base.frag.glsl?raw","../src/bg-render/shaders/blend.frag.glsl?raw","../src/bg-render/shaders/eplor.frag.glsl?raw","../src/bg-render/shaders/noise.frag.glsl?raw","../src/assets/noise 5.png?inline","../src/bg-render/eplor-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/derivative.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/utils/matrix.ts","../../../node_modules/bezier-easing/src/index.js","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { Disposable, HasElement } from \"../interfaces\";\n\nexport abstract class AbstractBaseRenderer implements Disposable, HasElement {\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tabstract setFlowSpeed(speed: number): void;\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tabstract setRenderScale(scale: number): void;\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑资源,纹理加载并设置完成后会返回\n\t * @param albumSource 专辑的资源链接,可以是图片或视频链接,抑或是任意 img/video 元素,如果提供字符串链接且为视频则需要指定第二个参数\n\t */\n\tabstract setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void>;\n\t/**\n\t * 设置低频的音量大小,范围在 80hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t *\n\t * 部分渲染器会根据音量大小调整背景效果(例如根据鼓点跳动)\n\t *\n\t * 如果无法获取到类似的数据,请传入 1.0 作为默认值,或不做任何处理(默认值即 1.0)\n\t * @param volume 低频的音量大小,范围在 50hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t */\n\tabstract setLowFreqVolume(volume: number): void;\n\t/**\n\t * 设置背景是否根据“是否有歌词”这个特征调整自身效果,例如有歌词时会变得更加活跃\n\t *\n\t * 部分渲染器会根据这个特征调整自身效果\n\t *\n\t * 如果不确定是否需要赋值或无法知晓是否包含歌词,请传入 true 或不做任何处理(默认值为 true)\n\t *\n\t * @param hasLyric 是否有歌词,如不确定是否需要赋值,请传入 true 或不做任何处理(默认值为 true)\n\t */\n\tabstract setHasLyric(hasLyric: boolean): void;\n\tabstract dispose(): void;\n\tabstract getElement(): HTMLElement;\n}\n\nexport abstract class BaseRenderer extends AbstractBaseRenderer {\n\tprivate observer: ResizeObserver;\n\tprotected flowSpeed = 2;\n\tprotected currerntRenderScale = 0.75;\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper();\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst width = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientWidth * window.devicePixelRatio * this.currerntRenderScale,\n\t\t\t);\n\t\t\tconst height = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientHeight *\n\t\t\t\t\twindow.devicePixelRatio *\n\t\t\t\t\tthis.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.onResize(width, height);\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t}\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tthis.onResize(\n\t\t\tthis.canvas.clientWidth *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t\tthis.canvas.clientHeight *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t);\n\t}\n\t/**\n\t * 当画板元素大小发生变化时此函数会被调用\n\t * 可以在此处重设和渲染器相关的尺寸设置\n\t * 考虑到初始化的时候元素不一定在文档中或出于某些特殊样式状态,尺寸长宽有可能会为 0,请注意进行特判处理\n\t * @param width 画板元素实际的物理像素宽度,有可能为 0\n\t * @param height 画板元素实际的物理像素高度,有可能为 0\n\t */\n\tprotected onResize(width: number, height: number): void {\n\t\tthis.canvas.width = width;\n\t\tthis.canvas.height = height;\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑资源,纹理加载并设置完成后会返回\n\t * @param albumSource 专辑的资源链接,可以是图片或视频链接,抑或是任意 img/video 元素,如果提供字符串链接且为视频则需要指定第二个参数\n\t */\n\tabstract setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void>;\n\tdispose(): void {\n\t\tthis.observer.disconnect();\n\t\tthis.canvas.remove();\n\t}\n}\n","export function loadImage(imageUrl: string): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = document.createElement(\"img\");\n\t\timg.onload = () => resolve(img);\n\t\timg.onerror = reject;\n\t\timg.src = imageUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\timg\n\t\t\t.decode()\n\t\t\t.then(() => resolve(img))\n\t\t\t.catch(reject);\n\t});\n}\n\nexport function loadVideo(videoUrl: string): Promise<HTMLVideoElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst video = document.createElement(\"video\");\n\t\tlet playing = false;\n\t\tlet timeupdate = false;\n\t\tlet rejected = false;\n\t\tvideo.addEventListener(\n\t\t\t\"playing\",\n\t\t\t() => {\n\t\t\t\tplaying = true;\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tvideo.addEventListener(\n\t\t\t\"timeupdate\",\n\t\t\t() => {\n\t\t\t\ttimeupdate = true;\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tvideo.addEventListener(\n\t\t\t\"error\",\n\t\t\t(err) => {\n\t\t\t\trejected = true;\n\t\t\t\treject(err);\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tfunction checkReady() {\n\t\t\tif (playing && timeupdate && !rejected) {\n\t\t\t\tresolve(video);\n\t\t\t}\n\t\t}\n\t\tvideo.src = videoUrl;\n\t\tvideo.playsInline = true;\n\t\tvideo.crossOrigin = \"anonymous\";\n\t\tvideo.autoplay = true;\n\t\tvideo.loop = true;\n\t\tvideo.muted = true;\n\t\tvideo.play();\n\t});\n}\n\nexport function loadResourceFromUrl(\n\turl: string,\n\tisVideo = false,\n): Promise<HTMLImageElement | HTMLVideoElement> {\n\treturn isVideo ? loadVideo(url) : loadImage(url);\n}\n\nexport function loadResourceFromElement(\n\telement: HTMLImageElement | HTMLVideoElement,\n): Promise<HTMLImageElement | HTMLVideoElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (\n\t\t\telement instanceof HTMLImageElement\n\t\t\t\t? element.complete\n\t\t\t\t: element.readyState >= 3\n\t\t) {\n\t\t\tresolve(element);\n\t\t} else {\n\t\t\telement.onload = () => resolve(element);\n\t\t\telement.onerror = reject;\n\t\t}\n\t});\n}\n","import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { BulgePinchFilter } from \"@pixi/filter-bulge-pinch\";\nimport { BaseRenderer } from \"./base\";\nimport {\n\tloadResourceFromElement,\n\tloadResourceFromUrl,\n} from \"../utils/resource\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer extends BaseRenderer {\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t\tlastContainer.destroy(true);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 1,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.maxFPS = 30;\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\n\tprotected override onResize(width: number, height: number): void {\n\t\tsuper.onResize(width, height);\n\t\tthis.app.resize();\n\t\tthis.rebuildFilters();\n\t}\n\n\toverride setRenderScale(scale: number) {\n\t\tsuper.setRenderScale(scale);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst maxBorder = Math.max(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters?.forEach((filter) => {\n\t\t\tfilter.destroy();\n\t\t});\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tif (Math.random() > 0.5) {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\toverride setStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\n\toverride pause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\n\toverride resume() {\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setLowFreqVolume(_volume: number): void {\n\t\t// NOOP\n\t}\n\n\toverride setHasLyric(_hasLyric: boolean): void {\n\t\t// NOOP\n\t}\n\n\toverride async setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void> {\n\t\tif (typeof albumSource === \"string\" && albumSource.trim().length === 0)\n\t\t\treturn;\n\t\tlet res: HTMLImageElement | HTMLVideoElement | null = null;\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex: Texture | null = null;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tif (typeof albumSource === \"string\") {\n\t\t\t\t\tres = await loadResourceFromUrl(albumSource, isVideo);\n\t\t\t\t} else {\n\t\t\t\t\tres = await loadResourceFromElement(albumSource);\n\t\t\t\t}\n\t\t\t\ttex = Texture.from(res, {\n\t\t\t\t\tresourceOptions: {\n\t\t\t\t\t\tautoLoad: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait tex.baseTexture.resource.load();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumSource,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = null;\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!tex) return;\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(container);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n}\n","export default \"#version 300 es\\nprecision highp float;\\n\\nin vec2 v_coord;\\nout vec2 f_v_coord;\\n\\nvoid main() {\\n gl_Position = vec4(v_coord, 0.0f, 1.0f);\\n f_v_coord = (vec2(v_coord.x, v_coord.y) + vec2(1.0f, 1.0f)) / 2.0f;\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 coord = f_v_coord;\\n fragColor = texture(src, coord);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nuniform float lerp;\\nuniform float scale;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n if(scale < 1.0f) {\\n tex_coord /= scale;\\n }\\n vec4 srcColor = texture(src, tex_coord);\\n fragColor = mix(vec4(srcColor.xyz, 0.0f), srcColor, lerp);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;uniform float IIIlllllllIIIllIl,lIIIlllllIllIl,IIIlllIlIIllll;uniform sampler2D IlllIIlIlllIll;uniform vec2 IIlIlIIlIlIllI,IllIlllIlIIlllI;out vec4 lIIlIIIIIlIlIlllIIIIlIIl;float lIlIIllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII-=0.;return sin(IIIlIIlIIIlllIII);}float lIlIlllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII+=acos(0.);return sin(IIIlIIlIIIlllIII);}mat2 lIIllIIlIIIllIl(float IIIlIIlIIIlllIII){return mat2(lIlIlllllIllIll(IIIlIIlIIIlllIII),-lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII));}mat2 lIIllIIlIIIlllI(float IIIlIIlIIIlllIII){return mat2(lIlIIllllIllIll(IIIlIIlIIIlllIII),-lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII));}float IllllIIlIllII(float llIIllIllIIIllI){return fract(lIlIIllllIllIll(llIIllIllIIIllI)*43758.5453);}float llIlIIllllIII(vec2 IIIlIIlIIIlllIII){vec2 IIllIlIIlllI=floor(IIIlIIlIIIlllIII),lIlIllIIIIIlIl=fract(IIIlIIlIIIlllIII);lIlIllIIIIIlIl=lIlIllIIIIIlIl*lIlIllIIIIIlIl*(3.-2.*lIlIllIIIIIlIl);float lIlIlIlIlIlIIl=IIllIlIIlllI.x+IIllIlIIlllI.y*57.;return mix(mix(IllllIIlIllII(lIlIlIlIlIlIIl),IllllIIlIllII(lIlIlIlIlIlIIl+1.),lIlIllIIIIIlIl.x),mix(IllllIIlIllII(lIlIlIlIlIlIIl+57.),IllllIIlIllII(lIlIlIlIlIlIIl+58.),lIlIllIIIIIlIl.x),lIlIllIIIIIlIl.y);}vec2 lllIIIIIIllIlIIIlI(vec2 IlllIIlIIIIlIIII,float lIIIIlllIIIIllIlIlI,vec2 IlIlIIIIlIlllIlIII){float lIIlIllIIIlIl=llIlIIllllIII(IlllIIlIIIIlIIII*vec2(1)*3.5+.1)*4.2831*mix(.2,1.,IIIlllllllIIIllIl);IlllIIlIIIIlIIII+=vec2(-1,.5);lIIlIllIIIlIl-=lIIIIlllIIIIllIlIlI;return vec2(lIlIlllllIllIll(lIIlIllIIIlIl),lIlIIllllIllIll(lIIlIllIIIlIl));}const mat3 lIIllIIIlllIl=mat3(1.,.02,.002,.02,1.,.008,.002,.02,1.),lIIIlllIIIIll=mat3(1.022,-.02,-.002,-.02,1.028,-.008,-.002,-.02,1.022);void main(){vec2 lIIIlIIllIlIIlI=lIlIIllllIllIll(lIIIlllllIllIl*.2)*.01+.5+gl_FragCoord.xy/IIlIlIIlIlIllI.xy,lIIllIIlIIIllI=lIIIlIIllIlIIlI*.77f+IllIlllIlIIlllI;lIIllIIlIIIllI.x*=IIlIlIIlIlIllI.x/IIlIlIIlIlIllI.y;float lIIlIIlIIlIIIlII=gl_FragCoord.x/max(IIlIlIIlIlIllI.x,IIlIlIIlIlIllI.y),lIIIlIllIllIlIIl=0.f;vec3 lIIIlIlIIIlIlIIl=vec3(0);vec2 lIlIIlIlIIIllIll=lIIllIIlIIIllI;for(int IllIlIIlIIlllllIIIl=0;IllIlIIlIIlllllIIIl<8;IllIlIIlIIlllllIIIl++){bool lIlIlIIllIllIIll=IllIlIIlIIlllllIIIl%2==0;vec2 lIlllIlllIlllII=lllIIIIIIllIlIIIlI(lIIllIIlIIIllI,lIIlIIlIIlIIIlII,lIIIlIIllIlIIlI),lIllIIlIIlIIIll=lIlllIlllIlllII;float lIIlIlIIlIIlIllI=float(IllIlIIlIIlllllIIIl)/8.f;vec3 llIIlIIIIlIIlIII=texture(IlllIIlIlllIll,-lIIIlllllIllIl*.01+.8*lIIllIIlIIIllI*lIIllIIlIIIllIl(-lIIIlllllIllIl*.2)+vec2(IIIlllIlIIllll*.3*(float(lIlIlIIllIllIIll)*2.-1.)*lIIllIIlIIIlllI(lIIIlllllIllIl*.2+1.5))).xyz;lIIIlIlIIIlIlIIl+=llIIlIIIIlIIlIII;lIIIlIllIllIlIIl+=4.f*lIIlIlIIlIIlIllI*(1.f-lIIlIlIIlIIlIllI);lIIllIIlIIIllI+=.01f*lIllIIlIIlIIIll*(lIlIIllllIllIll(lIIIlllllIllIl)*4.8+.8);lIlIIlIlIIIllIll+=.05f*lIllIIlIIlIIIll;}lIIIlIlIIIlIlIIl/=lIIIlIllIllIlIIl;lIIIlIlIIIlIlIIl*=1.6f;lIIIlIlIIIlIlIIl=1.f-exp(-lIIIlIlIIIlIlIIl);lIIIlIlIIIlIlIIl=pow(lIIIlIlIIIlIlIIl,vec3(2.2));lIIIlIlIIIlIlIIl*=.8f;lIIlIIIIIlIlIlllIIIIlIIl=vec4(lIIIlIlIIIlIlIIl,1);}\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\n/* Gradient noise from Jorge Jimenez's presentation: */\\n/* http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare */\\nfloat gradientNoise(in vec2 uv) {\\n return fract(52.9829189f * fract(dot(uv, vec2(0.06711056f, 0.00583715f))));\\n}\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n float dither = (1.0f / 255.0f) * gradientNoise(gl_FragCoord.xy) - (0.5f / 255.0f);\\n vec4 color = texture(src, tex_coord);\\n color += dither;\\n fragColor = color;\\n}\\n\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAYUklEQVR4nH3bV89VVRcF4IX7qNgVe8WKvaIiNsCuYCKCSEg0JCYm/gTjzf4R3njhlRdeWKKi2AvYEBV7b1ixY2+ofPuZcbwxXzie5OQ9Z5+11pxzjDHnKnu/k0477bSN+++/fzvyyCPbdttt17766qu2YcOG9ttvv7U33nijffHFF23atGntgAMOaN98803bc88926RJk9pnn31W10855ZT2888/1/vrr79ur732Wjv00EPbgQce2NavX99eeOGF+nvmmWfWuD4fc8wx1ffDDz9sTz31VPv000/bRx99VL/vsssu7eCDDy57hxxySPv222/L1saNG9vatWsbX19++eXyhb9//PFH23HHHdsHH3zQLrrooorjxRdfrPbG+/jjj9u6devaX3/91aZMmdImT57cdt1114lYu5133rnfeuut28yZM9t+++3XVq9e3T7//PMa9Ljjjqu/m222WTn73HPPtR122KF99913bcsttyyQnnzyybbbbrvVm4MMAe37778vUATIkaOPPrqCe+KJJ9qPP/7Ydt9993bvvfe2lStXtvfee69ttdVW7bzzzmvbbLNN++STT9rUqVPL7jvvvNP+/PPP8o1NNn7//fcakx3XL7300moPyC222KL8ev/99ws8Y2s3xFmAIpD9H374of36669txBEIvf3224UmR1w74YQTyhlgHHTQQeU845Bfs2ZN23fffcsQRn/55Zf6jQJOP/30GvjLL78sMPbee+8y6rM2gvPea6+9yg7Htt1223bSSSe1nXbaqWwC+K677iq2qMU1yqKK0WhUAWGREruuq3GBw8dVq1ZV4Pvss08744wzSgns/fTTT+UzoigIAL53gyM95P7+++9Cj1OQz+ACwb7PHAGA3133phKyY/TVV1+t3zHEAUa8t99++1IDJwAsKFIWkFQQOFaeffbZ9u6775aTgBXskKIVhDEBSxFJCaznOoCpNdJHGlvGNRa5s8N3PiLg5JNPbt1goNfIYKeeemo74ogjKmC5yxlIY/D5559v999/f8nxrLPOqsCBwknIkxcmpISXYFesWFGqIlNKck3bGTNmFNDyltPaUBXnsMWGfKZCeQto/QQqmOnTpxegvvNVH4G7Jg4AG4P8qVM6jCN5JDc5QYZyHHrynFGd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\"","import { Disposable } from \"../interfaces\";\nimport { BaseRenderer } from \"./base\";\nimport vertShader from \"./shaders/base.vert.glsl?raw\";\nimport fragShader from \"./shaders/base.frag.glsl?raw\";\nimport blendShader from \"./shaders/blend.frag.glsl?raw\";\nimport eplorShader from \"./shaders/eplor.frag.glsl?raw\";\nimport noiseShader from \"./shaders/noise.frag.glsl?raw\";\nimport noiseImage from \"../assets/noise 5.png?inline\";\nimport {\n\tloadResourceFromElement,\n\tloadResourceFromUrl,\n} from \"../utils/resource\";\n\nconst NOISE_IMAGE_DATA = (() => {\n\tconst img = document.createElement(\"img\");\n\timg.src = noiseImage;\n\treturn img;\n})();\n\nfunction blurImage(imageData: ImageData, radius: number, quality: number) {\n\tconst pixels = imageData.data;\n\tconst width = imageData.width;\n\tconst height = imageData.height;\n\n\tlet rsum: number;\n\tlet gsum: number;\n\tlet bsum: number;\n\tlet asum: number;\n\tlet x: number;\n\tlet y: number;\n\tlet i: number;\n\tlet p: number;\n\tlet p1: number;\n\tlet p2: number;\n\tlet yp: number;\n\tlet yi: number;\n\tlet yw: number;\n\tconst wm = width - 1;\n\tconst hm = height - 1;\n\tconst rad1x = radius + 1;\n\tconst divx = radius + rad1x;\n\tconst rad1y = radius + 1;\n\tconst divy = radius + rad1y;\n\tconst div2 = 1 / (divx * divy);\n\n\tconst r: number[] = [];\n\tconst g: number[] = [];\n\tconst b: number[] = [];\n\tconst a: number[] = [];\n\n\tconst vmin: number[] = [];\n\tconst vmax: number[] = [];\n\n\twhile (quality-- > 0) {\n\t\tyw = yi = 0;\n\n\t\tfor (y = 0; y < height; y++) {\n\t\t\trsum = pixels[yw] * rad1x;\n\t\t\tgsum = pixels[yw + 1] * rad1x;\n\t\t\tbsum = pixels[yw + 2] * rad1x;\n\t\t\tasum = pixels[yw + 3] * rad1x;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\tp = yw + ((i > wm ? wm : i) << 2);\n\t\t\t\trsum += pixels[p++];\n\t\t\t\tgsum += pixels[p++];\n\t\t\t\tbsum += pixels[p++];\n\t\t\t\tasum += pixels[p];\n\t\t\t}\n\n\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\tr[yi] = rsum;\n\t\t\t\tg[yi] = gsum;\n\t\t\t\tb[yi] = bsum;\n\t\t\t\ta[yi] = asum;\n\n\t\t\t\tif (y === 0) {\n\t\t\t\t\tvmin[x] = Math.min(x + rad1x, wm) << 2;\n\t\t\t\t\tvmax[x] = Math.max(x - radius, 0) << 2;\n\t\t\t\t}\n\n\t\t\t\tp1 = yw + vmin[x];\n\t\t\t\tp2 = yw + vmax[x];\n\n\t\t\t\trsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tgsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tbsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tasum += pixels[p1] - pixels[p2];\n\n\t\t\t\tyi++;\n\t\t\t}\n\t\t\tyw += width << 2;\n\t\t}\n\n\t\tfor (x = 0; x < width; x++) {\n\t\t\typ = x;\n\t\t\trsum = r[yp] * rad1y;\n\t\t\tgsum = g[yp] * rad1y;\n\t\t\tbsum = b[yp] * rad1y;\n\t\t\tasum = a[yp] * rad1y;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\typ += i > hm ? 0 : width;\n\t\t\t\trsum += r[yp];\n\t\t\t\tgsum += g[yp];\n\t\t\t\tbsum += b[yp];\n\t\t\t\tasum += a[yp];\n\t\t\t}\n\n\t\t\tyi = x << 2;\n\t\t\tfor (y = 0; y < height; y++) {\n\t\t\t\tpixels[yi] = (rsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 1] = (gsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 2] = (bsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 3] = (asum * div2 + 0.5) | 0;\n\n\t\t\t\tif (x === 0) {\n\t\t\t\t\tvmin[y] = Math.min(y + rad1y, hm) * width;\n\t\t\t\t\tvmax[y] = Math.max(y - radius, 0) * width;\n\t\t\t\t}\n\n\t\t\t\tp1 = x + vmin[y];\n\t\t\t\tp2 = x + vmax[y];\n\n\t\t\t\trsum += r[p1] - r[p2];\n\t\t\t\tgsum += g[p1] - g[p2];\n\t\t\t\tbsum += b[p1] - b[p2];\n\t\t\t\tasum += a[p1] - a[p2];\n\n\t\t\t\tyi += width << 2;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction saturateImage(imageData: ImageData, saturation: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tconst gray = r * 0.3 + g * 0.59 + b * 0.11;\n\t\tpixels[i] = gray * (1 - saturation) + r * saturation;\n\t\tpixels[i + 1] = gray * (1 - saturation) + g * saturation;\n\t\tpixels[i + 2] = gray * (1 - saturation) + b * saturation;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction brightnessImage(imageData: ImageData, brightness: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = r * brightness;\n\t\tpixels[i + 1] = g * brightness;\n\t\tpixels[i + 2] = b * brightness;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction contrastImage(imageData: ImageData, contrast: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = (r - 128) * contrast + 128;\n\t\tpixels[i + 1] = (g - 128) * contrast + 128;\n\t\tpixels[i + 2] = (b - 128) * contrast + 128;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nclass GLProgram implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprogram: WebGLProgram;\n\tprivate vertexShader: WebGLShader;\n\tprivate fragmentShader: WebGLShader;\n\tprivate coordPos: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\tvertexShaderSource: string,\n\t\tfragmentShaderSource: string,\n\t\tprivate readonly label = \"unknown\",\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.vertexShader = this.createShader(gl.VERTEX_SHADER, vertexShaderSource);\n\t\tthis.fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tfragmentShaderSource,\n\t\t);\n\t\tthis.program = this.createProgram();\n\n\t\tconst coordPos = gl.getAttribLocation(this.program, \"v_coord\");\n\t\tif (coordPos === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get attribute location v_coord for \"${this.label}\"`,\n\t\t\t);\n\t\tthis.coordPos = coordPos;\n\t}\n\tprivate createShader(type: number, source: string) {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type);\n\t\tif (!shader) throw new Error(\"Failed to create shader\");\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to compile shader for type ${type} \"${\n\t\t\t\t\tthis.label\n\t\t\t\t}\": ${gl.getShaderInfoLog(shader)}`,\n\t\t\t);\n\t\t}\n\t\treturn shader;\n\t}\n\tprivate createProgram() {\n\t\tconst gl = this.gl;\n\t\tconst program = gl.createProgram();\n\t\tif (!program) throw new Error(\"Failed to create program\");\n\t\tgl.attachShader(program, this.vertexShader);\n\t\tgl.attachShader(program, this.fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tgl.validateProgram(program);\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst errLog = gl.getProgramInfoLog(program);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow new Error(`Failed to link program \"${this.label}\": ${errLog}`);\n\t\t}\n\t\treturn program;\n\t}\n\tuse() {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tgl.vertexAttribPointer(this.coordPos, 2, gl.FLOAT, false, 0, 0);\n\t\tgl.enableVertexAttribArray(this.coordPos);\n\t}\n\tprivate notFoundUniforms: Set<string> = new Set();\n\tprivate warnUniformNotFound(name: string) {\n\t\tif (this.notFoundUniforms.has(name)) return;\n\t\tthis.notFoundUniforms.add(name);\n\t\tconsole.warn(\n\t\t\t`Failed to get uniform location for program \"${this.label}\": ${name}`,\n\t\t);\n\t}\n\tsetUniform1f(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1f(location, value);\n\t}\n\tsetUniform2f(name: string, value1: number, value2: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform2f(location, value1, value2);\n\t}\n\tsetUniform1i(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1i(location, value);\n\t}\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteShader(this.vertexShader);\n\t\tgl.deleteShader(this.fragmentShader);\n\t\tgl.deleteProgram(this.program);\n\t}\n}\n\nclass Framebuffer implements Disposable {\n\tprivate fb: WebGLFramebuffer;\n\tprivate tex: WebGLTexture;\n\tprivate _size: [number, number];\n\tget size() {\n\t\treturn this._size;\n\t}\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\twidth: number,\n\t\theight: number,\n\t) {\n\t\tthis._size = [width, height];\n\t\tconst fb = gl.createFramebuffer();\n\t\tif (!fb) throw new Error(\"Can't create framebuffer\");\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.fb = fb;\n\t\tthis.tex = tex;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\tgl.framebufferTexture2D(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\tgl.TEXTURE_2D,\n\t\t\ttex,\n\t\t\t0,\n\t\t);\n\t\tthis.resize(width, height);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tresize(width: number, height: number) {\n\t\tconst gl = this.gl;\n\t\tthis.bind();\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.tex);\n\t\tif (gl.getExtension(\"EXT_color_buffer_float\")) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA32F,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.FLOAT,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} else {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.fb);\n\t}\n\tactive(texture: number = this.gl.TEXTURE0) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\tdispose(): void {\n\t\tthis.gl.deleteFramebuffer(this.fb);\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nclass GLBuffer implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprivate buffer: WebGLBuffer;\n\tprivate type: number;\n\tprivate data: ArrayBufferView;\n\tprivate usage: number;\n\tprivate length: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\ttype: number,\n\t\tdata: ArrayBufferView,\n\t\tusage: number,\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.type = type;\n\t\tthis.data = data;\n\t\tthis.usage = usage;\n\t\tconst buffer = gl.createBuffer();\n\t\tif (!buffer) throw new Error(\"Failed to create buffer\");\n\t\tthis.buffer = buffer;\n\t\tthis.length = data.byteLength;\n\t\tgl.bindBuffer(type, this.buffer);\n\t\tgl.bufferData(type, data, usage);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindBuffer(this.type, this.buffer);\n\t}\n\t// update(data: ArrayBufferView) {\n\t// const gl = this.gl;\n\t// gl.bindBuffer(this.type, this.buffer);\n\t// gl.bufferSubData(this.type, 0, data);\n\t// this.data = data;\n\t// }\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteBuffer(this.buffer);\n\t}\n}\n\nclass AlbumTexture implements Disposable {\n\tprivate albumTexture: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\tprivate mainProgram: GLProgram,\n\t\tprivate vertexBuffer: GLBuffer,\n\t\tprivate indexBuffer: GLBuffer,\n\t\talbumImageData: ImageData,\n\t) {\n\t\tconst albumTexture = gl.createTexture();\n\t\tif (!albumTexture) throw new Error(\"Failed to create texture\");\n\t\tthis.albumTexture = albumTexture;\n\t\tgl.bindTexture(gl.TEXTURE_2D, albumTexture);\n\t\tgl.texImage2D(\n\t\t\tgl.TEXTURE_2D,\n\t\t\t0,\n\t\t\tgl.RGBA,\n\t\t\tgl.RGBA,\n\t\t\tgl.UNSIGNED_BYTE,\n\t\t\talbumImageData,\n\t\t);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\n\tdraw(sampler: string) {\n\t\tconst gl = this.gl;\n\t\tthis.mainProgram.use();\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.albumTexture);\n\t\tthis.mainProgram.setUniform1i(sampler, 0);\n\t\tgl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.albumTexture);\n\t}\n}\n\nclass NoiseTexture implements Disposable {\n\tprivate tex: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(private gl: WebGL2RenderingContext) {\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.tex = tex;\n\t\tNOISE_IMAGE_DATA.decode().then(() => {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tNOISE_IMAGE_DATA,\n\t\t\t);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t});\n\t}\n\n\tactive(texture: number = this.gl.TEXTURE1) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nexport class EplorRenderer extends BaseRenderer {\n\tprivate hasLyric = true;\n\tprivate hasLyricValue = 1;\n\tprivate maxFPS = 30;\n\tprivate lastTickTime = 0;\n\tprivate lastFrameTime = 0;\n\tprivate _lowFreqVolume = 1;\n\tprivate paused = false;\n\tprivate staticMode = false;\n\tprivate gl: WebGL2RenderingContext = this.setupGL();\n\tprivate reduceImageSizeCanvas = new OffscreenCanvas(128, 128);\n\tprivate tickHandle = 0;\n\tprivate sprites: AlbumTexture[] = [];\n\tprivate ampTransition = 0;\n\tprivate playTime = 0;\n\tprivate frameTime = 0;\n\tprivate IllIlllIlIIlllI: number[] = [-0.1, 0.0];\n\tprivate onTick(tickTime: number) {\n\t\tthis.tickHandle = 0;\n\t\tif (this.paused) return;\n\n\t\tconst delta = tickTime - this.lastTickTime;\n\t\tconst frameDelta = tickTime - this.lastFrameTime;\n\t\tthis.lastFrameTime = tickTime;\n\t\tif (delta < 1000 / this.maxFPS) {\n\t\t\tthis.requestTick();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hasLyric) this.playTime += frameDelta * this.flowSpeed * 0.2;\n\t\tthis.frameTime += frameDelta;\n\n\t\tif (!(this.onRedraw(this.playTime, frameDelta) && this.staticMode)) {\n\t\t\tthis.requestTick();\n\t\t}\n\n\t\tthis.lastTickTime = tickTime;\n\n\t\tthis.ampTransition;\n\t}\n\n\tprivate mainProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\teplorShader,\n\t\t\"main\",\n\t);\n\tprivate blendProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tblendShader,\n\t\t\"blend\",\n\t);\n\tprivate copyProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tfragShader,\n\t\t\"copy\",\n\t);\n\tprivate noiseProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tnoiseShader,\n\t\t\"noise\",\n\t);\n\n\tprivate static readonly rawVertexBuffer = new Float32Array([\n\t\t-1, -1, 1, -1, -1, 1, 1, 1,\n\t]);\n\n\tprivate static readonly rawIndexBuffer = new Uint16Array([0, 1, 2, 1, 2, 3]);\n\n\tprivate vertexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ARRAY_BUFFER,\n\t\tEplorRenderer.rawVertexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate indexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ELEMENT_ARRAY_BUFFER,\n\t\tEplorRenderer.rawIndexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate noiseTexture = new NoiseTexture(this.gl);\n\n\tprivate fb: [Framebuffer, Framebuffer];\n\tprivate historyFrameBuffer: Framebuffer[] = [];\n\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tconst gl = this.gl;\n\t\tgl.enable(this.gl.BLEND);\n\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\tthis.requestTick();\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tconst width =\n\t\t\tbounds.width * window.devicePixelRatio * this.currerntRenderScale;\n\t\tconst height =\n\t\t\tbounds.height * window.devicePixelRatio * this.currerntRenderScale;\n\t\tthis.fb = [\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t];\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.bind();\n\t\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\t}\n\t\tthis.historyFrameBuffer = new Array(2)\n\t\t\t.fill(0)\n\t\t\t.map(() => new Framebuffer(this.gl, width, height));\n\t\tthis.onResize(width, height);\n\t}\n\tprivate _currentSize = [0, 0];\n\tprivate _targetSize = [0, 0];\n\tprivate renderSize = [0, 0];\n\tprivate pixelSize = [0, 0];\n\n\tprotected override onResize(width: number, height: number): void {\n\t\t// super.onResize(width, height);\n\t\tthis._targetSize = [\n\t\t\tMath.max(1, Math.round(width)),\n\t\t\tMath.max(1, Math.round(height)),\n\t\t];\n\t\tif (this.staticMode) this.requestTick();\n\t}\n\n\tprivate checkResize() {\n\t\tif (\n\t\t\tthis._currentSize[0] === this._targetSize[0] &&\n\t\t\tthis._currentSize[1] === this._targetSize[1]\n\t\t)\n\t\t\treturn;\n\t\tthis._currentSize = [...this._targetSize];\n\t\tconst [width, height] = this._targetSize;\n\t\tconst realWidth = Math.round(\n\t\t\tMath.max(width / this.currerntRenderScale, width),\n\t\t);\n\t\tconst realHeight = Math.round(\n\t\t\tMath.max(height / this.currerntRenderScale, height),\n\t\t);\n\t\tthis.renderSize = [width, height];\n\t\tthis.canvas.width = realWidth;\n\t\tthis.canvas.height = realHeight;\n\t\tthis.pixelSize = [realWidth, realHeight];\n\t\tthis.gl.viewport(0, 0, realWidth, realHeight);\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.resize(width, height);\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.resize(realWidth, realHeight);\n\t\t}\n\t}\n\n\tprivate requestTick() {\n\t\tif (!this.tickHandle)\n\t\t\tthis.tickHandle = requestAnimationFrame((t) => this.onTick(t));\n\t}\n\n\tprivate drawScreen() {\n\t\tthis.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tprivate bindDefaultFrameBuffer() {\n\t\tthis.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\t}\n\n\tprivate onRedraw(tickTime: number, delta: number) {\n\t\tthis.checkResize();\n\t\tthis.hasLyricValue =\n\t\t\t(this.hasLyricValue * 19 + (this.hasLyric ? 1 : 0)) / 20;\n\t\tconst gl = this.gl;\n\t\tthis.vertexBuffer.bind();\n\t\tthis.indexBuffer.bind();\n\n\t\tthis.mainProgram.use();\n\t\tthis.noiseTexture.active();\n\t\tthis.mainProgram.setUniform1i(\"noisetex\", 1);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IIlIlIIlIlIllI\",\n\t\t\tthis.renderSize[0],\n\t\t\tthis.renderSize[1],\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"lIIIlllllIllIl\",\n\t\t\tthis.hasLyric ? tickTime / 1000 : 0,\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\"IIIlllllllIIIllIl\", this.hasLyricValue);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"IIIlllIlIIllll\",\n\t\t\tthis.hasLyric ? this._lowFreqVolume : 0.0,\n\t\t);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IllIlllIlIIlllI\",\n\t\t\tthis.IllIlllIlIIlllI[0],\n\t\t\tthis.IllIlllIlIIlllI[1],\n\t\t);\n\t\tconst [fba, fbb] = this.fb;\n\t\tfbb.bind();\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\tfor (const sprite of this.sprites) {\n\t\t\tfba.bind();\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\t\tthis.mainProgram.use();\n\t\t\tsprite.draw(\"IlllIIlIlllIll\");\n\n\t\t\tfbb.bind();\n\n\t\t\tthis.blendProgram.use();\n\t\t\tfba.active();\n\t\t\tthis.blendProgram.setUniform1i(\"src\", 0);\n\t\t\tthis.blendProgram.setUniform1f(\"lerp\", sprite.alpha);\n\t\t\tthis.blendProgram.setUniform1f(\"scale\", this.currerntRenderScale);\n\t\t\tthis.drawScreen();\n\n\t\t\tsprite.alpha = Math.min(1, sprite.alpha + delta / 200);\n\t\t}\n\n\t\t// 增加噪点以缓解色带现象\n\t\tthis.noiseProgram.use();\n\t\tthis.noiseProgram.setUniform1i(\"src\", 0);\n\t\t// this.noiseProgram.setUniform2f(\n\t\t// \t\"renderSize\",\n\t\t// \tthis.renderSize[0],\n\t\t// \tthis.renderSize[1],\n\t\t// );\n\t\t// this.noiseProgram.setUniform1f(\"frameTime\", this.frameTime);\n\t\tfba.bind();\n\t\tfbb.active();\n\t\tthis.bindDefaultFrameBuffer();\n\t\tthis.drawScreen();\n\n\t\tif (this.sprites.length > 1) {\n\t\t\tconst coveredIndex = this.sprites[this.sprites.length - 1];\n\t\t\tif (coveredIndex.alpha >= 1) {\n\t\t\t\tfor (const deleted of this.sprites.splice(0, this.sprites.length - 1)) {\n\t\t\t\t\tdeleted.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst isOnlyOneSprite =\n\t\t\tthis.sprites.length === 1 && this.sprites[0].alpha >= 1;\n\t\tconst isTweeningValues = this.hasLyric\n\t\t\t? this.hasLyricValue > 0.00001\n\t\t\t: this.hasLyricValue < 0.99999;\n\t\treturn isOnlyOneSprite || !isTweeningValues;\n\t}\n\n\tprivate copyFrameBuffer(src: Framebuffer, dst: Framebuffer | null = null) {\n\t\tif (src === dst) return;\n\t\tsrc.active(this.gl.TEXTURE0);\n\t\tthis.copyProgram.use();\n\t\tif (dst) {\n\t\t\tdst.bind();\n\t\t} else {\n\t\t\tthis.bindDefaultFrameBuffer();\n\t\t}\n\t\tthis.copyProgram.setUniform1i(\"src\", 0);\n\t\t// this.copyProgram.setUniform1f(\"scale\", scale);\n\t\tthis.drawScreen();\n\t}\n\n\tprivate setupGL() {\n\t\tconst gl = this.canvas.getContext(\"webgl2\", {\n\t\t\talpha: true,\n\t\t\tdepth: false,\n\t\t\tpowerPreference: \"low-power\",\n\t\t});\n\t\tif (!gl) throw new Error(\"WebGL2 not supported\");\n\t\tthis.gl = gl;\n\t\tgl.enable(gl.BLEND);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\t\tif (!gl.getExtension(\"EXT_color_buffer_float\"))\n\t\t\tconsole.warn(\"EXT_color_buffer_float not supported\");\n\t\tif (!gl.getExtension(\"EXT_float_blend\"))\n\t\t\tconsole.warn(\"EXT_float_blend not supported\");\n\t\tif (!gl.getExtension(\"OES_texture_float_linear\"))\n\t\t\tconsole.warn(\"OES_texture_float_linear not supported\");\n\n\t\treturn gl;\n\t}\n\n\toverride setLowFreqVolume(volume: number): void {\n\t\tthis._lowFreqVolume = volume;\n\t}\n\n\toverride setStaticMode(enable: boolean): void {\n\t\tthis.staticMode = enable;\n\t\tthis.lastFrameTime = performance.now();\n\t\tthis.requestTick();\n\t}\n\toverride setFPS(fps: number): void {\n\t\tthis.maxFPS = fps;\n\t}\n\toverride pause(): void {\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t\tthis.paused = true;\n\t}\n\toverride resume(): void {\n\t\tthis.paused = false;\n\t\tthis.requestTick();\n\t}\n\toverride async setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo = false,\n\t): Promise<void> {\n\t\tif (typeof albumSource === \"string\" && albumSource.trim().length === 0)\n\t\t\tthrow new Error(\"Empty album url\");\n\t\tlet res: HTMLImageElement | HTMLVideoElement | null = null;\n\t\tlet remainRetryTimes = 5;\n\t\tconsole.log(\"setAlbum\", albumSource);\n\t\twhile (!res && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tif (typeof albumSource === \"string\") {\n\t\t\t\t\tres = await loadResourceFromUrl(albumSource, isVideo);\n\t\t\t\t} else {\n\t\t\t\t\tres = await loadResourceFromElement(albumSource);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album resource, retrying (${remainRetryTimes})`,\n\t\t\t\t\t{\n\t\t\t\t\t\talbumSource,\n\t\t\t\t\t\terror,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tconsole.log(\"loaded album resource\", res);\n\t\tif (!res) return;\n\t\t// resize image\n\t\tconst c = this.reduceImageSizeCanvas;\n\t\tconst ctx = c.getContext(\"2d\");\n\t\tif (!ctx) throw new Error(\"Failed to create canvas context\");\n\t\tctx.clearRect(0, 0, c.width, c.height);\n\t\t// const baseFilter = \"saturate(3) contrast(0.8) saturate(8) brightness(0.4)\";\n\t\tconst blurRadius = 10;\n\t\t// Safari 不支持 filter\n\t\t// ctx.filter = baseFilter;\n\t\tconst imgw =\n\t\t\tres instanceof HTMLVideoElement ? res.videoWidth : res.naturalWidth;\n\t\tconst imgh =\n\t\t\tres instanceof HTMLVideoElement ? res.videoHeight : res.naturalHeight;\n\t\tif (imgw * imgh === 0) throw new Error(\"Invalid image size\");\n\t\tctx.drawImage(res, 0, 0, imgw, imgh, 0, 0, c.width, c.height);\n\t\t// ctx.fillStyle = \"white\";\n\t\t// ctx.fillRect(0, 0, c.width, c.height);\n\t\tconst imageData = ctx.getImageData(0, 0, c.width, c.height);\n\t\tcontrastImage(imageData, 0.8);\n\t\tsaturateImage(imageData, 1.5);\n\t\t//\t\tcontrastImage(imageData, 0.8);\n\t\t//\t\tbrightnessImage(imageData, 0.9);\n\t\tblurImage(imageData, blurRadius, 4);\n\t\tconst sprite = new AlbumTexture(\n\t\t\tthis.gl,\n\t\t\tthis.mainProgram,\n\t\t\tthis.vertexBuffer,\n\t\t\tthis.indexBuffer,\n\t\t\timageData,\n\t\t);\n\t\tthis.sprites.push(sprite);\n\t\tthis.playTime = Math.random() * 100000;\n\t\tthis.lastFrameTime = performance.now();\n\t\tconsole.info(Math.random() * 10000);\n\t\tconst r = Number.parseInt((Math.random() * 10000).toFixed(0)) % 3;\n\t\tif (r === 0) {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t\t// this.IllIlllIlIIlllI = [-1.1, -.9];\n\t\t} else if (r === 1) {\n\t\t\t// this.IllIlllIlIIlllI = [-0.3, -0.2];\n\t\t\tthis.IllIlllIlIIlllI = [-1.1, -0.9];\n\t\t} else {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t}\n\t\tthis.requestTick();\n\t}\n\n\toverride setHasLyric(hasLyric: boolean): void {\n\t\tthis.hasLyric = hasLyric;\n\t\tthis.requestTick();\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.vertexBuffer.dispose();\n\t\tthis.indexBuffer.dispose();\n\t\tthis.noiseTexture.dispose();\n\t\tfor (const s of this.sprites) {\n\t\t\ts.dispose();\n\t\t}\n\t\tthis.copyProgram.dispose();\n\t\tthis.blendProgram.dispose();\n\t\tthis.mainProgram.dispose();\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nexport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nimport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nexport { PixiRenderer } from \"./pixi-renderer\";\nexport { EplorRenderer } from \"./eplor-renderer\";\n\nexport class BackgroundRender<Renderer extends BaseRenderer>\n\timplements AbstractBaseRenderer\n{\n\tprivate element: HTMLCanvasElement;\n\tprivate renderer: Renderer;\n\tconstructor(renderer: Renderer, canvas: HTMLCanvasElement) {\n\t\tthis.renderer = renderer;\n\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t\tcanvas.style.contain = \"strict\";\n\t}\n\n\tstatic new<Renderer extends BaseRenderer>(type: {\n\t\tnew (canvas: HTMLCanvasElement): Renderer;\n\t}): BackgroundRender<Renderer> {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\treturn new BackgroundRender(new type(canvas), canvas);\n\t}\n\n\tsetRenderScale(scale: number): void {\n\t\tthis.renderer.setRenderScale(scale);\n\t}\n\n\tsetFlowSpeed(speed: number): void {\n\t\tthis.renderer.setFlowSpeed(speed);\n\t}\n\tsetStaticMode(enable: boolean): void {\n\t\tthis.renderer.setStaticMode(enable);\n\t}\n\tsetFPS(fps: number): void {\n\t\tthis.renderer.setFPS(fps);\n\t}\n\tpause(): void {\n\t\tthis.renderer.pause();\n\t}\n\tresume(): void {\n\t\tthis.renderer.resume();\n\t}\n\tsetLowFreqVolume(volume: number): void {\n\t\tthis.renderer.setLowFreqVolume(volume);\n\t}\n\tsetHasLyric(hasLyric: boolean): void {\n\t\tthis.renderer.setHasLyric(hasLyric);\n\t}\n\tsetAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void> {\n\t\treturn this.renderer.setAlbum(albumSource, isVideo);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tthis.renderer.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","export function derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nexport function getVelocity(f: (t: number) => number): (t: number) => number {\n\treturn derivative(f);\n}\n","import { getVelocity } from \"./derivative\";\n\n/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate getV2: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t\tthis.getV2 = getVelocity(this.getV);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.getV2(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t}\n\tconst damping_frequency = Math.sqrt(4.0 * mass * stiffness - damping ** 2.0);\n\tconst leftover =\n\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\tconst dfm = (0.5 * damping_frequency) / mass;\n\tconst dm = -(0.5 * damping) / mass;\n\treturn (t: seconds) => {\n\t\tt -= delay;\n\t\tif (t < 0) return from;\n\t\treturn (\n\t\t\tto -\n\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\tMath.E ** (t * dm)\n\t\t);\n\t};\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < 0 || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate playing = true;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate interludeTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tpause() {\n\t\tthis.playing = false;\n\t}\n\tresume() {\n\t\tthis.playing = true;\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.playing) return;\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left.toFixed(\n\t\t\t2,\n\t\t)}px, ${this.top.toFixed(2)}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t20 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - ((1000 - currentDuration) / 1000) ** 2;\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst dotsDuration = Math.max(0, interludeDuration - 750);\n\n\t\t\t\tscale = Math.max(0, scale) * 0.7;\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - dotsDuration / 3) * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (dotsDuration / 3) * 2) * 3) / dotsDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","// biome-ignore format: matrix\nexport type Matrix4 = [\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n];\n\nexport function createMatrix4(): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n}\n\nexport function scaleMatrix4(\n\tm: Matrix4,\n\tscale = 1,\n\torigin = { x: 0, y: 0 },\n): Matrix4 {\n\tconst [ox, oy] = [origin.x, origin.y];\n\t// biome-ignore format: matrix\n\treturn [\n m[0] * scale , m[1] * scale , m[2] * scale , m[3],\n m[4] * scale , m[5] * scale , m[6] * scale , m[7],\n m[8] * scale , m[9] * scale , m[10] * scale, m[11],\n m[12] - ox * scale + ox, m[13] - oy * scale + oy, m[14] , m[15]\n ];\n}\n\nexport function translateMatrix4(m: Matrix4, x = 0, y = 0, z = 0): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n m[0] , m[1] , m[2] , m[3] ,\n m[4] , m[5] , m[6] , m[7] ,\n m[8] , m[9] , m[10] , m[11],\n m[12] + x, m[13] + y, m[14] + z, m[15]\n ];\n}\n\nexport function matrix4ToCSS(m: Matrix4, fractionDigits = 4): string {\n\tconst format = (n: number, i: number) => n.toFixed(fractionDigits);\n\treturn `matrix3d(${m.map(format).join(\", \")})`;\n}\n","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { createMatrix4, matrix4ToCSS, scaleMatrix4 } from \"../utils/matrix\";\nimport { Spring } from \"../utils/spring\";\nimport bezier from \"bezier-easing\";\nimport { WebAnimationSpring } from \"../utils/wa-spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\nenum EmphasizeAnimationMethod {\n\tFloatAndGlow = \"float-and-glow\",\n\tFloatOnly = \"float-only\",\n}\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\tmaskAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tpadding: number;\n\tshouldEmphasize: boolean;\n}\n\nconst ANIMATION_FRAME_QUANTITY = 32;\n\nconst norNum = (min: number, max: number) => (x: number) =>\n\tMath.min(1, Math.max(0, (x - min) / (max - min)));\nconst EMP_EASING_MID = 0.4;\nconst beginNum = norNum(0, EMP_EASING_MID);\nconst endNum = norNum(EMP_EASING_MID, 1);\n\nconst makeEmpEasing = (mid: number) => {\n\tconst bezIn = bezier(0.3, 0, 0.25, 1);\n\tconst bezOut = bezier(0.5, 0, 0.3, 1);\n\treturn (x: number) => (x < mid ? bezIn(beginNum(x)) : 1 - bezOut(endNum(x)));\n};\nconst defaultEmpEasing = makeEmpEasing(EMP_EASING_MID);\n\n// function generateFadeGradient(\n// \twidth: number,\n// \tpadding = 0,\n// \tbright = \"rgba(0,0,0,0.85)\",\n// \tdark = \"rgba(0,0,0,0.25)\",\n// ): [string, number] {\n// \tconst totalAspect = 2 + width + padding;\n// \tconst widthInTotal = width / totalAspect;\n// \tconst leftPos = (1 - widthInTotal) / 2;\n// \treturn [\n// \t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n// \t\t\tleftPos * 100\n// \t\t}%,${bright} ${(leftPos + widthInTotal) * 100}%,${dark} ${\n// \t\t\t(leftPos + widthInTotal) * 100\n// \t\t}%)`,\n// \t\ttotalAspect,\n// \t];\n// }\n\nfunction generateFadeGradient(\n\twidth: number,\n\tpadding = 0,\n\tbright = \"rgba(0,0,0,0.85)\",\n\tdark = \"rgba(0,0,0,0.25)\",\n): [string, number] {\n\tconst totalAspect = 2 + width + padding;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar so\", \"sweet\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"], \"so\", \"sweet\"]\nfunction chunkAndSplitLyricWords(\n\twords: LyricWord[],\n): (LyricWord | LyricWord[])[] {\n\tconst resplitedWords: LyricWord[] = [];\n\n\tfor (const w of words) {\n\t\tconst realLength = w.word.replace(/\\s/g, \"\").length;\n\t\tconst splited = w.word.split(\" \").filter((v) => v.trim().length > 0);\n\t\tif (splited.length > 1) {\n\t\t\tif (w.word.startsWith(\" \")) {\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet charPos = 0;\n\t\t\tfor (const s of splited) {\n\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\tword: s,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tw.startTime + (charPos / realLength) * (w.endTime - w.startTime),\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tw.startTime +\n\t\t\t\t\t\t((charPos + s.length) / realLength) * (w.endTime - w.startTime),\n\t\t\t\t};\n\t\t\t\tresplitedWords.push(word);\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t\tcharPos += s.length;\n\t\t\t}\n\t\t\tif (!w.word.endsWith(\" \")) {\n\t\t\t\tresplitedWords.pop();\n\t\t\t}\n\t\t} else {\n\t\t\tresplitedWords.push(w);\n\t\t}\n\t}\n\n\tlet wordChunk: string[] = [];\n\tlet wChunk: LyricWord[] = [];\n\tconst result: (LyricWord | LyricWord[])[] = [];\n\n\tfor (const w of resplitedWords) {\n\t\tconst word = w.word;\n\t\twordChunk.push(word);\n\t\twChunk.push(w);\n\t\tif (word.length > 0 && word.trim().length === 0) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\tresult.push(w);\n\t\t\twordChunk = [];\n\t\t\twChunk = [];\n\t\t} else if (\n\t\t\t!/^\\s*[^\\s]*\\s*$/.test(wordChunk.join(\"\")) ||\n\t\t\tCJKEXP.test(word)\n\t\t) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\twordChunk = [word];\n\t\t\twChunk = [w];\n\t\t}\n\t}\n\n\tif (wChunk.length === 1) {\n\t\tresult.push(wChunk[0]);\n\t} else {\n\t\tresult.push(wChunk);\n\t}\n\n\treturn result;\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn (\n\t\tword.endTime - word.startTime >= 1000 &&\n\t\tword.word.trim().length <= 7 &&\n\t\tword.word.trim().length >= 1\n\t);\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent\n\t\t? evt\n\t\t: never;\n};\ntype MouseEventTypes = MouseEventMap[keyof MouseEventMap];\ntype MouseEventListener = (\n\tthis: LyricLineEl,\n\tev: RawLyricLineMouseEvent,\n) => void;\n\nexport class LyricLineEl extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\t// readonly lineWebAnimationTransforms = {\n\t// \tposX: new WebAnimationSpring(this.element, \"transform\", (v) => `translateX(${v.toFixed(1)}px)`),\n\t// \tposY: new WebAnimationSpring(this.element, \"transform\", (v) => `translateY(${v.toFixed(1)}px)`),\n\t// \tscale: new WebAnimationSpring(this.element, \"transform\", (v) => `scale(${v.toFixed(4)})`, 1),\n\t// };\n\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis._prevParentEl = lyricPlayer.getElement();\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate listenersMap = new Map<string, Set<MouseEventListener>>();\n\tprivate readonly onMouseEvent = (e: MouseEvent) => {\n\t\tconst wrapped = new RawLyricLineMouseEvent(this, e);\n\t\tfor (const listener of this.listenersMap.get(e.type) ?? []) {\n\t\t\tlistener.call(this, wrapped);\n\t\t}\n\t\tif (!this.dispatchEvent(wrapped) || wrapped.defaultPrevented) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn false;\n\t\t}\n\t};\n\n\taddMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | AddEventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type) ?? new Set();\n\t\t\tif (listeners.size === 0)\n\t\t\t\tthis.element.addEventListener(type, this.onMouseEvent, options);\n\t\t\tlisteners.add(callback);\n\t\t\tthis.listenersMap.set(type, listeners);\n\t\t}\n\t}\n\n\tremoveMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | EventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t\tif (listeners.size === 0)\n\t\t\t\t\tthis.element.removeEventListener(type, this.onMouseEvent, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isEnabled = false;\n\tenable(maskAnimationTime = this.lyricLine.startTime) {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t\tmain.classList.add(\"active\");\n\t}\n\tdisable(maskAnimationTime = 0) {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t\tmain.classList.remove(\"active\");\n\t}\n\tresume() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t}\n\tpause() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t}\n\tsetMaskAnimationState(maskAnimationTime = 0) {\n\t\tconst t = maskAnimationTime - this.lyricLine.startTime;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(this.totalDuration, Math.max(0, t));\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\tif (t >= 0 && t < this.totalDuration) a.play();\n\t\t\t\telse a.pause();\n\t\t\t}\n\t\t}\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate _prevParentEl: HTMLElement | null = null;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tif (this._prevParentEl) {\n\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\tthis._prevParentEl = null;\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tif (this.element.parentElement) {\n\t\t\tthis._prevParentEl = this.element.parentElement;\n\t\t\tthis.element.remove();\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = \"\";\n\t\t// if (this.lyricPlayer.getEnableSpring()) {\n\t\tstyle += `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px) scale(${this.lineTransforms.scale\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(4)});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\t// 如果是非动态歌词,那么就不需要分词了\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tconst chunkedWords = chunkAndSplitLyricWords(this.lyricLine.words);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\t// 多个没有空格的单词组合成的一个单词数组\n\t\t\t\tif (chunk.length === 0) continue;\n\t\t\t\tconst merged = chunk.reduce(\n\t\t\t\t\t(a, b) => {\n\t\t\t\t\t\ta.endTime = Math.max(a.endTime, b.endTime);\n\t\t\t\t\t\ta.startTime = Math.min(a.startTime, b.startTime);\n\t\t\t\t\t\ta.word += b.word;\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t},\n\t\t\t\t\t{ word: \"\", startTime: Infinity, endTime: -Infinity },\n\t\t\t\t);\n\t\t\t\tconst emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, shouldEmphasize(merged));\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\twrapperWordEl.classList.add(\"emphasize-wrapper\");\n\t\t\t\tconst characterElements: HTMLElement[] = [];\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\t// const mainWordFloatAnimation = this.initFloatAnimation(\n\t\t\t\t\t// \tmerged,\n\t\t\t\t\t// \tmainWordEl,\n\t\t\t\t\t// );\n\t\t\t\t\tif (emp) {\n\t\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\t\tfor (const char of word.word.trim().split(\"\")) {\n\t\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\t\tcharacterElements.push(charEl);\n\t\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: charEls,\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(merged, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmainWordEl.innerText = word.word;\n\t\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: [],\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(word, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\twrapperWordEl.appendChild(mainWordEl);\n\t\t\t\t}\n\t\t\t\tif (emp) {\n\t\t\t\t\tthis.splittedWords[\n\t\t\t\t\t\tthis.splittedWords.length - 1\n\t\t\t\t\t].elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharacterElements,\n\t\t\t\t\t\t\tmerged.endTime - merged.startTime,\n\t\t\t\t\t\t\tmerged.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (merged.word.trimStart() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(wrapperWordEl);\n\t\t\t\tif (merged.word.trimEnd() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t} else if (chunk.word.trim().length === 0) {\n\t\t\t\t// 纯空格\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\t// 单个单词\n\t\t\t\tconst emp = shouldEmphasize(chunk);\n\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t...chunk,\n\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\tsubElements: [],\n\t\t\t\t\telementAnimations: [this.initFloatAnimation(chunk, mainWordEl)],\n\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t};\n\t\t\t\tif (emp) {\n\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\tfor (const char of chunk.word.trim().split(\"\")) {\n\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t}\n\t\t\t\t\trealWord.subElements = charEls;\n\t\t\t\t\tconst duration = Math.abs(realWord.endTime - realWord.startTime);\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharEls,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\trealWord.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// realWord.elementAnimations = this.initEmphasizeAnimation(realWord);\n\t\t\t\t} else {\n\t\t\t\t\tmainWordEl.innerText = chunk.word.trim();\n\t\t\t\t}\n\t\t\t\tif (chunk.word.trimStart() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(mainWordEl);\n\t\t\t\tif (chunk.word.trimEnd() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t}\n\t\t}\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tlet up = 0.05;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tup *= 2;\n\t\t}\n\t\tif (shouldEmphasize(word) && duration < 1200) {\n\t\t\tup = 0;\n\t\t}\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: `translateY(${-up}em)`,\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t\teasing: \"ease-out\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\t// 按照原 Apple Music 参考,强调效果只应用缩放、轻微左右位移和辉光效果,原主要的悬浮位移效果不变\n\t// 为了避免产生锯齿抖动感,使用 matrix3d 来实现缩放和位移\n\tprivate initEmphasizeAnimation(\n\t\tcharacterElements: HTMLElement[],\n\t\tduration: number,\n\t\tdelay: number,\n\t): Animation[] {\n\t\tconst de = Math.max(0, delay);\n\t\tconst du = Math.max(1000, duration);\n\n\t\tlet method = EmphasizeAnimationMethod.FloatAndGlow;\n\n\t\tif (du < 1200) {\n\t\t\tmethod = EmphasizeAnimationMethod.FloatOnly;\n\t\t}\n\n\t\tlet result: Animation[] = [];\n\n\t\tswitch (method) {\n\t\t\tcase EmphasizeAnimationMethod.FloatAndGlow: {\n\t\t\t\tlet amount = 0;\n\t\t\t\tlet blur = 0;\n\t\t\t\tif (du >= 1200 && du < 2000) {\n\t\t\t\t\tamount = 0.7;\n\t\t\t\t\tblur = 0.5;\n\t\t\t\t} else if (du >= 2000 && du < 3000) {\n\t\t\t\t\tamount = 0.8;\n\t\t\t\t\tblur = 0.6;\n\t\t\t\t} else if (du >= 3000 && du < 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t} else if (du >= 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t}\n\t\t\t\tconst animateDu = Number.isFinite(du) ? Math.max(du * 1.2, 2000) : 0;\n\t\t\t\tconst empEasing = makeEmpEasing(EMP_EASING_MID);\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 3 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = empEasing(x);\n\t\t\t\t\t\t\tconst transX = Math.sin(x * Math.PI * 2);\n\t\t\t\t\t\t\tconst glowLevel =\n\t\t\t\t\t\t\t\tMath.max(0, x < EMP_EASING_MID ? y / 2 : y - 0.5) * blur;\n\t\t\t\t\t\t\t// const floatLevel =\n\t\t\t\t\t\t\t// \tMath.max(0, x < EMP_EASING_MID ? y : y - 0.5);\n\n\t\t\t\t\t\t\tconst mat = scaleMatrix4(createMatrix4(), 1 + y * 0.1 * amount);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `${matrix4ToCSS(mat, 4)} translate(${\n\t\t\t\t\t\t\t\t\ttransX * 0.005 * amount\n\t\t\t\t\t\t\t\t}em,${-y * 0.05}em)`,\n\t\t\t\t\t\t\t\ttextShadow: `rgba(255, 255, 255, ${glowLevel}) 0 0 10px`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: animateDu,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-and-glow-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase EmphasizeAnimationMethod.FloatOnly: {\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 1.5 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = x < EMP_EASING_MID ? defaultEmpEasing(x) : 1;\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `translateY(${-y * 0.05}em)`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: Number.isFinite(du) ? du * 2 : 0,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-only-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\tprivate get totalDuration() {\n\t\treturn this.lyricLine.endTime - this.lyricLine.startTime;\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst el = word.mainElement;\n\t\t\tif (el) {\n\t\t\t\tword.padding = parseFloat(getComputedStyle(el).paddingLeft);\n\t\t\t\tword.width = el.clientWidth - word.padding * 2;\n\t\t\t\tword.height = el.clientHeight - word.padding * 2;\n\t\t\t} else {\n\t\t\t\tword.width = 0;\n\t\t\t\tword.height = 0;\n\t\t\t\tword.padding = 0;\n\t\t\t}\n\t\t}\n\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\tthis.generateWebAnimationBasedMaskImage();\n\t\t} else {\n\t\t\tthis.generateCalcBasedMaskImage();\n\t\t}\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tprivate generateCalcBasedMaskImage() {\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + fadeWidth;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t}\n\t}\n\tprivate generateWebAnimationBasedMaskImage() {\n\t\tconst totalDuration = this.totalDuration;\n\t\tthis.splittedWords.forEach((word, i) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\t// TODO: 可选配置渐变宽度\n\t\t\t\t// Apple Music for iPad 上是 `word.height / 2`\n\t\t\t\t// Apple Music for Android 上是 `word.height`\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / (word.width + word.padding * 2),\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\t// 为了尽可能将渐变动画在相连的每个单词间近似衔接起来\n\t\t\t\t// 要综合每个单词的效果时间和间隙生成动画帧数组\n\t\t\t\tconst widthBeforeSelf =\n\t\t\t\t\tthis.splittedWords.slice(0, i).reduce((a, b) => a + b.width, 0) +\n\t\t\t\t\t(this.splittedWords[0] ? fadeWidth : 0);\n\t\t\t\tconst minOffset = -(word.width + word.padding * 2 + fadeWidth);\n\t\t\t\tconst clampOffset = (x: number) => Math.max(minOffset, Math.min(0, x));\n\t\t\t\tlet curPos = -widthBeforeSelf - word.width - word.padding - fadeWidth;\n\t\t\t\tlet timeOffset = 0;\n\t\t\t\tconst frames: Keyframe[] = [];\n\t\t\t\tlet lastPos = curPos;\n\t\t\t\tlet lastTime = 0;\n\t\t\t\tconst pushFrame = () => {\n\t\t\t\t\tconst moveOffset = curPos - lastPos;\n\t\t\t\t\tconst time = Math.max(0, Math.min(1, timeOffset));\n\t\t\t\t\tconst duration = time - lastTime;\n\t\t\t\t\tconst d = Math.abs(duration / moveOffset);\n\t\t\t\t\t// 因为有可能会和之前的动画有边界\n\t\t\t\t\tif (curPos > minOffset && lastPos < minOffset) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos - minOffset) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(lastPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tif (curPos > 0 && lastPos < 0) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\toffset: time,\n\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t};\n\t\t\t\t\tframes.push(frame);\n\t\t\t\t\tlastPos = curPos;\n\t\t\t\t\tlastTime = time;\n\t\t\t\t};\n\t\t\t\tpushFrame();\n\t\t\t\tlet lastTimeStamp = 0;\n\t\t\t\tthis.splittedWords.forEach((otherWord, j) => {\n\t\t\t\t\t// 停顿\n\t\t\t\t\t{\n\t\t\t\t\t\tconst curTimeStamp = otherWord.startTime - this.lyricLine.startTime;\n\t\t\t\t\t\tconst staticDuration = curTimeStamp - lastTimeStamp;\n\t\t\t\t\t\ttimeOffset += staticDuration / totalDuration;\n\t\t\t\t\t\tif (staticDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp = curTimeStamp;\n\t\t\t\t\t}\n\t\t\t\t\t// 移动\n\t\t\t\t\t{\n\t\t\t\t\t\tconst fadeDuration = otherWord.endTime - otherWord.startTime;\n\t\t\t\t\t\ttimeOffset += fadeDuration / totalDuration;\n\t\t\t\t\t\tcurPos += otherWord.width;\n\t\t\t\t\t\tif (j === 0) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 1.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === this.splittedWords.length - 1) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 0.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fadeDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp += fadeDuration;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\t\ta.cancel();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst ani = wordEl.animate(frames, {\n\t\t\t\t\t\tduration: totalDuration || 1,\n\t\t\t\t\t\tid: `fade-word-${word.word}-${i}`,\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.pause();\n\t\t\t\t\tword.maskAnimations = [ani];\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.warn(\"应用渐变动画发生错误\", frames, totalDuration, err);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tconst roundedBlur = Math.round(blur);\n\t\tconst beforeInSight = this.isInSight;\n\t\tconst enableSpring = this.lyricPlayer.getEnableSpring();\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\ttrans.style.opacity = `${opacity / 2}`;\n\t\troman.style.opacity = `${opacity / 2}`;\n\t\tif (force || !enableSpring) {\n\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\t// this.lineWebAnimationTransforms.posX.setTargetPosition(left);\n\t\t\t// this.lineWebAnimationTransforms.posY.setTargetPosition(top);\n\t\t\t// this.lineWebAnimationTransforms.scale.setTargetPosition(scale);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!enableSpring) {\n\t\t\t\tconst afterInSight = this.isInSight;\n\t\t\t\tif (beforeInSight || afterInSight) {\n\t\t\t\t\tthis.show();\n\t\t\t\t} else {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t} else this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\t// this.lineWebAnimationTransforms.posX.stop();\n\t\t\t// this.lineWebAnimationTransforms.posY.stop();\n\t\t\t// this.lineWebAnimationTransforms.scale.stop();\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, roundedBlur)) {\n\t\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, roundedBlur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t_getDebugTargetPos(): string {\n\t\treturn `[位移: ${this.left}, ${this.top}; 缩放: ${this.scale}; 延时: ${this.delay}]`;\n\t}\n\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || r < 0 || t > pb || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport {\n\tLyricLineEl,\n\tRawLyricLineMouseEvent,\n\tshouldEmphasize,\n} from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\n/**\n * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素\n */\nexport class LyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\t/**\n\t\t * 歌词行索引\n\t\t */\n\t\tpublic readonly lineIndex: number,\n\t\t/**\n\t\t * 歌词行元素\n\t\t */\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(`line-${event.type}`, event);\n\t}\n}\n\nexport interface LyricLineMouseEventListener {\n\t(evt: LyricLineMouseEvent): void;\n}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: WeakMap<LyricLineEl, [number, number]> =\n\t\tnew WeakMap();\n\tprivate lyricLinesIndexes: WeakMap<LyricLineEl, number> = new WeakMap();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate hidePassedLines = false;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 16.5,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate emUnit = Math.max(Math.min(innerHeight * 0.05, innerWidth * 0.1), 12);\n\tprivate padding = this.emUnit;\n\tprivate enableBlur = true;\n\tprivate enableScale = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\tprivate scrollBoundary = [0, 0];\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\tprivate readonly onLineClickedHandler = (e: RawLyricLineMouseEvent) => {\n\t\tconst evt = new LyricLineMouseEvent(\n\t\t\tthis.lyricLinesIndexes.get(e.line) ?? -1,\n\t\t\te.line,\n\t\t\te,\n\t\t);\n\t\tif (!this.dispatchEvent(evt)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\t/**\n\t * 是否启用歌词行缩放效果,默认启用\n\t *\n\t * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果\n\t *\n\t * 此效果对性能影响微乎其微,推荐启用\n\t * @param enable 是否启用歌词行缩放效果\n\t */\n\tsetEnableScale(enable = true) {\n\t\tthis.enableScale = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 获取当前是否启用了歌词行缩放效果\n\t * @returns 是否启用歌词行缩放效果\n\t */\n\tgetEnableScale() {\n\t\treturn this.enableScale;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(min(6vh, 8vw), 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t\t\"&:hover\": {\n\t\t\t\t\"& $lyricLine\": {\n\t\t\t\t\tfilter: \"unset !important\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\tbackfaceVisibility: \"hidden\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\theight: \"fit-content\",\n\t\t\tpadding: \"2vh 1.05em\",\n\t\t\tmargin: \"0 -1em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tborderRadius: \"8px\",\n\t\t\t\"&:has(>*):hover\": {\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t\tboxShadow: \"0 0 0 8px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t\t\"&:has(>*):active\": {\n\t\t\t\tboxShadow: \"0 0 0 4px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 1em\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.4,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span, span.emphasize-wrapper\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twillChange: \"transform,display,mask-image\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\"&.emphasize, span.emphasize\": {\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t\"& > span\": {\n\t\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(0.5em, 10px)\",\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\topacity: 0.3,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition:\n\t\t\t\t\t\"filter 0.25s, transform 0.5s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate _baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\tpublic get baseFontSize() {\n\t\treturn this._baseFontSize;\n\t}\n\tprivate isPageVisible = true;\n\tprivate onPageShow = () => {\n\t\tthis.isPageVisible = true;\n\t\tthis.setCurrentTime(this.currentTime, true);\n\t};\n\tprivate onPageHide = () => {\n\t\tthis.isPageVisible = false;\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\twindow.addEventListener(\"pagehide\", this.onPageHide);\n\t\tlet startScrollY = 0;\n\t\tlet direction: \"up\" | \"down\" | \"none\" = \"none\";\n\t\tlet startTouchPosY = 0;\n\t\tlet startScrollTime = 0;\n\t\tlet scrollSpeed = 0;\n\t\tlet scrollId = Symbol(\"amll-scroll\");\n\t\tlet lastMoveY = 0;\n\t\tlet lastDragTime = 0;\n\t\tthis.element.addEventListener(\"touchstart\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\tstartTouchPosY = evt.touches[0].screenY;\n\t\t\t\tlastMoveY = startTouchPosY;\n\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\tscrollSpeed = 0;\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchmove\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tconst touchScreenY = evt.touches[0].screenY;\n\t\t\t\tconst delta = touchScreenY - startTouchPosY;\n\t\t\t\tconst lastDelta = touchScreenY - lastMoveY;\n\t\t\t\tconst targetDirection =\n\t\t\t\t\tlastDelta > 0 ? \"down\" : lastDelta < 0 ? \"up\" : \"none\";\n\t\t\t\tif (direction !== targetDirection) {\n\t\t\t\t\tdirection = targetDirection;\n\t\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\t\tstartTouchPosY = touchScreenY;\n\t\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset = startScrollY - delta;\n\t\t\t\t}\n\t\t\t\tlastMoveY = touchScreenY;\n\t\t\t\tlastDragTime = Date.now();\n\t\t\t\tthis.limitScrollOffset();\n\t\t\t\tthis.calcLayout(true);\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchend\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartTouchPosY = 0;\n\t\t\t\tconst curTime = Date.now();\n\t\t\t\tif (curTime - lastDragTime > 100) return this.endScrollHandler();\n\t\t\t\tconst scrollDuration = curTime - startScrollTime;\n\t\t\t\tscrollSpeed =\n\t\t\t\t\t((this.scrollOffset - startScrollY) / scrollDuration) * 1000;\n\t\t\t\tlet lt = 0;\n\t\t\t\tconst curScrollId = Symbol(\"amll-scroll\");\n\t\t\t\tscrollId = curScrollId;\n\t\t\t\tconst onScrollFrame = (dt: number) => {\n\t\t\t\t\tlt ||= dt;\n\t\t\t\t\tif (scrollId === curScrollId && this.beginScrollHandler()) {\n\t\t\t\t\t\tthis.scrollOffset += (scrollSpeed * (dt - lt)) / 1000;\n\t\t\t\t\t\tscrollSpeed *= 0.99;\n\t\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tMath.abs(scrollSpeed) > 1 &&\n\t\t\t\t\t\t\t!this.scrollBoundary.includes(this.scrollOffset)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.endScrollHandler();\n\t\t\t\t\t\tlt = dt;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t}\n\tprivate beginScrollHandler() {\n\t\tconst allowed = this.allowScroll;\n\t\tif (allowed) {\n\t\t\tthis.isScrolled = true;\n\t\t\tthis.invokedByScrollEvent = true;\n\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\tthis.isScrolled = false;\n\t\t\t\tthis.scrollOffset = 0;\n\t\t\t}, 5000);\n\t\t}\n\t\treturn allowed;\n\t}\n\tprivate endScrollHandler() {\n\t\tthis.invokedByScrollEvent = false;\n\t}\n\tprivate limitScrollOffset() {\n\t\tthis.scrollOffset = Math.max(\n\t\t\tMath.min(this.scrollBoundary[1], this.scrollOffset),\n\t\t\tthis.scrollBoundary[0],\n\t\t);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tMath.max(currentTime, this.processedLines[0].startTime - 250),\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tthis._baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\t// style += \"--amll-player-time:\";\n\t\t// style += this.currentTime;\n\t\t// style += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否隐藏已经播放过的歌词行,默认不隐藏\n\t * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏\n\t */\n\tsetHidePassedLines(hide: boolean) {\n\t\tthis.hidePassedLines = hide;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tfor (const line of lines) {\n\t\t\tfor (const word of line.words) {\n\t\t\t\tword.word = word.word.replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\n\t\t\t\tif (i === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...line,\n\t\t\t\t};\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tthis.lyricLinesEl.forEach((line) => {\n\t\t\tline.removeMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tline.removeMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\tline.dispose();\n\t\t});\n\t\t// const prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line) => {\n\t\t\t// if (this.lyricLinesEl[i]) {\n\t\t\t// \tthis.lyricLinesEl[i].setLine(line);\n\t\t\t// \treturn this.lyricLinesEl[i];\n\t\t\t// } else {\n\t\t\tconst lineEl = new LyricLineEl(this, line);\n\t\t\tlineEl.addMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tlineEl.addMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\treturn lineEl;\n\t\t\t// }\n\t\t});\n\t\t// while (prevLinesEl.length > this.processedLines.length) {\n\t\t// \tconst rest = prevLinesEl.pop();\n\t\t// \trest?.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t// \trest?.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t// \trest?.dispose();\n\t\t// }\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tthis.lyricLinesIndexes.set(el, i);\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重置用户滚动状态\n\t *\n\t * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置\n\t */\n\tresetScroll() {\n\t\tthis.isScrolled = false;\n\t\tthis.scrollOffset = 0;\n\t\tthis.invokedByScrollEvent = false;\n\t\tclearTimeout(this.scrolledHandler);\n\t\tthis.scrolledHandler = 0;\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.emUnit = parseFloat(getComputedStyle(this.element).fontSize);\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = this.enableScale ? 0.95 : 1;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tthis.scrollBoundary[0] = -scrollOffset;\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\t// console.groupCollapsed(\"calcLayout\");\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(this.padding - 20, curPos + 10);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1] + 40;\n\t\t\t}\n\t\t\tlet targetOpacity = 1;\n\t\t\tif (!isActive && i <= (interlude ? interlude[2] : this.scrollToIndex)) {\n\t\t\t\tif (this.hidePassedLines) {\n\t\t\t\t\ttargetOpacity = 0;\n\t\t\t\t} else if (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.15;\n\t\t\t\t}\n\t\t\t} else if (hasBuffered) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.5;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet blurLevel = 0;\n\t\t\tif (this.enableBlur) {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tblurLevel = 0;\n\t\t\t\t} else {\n\t\t\t\t\tblurLevel = 1;\n\t\t\t\t\tif (i < this.scrollToIndex) {\n\t\t\t\t\t\tblurLevel += Math.abs(this.scrollToIndex - i) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblurLevel += Math.abs(\n\t\t\t\t\t\t\ti - Math.max(this.scrollToIndex, latestIndex),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tblurLevel = 0;\n\t\t\t}\n\t\t\tel.setTransform(\n\t\t\t\tthis.padding,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\ttargetOpacity,\n\t\t\t\tblurLevel * 1.5,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\t// console.log(i, el._getDebugTargetPos());\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\tthis.scrollBoundary[1] = curPos + this.scrollOffset - this.size[1] / 2;\n\t\t// console.groupEnd();\n\t\tthis.bottomLine.setTransform(this.padding, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tif (!this.isPageVisible) return;\n\t\tif (!this._getIsNonDynamic() && !this.supportMaskImage)\n\t\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\tif (isSeek) {\n\t\t\tfor (const line of this.lyricLinesEl) {\n\t\t\t\tline.setMaskAnimationState(time);\n\t\t\t}\n\t\t}\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst nextMainLine = this.processedLines[lastHotId + 2];\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.min(\n\t\t\t\t\t\tMath.max(line.endTime, nextMainLine?.startTime ?? Number.MAX_VALUE),\n\t\t\t\t\t\tMath.max(line.endTime, nextLine?.endTime),\n\t\t\t\t\t);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable(time);\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable(time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable(time);\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\t// function debugLog() {\n\t\t\t// \tconsole.groupCollapsed(\"setCurrentTime\", time);\n\t\t\t// \tconsole.log(\"removedIds\", removedIds);\n\t\t\t// \tconsole.log(\"addedIds\", addedIds);\n\t\t\t// \tconsole.groupEnd();\n\t\t\t// }\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\t// debugLog();\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.calcLayout();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * 暂停部分效果演出,目前会暂停播放间奏点的动画\n\t */\n\tpause() {\n\t\tthis.interludeDots.pause();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.pause();\n\t\t}\n\t}\n\t/**\n\t * 恢复部分效果演出,目前会恢复播放间奏点的动画\n\t */\n\tresume() {\n\t\tthis.interludeDots.resume();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.resume();\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tif (!this.isPageVisible) return;\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["AbstractBaseRenderer","BaseRenderer","canvas","__publicField","width","height","scale","speed","loadImage","imageUrl","resolve","reject","img","loadVideo","videoUrl","video","playing","timeupdate","rejected","checkReady","err","loadResourceFromUrl","url","isVideo","loadResourceFromElement","element","TimedContainer","Container","PixiRenderer","delta","lastContainer","s1","s2","s3","s4","maxSize","Application","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","_a","filter","BlurFilter","BulgePinchFilter","enable","fps","_volume","_hasLyric","albumSource","res","remainRetryTimes","tex","_b","Texture","error","container","Sprite","vertShader","fragShader","blendShader","eplorShader","noiseShader","noiseImage","NOISE_IMAGE_DATA","blurImage","imageData","radius","quality","pixels","rsum","gsum","bsum","asum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1x","divx","rad1y","divy","div2","r","g","b","a","vmin","vmax","saturateImage","saturation","gray","contrastImage","contrast","GLProgram","gl","vertexShaderSource","fragmentShaderSource","label","coordPos","type","source","shader","program","errLog","name","value","location","value1","value2","Framebuffer","fb","texture","GLBuffer","data","usage","buffer","AlbumTexture","mainProgram","vertexBuffer","indexBuffer","albumImageData","albumTexture","sampler","NoiseTexture","_EplorRenderer","bounds","tickTime","frameDelta","realWidth","realHeight","t","fba","fbb","sprite","deleted","isOnlyOneSprite","isTweeningValues","src","dst","volume","c","ctx","blurRadius","imgw","imgh","hasLyric","s","EplorRenderer","BackgroundRender","renderer","eqSet","xs","ys","derivative","f","getVelocity","Spring","currentPosition","curV","solveSpring","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","damping_frequency","dfm","dm","BottomLineEl","lyricPlayer","style","left","top","force","l","pr","pb","easeInOutBack","clamp","min","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dotsDuration","dot0Opacity","dot1Opacity","dot2Opacity","createMatrix4","scaleMatrix4","m","origin","ox","oy","matrix4ToCSS","fractionDigits","format","n","NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","mY1","mY2","sampleValues","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope","CJKEXP","ANIMATION_FRAME_QUANTITY","norNum","EMP_EASING_MID","beginNum","endNum","makeEmpEasing","mid","bezIn","bezier","bezOut","defaultEmpEasing","generateFadeGradient","padding","bright","dark","totalAspect","widthInTotal","leftPos","chunkAndSplitLyricWords","words","resplitedWords","w","realLength","splited","v","charPos","word","wordChunk","wChunk","result","shouldEmphasize","RawLyricLineMouseEvent","line","event","LyricLineEl","lyricLine","wrapped","listener","main","trans","roman","callback","options","listeners","maskAnimationTime","size","chunkedWords","chunk","merged","emp","wrapperWordEl","characterElements","mainWordEl","charEls","char","charEl","realWord","duration","wordEl","up","de","du","method","amount","blur","animateDu","empEasing","el","arr","wordDe","frames","_","transX","glowLevel","mat","ani","fadeWidth","maskImage","totalAspectStr","maskPos","totalDuration","widthBeforeSelf","minOffset","clampOffset","curPos","timeOffset","lastPos","lastTime","pushFrame","moveOffset","time","d","staticTime","frame","lastTimeStamp","otherWord","j","curTimeStamp","staticDuration","fadeDuration","opacity","roundedBlur","beforeInSight","enableSpring","afterInSight","jss","create","preset","LyricLineMouseEvent","lineIndex","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","startScrollY","direction","startTouchPosY","startScrollTime","scrollSpeed","scrollId","lastMoveY","lastDragTime","touchScreenY","lastDelta","targetDirection","curTime","scrollDuration","lt","curScrollId","onScrollFrame","dt","allowed","currentTime","_c","hide","lines","pv","cv","lastLine","pastLine","nextLine","lastWord","lineEl","reflow","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","blurLevel","alignAnchor","alignPosition","isSeek","removedHotIds","removedIds","addedIds","lastHotId","nextMainLine","startTime","endTime","id","deltaS"],"mappings":"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","x_google_ignoreList":[17]}
|