@lightningjs/renderer 3.0.0-beta17 → 3.0.0-beta18

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.
Files changed (201) hide show
  1. package/dist/src/core/AutosizeManager.d.ts +29 -0
  2. package/dist/src/core/AutosizeManager.js +171 -0
  3. package/dist/src/core/AutosizeManager.js.map +1 -0
  4. package/dist/src/core/Stage.js +2 -1
  5. package/dist/src/core/Stage.js.map +1 -1
  6. package/dist/src/core/TextureError.d.ts +11 -0
  7. package/dist/src/core/TextureError.js +37 -0
  8. package/dist/src/core/TextureError.js.map +1 -0
  9. package/dist/src/core/platform.d.ts +10 -0
  10. package/dist/src/core/platform.js +81 -0
  11. package/dist/src/core/platform.js.map +1 -0
  12. package/dist/src/core/renderers/CoreShader.d.ts +9 -0
  13. package/dist/src/core/renderers/CoreShader.js +28 -0
  14. package/dist/src/core/renderers/CoreShader.js.map +1 -0
  15. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +33 -0
  16. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +250 -0
  17. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -0
  18. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +17 -0
  19. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +125 -0
  20. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -0
  21. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +14 -0
  22. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +138 -0
  23. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -0
  24. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +19 -0
  25. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +58 -0
  26. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -0
  27. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +10 -0
  28. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +43 -0
  29. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +1 -0
  30. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +12 -0
  31. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +58 -0
  32. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -0
  33. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +9 -0
  34. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +38 -0
  35. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -0
  36. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +69 -0
  37. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +272 -0
  38. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -0
  39. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +34 -0
  40. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +114 -0
  41. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -0
  42. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +133 -0
  43. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +645 -0
  44. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -0
  45. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +78 -0
  46. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +202 -0
  47. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -0
  48. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +9 -0
  49. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +84 -0
  50. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -0
  51. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +10 -0
  52. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +108 -0
  53. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -0
  54. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +29 -0
  55. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +408 -0
  56. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -0
  57. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +28 -0
  58. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +126 -0
  59. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -0
  60. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +47 -0
  61. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +148 -0
  62. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -0
  63. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +31 -0
  64. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +71 -0
  65. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -0
  66. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +30 -0
  67. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +58 -0
  68. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -0
  69. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +31 -0
  70. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +71 -0
  71. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -0
  72. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +31 -0
  73. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +71 -0
  74. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -0
  75. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +31 -0
  76. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +71 -0
  77. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -0
  78. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +9 -0
  79. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +136 -0
  80. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -0
  81. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +36 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +85 -0
  83. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
  84. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +45 -0
  85. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +104 -0
  86. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -0
  87. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +22 -0
  88. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +45 -0
  89. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -0
  90. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +58 -0
  91. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +80 -0
  92. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -0
  93. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +35 -0
  94. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +134 -0
  95. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -0
  96. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +40 -0
  97. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +143 -0
  98. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
  99. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +61 -0
  100. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +127 -0
  101. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -0
  102. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +40 -0
  103. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +71 -0
  104. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -0
  105. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +115 -0
  106. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +61 -0
  107. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -0
  108. package/dist/src/core/shaders/canvas/RadialGradient.js +1 -1
  109. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  110. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +6 -4
  111. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  112. package/dist/src/core/shaders/webgl/LinearGradient.js +2 -1
  113. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  114. package/dist/src/core/shaders/webgl/RadialGradient.js +8 -7
  115. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  116. package/dist/src/core/text-rendering/CanvasTextRenderer.js +1 -1
  117. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  118. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +12 -0
  119. package/dist/src/core/text-rendering/TextRenderingUtils.js +14 -0
  120. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +1 -0
  121. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +72 -0
  122. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +217 -0
  123. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -0
  124. package/dist/src/core/text-rendering/TrFontManager.d.ts +26 -0
  125. package/dist/src/core/text-rendering/TrFontManager.js +131 -0
  126. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -0
  127. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +39 -0
  128. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +125 -0
  129. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -0
  130. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +103 -0
  131. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +21 -0
  132. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +1 -0
  133. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +62 -0
  134. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +88 -0
  135. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -0
  136. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +118 -0
  137. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +63 -0
  138. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -0
  139. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +14 -0
  140. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +66 -0
  141. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -0
  142. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +1 -0
  143. package/dist/src/core/text-rendering/font-face-types/utils.js +38 -0
  144. package/dist/src/core/text-rendering/font-face-types/utils.js.map +1 -0
  145. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +59 -0
  146. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +397 -0
  147. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -0
  148. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +120 -0
  149. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +551 -0
  150. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -0
  151. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +92 -0
  152. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +607 -0
  153. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -0
  154. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +12 -0
  155. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +61 -0
  156. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +1 -0
  157. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +33 -0
  158. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +52 -0
  159. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +1 -0
  160. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +13 -0
  161. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +32 -0
  162. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +1 -0
  163. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +23 -0
  164. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +84 -0
  165. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -0
  166. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +4 -0
  167. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +34 -0
  168. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +1 -0
  169. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +20 -0
  170. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +308 -0
  171. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -0
  172. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +10 -0
  173. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +40 -0
  174. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +1 -0
  175. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
  176. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
  177. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
  178. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
  179. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +39 -0
  180. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
  181. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +373 -0
  182. package/dist/src/core/text-rendering/renderers/TextRenderer.js +178 -0
  183. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -0
  184. package/dist/src/core/utils.d.ts +1 -1
  185. package/dist/src/main-api/DynamicShaderController.d.ts +29 -0
  186. package/dist/src/main-api/DynamicShaderController.js +58 -0
  187. package/dist/src/main-api/DynamicShaderController.js.map +1 -0
  188. package/dist/src/main-api/Renderer.js +1 -1
  189. package/dist/src/main-api/Renderer.js.map +1 -1
  190. package/dist/src/main-api/ShaderController.d.ts +31 -0
  191. package/dist/src/main-api/ShaderController.js +37 -0
  192. package/dist/src/main-api/ShaderController.js.map +1 -0
  193. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  194. package/package.json +1 -1
  195. package/src/core/Stage.ts +3 -1
  196. package/src/core/shaders/canvas/RadialGradient.ts +1 -1
  197. package/src/core/shaders/templates/RadialGradientTemplate.ts +6 -4
  198. package/src/core/shaders/webgl/LinearGradient.ts +2 -1
  199. package/src/core/shaders/webgl/RadialGradient.ts +8 -7
  200. package/src/core/text-rendering/CanvasTextRenderer.ts +1 -1
  201. package/src/main-api/Renderer.ts +1 -1
@@ -0,0 +1,551 @@
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2023 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
20
+ import { assertTruthy } from '../../../utils.js';
21
+ import { getRgbaString } from '../../lib/utils.js';
22
+ import { calcDefaultLineHeight } from '../TextRenderingUtils.js';
23
+ import { getWebFontMetrics, isZeroWidthSpace, } from '../TextTextureRendererUtils.js';
24
+ const MAX_TEXTURE_DIMENSION = 2048;
25
+ /**
26
+ * Calculate height for the canvas
27
+ *
28
+ * @param textBaseline
29
+ * @param fontSize
30
+ * @param lineHeight
31
+ * @param numLines
32
+ * @param offsetY
33
+ * @returns
34
+ */
35
+ function calcHeight(textBaseline, fontSize, lineHeight, numLines, offsetY) {
36
+ const baselineOffset = textBaseline !== 'bottom' ? 0.5 * fontSize : 0;
37
+ return (lineHeight * (numLines - 1) +
38
+ baselineOffset +
39
+ Math.max(lineHeight, fontSize) +
40
+ (offsetY || 0));
41
+ }
42
+ export class LightningTextTextureRenderer {
43
+ _canvas;
44
+ _context;
45
+ _settings;
46
+ constructor(canvas, context) {
47
+ this._canvas = canvas;
48
+ this._context = context;
49
+ this._settings = this.mergeDefaults({});
50
+ }
51
+ set settings(v) {
52
+ this._settings = this.mergeDefaults(v);
53
+ }
54
+ get settings() {
55
+ return this._settings;
56
+ }
57
+ getPrecision() {
58
+ return this._settings.precision;
59
+ }
60
+ setFontProperties() {
61
+ this._context.font = this._getFontSetting();
62
+ this._context.textBaseline = this._settings.textBaseline;
63
+ }
64
+ _getFontSetting() {
65
+ const ff = [this._settings.fontFamily];
66
+ const ffs = [];
67
+ for (let i = 0, n = ff.length; i < n; i++) {
68
+ if (ff[i] === 'serif' || ff[i] === 'sans-serif') {
69
+ ffs.push(ff[i]);
70
+ }
71
+ else {
72
+ ffs.push(`"${ff[i]}"`);
73
+ }
74
+ }
75
+ return `${this._settings.fontStyle} ${this._settings.fontSize * this.getPrecision()}px ${ffs.join(',')}`;
76
+ }
77
+ _load() {
78
+ if (true && document.fonts) {
79
+ const fontSetting = this._getFontSetting();
80
+ try {
81
+ if (!document.fonts.check(fontSetting, this._settings.text)) {
82
+ // Use a promise that waits for loading.
83
+ return document.fonts
84
+ .load(fontSetting, this._settings.text)
85
+ .catch((err) => {
86
+ // Just load the fallback font.
87
+ console.warn('[Lightning] Font load error', err, fontSetting);
88
+ })
89
+ .then(() => {
90
+ if (!document.fonts.check(fontSetting, this._settings.text)) {
91
+ console.warn('[Lightning] Font not found', fontSetting);
92
+ }
93
+ });
94
+ }
95
+ }
96
+ catch (e) {
97
+ console.warn("[Lightning] Can't check font loading for " + fontSetting);
98
+ }
99
+ }
100
+ }
101
+ calculateRenderInfo() {
102
+ const renderInfo = {};
103
+ const precision = this.getPrecision();
104
+ const paddingLeft = this._settings.paddingLeft * precision;
105
+ const paddingRight = this._settings.paddingRight * precision;
106
+ const fontSize = this._settings.fontSize * precision;
107
+ let offsetY = this._settings.offsetY === null
108
+ ? null
109
+ : this._settings.offsetY * precision;
110
+ const w = this._settings.w * precision;
111
+ const h = this._settings.h * precision;
112
+ let wordWrapWidth = this._settings.wordWrapWidth * precision;
113
+ const cutSx = this._settings.cutSx * precision;
114
+ const cutEx = this._settings.cutEx * precision;
115
+ const cutSy = this._settings.cutSy * precision;
116
+ const cutEy = this._settings.cutEy * precision;
117
+ const letterSpacing = (this._settings.letterSpacing || 0) * precision;
118
+ const textIndent = this._settings.textIndent * precision;
119
+ const trFontFace = this._settings.trFontFace;
120
+ // Set font properties.
121
+ this.setFontProperties();
122
+ assertTruthy(trFontFace);
123
+ const metrics = getWebFontMetrics(this._context, trFontFace, fontSize);
124
+ const defLineHeight = calcDefaultLineHeight(metrics, fontSize) * precision;
125
+ const lineHeight = this._settings.lineHeight !== null
126
+ ? this._settings.lineHeight * precision
127
+ : defLineHeight;
128
+ const maxHeight = this._settings.maxHeight;
129
+ const containedMaxLines = maxHeight !== null && lineHeight > 0
130
+ ? Math.floor(maxHeight / lineHeight)
131
+ : 0;
132
+ const setMaxLines = this._settings.maxLines;
133
+ const calcMaxLines = containedMaxLines > 0 && setMaxLines > 0
134
+ ? Math.min(containedMaxLines, setMaxLines)
135
+ : Math.max(containedMaxLines, setMaxLines);
136
+ // Total width.
137
+ let width = w || 2048 / this.getPrecision();
138
+ // Inner width.
139
+ let innerWidth = width - paddingLeft;
140
+ if (innerWidth < 10) {
141
+ width += 10 - innerWidth;
142
+ innerWidth = 10;
143
+ }
144
+ if (!wordWrapWidth) {
145
+ wordWrapWidth = innerWidth;
146
+ }
147
+ // Text overflow
148
+ if (this._settings.textOverflow && !this._settings.wordWrap) {
149
+ let suffix;
150
+ switch (this._settings.textOverflow) {
151
+ case 'clip':
152
+ suffix = '';
153
+ break;
154
+ case 'ellipsis':
155
+ suffix = this._settings.overflowSuffix;
156
+ break;
157
+ default:
158
+ suffix = this._settings.textOverflow;
159
+ }
160
+ this._settings.text = this.wrapWord(this._settings.text, wordWrapWidth - textIndent, suffix);
161
+ }
162
+ // word wrap
163
+ // preserve original text
164
+ let linesInfo;
165
+ if (this._settings.wordWrap) {
166
+ linesInfo = this.wrapText(this._settings.text, wordWrapWidth, letterSpacing, textIndent);
167
+ }
168
+ else {
169
+ linesInfo = { l: this._settings.text.split(/(?:\r\n|\r|\n)/), n: [] };
170
+ const n = linesInfo.l.length;
171
+ for (let i = 0; i < n - 1; i++) {
172
+ linesInfo.n.push(i);
173
+ }
174
+ }
175
+ let lines = linesInfo.l;
176
+ if (calcMaxLines && lines.length > calcMaxLines) {
177
+ const usedLines = lines.slice(0, calcMaxLines);
178
+ let otherLines = null;
179
+ if (this._settings.overflowSuffix) {
180
+ // Wrap again with max lines suffix enabled.
181
+ const w = this._settings.overflowSuffix
182
+ ? this.measureText(this._settings.overflowSuffix)
183
+ : 0;
184
+ const al = this.wrapText(usedLines[usedLines.length - 1], wordWrapWidth - w, letterSpacing, textIndent);
185
+ usedLines[usedLines.length - 1] = `${al.l[0]}${this._settings.overflowSuffix}`;
186
+ otherLines = [al.l.length > 1 ? al.l[1] : ''];
187
+ }
188
+ else {
189
+ otherLines = [''];
190
+ }
191
+ // Re-assemble the remaining text.
192
+ let i;
193
+ const n = lines.length;
194
+ let j = 0;
195
+ const m = linesInfo.n.length;
196
+ for (i = calcMaxLines; i < n; i++) {
197
+ otherLines[j] += `${otherLines[j] ? ' ' : ''}${lines[i]}`;
198
+ if (i + 1 < m && linesInfo.n[i + 1]) {
199
+ j++;
200
+ }
201
+ }
202
+ renderInfo.remainingText = otherLines.join('\n');
203
+ renderInfo.moreTextLines = true;
204
+ lines = usedLines;
205
+ }
206
+ else {
207
+ renderInfo.moreTextLines = false;
208
+ renderInfo.remainingText = '';
209
+ }
210
+ // calculate text width
211
+ let maxLineWidth = 0;
212
+ const lineWidths = [];
213
+ for (let i = 0; i < lines.length; i++) {
214
+ const lineWidth = this.measureText(lines[i], letterSpacing) + (i === 0 ? textIndent : 0);
215
+ lineWidths.push(lineWidth);
216
+ maxLineWidth = Math.max(maxLineWidth, lineWidth);
217
+ }
218
+ renderInfo.lineWidths = lineWidths;
219
+ if (!w) {
220
+ // Auto-set width to max text length.
221
+ width = maxLineWidth + paddingLeft + paddingRight;
222
+ innerWidth = maxLineWidth;
223
+ }
224
+ // If word wrap is enabled the width needs to be the width of the text.
225
+ if (this._settings.wordWrap &&
226
+ w > maxLineWidth &&
227
+ this._settings.textAlign === 'left' &&
228
+ lines.length === 1) {
229
+ width = maxLineWidth + paddingLeft + paddingRight;
230
+ }
231
+ let height;
232
+ if (h) {
233
+ height = h;
234
+ }
235
+ else {
236
+ height = calcHeight(this._settings.textBaseline, fontSize, lineHeight, lines.length, offsetY);
237
+ }
238
+ if (offsetY === null) {
239
+ offsetY = fontSize;
240
+ }
241
+ renderInfo.w = width;
242
+ renderInfo.h = height;
243
+ renderInfo.lines = lines;
244
+ renderInfo.precision = precision;
245
+ if (!width) {
246
+ // To prevent canvas errors.
247
+ width = 1;
248
+ }
249
+ if (!height) {
250
+ // To prevent canvas errors.
251
+ height = 1;
252
+ }
253
+ if (cutSx || cutEx) {
254
+ width = Math.min(width, cutEx - cutSx);
255
+ }
256
+ if (cutSy || cutEy) {
257
+ height = Math.min(height, cutEy - cutSy);
258
+ }
259
+ renderInfo.width = width;
260
+ renderInfo.innerWidth = innerWidth;
261
+ renderInfo.height = height;
262
+ renderInfo.fontSize = fontSize;
263
+ renderInfo.cutSx = cutSx;
264
+ renderInfo.cutSy = cutSy;
265
+ renderInfo.cutEx = cutEx;
266
+ renderInfo.cutEy = cutEy;
267
+ renderInfo.lineHeight = lineHeight;
268
+ renderInfo.defLineHeight = defLineHeight;
269
+ renderInfo.lineWidths = lineWidths;
270
+ renderInfo.offsetY = offsetY;
271
+ renderInfo.paddingLeft = paddingLeft;
272
+ renderInfo.paddingRight = paddingRight;
273
+ renderInfo.letterSpacing = letterSpacing;
274
+ renderInfo.textIndent = textIndent;
275
+ renderInfo.metrics = metrics;
276
+ return renderInfo;
277
+ }
278
+ draw(renderInfo, linesOverride) {
279
+ const precision = this.getPrecision();
280
+ // Allow lines to be overriden for partial rendering.
281
+ const lines = linesOverride?.lines || renderInfo.lines;
282
+ const lineWidths = linesOverride?.lineWidths || renderInfo.lineWidths;
283
+ const height = linesOverride
284
+ ? calcHeight(this._settings.textBaseline, renderInfo.fontSize, renderInfo.lineHeight, linesOverride.lines.length, this._settings.offsetY === null
285
+ ? null
286
+ : this._settings.offsetY * precision)
287
+ : renderInfo.height;
288
+ // Add extra margin to prevent issue with clipped text when scaling.
289
+ this._canvas.width = Math.min(Math.ceil(renderInfo.width + this._settings.textRenderIssueMargin), MAX_TEXTURE_DIMENSION);
290
+ this._canvas.height = Math.min(Math.ceil(height), MAX_TEXTURE_DIMENSION);
291
+ // Canvas context has been reset.
292
+ this.setFontProperties();
293
+ if (renderInfo.fontSize >= 128) {
294
+ // WpeWebKit bug: must force compositing because cairo-traps-compositor will not work with text first.
295
+ this._context.globalAlpha = 0.01;
296
+ this._context.fillRect(0, 0, 0.01, 0.01);
297
+ this._context.globalAlpha = 1.0;
298
+ }
299
+ if (renderInfo.cutSx || renderInfo.cutSy) {
300
+ this._context.translate(-renderInfo.cutSx, -renderInfo.cutSy);
301
+ }
302
+ let linePositionX;
303
+ let linePositionY;
304
+ const drawLines = [];
305
+ const { metrics } = renderInfo;
306
+ /**
307
+ * Ascender (in pixels)
308
+ */
309
+ const ascenderPx = metrics
310
+ ? metrics.ascender * renderInfo.fontSize
311
+ : renderInfo.fontSize;
312
+ /**
313
+ * Bare line height is the distance between the ascender and descender of the font.
314
+ * without the line gap metric.
315
+ */
316
+ const bareLineHeightPx = (metrics.ascender - metrics.descender) * renderInfo.fontSize;
317
+ // Draw lines line by line.
318
+ for (let i = 0, n = lines.length; i < n; i++) {
319
+ linePositionX = i === 0 ? renderInfo.textIndent : 0;
320
+ // By default, text is aligned to top
321
+ linePositionY = i * renderInfo.lineHeight + ascenderPx;
322
+ if (this._settings.verticalAlign == 'middle') {
323
+ linePositionY += (renderInfo.lineHeight - bareLineHeightPx) / 2;
324
+ }
325
+ else if (this._settings.verticalAlign == 'bottom') {
326
+ linePositionY += renderInfo.lineHeight - bareLineHeightPx;
327
+ }
328
+ if (this._settings.textAlign === 'right') {
329
+ linePositionX += renderInfo.innerWidth - lineWidths[i];
330
+ }
331
+ else if (this._settings.textAlign === 'center') {
332
+ linePositionX += (renderInfo.innerWidth - lineWidths[i]) / 2;
333
+ }
334
+ linePositionX += renderInfo.paddingLeft;
335
+ drawLines.push({
336
+ text: lines[i],
337
+ x: linePositionX,
338
+ y: linePositionY,
339
+ w: lineWidths[i],
340
+ });
341
+ }
342
+ // Highlight.
343
+ if (this._settings.highlight) {
344
+ const color = this._settings.highlightColor;
345
+ const hlHeight = this._settings.highlightHeight * precision || renderInfo.fontSize * 1.5;
346
+ const offset = this._settings.highlightOffset * precision;
347
+ const hlPaddingLeft = this._settings.highlightPaddingLeft !== null
348
+ ? this._settings.highlightPaddingLeft * precision
349
+ : renderInfo.paddingLeft;
350
+ const hlPaddingRight = this._settings.highlightPaddingRight !== null
351
+ ? this._settings.highlightPaddingRight * precision
352
+ : renderInfo.paddingRight;
353
+ this._context.fillStyle = getRgbaString(color);
354
+ for (let i = 0; i < drawLines.length; i++) {
355
+ const drawLine = drawLines[i];
356
+ this._context.fillRect(drawLine.x - hlPaddingLeft, drawLine.y - renderInfo.offsetY + offset, drawLine.w + hlPaddingRight + hlPaddingLeft, hlHeight);
357
+ }
358
+ }
359
+ // Text shadow.
360
+ let prevShadowSettings = null;
361
+ if (this._settings.shadow) {
362
+ prevShadowSettings = [
363
+ this._context.shadowColor,
364
+ this._context.shadowOffsetX,
365
+ this._context.shadowOffsetY,
366
+ this._context.shadowBlur,
367
+ ];
368
+ this._context.shadowColor = getRgbaString(this._settings.shadowColor);
369
+ this._context.shadowOffsetX = this._settings.shadowOffsetX * precision;
370
+ this._context.shadowOffsetY = this._settings.shadowOffsetY * precision;
371
+ this._context.shadowBlur = this._settings.shadowBlur * precision;
372
+ }
373
+ this._context.fillStyle = getRgbaString(this._settings.textColor);
374
+ for (let i = 0, n = drawLines.length; i < n; i++) {
375
+ const drawLine = drawLines[i];
376
+ if (renderInfo.letterSpacing === 0) {
377
+ this._context.fillText(drawLine.text, drawLine.x, drawLine.y);
378
+ }
379
+ else {
380
+ const textSplit = drawLine.text.split('');
381
+ let x = drawLine.x;
382
+ for (let i = 0, j = textSplit.length; i < j; i++) {
383
+ this._context.fillText(textSplit[i], x, drawLine.y);
384
+ x += this.measureText(textSplit[i], renderInfo.letterSpacing);
385
+ }
386
+ }
387
+ }
388
+ if (prevShadowSettings) {
389
+ this._context.shadowColor = prevShadowSettings[0];
390
+ this._context.shadowOffsetX = prevShadowSettings[1];
391
+ this._context.shadowOffsetY = prevShadowSettings[2];
392
+ this._context.shadowBlur = prevShadowSettings[3];
393
+ }
394
+ if (renderInfo.cutSx || renderInfo.cutSy) {
395
+ this._context.translate(renderInfo.cutSx, renderInfo.cutSy);
396
+ }
397
+ }
398
+ wrapWord(word, wordWrapWidth, suffix) {
399
+ const suffixWidth = this._context.measureText(suffix).width;
400
+ const wordLen = word.length;
401
+ const wordWidth = this._context.measureText(word).width;
402
+ /* If word fits wrapWidth, do nothing */
403
+ if (wordWidth <= wordWrapWidth) {
404
+ return word;
405
+ }
406
+ /* Make initial guess for text cuttoff */
407
+ let cutoffIndex = Math.floor((wordWrapWidth * wordLen) / wordWidth);
408
+ let truncWordWidth = this._context.measureText(word.substring(0, cutoffIndex)).width +
409
+ suffixWidth;
410
+ /* In case guess was overestimated, shrink it letter by letter. */
411
+ if (truncWordWidth > wordWrapWidth) {
412
+ while (cutoffIndex > 0) {
413
+ truncWordWidth =
414
+ this._context.measureText(word.substring(0, cutoffIndex)).width +
415
+ suffixWidth;
416
+ if (truncWordWidth > wordWrapWidth) {
417
+ cutoffIndex -= 1;
418
+ }
419
+ else {
420
+ break;
421
+ }
422
+ }
423
+ /* In case guess was underestimated, extend it letter by letter. */
424
+ }
425
+ else {
426
+ while (cutoffIndex < wordLen) {
427
+ truncWordWidth =
428
+ this._context.measureText(word.substring(0, cutoffIndex)).width +
429
+ suffixWidth;
430
+ if (truncWordWidth < wordWrapWidth) {
431
+ cutoffIndex += 1;
432
+ }
433
+ else {
434
+ // Finally, when bound is crossed, retract last letter.
435
+ cutoffIndex -= 1;
436
+ break;
437
+ }
438
+ }
439
+ }
440
+ /* If wrapWidth is too short to even contain suffix alone, return empty string */
441
+ return (word.substring(0, cutoffIndex) +
442
+ (wordWrapWidth >= suffixWidth ? suffix : ''));
443
+ }
444
+ /**
445
+ * Applies newlines to a string to have it optimally fit into the horizontal
446
+ * bounds set by the Text object's wordWrapWidth property.
447
+ */
448
+ wrapText(text, wordWrapWidth, letterSpacing, indent = 0) {
449
+ const spaceRegex = / |\u200B/g; // ZWSP and spaces
450
+ const lines = text.split(/\r?\n/g);
451
+ let allLines = [];
452
+ const realNewlines = [];
453
+ for (let i = 0; i < lines.length; i++) {
454
+ const resultLines = [];
455
+ let result = '';
456
+ let spaceLeft = wordWrapWidth - indent;
457
+ // Split the line into words, considering ZWSP
458
+ const words = lines[i].split(spaceRegex);
459
+ const spaces = lines[i].match(spaceRegex) || [];
460
+ for (let j = 0; j < words.length; j++) {
461
+ const space = spaces[j - 1] || '';
462
+ const word = words[j];
463
+ const wordWidth = this.measureText(word, letterSpacing);
464
+ const wordWidthWithSpace = isZeroWidthSpace(space)
465
+ ? wordWidth
466
+ : wordWidth + this.measureText(space, letterSpacing);
467
+ if (j === 0 || wordWidthWithSpace > spaceLeft) {
468
+ if (j > 0) {
469
+ resultLines.push(result);
470
+ result = '';
471
+ }
472
+ result += word;
473
+ spaceLeft = wordWrapWidth - wordWidth - (j === 0 ? indent : 0);
474
+ }
475
+ else {
476
+ spaceLeft -= wordWidthWithSpace;
477
+ result += space + word;
478
+ }
479
+ }
480
+ resultLines.push(result);
481
+ result = '';
482
+ allLines = allLines.concat(resultLines);
483
+ if (i < lines.length - 1) {
484
+ realNewlines.push(allLines.length);
485
+ }
486
+ }
487
+ return { l: allLines, n: realNewlines };
488
+ }
489
+ measureText(word, space = 0) {
490
+ if (!space) {
491
+ return this._context.measureText(word).width;
492
+ }
493
+ // Split word into characters, but skip ZWSP in the width calculation
494
+ return word.split('').reduce((acc, char) => {
495
+ // Check if the character is a zero-width space and skip it
496
+ if (isZeroWidthSpace(char)) {
497
+ return acc;
498
+ }
499
+ return acc + this._context.measureText(char).width + space;
500
+ }, 0);
501
+ }
502
+ mergeDefaults(settings) {
503
+ return {
504
+ text: '',
505
+ w: 0,
506
+ h: 0,
507
+ fontStyle: 'normal',
508
+ fontSize: 40,
509
+ fontFamily: null,
510
+ trFontFace: null,
511
+ wordWrap: true,
512
+ wordWrapWidth: 0,
513
+ wordBreak: false,
514
+ textOverflow: '',
515
+ lineHeight: null,
516
+ textBaseline: 'alphabetic',
517
+ textAlign: 'left',
518
+ verticalAlign: 'top',
519
+ offsetY: null,
520
+ maxLines: 0,
521
+ maxHeight: null,
522
+ overflowSuffix: '...',
523
+ textColor: [1.0, 1.0, 1.0, 1.0],
524
+ paddingLeft: 0,
525
+ paddingRight: 0,
526
+ shadow: false,
527
+ shadowColor: [0.0, 0.0, 0.0, 1.0],
528
+ shadowOffsetX: 0,
529
+ shadowOffsetY: 0,
530
+ shadowBlur: 5,
531
+ highlight: false,
532
+ highlightHeight: 0,
533
+ highlightColor: [0.0, 0.0, 0.0, 1.0],
534
+ highlightOffset: 0,
535
+ highlightPaddingLeft: 0,
536
+ highlightPaddingRight: 0,
537
+ letterSpacing: 0,
538
+ textIndent: 0,
539
+ cutSx: 0,
540
+ cutEx: 0,
541
+ cutSy: 0,
542
+ cutEy: 0,
543
+ advancedRenderer: false,
544
+ fontBaselineRatio: 0,
545
+ precision: 1,
546
+ textRenderIssueMargin: 0,
547
+ ...settings,
548
+ };
549
+ }
550
+ }
551
+ //# sourceMappingURL=LightningTextTextureRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightningTextTextureRenderer.js","sourceRoot":"","sources":["../../../../../src/core/text-rendering/renderers/LightningTextTextureRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { type BoundWithValid, type RectWithValid } from '../../../lib/utils.js';
2
+ import { TextRenderer, type TrProps, type TextRendererState, type TrFontProps, type TrPropSetters } from '../TextRenderer.js';
3
+ import { SdfTrFontFace } from '../../font-face-types/SdfTrFontFace/SdfTrFontFace.js';
4
+ import { type SdfRenderWindow } from './internal/setRenderWindow.js';
5
+ import type { TrFontFace } from '../../font-face-types/TrFontFace.js';
6
+ import type { Stage } from '../../../Stage.js';
7
+ import { BufferCollection } from '../../../renderers/webgl/internal/BufferCollection.js';
8
+ import type { Matrix3d } from '../../../lib/Matrix3d.js';
9
+ import type { Dimensions } from '../../../../common/CommonTypes.js';
10
+ declare module '../TextRenderer.js' {
11
+ interface TextRendererMap {
12
+ sdf: SdfTextRenderer;
13
+ }
14
+ interface TextRendererDebugProps {
15
+ sdfShaderDebug: boolean;
16
+ }
17
+ }
18
+ export interface LineCacheItem {
19
+ codepointIndex: number;
20
+ maxY: number;
21
+ maxX: number;
22
+ }
23
+ export interface SdfTextRendererState extends TextRendererState {
24
+ /**
25
+ * Cache for layout resume points indexed by the `curY` for each line
26
+ * in the render sequence.
27
+ *
28
+ * Allows faster rendering by skipping parts of the layout loop that are
29
+ * outside of the renderWindow.
30
+ */
31
+ lineCache: LineCacheItem[];
32
+ renderWindow: SdfRenderWindow;
33
+ elementBounds: BoundWithValid;
34
+ clippingRect: RectWithValid;
35
+ bufferNumFloats: number;
36
+ bufferNumQuads: number;
37
+ vertexBuffer: Float32Array | undefined;
38
+ webGlBuffers: BufferCollection | null;
39
+ bufferUploaded: boolean;
40
+ distanceRange: number;
41
+ trFontFace: SdfTrFontFace | undefined;
42
+ /**
43
+ * Resolved line height in logical screen pixel units
44
+ */
45
+ resLineHeight: number | undefined;
46
+ }
47
+ /**
48
+ * Singleton class for rendering text using signed distance fields.
49
+ *
50
+ * @remarks
51
+ * SdfTextRenderer supports both single-channel and multi-channel signed distance fields.
52
+ */
53
+ export declare class SdfTextRenderer extends TextRenderer<SdfTextRendererState> {
54
+ /**
55
+ * Map of font family names to a set of font faces.
56
+ */
57
+ private ssdfFontFamilies;
58
+ private msdfFontFamilies;
59
+ private fontFamilyArray;
60
+ private sdfShader;
61
+ private rendererBounds;
62
+ type: 'canvas' | 'sdf';
63
+ constructor(stage: Stage);
64
+ getPropertySetters(): Partial<TrPropSetters<SdfTextRendererState>>;
65
+ canRenderFont(props: TrFontProps): boolean;
66
+ isFontFaceSupported(fontFace: TrFontFace): boolean;
67
+ addFontFace(fontFace: TrFontFace): void;
68
+ createState(props: TrProps): SdfTextRendererState;
69
+ updateState(state: SdfTextRendererState): void;
70
+ renderQuads(state: SdfTextRendererState, transform: Matrix3d, clippingRect: Readonly<RectWithValid>, alpha: number, parentHasRenderTexture: boolean, framebufferDimensions: Dimensions): void;
71
+ setIsRenderable(state: SdfTextRendererState, renderable: boolean): void;
72
+ destroyState(state: SdfTextRendererState): void;
73
+ resolveFontFace(props: TrFontProps): SdfTrFontFace | undefined;
74
+ /**
75
+ * Release the loaded SDF font face
76
+ *
77
+ * @param state
78
+ */
79
+ protected releaseFontFace(state: SdfTextRendererState): void;
80
+ /**
81
+ * Invalidate the layout cache stored in the state. This will cause the text
82
+ * to be re-layed out on the next update.
83
+ *
84
+ * @remarks
85
+ * This also invalidates the visible window cache.
86
+ *
87
+ * @param state
88
+ */
89
+ protected invalidateLayoutCache(state: SdfTextRendererState): void;
90
+ protected setElementBoundsX(state: SdfTextRendererState): void;
91
+ protected setElementBoundsY(state: SdfTextRendererState): void;
92
+ }