@solidtv/renderer 1.0.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/LICENSE +202 -0
- package/NOTICE +7 -0
- package/README.md +137 -0
- package/dist/exports/canvas-shaders.d.ts +10 -0
- package/dist/exports/canvas-shaders.js +11 -0
- package/dist/exports/canvas-shaders.js.map +1 -0
- package/dist/exports/canvas.d.ts +26 -0
- package/dist/exports/canvas.js +27 -0
- package/dist/exports/canvas.js.map +1 -0
- package/dist/exports/index.d.ts +50 -0
- package/dist/exports/index.js +40 -0
- package/dist/exports/index.js.map +1 -0
- package/dist/exports/inspector.d.ts +4 -0
- package/dist/exports/inspector.js +5 -0
- package/dist/exports/inspector.js.map +1 -0
- package/dist/exports/utils.d.ts +27 -0
- package/dist/exports/utils.js +28 -0
- package/dist/exports/utils.js.map +1 -0
- package/dist/exports/webgl-shaders.d.ts +11 -0
- package/dist/exports/webgl-shaders.js +12 -0
- package/dist/exports/webgl-shaders.js.map +1 -0
- package/dist/exports/webgl.d.ts +28 -0
- package/dist/exports/webgl.js +29 -0
- package/dist/exports/webgl.js.map +1 -0
- package/dist/src/common/CommonTypes.d.ts +110 -0
- package/dist/src/common/CommonTypes.js +2 -0
- package/dist/src/common/CommonTypes.js.map +1 -0
- package/dist/src/common/EventEmitter.d.ts +12 -0
- package/dist/src/common/EventEmitter.js +48 -0
- package/dist/src/common/EventEmitter.js.map +1 -0
- package/dist/src/common/IAnimationController.d.ts +58 -0
- package/dist/src/common/IAnimationController.js +2 -0
- package/dist/src/common/IAnimationController.js.map +1 -0
- package/dist/src/common/IEventEmitter.d.ts +8 -0
- package/dist/src/common/IEventEmitter.js +2 -0
- package/dist/src/common/IEventEmitter.js.map +1 -0
- package/dist/src/core/Autosizer.d.ts +35 -0
- package/dist/src/core/Autosizer.js +178 -0
- package/dist/src/core/Autosizer.js.map +1 -0
- package/dist/src/core/CoreNode.d.ts +908 -0
- package/dist/src/core/CoreNode.js +1837 -0
- package/dist/src/core/CoreNode.js.map +1 -0
- package/dist/src/core/CoreShaderManager.d.ts +38 -0
- package/dist/src/core/CoreShaderManager.js +123 -0
- package/dist/src/core/CoreShaderManager.js.map +1 -0
- package/dist/src/core/CoreTextNode.d.ts +91 -0
- package/dist/src/core/CoreTextNode.js +440 -0
- package/dist/src/core/CoreTextNode.js.map +1 -0
- package/dist/src/core/CoreTextureManager.d.ts +264 -0
- package/dist/src/core/CoreTextureManager.js +318 -0
- package/dist/src/core/CoreTextureManager.js.map +1 -0
- package/dist/src/core/Stage.d.ts +238 -0
- package/dist/src/core/Stage.js +804 -0
- package/dist/src/core/Stage.js.map +1 -0
- package/dist/src/core/TextureError.d.ts +11 -0
- package/dist/src/core/TextureError.js +37 -0
- package/dist/src/core/TextureError.js.map +1 -0
- package/dist/src/core/TextureMemoryManager.d.ts +150 -0
- package/dist/src/core/TextureMemoryManager.js +239 -0
- package/dist/src/core/TextureMemoryManager.js.map +1 -0
- package/dist/src/core/animations/AnimationManager.d.ts +33 -0
- package/dist/src/core/animations/AnimationManager.js +137 -0
- package/dist/src/core/animations/AnimationManager.js.map +1 -0
- package/dist/src/core/animations/CoreAnimation.d.ts +12 -0
- package/dist/src/core/animations/CoreAnimation.js +107 -0
- package/dist/src/core/animations/CoreAnimation.js.map +1 -0
- package/dist/src/core/lib/ContextSpy.d.ts +12 -0
- package/dist/src/core/lib/ContextSpy.js +20 -0
- package/dist/src/core/lib/ContextSpy.js.map +1 -0
- package/dist/src/core/lib/ImageWorker.d.ts +16 -0
- package/dist/src/core/lib/ImageWorker.js +202 -0
- package/dist/src/core/lib/ImageWorker.js.map +1 -0
- package/dist/src/core/lib/Matrix3d.d.ts +74 -0
- package/dist/src/core/lib/Matrix3d.js +218 -0
- package/dist/src/core/lib/Matrix3d.js.map +1 -0
- package/dist/src/core/lib/RenderCoords.d.ts +12 -0
- package/dist/src/core/lib/RenderCoords.js +35 -0
- package/dist/src/core/lib/RenderCoords.js.map +1 -0
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +782 -0
- package/dist/src/core/lib/WebGlContextWrapper.js +1143 -0
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -0
- package/dist/src/core/lib/collectionUtils.d.ts +5 -0
- package/dist/src/core/lib/collectionUtils.js +82 -0
- package/dist/src/core/lib/collectionUtils.js.map +1 -0
- package/dist/src/core/lib/colorCache.d.ts +1 -0
- package/dist/src/core/lib/colorCache.js +19 -0
- package/dist/src/core/lib/colorCache.js.map +1 -0
- package/dist/src/core/lib/colorParser.d.ts +21 -0
- package/dist/src/core/lib/colorParser.js +54 -0
- package/dist/src/core/lib/colorParser.js.map +1 -0
- package/dist/src/core/lib/textureCompression.d.ts +28 -0
- package/dist/src/core/lib/textureCompression.js +363 -0
- package/dist/src/core/lib/textureCompression.js.map +1 -0
- package/dist/src/core/lib/textureSvg.d.ts +16 -0
- package/dist/src/core/lib/textureSvg.js +45 -0
- package/dist/src/core/lib/textureSvg.js.map +1 -0
- package/dist/src/core/lib/utils.d.ts +66 -0
- package/dist/src/core/lib/utils.js +268 -0
- package/dist/src/core/lib/utils.js.map +1 -0
- package/dist/src/core/lib/validateImageBitmap.d.ts +7 -0
- package/dist/src/core/lib/validateImageBitmap.js +68 -0
- package/dist/src/core/lib/validateImageBitmap.js.map +1 -0
- package/dist/src/core/platforms/Platform.d.ts +42 -0
- package/dist/src/core/platforms/Platform.js +4 -0
- package/dist/src/core/platforms/Platform.js.map +1 -0
- package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
- package/dist/src/core/platforms/web/WebPlatform.js +90 -0
- package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
- package/dist/src/core/renderers/CoreContextTexture.d.ts +13 -0
- package/dist/src/core/renderers/CoreContextTexture.js +16 -0
- package/dist/src/core/renderers/CoreContextTexture.js.map +1 -0
- package/dist/src/core/renderers/CoreRenderOp.d.ts +3 -0
- package/dist/src/core/renderers/CoreRenderOp.js +3 -0
- package/dist/src/core/renderers/CoreRenderOp.js.map +1 -0
- package/dist/src/core/renderers/CoreRenderer.d.ts +81 -0
- package/dist/src/core/renderers/CoreRenderer.js +14 -0
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -0
- package/dist/src/core/renderers/CoreShaderNode.d.ts +69 -0
- package/dist/src/core/renderers/CoreShaderNode.js +130 -0
- package/dist/src/core/renderers/CoreShaderNode.js.map +1 -0
- package/dist/src/core/renderers/CoreShaderProgram.d.ts +4 -0
- package/dist/src/core/renderers/CoreShaderProgram.js +2 -0
- package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +36 -0
- package/dist/src/core/renderers/canvas/CanvasRenderer.js +221 -0
- package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +21 -0
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js +42 -0
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +17 -0
- package/dist/src/core/renderers/canvas/CanvasTexture.js +110 -0
- package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +41 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.js +88 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +14 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +45 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +22 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +49 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +67 -0
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +259 -0
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +221 -0
- package/dist/src/core/renderers/webgl/WebGlRenderer.js +1015 -0
- package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +213 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js +331 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +37 -0
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +240 -0
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -0
- package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +28 -0
- package/dist/src/core/renderers/webgl/internal/BufferCollection.js +39 -0
- package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -0
- package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +55 -0
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js +88 -0
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -0
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +74 -0
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +83 -0
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -0
- package/dist/src/core/renderers/webgl/internal/WebGlUtils.d.ts +10 -0
- package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +13 -0
- package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -0
- package/dist/src/core/shaders/canvas/Border.d.ts +15 -0
- package/dist/src/core/shaders/canvas/Border.js +83 -0
- package/dist/src/core/shaders/canvas/Border.js.map +1 -0
- package/dist/src/core/shaders/canvas/HolePunch.d.ts +7 -0
- package/dist/src/core/shaders/canvas/HolePunch.js +22 -0
- package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -0
- package/dist/src/core/shaders/canvas/LinearGradient.d.ts +10 -0
- package/dist/src/core/shaders/canvas/LinearGradient.js +32 -0
- package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -0
- package/dist/src/core/shaders/canvas/RadialGradient.d.ts +11 -0
- package/dist/src/core/shaders/canvas/RadialGradient.js +54 -0
- package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -0
- package/dist/src/core/shaders/canvas/Rounded.d.ts +7 -0
- package/dist/src/core/shaders/canvas/Rounded.js +17 -0
- package/dist/src/core/shaders/canvas/Rounded.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +10 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js +57 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +7 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +61 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +7 -0
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js +26 -0
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -0
- package/dist/src/core/shaders/canvas/Shadow.d.ts +8 -0
- package/dist/src/core/shaders/canvas/Shadow.js +15 -0
- package/dist/src/core/shaders/canvas/Shadow.js.map +1 -0
- package/dist/src/core/shaders/canvas/utils/render.d.ts +5 -0
- package/dist/src/core/shaders/canvas/utils/render.js +81 -0
- package/dist/src/core/shaders/canvas/utils/render.js.map +1 -0
- package/dist/src/core/shaders/templates/BorderTemplate.d.ts +47 -0
- package/dist/src/core/shaders/templates/BorderTemplate.js +77 -0
- package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +46 -0
- package/dist/src/core/shaders/templates/HolePunchTemplate.js +19 -0
- package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +23 -0
- package/dist/src/core/shaders/templates/LinearGradientTemplate.js +31 -0
- package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +33 -0
- package/dist/src/core/shaders/templates/RadialGradientTemplate.js +33 -0
- package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +29 -0
- package/dist/src/core/shaders/templates/RoundedTemplate.js +51 -0
- package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +7 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +8 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +8 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +9 -0
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +6 -0
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +7 -0
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -0
- package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +34 -0
- package/dist/src/core/shaders/templates/ShadowTemplate.js +50 -0
- package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -0
- package/dist/src/core/shaders/utils.d.ts +5 -0
- package/dist/src/core/shaders/utils.js +25 -0
- package/dist/src/core/shaders/utils.js.map +1 -0
- package/dist/src/core/shaders/webgl/Border.d.ts +3 -0
- package/dist/src/core/shaders/webgl/Border.js +153 -0
- package/dist/src/core/shaders/webgl/Border.js.map +1 -0
- package/dist/src/core/shaders/webgl/Default.d.ts +2 -0
- package/dist/src/core/shaders/webgl/Default.js +51 -0
- package/dist/src/core/shaders/webgl/Default.js.map +1 -0
- package/dist/src/core/shaders/webgl/HolePunch.d.ts +3 -0
- package/dist/src/core/shaders/webgl/HolePunch.js +49 -0
- package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -0
- package/dist/src/core/shaders/webgl/LinearGradient.d.ts +3 -0
- package/dist/src/core/shaders/webgl/LinearGradient.js +114 -0
- package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -0
- package/dist/src/core/shaders/webgl/RadialGradient.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RadialGradient.js +81 -0
- package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -0
- package/dist/src/core/shaders/webgl/Rounded.d.ts +7 -0
- package/dist/src/core/shaders/webgl/Rounded.js +88 -0
- package/dist/src/core/shaders/webgl/Rounded.js.map +1 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js +202 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +223 -0
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -0
- package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +3 -0
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js +123 -0
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -0
- package/dist/src/core/shaders/webgl/SdfShader.d.ts +13 -0
- package/dist/src/core/shaders/webgl/SdfShader.js +72 -0
- package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -0
- package/dist/src/core/shaders/webgl/Shadow.d.ts +3 -0
- package/dist/src/core/shaders/webgl/Shadow.js +115 -0
- package/dist/src/core/shaders/webgl/Shadow.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
- package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
- package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js +249 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
- package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
- package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
- package/dist/src/core/text-rendering/TextRenderer.d.ts +406 -0
- package/dist/src/core/text-rendering/TextRenderer.js +2 -0
- package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/Utils.d.ts +30 -0
- package/dist/src/core/text-rendering/Utils.js +66 -0
- package/dist/src/core/text-rendering/Utils.js.map +1 -0
- package/dist/src/core/textures/ColorTexture.d.ts +36 -0
- package/dist/src/core/textures/ColorTexture.js +57 -0
- package/dist/src/core/textures/ColorTexture.js.map +1 -0
- package/dist/src/core/textures/ImageTexture.d.ts +131 -0
- package/dist/src/core/textures/ImageTexture.js +211 -0
- package/dist/src/core/textures/ImageTexture.js.map +1 -0
- package/dist/src/core/textures/NoiseTexture.d.ts +43 -0
- package/dist/src/core/textures/NoiseTexture.js +50 -0
- package/dist/src/core/textures/NoiseTexture.js.map +1 -0
- package/dist/src/core/textures/RenderTexture.d.ts +29 -0
- package/dist/src/core/textures/RenderTexture.js +36 -0
- package/dist/src/core/textures/RenderTexture.js.map +1 -0
- package/dist/src/core/textures/SubTexture.d.ts +61 -0
- package/dist/src/core/textures/SubTexture.js +99 -0
- package/dist/src/core/textures/SubTexture.js.map +1 -0
- package/dist/src/core/textures/Texture.d.ts +275 -0
- package/dist/src/core/textures/Texture.js +326 -0
- package/dist/src/core/textures/Texture.js.map +1 -0
- package/dist/src/core/utils.d.ts +23 -0
- package/dist/src/core/utils.js +155 -0
- package/dist/src/core/utils.js.map +1 -0
- package/dist/src/main-api/INode.d.ts +65 -0
- package/dist/src/main-api/INode.js +2 -0
- package/dist/src/main-api/INode.js.map +1 -0
- package/dist/src/main-api/Inspector.d.ts +154 -0
- package/dist/src/main-api/Inspector.js +844 -0
- package/dist/src/main-api/Inspector.js.map +1 -0
- package/dist/src/main-api/Renderer.d.ts +629 -0
- package/dist/src/main-api/Renderer.js +471 -0
- package/dist/src/main-api/Renderer.js.map +1 -0
- package/dist/src/main-api/utils.d.ts +2 -0
- package/dist/src/main-api/utils.js +34 -0
- package/dist/src/main-api/utils.js.map +1 -0
- package/dist/src/utils.d.ts +123 -0
- package/dist/src/utils.js +234 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tsconfig.dist.tsbuildinfo +1 -0
- package/exports/canvas-shaders.ts +11 -0
- package/exports/canvas.ts +27 -0
- package/exports/index.ts +69 -0
- package/exports/inspector.ts +5 -0
- package/exports/utils.ts +32 -0
- package/exports/webgl-shaders.ts +12 -0
- package/exports/webgl.ts +33 -0
- package/package.json +99 -0
- package/src/common/CommonTypes.ts +145 -0
- package/src/common/EventEmitter.ts +58 -0
- package/src/common/IAnimationController.ts +65 -0
- package/src/common/IEventEmitter.ts +11 -0
- package/src/core/Autosizer.ts +205 -0
- package/src/core/CoreNode.test.ts +535 -0
- package/src/core/CoreNode.ts +2883 -0
- package/src/core/CoreShaderManager.ts +170 -0
- package/src/core/CoreTextNode.ts +573 -0
- package/src/core/CoreTextureManager.ts +552 -0
- package/src/core/Stage.ts +1037 -0
- package/src/core/TextureError.ts +46 -0
- package/src/core/TextureMemoryManager.ts +378 -0
- package/src/core/animations/AnimationManager.ts +178 -0
- package/src/core/animations/CoreAnimation.ts +138 -0
- package/src/core/lib/ContextSpy.ts +22 -0
- package/src/core/lib/ImageWorker.ts +292 -0
- package/src/core/lib/Matrix3d.ts +231 -0
- package/src/core/lib/RenderCoords.ts +55 -0
- package/src/core/lib/WebGlContextWrapper.ts +1448 -0
- package/src/core/lib/collectionUtils.ts +99 -0
- package/src/core/lib/colorCache.ts +20 -0
- package/src/core/lib/colorParser.ts +66 -0
- package/src/core/lib/textureCompression.ts +492 -0
- package/src/core/lib/textureSvg.ts +59 -0
- package/src/core/lib/utils.ts +400 -0
- package/src/core/lib/validateImageBitmap.ts +87 -0
- package/src/core/platforms/Platform.ts +64 -0
- package/src/core/platforms/web/WebPlatform.ts +132 -0
- package/src/core/renderers/CoreContextTexture.ts +25 -0
- package/src/core/renderers/CoreRenderOp.ts +3 -0
- package/src/core/renderers/CoreRenderer.ts +101 -0
- package/src/core/renderers/CoreShaderNode.ts +202 -0
- package/src/core/renderers/CoreShaderProgram.ts +4 -0
- package/src/core/renderers/canvas/CanvasRenderer.ts +274 -0
- package/src/core/renderers/canvas/CanvasShaderNode.ts +79 -0
- package/src/core/renderers/canvas/CanvasTexture.ts +141 -0
- package/src/core/renderers/webgl/SdfRenderOp.ts +103 -0
- package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +70 -0
- package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +76 -0
- package/src/core/renderers/webgl/WebGlCtxTexture.ts +332 -0
- package/src/core/renderers/webgl/WebGlRenderer.ts +1323 -0
- package/src/core/renderers/webgl/WebGlShaderNode.ts +423 -0
- package/src/core/renderers/webgl/WebGlShaderProgram.ts +346 -0
- package/src/core/renderers/webgl/internal/BufferCollection.ts +46 -0
- package/src/core/renderers/webgl/internal/RendererUtils.ts +136 -0
- package/src/core/renderers/webgl/internal/ShaderUtils.ts +262 -0
- package/src/core/renderers/webgl/internal/WebGlUtils.ts +16 -0
- package/src/core/shaders/canvas/Border.ts +119 -0
- package/src/core/shaders/canvas/HolePunch.ts +38 -0
- package/src/core/shaders/canvas/LinearGradient.ts +54 -0
- package/src/core/shaders/canvas/RadialGradient.ts +82 -0
- package/src/core/shaders/canvas/Rounded.ts +38 -0
- package/src/core/shaders/canvas/RoundedWithBorder.ts +105 -0
- package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +118 -0
- package/src/core/shaders/canvas/RoundedWithShadow.ts +56 -0
- package/src/core/shaders/canvas/Shadow.ts +35 -0
- package/src/core/shaders/canvas/utils/render.ts +143 -0
- package/src/core/shaders/templates/BorderTemplate.ts +128 -0
- package/src/core/shaders/templates/HolePunchTemplate.ts +65 -0
- package/src/core/shaders/templates/LinearGradientTemplate.ts +54 -0
- package/src/core/shaders/templates/RadialGradientTemplate.ts +66 -0
- package/src/core/shaders/templates/RoundedTemplate.ts +81 -0
- package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +21 -0
- package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +23 -0
- package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +18 -0
- package/src/core/shaders/templates/ShadowTemplate.ts +89 -0
- package/src/core/shaders/utils.ts +30 -0
- package/src/core/shaders/webgl/Border.ts +158 -0
- package/src/core/shaders/webgl/Default.ts +52 -0
- package/src/core/shaders/webgl/HolePunch.ts +58 -0
- package/src/core/shaders/webgl/LinearGradient.ts +119 -0
- package/src/core/shaders/webgl/RadialGradient.ts +91 -0
- package/src/core/shaders/webgl/Rounded.ts +97 -0
- package/src/core/shaders/webgl/RoundedWithBorder.ts +212 -0
- package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +235 -0
- package/src/core/shaders/webgl/RoundedWithShadow.ts +132 -0
- package/src/core/shaders/webgl/SdfShader.ts +73 -0
- package/src/core/shaders/webgl/Shadow.ts +119 -0
- package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
- package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
- package/src/core/text-rendering/SdfFontHandler.ts +566 -0
- package/src/core/text-rendering/SdfTextRenderer.ts +352 -0
- package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
- package/src/core/text-rendering/TextRenderer.ts +449 -0
- package/src/core/text-rendering/Utils.ts +80 -0
- package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
- package/src/core/textures/ColorTexture.ts +85 -0
- package/src/core/textures/ImageTexture.ts +394 -0
- package/src/core/textures/NoiseTexture.ts +87 -0
- package/src/core/textures/RenderTexture.ts +68 -0
- package/src/core/textures/SubTexture.ts +165 -0
- package/src/core/textures/Texture.ts +505 -0
- package/src/core/utils.ts +210 -0
- package/src/env.d.ts +7 -0
- package/src/main-api/INode.ts +92 -0
- package/src/main-api/Inspector.ts +1267 -0
- package/src/main-api/Renderer.ts +1011 -0
- package/src/main-api/utils.ts +45 -0
- package/src/utils.ts +302 -0
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
import { assertTruthy, CALCULATE_FPS, isProductionEnvironment, setPremultiplyMode, USE_RTT, } from '../utils.js';
|
|
2
|
+
import { AnimationManager } from './animations/AnimationManager.js';
|
|
3
|
+
import { UpdateType, CoreNode, CoreNodeRenderState, } from './CoreNode.js';
|
|
4
|
+
import { CoreTextureManager } from './CoreTextureManager.js';
|
|
5
|
+
import { CoreShaderManager } from './CoreShaderManager.js';
|
|
6
|
+
import {} from './text-rendering/TextRenderer.js';
|
|
7
|
+
import { EventEmitter } from '../common/EventEmitter.js';
|
|
8
|
+
import { ContextSpy } from './lib/ContextSpy.js';
|
|
9
|
+
import { TextureMemoryManager, } from './TextureMemoryManager.js';
|
|
10
|
+
import { CoreRenderer } from './renderers/CoreRenderer.js';
|
|
11
|
+
import { CoreTextNode } from './CoreTextNode.js';
|
|
12
|
+
import { santizeCustomDataMap } from '../main-api/utils.js';
|
|
13
|
+
import { pointInBound } from './lib/utils.js';
|
|
14
|
+
import { Matrix3d } from './lib/Matrix3d.js';
|
|
15
|
+
import { createBound, createPreloadBounds } from './lib/utils.js';
|
|
16
|
+
import { ColorTexture } from './textures/ColorTexture.js';
|
|
17
|
+
const autoStart = true;
|
|
18
|
+
export class Stage {
|
|
19
|
+
options;
|
|
20
|
+
/// Module Instances
|
|
21
|
+
animationManager;
|
|
22
|
+
txManager;
|
|
23
|
+
txMemManager;
|
|
24
|
+
textRenderers = {};
|
|
25
|
+
fontHandlers = {};
|
|
26
|
+
shManager;
|
|
27
|
+
renderer;
|
|
28
|
+
root;
|
|
29
|
+
interactiveNodes = new Set();
|
|
30
|
+
boundsMargin;
|
|
31
|
+
defShaderNode = null;
|
|
32
|
+
strictBound;
|
|
33
|
+
preloadBound;
|
|
34
|
+
defaultTexture = null;
|
|
35
|
+
pixelRatio;
|
|
36
|
+
bufferMemory = 2e6;
|
|
37
|
+
platform;
|
|
38
|
+
calculateTextureCoord;
|
|
39
|
+
/**
|
|
40
|
+
* Target frame time in milliseconds (calculated from targetFPS)
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* This is pre-calculated to avoid recalculating on every frame.
|
|
44
|
+
* - 0 means no throttling (use display refresh rate)
|
|
45
|
+
* - >0 means throttle to this frame time (1000 / targetFPS)
|
|
46
|
+
*/
|
|
47
|
+
targetFrameTime = 0;
|
|
48
|
+
/**
|
|
49
|
+
* Renderer Event Bus for the Stage to emit events onto
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* In reality this is just the RendererMain instance, which is an EventEmitter.
|
|
53
|
+
* this allows us to directly emit events from the Stage to RendererMain
|
|
54
|
+
* without having to set up forwarding handlers.
|
|
55
|
+
*/
|
|
56
|
+
eventBus;
|
|
57
|
+
/// State
|
|
58
|
+
startTime = 0;
|
|
59
|
+
deltaTime = 0;
|
|
60
|
+
lastFrameTime = 0;
|
|
61
|
+
currentFrameTime = 0;
|
|
62
|
+
elapsedTime = 0;
|
|
63
|
+
timedNodes = [];
|
|
64
|
+
clrColor = 0x00000000;
|
|
65
|
+
fpsNumFrames = 0;
|
|
66
|
+
fpsElapsedTime = 0;
|
|
67
|
+
numQuadsRendered = 0;
|
|
68
|
+
numRenderOpsRendered = 0;
|
|
69
|
+
renderRequested = false;
|
|
70
|
+
reprocessFrame = false;
|
|
71
|
+
reprocessCallback = null;
|
|
72
|
+
frameEventQueue = [];
|
|
73
|
+
// Flattened render list optimization
|
|
74
|
+
renderList = [];
|
|
75
|
+
renderListDirty = true;
|
|
76
|
+
// Font resolve optimisation flags
|
|
77
|
+
hasOnlyOneFontEngine;
|
|
78
|
+
hasOnlyCanvasFontEngine;
|
|
79
|
+
hasCanvasEngine;
|
|
80
|
+
singleFontEngine = null;
|
|
81
|
+
singleFontHandler = null;
|
|
82
|
+
// Debug data
|
|
83
|
+
contextSpy = null;
|
|
84
|
+
/**
|
|
85
|
+
* Stage constructor
|
|
86
|
+
*/
|
|
87
|
+
constructor(options) {
|
|
88
|
+
this.options = options;
|
|
89
|
+
const { canvas, clearColor, appWidth, appHeight, boundsMargin, enableContextSpy, forceWebGL2, numImageWorkers, textureMemory, renderEngine, fontEngines, createImageBitmapSupport, platform, maxRetryCount, } = options;
|
|
90
|
+
assertTruthy(platform !== null, 'A CorePlatform is not provided in the options');
|
|
91
|
+
this.platform = platform;
|
|
92
|
+
this.startTime = platform.getTimeStamp();
|
|
93
|
+
this.eventBus = options.eventBus;
|
|
94
|
+
// Calculate target frame time from targetFPS option
|
|
95
|
+
this.targetFrameTime = options.targetFPS > 0 ? 1000 / options.targetFPS : 0;
|
|
96
|
+
this.txManager = new CoreTextureManager(this, {
|
|
97
|
+
numImageWorkers,
|
|
98
|
+
createImageBitmapSupport,
|
|
99
|
+
maxRetryCount,
|
|
100
|
+
});
|
|
101
|
+
// Wait for the Texture Manager to initialize
|
|
102
|
+
// once it does, request a render
|
|
103
|
+
this.txManager.on('initialized', () => {
|
|
104
|
+
this.requestRender();
|
|
105
|
+
});
|
|
106
|
+
this.txMemManager = new TextureMemoryManager(this, textureMemory);
|
|
107
|
+
this.animationManager = new AnimationManager();
|
|
108
|
+
this.contextSpy = enableContextSpy ? new ContextSpy() : null;
|
|
109
|
+
let bm = [0, 0, 0, 0];
|
|
110
|
+
if (boundsMargin) {
|
|
111
|
+
bm = Array.isArray(boundsMargin)
|
|
112
|
+
? boundsMargin
|
|
113
|
+
: [boundsMargin, boundsMargin, boundsMargin, boundsMargin];
|
|
114
|
+
}
|
|
115
|
+
this.boundsMargin = bm;
|
|
116
|
+
// precalculate our viewport bounds
|
|
117
|
+
this.strictBound = createBound(0, 0, appWidth, appHeight);
|
|
118
|
+
this.preloadBound = createPreloadBounds(this.strictBound, bm);
|
|
119
|
+
this.clrColor = clearColor;
|
|
120
|
+
this.pixelRatio =
|
|
121
|
+
options.devicePhysicalPixelRatio * options.deviceLogicalPixelRatio;
|
|
122
|
+
this.renderer = new renderEngine({
|
|
123
|
+
stage: this,
|
|
124
|
+
canvas,
|
|
125
|
+
contextSpy: this.contextSpy,
|
|
126
|
+
forceWebGL2,
|
|
127
|
+
});
|
|
128
|
+
this.shManager = new CoreShaderManager(this);
|
|
129
|
+
this.defShaderNode = this.renderer.getDefaultShaderNode();
|
|
130
|
+
this.calculateTextureCoord = this.renderer.getTextureCoords !== undefined;
|
|
131
|
+
const renderMode = this.renderer.mode || 'webgl';
|
|
132
|
+
this.createDefaultTexture();
|
|
133
|
+
setPremultiplyMode(renderMode);
|
|
134
|
+
// Must do this after renderer is created
|
|
135
|
+
this.txManager.renderer = this.renderer;
|
|
136
|
+
// Create text renderers
|
|
137
|
+
this.hasOnlyOneFontEngine = fontEngines.length === 1;
|
|
138
|
+
this.hasOnlyCanvasFontEngine =
|
|
139
|
+
fontEngines.length === 1 && fontEngines[0].type === 'canvas';
|
|
140
|
+
this.hasCanvasEngine = false;
|
|
141
|
+
this.singleFontEngine = this.hasOnlyOneFontEngine
|
|
142
|
+
? fontEngines[0]
|
|
143
|
+
: null;
|
|
144
|
+
this.singleFontHandler = this.hasOnlyOneFontEngine
|
|
145
|
+
? fontEngines[0]?.font
|
|
146
|
+
: null;
|
|
147
|
+
if (this.singleFontEngine === null) {
|
|
148
|
+
// Multiple font engines case
|
|
149
|
+
// Filter out incompatible engines first
|
|
150
|
+
const compatibleEngines = fontEngines.filter((fontEngine) => {
|
|
151
|
+
const type = fontEngine.type;
|
|
152
|
+
if (type === 'sdf' && renderMode === 'canvas') {
|
|
153
|
+
console.warn('MsdfTextRenderer is not compatible with Canvas renderer. Skipping...');
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (type === 'canvas') {
|
|
157
|
+
this.hasCanvasEngine = true;
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
});
|
|
161
|
+
// Sort engines: SDF first, Canvas last, others in between
|
|
162
|
+
const sortedEngines = compatibleEngines.sort((a, b) => {
|
|
163
|
+
if (a.type === 'sdf')
|
|
164
|
+
return -1;
|
|
165
|
+
if (b.type === 'sdf')
|
|
166
|
+
return 1;
|
|
167
|
+
if (a.type === 'canvas')
|
|
168
|
+
return 1;
|
|
169
|
+
if (b.type === 'canvas')
|
|
170
|
+
return -1;
|
|
171
|
+
return 0;
|
|
172
|
+
});
|
|
173
|
+
// Initialize engines in sorted order
|
|
174
|
+
sortedEngines.forEach((fontEngine) => {
|
|
175
|
+
const type = fontEngine.type;
|
|
176
|
+
// Add to map for type-based access
|
|
177
|
+
this.textRenderers[type] = fontEngine;
|
|
178
|
+
this.textRenderers[type].init(this);
|
|
179
|
+
this.fontHandlers[type] = fontEngine.font;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// Single font engine case - initialize it directly
|
|
184
|
+
const fontEngine = this.singleFontEngine;
|
|
185
|
+
const type = fontEngine.type;
|
|
186
|
+
// Check compatibility
|
|
187
|
+
if (type === 'sdf' && renderMode === 'canvas') {
|
|
188
|
+
console.warn('MsdfTextRenderer is not compatible with Canvas renderer. Skipping...');
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
if (type === 'canvas') {
|
|
192
|
+
this.hasCanvasEngine = true;
|
|
193
|
+
}
|
|
194
|
+
// Add to map for type-based access
|
|
195
|
+
this.textRenderers[type] = fontEngine;
|
|
196
|
+
this.fontHandlers[type] = fontEngine.font;
|
|
197
|
+
this.textRenderers[type].init(this);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (Object.keys(this.textRenderers).length === 0) {
|
|
201
|
+
console.warn('No text renderers available. Your text will not render.');
|
|
202
|
+
}
|
|
203
|
+
// create root node
|
|
204
|
+
const rootNode = new CoreNode(this, {
|
|
205
|
+
x: 0,
|
|
206
|
+
y: 0,
|
|
207
|
+
w: appWidth,
|
|
208
|
+
h: appHeight,
|
|
209
|
+
alpha: 1,
|
|
210
|
+
autosize: false,
|
|
211
|
+
boundsMargin: null,
|
|
212
|
+
clipping: false,
|
|
213
|
+
color: 0x00000000,
|
|
214
|
+
colorTop: 0x00000000,
|
|
215
|
+
colorBottom: 0x00000000,
|
|
216
|
+
colorLeft: 0x00000000,
|
|
217
|
+
colorRight: 0x00000000,
|
|
218
|
+
colorTl: 0x00000000,
|
|
219
|
+
colorTr: 0x00000000,
|
|
220
|
+
colorBl: 0x00000000,
|
|
221
|
+
colorBr: 0x00000000,
|
|
222
|
+
zIndex: 0,
|
|
223
|
+
scaleX: 1,
|
|
224
|
+
scaleY: 1,
|
|
225
|
+
mountX: 0,
|
|
226
|
+
mountY: 0,
|
|
227
|
+
mount: 0,
|
|
228
|
+
pivot: 0.5,
|
|
229
|
+
pivotX: 0.5,
|
|
230
|
+
pivotY: 0.5,
|
|
231
|
+
rotation: 0,
|
|
232
|
+
parent: null,
|
|
233
|
+
texture: null,
|
|
234
|
+
textureOptions: {},
|
|
235
|
+
shader: this.defShaderNode,
|
|
236
|
+
rtt: false,
|
|
237
|
+
src: null,
|
|
238
|
+
scale: 1,
|
|
239
|
+
});
|
|
240
|
+
this.root = rootNode;
|
|
241
|
+
// Initialize root node properties
|
|
242
|
+
rootNode.updateLocalTransform();
|
|
243
|
+
rootNode.globalTransform = Matrix3d.copy(rootNode.localTransform);
|
|
244
|
+
rootNode.sceneGlobalTransform = Matrix3d.copy(rootNode.localTransform);
|
|
245
|
+
rootNode.calculateRenderCoords();
|
|
246
|
+
rootNode.updateBoundingRect();
|
|
247
|
+
rootNode.createRenderBounds();
|
|
248
|
+
rootNode.updateRenderState(CoreNodeRenderState.InViewport);
|
|
249
|
+
rootNode.updateIsRenderable();
|
|
250
|
+
// Initialize premultiplied colors (default is transparent 0x00000000)
|
|
251
|
+
rootNode.premultipliedColorTl =
|
|
252
|
+
rootNode.premultipliedColorTr =
|
|
253
|
+
rootNode.premultipliedColorBl =
|
|
254
|
+
rootNode.premultipliedColorBr =
|
|
255
|
+
0;
|
|
256
|
+
// execute platform start loop
|
|
257
|
+
if (autoStart === true) {
|
|
258
|
+
this.platform.startLoop(this);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
setClearColor(color) {
|
|
262
|
+
this.clearColor = color;
|
|
263
|
+
this.renderer.updateClearColor(color);
|
|
264
|
+
this.renderRequested = true;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Update the target frame time based on the current targetFPS setting
|
|
268
|
+
*
|
|
269
|
+
* @remarks
|
|
270
|
+
* This should be called whenever the targetFPS option is changed
|
|
271
|
+
* to ensure targetFrameTime stays in sync.
|
|
272
|
+
* targetFPS of 0 means no throttling (targetFrameTime = 0)
|
|
273
|
+
* targetFPS > 0 means throttle to 1000/targetFPS milliseconds
|
|
274
|
+
*/
|
|
275
|
+
updateTargetFrameTime() {
|
|
276
|
+
this.targetFrameTime =
|
|
277
|
+
this.options.targetFPS > 0 ? 1000 / this.options.targetFPS : 0;
|
|
278
|
+
}
|
|
279
|
+
updateFrameTime() {
|
|
280
|
+
const newFrameTime = this.platform.getTimeStamp();
|
|
281
|
+
this.lastFrameTime = this.currentFrameTime;
|
|
282
|
+
this.currentFrameTime = newFrameTime;
|
|
283
|
+
this.elapsedTime = newFrameTime - this.startTime;
|
|
284
|
+
this.deltaTime = !this.lastFrameTime
|
|
285
|
+
? 100 / 6
|
|
286
|
+
: newFrameTime - this.lastFrameTime;
|
|
287
|
+
this.txManager.frameTime = newFrameTime;
|
|
288
|
+
this.txMemManager.frameTime = newFrameTime;
|
|
289
|
+
// This event is emitted at the beginning of the frame (before any updates
|
|
290
|
+
// or rendering), so no need to to use `stage.queueFrameEvent` here.
|
|
291
|
+
this.eventBus.emit('frameTick', {
|
|
292
|
+
time: this.currentFrameTime,
|
|
293
|
+
delta: this.deltaTime,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Create default PixelTexture
|
|
298
|
+
*/
|
|
299
|
+
createDefaultTexture() {
|
|
300
|
+
this.defaultTexture = this.txManager.createTexture('ColorTexture', {
|
|
301
|
+
color: 0xffffffff,
|
|
302
|
+
});
|
|
303
|
+
assertTruthy(this.defaultTexture instanceof ColorTexture);
|
|
304
|
+
this.txManager.loadTexture(this.defaultTexture, true);
|
|
305
|
+
// Mark the default texture as ALWAYS renderable
|
|
306
|
+
// This prevents it from ever being cleaned up.
|
|
307
|
+
// Fixes https://github.com/lightning-js/renderer/issues/262
|
|
308
|
+
this.defaultTexture.setRenderableOwner('stage', true);
|
|
309
|
+
// When the default texture is loaded, request a render in case the
|
|
310
|
+
// RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
|
|
311
|
+
this.defaultTexture.once('loaded', () => {
|
|
312
|
+
this.requestRender();
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Update animations
|
|
317
|
+
*/
|
|
318
|
+
updateAnimations() {
|
|
319
|
+
const { animationManager } = this;
|
|
320
|
+
if (!this.root) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
// step animation
|
|
324
|
+
animationManager.update(this.deltaTime);
|
|
325
|
+
return animationManager.activeAnimations.length > 0;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Check if the scene has updates
|
|
329
|
+
*/
|
|
330
|
+
hasSceneUpdates() {
|
|
331
|
+
return (!!this.root.updateType ||
|
|
332
|
+
this.renderRequested ||
|
|
333
|
+
this.txManager.hasUpdates());
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Start a new frame draw
|
|
337
|
+
*/
|
|
338
|
+
drawFrame(hasActiveAnimations = false) {
|
|
339
|
+
const { renderer, renderRequested, root } = this;
|
|
340
|
+
// Update tree if needed
|
|
341
|
+
do {
|
|
342
|
+
const forceUpdate = this.reprocessFrame;
|
|
343
|
+
this.reprocessFrame = false;
|
|
344
|
+
if (root.updateType !== 0 || forceUpdate) {
|
|
345
|
+
root.updateType = 0;
|
|
346
|
+
const childUpdateType = root.childUpdateType;
|
|
347
|
+
root.childUpdateType = 0;
|
|
348
|
+
for (let i = 0, length = root.children.length; i < length; i++) {
|
|
349
|
+
const child = root.children[i];
|
|
350
|
+
if (childUpdateType !== 0) {
|
|
351
|
+
child.updateType |= childUpdateType;
|
|
352
|
+
}
|
|
353
|
+
if (child.updateType === 0) {
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
child.update(this.deltaTime, root.clippingRect);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (this.reprocessCallback !== null) {
|
|
360
|
+
this.reprocessCallback();
|
|
361
|
+
this.reprocessCallback = null;
|
|
362
|
+
}
|
|
363
|
+
} while (this.reprocessFrame);
|
|
364
|
+
// Process some textures asynchronously but don't block the frame
|
|
365
|
+
// Use a background task to prevent frame drops
|
|
366
|
+
if (this.txManager.hasUpdates() === true) {
|
|
367
|
+
const timeLimit = hasActiveAnimations
|
|
368
|
+
? this.options.textureProcessingTimeLimit / 2
|
|
369
|
+
: this.options.textureProcessingTimeLimit;
|
|
370
|
+
this.txManager.processSome(timeLimit).catch((err) => {
|
|
371
|
+
console.error('Error processing textures:', err);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
// Reset render operations and clear the canvas
|
|
375
|
+
renderer.reset();
|
|
376
|
+
// If we have RTT nodes draw them first
|
|
377
|
+
// So we can use them as textures in the main scene
|
|
378
|
+
if (USE_RTT && renderer.rttNodes.length > 0) {
|
|
379
|
+
renderer.renderRTTNodes();
|
|
380
|
+
}
|
|
381
|
+
// Update render list if dirty
|
|
382
|
+
if (this.renderListDirty === true) {
|
|
383
|
+
this.renderList.length = 0;
|
|
384
|
+
this.buildRenderList(this.root);
|
|
385
|
+
this.renderListDirty = false;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
// Fill quads buffer
|
|
389
|
+
const renderList = this.renderList;
|
|
390
|
+
for (let i = 0, len = renderList.length; i < len; i++) {
|
|
391
|
+
renderList[i].renderQuads(renderer);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Perform render pass
|
|
395
|
+
renderer.render();
|
|
396
|
+
if (CALCULATE_FPS) {
|
|
397
|
+
this.calculateFps();
|
|
398
|
+
this.calculateRenderInfo();
|
|
399
|
+
}
|
|
400
|
+
// Reset renderRequested flag if it was set
|
|
401
|
+
if (renderRequested === true) {
|
|
402
|
+
this.renderRequested = false;
|
|
403
|
+
}
|
|
404
|
+
if (this.timedNodes.length > 0) {
|
|
405
|
+
for (let key in this.timedNodes) {
|
|
406
|
+
if (this.timedNodes[key].isRenderable === true) {
|
|
407
|
+
this.requestRender();
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Check if we need to cleanup textures
|
|
413
|
+
if (this.txMemManager.criticalCleanupRequested === true) {
|
|
414
|
+
this.txMemManager.cleanup();
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Queue an event to be emitted after the current/next frame is rendered
|
|
419
|
+
*
|
|
420
|
+
* @remarks
|
|
421
|
+
* When we are operating in the context of the render loop, we may want to
|
|
422
|
+
* emit events that are related to the current frame. However, we generally do
|
|
423
|
+
* NOT want to emit events directly in the middle of the render loop, since
|
|
424
|
+
* this could enable event handlers to modify the scene graph and cause
|
|
425
|
+
* unexpected behavior. Instead, we queue up events to be emitted and then
|
|
426
|
+
* flush the queue after the frame has been rendered.
|
|
427
|
+
*
|
|
428
|
+
* @param name
|
|
429
|
+
* @param data
|
|
430
|
+
*/
|
|
431
|
+
queueFrameEvent(name, data) {
|
|
432
|
+
this.frameEventQueue.push([name, data]);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Emit all queued frame events
|
|
436
|
+
*
|
|
437
|
+
* @remarks
|
|
438
|
+
* This method should be called after the frame has been rendered to emit
|
|
439
|
+
* all events that were queued during the frame.
|
|
440
|
+
*
|
|
441
|
+
* See {@link queueFrameEvent} for more information.
|
|
442
|
+
*/
|
|
443
|
+
flushFrameEvents() {
|
|
444
|
+
for (const [name, data] of this.frameEventQueue) {
|
|
445
|
+
this.eventBus.emit(name, data);
|
|
446
|
+
}
|
|
447
|
+
this.frameEventQueue = [];
|
|
448
|
+
}
|
|
449
|
+
calculateFps() {
|
|
450
|
+
// If there's an FPS update interval, emit the FPS update event
|
|
451
|
+
// when the specified interval has elapsed.
|
|
452
|
+
const { fpsUpdateInterval } = this.options;
|
|
453
|
+
if (fpsUpdateInterval) {
|
|
454
|
+
this.fpsNumFrames++;
|
|
455
|
+
this.fpsElapsedTime += this.deltaTime;
|
|
456
|
+
if (this.fpsElapsedTime >= fpsUpdateInterval) {
|
|
457
|
+
const fps = Math.round((this.fpsNumFrames * 1000) / this.fpsElapsedTime);
|
|
458
|
+
this.fpsNumFrames = 0;
|
|
459
|
+
this.fpsElapsedTime = 0;
|
|
460
|
+
this.queueFrameEvent('fpsUpdate', {
|
|
461
|
+
fps,
|
|
462
|
+
contextSpyData: this.contextSpy?.getData() ?? null,
|
|
463
|
+
});
|
|
464
|
+
this.contextSpy?.reset();
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
calculateRenderInfo() {
|
|
469
|
+
const quads = this.renderer.getQuadCount();
|
|
470
|
+
const renderOps = this.renderer.getRenderOpCount();
|
|
471
|
+
if ((quads && quads !== this.numQuadsRendered) ||
|
|
472
|
+
(renderOps && renderOps !== this.numRenderOpsRendered)) {
|
|
473
|
+
this.numQuadsRendered = quads || 0;
|
|
474
|
+
this.numRenderOpsRendered = renderOps || 0;
|
|
475
|
+
this.queueFrameEvent('renderUpdate', {
|
|
476
|
+
quads: this.numQuadsRendered,
|
|
477
|
+
renderOps: this.numRenderOpsRendered,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
requestRenderListUpdate() {
|
|
482
|
+
// Notify the renderer that the render list is structurally changing.
|
|
483
|
+
// For the WebGL renderer this resets per-node buffer slot assignments
|
|
484
|
+
// and schedules a full GPU buffer re-upload on the next frame.
|
|
485
|
+
if (this.renderer.invalidateQuadBuffer !== undefined) {
|
|
486
|
+
this.renderer.invalidateQuadBuffer();
|
|
487
|
+
}
|
|
488
|
+
this.renderListDirty = true;
|
|
489
|
+
this.requestRender();
|
|
490
|
+
}
|
|
491
|
+
buildRenderList(node) {
|
|
492
|
+
// If the node is renderable and has a loaded texture, add it
|
|
493
|
+
if (node.isRenderable === true) {
|
|
494
|
+
node.renderQuads(this.renderer);
|
|
495
|
+
this.renderList.push(node);
|
|
496
|
+
}
|
|
497
|
+
const children = node.children;
|
|
498
|
+
const len = children.length;
|
|
499
|
+
for (let i = 0; i < len; i++) {
|
|
500
|
+
const child = children[i];
|
|
501
|
+
// Skip invisible subtrees
|
|
502
|
+
if (child.worldAlpha === 0 ||
|
|
503
|
+
child.renderState === CoreNodeRenderState.OutOfBounds) {
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
this.buildRenderList(child);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Request a render pass without forcing an update
|
|
511
|
+
*/
|
|
512
|
+
requestRender() {
|
|
513
|
+
this.renderRequested = true;
|
|
514
|
+
}
|
|
515
|
+
reprocessUpdates(callback) {
|
|
516
|
+
this.reprocessFrame = true;
|
|
517
|
+
if (callback) {
|
|
518
|
+
this.reprocessCallback = callback;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Given a font name, and possible renderer override, return the best compatible text renderer.
|
|
523
|
+
*
|
|
524
|
+
* @remarks
|
|
525
|
+
* Will try to return a canvas renderer if no other suitable renderer can be resolved.
|
|
526
|
+
*
|
|
527
|
+
* @param fontFamily
|
|
528
|
+
* @param textRendererOverride
|
|
529
|
+
* @returns
|
|
530
|
+
*/
|
|
531
|
+
resolveTextRenderer(trProps, textRendererOverride = null) {
|
|
532
|
+
// If we have an overide, return it
|
|
533
|
+
if (textRendererOverride !== null) {
|
|
534
|
+
const overrideKey = String(textRendererOverride);
|
|
535
|
+
if (this.textRenderers[overrideKey] === undefined) {
|
|
536
|
+
console.warn(`Text renderer override '${overrideKey}' not found.`);
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
return this.textRenderers[overrideKey];
|
|
540
|
+
}
|
|
541
|
+
// If we have only one font engine early return it
|
|
542
|
+
if (this.singleFontEngine !== null) {
|
|
543
|
+
// If we have only one font engine and its the canvas engine, we can just return it
|
|
544
|
+
if (this.hasOnlyCanvasFontEngine === true) {
|
|
545
|
+
return this.singleFontEngine;
|
|
546
|
+
}
|
|
547
|
+
// If we have only one font engine and it can render the font, return it
|
|
548
|
+
if (this.singleFontHandler?.canRenderFont(trProps) === true) {
|
|
549
|
+
return this.singleFontEngine;
|
|
550
|
+
}
|
|
551
|
+
// If we have only one font engine and it cannot render the font, return null
|
|
552
|
+
console.warn(`Text renderer cannot render font`, trProps);
|
|
553
|
+
return null;
|
|
554
|
+
}
|
|
555
|
+
// Multi font handling - If we have multiple font engines, we need to resolve the best one
|
|
556
|
+
// First check SDF
|
|
557
|
+
if (this.fontHandlers['sdf']?.canRenderFont(trProps) === true) {
|
|
558
|
+
return this.textRenderers.sdf || null;
|
|
559
|
+
}
|
|
560
|
+
// If we have a canvas engine, we can return it (it can render all fonts)
|
|
561
|
+
if (this.hasCanvasEngine === true) {
|
|
562
|
+
return this.textRenderers.canvas || null;
|
|
563
|
+
}
|
|
564
|
+
// If we have no font engines, return null
|
|
565
|
+
console.warn('No text renderers available. Your text will not render.');
|
|
566
|
+
return null;
|
|
567
|
+
}
|
|
568
|
+
createNode(props) {
|
|
569
|
+
const resolvedProps = this.resolveNodeDefaults(props);
|
|
570
|
+
return new CoreNode(this, resolvedProps);
|
|
571
|
+
}
|
|
572
|
+
createTextNode(props) {
|
|
573
|
+
const fontSize = props.fontSize || 16;
|
|
574
|
+
const resolvedProps = this.resolveNodeDefaults(props);
|
|
575
|
+
resolvedProps.text = props.text ?? '';
|
|
576
|
+
resolvedProps.textRendererOverride = props.textRendererOverride ?? null;
|
|
577
|
+
resolvedProps.fontSize = fontSize;
|
|
578
|
+
resolvedProps.fontFamily = props.fontFamily || 'sans-serif';
|
|
579
|
+
resolvedProps.fontStyle = props.fontStyle || 'normal';
|
|
580
|
+
resolvedProps.textAlign = props.textAlign || 'left';
|
|
581
|
+
resolvedProps.offsetY = props.offsetY || 0;
|
|
582
|
+
resolvedProps.letterSpacing = props.letterSpacing || 0;
|
|
583
|
+
resolvedProps.lineHeight = props.lineHeight || 1.2;
|
|
584
|
+
resolvedProps.maxLines = props.maxLines || 0;
|
|
585
|
+
resolvedProps.verticalAlign = props.verticalAlign || 'top';
|
|
586
|
+
resolvedProps.overflowSuffix = props.overflowSuffix || '...';
|
|
587
|
+
resolvedProps.wordBreak = props.wordBreak || 'break-word';
|
|
588
|
+
resolvedProps.contain = props.contain || 'none';
|
|
589
|
+
resolvedProps.maxWidth = props.maxWidth || 0;
|
|
590
|
+
resolvedProps.maxHeight = props.maxHeight || 0;
|
|
591
|
+
resolvedProps.forceLoad = props.forceLoad || false;
|
|
592
|
+
const resolvedTextRenderer = this.resolveTextRenderer(resolvedProps, resolvedProps.textRendererOverride);
|
|
593
|
+
if (!resolvedTextRenderer) {
|
|
594
|
+
throw new Error(`No compatible text renderer found for ${resolvedProps.fontFamily}`);
|
|
595
|
+
}
|
|
596
|
+
return new CoreTextNode(this, resolvedProps, resolvedTextRenderer);
|
|
597
|
+
}
|
|
598
|
+
setBoundsMargin(value) {
|
|
599
|
+
this.boundsMargin = Array.isArray(value)
|
|
600
|
+
? value
|
|
601
|
+
: [value, value, value, value];
|
|
602
|
+
this.updateViewportBounds();
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Update the viewport bounds
|
|
606
|
+
*/
|
|
607
|
+
updateViewportBounds() {
|
|
608
|
+
const { appWidth, appHeight } = this.options;
|
|
609
|
+
this.strictBound = createBound(0, 0, appWidth, appHeight);
|
|
610
|
+
this.preloadBound = createPreloadBounds(this.strictBound, this.boundsMargin);
|
|
611
|
+
this.root.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
|
|
612
|
+
this.root.childUpdateType |= UpdateType.RenderBounds;
|
|
613
|
+
}
|
|
614
|
+
/** Find all nodes at a given point
|
|
615
|
+
* @param data
|
|
616
|
+
*/
|
|
617
|
+
findNodesAtPoint(data) {
|
|
618
|
+
const x = data.x / this.options.deviceLogicalPixelRatio;
|
|
619
|
+
const y = data.y / this.options.deviceLogicalPixelRatio;
|
|
620
|
+
const nodes = [];
|
|
621
|
+
for (const node of this.interactiveNodes) {
|
|
622
|
+
if (node.isRenderable === false) {
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
if (pointInBound(x, y, node.renderBound) === true) {
|
|
626
|
+
nodes.push(node);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return nodes;
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Find the top node at a given point
|
|
633
|
+
* @param data
|
|
634
|
+
* @returns
|
|
635
|
+
*/
|
|
636
|
+
getNodeFromPosition(data) {
|
|
637
|
+
const nodes = this.findNodesAtPoint(data);
|
|
638
|
+
if (nodes.length === 0) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
//get last node in array (as top node)
|
|
642
|
+
let topNode = nodes[nodes.length - 1];
|
|
643
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
644
|
+
if (nodes[i].zIndex > topNode.zIndex) {
|
|
645
|
+
topNode = nodes[i];
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
return topNode || null;
|
|
649
|
+
}
|
|
650
|
+
/**
|
|
651
|
+
* add node to timeNodes arrays
|
|
652
|
+
* @param node
|
|
653
|
+
* @returns
|
|
654
|
+
*/
|
|
655
|
+
trackTimedNode(node) {
|
|
656
|
+
if (this.timedNodes[node.id] !== undefined) {
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
this.timedNodes[node.id] = node;
|
|
660
|
+
}
|
|
661
|
+
/**
|
|
662
|
+
* remove node from timeNodes arrays
|
|
663
|
+
* @param node
|
|
664
|
+
* @returns
|
|
665
|
+
*/
|
|
666
|
+
untrackTimedNode(node) {
|
|
667
|
+
if (this.timedNodes[node.id] === undefined) {
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
delete this.timedNodes[node.id];
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Resolves the default property values for a Node
|
|
674
|
+
*
|
|
675
|
+
* @remarks
|
|
676
|
+
* This method is used internally by the RendererMain to resolve the default
|
|
677
|
+
* property values for a Node. It is exposed publicly so that it can be used
|
|
678
|
+
* by Core Driver implementations.
|
|
679
|
+
*
|
|
680
|
+
* @param props
|
|
681
|
+
* @returns
|
|
682
|
+
*/
|
|
683
|
+
resolveNodeDefaults(props) {
|
|
684
|
+
const color = props.color ?? 0xffffffff;
|
|
685
|
+
let colorTop = color;
|
|
686
|
+
let colorBottom = color;
|
|
687
|
+
let colorLeft = color;
|
|
688
|
+
let colorRight = color;
|
|
689
|
+
let colorTl = color;
|
|
690
|
+
let colorTr = color;
|
|
691
|
+
let colorBl = color;
|
|
692
|
+
let colorBr = color;
|
|
693
|
+
// Fast-path: Check if any complex color props are present
|
|
694
|
+
// We check values directly to avoid destructuring
|
|
695
|
+
if (props.colorTop !== undefined ||
|
|
696
|
+
props.colorBottom !== undefined ||
|
|
697
|
+
props.colorLeft !== undefined ||
|
|
698
|
+
props.colorRight !== undefined ||
|
|
699
|
+
props.colorTl !== undefined ||
|
|
700
|
+
props.colorTr !== undefined ||
|
|
701
|
+
props.colorBl !== undefined ||
|
|
702
|
+
props.colorBr !== undefined) {
|
|
703
|
+
const { colorTop: top, colorBottom: bottom, colorLeft: left, colorRight: right, } = props;
|
|
704
|
+
colorTop = top ?? color;
|
|
705
|
+
colorBottom = bottom ?? color;
|
|
706
|
+
colorLeft = left ?? color;
|
|
707
|
+
colorRight = right ?? color;
|
|
708
|
+
colorTl = props.colorTl ?? top ?? left ?? color;
|
|
709
|
+
colorTr = props.colorTr ?? top ?? right ?? color;
|
|
710
|
+
colorBl = props.colorBl ?? bottom ?? left ?? color;
|
|
711
|
+
colorBr = props.colorBr ?? bottom ?? right ?? color;
|
|
712
|
+
}
|
|
713
|
+
const scale = props.scale ?? null;
|
|
714
|
+
const mount = props.mount ?? 0;
|
|
715
|
+
const pivot = props.pivot ?? 0.5;
|
|
716
|
+
const data = !isProductionEnvironment && this.options.inspector
|
|
717
|
+
? santizeCustomDataMap(props.data ?? {})
|
|
718
|
+
: {};
|
|
719
|
+
return {
|
|
720
|
+
x: props.x ?? 0,
|
|
721
|
+
y: props.y ?? 0,
|
|
722
|
+
w: props.w ?? 0,
|
|
723
|
+
h: props.h ?? 0,
|
|
724
|
+
alpha: props.alpha ?? 1,
|
|
725
|
+
autosize: props.autosize ?? false,
|
|
726
|
+
boundsMargin: props.boundsMargin ?? null,
|
|
727
|
+
clipping: props.clipping ?? false,
|
|
728
|
+
color,
|
|
729
|
+
colorTop,
|
|
730
|
+
colorBottom,
|
|
731
|
+
colorLeft,
|
|
732
|
+
colorRight,
|
|
733
|
+
colorTl,
|
|
734
|
+
colorTr,
|
|
735
|
+
colorBl,
|
|
736
|
+
colorBr,
|
|
737
|
+
zIndex: props.zIndex ?? 0,
|
|
738
|
+
parent: props.parent ?? null,
|
|
739
|
+
texture: props.texture ?? null,
|
|
740
|
+
textureOptions: props.textureOptions ?? {},
|
|
741
|
+
shader: props.shader ?? this.defShaderNode,
|
|
742
|
+
src: props.src ?? null,
|
|
743
|
+
srcHeight: props.srcHeight,
|
|
744
|
+
srcWidth: props.srcWidth,
|
|
745
|
+
srcX: props.srcX,
|
|
746
|
+
srcY: props.srcY,
|
|
747
|
+
scale,
|
|
748
|
+
scaleX: props.scaleX ?? scale ?? 1,
|
|
749
|
+
scaleY: props.scaleY ?? scale ?? 1,
|
|
750
|
+
mount,
|
|
751
|
+
mountX: props.mountX ?? mount,
|
|
752
|
+
mountY: props.mountY ?? mount,
|
|
753
|
+
pivot,
|
|
754
|
+
pivotX: props.pivotX ?? pivot,
|
|
755
|
+
pivotY: props.pivotY ?? pivot,
|
|
756
|
+
rotation: props.rotation ?? 0,
|
|
757
|
+
rtt: props.rtt ?? false,
|
|
758
|
+
data,
|
|
759
|
+
imageType: props.imageType,
|
|
760
|
+
interactive: props.interactive ?? false,
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* Cleanup Orphaned Textures
|
|
765
|
+
*
|
|
766
|
+
* @remarks
|
|
767
|
+
* This method is used to cleanup orphaned textures that are no longer in use.
|
|
768
|
+
*/
|
|
769
|
+
cleanup(full = false) {
|
|
770
|
+
this.txMemManager.cleanup(full);
|
|
771
|
+
}
|
|
772
|
+
set clearColor(value) {
|
|
773
|
+
this.renderer.updateClearColor(value);
|
|
774
|
+
this.renderRequested = true;
|
|
775
|
+
this.clrColor = value;
|
|
776
|
+
}
|
|
777
|
+
get clearColor() {
|
|
778
|
+
return this.clrColor;
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* Load a font using a specific text renderer type
|
|
782
|
+
*
|
|
783
|
+
* @remarks
|
|
784
|
+
* This method allows consumers to explicitly load fonts for a specific
|
|
785
|
+
* text renderer type (e.g., 'canvas', 'sdf'). Consumers must specify
|
|
786
|
+
* the renderer type to ensure fonts are loaded with the correct pipeline.
|
|
787
|
+
*
|
|
788
|
+
* For Canvas fonts, provide fontUrl (e.g., .ttf, .woff, .woff2)
|
|
789
|
+
* For SDF fonts, provide atlasUrl (image) and atlasDataUrl (JSON glyph data)
|
|
790
|
+
*
|
|
791
|
+
* @param rendererType - The type of text renderer ('canvas', 'sdf', etc.)
|
|
792
|
+
* @param options - Font loading options specific to the renderer type
|
|
793
|
+
* @returns Promise that resolves when the font is loaded
|
|
794
|
+
*/
|
|
795
|
+
async loadFont(rendererType, options) {
|
|
796
|
+
const rendererTypeKey = String(rendererType);
|
|
797
|
+
const fontHandler = this.fontHandlers[rendererTypeKey];
|
|
798
|
+
if (!fontHandler) {
|
|
799
|
+
throw new Error(`Font handler for renderer type '${rendererTypeKey}' not found. Available types: ${Object.keys(this.fontHandlers).join(', ')}`);
|
|
800
|
+
}
|
|
801
|
+
return fontHandler.loadFont(this, options);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
//# sourceMappingURL=Stage.js.map
|