@lightningjs/renderer 0.9.3 → 1.0.0-rc.0
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/README.md +0 -82
- package/dist/exports/index.d.ts +40 -3
- package/dist/exports/index.js +35 -3
- package/dist/exports/index.js.map +1 -1
- package/dist/src/core/CoreNode.d.ts +462 -46
- package/dist/src/core/CoreNode.js +171 -103
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreShaderManager.d.ts +19 -8
- package/dist/src/core/CoreShaderManager.js +21 -21
- package/dist/src/core/CoreShaderManager.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +30 -4
- package/dist/src/core/CoreTextNode.js +24 -1
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.d.ts +31 -82
- package/dist/src/core/CoreTextureManager.js +39 -126
- package/dist/src/core/CoreTextureManager.js.map +1 -1
- package/dist/src/core/Stage.d.ts +67 -9
- package/dist/src/core/Stage.js +174 -30
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/TextureMemoryManager.d.ts +97 -8
- package/dist/src/core/TextureMemoryManager.js +142 -19
- package/dist/src/core/TextureMemoryManager.js.map +1 -1
- package/dist/src/core/animations/CoreAnimation.d.ts +14 -6
- package/dist/src/core/animations/CoreAnimation.js +136 -44
- package/dist/src/core/animations/CoreAnimation.js.map +1 -1
- package/dist/src/core/lib/ImageWorker.js +59 -52
- package/dist/src/core/lib/ImageWorker.js.map +1 -1
- package/dist/src/core/lib/utils.d.ts +1 -0
- package/dist/src/core/lib/utils.js +3 -2
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/platform.js +7 -1
- package/dist/src/core/platform.js.map +1 -1
- package/dist/src/core/renderers/CoreContextTexture.d.ts +3 -2
- package/dist/src/core/renderers/CoreContextTexture.js +7 -1
- package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +5 -1
- package/dist/src/core/renderers/CoreRenderer.js +0 -1
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +3 -0
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +16 -1
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -1
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -5
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +2 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +7 -10
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +47 -9
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/newShader/abcMock.js +2 -0
- package/dist/src/core/renderers/webgl/newShader/abcMock.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +24 -8
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +70 -37
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +8 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +103 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +3 -18
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +4 -36
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +3 -2
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +4 -2
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +2 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -36
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +11 -0
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +5 -2
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -1
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +10 -26
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +116 -365
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -2
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +2 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +3 -2
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
- package/dist/src/core/textures/ColorTexture.d.ts +1 -1
- package/dist/src/core/textures/ColorTexture.js +1 -1
- package/dist/src/core/textures/ImageTexture.d.ts +1 -1
- package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
- package/dist/src/core/textures/NoiseTexture.js +3 -0
- package/dist/src/core/textures/NoiseTexture.js.map +1 -1
- package/dist/src/core/textures/SubTexture.d.ts +2 -2
- package/dist/src/core/textures/SubTexture.js +5 -1
- package/dist/src/core/textures/SubTexture.js.map +1 -1
- package/dist/src/core/textures/Texture.d.ts +23 -2
- package/dist/src/core/textures/Texture.js +32 -3
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/core/utils.d.ts +7 -0
- package/dist/src/core/utils.js +12 -10
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/effectsMock.d.ts +13 -0
- package/dist/src/effectsMock.js +62 -0
- package/dist/src/effectsMock.js.map +1 -0
- package/dist/src/main-api/DynamicShaderController.d.ts +28 -0
- package/dist/src/main-api/DynamicShaderController.js +55 -0
- package/dist/src/main-api/DynamicShaderController.js.map +1 -0
- package/dist/src/main-api/INode.d.ts +43 -463
- package/dist/src/main-api/INode.js +1 -19
- package/dist/src/main-api/INode.js.map +1 -1
- package/dist/src/main-api/Inspector.d.ts +10 -10
- package/dist/src/main-api/Inspector.js +18 -15
- package/dist/src/main-api/Inspector.js.map +1 -1
- package/dist/src/main-api/Renderer.d.ts +28 -24
- package/dist/src/main-api/Renderer.js +22 -103
- package/dist/src/main-api/Renderer.js.map +1 -1
- package/dist/src/main-api/ShaderController.d.ts +31 -0
- package/dist/src/main-api/ShaderController.js +37 -0
- package/dist/src/main-api/ShaderController.js.map +1 -0
- package/dist/src/test.js +4 -0
- package/dist/src/test.js.map +1 -0
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.js +7 -0
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/index.ts +60 -3
- package/package.json +8 -7
- package/src/core/CoreNode.test.ts +93 -0
- package/src/core/CoreNode.ts +675 -187
- package/src/core/CoreShaderManager.ts +63 -31
- package/src/core/CoreTextNode.ts +41 -9
- package/src/core/CoreTextureManager.ts +55 -175
- package/src/core/Stage.ts +199 -43
- package/src/core/TextureMemoryManager.ts +231 -22
- package/src/core/animations/CoreAnimation.ts +193 -68
- package/src/core/lib/ImageWorker.ts +79 -52
- package/src/core/lib/utils.ts +5 -2
- package/src/core/platform.ts +8 -1
- package/src/core/renderers/CoreContextTexture.ts +9 -2
- package/src/core/renderers/CoreRenderer.ts +5 -2
- package/src/core/renderers/canvas/CanvasCoreRenderer.ts +20 -1
- package/src/core/renderers/canvas/CanvasCoreTexture.ts +2 -6
- package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +2 -2
- package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +7 -11
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +51 -9
- package/src/core/renderers/webgl/shaders/DynamicShader.ts +114 -55
- package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +129 -3
- package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +7 -15
- package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +5 -2
- package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +6 -15
- package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +6 -2
- package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +10 -2
- package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +2 -1
- package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +6 -15
- package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +20 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +14 -15
- package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -2
- package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -1
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +139 -447
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -3
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -2
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +4 -2
- package/src/core/text-rendering/renderers/TextRenderer.ts +3 -2
- package/src/core/textures/ColorTexture.ts +1 -1
- package/src/core/textures/ImageTexture.ts +1 -1
- package/src/core/textures/NoiseTexture.ts +4 -1
- package/src/core/textures/SubTexture.ts +7 -7
- package/src/core/textures/Texture.ts +46 -3
- package/src/core/utils.ts +12 -11
- package/src/main-api/DynamicShaderController.ts +97 -0
- package/src/main-api/INode.ts +56 -479
- package/src/main-api/Inspector.ts +37 -39
- package/src/main-api/Renderer.ts +543 -0
- package/src/main-api/ShaderController.ts +81 -0
- package/src/main-api/utils.ts +45 -0
- package/src/utils.ts +8 -0
- package/dist/exports/core-api.d.ts +0 -74
- package/dist/exports/core-api.js +0 -96
- package/dist/exports/core-api.js.map +0 -1
- package/dist/exports/main-api.d.ts +0 -30
- package/dist/exports/main-api.js +0 -45
- package/dist/exports/main-api.js.map +0 -1
- package/dist/src/core/CoreExtension.d.ts +0 -12
- package/dist/src/core/CoreExtension.js +0 -29
- package/dist/src/core/CoreExtension.js.map +0 -1
- package/dist/src/core/renderers/webgl/newShader/effectsMock.js +0 -36
- package/dist/src/core/renderers/webgl/newShader/effectsMock.js.map +0 -1
- package/dist/src/main-api/ICoreDriver.d.ts +0 -24
- package/dist/src/main-api/ICoreDriver.js +0 -20
- package/dist/src/main-api/ICoreDriver.js.map +0 -1
- package/dist/src/main-api/RendererMain.d.ts +0 -378
- package/dist/src/main-api/RendererMain.js +0 -367
- package/dist/src/main-api/RendererMain.js.map +0 -1
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
- package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
- package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
- package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
- package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
- package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
- package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
- package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
- package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
- package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
- package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
- package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
- package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
- package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
- package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
- package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
- package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
- package/dist/src/render-drivers/utils.d.ts +0 -12
- package/dist/src/render-drivers/utils.js +0 -74
- package/dist/src/render-drivers/utils.js.map +0 -1
- package/exports/core-api.ts +0 -102
- package/exports/main-api.ts +0 -60
- package/src/core/CoreExtension.ts +0 -32
- package/src/main-api/ICoreDriver.ts +0 -68
- package/src/main-api/RendererMain.ts +0 -685
- package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +0 -45
- package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +0 -154
- package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +0 -54
- package/src/render-drivers/main/MainCoreDriver.ts +0 -159
- package/src/render-drivers/main/MainOnlyNode.ts +0 -553
- package/src/render-drivers/main/MainOnlyTextNode.ts +0 -261
- package/src/render-drivers/threadx/NodeStruct.ts +0 -320
- package/src/render-drivers/threadx/SharedNode.ts +0 -101
- package/src/render-drivers/threadx/TextNodeStruct.ts +0 -213
- package/src/render-drivers/threadx/ThreadXCoreDriver.ts +0 -291
- package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +0 -135
- package/src/render-drivers/threadx/ThreadXMainNode.ts +0 -201
- package/src/render-drivers/threadx/ThreadXMainTextNode.ts +0 -85
- package/src/render-drivers/threadx/ThreadXRendererMessage.ts +0 -112
- package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +0 -253
- package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +0 -151
- package/src/render-drivers/threadx/worker/renderer.ts +0 -156
- package/src/render-drivers/utils.ts +0 -102
- /package/dist/src/core/renderers/webgl/newShader/{effectsMock.d.ts → abcMock.d.ts} +0 -0
- /package/dist/src/{render-drivers/threadx/worker/renderer.d.ts → test.d.ts} +0 -0
|
@@ -18,19 +18,13 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { EventEmitter } from '../../../common/EventEmitter.js';
|
|
21
|
-
import { assertTruthy
|
|
21
|
+
import { assertTruthy } from '../../../utils.js';
|
|
22
|
+
import type { CoreNode } from '../../CoreNode.js';
|
|
23
|
+
import type { CoreTextNode } from '../../CoreTextNode.js';
|
|
22
24
|
import type { Stage } from '../../Stage.js';
|
|
23
|
-
import type { Matrix3d } from '../../lib/Matrix3d.js';
|
|
24
25
|
import {
|
|
25
|
-
intersectRect,
|
|
26
|
-
type Bound,
|
|
27
|
-
intersectBound,
|
|
28
26
|
getNormalizedRgbaComponents,
|
|
29
|
-
type Rect,
|
|
30
27
|
getNormalizedAlphaComponent,
|
|
31
|
-
type BoundWithValid,
|
|
32
|
-
createBound,
|
|
33
|
-
type RectWithValid,
|
|
34
28
|
} from '../../lib/utils.js';
|
|
35
29
|
import type { ImageTexture } from '../../textures/ImageTexture.js';
|
|
36
30
|
import { TrFontManager, type FontFamilyMap } from '../TrFontManager.js';
|
|
@@ -62,13 +56,6 @@ declare module './TextRenderer.js' {
|
|
|
62
56
|
}
|
|
63
57
|
}
|
|
64
58
|
|
|
65
|
-
interface CanvasPageInfo {
|
|
66
|
-
texture: ImageTexture | undefined;
|
|
67
|
-
lineNumStart: number;
|
|
68
|
-
lineNumEnd: number;
|
|
69
|
-
valid: boolean;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
59
|
function getFontCssString(props: TrProps): string {
|
|
73
60
|
const { fontFamily, fontStyle, fontWeight, fontStretch, fontSize } = props;
|
|
74
61
|
return [fontStyle, fontWeight, fontStretch, `${fontSize}px`, fontFamily].join(
|
|
@@ -77,9 +64,8 @@ function getFontCssString(props: TrProps): string {
|
|
|
77
64
|
}
|
|
78
65
|
|
|
79
66
|
export interface CanvasTextRendererState extends TextRendererState {
|
|
67
|
+
node: CoreTextNode;
|
|
80
68
|
props: TrProps;
|
|
81
|
-
|
|
82
|
-
fontFaceLoadedHandler: (() => void) | undefined;
|
|
83
69
|
fontInfo:
|
|
84
70
|
| {
|
|
85
71
|
fontFace: WebTrFontFace;
|
|
@@ -87,28 +73,16 @@ export interface CanvasTextRendererState extends TextRendererState {
|
|
|
87
73
|
loaded: boolean;
|
|
88
74
|
}
|
|
89
75
|
| undefined;
|
|
90
|
-
|
|
76
|
+
textureNode: CoreNode | undefined;
|
|
91
77
|
lightning2TextRenderer: LightningTextTextureRenderer;
|
|
92
78
|
renderInfo: RenderInfo | undefined;
|
|
93
|
-
renderWindow: Bound | undefined;
|
|
94
|
-
visibleWindow: BoundWithValid;
|
|
95
79
|
}
|
|
96
80
|
|
|
97
|
-
/**
|
|
98
|
-
* Ephemeral bounds object used for intersection calculations
|
|
99
|
-
*
|
|
100
|
-
* @remarks
|
|
101
|
-
* Used to avoid creating a new object every time we need to intersect
|
|
102
|
-
* element bounds.
|
|
103
|
-
*/
|
|
104
|
-
const tmpElementBounds = createBound(0, 0, 0, 0);
|
|
105
|
-
|
|
106
81
|
export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
107
82
|
protected canvas: OffscreenCanvas | HTMLCanvasElement;
|
|
108
83
|
protected context:
|
|
109
84
|
| OffscreenCanvasRenderingContext2D
|
|
110
85
|
| CanvasRenderingContext2D;
|
|
111
|
-
private rendererBounds: Bound;
|
|
112
86
|
/**
|
|
113
87
|
* Font family map used to store web font faces that were added to the
|
|
114
88
|
* canvas text renderer.
|
|
@@ -124,25 +98,21 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
124
98
|
this.canvas = document.createElement('canvas');
|
|
125
99
|
}
|
|
126
100
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
127
|
-
let context = this.canvas.getContext('2d'
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
| null;
|
|
101
|
+
let context = this.canvas.getContext('2d', {
|
|
102
|
+
willReadFrequently: true,
|
|
103
|
+
}) as OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D | null;
|
|
131
104
|
if (!context) {
|
|
132
105
|
// A browser may appear to support OffscreenCanvas but not actually support the Canvas '2d' context
|
|
133
106
|
// Here we try getting the context again after falling back to an HTMLCanvasElement.
|
|
134
107
|
// See: https://github.com/lightning-js/renderer/issues/26#issuecomment-1750438486
|
|
135
108
|
this.canvas = document.createElement('canvas');
|
|
136
|
-
context = this.canvas.getContext('2d'
|
|
109
|
+
context = this.canvas.getContext('2d', {
|
|
110
|
+
willReadFrequently: true,
|
|
111
|
+
});
|
|
137
112
|
}
|
|
138
113
|
assertTruthy(context);
|
|
139
114
|
this.context = context;
|
|
140
|
-
|
|
141
|
-
x1: 0,
|
|
142
|
-
y1: 0,
|
|
143
|
-
x2: this.stage.options.appWidth,
|
|
144
|
-
y2: this.stage.options.appHeight,
|
|
145
|
-
};
|
|
115
|
+
|
|
146
116
|
// Install the default 'san-serif' font face
|
|
147
117
|
this.addFontFace(
|
|
148
118
|
new WebTrFontFace({
|
|
@@ -197,11 +167,9 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
197
167
|
},
|
|
198
168
|
x: (state, value) => {
|
|
199
169
|
state.props.x = value;
|
|
200
|
-
this.invalidateVisibleWindowCache(state);
|
|
201
170
|
},
|
|
202
171
|
y: (state, value) => {
|
|
203
172
|
state.props.y = value;
|
|
204
|
-
this.invalidateVisibleWindowCache(state);
|
|
205
173
|
},
|
|
206
174
|
contain: (state, value) => {
|
|
207
175
|
state.props.contain = value;
|
|
@@ -252,9 +220,6 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
252
220
|
state.props.overflowSuffix = value;
|
|
253
221
|
this.invalidateLayoutCache(state);
|
|
254
222
|
},
|
|
255
|
-
// debug: (state, value) => {
|
|
256
|
-
// state.props.debug = value;
|
|
257
|
-
// },
|
|
258
223
|
};
|
|
259
224
|
}
|
|
260
225
|
|
|
@@ -296,31 +261,26 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
296
261
|
faceSet.add(fontFace);
|
|
297
262
|
}
|
|
298
263
|
|
|
299
|
-
override createState(
|
|
264
|
+
override createState(
|
|
265
|
+
props: TrProps,
|
|
266
|
+
node: CoreTextNode,
|
|
267
|
+
): CanvasTextRendererState {
|
|
300
268
|
return {
|
|
269
|
+
node,
|
|
301
270
|
props,
|
|
302
271
|
status: 'initialState',
|
|
303
272
|
updateScheduled: false,
|
|
304
273
|
emitter: new EventEmitter(),
|
|
305
|
-
|
|
274
|
+
textureNode: undefined,
|
|
306
275
|
lightning2TextRenderer: new LightningTextTextureRenderer(
|
|
307
276
|
this.canvas,
|
|
308
277
|
this.context,
|
|
309
278
|
),
|
|
310
|
-
renderWindow: undefined,
|
|
311
|
-
visibleWindow: {
|
|
312
|
-
x1: 0,
|
|
313
|
-
y1: 0,
|
|
314
|
-
x2: 0,
|
|
315
|
-
y2: 0,
|
|
316
|
-
valid: false,
|
|
317
|
-
},
|
|
318
279
|
renderInfo: undefined,
|
|
319
280
|
forceFullLayoutCalc: false,
|
|
320
281
|
textW: 0,
|
|
321
282
|
textH: 0,
|
|
322
283
|
fontInfo: undefined,
|
|
323
|
-
fontFaceLoadedHandler: undefined,
|
|
324
284
|
isRenderable: false,
|
|
325
285
|
debugData: {
|
|
326
286
|
updateCount: 0,
|
|
@@ -338,30 +298,20 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
338
298
|
// On the first update call we need to set the status to loading
|
|
339
299
|
if (state.status === 'initialState') {
|
|
340
300
|
this.setStatus(state, 'loading');
|
|
301
|
+
// check if we're on screen
|
|
302
|
+
// if (this.isValidOnScreen(state) === true) {
|
|
303
|
+
// this.setStatus(state, 'loading');
|
|
304
|
+
// }
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (state.status === 'loaded') {
|
|
308
|
+
// If we're loaded, we don't need to do anything
|
|
309
|
+
return;
|
|
341
310
|
}
|
|
342
311
|
|
|
343
312
|
// If fontInfo is invalid, we need to establish it
|
|
344
313
|
if (!state.fontInfo) {
|
|
345
|
-
|
|
346
|
-
const trFontFace = TrFontManager.resolveFontFace(
|
|
347
|
-
this.fontFamilyArray,
|
|
348
|
-
state.props,
|
|
349
|
-
) as WebTrFontFace | undefined;
|
|
350
|
-
assertTruthy(trFontFace, `Could not resolve font face for ${cssString}`);
|
|
351
|
-
state.fontInfo = {
|
|
352
|
-
fontFace: trFontFace,
|
|
353
|
-
cssString: cssString,
|
|
354
|
-
// TODO: For efficiency we would use this here but it's not reliable on WPE -> document.fonts.check(cssString),
|
|
355
|
-
loaded: false,
|
|
356
|
-
};
|
|
357
|
-
// If font is not loaded, set up a handler to update the font info when the font loads
|
|
358
|
-
if (!state.fontInfo.loaded) {
|
|
359
|
-
globalFontSet
|
|
360
|
-
.load(cssString)
|
|
361
|
-
.then(this.onFontLoaded.bind(this, state, cssString))
|
|
362
|
-
.catch(this.onFontLoadError.bind(this, state, cssString));
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
314
|
+
return this.loadFont(state);
|
|
365
315
|
}
|
|
366
316
|
|
|
367
317
|
// If we're waiting for a font face to load, don't render anything
|
|
@@ -370,402 +320,145 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
370
320
|
}
|
|
371
321
|
|
|
372
322
|
if (!state.renderInfo) {
|
|
373
|
-
state.
|
|
374
|
-
text: state.props.text,
|
|
375
|
-
textAlign: state.props.textAlign,
|
|
376
|
-
fontFamily: state.props.fontFamily,
|
|
377
|
-
trFontFace: state.fontInfo.fontFace,
|
|
378
|
-
fontSize: state.props.fontSize,
|
|
379
|
-
fontStyle: [
|
|
380
|
-
state.props.fontStretch,
|
|
381
|
-
state.props.fontStyle,
|
|
382
|
-
state.props.fontWeight,
|
|
383
|
-
].join(' '),
|
|
384
|
-
textColor: getNormalizedRgbaComponents(state.props.color),
|
|
385
|
-
offsetY: state.props.offsetY,
|
|
386
|
-
wordWrap: state.props.contain !== 'none',
|
|
387
|
-
wordWrapWidth:
|
|
388
|
-
state.props.contain === 'none' ? undefined : state.props.width,
|
|
389
|
-
letterSpacing: state.props.letterSpacing,
|
|
390
|
-
lineHeight: state.props.lineHeight ?? null,
|
|
391
|
-
maxLines: state.props.maxLines,
|
|
392
|
-
maxHeight:
|
|
393
|
-
state.props.contain === 'both'
|
|
394
|
-
? state.props.height - state.props.offsetY
|
|
395
|
-
: null,
|
|
396
|
-
textBaseline: state.props.textBaseline,
|
|
397
|
-
verticalAlign: state.props.verticalAlign,
|
|
398
|
-
overflowSuffix: state.props.overflowSuffix,
|
|
399
|
-
w: state.props.contain !== 'none' ? state.props.width : undefined,
|
|
400
|
-
};
|
|
401
|
-
// const renderInfoCalculateTime = performance.now();
|
|
402
|
-
state.renderInfo = state.lightning2TextRenderer.calculateRenderInfo();
|
|
403
|
-
// console.log(
|
|
404
|
-
// 'Render info calculated in',
|
|
405
|
-
// performance.now() - renderInfoCalculateTime,
|
|
406
|
-
// 'ms',
|
|
407
|
-
// );
|
|
323
|
+
state.renderInfo = this.calculateRenderInfo(state);
|
|
408
324
|
state.textH = state.renderInfo.lineHeight * state.renderInfo.lines.length;
|
|
409
325
|
state.textW = state.renderInfo.width;
|
|
410
|
-
|
|
411
|
-
// Invalidate renderWindow because the renderInfo changed
|
|
412
|
-
state.renderWindow = undefined;
|
|
326
|
+
this.renderSingleCanvasPage(state);
|
|
413
327
|
}
|
|
414
328
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
if (!visibleWindow.valid) {
|
|
420
|
-
// Figure out whats actually in the bounds of the renderer/canvas (visibleWindow)
|
|
421
|
-
const elementBounds = createBound(
|
|
422
|
-
x,
|
|
423
|
-
y,
|
|
424
|
-
contain !== 'none' ? x + width : Infinity,
|
|
425
|
-
contain === 'both' ? y + height : Infinity,
|
|
426
|
-
tmpElementBounds,
|
|
427
|
-
);
|
|
428
|
-
/**
|
|
429
|
-
* Area that is visible on the screen.
|
|
430
|
-
*/
|
|
431
|
-
intersectBound(this.rendererBounds, elementBounds, visibleWindow);
|
|
432
|
-
visibleWindow.valid = true;
|
|
433
|
-
}
|
|
329
|
+
// handle scrollable text !!!
|
|
330
|
+
// if (state.isScrollable === true) {
|
|
331
|
+
// return this.renderScrollableCanvasPages(state);
|
|
332
|
+
// }
|
|
434
333
|
|
|
435
|
-
|
|
334
|
+
// handle single page text
|
|
335
|
+
}
|
|
436
336
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
337
|
+
renderSingleCanvasPage(state: CanvasTextRendererState): void {
|
|
338
|
+
assertTruthy(state.renderInfo);
|
|
339
|
+
const node = state.node;
|
|
440
340
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
this.setStatus(state, 'loaded');
|
|
447
|
-
return;
|
|
448
|
-
} else if (renderWindow && canvasPages) {
|
|
449
|
-
// Return early if we're still viewing inside the established render window
|
|
450
|
-
// No need to re-render what we've already rendered
|
|
451
|
-
const renderWindowScreenX1 = x + renderWindow.x1;
|
|
452
|
-
const renderWindowScreenY1 = y - scrollY + renderWindow.y1;
|
|
453
|
-
const renderWindowScreenX2 = x + renderWindow.x2;
|
|
454
|
-
const renderWindowScreenY2 = y - scrollY + renderWindow.y2;
|
|
455
|
-
|
|
456
|
-
if (
|
|
457
|
-
renderWindowScreenX1 <= visibleWindow.x1 &&
|
|
458
|
-
renderWindowScreenX2 >= visibleWindow.x2 &&
|
|
459
|
-
renderWindowScreenY1 <= visibleWindow.y1 &&
|
|
460
|
-
renderWindowScreenY2 >= visibleWindow.y2
|
|
341
|
+
const texture = this.stage.txManager.loadTexture('ImageTexture', {
|
|
342
|
+
src: function (
|
|
343
|
+
this: CanvasTextRenderer,
|
|
344
|
+
lightning2TextRenderer: LightningTextTextureRenderer,
|
|
345
|
+
renderInfo: RenderInfo,
|
|
461
346
|
) {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
renderWindow.y1 += maxLinesPerCanvasPage * state.renderInfo.lineHeight;
|
|
468
|
-
renderWindow.y2 += maxLinesPerCanvasPage * state.renderInfo.lineHeight;
|
|
469
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
470
|
-
canvasPages.push(canvasPages.shift()!);
|
|
471
|
-
canvasPages[2].lineNumStart =
|
|
472
|
-
canvasPages[1].lineNumStart + maxLinesPerCanvasPage;
|
|
473
|
-
canvasPages[2].lineNumEnd =
|
|
474
|
-
canvasPages[2].lineNumStart + maxLinesPerCanvasPage;
|
|
475
|
-
canvasPages[2].valid = false;
|
|
476
|
-
} else if (renderWindowScreenY1 > visibleWindow.y1) {
|
|
477
|
-
// We've scrolled down, so we need to render the previous page
|
|
478
|
-
renderWindow.y1 -= maxLinesPerCanvasPage * state.renderInfo.lineHeight;
|
|
479
|
-
renderWindow.y2 -= maxLinesPerCanvasPage * state.renderInfo.lineHeight;
|
|
480
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
481
|
-
canvasPages.unshift(canvasPages.pop()!);
|
|
482
|
-
canvasPages[0].lineNumStart =
|
|
483
|
-
canvasPages[1].lineNumStart - maxLinesPerCanvasPage;
|
|
484
|
-
canvasPages[0].lineNumEnd =
|
|
485
|
-
canvasPages[0].lineNumStart + maxLinesPerCanvasPage;
|
|
486
|
-
canvasPages[0].valid = false;
|
|
487
|
-
}
|
|
488
|
-
} else {
|
|
489
|
-
const pageHeight = state.renderInfo.lineHeight * maxLinesPerCanvasPage;
|
|
490
|
-
const page1Block = Math.ceil(scrollY / pageHeight);
|
|
491
|
-
const page1LineStart = page1Block * maxLinesPerCanvasPage;
|
|
492
|
-
const page0LineStart = page1LineStart - maxLinesPerCanvasPage;
|
|
493
|
-
const page2LineStart = page1LineStart + maxLinesPerCanvasPage;
|
|
494
|
-
|
|
495
|
-
// We haven't rendered anything yet, so we need to render the first page
|
|
496
|
-
// If canvasPages already exist, let's re-use the textures
|
|
497
|
-
canvasPages = [
|
|
498
|
-
{
|
|
499
|
-
texture: canvasPages?.[0].texture,
|
|
500
|
-
lineNumStart: page0LineStart,
|
|
501
|
-
lineNumEnd: page0LineStart + maxLinesPerCanvasPage,
|
|
502
|
-
valid: false,
|
|
503
|
-
},
|
|
504
|
-
{
|
|
505
|
-
texture: canvasPages?.[1].texture,
|
|
506
|
-
lineNumStart: page1LineStart,
|
|
507
|
-
lineNumEnd: page1LineStart + maxLinesPerCanvasPage,
|
|
508
|
-
valid: false,
|
|
509
|
-
},
|
|
510
|
-
{
|
|
511
|
-
texture: canvasPages?.[2].texture,
|
|
512
|
-
lineNumStart: page2LineStart,
|
|
513
|
-
lineNumEnd: page2LineStart + maxLinesPerCanvasPage,
|
|
514
|
-
valid: false,
|
|
515
|
-
},
|
|
516
|
-
];
|
|
517
|
-
state.canvasPages = canvasPages;
|
|
518
|
-
|
|
519
|
-
const scrollYNearestPage = page1Block * pageHeight;
|
|
520
|
-
|
|
521
|
-
renderWindow = {
|
|
522
|
-
x1: 0,
|
|
523
|
-
y1: scrollYNearestPage - pageHeight,
|
|
524
|
-
x2: width,
|
|
525
|
-
y2: scrollYNearestPage + pageHeight * 2,
|
|
526
|
-
};
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
state.renderWindow = renderWindow;
|
|
530
|
-
|
|
531
|
-
const pageDrawTime = performance.now();
|
|
532
|
-
for (const pageInfo of canvasPages) {
|
|
533
|
-
if (pageInfo.valid) continue;
|
|
534
|
-
if (pageInfo.lineNumStart < 0) {
|
|
535
|
-
pageInfo.texture?.setRenderableOwner(state, false);
|
|
536
|
-
pageInfo.texture = this.stage.txManager.loadTexture('ImageTexture', {
|
|
537
|
-
src: '',
|
|
347
|
+
// load the canvas texture
|
|
348
|
+
assertTruthy(renderInfo);
|
|
349
|
+
lightning2TextRenderer.draw(renderInfo, {
|
|
350
|
+
lines: renderInfo.lines,
|
|
351
|
+
lineWidths: renderInfo.lineWidths,
|
|
538
352
|
});
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
),
|
|
548
|
-
lineWidths: state.renderInfo.lineWidths.slice(
|
|
549
|
-
pageInfo.lineNumStart,
|
|
550
|
-
pageInfo.lineNumEnd,
|
|
551
|
-
),
|
|
552
|
-
});
|
|
553
|
-
if (!(this.canvas.width === 0 || this.canvas.height === 0)) {
|
|
554
|
-
pageInfo.texture?.setRenderableOwner(state, false);
|
|
555
|
-
pageInfo.texture = this.stage.txManager.loadTexture(
|
|
556
|
-
'ImageTexture',
|
|
557
|
-
{
|
|
558
|
-
src: this.context.getImageData(
|
|
559
|
-
0,
|
|
560
|
-
0,
|
|
561
|
-
this.canvas.width,
|
|
562
|
-
this.canvas.height,
|
|
563
|
-
),
|
|
564
|
-
},
|
|
565
|
-
{
|
|
566
|
-
preload: true,
|
|
567
|
-
},
|
|
353
|
+
if (this.canvas.width === 0 || this.canvas.height === 0) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
return this.context.getImageData(
|
|
357
|
+
0,
|
|
358
|
+
0,
|
|
359
|
+
this.canvas.width,
|
|
360
|
+
this.canvas.height,
|
|
568
361
|
);
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
362
|
+
}.bind(this, state.lightning2TextRenderer, state.renderInfo),
|
|
363
|
+
});
|
|
364
|
+
if (state.textureNode) {
|
|
365
|
+
// Use the existing texture node
|
|
366
|
+
state.textureNode.texture = texture;
|
|
367
|
+
} else {
|
|
368
|
+
// Create a new texture node
|
|
369
|
+
const textureNode = this.stage.createNode({
|
|
370
|
+
parent: node,
|
|
371
|
+
texture,
|
|
372
|
+
autosize: true,
|
|
373
|
+
// The alpha channel of the color is ignored when rasterizing the text
|
|
374
|
+
// texture so we need to pass it directly to the texture node.
|
|
375
|
+
alpha: getNormalizedAlphaComponent(state.props.color),
|
|
376
|
+
});
|
|
377
|
+
state.textureNode = textureNode;
|
|
572
378
|
}
|
|
573
|
-
// console.log('pageDrawTime', performance.now() - pageDrawTime, 'ms');
|
|
574
379
|
|
|
575
|
-
// Report final status
|
|
576
380
|
this.setStatus(state, 'loaded');
|
|
577
381
|
}
|
|
578
382
|
|
|
579
|
-
|
|
580
|
-
state
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
const { x, y, scrollY, contain, width, height /*, debug*/ } = state.props;
|
|
592
|
-
|
|
593
|
-
const elementRect = {
|
|
594
|
-
x: x,
|
|
595
|
-
y: y,
|
|
596
|
-
width: contain !== 'none' ? width : textW,
|
|
597
|
-
height: contain === 'both' ? height : textH,
|
|
383
|
+
loadFont = (state: CanvasTextRendererState): void => {
|
|
384
|
+
const cssString = getFontCssString(state.props);
|
|
385
|
+
const trFontFace = TrFontManager.resolveFontFace(
|
|
386
|
+
this.fontFamilyArray,
|
|
387
|
+
state.props,
|
|
388
|
+
) as WebTrFontFace | undefined;
|
|
389
|
+
assertTruthy(trFontFace, `Could not resolve font face for ${cssString}`);
|
|
390
|
+
state.fontInfo = {
|
|
391
|
+
fontFace: trFontFace,
|
|
392
|
+
cssString: cssString,
|
|
393
|
+
// TODO: For efficiency we would use this here but it's not reliable on WPE -> document.fonts.check(cssString),
|
|
394
|
+
loaded: false,
|
|
598
395
|
};
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
},
|
|
607
|
-
elementRect,
|
|
608
|
-
);
|
|
609
|
-
|
|
610
|
-
// if (!debug.disableScissor) {
|
|
611
|
-
// renderer.enableScissor(
|
|
612
|
-
// visibleRect.x,
|
|
613
|
-
// visibleRect.y,
|
|
614
|
-
// visibleRect.w,
|
|
615
|
-
// visibleRect.h,
|
|
616
|
-
// );
|
|
617
|
-
// }
|
|
618
|
-
|
|
619
|
-
assertTruthy(canvasPages, 'canvasPages is not defined');
|
|
620
|
-
assertTruthy(renderWindow, 'renderWindow is not defined');
|
|
621
|
-
|
|
622
|
-
const renderWindowHeight = renderWindow.y2 - renderWindow.y1;
|
|
623
|
-
const pageSize = renderWindowHeight / 3.0;
|
|
624
|
-
|
|
625
|
-
const { zIndex, color } = state.props;
|
|
626
|
-
|
|
627
|
-
// Color alpha of text is not properly rendered to the Canvas texture, so we
|
|
628
|
-
// need to apply it here.
|
|
629
|
-
const combinedAlpha = alpha * getNormalizedAlphaComponent(color);
|
|
630
|
-
const quadColor = mergeColorAlphaPremultiplied(0xffffffff, combinedAlpha);
|
|
631
|
-
if (canvasPages[0].valid) {
|
|
632
|
-
this.stage.renderer.addQuad({
|
|
633
|
-
alpha: combinedAlpha,
|
|
634
|
-
clippingRect,
|
|
635
|
-
colorBl: quadColor,
|
|
636
|
-
colorBr: quadColor,
|
|
637
|
-
colorTl: quadColor,
|
|
638
|
-
colorTr: quadColor,
|
|
639
|
-
width: canvasPages[0].texture?.dimensions?.width || 0,
|
|
640
|
-
height: canvasPages[0].texture?.dimensions?.height || 0,
|
|
641
|
-
texture: canvasPages[0].texture!,
|
|
642
|
-
textureOptions: {},
|
|
643
|
-
shader: null,
|
|
644
|
-
shaderProps: null,
|
|
645
|
-
zIndex,
|
|
646
|
-
tx: transform.tx,
|
|
647
|
-
ty: transform.ty - scrollY + renderWindow.y1,
|
|
648
|
-
ta: transform.ta,
|
|
649
|
-
tb: transform.tb,
|
|
650
|
-
tc: transform.tc,
|
|
651
|
-
td: transform.td,
|
|
652
|
-
});
|
|
653
|
-
}
|
|
654
|
-
if (canvasPages[1].valid) {
|
|
655
|
-
this.stage.renderer.addQuad({
|
|
656
|
-
alpha: combinedAlpha,
|
|
657
|
-
clippingRect,
|
|
658
|
-
colorBl: quadColor,
|
|
659
|
-
colorBr: quadColor,
|
|
660
|
-
colorTl: quadColor,
|
|
661
|
-
colorTr: quadColor,
|
|
662
|
-
width: canvasPages[1].texture?.dimensions?.width || 0,
|
|
663
|
-
height: canvasPages[1].texture?.dimensions?.height || 0,
|
|
664
|
-
texture: canvasPages[1].texture!,
|
|
665
|
-
textureOptions: {},
|
|
666
|
-
shader: null,
|
|
667
|
-
shaderProps: null,
|
|
668
|
-
zIndex,
|
|
669
|
-
tx: transform.tx,
|
|
670
|
-
ty: transform.ty - scrollY + renderWindow.y1 + pageSize,
|
|
671
|
-
ta: transform.ta,
|
|
672
|
-
tb: transform.tb,
|
|
673
|
-
tc: transform.tc,
|
|
674
|
-
td: transform.td,
|
|
675
|
-
});
|
|
676
|
-
}
|
|
677
|
-
if (canvasPages[2].valid) {
|
|
678
|
-
this.stage.renderer.addQuad({
|
|
679
|
-
alpha: combinedAlpha,
|
|
680
|
-
clippingRect,
|
|
681
|
-
colorBl: quadColor,
|
|
682
|
-
colorBr: quadColor,
|
|
683
|
-
colorTl: quadColor,
|
|
684
|
-
colorTr: quadColor,
|
|
685
|
-
width: canvasPages[2].texture?.dimensions?.width || 0,
|
|
686
|
-
height: canvasPages[2].texture?.dimensions?.height || 0,
|
|
687
|
-
texture: canvasPages[2].texture!,
|
|
688
|
-
textureOptions: {},
|
|
689
|
-
shader: null,
|
|
690
|
-
shaderProps: null,
|
|
691
|
-
zIndex,
|
|
692
|
-
tx: transform.tx,
|
|
693
|
-
ty: transform.ty - scrollY + renderWindow.y1 + pageSize + pageSize,
|
|
694
|
-
ta: transform.ta,
|
|
695
|
-
tb: transform.tb,
|
|
696
|
-
tc: transform.tc,
|
|
697
|
-
td: transform.td,
|
|
698
|
-
});
|
|
396
|
+
// If font is not loaded, set up a handler to update the font info when the font loads
|
|
397
|
+
if (!state.fontInfo.loaded) {
|
|
398
|
+
globalFontSet
|
|
399
|
+
.load(cssString)
|
|
400
|
+
.then(this.onFontLoaded.bind(this, state, cssString))
|
|
401
|
+
.catch(this.onFontLoadError.bind(this, state, cssString));
|
|
402
|
+
return;
|
|
699
403
|
}
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
calculateRenderInfo(state: CanvasTextRendererState): RenderInfo {
|
|
407
|
+
state.lightning2TextRenderer.settings = {
|
|
408
|
+
text: state.props.text,
|
|
409
|
+
textAlign: state.props.textAlign,
|
|
410
|
+
fontFamily: state.props.fontFamily,
|
|
411
|
+
trFontFace: state.fontInfo?.fontFace,
|
|
412
|
+
fontSize: state.props.fontSize,
|
|
413
|
+
fontStyle: [
|
|
414
|
+
state.props.fontStretch,
|
|
415
|
+
state.props.fontStyle,
|
|
416
|
+
state.props.fontWeight,
|
|
417
|
+
].join(' '),
|
|
418
|
+
textColor: getNormalizedRgbaComponents(state.props.color),
|
|
419
|
+
offsetY: state.props.offsetY,
|
|
420
|
+
wordWrap: state.props.contain !== 'none',
|
|
421
|
+
wordWrapWidth:
|
|
422
|
+
state.props.contain === 'none' ? undefined : state.props.width,
|
|
423
|
+
letterSpacing: state.props.letterSpacing,
|
|
424
|
+
lineHeight: state.props.lineHeight ?? null,
|
|
425
|
+
maxLines: state.props.maxLines,
|
|
426
|
+
maxHeight:
|
|
427
|
+
state.props.contain === 'both'
|
|
428
|
+
? state.props.height - state.props.offsetY
|
|
429
|
+
: null,
|
|
430
|
+
textBaseline: state.props.textBaseline,
|
|
431
|
+
verticalAlign: state.props.verticalAlign,
|
|
432
|
+
overflowSuffix: state.props.overflowSuffix,
|
|
433
|
+
w: state.props.contain !== 'none' ? state.props.width : undefined,
|
|
434
|
+
};
|
|
435
|
+
state.renderInfo = state.lightning2TextRenderer.calculateRenderInfo();
|
|
436
|
+
return state.renderInfo;
|
|
732
437
|
}
|
|
733
438
|
|
|
734
|
-
override
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
super.setIsRenderable(state, renderable);
|
|
739
|
-
// Set state object owner from any canvas page textures
|
|
740
|
-
state.canvasPages?.forEach((pageInfo) => {
|
|
741
|
-
pageInfo.texture?.setRenderableOwner(state, renderable);
|
|
742
|
-
});
|
|
439
|
+
override renderQuads(): void {
|
|
440
|
+
// Do nothing. The renderer will render the child node(s) that were created
|
|
441
|
+
// in the state update.
|
|
442
|
+
return;
|
|
743
443
|
}
|
|
744
444
|
|
|
745
445
|
override destroyState(state: CanvasTextRendererState): void {
|
|
446
|
+
if (state.status === 'destroyed') {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
746
449
|
super.destroyState(state);
|
|
747
|
-
// Remove state object owner from any canvas page textures
|
|
748
|
-
state.canvasPages?.forEach((pageInfo) => {
|
|
749
|
-
pageInfo.texture?.setRenderableOwner(state, false);
|
|
750
|
-
});
|
|
751
|
-
}
|
|
752
|
-
//#endregion Overrides
|
|
753
450
|
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
*/
|
|
760
|
-
protected invalidateVisibleWindowCache(state: CanvasTextRendererState): void {
|
|
761
|
-
state.visibleWindow.valid = false;
|
|
762
|
-
this.setStatus(state, 'loading');
|
|
763
|
-
this.scheduleUpdateState(state);
|
|
451
|
+
if (state.textureNode) {
|
|
452
|
+
state.textureNode.destroy();
|
|
453
|
+
delete state.textureNode;
|
|
454
|
+
}
|
|
455
|
+
delete state.renderInfo;
|
|
764
456
|
}
|
|
457
|
+
//#endregion Overrides
|
|
765
458
|
|
|
766
459
|
/**
|
|
767
460
|
* Invalidate the layout cache stored in the state. This will cause the text
|
|
768
|
-
* to be re-
|
|
461
|
+
* to be re-rendered on the next update.
|
|
769
462
|
*
|
|
770
463
|
* @remarks
|
|
771
464
|
* This also invalidates the visible window cache.
|
|
@@ -774,7 +467,6 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
774
467
|
*/
|
|
775
468
|
private invalidateLayoutCache(state: CanvasTextRendererState): void {
|
|
776
469
|
state.renderInfo = undefined;
|
|
777
|
-
state.visibleWindow.valid = false;
|
|
778
470
|
this.setStatus(state, 'loading');
|
|
779
471
|
this.scheduleUpdateState(state);
|
|
780
472
|
}
|