@lightningjs/renderer 0.7.4 → 0.7.6

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 (228) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +229 -221
  4. package/dist/src/common/CommonTypes.d.ts +6 -0
  5. package/dist/src/core/CoreNode.d.ts +25 -4
  6. package/dist/src/core/CoreNode.js +158 -25
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreTextNode.d.ts +1 -1
  9. package/dist/src/core/CoreTextNode.js +18 -10
  10. package/dist/src/core/CoreTextNode.js.map +1 -1
  11. package/dist/src/core/CoreTextureManager.d.ts +3 -1
  12. package/dist/src/core/CoreTextureManager.js +9 -2
  13. package/dist/src/core/CoreTextureManager.js.map +1 -1
  14. package/dist/src/core/Stage.d.ts +2 -0
  15. package/dist/src/core/Stage.js +9 -1
  16. package/dist/src/core/Stage.js.map +1 -1
  17. package/dist/src/core/lib/ImageWorker.d.ts +0 -1
  18. package/dist/src/core/lib/ImageWorker.js +55 -40
  19. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  20. package/dist/src/core/lib/RenderCoords.d.ts +13 -0
  21. package/dist/src/core/lib/RenderCoords.js +63 -0
  22. package/dist/src/core/lib/RenderCoords.js.map +1 -0
  23. package/dist/src/core/lib/WebGlContext.d.ts +414 -0
  24. package/dist/src/core/lib/WebGlContext.js +640 -0
  25. package/dist/src/core/lib/WebGlContext.js.map +1 -0
  26. package/dist/src/core/lib/utils.d.ts +1 -0
  27. package/dist/src/core/lib/utils.js +6 -0
  28. package/dist/src/core/lib/utils.js.map +1 -1
  29. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +4 -1
  30. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  31. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +9 -0
  32. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +14 -0
  33. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  34. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +47 -47
  35. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +61 -61
  36. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +93 -93
  37. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +63 -63
  38. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +49 -49
  39. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +15 -15
  40. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +5 -5
  41. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +15 -15
  42. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +15 -15
  43. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +15 -15
  44. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +42 -42
  45. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +44 -44
  46. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +3 -3
  47. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +31 -31
  48. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +13 -13
  49. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +37 -37
  50. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +19 -19
  51. package/dist/src/core/scene/Scene.d.ts +59 -0
  52. package/dist/src/core/scene/Scene.js +106 -0
  53. package/dist/src/core/scene/Scene.js.map +1 -0
  54. package/dist/src/core/text-rendering/TrFontManager.js +76 -27
  55. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -1
  56. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +8 -2
  57. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  58. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +1 -0
  59. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +13 -3
  60. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  61. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
  62. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
  63. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
  64. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
  65. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
  66. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
  67. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
  68. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
  69. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
  70. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
  71. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
  72. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
  73. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
  74. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
  75. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
  76. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
  77. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
  78. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
  79. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +20 -0
  80. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +55 -0
  81. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +1 -0
  82. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
  83. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
  84. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
  85. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +12 -0
  86. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  87. package/dist/src/core/textures/ImageTexture.js +16 -2
  88. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  89. package/dist/src/core/textures/Texture.d.ts +1 -1
  90. package/dist/src/core/textures/Texture.js.map +1 -1
  91. package/dist/src/core/utils.d.ts +1 -1
  92. package/dist/src/main-api/INode.d.ts +27 -0
  93. package/dist/src/main-api/Inspector.js +20 -15
  94. package/dist/src/main-api/Inspector.js.map +1 -1
  95. package/dist/src/main-api/RendererMain.d.ts +6 -0
  96. package/dist/src/main-api/RendererMain.js +4 -0
  97. package/dist/src/main-api/RendererMain.js.map +1 -1
  98. package/dist/src/render-drivers/main/MainCoreDriver.js +1 -0
  99. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  100. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +8 -1
  101. package/dist/src/render-drivers/main/MainOnlyNode.js +32 -0
  102. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  103. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +1 -0
  104. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  105. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +4 -1
  106. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +8 -0
  107. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -1
  108. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +1 -0
  109. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
  110. package/dist/src/render-drivers/threadx/worker/renderer.js +1 -0
  111. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  112. package/dist/src/render-drivers/utils.d.ts +2 -0
  113. package/dist/src/render-drivers/utils.js +28 -0
  114. package/dist/src/render-drivers/utils.js.map +1 -1
  115. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  116. package/exports/core-api.ts +102 -102
  117. package/exports/main-api.ts +60 -60
  118. package/exports/utils.ts +41 -41
  119. package/package.json +1 -1
  120. package/scripts/please-use-pnpm.js +13 -13
  121. package/src/common/CommonTypes.ts +125 -113
  122. package/src/common/EventEmitter.ts +77 -77
  123. package/src/common/IAnimationController.ts +29 -29
  124. package/src/core/CoreExtension.ts +32 -32
  125. package/src/core/CoreNode.ts +1114 -926
  126. package/src/core/CoreShaderManager.ts +243 -243
  127. package/src/core/CoreTextNode.ts +399 -391
  128. package/src/core/CoreTextureManager.ts +337 -326
  129. package/src/core/Stage.ts +365 -354
  130. package/src/core/animations/AnimationManager.ts +38 -38
  131. package/src/core/animations/CoreAnimation.ts +181 -181
  132. package/src/core/animations/CoreAnimationController.ts +148 -148
  133. package/src/core/lib/ContextSpy.ts +41 -41
  134. package/src/core/lib/ImageWorker.ts +149 -135
  135. package/src/core/lib/Matrix3d.ts +290 -290
  136. package/src/core/lib/RenderCoords.ts +86 -0
  137. package/src/core/lib/WebGlContextWrapper.ts +992 -992
  138. package/src/core/lib/textureCompression.ts +152 -152
  139. package/src/core/lib/utils.ts +250 -241
  140. package/src/core/platform.ts +46 -46
  141. package/src/core/renderers/CoreContextTexture.ts +30 -30
  142. package/src/core/renderers/CoreRenderOp.ts +22 -22
  143. package/src/core/renderers/CoreRenderer.ts +63 -63
  144. package/src/core/renderers/CoreShader.ts +41 -41
  145. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +37 -37
  146. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +233 -230
  147. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +107 -107
  148. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +520 -520
  149. package/src/core/renderers/webgl/WebGlCoreShader.ts +337 -337
  150. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  151. package/src/core/renderers/webgl/internal/RendererUtils.ts +148 -131
  152. package/src/core/renderers/webgl/internal/ShaderUtils.ts +136 -136
  153. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  154. package/src/core/renderers/webgl/shaders/DefaultShader.ts +95 -95
  155. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -132
  156. package/src/core/renderers/webgl/shaders/DynamicShader.ts +474 -474
  157. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +161 -161
  158. package/src/core/renderers/webgl/shaders/SdfShader.ts +174 -174
  159. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -101
  160. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +86 -86
  161. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -101
  162. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -101
  163. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -101
  164. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +33 -33
  165. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +135 -135
  166. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +145 -145
  167. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +67 -67
  168. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +176 -176
  169. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +159 -159
  170. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +186 -186
  171. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +121 -121
  172. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +114 -114
  173. package/src/core/text-rendering/TextTextureRendererUtils.ts +189 -189
  174. package/src/core/text-rendering/TrFontManager.ts +170 -96
  175. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +141 -141
  176. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  177. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  178. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +169 -169
  179. package/src/core/text-rendering/font-face-types/TrFontFace.ts +105 -105
  180. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +77 -77
  181. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +757 -751
  182. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +741 -741
  183. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +784 -775
  184. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  185. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  186. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  187. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  188. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +84 -84
  189. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  190. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  191. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +393 -393
  192. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  193. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +51 -51
  194. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  195. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  196. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  197. package/src/core/text-rendering/renderers/TextRenderer.ts +516 -504
  198. package/src/core/textures/ColorTexture.ts +86 -86
  199. package/src/core/textures/ImageTexture.ts +154 -140
  200. package/src/core/textures/NoiseTexture.ts +96 -96
  201. package/src/core/textures/SubTexture.ts +143 -143
  202. package/src/core/textures/Texture.ts +224 -218
  203. package/src/core/utils.ts +224 -224
  204. package/src/env.d.ts +7 -7
  205. package/src/main-api/ICoreDriver.ts +66 -66
  206. package/src/main-api/INode.ts +499 -470
  207. package/src/main-api/Inspector.ts +439 -432
  208. package/src/main-api/RendererMain.ts +659 -649
  209. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +45 -45
  210. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +154 -154
  211. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +54 -54
  212. package/src/render-drivers/main/MainCoreDriver.ts +149 -148
  213. package/src/render-drivers/main/MainOnlyNode.ts +494 -453
  214. package/src/render-drivers/main/MainOnlyTextNode.ts +261 -261
  215. package/src/render-drivers/threadx/NodeStruct.ts +300 -300
  216. package/src/render-drivers/threadx/SharedNode.ts +97 -97
  217. package/src/render-drivers/threadx/TextNodeStruct.ts +211 -211
  218. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +286 -285
  219. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +99 -99
  220. package/src/render-drivers/threadx/ThreadXMainNode.ts +192 -178
  221. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +85 -85
  222. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +111 -110
  223. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +238 -238
  224. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +149 -149
  225. package/src/render-drivers/threadx/worker/renderer.ts +152 -151
  226. package/src/render-drivers/utils.ts +97 -57
  227. package/src/utils.ts +207 -207
  228. package/COPYING +0 -1
@@ -87,24 +87,24 @@ export class LinearGradientEffect extends ShaderEffect {
87
87
  },
88
88
  };
89
89
  static methods = {
90
- fromLinear: `
91
- vec4 function(vec4 linearRGB) {
92
- vec4 higher = vec4(1.055)*pow(linearRGB, vec4(1.0/2.4)) - vec4(0.055);
93
- vec4 lower = linearRGB * vec4(12.92);
94
- return mix(higher, lower, 1.0);
95
- }
90
+ fromLinear: `
91
+ vec4 function(vec4 linearRGB) {
92
+ vec4 higher = vec4(1.055)*pow(linearRGB, vec4(1.0/2.4)) - vec4(0.055);
93
+ vec4 lower = linearRGB * vec4(12.92);
94
+ return mix(higher, lower, 1.0);
95
+ }
96
96
  `,
97
- toLinear: `
98
- vec4 function(vec4 sRGB) {
99
- vec4 higher = pow((sRGB + vec4(0.055))/vec4(1.055), vec4(2.4));
100
- vec4 lower = sRGB/vec4(12.92);
101
- return mix(higher, lower, 1.0);
102
- }
97
+ toLinear: `
98
+ vec4 function(vec4 sRGB) {
99
+ vec4 higher = pow((sRGB + vec4(0.055))/vec4(1.055), vec4(2.4));
100
+ vec4 lower = sRGB/vec4(12.92);
101
+ return mix(higher, lower, 1.0);
102
+ }
103
103
  `,
104
- calcPoint: `
105
- vec2 function(float d, float angle) {
106
- return d * vec2(cos(angle), sin(angle)) + (u_dimensions * 0.5);
107
- }
104
+ calcPoint: `
105
+ vec2 function(float d, float angle) {
106
+ return d * vec2(cos(angle), sin(angle)) + (u_dimensions * 0.5);
107
+ }
108
108
  `,
109
109
  };
110
110
  static ColorLoop = (amount) => {
@@ -116,21 +116,21 @@ export class LinearGradientEffect extends ShaderEffect {
116
116
  };
117
117
  static onColorize = (props) => {
118
118
  const colors = props.colors.length || 1;
119
- return `
120
- float a = angle - (PI / 180.0 * 90.0);
121
- float lineDist = abs(u_dimensions.x * cos(a)) + abs(u_dimensions.y * sin(a));
122
- vec2 f = $calcPoint(lineDist * 0.5, a);
123
- vec2 t = $calcPoint(lineDist * 0.5, a + PI);
124
- vec2 gradVec = t - f;
125
- float dist = dot(v_textureCoordinate.xy * u_dimensions - f, gradVec) / dot(gradVec, gradVec);
126
-
127
- float stopCalc = (dist - stops[0]) / (stops[1] - stops[0]);
128
- vec4 colorOut = $fromLinear(mix($toLinear(colors[0]), $toLinear(colors[1]), stopCalc));
129
- for(int i = 1; i < ${colors}-1; i++) {
130
- stopCalc = (dist - stops[i]) / (stops[i + 1] - stops[i]);
131
- colorOut = mix(colorOut, colors[i + 1], clamp(stopCalc, 0.0, 1.0));
132
- }
133
- return mix(maskColor, colorOut, clamp(colorOut.a, 0.0, 1.0));
119
+ return `
120
+ float a = angle - (PI / 180.0 * 90.0);
121
+ float lineDist = abs(u_dimensions.x * cos(a)) + abs(u_dimensions.y * sin(a));
122
+ vec2 f = $calcPoint(lineDist * 0.5, a);
123
+ vec2 t = $calcPoint(lineDist * 0.5, a + PI);
124
+ vec2 gradVec = t - f;
125
+ float dist = dot(v_textureCoordinate.xy * u_dimensions - f, gradVec) / dot(gradVec, gradVec);
126
+
127
+ float stopCalc = (dist - stops[0]) / (stops[1] - stops[0]);
128
+ vec4 colorOut = $fromLinear(mix($toLinear(colors[0]), $toLinear(colors[1]), stopCalc));
129
+ for(int i = 1; i < ${colors}-1; i++) {
130
+ stopCalc = (dist - stops[i]) / (stops[i + 1] - stops[i]);
131
+ colorOut = mix(colorOut, colors[i + 1], clamp(stopCalc, 0.0, 1.0));
132
+ }
133
+ return mix(maskColor, colorOut, clamp(colorOut.a, 0.0, 1.0));
134
134
  `;
135
135
  };
136
136
  }
@@ -97,19 +97,19 @@ export class RadialGradientEffect extends ShaderEffect {
97
97
  };
98
98
  static onColorize = (props) => {
99
99
  const colors = props.colors.length || 1;
100
- return `
101
- vec2 point = v_textureCoordinate.xy * u_dimensions;
102
- vec2 projection = vec2(pivot.x * u_dimensions.x, pivot.y * u_dimensions.y);
103
-
104
- float dist = length((point - projection) / vec2(width, height));
105
-
106
- float stopCalc = (dist - stops[0]) / (stops[1] - stops[0]);
107
- vec4 colorOut = mix(colors[0], colors[1], stopCalc);
108
- for(int i = 1; i < ${colors}-1; i++) {
109
- stopCalc = (dist - stops[i]) / (stops[i + 1] - stops[i]);
110
- colorOut = mix(colorOut, colors[i + 1], clamp(stopCalc, 0.0, 1.0));
111
- }
112
- return mix(maskColor, colorOut, clamp(colorOut.a, 0.0, 1.0));
100
+ return `
101
+ vec2 point = v_textureCoordinate.xy * u_dimensions;
102
+ vec2 projection = vec2(pivot.x * u_dimensions.x, pivot.y * u_dimensions.y);
103
+
104
+ float dist = length((point - projection) / vec2(width, height));
105
+
106
+ float stopCalc = (dist - stops[0]) / (stops[1] - stops[0]);
107
+ vec4 colorOut = mix(colors[0], colors[1], stopCalc);
108
+ for(int i = 1; i < ${colors}-1; i++) {
109
+ stopCalc = (dist - stops[i]) / (stops[i + 1] - stops[i]);
110
+ colorOut = mix(colorOut, colors[i + 1], clamp(stopCalc, 0.0, 1.0));
111
+ }
112
+ return mix(maskColor, colorOut, clamp(colorOut.a, 0.0, 1.0));
113
113
  `;
114
114
  };
115
115
  }
@@ -80,47 +80,47 @@ export class RadialProgressEffect extends ShaderEffect {
80
80
  },
81
81
  };
82
82
  static methods = {
83
- rotateUV: `
84
- vec2 function(vec2 uv, float d) {
85
- float s = sin(d);
86
- float c = cos(d);
87
- mat2 rotMatrix = mat2(c, -s, s, c);
88
- return uv * rotMatrix;
89
- }
83
+ rotateUV: `
84
+ vec2 function(vec2 uv, float d) {
85
+ float s = sin(d);
86
+ float c = cos(d);
87
+ mat2 rotMatrix = mat2(c, -s, s, c);
88
+ return uv * rotMatrix;
89
+ }
90
90
  `,
91
- drawDot: `
92
- float function(vec2 uv, vec2 p, float r) {
93
- uv += p;
94
- float circle = length(uv) - r;
95
- return clamp(-circle, 0.0, 1.0);
96
- }
91
+ drawDot: `
92
+ float function(vec2 uv, vec2 p, float r) {
93
+ uv += p;
94
+ float circle = length(uv) - r;
95
+ return clamp(-circle, 0.0, 1.0);
96
+ }
97
97
  `,
98
98
  };
99
- static onEffectMask = `
100
- float outerRadius = radius * u_dimensions.y * 0.5;
101
-
102
- float endAngle = range * progress - 0.0005;
103
-
104
- vec2 uv = v_textureCoordinate.xy * u_dimensions.xy - u_dimensions * 0.5;
105
-
106
- uv = $rotateUV(uv, -(offset));
107
- float linewidth = width * u_pixelRatio;
108
- float circle = length(uv) - (outerRadius - linewidth) ;
109
- circle = abs(circle) - linewidth;
110
- circle = clamp(-circle, 0.0, 1.0);
111
-
112
- float angle = (atan(uv.x, -uv.y) / 3.14159265359 * 0.5);
113
- float p = endAngle / (PI * 2.);
114
-
115
- circle *= step(fract(angle), fract(p));
116
-
117
- circle = rounded < 1. ? circle : max(circle, $drawDot(uv, vec2(0, outerRadius - linewidth), linewidth));
118
- circle = rounded < 1. ? circle : max(circle, $drawDot($rotateUV(uv, -(endAngle)), vec2(0, outerRadius - linewidth), linewidth));
119
-
120
- return mix(shaderColor, maskColor, circle);
99
+ static onEffectMask = `
100
+ float outerRadius = radius * u_dimensions.y * 0.5;
101
+
102
+ float endAngle = range * progress - 0.0005;
103
+
104
+ vec2 uv = v_textureCoordinate.xy * u_dimensions.xy - u_dimensions * 0.5;
105
+
106
+ uv = $rotateUV(uv, -(offset));
107
+ float linewidth = width * u_pixelRatio;
108
+ float circle = length(uv) - (outerRadius - linewidth) ;
109
+ circle = abs(circle) - linewidth;
110
+ circle = clamp(-circle, 0.0, 1.0);
111
+
112
+ float angle = (atan(uv.x, -uv.y) / 3.14159265359 * 0.5);
113
+ float p = endAngle / (PI * 2.);
114
+
115
+ circle *= step(fract(angle), fract(p));
116
+
117
+ circle = rounded < 1. ? circle : max(circle, $drawDot(uv, vec2(0, outerRadius - linewidth), linewidth));
118
+ circle = rounded < 1. ? circle : max(circle, $drawDot($rotateUV(uv, -(endAngle)), vec2(0, outerRadius - linewidth), linewidth));
119
+
120
+ return mix(shaderColor, maskColor, circle);
121
121
  `;
122
- static onColorize = `
123
- return color;
122
+ static onColorize = `
123
+ return color;
124
124
  `;
125
125
  }
126
126
  //# sourceMappingURL=RadialProgressEffect.js.map
@@ -52,17 +52,17 @@ export class RadiusEffect extends ShaderEffect {
52
52
  },
53
53
  };
54
54
  static methods = {
55
- fillMask: `
56
- float function(float dist) {
57
- return clamp(-dist, 0.0, 1.0);
58
- }
55
+ fillMask: `
56
+ float function(float dist) {
57
+ return clamp(-dist, 0.0, 1.0);
58
+ }
59
59
  `,
60
- boxDist: `
61
- float function(vec2 p, vec2 size, float radius) {
62
- size -= vec2(radius);
63
- vec2 d = abs(p) - size;
64
- return min(max(d.x, d.y), 0.0) + length(max(d, 0.0)) - radius;
65
- }
60
+ boxDist: `
61
+ float function(vec2 p, vec2 size, float radius) {
62
+ size -= vec2(radius);
63
+ vec2 d = abs(p) - size;
64
+ return min(max(d.x, d.y), 0.0) + length(max(d, 0.0)) - radius;
65
+ }
66
66
  `,
67
67
  };
68
68
  static resolveDefaults(props) {
@@ -70,16 +70,16 @@ export class RadiusEffect extends ShaderEffect {
70
70
  radius: props.radius ?? 10,
71
71
  };
72
72
  }
73
- static onShaderMask = `
74
- vec2 halfDimensions = u_dimensions * 0.5;
75
- float r = radius[0] * step(v_textureCoordinate.x, 0.5) * step(v_textureCoordinate.y, 0.5);
76
- r = r + radius[1] * step(0.5, v_textureCoordinate.x) * step(v_textureCoordinate.y, 0.5);
77
- r = r + radius[2] * step(0.5, v_textureCoordinate.x) * step(0.5, v_textureCoordinate.y);
78
- r = r + radius[3] * step(v_textureCoordinate.x, 0.5) * step(0.5, v_textureCoordinate.y);
79
- return $boxDist(v_textureCoordinate.xy * u_dimensions - halfDimensions, halfDimensions, r);
73
+ static onShaderMask = `
74
+ vec2 halfDimensions = u_dimensions * 0.5;
75
+ float r = radius[0] * step(v_textureCoordinate.x, 0.5) * step(v_textureCoordinate.y, 0.5);
76
+ r = r + radius[1] * step(0.5, v_textureCoordinate.x) * step(v_textureCoordinate.y, 0.5);
77
+ r = r + radius[2] * step(0.5, v_textureCoordinate.x) * step(0.5, v_textureCoordinate.y);
78
+ r = r + radius[3] * step(v_textureCoordinate.x, 0.5) * step(0.5, v_textureCoordinate.y);
79
+ return $boxDist(v_textureCoordinate.xy * u_dimensions - halfDimensions, halfDimensions, r);
80
80
  `;
81
- static onEffectMask = `
82
- return mix(vec4(0.0), maskColor, $fillMask(shaderMask));
81
+ static onEffectMask = `
82
+ return mix(vec4(0.0), maskColor, $fillMask(shaderMask));
83
83
  `;
84
84
  }
85
85
  //# sourceMappingURL=RadiusEffect.js.map
@@ -0,0 +1,59 @@
1
+ import type { CoreNode } from '../CoreNode.js';
2
+ export type NodeTypes = Node;
3
+ export declare class Scene {
4
+ /**
5
+ * Root node of the scene
6
+ *
7
+ * @type {Node}
8
+ * @memberof Scene
9
+ */
10
+ root: CoreNode;
11
+ constructor(root: CoreNode);
12
+ /**
13
+ * Get all nodes of a specific type
14
+ * @param type
15
+ * @returns
16
+ */
17
+ getNodeByType(type: string): Node[];
18
+ /**
19
+ * Find a node by id
20
+ * @param id
21
+ * @returns
22
+ */
23
+ getNodeById(id: string): Node | null;
24
+ /**
25
+ * Create a new node
26
+ * @param parent
27
+ * @returns
28
+ */
29
+ /**
30
+ * create a new RectangleNode
31
+ * @param w
32
+ * @param h
33
+ * @param parent
34
+ * @returns
35
+ */
36
+ /**
37
+ * Create a new CircleNode
38
+ * @param r
39
+ * @param parent
40
+ * @returns
41
+ */
42
+ /**
43
+ * Create a new TextNode
44
+ * @param text
45
+ * @param parent
46
+ * @returns
47
+ */
48
+ /**
49
+ * Setup and attaching Node
50
+ * @param node
51
+ * @param parent
52
+ * @returns
53
+ */
54
+ /**
55
+ * Update the scene
56
+ * @param delta
57
+ */
58
+ update(delta: number): void;
59
+ }
@@ -0,0 +1,106 @@
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
+ export class Scene {
20
+ /**
21
+ * Root node of the scene
22
+ *
23
+ * @type {Node}
24
+ * @memberof Scene
25
+ */
26
+ root;
27
+ constructor(root) {
28
+ this.root = root;
29
+ }
30
+ /**
31
+ * Get all nodes of a specific type
32
+ * @param type
33
+ * @returns
34
+ */
35
+ getNodeByType(type) {
36
+ return [];
37
+ }
38
+ /**
39
+ * Find a node by id
40
+ * @param id
41
+ * @returns
42
+ */
43
+ getNodeById(id) {
44
+ return null;
45
+ }
46
+ /**
47
+ * Create a new node
48
+ * @param parent
49
+ * @returns
50
+ */
51
+ // public createNode(settings: Partial<INodeWritableProps> = {}): NodeTypes {
52
+ // return createNode(settings);
53
+ // }
54
+ /**
55
+ * create a new RectangleNode
56
+ * @param w
57
+ * @param h
58
+ * @param parent
59
+ * @returns
60
+ */
61
+ // public rectangle(w: number, h: number, parent: NodeTypes | null = null) {
62
+ // // TODO: Fix this
63
+ // // return this.create(new RectangleNode(w, h), parent);
64
+ // }
65
+ /**
66
+ * Create a new CircleNode
67
+ * @param r
68
+ * @param parent
69
+ * @returns
70
+ */
71
+ // public circle(r: number, parent: NodeTypes | null = null) {
72
+ // // TODO: Fix this
73
+ // // return this.create(new CircleNode(r), parent);
74
+ // }
75
+ /**
76
+ * Create a new TextNode
77
+ * @param text
78
+ * @param parent
79
+ * @returns
80
+ */
81
+ // public text(text = '', parent: NodeTypes | null = null) {
82
+ // // TODO: Fix this
83
+ // // return this.create(new TextNode(text), parent);
84
+ // }
85
+ /**
86
+ * Setup and attaching Node
87
+ * @param node
88
+ * @param parent
89
+ * @returns
90
+ */
91
+ // private create(node: NodeTypes, parent: NodeTypes | null = null): NodeTypes {
92
+ // if (!parent) {
93
+ // parent = this.root;
94
+ // }
95
+ // node.parent = parent;
96
+ // return node;
97
+ // }
98
+ /**
99
+ * Update the scene
100
+ * @param delta
101
+ */
102
+ update(delta) {
103
+ this.root.update(delta);
104
+ }
105
+ }
106
+ //# sourceMappingURL=Scene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scene.js","sourceRoot":"","sources":["../../../../src/core/scene/Scene.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,MAAM,OAAO,KAAK;IAChB;;;;;OAKG;IACI,IAAI,CAAW;IAEtB,YAAY,IAAc;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,IAAY;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,EAAU;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,6EAA6E;IAC7E,iCAAiC;IACjC,IAAI;IAEJ;;;;;;OAMG;IACH,4EAA4E;IAC5E,sBAAsB;IACtB,4DAA4D;IAC5D,IAAI;IAEJ;;;;;OAKG;IACH,8DAA8D;IAC9D,sBAAsB;IACtB,sDAAsD;IACtD,IAAI;IAEJ;;;;;OAKG;IACH,4DAA4D;IAC5D,sBAAsB;IACtB,uDAAuD;IACvD,IAAI;IAEJ;;;;;OAKG;IACH,gFAAgF;IAChF,mBAAmB;IACnB,0BAA0B;IAC1B,MAAM;IAEN,0BAA0B;IAC1B,iBAAiB;IACjB,IAAI;IAEJ;;;OAGG;IACI,MAAM,CAAC,KAAa;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -16,8 +16,80 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
- import { SdfTrFontFace } from './font-face-types/SdfTrFontFace/SdfTrFontFace.js';
20
- import { WebTrFontFace } from './font-face-types/WebTrFontFace.js';
19
+ import memize from 'memize';
20
+ const weightConversions = {
21
+ normal: 400,
22
+ bold: 700,
23
+ bolder: 900,
24
+ lighter: 100,
25
+ };
26
+ const fontWeightToNumber = (weight) => {
27
+ if (typeof weight === 'number') {
28
+ return weight;
29
+ }
30
+ return weightConversions[weight] || 400;
31
+ };
32
+ function rawResolveFontToUse(familyMapsByPriority, family, weightIn, style, stretch) {
33
+ let weight = fontWeightToNumber(weightIn);
34
+ for (const fontFamiles of familyMapsByPriority) {
35
+ const fontFaces = fontFamiles[family];
36
+ if (!fontFaces) {
37
+ continue;
38
+ }
39
+ if (fontFaces.size === 1) {
40
+ // No Exact match found, find nearest weight match
41
+ console.warn(`TrFontManager: Only one font face found for family: '${family}' - will be used for all weights and styles`);
42
+ return fontFaces.values().next().value;
43
+ }
44
+ const weightMap = new Map();
45
+ for (const fontFace of fontFaces) {
46
+ const fontFamilyWeight = fontWeightToNumber(fontFace.descriptors.weight);
47
+ if (fontFamilyWeight === weight &&
48
+ fontFace.descriptors.style === style &&
49
+ fontFace.descriptors.stretch === stretch) {
50
+ return fontFace;
51
+ }
52
+ weightMap.set(fontFamilyWeight, fontFace);
53
+ }
54
+ // No Exact match found, find nearest weight match
55
+ const msg = `TrFontManager: No exact match: '${family} Weight: ${weight} Style: ${style} Stretch: ${stretch}'`;
56
+ console.error(msg);
57
+ // Follow the CSS font-weight algorithm to find the nearest weight match
58
+ // https://www.w3.org/TR/2018/REC-css-fonts-3-20180920/#font-matching-algorithm
59
+ if (weight === 400 && weightMap.has(500)) {
60
+ return weightMap.get(500);
61
+ }
62
+ if (weight === 500 && weightMap.has(400)) {
63
+ return weightMap.get(400);
64
+ }
65
+ if (weight < 400) {
66
+ while (weight > 0) {
67
+ if (weightMap.has(weight)) {
68
+ return weightMap.get(weight);
69
+ }
70
+ weight -= 100;
71
+ }
72
+ // reset back for the next loop
73
+ weight = 600;
74
+ }
75
+ while (weight < 1000) {
76
+ if (weightMap.has(weight)) {
77
+ return weightMap.get(weight);
78
+ }
79
+ weight += 100;
80
+ }
81
+ // finally check lower again
82
+ weight = 500;
83
+ while (weight > 0) {
84
+ if (weightMap.has(weight)) {
85
+ return weightMap.get(weight);
86
+ }
87
+ weight -= 100;
88
+ }
89
+ }
90
+ return;
91
+ }
92
+ const resolveFontToUse = memize(rawResolveFontToUse);
21
93
  export class TrFontManager {
22
94
  textRenderers;
23
95
  constructor(textRenderers) {
@@ -45,31 +117,8 @@ export class TrFontManager {
45
117
  * @returns
46
118
  */
47
119
  static resolveFontFace(familyMapsByPriority, props) {
48
- const closeFaces = [];
49
- const exactMatch = familyMapsByPriority.reduce((prev, fontFamiles) => {
50
- if (prev) {
51
- return prev;
52
- }
53
- const fontFaces = fontFamiles[props.fontFamily];
54
- if (!fontFaces) {
55
- return undefined;
56
- }
57
- const fontFacesCopy = new Set(fontFaces);
58
- // Remove any font faces that don't match the style exactly
59
- // TODO: In the future we may enhance this to find the best match
60
- // based on font weight, style, etc.
61
- // See https://www.w3.org/TR/2018/REC-css-fonts-3-20180920/#font-matching-algorithm
62
- for (const fontFace of fontFacesCopy) {
63
- if (fontFace.descriptors.stretch !== props.fontStretch ||
64
- fontFace.descriptors.style !== props.fontStyle ||
65
- fontFace.descriptors.weight !== props.fontWeight) {
66
- fontFacesCopy.delete(fontFace);
67
- }
68
- }
69
- // Return the first font face that matches the style exactly
70
- return fontFacesCopy.values().next().value;
71
- }, undefined);
72
- return exactMatch || closeFaces[0];
120
+ const { fontFamily, fontWeight, fontStyle, fontStretch } = props;
121
+ return resolveFontToUse(familyMapsByPriority, fontFamily, fontWeight, fontStyle, fontStretch);
73
122
  }
74
123
  }
75
124
  //# sourceMappingURL=TrFontManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TrFontManager.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/TrFontManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAUnE,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,aAAuC;QAAvC,kBAAa,GAAb,aAAa,CAA0B;QACzD,2BAA2B;IAC7B,CAAC;IAEM,WAAW,CAAC,IAAgB;QACjC,iEAAiE;QACjE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAA6B,CAAC,CAAC;YAC7D,IAAI,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE;gBACtC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;aACtB;SACF;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACI,MAAM,CAAC,eAAe,CAC3B,oBAAqC,EACrC,KAAkB;QAElB,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAC5C,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;YACpB,IAAI,IAAI,EAAE;gBACR,OAAO,IAAI,CAAC;aACb;YACD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,SAAS,CAAC;aAClB;YACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YAEzC,2DAA2D;YAC3D,iEAAiE;YACjE,oCAAoC;YACpC,mFAAmF;YACnF,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;gBACpC,IACE,QAAQ,CAAC,WAAW,CAAC,OAAO,KAAK,KAAK,CAAC,WAAW;oBAClD,QAAQ,CAAC,WAAW,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS;oBAC9C,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,EAChD;oBACA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;iBAChC;aACF;YAED,4DAA4D;YAC5D,OAAO,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,CAAC,EACD,SAAS,CACV,CAAC;QAEF,OAAO,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;CACF"}
1
+ {"version":3,"file":"TrFontManager.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/TrFontManager.ts"],"names":[],"mappings":"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"}
@@ -124,11 +124,17 @@ export class CanvasTextRenderer extends TextRenderer {
124
124
  },
125
125
  width: (state, value) => {
126
126
  state.props.width = value;
127
- this.invalidateLayoutCache(state);
127
+ // Only invalidate layout cache if we're containing in the horizontal direction
128
+ if (state.props.contain !== 'none') {
129
+ this.invalidateLayoutCache(state);
130
+ }
128
131
  },
129
132
  height: (state, value) => {
130
133
  state.props.height = value;
131
- this.invalidateLayoutCache(state);
134
+ // Only invalidate layout cache if we're containing in the vertical direction
135
+ if (state.props.contain === 'both') {
136
+ this.invalidateLayoutCache(state);
137
+ }
132
138
  },
133
139
  offsetY: (state, value) => {
134
140
  state.props.offsetY = value;