@lightningjs/renderer 3.0.3 → 3.0.5

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 (240) hide show
  1. package/dist/src/common/EventEmitter.d.ts +7 -4
  2. package/dist/src/common/EventEmitter.js +1 -1
  3. package/dist/src/common/EventEmitter.js.map +1 -1
  4. package/dist/src/core/AutosizeManager.d.ts +29 -0
  5. package/dist/src/core/AutosizeManager.js +169 -0
  6. package/dist/src/core/AutosizeManager.js.map +1 -0
  7. package/dist/src/core/CoreNode.d.ts +2 -1
  8. package/dist/src/core/CoreNode.js +6 -3
  9. package/dist/src/core/CoreNode.js.map +1 -1
  10. package/dist/src/core/CoreTextNode.d.ts +18 -5
  11. package/dist/src/core/CoreTextNode.js +141 -59
  12. package/dist/src/core/CoreTextNode.js.map +1 -1
  13. package/dist/src/core/CoreTextNodeCanvas.d.ts +215 -0
  14. package/dist/src/core/CoreTextNodeCanvas.js +236 -0
  15. package/dist/src/core/CoreTextNodeCanvas.js.map +1 -0
  16. package/dist/src/core/Stage.js +10 -0
  17. package/dist/src/core/Stage.js.map +1 -1
  18. package/dist/src/core/TextureMemoryManager.js +4 -3
  19. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  20. package/dist/src/core/animations/Animation.d.ts +21 -0
  21. package/dist/src/core/animations/Animation.js +194 -0
  22. package/dist/src/core/animations/Animation.js.map +1 -0
  23. package/dist/src/core/animations/AnimationManager.d.ts +1 -1
  24. package/dist/src/core/animations/AnimationManager.js +5 -5
  25. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  26. package/dist/src/core/animations/CoreAnimation.d.ts +11 -2
  27. package/dist/src/core/animations/CoreAnimation.js +44 -38
  28. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  29. package/dist/src/core/animations/CoreAnimationController.d.ts +6 -0
  30. package/dist/src/core/animations/CoreAnimationController.js +16 -3
  31. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  32. package/dist/src/core/animations/Playback.d.ts +64 -0
  33. package/dist/src/core/animations/Playback.js +169 -0
  34. package/dist/src/core/animations/Playback.js.map +1 -0
  35. package/dist/src/core/animations/Ticker.d.ts +71 -0
  36. package/dist/src/core/animations/Ticker.js +89 -0
  37. package/dist/src/core/animations/Ticker.js.map +1 -0
  38. package/dist/src/core/animations/Transition.d.ts +38 -0
  39. package/dist/src/core/animations/Transition.js +35 -0
  40. package/dist/src/core/animations/Transition.js.map +1 -0
  41. package/dist/src/core/animations/TransitionsController.d.ts +10 -0
  42. package/dist/src/core/animations/TransitionsController.js +39 -0
  43. package/dist/src/core/animations/TransitionsController.js.map +1 -0
  44. package/dist/src/core/animations/utils.d.ts +2 -0
  45. package/dist/src/core/animations/utils.js +136 -0
  46. package/dist/src/core/animations/utils.js.map +1 -0
  47. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  48. package/dist/src/core/lib/ImageWorker.js +11 -30
  49. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  50. package/dist/src/core/lib/WebGlContextWrapper.d.ts +5 -16
  51. package/dist/src/core/lib/WebGlContextWrapper.js +1 -35
  52. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  53. package/dist/src/core/lib/textureCompression.d.ts +2 -14
  54. package/dist/src/core/lib/textureCompression.js +67 -320
  55. package/dist/src/core/lib/textureCompression.js.map +1 -1
  56. package/dist/src/core/platform.js +9 -38
  57. package/dist/src/core/platform.js.map +1 -1
  58. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -1
  59. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +3 -11
  60. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  61. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +1 -2
  62. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +11 -16
  63. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  64. package/dist/src/core/renderers/canvas/CanvasRenderer.js +14 -1
  65. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  66. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +1 -1
  67. package/dist/src/core/renderers/canvas/CanvasTexture.js +16 -6
  68. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  69. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -13
  70. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +192 -113
  71. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  72. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +2 -0
  73. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +14 -0
  74. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +1 -2
  76. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +5 -12
  77. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  78. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +6 -18
  79. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +60 -102
  80. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
  82. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +1 -3
  83. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +31 -74
  84. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  85. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +7 -2
  86. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +50 -21
  87. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  88. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +2 -3
  89. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +1 -3
  90. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  91. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +2 -2
  92. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  93. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +1 -0
  94. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +23 -0
  95. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  96. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +4 -5
  97. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  98. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +1 -0
  99. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  100. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +6 -3
  101. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  102. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +11 -0
  103. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  104. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +10 -5
  105. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  106. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +10 -5
  107. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  108. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +12 -0
  109. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  110. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
  111. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
  112. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
  113. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
  114. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +2 -2
  115. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
  116. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
  117. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +1 -0
  118. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +30 -14
  119. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -1
  121. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +3 -13
  122. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  123. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
  124. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
  125. package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
  126. package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
  127. package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
  128. package/dist/src/core/text-rendering/CanvasFont.d.ts +1 -1
  129. package/dist/src/core/text-rendering/CanvasFont.js +7 -16
  130. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -1
  131. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +1 -1
  132. package/dist/src/core/text-rendering/CanvasFontHandler.js +1 -1
  133. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  134. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +2 -3
  135. package/dist/src/core/text-rendering/CanvasTextRenderer.js +7 -5
  136. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  137. package/dist/src/core/text-rendering/CoreFont.d.ts +1 -1
  138. package/dist/src/core/text-rendering/CoreFont.js +1 -1
  139. package/dist/src/core/text-rendering/CoreFont.js.map +1 -1
  140. package/dist/src/core/text-rendering/FontManager.js +2 -1
  141. package/dist/src/core/text-rendering/FontManager.js.map +1 -1
  142. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +3 -5
  143. package/dist/src/core/text-rendering/SdfTextRenderer.js +19 -109
  144. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  145. package/dist/src/core/text-rendering/TextLayoutEngine.js +43 -12
  146. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -1
  147. package/dist/src/core/text-rendering/TextRenderer.d.ts +16 -8
  148. package/dist/src/core/text-rendering/canvas/Settings.d.ts +64 -0
  149. package/dist/src/core/text-rendering/canvas/Settings.js +20 -0
  150. package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
  151. package/dist/src/core/text-rendering/canvas/Utils.d.ts +20 -0
  152. package/dist/src/core/text-rendering/canvas/Utils.js +144 -0
  153. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
  154. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +60 -0
  155. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +183 -0
  156. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
  157. package/dist/src/core/text-rendering/canvas/draw.d.ts +5 -0
  158. package/dist/src/core/text-rendering/canvas/draw.js +132 -0
  159. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
  160. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  161. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  162. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -4
  163. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +46 -98
  164. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  165. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +1 -1
  166. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +2 -2
  167. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +66 -8
  168. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  169. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +1 -1
  170. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +1 -1
  171. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.d.ts +26 -0
  172. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js +158 -0
  173. package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js.map +1 -0
  174. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.d.ts +5 -0
  175. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js +127 -0
  176. package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js.map +1 -0
  177. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.d.ts +2 -0
  178. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js +50 -0
  179. package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js.map +1 -0
  180. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.d.ts +33 -0
  181. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js +192 -0
  182. package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js.map +1 -0
  183. package/dist/src/core/text-rendering/renderers/canvas/internal/types.d.ts +66 -0
  184. package/dist/src/core/text-rendering/renderers/canvas/internal/types.js +2 -0
  185. package/dist/src/core/text-rendering/renderers/canvas/internal/types.js.map +1 -0
  186. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.d.ts +91 -0
  187. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js +282 -0
  188. package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js.map +1 -0
  189. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
  190. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
  191. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
  192. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
  193. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
  194. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
  195. package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
  196. package/dist/src/core/text-rendering/sdf/Utils.js +301 -0
  197. package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
  198. package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
  199. package/dist/src/core/text-rendering/sdf/index.js +20 -0
  200. package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
  201. package/dist/src/core/textures/ImageTexture.js +11 -0
  202. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  203. package/dist/src/core/textures/Texture.js +5 -0
  204. package/dist/src/core/textures/Texture.js.map +1 -1
  205. package/dist/src/main-api/Inspector.d.ts +1 -1
  206. package/dist/src/main-api/Inspector.js +25 -20
  207. package/dist/src/main-api/Inspector.js.map +1 -1
  208. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/package.json +1 -1
  211. package/src/common/EventEmitter.ts +6 -8
  212. package/src/core/CoreNode.test.ts +1 -1
  213. package/src/core/CoreNode.ts +8 -4
  214. package/src/core/CoreTextNode.test.ts +138 -25
  215. package/src/core/CoreTextNode.ts +174 -67
  216. package/src/core/Stage.ts +11 -0
  217. package/src/core/TextureMemoryManager.ts +4 -3
  218. package/src/core/animations/AnimationManager.ts +5 -5
  219. package/src/core/animations/CoreAnimation.ts +61 -45
  220. package/src/core/animations/CoreAnimationController.ts +16 -7
  221. package/src/core/renderers/canvas/CanvasRenderer.ts +19 -1
  222. package/src/core/renderers/canvas/CanvasTexture.ts +23 -8
  223. package/src/core/renderers/webgl/WebGlRenderer.ts +2 -3
  224. package/src/core/renderers/webgl/WebGlShaderNode.ts +24 -0
  225. package/src/core/renderers/webgl/WebGlShaderProgram.test.ts +274 -0
  226. package/src/core/renderers/webgl/WebGlShaderProgram.ts +10 -10
  227. package/src/core/renderers/webgl/internal/ShaderUtils.ts +1 -0
  228. package/src/core/text-rendering/CanvasFontHandler.ts +2 -2
  229. package/src/core/text-rendering/CanvasTextRenderer.ts +14 -7
  230. package/src/core/text-rendering/SdfTextRenderer.ts +28 -140
  231. package/src/core/text-rendering/TextLayoutEngine.ts +61 -28
  232. package/src/core/text-rendering/TextRenderer.ts +19 -12
  233. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +20 -0
  234. package/src/core/textures/ImageTexture.ts +18 -0
  235. package/src/core/textures/Texture.ts +6 -0
  236. package/src/main-api/Inspector.ts +25 -25
  237. package/dist/src/core/text-rendering/TextGenerator.d.ts +0 -10
  238. package/dist/src/core/text-rendering/TextGenerator.js +0 -36
  239. package/dist/src/core/text-rendering/TextGenerator.js.map +0 -1
  240. package/src/core/renderers/webgl/SdfRenderOp.ts +0 -106
@@ -177,7 +177,7 @@ export class TextureMemoryManager {
177
177
  }
178
178
  }
179
179
 
180
- if (this.memUsed > this.criticalThreshold) {
180
+ if (this.criticalThreshold > 0 && this.memUsed > this.criticalThreshold) {
181
181
  this.criticalCleanupRequested = true;
182
182
  }
183
183
  }
@@ -185,13 +185,14 @@ export class TextureMemoryManager {
185
185
  checkCleanup() {
186
186
  return (
187
187
  this.criticalCleanupRequested ||
188
- (this.memUsed > this.targetThreshold &&
188
+ (this.criticalThreshold > 0 &&
189
+ this.memUsed > this.targetThreshold &&
189
190
  this.frameTime - this.lastCleanupTime >= this.cleanupInterval)
190
191
  );
191
192
  }
192
193
 
193
194
  checkCriticalCleanup() {
194
- return this.memUsed > this.criticalThreshold;
195
+ return this.criticalThreshold > 0 && this.memUsed > this.criticalThreshold;
195
196
  }
196
197
 
197
198
  /**
@@ -20,19 +20,19 @@
20
20
  import { CoreAnimation } from './CoreAnimation.js';
21
21
 
22
22
  export class AnimationManager {
23
- activeAnimations: Set<CoreAnimation> = new Set();
23
+ activeAnimations: Map<number, CoreAnimation> = new Map();
24
24
 
25
25
  registerAnimation(animation: CoreAnimation) {
26
- this.activeAnimations.add(animation);
26
+ this.activeAnimations.set(animation.id, animation);
27
27
  }
28
28
 
29
29
  unregisterAnimation(animation: CoreAnimation) {
30
- this.activeAnimations.delete(animation);
30
+ this.activeAnimations.delete(animation.id);
31
31
  }
32
32
 
33
33
  update(dt: number) {
34
- this.activeAnimations.forEach((animation) => {
34
+ for (const animation of this.activeAnimations.values()) {
35
35
  animation.update(dt);
36
- });
36
+ }
37
37
  }
38
38
  }
@@ -34,17 +34,30 @@ export interface AnimationSettings {
34
34
  type PropValues = {
35
35
  start: number;
36
36
  target: number;
37
+ isColor: boolean;
37
38
  };
38
- type PropValuesMap = Record<string, Record<string, PropValues>>;
39
+
40
+ type PropGroup = {
41
+ keys: string[];
42
+ values: PropValues[];
43
+ };
44
+
45
+ type PropValuesMap = {
46
+ props: PropGroup | null;
47
+ shaderProps: PropGroup | null;
48
+ };
49
+
50
+ let animationIdCounter = 0;
39
51
 
40
52
  export class CoreAnimation extends EventEmitter {
53
+ public readonly id: number = ++animationIdCounter;
41
54
  public settings: AnimationSettings;
42
55
  private progress = 0;
43
56
  private delayFor = 0;
44
57
  private delay = 0;
45
58
  private timingFunction: TimingFunction;
46
59
 
47
- propValuesMap: PropValuesMap = {};
60
+ propValuesMap: PropValuesMap = { props: null, shaderProps: null };
48
61
 
49
62
  constructor(
50
63
  private node: CoreNode,
@@ -55,27 +68,31 @@ export class CoreAnimation extends EventEmitter {
55
68
 
56
69
  for (const key in props) {
57
70
  if (key !== 'shaderProps') {
58
- if (this.propValuesMap['props'] === undefined) {
59
- this.propValuesMap['props'] = {};
71
+ if (this.propValuesMap['props'] === null) {
72
+ this.propValuesMap['props'] = { keys: [], values: [] };
60
73
  }
61
- this.propValuesMap['props'][key] = {
74
+ this.propValuesMap['props']!['keys'].push(key);
75
+ this.propValuesMap['props']!['values'].push({
62
76
  start:
63
77
  node[key as keyof Omit<CoreNodeAnimateProps, 'shaderProps'>] || 0,
64
78
  target: props[
65
79
  key as keyof Omit<CoreNodeAnimateProps, 'shaderProps'>
66
80
  ] as number,
67
- };
81
+ isColor: key.indexOf('color') !== -1,
82
+ });
68
83
  } else if (key === 'shaderProps' && node.shader !== null) {
69
- this.propValuesMap['shaderProps'] = {};
84
+ this.propValuesMap['shaderProps'] = { keys: [], values: [] };
70
85
  for (const key in props.shaderProps) {
71
86
  let start = node.shader.props![key];
72
87
  if (Array.isArray(start) === true) {
73
88
  start = start[0];
74
89
  }
75
- this.propValuesMap['shaderProps'][key] = {
90
+ this.propValuesMap['shaderProps']!['keys'].push(key);
91
+ this.propValuesMap['shaderProps']!['values'].push({
76
92
  start,
77
93
  target: props.shaderProps[key] as number,
78
- };
94
+ isColor: key.indexOf('color') !== -1,
95
+ });
79
96
  }
80
97
  }
81
98
  }
@@ -102,28 +119,24 @@ export class CoreAnimation extends EventEmitter {
102
119
  this.update(0);
103
120
  }
104
121
 
105
- private restoreValues(
106
- target: Record<string, number>,
107
- valueMap: Record<string, PropValues>,
108
- ) {
109
- const entries = Object.entries(valueMap);
110
- const eLength = entries.length;
111
-
112
- for (let i = 0; i < eLength; i++) {
113
- const [key, value] = entries[i]!;
114
- target[key] = value.start;
122
+ private restoreValues(target: Record<string, number>, group: PropGroup) {
123
+ const keys = group.keys;
124
+ const values = group.values;
125
+ const length = keys.length;
126
+ for (let i = 0; i < length; i++) {
127
+ target[keys[i]!] = values[i]!.start;
115
128
  }
116
129
  }
117
130
 
118
131
  restore() {
119
132
  this.reset();
120
- if (this.propValuesMap['props'] !== undefined) {
133
+ if (this.propValuesMap['props'] !== null) {
121
134
  this.restoreValues(
122
135
  this.node as unknown as Record<string, number>,
123
136
  this.propValuesMap['props'],
124
137
  );
125
138
  }
126
- if (this.propValuesMap['shaderProps'] !== undefined) {
139
+ if (this.propValuesMap['shaderProps'] !== null) {
127
140
  this.restoreValues(
128
141
  this.node.shader!.props as Record<string, number>,
129
142
  this.propValuesMap['shaderProps'],
@@ -131,26 +144,24 @@ export class CoreAnimation extends EventEmitter {
131
144
  }
132
145
  }
133
146
 
134
- private reverseValues(valueMap: Record<string, PropValues>) {
135
- const entries = Object.entries(valueMap);
136
- const eLength = entries.length;
137
-
138
- for (let i = 0; i < eLength; i++) {
139
- const [key, value] = entries[i]!;
140
- valueMap[key] = {
141
- start: value.target,
142
- target: value.start,
143
- };
147
+ private reverseValues(group: PropGroup) {
148
+ const values = group.values;
149
+ const length = values.length;
150
+ for (let i = 0; i < length; i++) {
151
+ const value = values[i]!;
152
+ const tmp = value.start;
153
+ value.start = value.target;
154
+ value.target = tmp;
144
155
  }
145
156
  }
146
157
 
147
158
  reverse() {
148
159
  this.progress = 0;
149
160
 
150
- if (this.propValuesMap['props'] !== undefined) {
161
+ if (this.propValuesMap['props'] !== null) {
151
162
  this.reverseValues(this.propValuesMap['props']);
152
163
  }
153
- if (this.propValuesMap['shaderProps'] !== undefined) {
164
+ if (this.propValuesMap['shaderProps'] !== null) {
154
165
  this.reverseValues(this.propValuesMap['shaderProps']);
155
166
  }
156
167
 
@@ -165,7 +176,7 @@ export class CoreAnimation extends EventEmitter {
165
176
  }
166
177
 
167
178
  updateValue(
168
- propName: string,
179
+ isColor: boolean,
169
180
  propValue: number,
170
181
  startValue: number,
171
182
  easing: string | TimingFunction | undefined,
@@ -178,7 +189,7 @@ export class CoreAnimation extends EventEmitter {
178
189
  }
179
190
 
180
191
  const endValue = propValue;
181
- if (propName.indexOf('color') !== -1) {
192
+ if (isColor === true) {
182
193
  if (startValue === endValue) {
183
194
  return startValue;
184
195
  }
@@ -199,15 +210,20 @@ export class CoreAnimation extends EventEmitter {
199
210
 
200
211
  private updateValues(
201
212
  target: Record<string, number>,
202
- valueMap: Record<string, PropValues>,
213
+ group: PropGroup,
203
214
  easing: string | TimingFunction | undefined,
204
215
  ) {
205
- const entries = Object.entries(valueMap);
206
- const eLength = entries.length;
207
-
208
- for (let i = 0; i < eLength; i++) {
209
- const [key, value] = entries[i]!;
210
- target[key] = this.updateValue(key, value.target, value.start, easing);
216
+ const keys = group.keys;
217
+ const values = group.values;
218
+ const length = keys.length;
219
+ for (let i = 0; i < length; i++) {
220
+ const value = values[i]!;
221
+ target[keys[i]!] = this.updateValue(
222
+ value.isColor,
223
+ value.target,
224
+ value.start,
225
+ easing,
226
+ );
211
227
  }
212
228
  }
213
229
 
@@ -264,14 +280,14 @@ export class CoreAnimation extends EventEmitter {
264
280
  }
265
281
  }
266
282
 
267
- if (this.propValuesMap['props'] !== undefined) {
283
+ if (this.propValuesMap['props'] !== null) {
268
284
  this.updateValues(
269
285
  this.node as unknown as Record<string, number>,
270
286
  this.propValuesMap['props'],
271
287
  easing,
272
288
  );
273
289
  }
274
- if (this.propValuesMap['shaderProps'] !== undefined) {
290
+ if (this.propValuesMap['shaderProps'] !== null) {
275
291
  this.updateValues(
276
292
  this.node.shader!.props as Record<string, number>,
277
293
  this.propValuesMap['shaderProps'],
@@ -280,7 +296,7 @@ export class CoreAnimation extends EventEmitter {
280
296
  }
281
297
 
282
298
  if (this.progress < 1) {
283
- this.emit('tick', { progress: this.progress });
299
+ this.emit('tick');
284
300
  }
285
301
 
286
302
  if (this.progress === 1) {
@@ -23,7 +23,6 @@ import type {
23
23
  } from '../../common/IAnimationController.js';
24
24
  import type { AnimationManager } from './AnimationManager.js';
25
25
  import type { CoreAnimation } from './CoreAnimation.js';
26
- import { assertTruthy } from '../../utils.js';
27
26
  import { EventEmitter } from '../../common/EventEmitter.js';
28
27
  import type { AnimationTickPayload } from '../../common/CommonTypes.js';
29
28
 
@@ -159,11 +158,21 @@ export class CoreAnimationController
159
158
  this.emit('animating', this);
160
159
  }
161
160
 
162
- private onTick(
163
- this: CoreAnimationController,
164
- _animation: CoreAnimation,
165
- data: AnimationTickPayload,
166
- ): void {
167
- this.emit('tick', data);
161
+ /**
162
+ * manually override the tick event to emit the progress of the animation as well
163
+ * we are first checking if there are any listeners for the tick event. this avoid unnecessary object creation.
164
+ * @param this
165
+ * @returns
166
+ */
167
+ private onTick(this: CoreAnimationController): void {
168
+ const listeners = this.eventListeners['tick'];
169
+ if (listeners === undefined) {
170
+ return;
171
+ }
172
+ listeners.forEach((listener) => {
173
+ listener(this, {
174
+ progress: this.animation['progress'],
175
+ });
176
+ });
168
177
  }
169
178
  }
@@ -83,7 +83,19 @@ export class CanvasRenderer extends CoreRenderer {
83
83
  }
84
84
 
85
85
  const hasTransform = ta !== 1;
86
- const hasClipping = clippingRect.w !== 0 && clippingRect.h !== 0;
86
+ const clippingValid = clippingRect.valid === true;
87
+
88
+ // If the clipping rect is valid but zero-area, the node is fully clipped — skip rendering
89
+ if (
90
+ clippingValid === true &&
91
+ clippingRect.w === 0 &&
92
+ clippingRect.h === 0
93
+ ) {
94
+ return;
95
+ }
96
+
97
+ const hasClipping =
98
+ clippingValid === true && clippingRect.w !== 0 && clippingRect.h !== 0;
87
99
  const shader = node.props.shader;
88
100
  const hasShader = shader !== null;
89
101
 
@@ -146,6 +158,9 @@ export class CanvasRenderer extends CoreRenderer {
146
158
  const tintColor = parseColor(color);
147
159
  if (textureType !== TextureType.subTexture) {
148
160
  const image = (texture.ctxTexture as CanvasTexture).getImage(tintColor);
161
+ if (image === null) {
162
+ return;
163
+ }
149
164
  this.context.globalAlpha = tintColor.a ?? node.worldAlpha;
150
165
  this.context.drawImage(image, tx, ty, width, height);
151
166
  this.context.globalAlpha = 1;
@@ -154,6 +169,9 @@ export class CanvasRenderer extends CoreRenderer {
154
169
  const image = (
155
170
  (texture as SubTexture).parentTexture.ctxTexture as CanvasTexture
156
171
  ).getImage(tintColor);
172
+ if (image === null) {
173
+ return;
174
+ }
157
175
  const props = (texture as SubTexture).props;
158
176
 
159
177
  this.context.globalAlpha = tintColor.a ?? node.worldAlpha;
@@ -21,6 +21,7 @@ import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import { assertTruthy } from '../../../utils.js';
22
22
  import { formatRgba, type IParsedColor } from '../../lib/colorParser.js';
23
23
  import { CoreContextTexture } from '../CoreContextTexture.js';
24
+ import type { Texture } from '../../textures/Texture.js';
24
25
 
25
26
  export class CanvasTexture extends CoreContextTexture {
26
27
  protected image:
@@ -36,10 +37,23 @@ export class CanvasTexture extends CoreContextTexture {
36
37
  | undefined;
37
38
 
38
39
  async load(): Promise<void> {
40
+ // Capture textureData synchronously before any await - a pending
41
+ // freeTextureDataTask microtask could null textureSource.textureData
42
+ // during the first async suspension, causing onLoadRequest to fail.
43
+ const textureData = this.textureSource.textureData;
44
+ assertTruthy(textureData?.data, 'Texture data is null before load');
45
+
39
46
  this.textureSource.setState('loading');
40
47
 
41
48
  try {
42
- const size = await this.onLoadRequest();
49
+ const size = await this.onLoadRequest(textureData.data);
50
+
51
+ // Guard against the texture being freed while the load was in flight
52
+ if (this.textureSource.state === 'freed') {
53
+ this.image = undefined;
54
+ return;
55
+ }
56
+
43
57
  this.textureSource.setState('loaded', size);
44
58
  this.textureSource.freeTextureData();
45
59
  this.updateMemSize();
@@ -82,9 +96,11 @@ export class CanvasTexture extends CoreContextTexture {
82
96
 
83
97
  getImage(
84
98
  color: IParsedColor,
85
- ): ImageBitmap | HTMLCanvasElement | HTMLImageElement {
99
+ ): ImageBitmap | HTMLCanvasElement | HTMLImageElement | null {
86
100
  const image = this.image;
87
- assertTruthy(image, 'Attempt to get unloaded image texture');
101
+ if (image === undefined) {
102
+ return null;
103
+ }
88
104
 
89
105
  if (color.isWhite) {
90
106
  if (this.tintCache) {
@@ -133,10 +149,9 @@ export class CanvasTexture extends CoreContextTexture {
133
149
  return canvas;
134
150
  }
135
151
 
136
- private async onLoadRequest(): Promise<Dimensions> {
137
- assertTruthy(this.textureSource?.textureData?.data, 'Texture data is null');
138
- const { data } = this.textureSource.textureData;
139
-
152
+ private async onLoadRequest(
153
+ data: NonNullable<NonNullable<Texture['textureData']>['data']>,
154
+ ): Promise<Dimensions> {
140
155
  // TODO: canvas from text renderer should be able to provide the canvas directly
141
156
  // instead of having to re-draw it into a new canvas...
142
157
  if (data instanceof ImageData) {
@@ -144,7 +159,7 @@ export class CanvasTexture extends CoreContextTexture {
144
159
  canvas.width = data.width;
145
160
  canvas.height = data.height;
146
161
  const ctx = canvas.getContext('2d');
147
- if (ctx) ctx.putImageData(data, 0, 0);
162
+ if (ctx !== null) ctx.putImageData(data, 0, 0);
148
163
  this.image = canvas;
149
164
  return { w: data.width, h: data.height };
150
165
  } else if (
@@ -18,7 +18,6 @@
18
18
  */
19
19
 
20
20
  import { CoreRenderer, type BufferInfo } from '../CoreRenderer.js';
21
- import type { SdfRenderOp } from './SdfRenderOp.js';
22
21
  import type { CoreContextTexture } from '../CoreContextTexture.js';
23
22
  import {
24
23
  createIndexBuffer,
@@ -47,15 +46,15 @@ import type { WebGlShaderType } from './WebGlShaderNode.js';
47
46
  import { WebGlShaderNode } from './WebGlShaderNode.js';
48
47
  import type { Dimensions } from '../../../common/CommonTypes.js';
49
48
  import type { GlContextWrapper } from '../../platforms/GlContextWrapper.js';
50
- import type { Platform } from '../../platforms/Platform.js';
51
49
  import type { Stage } from '../../Stage.js';
50
+ import type { CoreTextNode } from '../../CoreTextNode.js';
52
51
 
53
52
  interface CoreWebGlSystem {
54
53
  parameters: CoreWebGlParameters;
55
54
  extensions: CoreWebGlExtensions;
56
55
  }
57
56
 
58
- export type WebGlRenderOp = CoreNode | SdfRenderOp;
57
+ export type WebGlRenderOp = CoreNode | CoreTextNode;
59
58
 
60
59
  export class WebGlRenderer extends CoreRenderer {
61
60
  //// WebGL Native Context and Data
@@ -62,6 +62,7 @@ export class WebGlShaderNode<
62
62
  undefined;
63
63
  private valueKey: string = '';
64
64
  uniforms: UniformCollection = {
65
+ hasStoredUniforms: false,
65
66
  single: {},
66
67
  vec2: {},
67
68
  vec3: {},
@@ -83,6 +84,7 @@ export class WebGlShaderNode<
83
84
  this.update = () => {
84
85
  if (this.props === undefined) {
85
86
  this.updater!(this.node as CoreNode, this.props);
87
+ this.updateUniformUsage();
86
88
  return;
87
89
  }
88
90
 
@@ -106,12 +108,14 @@ export class WebGlShaderNode<
106
108
  }
107
109
  //create empty uniform collection when calculating new values
108
110
  this.uniforms = {
111
+ hasStoredUniforms: false,
109
112
  single: {},
110
113
  vec2: {},
111
114
  vec3: {},
112
115
  vec4: {},
113
116
  };
114
117
  this.updater!(this.node as CoreNode);
118
+ this.updateUniformUsage();
115
119
  stage.shManager.setShaderValues(
116
120
  this.valueKey,
117
121
  this.uniforms as unknown as Record<string, unknown>,
@@ -120,6 +124,26 @@ export class WebGlShaderNode<
120
124
  }
121
125
  }
122
126
 
127
+ updateUniformUsage(): void {
128
+ for (const _ in this.uniforms.single) {
129
+ this.uniforms.hasStoredUniforms = true;
130
+ return;
131
+ }
132
+ for (const _ in this.uniforms.vec2) {
133
+ this.uniforms.hasStoredUniforms = true;
134
+ return;
135
+ }
136
+ for (const _ in this.uniforms.vec3) {
137
+ this.uniforms.hasStoredUniforms = true;
138
+ return;
139
+ }
140
+ for (const _ in this.uniforms.vec4) {
141
+ this.uniforms.hasStoredUniforms = true;
142
+ return;
143
+ }
144
+ this.uniforms.hasStoredUniforms = false;
145
+ }
146
+
123
147
  /**
124
148
  * Sets the value of a RGBA variable
125
149
  * @param location