@lightningjs/renderer 3.0.0-beta14 → 3.0.0-beta16
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/dist/exports/index.d.ts +1 -0
- package/dist/exports/index.js.map +1 -1
- package/dist/src/core/CoreNode.d.ts +1 -1
- package/dist/src/core/CoreTextNode.d.ts +1 -2
- package/dist/src/core/CoreTextNode.js +43 -21
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/Stage.js +2 -3
- package/dist/src/core/Stage.js.map +1 -1
- 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/animations/CoreAnimation.d.ts +3 -3
- package/dist/src/core/animations/CoreAnimation.js +3 -3
- package/dist/src/core/animations/CoreAnimation.js.map +1 -1
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +5 -5
- package/dist/src/core/lib/textureCompression.js +1 -1
- package/dist/src/core/lib/textureCompression.js.map +1 -1
- package/dist/src/core/platform.d.ts +10 -0
- package/dist/src/core/platform.js +81 -0
- package/dist/src/core/platform.js.map +1 -0
- package/dist/src/core/renderers/CoreShader.d.ts +9 -0
- package/{src/core/text-rendering/sdf/index.ts → dist/src/core/renderers/CoreShader.js} +11 -3
- package/dist/src/core/renderers/CoreShader.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +33 -0
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +250 -0
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -0
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +17 -0
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +125 -0
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -0
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +14 -0
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +138 -0
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -0
- package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +19 -0
- package/dist/src/core/renderers/canvas/internal/ColorUtils.js +58 -0
- package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -0
- package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +10 -0
- package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +43 -0
- package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +12 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +58 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +9 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +38 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +69 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +272 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +34 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +114 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +133 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +641 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +78 -0
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js +202 -0
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +9 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +84 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +10 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +108 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +29 -0
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +408 -0
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +28 -0
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +126 -0
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +47 -0
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js +148 -0
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +31 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +71 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +30 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +58 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +31 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +71 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +31 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +71 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +31 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +71 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +9 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +136 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +36 -0
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +85 -0
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +45 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +104 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +22 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +45 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +58 -0
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +80 -0
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +35 -0
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +134 -0
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +40 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +143 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +61 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +127 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +40 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +71 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +115 -0
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +61 -0
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -0
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
- package/dist/src/core/shaders/webgl/LinearGradient.js +26 -3
- package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
- package/dist/src/core/shaders/webgl/RadialGradient.js +49 -27
- package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
- package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
- package/dist/src/core/shaders/webgl/SdfShader.js +1 -10
- package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
- package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
- package/dist/src/core/text-rendering/CanvasFont.js +111 -0
- package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +21 -3
- package/dist/src/core/text-rendering/CanvasFontHandler.js +97 -32
- package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
- package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +2 -7
- package/dist/src/core/text-rendering/CanvasTextRenderer.js +51 -260
- package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
- package/dist/src/core/text-rendering/CoreFont.js +48 -0
- package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
- package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
- package/dist/src/core/text-rendering/FontManager.js +42 -0
- package/dist/src/core/text-rendering/FontManager.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
- package/dist/src/core/text-rendering/SdfFont.js +142 -0
- package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFontHandler.d.ts +35 -5
- package/dist/src/core/text-rendering/SdfFontHandler.js +79 -56
- package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
- package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +1 -1
- package/dist/src/core/text-rendering/SdfTextRenderer.js +38 -82
- package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +19 -0
- package/dist/src/core/text-rendering/{sdf/Utils.js → TextLayoutEngine.js} +125 -107
- package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
- package/dist/src/core/text-rendering/TextRenderer.d.ts +30 -13
- package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +12 -0
- package/dist/src/core/text-rendering/TextRenderingUtils.js +14 -0
- package/dist/src/core/text-rendering/TextRenderingUtils.js.map +1 -0
- package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +72 -0
- package/dist/src/core/text-rendering/TextTextureRendererUtils.js +217 -0
- package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -0
- package/dist/src/core/text-rendering/TrFontManager.d.ts +26 -0
- package/dist/src/core/text-rendering/TrFontManager.js +131 -0
- package/dist/src/core/text-rendering/TrFontManager.js.map +1 -0
- package/dist/src/core/text-rendering/Utils.d.ts +1 -42
- package/dist/src/core/text-rendering/Utils.js +4 -132
- package/dist/src/core/text-rendering/Utils.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +39 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +125 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +103 -0
- package/dist/src/core/text-rendering/{sdf/index.js → font-face-types/SdfTrFontFace/internal/FontShaper.js} +4 -3
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +1 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +62 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +88 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -0
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +118 -0
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +63 -0
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -0
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +14 -0
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +66 -0
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -0
- package/dist/src/core/text-rendering/font-face-types/utils.d.ts +1 -0
- package/dist/src/core/text-rendering/font-face-types/utils.js +38 -0
- package/dist/src/core/text-rendering/font-face-types/utils.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +59 -0
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +397 -0
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +120 -0
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +551 -0
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +92 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +607 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +12 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +61 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +33 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +52 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +13 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +32 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +23 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +84 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +4 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +34 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +20 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +308 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +10 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +40 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
- package/dist/src/core/text-rendering/{canvas/Settings.js → renderers/SdfTextRenderer/internal/util.js} +22 -3
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +373 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.js +178 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -0
- package/dist/src/core/utils.d.ts +2 -1
- package/dist/src/core/utils.js +1 -1
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/main-api/DynamicShaderController.d.ts +29 -0
- package/dist/src/main-api/DynamicShaderController.js +58 -0
- package/dist/src/main-api/DynamicShaderController.js.map +1 -0
- package/dist/src/main-api/Inspector.d.ts +124 -0
- package/dist/src/main-api/Inspector.js +292 -13
- package/dist/src/main-api/Inspector.js.map +1 -1
- package/dist/src/main-api/Renderer.d.ts +150 -26
- package/dist/src/main-api/Renderer.js +27 -25
- 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/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/index.ts +1 -0
- package/package.json +14 -15
- package/src/core/CoreTextNode.ts +55 -27
- package/src/core/Stage.ts +2 -3
- package/src/core/animations/CoreAnimation.ts +8 -9
- package/src/core/lib/textureCompression.ts +4 -2
- package/src/core/shaders/canvas/RoundedWithBorder.ts +1 -1
- package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +1 -1
- package/src/core/shaders/webgl/LinearGradient.ts +26 -3
- package/src/core/shaders/webgl/RadialGradient.ts +50 -28
- package/src/core/shaders/webgl/SdfShader.ts +1 -12
- package/src/core/text-rendering/CanvasFontHandler.ts +139 -39
- package/src/core/text-rendering/CanvasTextRenderer.ts +75 -440
- package/src/core/text-rendering/SdfFontHandler.ts +97 -60
- package/src/core/text-rendering/SdfTextRenderer.ts +62 -116
- package/src/core/text-rendering/{sdf/Utils.ts → TextLayoutEngine.ts} +211 -145
- package/src/core/text-rendering/TextRenderer.ts +36 -13
- package/src/core/text-rendering/Utils.ts +5 -163
- package/src/core/text-rendering/{sdf/Utils.test.ts → tests/Canvas.test.ts} +98 -122
- package/src/core/text-rendering/tests/SdfTests.test.ts +414 -0
- package/src/core/utils.ts +9 -7
- package/src/main-api/Inspector.ts +511 -17
- package/src/main-api/Renderer.ts +158 -26
- package/dist/src/core/text-rendering/canvas/Settings.d.ts +0 -64
- package/dist/src/core/text-rendering/canvas/Settings.js.map +0 -1
- package/dist/src/core/text-rendering/canvas/Utils.d.ts +0 -20
- package/dist/src/core/text-rendering/canvas/Utils.js +0 -144
- package/dist/src/core/text-rendering/canvas/Utils.js.map +0 -1
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +0 -60
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +0 -183
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +0 -1
- package/dist/src/core/text-rendering/canvas/draw.d.ts +0 -5
- package/dist/src/core/text-rendering/canvas/draw.js +0 -132
- package/dist/src/core/text-rendering/canvas/draw.js.map +0 -1
- package/dist/src/core/text-rendering/sdf/Utils.d.ts +0 -26
- package/dist/src/core/text-rendering/sdf/Utils.js.map +0 -1
- package/dist/src/core/text-rendering/sdf/index.d.ts +0 -1
- package/dist/src/core/text-rendering/sdf/index.js.map +0 -1
- package/src/core/text-rendering/canvas/Settings.ts +0 -99
- package/src/core/text-rendering/canvas/Utils.test.ts +0 -206
- package/src/core/text-rendering/canvas/Utils.ts +0 -178
- package/src/core/text-rendering/canvas/calculateRenderInfo.ts +0 -299
- package/src/core/text-rendering/canvas/draw.ts +0 -165
|
@@ -1,37 +1,137 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
import type {
|
|
2
|
+
FontMetrics,
|
|
3
|
+
MeasureTextFn,
|
|
4
|
+
NormalizedFontMetrics,
|
|
5
|
+
TextLayoutStruct,
|
|
6
|
+
TextLineStruct,
|
|
7
|
+
WrappedLinesStruct,
|
|
8
|
+
} from './TextRenderer.js';
|
|
9
|
+
|
|
10
|
+
export const defaultFontMetrics: FontMetrics = {
|
|
11
|
+
ascender: 800,
|
|
12
|
+
descender: -200,
|
|
13
|
+
lineGap: 200,
|
|
14
|
+
unitsPerEm: 1000,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const normalizeFontMetrics = (
|
|
18
|
+
metrics: FontMetrics,
|
|
19
|
+
fontSize: number,
|
|
20
|
+
): NormalizedFontMetrics => {
|
|
21
|
+
const scale = fontSize / metrics.unitsPerEm;
|
|
22
|
+
return {
|
|
23
|
+
ascender: metrics.ascender * scale,
|
|
24
|
+
descender: metrics.descender * scale,
|
|
25
|
+
lineGap: metrics.lineGap * scale,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const mapTextLayout = (
|
|
30
|
+
measureText: MeasureTextFn,
|
|
31
|
+
metrics: NormalizedFontMetrics,
|
|
32
|
+
text: string,
|
|
33
|
+
textAlign: string,
|
|
34
|
+
verticalAlign: string,
|
|
35
|
+
fontFamily: string,
|
|
36
|
+
lineHeight: number,
|
|
37
|
+
overflowSuffix: string,
|
|
38
|
+
wordBreak: string,
|
|
39
|
+
letterSpacing: number,
|
|
40
|
+
maxLines: number,
|
|
41
|
+
maxWidth: number,
|
|
42
|
+
maxHeight: number,
|
|
43
|
+
): TextLayoutStruct => {
|
|
44
|
+
const ascPx = metrics.ascender;
|
|
45
|
+
const descPx = metrics.descender;
|
|
46
|
+
|
|
47
|
+
const bareLineHeight = ascPx - descPx;
|
|
48
|
+
const lineHeightPx =
|
|
49
|
+
lineHeight <= 3 ? lineHeight * bareLineHeight : lineHeight;
|
|
50
|
+
const lineHeightDelta = lineHeightPx - bareLineHeight;
|
|
51
|
+
const halfDelta = lineHeightDelta * 0.5;
|
|
52
|
+
|
|
53
|
+
let effectiveMaxLines = maxLines;
|
|
54
|
+
if (maxHeight > 0) {
|
|
55
|
+
const maxFromHeight = Math.floor(maxHeight / lineHeightPx);
|
|
56
|
+
if (effectiveMaxLines === 0 || maxFromHeight < effectiveMaxLines) {
|
|
57
|
+
effectiveMaxLines = maxFromHeight;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const wrappedText = maxWidth > 0;
|
|
62
|
+
//wrapText or just measureLines based on maxWidth
|
|
63
|
+
const [lines, remainingLines, remainingText] =
|
|
64
|
+
wrappedText === true
|
|
65
|
+
? wrapText(
|
|
66
|
+
measureText,
|
|
67
|
+
text,
|
|
68
|
+
fontFamily,
|
|
69
|
+
maxWidth,
|
|
70
|
+
letterSpacing,
|
|
71
|
+
overflowSuffix,
|
|
72
|
+
wordBreak,
|
|
73
|
+
maxLines,
|
|
74
|
+
)
|
|
75
|
+
: measureLines(
|
|
76
|
+
measureText,
|
|
77
|
+
text.split('\n'),
|
|
78
|
+
fontFamily,
|
|
79
|
+
letterSpacing,
|
|
80
|
+
maxLines,
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
let effectiveLineAmount = lines.length;
|
|
84
|
+
let effectiveMaxWidth = lines[0]![1];
|
|
85
|
+
|
|
86
|
+
//check for longest line
|
|
87
|
+
if (effectiveLineAmount > 1) {
|
|
88
|
+
for (let i = 1; i < effectiveLineAmount; i++) {
|
|
89
|
+
effectiveMaxWidth = Math.max(effectiveMaxWidth, lines[i]![1]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
//update line x offsets
|
|
94
|
+
if (textAlign !== 'left') {
|
|
95
|
+
for (let i = 0; i < effectiveLineAmount; i++) {
|
|
96
|
+
const line = lines[i]!;
|
|
97
|
+
const w = line[1];
|
|
98
|
+
line[2] =
|
|
99
|
+
textAlign === 'right'
|
|
100
|
+
? effectiveMaxWidth - w
|
|
101
|
+
: (effectiveMaxWidth - w) / 2;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const effectiveMaxHeight = effectiveLineAmount * lineHeightPx;
|
|
106
|
+
|
|
107
|
+
let firstBaseLine = halfDelta;
|
|
19
108
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
109
|
+
const startY = firstBaseLine;
|
|
110
|
+
for (let i = 0; i < effectiveLineAmount; i++) {
|
|
111
|
+
const line = lines[i] as TextLineStruct;
|
|
112
|
+
line[3] = startY + lineHeightPx * i;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return [
|
|
116
|
+
lines,
|
|
117
|
+
remainingLines,
|
|
118
|
+
remainingText,
|
|
119
|
+
bareLineHeight,
|
|
120
|
+
lineHeightPx,
|
|
121
|
+
effectiveMaxWidth,
|
|
122
|
+
effectiveMaxHeight,
|
|
123
|
+
];
|
|
124
|
+
};
|
|
23
125
|
|
|
24
126
|
export const measureLines = (
|
|
127
|
+
measureText: MeasureTextFn,
|
|
25
128
|
lines: string[],
|
|
26
129
|
fontFamily: string,
|
|
27
130
|
letterSpacing: number,
|
|
28
|
-
fontScale: number,
|
|
29
131
|
maxLines: number,
|
|
30
|
-
hasMaxLines: boolean,
|
|
31
132
|
): WrappedLinesStruct => {
|
|
32
133
|
const measuredLines: TextLineStruct[] = [];
|
|
33
|
-
|
|
34
|
-
let remainingLines = hasMaxLines === true ? maxLines : lines.length;
|
|
134
|
+
let remainingLines = maxLines > 0 ? maxLines : lines.length;
|
|
35
135
|
let i = 0;
|
|
36
136
|
|
|
37
137
|
while (remainingLines > 0) {
|
|
@@ -41,71 +141,90 @@ export const measureLines = (
|
|
|
41
141
|
if (line === undefined) {
|
|
42
142
|
continue;
|
|
43
143
|
}
|
|
44
|
-
const width = measureText(line, fontFamily,
|
|
45
|
-
measuredLines.push([line, width]);
|
|
144
|
+
const width = measureText(line, fontFamily, letterSpacing);
|
|
145
|
+
measuredLines.push([line, width, 0, 0]);
|
|
46
146
|
}
|
|
47
147
|
|
|
48
148
|
return [
|
|
49
149
|
measuredLines,
|
|
50
150
|
remainingLines,
|
|
51
|
-
|
|
151
|
+
maxLines > 0 ? lines.length - measuredLines.length > 0 : false,
|
|
52
152
|
];
|
|
53
153
|
};
|
|
54
|
-
|
|
55
|
-
* Wrap text for SDF rendering with proper width constraints
|
|
56
|
-
*/
|
|
154
|
+
|
|
57
155
|
export const wrapText = (
|
|
156
|
+
measureText: MeasureTextFn,
|
|
58
157
|
text: string,
|
|
59
158
|
fontFamily: string,
|
|
60
|
-
fontScale: number,
|
|
61
159
|
maxWidth: number,
|
|
62
160
|
letterSpacing: number,
|
|
63
161
|
overflowSuffix: string,
|
|
64
162
|
wordBreak: string,
|
|
65
163
|
maxLines: number,
|
|
66
|
-
hasMaxLines: boolean,
|
|
67
164
|
): WrappedLinesStruct => {
|
|
68
165
|
const lines = text.split('\n');
|
|
69
166
|
const wrappedLines: TextLineStruct[] = [];
|
|
70
|
-
const maxWidthInDesignUnits = maxWidth / fontScale;
|
|
71
|
-
const designLetterSpacing = letterSpacing * fontScale;
|
|
72
167
|
|
|
73
168
|
// Calculate space width for line wrapping
|
|
74
|
-
const spaceWidth = measureText(' ', fontFamily,
|
|
169
|
+
const spaceWidth = measureText(' ', fontFamily, letterSpacing);
|
|
75
170
|
|
|
76
171
|
let wrappedLine: TextLineStruct[] = [];
|
|
77
172
|
let remainingLines = maxLines;
|
|
78
173
|
let hasRemainingText = true;
|
|
174
|
+
let hasMaxLines = maxLines > 0;
|
|
79
175
|
|
|
80
176
|
for (let i = 0; i < lines.length; i++) {
|
|
81
|
-
const line = lines[i]
|
|
177
|
+
const line = lines[i];
|
|
178
|
+
if (line === undefined) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
82
181
|
|
|
83
|
-
[wrappedLine, remainingLines, hasRemainingText] =
|
|
84
|
-
line
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
182
|
+
[wrappedLine, remainingLines, hasRemainingText] =
|
|
183
|
+
line.length > 0
|
|
184
|
+
? wrapLine(
|
|
185
|
+
measureText,
|
|
186
|
+
line,
|
|
187
|
+
fontFamily,
|
|
188
|
+
maxWidth,
|
|
189
|
+
letterSpacing,
|
|
190
|
+
spaceWidth,
|
|
191
|
+
overflowSuffix,
|
|
192
|
+
wordBreak,
|
|
193
|
+
remainingLines,
|
|
194
|
+
hasMaxLines,
|
|
195
|
+
)
|
|
196
|
+
: [[['', 0, 0, 0]], remainingLines, i < lines.length - 1];
|
|
94
197
|
|
|
198
|
+
remainingLines--;
|
|
95
199
|
wrappedLines.push(...wrappedLine);
|
|
200
|
+
|
|
201
|
+
if (hasMaxLines === true && remainingLines <= 0) {
|
|
202
|
+
const lastLine = wrappedLines[wrappedLines.length - 1]!;
|
|
203
|
+
if (i < lines.length - 1) {
|
|
204
|
+
if (lastLine[0].endsWith(overflowSuffix) === false) {
|
|
205
|
+
lastLine[0] = truncateLineWithSuffix(
|
|
206
|
+
measureText,
|
|
207
|
+
lastLine[0],
|
|
208
|
+
fontFamily,
|
|
209
|
+
maxWidth,
|
|
210
|
+
letterSpacing,
|
|
211
|
+
overflowSuffix,
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
96
217
|
}
|
|
97
218
|
|
|
98
219
|
return [wrappedLines, remainingLines, hasRemainingText];
|
|
99
220
|
};
|
|
100
221
|
|
|
101
|
-
/**
|
|
102
|
-
* Wrap a single line of text for SDF rendering
|
|
103
|
-
*/
|
|
104
222
|
export const wrapLine = (
|
|
223
|
+
measureText: MeasureTextFn,
|
|
105
224
|
line: string,
|
|
106
225
|
fontFamily: string,
|
|
107
226
|
maxWidth: number,
|
|
108
|
-
|
|
227
|
+
letterSpacing: number,
|
|
109
228
|
spaceWidth: number,
|
|
110
229
|
overflowSuffix: string,
|
|
111
230
|
wordBreak: string,
|
|
@@ -129,7 +248,7 @@ export const wrapLine = (
|
|
|
129
248
|
continue;
|
|
130
249
|
}
|
|
131
250
|
const space = spaces[i - 1] || '';
|
|
132
|
-
const wordWidth = measureText(word, fontFamily,
|
|
251
|
+
const wordWidth = measureText(word, fontFamily, letterSpacing);
|
|
133
252
|
// For width calculation, treat ZWSP as having 0 width but regular space functionality
|
|
134
253
|
const effectiveSpaceWidth = space === '\u200B' ? 0 : spaceWidth;
|
|
135
254
|
const totalWidth = currentLineWidth + effectiveSpaceWidth + wordWidth;
|
|
@@ -165,25 +284,23 @@ export const wrapLine = (
|
|
|
165
284
|
}
|
|
166
285
|
|
|
167
286
|
if (wordBreak !== 'break-all' && currentLine.length > 0) {
|
|
168
|
-
wrappedLines.push([currentLine, currentLineWidth]);
|
|
169
|
-
currentLine = '';
|
|
170
|
-
currentLineWidth = 0;
|
|
171
|
-
remainingLines--;
|
|
287
|
+
wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
|
|
172
288
|
}
|
|
173
289
|
|
|
174
290
|
if (wordBreak !== 'break-all') {
|
|
291
|
+
remainingLines--;
|
|
175
292
|
currentLine = word;
|
|
176
293
|
currentLineWidth = wordWidth;
|
|
177
294
|
}
|
|
178
295
|
|
|
179
296
|
if (wordBreak === 'break-word') {
|
|
180
297
|
const [lines, rl, rt] = breakWord(
|
|
298
|
+
measureText,
|
|
181
299
|
word,
|
|
182
300
|
fontFamily,
|
|
183
301
|
maxWidth,
|
|
184
|
-
|
|
302
|
+
letterSpacing,
|
|
185
303
|
remainingLines,
|
|
186
|
-
hasMaxLines,
|
|
187
304
|
);
|
|
188
305
|
remainingLines = rl;
|
|
189
306
|
hasRemainingText = rt;
|
|
@@ -198,16 +315,17 @@ export const wrapLine = (
|
|
|
198
315
|
}
|
|
199
316
|
}
|
|
200
317
|
} else if (wordBreak === 'break-all') {
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
318
|
+
const firstLetterWidth = measureText(
|
|
319
|
+
word.charAt(0),
|
|
320
|
+
fontFamily,
|
|
321
|
+
letterSpacing,
|
|
322
|
+
);
|
|
205
323
|
let linebreak = false;
|
|
206
324
|
if (
|
|
207
325
|
currentLineWidth + firstLetterWidth + effectiveSpaceWidth >
|
|
208
326
|
maxWidth
|
|
209
327
|
) {
|
|
210
|
-
wrappedLines.push([currentLine, currentLineWidth]);
|
|
328
|
+
wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
|
|
211
329
|
remainingLines -= 1;
|
|
212
330
|
currentLine = '';
|
|
213
331
|
currentLineWidth = 0;
|
|
@@ -215,109 +333,68 @@ export const wrapLine = (
|
|
|
215
333
|
}
|
|
216
334
|
const initial = maxWidth - currentLineWidth;
|
|
217
335
|
const [lines, rl, rt] = breakAll(
|
|
336
|
+
measureText,
|
|
218
337
|
word,
|
|
219
338
|
fontFamily,
|
|
220
339
|
initial,
|
|
221
340
|
maxWidth,
|
|
222
|
-
|
|
341
|
+
letterSpacing,
|
|
223
342
|
remainingLines,
|
|
224
|
-
hasMaxLines,
|
|
225
343
|
);
|
|
226
344
|
remainingLines = rl;
|
|
227
345
|
hasRemainingText = rt;
|
|
228
346
|
if (linebreak === false) {
|
|
229
347
|
const [text, width] = lines[0]!;
|
|
230
|
-
currentLine +=
|
|
231
|
-
currentLineWidth
|
|
232
|
-
wrappedLines.push([currentLine, currentLineWidth]);
|
|
348
|
+
currentLine += text;
|
|
349
|
+
currentLineWidth += width;
|
|
350
|
+
wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
|
|
233
351
|
}
|
|
234
352
|
|
|
235
353
|
for (let j = 1; j < lines.length; j++) {
|
|
236
354
|
[currentLine, currentLineWidth] = lines[j]!;
|
|
237
355
|
if (j < lines.length - 1) {
|
|
238
|
-
wrappedLines.push([currentLine, currentLineWidth]);
|
|
356
|
+
wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
|
|
239
357
|
}
|
|
240
358
|
}
|
|
359
|
+
|
|
360
|
+
if (i < words.length - 1 && currentLine.endsWith(' ') === false) {
|
|
361
|
+
currentLine += ' ';
|
|
362
|
+
currentLineWidth += effectiveSpaceWidth;
|
|
363
|
+
}
|
|
241
364
|
}
|
|
242
365
|
}
|
|
243
366
|
}
|
|
244
367
|
|
|
245
368
|
// Add the last line if it has content
|
|
246
|
-
if (currentLine.length > 0 && remainingLines === 0) {
|
|
369
|
+
if (currentLine.length > 0 && hasMaxLines === true && remainingLines === 0) {
|
|
247
370
|
currentLine = truncateLineWithSuffix(
|
|
371
|
+
measureText,
|
|
248
372
|
currentLine,
|
|
249
373
|
fontFamily,
|
|
250
374
|
maxWidth,
|
|
251
|
-
|
|
375
|
+
letterSpacing,
|
|
252
376
|
overflowSuffix,
|
|
253
377
|
);
|
|
254
378
|
}
|
|
255
379
|
|
|
256
380
|
if (currentLine.length > 0) {
|
|
257
|
-
wrappedLines.push([currentLine, currentLineWidth]);
|
|
258
|
-
} else {
|
|
259
|
-
wrappedLines.push(['', 0]);
|
|
381
|
+
wrappedLines.push([currentLine, currentLineWidth, 0, 0]);
|
|
260
382
|
}
|
|
261
383
|
return [wrappedLines, remainingLines, hasRemainingText];
|
|
262
384
|
};
|
|
263
385
|
|
|
264
|
-
/**
|
|
265
|
-
* Measure the width of text in SDF design units
|
|
266
|
-
*/
|
|
267
|
-
export const measureText = (
|
|
268
|
-
text: string,
|
|
269
|
-
fontFamily: string,
|
|
270
|
-
designLetterSpacing: number,
|
|
271
|
-
): number => {
|
|
272
|
-
let width = 0;
|
|
273
|
-
let prevCodepoint = 0;
|
|
274
|
-
for (let i = 0; i < text.length; i++) {
|
|
275
|
-
const char = text.charAt(i);
|
|
276
|
-
const codepoint = text.codePointAt(i);
|
|
277
|
-
if (codepoint === undefined) continue;
|
|
278
|
-
|
|
279
|
-
// Skip zero-width spaces in width calculations
|
|
280
|
-
if (isZeroWidthSpace(char)) {
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
|
|
285
|
-
if (glyph === null) continue;
|
|
286
|
-
|
|
287
|
-
let advance = glyph.xadvance;
|
|
288
|
-
|
|
289
|
-
// Add kerning if there's a previous character
|
|
290
|
-
if (prevCodepoint !== 0) {
|
|
291
|
-
const kerning = SdfFontHandler.getKerning(
|
|
292
|
-
fontFamily,
|
|
293
|
-
prevCodepoint,
|
|
294
|
-
codepoint,
|
|
295
|
-
);
|
|
296
|
-
advance += kerning;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
width += advance + designLetterSpacing;
|
|
300
|
-
prevCodepoint = codepoint;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
return width;
|
|
304
|
-
};
|
|
305
|
-
|
|
306
386
|
/**
|
|
307
387
|
* Truncate a line with overflow suffix to fit within width
|
|
308
388
|
*/
|
|
309
389
|
export const truncateLineWithSuffix = (
|
|
390
|
+
measureText: MeasureTextFn,
|
|
310
391
|
line: string,
|
|
311
392
|
fontFamily: string,
|
|
312
393
|
maxWidth: number,
|
|
313
|
-
|
|
394
|
+
letterSpacing: number,
|
|
314
395
|
overflowSuffix: string,
|
|
315
396
|
): string => {
|
|
316
|
-
const suffixWidth = measureText(
|
|
317
|
-
overflowSuffix,
|
|
318
|
-
fontFamily,
|
|
319
|
-
designLetterSpacing,
|
|
320
|
-
);
|
|
397
|
+
const suffixWidth = measureText(overflowSuffix, fontFamily, letterSpacing);
|
|
321
398
|
|
|
322
399
|
if (suffixWidth >= maxWidth) {
|
|
323
400
|
return overflowSuffix.substring(0, Math.max(1, overflowSuffix.length - 1));
|
|
@@ -325,11 +402,7 @@ export const truncateLineWithSuffix = (
|
|
|
325
402
|
|
|
326
403
|
let truncatedLine = line;
|
|
327
404
|
while (truncatedLine.length > 0) {
|
|
328
|
-
const lineWidth = measureText(
|
|
329
|
-
truncatedLine,
|
|
330
|
-
fontFamily,
|
|
331
|
-
designLetterSpacing,
|
|
332
|
-
);
|
|
405
|
+
const lineWidth = measureText(truncatedLine, fontFamily, letterSpacing);
|
|
333
406
|
if (lineWidth + suffixWidth <= maxWidth) {
|
|
334
407
|
return truncatedLine + overflowSuffix;
|
|
335
408
|
}
|
|
@@ -343,12 +416,12 @@ export const truncateLineWithSuffix = (
|
|
|
343
416
|
* wordbreak function: https://developer.mozilla.org/en-US/docs/Web/CSS/word-break#break-word
|
|
344
417
|
*/
|
|
345
418
|
export const breakWord = (
|
|
419
|
+
measureText: MeasureTextFn,
|
|
346
420
|
word: string,
|
|
347
421
|
fontFamily: string,
|
|
348
422
|
maxWidth: number,
|
|
349
|
-
|
|
423
|
+
letterSpacing: number,
|
|
350
424
|
remainingLines: number,
|
|
351
|
-
hasMaxLines: boolean,
|
|
352
425
|
): WrappedLinesStruct => {
|
|
353
426
|
const lines: TextLineStruct[] = [];
|
|
354
427
|
let currentPart = '';
|
|
@@ -360,17 +433,14 @@ export const breakWord = (
|
|
|
360
433
|
const codepoint = char.codePointAt(0);
|
|
361
434
|
if (codepoint === undefined) continue;
|
|
362
435
|
|
|
363
|
-
const
|
|
364
|
-
if (glyph === null) continue;
|
|
365
|
-
|
|
366
|
-
const charWidth = glyph.xadvance + designLetterSpacing;
|
|
436
|
+
const charWidth = measureText(char, fontFamily, letterSpacing);
|
|
367
437
|
|
|
368
438
|
if (currentWidth + charWidth > maxWidth && currentPart.length > 0) {
|
|
369
439
|
remainingLines--;
|
|
370
440
|
if (remainingLines === 0) {
|
|
371
441
|
break;
|
|
372
442
|
}
|
|
373
|
-
lines.push([currentPart, currentWidth]);
|
|
443
|
+
lines.push([currentPart, currentWidth, 0, 0]);
|
|
374
444
|
currentPart = char;
|
|
375
445
|
currentWidth = charWidth;
|
|
376
446
|
} else {
|
|
@@ -380,7 +450,7 @@ export const breakWord = (
|
|
|
380
450
|
}
|
|
381
451
|
|
|
382
452
|
if (currentPart.length > 0) {
|
|
383
|
-
lines.push([currentPart, currentWidth]);
|
|
453
|
+
lines.push([currentPart, currentWidth, 0, 0]);
|
|
384
454
|
}
|
|
385
455
|
|
|
386
456
|
return [lines, remainingLines, i < word.length - 1];
|
|
@@ -390,13 +460,13 @@ export const breakWord = (
|
|
|
390
460
|
* wordbreak function: https://developer.mozilla.org/en-US/docs/Web/CSS/word-break#break-word
|
|
391
461
|
*/
|
|
392
462
|
export const breakAll = (
|
|
463
|
+
measureText: MeasureTextFn,
|
|
393
464
|
word: string,
|
|
394
465
|
fontFamily: string,
|
|
395
466
|
initial: number,
|
|
396
467
|
maxWidth: number,
|
|
397
|
-
|
|
468
|
+
letterSpacing: number,
|
|
398
469
|
remainingLines: number,
|
|
399
|
-
hasMaxLines: boolean,
|
|
400
470
|
): WrappedLinesStruct => {
|
|
401
471
|
const lines: TextLineStruct[] = [];
|
|
402
472
|
let currentPart = '';
|
|
@@ -411,13 +481,9 @@ export const breakAll = (
|
|
|
411
481
|
break;
|
|
412
482
|
}
|
|
413
483
|
const char = word.charAt(i);
|
|
414
|
-
const
|
|
415
|
-
const glyph = SdfFontHandler.getGlyph(fontFamily, codepoint);
|
|
416
|
-
if (glyph === null) continue;
|
|
417
|
-
|
|
418
|
-
const charWidth = glyph.xadvance + designLetterSpacing;
|
|
484
|
+
const charWidth = measureText(char, fontFamily, letterSpacing);
|
|
419
485
|
if (currentWidth + charWidth > max && currentPart.length > 0) {
|
|
420
|
-
lines.push([currentPart, currentWidth]);
|
|
486
|
+
lines.push([currentPart, currentWidth, 0, 0]);
|
|
421
487
|
currentPart = char;
|
|
422
488
|
currentWidth = charWidth;
|
|
423
489
|
max = maxWidth;
|
|
@@ -429,7 +495,7 @@ export const breakAll = (
|
|
|
429
495
|
}
|
|
430
496
|
|
|
431
497
|
if (currentPart.length > 0) {
|
|
432
|
-
lines.push([currentPart, currentWidth]);
|
|
498
|
+
lines.push([currentPart, currentWidth, 0, 0]);
|
|
433
499
|
}
|
|
434
500
|
|
|
435
501
|
return [lines, remainingLines, hasRemainingText];
|
|
@@ -198,16 +198,6 @@ export interface TrProps extends TrFontProps {
|
|
|
198
198
|
* @default 0
|
|
199
199
|
*/
|
|
200
200
|
maxLines: number;
|
|
201
|
-
/**
|
|
202
|
-
* Baseline for text
|
|
203
|
-
*
|
|
204
|
-
* @remarks
|
|
205
|
-
* This property sets the text baseline used when drawing text.
|
|
206
|
-
* Not yet implemented in the SDF renderer.
|
|
207
|
-
*
|
|
208
|
-
* @default alphabetic
|
|
209
|
-
*/
|
|
210
|
-
textBaseline: TextBaseline;
|
|
211
201
|
/**
|
|
212
202
|
* Vertical Align for text when lineHeight > fontSize
|
|
213
203
|
*
|
|
@@ -335,6 +325,15 @@ export interface FontLoadOptions {
|
|
|
335
325
|
atlasDataUrl?: string;
|
|
336
326
|
}
|
|
337
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Measure Width of Text function to be defined in font handlers, used in TextLayoutEngine
|
|
330
|
+
*/
|
|
331
|
+
export type MeasureTextFn = (
|
|
332
|
+
text: string,
|
|
333
|
+
fontFamily: string,
|
|
334
|
+
letterSpacing: number,
|
|
335
|
+
) => number;
|
|
336
|
+
|
|
338
337
|
export interface FontHandler {
|
|
339
338
|
init: (
|
|
340
339
|
c: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
|
|
@@ -350,7 +349,7 @@ export interface FontHandler {
|
|
|
350
349
|
fontFamily: string,
|
|
351
350
|
fontSize: number,
|
|
352
351
|
) => NormalizedFontMetrics;
|
|
353
|
-
|
|
352
|
+
measureText: MeasureTextFn;
|
|
354
353
|
}
|
|
355
354
|
|
|
356
355
|
export interface TextRenderProps {
|
|
@@ -371,6 +370,8 @@ export interface TextRenderProps {
|
|
|
371
370
|
export interface TextRenderInfo {
|
|
372
371
|
width: number;
|
|
373
372
|
height: number;
|
|
373
|
+
hasRemainingText?: boolean;
|
|
374
|
+
remainingLines?: number;
|
|
374
375
|
imageData?: ImageData | null; // Image data for Canvas Text Renderer
|
|
375
376
|
layout?: TextLayout; // Layout data for SDF renderer caching
|
|
376
377
|
}
|
|
@@ -378,7 +379,7 @@ export interface TextRenderInfo {
|
|
|
378
379
|
export interface TextRenderer {
|
|
379
380
|
type: 'canvas' | 'sdf';
|
|
380
381
|
font: FontHandler;
|
|
381
|
-
renderText: (
|
|
382
|
+
renderText: (props: CoreTextNodeProps) => TextRenderInfo;
|
|
382
383
|
// Updated to accept layout data and return vertex buffer for performance
|
|
383
384
|
addQuads: (layout?: TextLayout) => Float32Array | null;
|
|
384
385
|
renderQuads: (
|
|
@@ -394,8 +395,10 @@ export interface TextRenderer {
|
|
|
394
395
|
* Text line struct for text mapping
|
|
395
396
|
* 0 - text
|
|
396
397
|
* 1 - width
|
|
398
|
+
* 2 - line offset x
|
|
399
|
+
* 3 - line offset y
|
|
397
400
|
*/
|
|
398
|
-
export type TextLineStruct = [string, number];
|
|
401
|
+
export type TextLineStruct = [string, number, number, number];
|
|
399
402
|
|
|
400
403
|
/**
|
|
401
404
|
* Wrapped lines struct for text mapping
|
|
@@ -404,3 +407,23 @@ export type TextLineStruct = [string, number];
|
|
|
404
407
|
* 2 - remaining text
|
|
405
408
|
*/
|
|
406
409
|
export type WrappedLinesStruct = [TextLineStruct[], number, boolean];
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Wrapped lines struct for text mapping
|
|
413
|
+
* 0 - line structs
|
|
414
|
+
* 1 - remaining lines
|
|
415
|
+
* 2 - remaining text
|
|
416
|
+
* 3 - bare line height
|
|
417
|
+
* 4 - line height pixels
|
|
418
|
+
* 5 - effective width
|
|
419
|
+
* 6 - effective height
|
|
420
|
+
*/
|
|
421
|
+
export type TextLayoutStruct = [
|
|
422
|
+
TextLineStruct[],
|
|
423
|
+
number,
|
|
424
|
+
boolean,
|
|
425
|
+
number,
|
|
426
|
+
number,
|
|
427
|
+
number,
|
|
428
|
+
number,
|
|
429
|
+
];
|