@lightningjs/renderer 2.16.0 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/dist/src/core/CoreNode.js +7 -5
  2. package/dist/src/core/CoreNode.js.map +1 -1
  3. package/dist/src/core/CoreTextureManager.d.ts +14 -8
  4. package/dist/src/core/CoreTextureManager.js +33 -59
  5. package/dist/src/core/CoreTextureManager.js.map +1 -1
  6. package/dist/src/core/Stage.d.ts +3 -3
  7. package/dist/src/core/Stage.js +9 -14
  8. package/dist/src/core/Stage.js.map +1 -1
  9. package/dist/src/core/TextureMemoryManager.d.ts +21 -17
  10. package/dist/src/core/TextureMemoryManager.js +99 -124
  11. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  12. package/dist/src/core/lib/WebGlContextWrapper.d.ts +10 -0
  13. package/dist/src/core/lib/WebGlContextWrapper.js +32 -0
  14. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  15. package/dist/src/core/lib/textureCompression.js +13 -6
  16. package/dist/src/core/lib/textureCompression.js.map +1 -1
  17. package/dist/src/core/platform.js +4 -1
  18. package/dist/src/core/platform.js.map +1 -1
  19. package/dist/src/core/renderers/CoreContextTexture.d.ts +1 -0
  20. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  21. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +1 -0
  22. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +4 -3
  23. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  24. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +9 -0
  25. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +59 -29
  26. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  27. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +4 -4
  28. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  29. package/dist/src/core/textures/ColorTexture.d.ts +2 -2
  30. package/dist/src/core/textures/ColorTexture.js +1 -2
  31. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  32. package/dist/src/core/textures/ImageTexture.d.ts +7 -1
  33. package/dist/src/core/textures/ImageTexture.js +55 -39
  34. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  35. package/dist/src/core/textures/NoiseTexture.js +1 -1
  36. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  37. package/dist/src/core/textures/RenderTexture.js +1 -1
  38. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  39. package/dist/src/core/textures/SubTexture.d.ts +1 -2
  40. package/dist/src/core/textures/SubTexture.js +11 -29
  41. package/dist/src/core/textures/SubTexture.js.map +1 -1
  42. package/dist/src/core/textures/Texture.d.ts +51 -7
  43. package/dist/src/core/textures/Texture.js +127 -15
  44. package/dist/src/core/textures/Texture.js.map +1 -1
  45. package/dist/src/main-api/Inspector.d.ts +3 -0
  46. package/dist/src/main-api/Inspector.js +156 -0
  47. package/dist/src/main-api/Inspector.js.map +1 -1
  48. package/dist/src/main-api/Renderer.d.ts +1 -3
  49. package/dist/src/main-api/Renderer.js +2 -4
  50. package/dist/src/main-api/Renderer.js.map +1 -1
  51. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  52. package/package.json +1 -1
  53. package/src/core/CoreNode.ts +8 -4
  54. package/src/core/CoreTextureManager.ts +59 -65
  55. package/src/core/Stage.ts +10 -16
  56. package/src/core/TextureMemoryManager.ts +118 -148
  57. package/src/core/lib/WebGlContextWrapper.ts +38 -0
  58. package/src/core/lib/textureCompression.ts +18 -7
  59. package/src/core/platform.ts +5 -1
  60. package/src/core/renderers/CoreContextTexture.ts +1 -0
  61. package/src/core/renderers/canvas/CanvasCoreTexture.ts +5 -3
  62. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +78 -40
  63. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +10 -4
  64. package/src/core/textures/ColorTexture.ts +4 -7
  65. package/src/core/textures/ImageTexture.ts +66 -51
  66. package/src/core/textures/NoiseTexture.ts +1 -1
  67. package/src/core/textures/RenderTexture.ts +1 -1
  68. package/src/core/textures/SubTexture.ts +14 -31
  69. package/src/core/textures/Texture.ts +150 -21
  70. package/src/main-api/Inspector.ts +203 -0
  71. package/src/main-api/Renderer.ts +2 -4
  72. package/dist/exports/canvas-shaders.d.ts +0 -10
  73. package/dist/exports/canvas-shaders.js +0 -27
  74. package/dist/exports/canvas-shaders.js.map +0 -1
  75. package/dist/exports/webgl-shaders.d.ts +0 -11
  76. package/dist/exports/webgl-shaders.js +0 -28
  77. package/dist/exports/webgl-shaders.js.map +0 -1
  78. package/dist/src/core/platforms/Platform.d.ts +0 -37
  79. package/dist/src/core/platforms/Platform.js +0 -22
  80. package/dist/src/core/platforms/Platform.js.map +0 -1
  81. package/dist/src/core/platforms/web/WebPlatform.d.ts +0 -9
  82. package/dist/src/core/platforms/web/WebPlatform.js +0 -58
  83. package/dist/src/core/platforms/web/WebPlatform.js.map +0 -1
  84. package/dist/src/core/renderers/CoreShaderNode.d.ts +0 -59
  85. package/dist/src/core/renderers/CoreShaderNode.js +0 -113
  86. package/dist/src/core/renderers/CoreShaderNode.js.map +0 -1
  87. package/dist/src/core/renderers/CoreShaderProgram.d.ts +0 -4
  88. package/dist/src/core/renderers/CoreShaderProgram.js +0 -20
  89. package/dist/src/core/renderers/CoreShaderProgram.js.map +0 -1
  90. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +0 -37
  91. package/dist/src/core/renderers/canvas/CanvasRenderer.js +0 -215
  92. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +0 -1
  93. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +0 -21
  94. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +0 -57
  95. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +0 -1
  96. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +0 -16
  97. package/dist/src/core/renderers/canvas/CanvasTexture.js +0 -124
  98. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +0 -1
  99. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +0 -12
  100. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +0 -55
  101. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +0 -1
  102. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +0 -9
  103. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +0 -38
  104. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +0 -1
  105. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +0 -57
  106. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +0 -224
  107. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +0 -1
  108. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -44
  109. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -125
  110. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  111. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +0 -136
  112. package/dist/src/core/renderers/webgl/WebGlRenderer.js +0 -573
  113. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +0 -1
  114. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +0 -222
  115. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +0 -331
  116. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +0 -1
  117. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +0 -35
  118. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +0 -201
  119. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +0 -1
  120. package/dist/src/core/shaders/canvas/Border.d.ts +0 -9
  121. package/dist/src/core/shaders/canvas/Border.js +0 -57
  122. package/dist/src/core/shaders/canvas/Border.js.map +0 -1
  123. package/dist/src/core/shaders/canvas/HolePunch.d.ts +0 -7
  124. package/dist/src/core/shaders/canvas/HolePunch.js +0 -38
  125. package/dist/src/core/shaders/canvas/HolePunch.js.map +0 -1
  126. package/dist/src/core/shaders/canvas/LinearGradient.d.ts +0 -10
  127. package/dist/src/core/shaders/canvas/LinearGradient.js +0 -48
  128. package/dist/src/core/shaders/canvas/LinearGradient.js.map +0 -1
  129. package/dist/src/core/shaders/canvas/RadialGradient.d.ts +0 -11
  130. package/dist/src/core/shaders/canvas/RadialGradient.js +0 -70
  131. package/dist/src/core/shaders/canvas/RadialGradient.js.map +0 -1
  132. package/dist/src/core/shaders/canvas/Rounded.d.ts +0 -7
  133. package/dist/src/core/shaders/canvas/Rounded.js +0 -33
  134. package/dist/src/core/shaders/canvas/Rounded.js.map +0 -1
  135. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +0 -7
  136. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +0 -43
  137. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +0 -1
  138. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +0 -8
  139. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +0 -41
  140. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +0 -1
  141. package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +0 -7
  142. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +0 -40
  143. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +0 -1
  144. package/dist/src/core/shaders/canvas/Shadow.d.ts +0 -8
  145. package/dist/src/core/shaders/canvas/Shadow.js +0 -31
  146. package/dist/src/core/shaders/canvas/Shadow.js.map +0 -1
  147. package/dist/src/core/shaders/canvas/utils/render.d.ts +0 -5
  148. package/dist/src/core/shaders/canvas/utils/render.js +0 -84
  149. package/dist/src/core/shaders/canvas/utils/render.js.map +0 -1
  150. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +0 -37
  151. package/dist/src/core/shaders/templates/BorderTemplate.js +0 -73
  152. package/dist/src/core/shaders/templates/BorderTemplate.js.map +0 -1
  153. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +0 -46
  154. package/dist/src/core/shaders/templates/HolePunchTemplate.js +0 -35
  155. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +0 -1
  156. package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +0 -23
  157. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -47
  158. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +0 -1
  159. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +0 -31
  160. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +0 -49
  161. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +0 -1
  162. package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +0 -29
  163. package/dist/src/core/shaders/templates/RoundedTemplate.js +0 -67
  164. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +0 -1
  165. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +0 -7
  166. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -24
  167. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +0 -1
  168. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +0 -6
  169. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +0 -23
  170. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +0 -1
  171. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +0 -6
  172. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -23
  173. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +0 -1
  174. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +0 -34
  175. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -66
  176. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +0 -1
  177. package/dist/src/core/shaders/templates/shaderUtils.d.ts +0 -5
  178. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  179. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  180. package/dist/src/core/shaders/utils.d.ts +0 -5
  181. package/dist/src/core/shaders/utils.js +0 -41
  182. package/dist/src/core/shaders/utils.js.map +0 -1
  183. package/dist/src/core/shaders/webgl/Border.d.ts +0 -3
  184. package/dist/src/core/shaders/webgl/Border.js +0 -110
  185. package/dist/src/core/shaders/webgl/Border.js.map +0 -1
  186. package/dist/src/core/shaders/webgl/Default.d.ts +0 -2
  187. package/dist/src/core/shaders/webgl/Default.js +0 -86
  188. package/dist/src/core/shaders/webgl/Default.js.map +0 -1
  189. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +0 -2
  190. package/dist/src/core/shaders/webgl/DefaultBatched.js +0 -104
  191. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +0 -1
  192. package/dist/src/core/shaders/webgl/HolePunch.d.ts +0 -3
  193. package/dist/src/core/shaders/webgl/HolePunch.js +0 -65
  194. package/dist/src/core/shaders/webgl/HolePunch.js.map +0 -1
  195. package/dist/src/core/shaders/webgl/LinearGradient.d.ts +0 -3
  196. package/dist/src/core/shaders/webgl/LinearGradient.js +0 -76
  197. package/dist/src/core/shaders/webgl/LinearGradient.js.map +0 -1
  198. package/dist/src/core/shaders/webgl/RadialGradient.d.ts +0 -3
  199. package/dist/src/core/shaders/webgl/RadialGradient.js +0 -74
  200. package/dist/src/core/shaders/webgl/RadialGradient.js.map +0 -1
  201. package/dist/src/core/shaders/webgl/Rounded.d.ts +0 -7
  202. package/dist/src/core/shaders/webgl/Rounded.js +0 -86
  203. package/dist/src/core/shaders/webgl/Rounded.js.map +0 -1
  204. package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +0 -3
  205. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +0 -140
  206. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +0 -1
  207. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +0 -3
  208. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +0 -162
  209. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +0 -1
  210. package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +0 -3
  211. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +0 -84
  212. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +0 -1
  213. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -32
  214. package/dist/src/core/shaders/webgl/SdfShader.js +0 -116
  215. package/dist/src/core/shaders/webgl/SdfShader.js.map +0 -1
  216. package/dist/src/core/shaders/webgl/Shadow.d.ts +0 -3
  217. package/dist/src/core/shaders/webgl/Shadow.js +0 -110
  218. package/dist/src/core/shaders/webgl/Shadow.js.map +0 -1
  219. package/dist/src/core/shaders/webgl/Spinner.d.ts +0 -1
  220. package/dist/src/core/shaders/webgl/Spinner.js +0 -2
  221. package/dist/src/core/shaders/webgl/Spinner.js.map +0 -1
  222. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +0 -25
  223. package/dist/src/core/text-rendering/CanvasFontHandler.js +0 -117
  224. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +0 -1
  225. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +0 -6
  226. package/dist/src/core/text-rendering/CanvasTextRenderer.js +0 -139
  227. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +0 -1
  228. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +0 -137
  229. package/dist/src/core/text-rendering/SdfFontHandler.js +0 -336
  230. package/dist/src/core/text-rendering/SdfFontHandler.js.map +0 -1
  231. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +0 -21
  232. package/dist/src/core/text-rendering/SdfTextRenderer.js +0 -324
  233. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +0 -1
  234. package/dist/src/core/text-rendering/TextRenderer.d.ts +0 -425
  235. package/dist/src/core/text-rendering/TextRenderer.js +0 -70
  236. package/dist/src/core/text-rendering/TextRenderer.js.map +0 -1
  237. package/dist/src/core/text-rendering/Utils.d.ts +0 -71
  238. package/dist/src/core/text-rendering/Utils.js +0 -212
  239. package/dist/src/core/text-rendering/Utils.js.map +0 -1
  240. package/dist/src/core/text-rendering/canvas/Settings.d.ts +0 -53
  241. package/dist/src/core/text-rendering/canvas/Settings.js +0 -20
  242. package/dist/src/core/text-rendering/canvas/Settings.js.map +0 -1
  243. package/dist/src/core/text-rendering/canvas/Utils.d.ts +0 -19
  244. package/dist/src/core/text-rendering/canvas/Utils.js +0 -139
  245. package/dist/src/core/text-rendering/canvas/Utils.js.map +0 -1
  246. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +0 -37
  247. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +0 -188
  248. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +0 -1
  249. package/dist/src/core/text-rendering/canvas/draw.d.ts +0 -12
  250. package/dist/src/core/text-rendering/canvas/draw.js +0 -133
  251. package/dist/src/core/text-rendering/canvas/draw.js.map +0 -1
  252. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +0 -12
  253. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +0 -61
  254. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +0 -1
  255. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +0 -45
  256. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +0 -69
  257. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +0 -1
@@ -103,9 +103,7 @@ export interface TextureData {
103
103
 
104
104
  export type TextureState =
105
105
  | 'initial' // Before anything is loaded
106
- | 'fetching' // Fetching or generating texture source
107
- | 'fetched' // Texture source is ready
108
- | 'loading' // Uploading to GPU
106
+ | 'loading' // Loading texture data and uploading to GPU
109
107
  | 'loaded' // Fully loaded and usable
110
108
  | 'failed' // Failed to load
111
109
  | 'freed'; // Released and must be reloaded
@@ -139,16 +137,10 @@ export abstract class Texture extends EventEmitter {
139
137
  private _dimensions: Dimensions | null = null;
140
138
  private _error: Error | null = null;
141
139
 
142
- /**
143
- * Texture states that are considered transitional and should be skipped during cleanup
144
- */
145
- public static readonly TRANSITIONAL_TEXTURE_STATES: readonly TextureState[] =
146
- ['fetching', 'fetched', 'loading'];
147
-
148
140
  // aggregate state
149
141
  public state: TextureState = 'initial';
150
142
 
151
- readonly renderableOwners = new Set<unknown>();
143
+ readonly renderableOwners: any[] = [];
152
144
 
153
145
  readonly renderable: boolean = false;
154
146
 
@@ -160,6 +152,34 @@ export abstract class Texture extends EventEmitter {
160
152
 
161
153
  public textureData: TextureData | null = null;
162
154
 
155
+ /**
156
+ * Memory used by this texture in bytes
157
+ *
158
+ * @remarks
159
+ * This is tracked by the TextureMemoryManager and updated when the texture
160
+ * is loaded/freed. Set to 0 when texture is not loaded.
161
+ */
162
+ public memUsed = 0;
163
+
164
+ public retryCount = 0;
165
+ public maxRetryCount: number | null = null;
166
+
167
+ /**
168
+ * Timestamp when texture was created (for startup grace period)
169
+ */
170
+ private createdAt: number = Date.now();
171
+
172
+ /**
173
+ * Flag to track if grace period has expired to avoid repeated Date.now() calls
174
+ */
175
+ private gracePeriodExpired: boolean = false;
176
+
177
+ /**
178
+ * Grace period in milliseconds to prevent premature cleanup during app startup
179
+ * This helps prevent race conditions when bounds calculation is delayed
180
+ */
181
+ private static readonly STARTUP_GRACE_PERIOD = 2000; // 2 seconds
182
+
163
183
  constructor(protected txManager: CoreTextureManager) {
164
184
  super();
165
185
  }
@@ -172,6 +192,59 @@ export abstract class Texture extends EventEmitter {
172
192
  return this._error;
173
193
  }
174
194
 
195
+ /**
196
+ * Checks if the texture is within the startup grace period.
197
+ * During this period, textures are protected from cleanup to prevent
198
+ * race conditions during app initialization.
199
+ */
200
+ isWithinStartupGracePeriod(): boolean {
201
+ // If grace period already expired, return false immediately
202
+ if (this.gracePeriodExpired) {
203
+ return false;
204
+ }
205
+
206
+ // Check if grace period has expired now
207
+ const hasExpired =
208
+ Date.now() - this.createdAt >= Texture.STARTUP_GRACE_PERIOD;
209
+
210
+ if (hasExpired) {
211
+ // Cache the result to avoid future Date.now() calls
212
+ this.gracePeriodExpired = true;
213
+ return false;
214
+ }
215
+
216
+ return true;
217
+ }
218
+
219
+ /**
220
+ * Checks if the texture can be safely cleaned up.
221
+ * Considers the renderable state, startup grace period, and renderable owners.
222
+ */
223
+ canBeCleanedUp(): boolean {
224
+ // Never cleanup if explicitly prevented
225
+ if (this.preventCleanup) {
226
+ return false;
227
+ }
228
+
229
+ // Don't cleanup if still within startup grace period
230
+ if (this.isWithinStartupGracePeriod()) {
231
+ return false;
232
+ }
233
+
234
+ // Don't cleanup if not renderable
235
+ if (this.renderable === true) {
236
+ return false;
237
+ }
238
+
239
+ // Don't cleanup if there are still renderable owners
240
+ if (this.renderableOwners.length > 0) {
241
+ return false;
242
+ }
243
+
244
+ // Safe to cleanup
245
+ return true;
246
+ }
247
+
175
248
  /**
176
249
  * Add/remove an owner to/from the Texture based on its renderability.
177
250
  *
@@ -186,33 +259,44 @@ export abstract class Texture extends EventEmitter {
186
259
  * @param owner
187
260
  * @param renderable
188
261
  */
189
- setRenderableOwner(owner: unknown, renderable: boolean): void {
190
- const oldSize = this.renderableOwners.size;
262
+ setRenderableOwner(owner: string | number, renderable: boolean): void {
263
+ const oldSize = this.renderableOwners.length;
264
+ const hasOwnerIndex = this.renderableOwners.indexOf(owner);
191
265
 
192
266
  if (renderable === true) {
193
- if (this.renderableOwners.has(owner) === false) {
267
+ if (hasOwnerIndex === -1) {
194
268
  // Add the owner to the set
195
- this.renderableOwners.add(owner);
269
+ this.renderableOwners.push(owner);
196
270
  }
197
271
 
198
- const newSize = this.renderableOwners.size;
199
- if (newSize > oldSize && newSize === 1) {
272
+ const newSize = this.renderableOwners.length;
273
+ if (oldSize !== newSize && newSize === 1) {
200
274
  (this.renderable as boolean) = true;
201
275
  this.onChangeIsRenderable?.(true);
202
276
  this.load();
203
277
  }
204
278
  } else {
205
- this.renderableOwners.delete(owner);
206
- const newSize = this.renderableOwners.size;
207
- if (newSize < oldSize && newSize === 0) {
279
+ if (hasOwnerIndex !== -1) {
280
+ this.renderableOwners.splice(hasOwnerIndex, 1);
281
+ }
282
+
283
+ const newSize = this.renderableOwners.length;
284
+ if (oldSize !== newSize && newSize === 0) {
208
285
  (this.renderable as boolean) = false;
209
286
  this.onChangeIsRenderable?.(false);
210
- this.txManager.orphanTexture(this);
287
+
288
+ // note, not doing a cleanup here, cleanup is managed by the Stage/TextureMemoryManager
289
+ // when it deems appropriate based on memory pressure
211
290
  }
212
291
  }
213
292
  }
214
293
 
215
294
  load(): void {
295
+ if (this.maxRetryCount !== null && this.retryCount > this.maxRetryCount) {
296
+ // We've exceeded the max retry count, do not attempt to load again
297
+ return;
298
+ }
299
+
216
300
  this.txManager.loadTexture(this);
217
301
  }
218
302
 
@@ -251,6 +335,18 @@ export abstract class Texture extends EventEmitter {
251
335
  this.ctxTexture?.free();
252
336
  }
253
337
 
338
+ /**
339
+ * Release the texture data and core context texture for this Texture without changing state.
340
+ *
341
+ * @remarks
342
+ * The ctxTexture is created by the renderer and lives on the GPU.
343
+ */
344
+ release(): void {
345
+ this.ctxTexture?.release();
346
+ this.ctxTexture = undefined;
347
+ this.freeTextureData();
348
+ }
349
+
254
350
  /**
255
351
  * Destroy the texture.
256
352
  *
@@ -276,7 +372,9 @@ export abstract class Texture extends EventEmitter {
276
372
  * e.g. ImageData that is downloaded from a URL.
277
373
  */
278
374
  freeTextureData(): void {
279
- this.textureData = null;
375
+ queueMicrotask(() => {
376
+ this.textureData = null;
377
+ });
280
378
  }
281
379
 
282
380
  public setState(
@@ -289,6 +387,9 @@ export abstract class Texture extends EventEmitter {
289
387
 
290
388
  let payload: Error | Dimensions | null = null;
291
389
  if (state === 'loaded') {
390
+ // Clear any previous error when successfully loading
391
+ this._error = null;
392
+
292
393
  if (
293
394
  errorOrDimensions !== undefined &&
294
395
  'width' in errorOrDimensions === true &&
@@ -303,6 +404,22 @@ export abstract class Texture extends EventEmitter {
303
404
  } else if (state === 'failed') {
304
405
  this._error = errorOrDimensions as Error;
305
406
  payload = this._error;
407
+
408
+ // increment the retry count for the texture
409
+ // this is used to compare against maxRetryCount, if set
410
+ // to determine if we should try loading again
411
+ this.retryCount += 1;
412
+
413
+ queueMicrotask(() => {
414
+ this.release();
415
+ });
416
+ } else if (state === 'loading') {
417
+ // Clear error and reset dimensions when starting to load
418
+ // This ensures stale dimensions from previous loads don't persist
419
+ this._error = null;
420
+ this._dimensions = null;
421
+ } else {
422
+ this._error = null;
306
423
  }
307
424
 
308
425
  // emit the new state
@@ -373,4 +490,16 @@ export abstract class Texture extends EventEmitter {
373
490
  ): Record<string, unknown> {
374
491
  return {};
375
492
  }
493
+
494
+ /**
495
+ * Retry the texture by resetting retryCount and setting state to 'initial'.
496
+ *
497
+ * @remarks
498
+ * This allows the texture to be loaded again.
499
+ */
500
+ public retry(): void {
501
+ this.release();
502
+ this.retryCount = 0;
503
+ this.load();
504
+ }
376
505
  }
@@ -8,6 +8,8 @@ import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
8
8
  import type { IAnimationController } from '../common/IAnimationController.js';
9
9
  import { isProductionEnvironment } from '../utils.js';
10
10
  import type { CoreTextNode, CoreTextNodeProps } from '../core/CoreTextNode.js';
11
+ import type { Texture } from '../core/textures/Texture.js';
12
+ import { TextureType } from '../core/textures/Texture.js';
11
13
 
12
14
  /**
13
15
  * Inspector
@@ -154,6 +156,22 @@ const gradientColorPropertyMap = [
154
156
  'colorBr',
155
157
  ];
156
158
 
159
+ const textureTypeNames: Record<number, string> = {
160
+ [TextureType.generic]: 'generic',
161
+ [TextureType.color]: 'color',
162
+ [TextureType.image]: 'image',
163
+ [TextureType.noise]: 'noise',
164
+ [TextureType.renderToTexture]: 'renderToTexture',
165
+ [TextureType.subTexture]: 'subTexture',
166
+ };
167
+
168
+ interface TextureMetrics {
169
+ previousState: string;
170
+ loadedCount: number;
171
+ failedCount: number;
172
+ freedCount: number;
173
+ }
174
+
157
175
  const knownProperties = new Set<string>([
158
176
  ...Object.keys(stylePropertyMap),
159
177
  ...Object.keys(domPropertyMap),
@@ -161,6 +179,7 @@ const knownProperties = new Set<string>([
161
179
  'src',
162
180
  'parent',
163
181
  'data',
182
+ 'texture',
164
183
  ]);
165
184
 
166
185
  export class Inspector {
@@ -170,6 +189,7 @@ export class Inspector {
170
189
  private width = 1920;
171
190
  private scaleX = 1;
172
191
  private scaleY = 1;
192
+ private textureMetrics = new Map<Texture, TextureMetrics>();
173
193
 
174
194
  constructor(canvas: HTMLCanvasElement, settings: RendererMainSettings) {
175
195
  if (isProductionEnvironment()) return;
@@ -284,6 +304,79 @@ export class Inspector {
284
304
  node: CoreNode | CoreTextNode,
285
305
  div: HTMLElement,
286
306
  ): CoreNode | CoreTextNode {
307
+ // Store texture event listeners for cleanup
308
+ const textureListeners = new Map<
309
+ Texture,
310
+ {
311
+ onLoaded: () => void;
312
+ onFailed: () => void;
313
+ onFreed: () => void;
314
+ }
315
+ >();
316
+
317
+ // Helper function to setup texture event listeners
318
+ const setupTextureListeners = (texture: Texture | null) => {
319
+ // Clean up existing listeners first
320
+ textureListeners.forEach((listeners, oldTexture) => {
321
+ oldTexture.off('loaded', listeners.onLoaded);
322
+ oldTexture.off('failed', listeners.onFailed);
323
+ oldTexture.off('freed', listeners.onFreed);
324
+ });
325
+ textureListeners.clear();
326
+
327
+ // Setup new listeners if texture exists
328
+ if (texture) {
329
+ // Initialize metrics if not exists
330
+ if (!this.textureMetrics.has(texture)) {
331
+ this.textureMetrics.set(texture, {
332
+ previousState: texture.state,
333
+ loadedCount: 0,
334
+ failedCount: 0,
335
+ freedCount: 0,
336
+ });
337
+ }
338
+
339
+ const onLoaded = () => {
340
+ const metrics = this.textureMetrics.get(texture);
341
+ if (metrics) {
342
+ metrics.previousState =
343
+ metrics.previousState !== texture.state
344
+ ? metrics.previousState
345
+ : 'loading';
346
+ metrics.loadedCount++;
347
+ }
348
+ this.updateTextureAttributes(div, texture);
349
+ };
350
+ const onFailed = () => {
351
+ const metrics = this.textureMetrics.get(texture);
352
+ if (metrics) {
353
+ metrics.previousState =
354
+ metrics.previousState !== texture.state
355
+ ? metrics.previousState
356
+ : 'loading';
357
+ metrics.failedCount++;
358
+ }
359
+ this.updateTextureAttributes(div, texture);
360
+ };
361
+ const onFreed = () => {
362
+ const metrics = this.textureMetrics.get(texture);
363
+ if (metrics) {
364
+ metrics.previousState =
365
+ metrics.previousState !== texture.state
366
+ ? metrics.previousState
367
+ : texture.state;
368
+ metrics.freedCount++;
369
+ }
370
+ this.updateTextureAttributes(div, texture);
371
+ };
372
+
373
+ texture.on('loaded', onLoaded);
374
+ texture.on('failed', onFailed);
375
+ texture.on('freed', onFreed);
376
+
377
+ textureListeners.set(texture, { onLoaded, onFailed, onFreed });
378
+ }
379
+ };
287
380
  // Define traps for each property in knownProperties
288
381
  knownProperties.forEach((property) => {
289
382
  let originalProp = Object.getOwnPropertyDescriptor(node, property);
@@ -311,6 +404,15 @@ export class Inspector {
311
404
  value,
312
405
  node.props,
313
406
  );
407
+
408
+ // Setup texture event listeners if this is a texture property
409
+ if (property === 'texture') {
410
+ const textureValue =
411
+ value && typeof value === 'object' && 'state' in value
412
+ ? (value as Texture)
413
+ : null;
414
+ setupTextureListeners(textureValue);
415
+ }
314
416
  },
315
417
  configurable: true,
316
418
  enumerable: true,
@@ -320,11 +422,26 @@ export class Inspector {
320
422
  const originalDestroy = node.destroy;
321
423
  Object.defineProperty(node, 'destroy', {
322
424
  value: () => {
425
+ // Clean up texture event listeners and metrics
426
+ textureListeners.forEach((listeners, texture) => {
427
+ texture.off('loaded', listeners.onLoaded);
428
+ texture.off('failed', listeners.onFailed);
429
+ texture.off('freed', listeners.onFreed);
430
+ // Clean up metrics for this texture
431
+ this.textureMetrics.delete(texture);
432
+ });
433
+ textureListeners.clear();
434
+
323
435
  this.destroyNode(node.id);
324
436
  originalDestroy.call(node);
325
437
  },
326
438
  });
327
439
 
440
+ // Setup initial texture listeners if node already has a texture
441
+ if (node.texture) {
442
+ setupTextureListeners(node.texture);
443
+ }
444
+
328
445
  const originalAnimate = node.animate;
329
446
  Object.defineProperty(node, 'animate', {
330
447
  value: (
@@ -353,6 +470,75 @@ export class Inspector {
353
470
  div?.remove();
354
471
  }
355
472
 
473
+ updateTextureAttributes(div: HTMLElement, texture: Texture) {
474
+ // Update texture state
475
+ div.setAttribute('data-texture-state', texture.state);
476
+
477
+ // Update texture type
478
+ div.setAttribute(
479
+ 'data-texture-type',
480
+ textureTypeNames[texture.type] || 'unknown',
481
+ );
482
+
483
+ // Update texture dimensions if available
484
+ if (texture.dimensions) {
485
+ div.setAttribute('data-texture-width', String(texture.dimensions.width));
486
+ div.setAttribute(
487
+ 'data-texture-height',
488
+ String(texture.dimensions.height),
489
+ );
490
+ } else {
491
+ div.removeAttribute('data-texture-width');
492
+ div.removeAttribute('data-texture-height');
493
+ }
494
+
495
+ // Update renderable owners count
496
+ div.setAttribute(
497
+ 'data-texture-owners',
498
+ String(texture.renderableOwners.length),
499
+ );
500
+
501
+ // Update retry count
502
+ div.setAttribute('data-texture-retry-count', String(texture.retryCount));
503
+
504
+ // Update max retry count if available
505
+ if (texture.maxRetryCount !== null) {
506
+ div.setAttribute(
507
+ 'data-texture-max-retry-count',
508
+ String(texture.maxRetryCount),
509
+ );
510
+ } else {
511
+ div.removeAttribute('data-texture-max-retry-count');
512
+ }
513
+
514
+ // Update metrics if available
515
+ const metrics = this.textureMetrics.get(texture);
516
+ if (metrics) {
517
+ div.setAttribute('data-texture-previous-state', metrics.previousState);
518
+ div.setAttribute(
519
+ 'data-texture-loaded-count',
520
+ String(metrics.loadedCount),
521
+ );
522
+ div.setAttribute(
523
+ 'data-texture-failed-count',
524
+ String(metrics.failedCount),
525
+ );
526
+ div.setAttribute('data-texture-freed-count', String(metrics.freedCount));
527
+ } else {
528
+ div.removeAttribute('data-texture-previous-state');
529
+ div.removeAttribute('data-texture-loaded-count');
530
+ div.removeAttribute('data-texture-failed-count');
531
+ div.removeAttribute('data-texture-freed-count');
532
+ }
533
+
534
+ // Update error information if present
535
+ if (texture.error) {
536
+ div.setAttribute('data-texture-error', texture.error.message);
537
+ } else {
538
+ div.removeAttribute('data-texture-error');
539
+ }
540
+ }
541
+
356
542
  updateNodeProperty(
357
543
  div: HTMLElement,
358
544
  property: keyof CoreNodeProps | keyof CoreTextNodeProps,
@@ -413,6 +599,23 @@ export class Inspector {
413
599
  return;
414
600
  }
415
601
 
602
+ // special case for texture information
603
+ if (property === 'texture') {
604
+ if (value && typeof value === 'object' && 'state' in value) {
605
+ const texture = value as Texture;
606
+ this.updateTextureAttributes(div, texture);
607
+ } else {
608
+ // Remove all texture attributes when texture is null
609
+ div.removeAttribute('data-texture-state');
610
+ div.removeAttribute('data-texture-type');
611
+ div.removeAttribute('data-texture-width');
612
+ div.removeAttribute('data-texture-height');
613
+ div.removeAttribute('data-texture-owners');
614
+ div.removeAttribute('data-texture-error');
615
+ }
616
+ return;
617
+ }
618
+
416
619
  // CSS mappable attribute
417
620
  if (stylePropertyMap[property]) {
418
621
  const mappedStyleResponse = stylePropertyMap[property]?.(value);
@@ -739,8 +739,6 @@ export class RendererMain extends EventEmitter {
739
739
  /**
740
740
  * Cleanup textures that are not being used
741
741
  *
742
- * @param aggressive - If true, will cleanup all textures, regardless of render status
743
- *
744
742
  * @remarks
745
743
  * This can be used to free up GFX memory used by textures that are no longer
746
744
  * being displayed.
@@ -754,8 +752,8 @@ export class RendererMain extends EventEmitter {
754
752
  * **NOTE3**: This will not cleanup textures that are marked as `preventCleanup`.
755
753
  * **NOTE4**: This has nothing to do with the garbage collection of JavaScript.
756
754
  */
757
- cleanup(aggressive: boolean = false) {
758
- this.stage.cleanup(aggressive);
755
+ cleanup() {
756
+ this.stage.cleanup();
759
757
  }
760
758
 
761
759
  /**
@@ -1,10 +0,0 @@
1
- export * from '../src/core/renderers/canvas/CanvasShaderNode.js';
2
- export { Rounded } from '../src/core/shaders/canvas/Rounded.js';
3
- export { RoundedWithBorder } from '../src/core/shaders/canvas/RoundedWithBorder.js';
4
- export { RoundedWithBorderAndShadow } from '../src/core/shaders/canvas/RoundedWithBorderAndShadow.js';
5
- export { RoundedWithShadow } from '../src/core/shaders/canvas/RoundedWithShadow.js';
6
- export { Border } from '../src/core/shaders/canvas/Border.js';
7
- export { Shadow } from '../src/core/shaders/canvas/Shadow.js';
8
- export { HolePunch } from '../src/core/shaders/canvas/HolePunch.js';
9
- export { LinearGradient } from '../src/core/shaders/canvas/LinearGradient.js';
10
- export { RadialGradient } from '../src/core/shaders/canvas/RadialGradient.js';
@@ -1,27 +0,0 @@
1
- /*
2
- * Copyright 2023 Comcast Cable Communications Management, LLC
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at
6
- *
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software
10
- * distributed under the License is distributed on an "AS IS" BASIS,
11
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- * See the License for the specific language governing permissions and
13
- * limitations under the License.
14
- *
15
- * SPDX-License-Identifier: Apache-2.0
16
- */
17
- export * from '../src/core/renderers/canvas/CanvasShaderNode.js';
18
- export { Rounded } from '../src/core/shaders/canvas/Rounded.js';
19
- export { RoundedWithBorder } from '../src/core/shaders/canvas/RoundedWithBorder.js';
20
- export { RoundedWithBorderAndShadow } from '../src/core/shaders/canvas/RoundedWithBorderAndShadow.js';
21
- export { RoundedWithShadow } from '../src/core/shaders/canvas/RoundedWithShadow.js';
22
- export { Border } from '../src/core/shaders/canvas/Border.js';
23
- export { Shadow } from '../src/core/shaders/canvas/Shadow.js';
24
- export { HolePunch } from '../src/core/shaders/canvas/HolePunch.js';
25
- export { LinearGradient } from '../src/core/shaders/canvas/LinearGradient.js';
26
- export { RadialGradient } from '../src/core/shaders/canvas/RadialGradient.js';
27
- //# sourceMappingURL=canvas-shaders.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canvas-shaders.js","sourceRoot":"","sources":["../../exports/canvas-shaders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,cAAc,kDAAkD,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0DAA0D,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC"}
@@ -1,11 +0,0 @@
1
- export * from '../src/core/renderers/webgl/WebGlShaderNode.js';
2
- export { Rounded } from '../src/core/shaders/webgl/Rounded.js';
3
- export { RoundedWithBorder } from '../src/core/shaders/webgl/RoundedWithBorder.js';
4
- export { RoundedWithBorderAndShadow } from '../src/core/shaders/webgl/RoundedWithBorderAndShadow.js';
5
- export { RoundedWithShadow } from '../src/core/shaders/webgl/RoundedWithShadow.js';
6
- export { Border } from '../src/core/shaders/webgl/Border.js';
7
- export { Shadow } from '../src/core/shaders/webgl/Shadow.js';
8
- export { HolePunch } from '../src/core/shaders/webgl/HolePunch.js';
9
- export { LinearGradient } from '../src/core/shaders/webgl/LinearGradient.js';
10
- export { RadialGradient } from '../src/core/shaders/webgl/RadialGradient.js';
11
- export { Default } from '../src/core/shaders/webgl/Default.js';
@@ -1,28 +0,0 @@
1
- /*
2
- * Copyright 2023 Comcast Cable Communications Management, LLC
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at
6
- *
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software
10
- * distributed under the License is distributed on an "AS IS" BASIS,
11
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- * See the License for the specific language governing permissions and
13
- * limitations under the License.
14
- *
15
- * SPDX-License-Identifier: Apache-2.0
16
- */
17
- export * from '../src/core/renderers/webgl/WebGlShaderNode.js';
18
- export { Rounded } from '../src/core/shaders/webgl/Rounded.js';
19
- export { RoundedWithBorder } from '../src/core/shaders/webgl/RoundedWithBorder.js';
20
- export { RoundedWithBorderAndShadow } from '../src/core/shaders/webgl/RoundedWithBorderAndShadow.js';
21
- export { RoundedWithShadow } from '../src/core/shaders/webgl/RoundedWithShadow.js';
22
- export { Border } from '../src/core/shaders/webgl/Border.js';
23
- export { Shadow } from '../src/core/shaders/webgl/Shadow.js';
24
- export { HolePunch } from '../src/core/shaders/webgl/HolePunch.js';
25
- export { LinearGradient } from '../src/core/shaders/webgl/LinearGradient.js';
26
- export { RadialGradient } from '../src/core/shaders/webgl/RadialGradient.js';
27
- export { Default } from '../src/core/shaders/webgl/Default.js';
28
- //# sourceMappingURL=webgl-shaders.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webgl-shaders.js","sourceRoot":"","sources":["../../exports/webgl-shaders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,cAAc,gDAAgD,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC"}
@@ -1,37 +0,0 @@
1
- import { type Stage } from '../Stage.js';
2
- export declare abstract class Platform {
3
- /**
4
- * Creates a new canvas element.
5
- * @returns The created HTMLCanvasElement.
6
- */
7
- abstract createCanvas(): HTMLCanvasElement;
8
- /**
9
- * Get a DOM element by ID
10
- * @returns The DOM element (or null)
11
- */
12
- abstract getElementById(id: string): HTMLElement | null;
13
- /**
14
- * Starts the main rendering loop, calling the provided update function every frame.
15
- * @param Stage - The stage for rendering
16
- */
17
- abstract startLoop(stage: Stage): void;
18
- /**
19
- * Abstracted createImageBitmap method.
20
- * @param blob - The image source to create the ImageBitmap from.
21
- * @param sxOrOptions - The source rectangle x coordinate or ImageBitmapOptions.
22
- * @param sy - The source rectangle y coordinate.
23
- * @param sw - The source rectangle width.
24
- * @param sh - The source rectangle height.
25
- * @param options - The ImageBitmapOptions.
26
- * @returns A promise that resolves with the created ImageBitmap.
27
- */
28
- abstract createImageBitmap(blob: ImageBitmapSource): Promise<ImageBitmap>;
29
- abstract createImageBitmap(blob: ImageBitmapSource, options: ImageBitmapOptions): Promise<ImageBitmap>;
30
- abstract createImageBitmap(blob: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number): Promise<ImageBitmap>;
31
- abstract createImageBitmap(blob: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options: ImageBitmapOptions): Promise<ImageBitmap>;
32
- /**
33
- * Retrieves the current timestamp.
34
- * @returns The current timestamp.
35
- */
36
- abstract getTimeStamp(): number;
37
- }