@lightningjs/renderer 2.7.2 → 2.9.0-beta1

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 (247) hide show
  1. package/README.md +7 -4
  2. package/dist/src/common/EventEmitter.js.map +1 -1
  3. package/dist/src/core/CoreNode.d.ts +2 -0
  4. package/dist/src/core/CoreNode.js +27 -8
  5. package/dist/src/core/CoreNode.js.map +1 -1
  6. package/dist/src/core/CoreShaderManager.js.map +1 -1
  7. package/dist/src/core/CoreTextNode.js.map +1 -1
  8. package/dist/src/core/CoreTextureManager.d.ts +13 -1
  9. package/dist/src/core/CoreTextureManager.js +163 -7
  10. package/dist/src/core/CoreTextureManager.js.map +1 -1
  11. package/dist/src/core/Stage.d.ts +1 -0
  12. package/dist/src/core/Stage.js +5 -1
  13. package/dist/src/core/Stage.js.map +1 -1
  14. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  15. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  16. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  17. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  18. package/dist/src/core/lib/ImageWorker.d.ts +2 -1
  19. package/dist/src/core/lib/ImageWorker.js +40 -11
  20. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  21. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  22. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  23. package/dist/src/core/lib/WebGlContextWrapper.d.ts +10 -0
  24. package/dist/src/core/lib/WebGlContextWrapper.js +15 -0
  25. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  26. package/dist/src/core/lib/textureCompression.js.map +1 -1
  27. package/dist/src/core/lib/utils.js.map +1 -1
  28. package/dist/src/core/platform.js.map +1 -1
  29. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -0
  30. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  31. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +6 -0
  32. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +11 -3
  33. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  34. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  35. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +1 -0
  36. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +38 -0
  37. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  38. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  39. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
  40. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  41. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +9 -3
  42. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
  43. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +8 -1
  44. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +29 -8
  45. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  46. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +6 -1
  47. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  48. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +4 -0
  49. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +1 -1
  50. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +4 -3
  52. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  53. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  55. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  56. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
  57. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  58. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  59. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
  60. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  61. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -1
  62. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +3 -4
  63. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  64. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
  65. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
  66. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
  67. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  68. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  69. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +4 -4
  70. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  71. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +1 -1
  72. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -1
  73. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +1 -1
  74. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  75. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +1 -1
  76. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -1
  77. package/dist/src/core/text-rendering/renderers/TextRenderer.js +1 -1
  78. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  79. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  80. package/dist/src/core/textures/ImageTexture.d.ts +8 -0
  81. package/dist/src/core/textures/ImageTexture.js +52 -39
  82. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  83. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  84. package/dist/src/core/textures/SubTexture.js.map +1 -1
  85. package/dist/src/core/textures/Texture.js.map +1 -1
  86. package/dist/src/core/utils.d.ts +1 -1
  87. package/dist/src/core/utils.js.map +1 -1
  88. package/dist/src/main-api/DynamicShaderController.js.map +1 -1
  89. package/dist/src/main-api/ICoreDriver.d.ts +1 -4
  90. package/dist/src/main-api/Inspector.js.map +1 -1
  91. package/dist/src/main-api/Renderer.d.ts +6 -0
  92. package/dist/src/main-api/Renderer.js +8 -0
  93. package/dist/src/main-api/Renderer.js.map +1 -1
  94. package/dist/src/main-api/RendererMain.d.ts +5 -2
  95. package/dist/src/main-api/RendererMain.js +6 -4
  96. package/dist/src/main-api/RendererMain.js.map +1 -1
  97. package/dist/src/main-api/ShaderController.js.map +1 -1
  98. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -1
  99. package/dist/src/main-api/utils.js.map +1 -1
  100. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +1 -4
  101. package/dist/src/render-drivers/main/MainCoreDriver.js +1 -4
  102. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  103. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +8 -6
  104. package/dist/src/render-drivers/main/MainOnlyNode.js +30 -1
  105. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  106. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +1 -1
  107. package/dist/src/render-drivers/main/MainOnlyTextNode.js +2 -3
  108. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  109. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +3 -0
  110. package/dist/src/render-drivers/threadx/NodeStruct.js +9 -0
  111. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
  112. package/dist/src/render-drivers/threadx/SharedNode.d.ts +1 -0
  113. package/dist/src/render-drivers/threadx/SharedNode.js +1 -0
  114. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
  115. package/dist/src/render-drivers/threadx/TextNodeStruct.js +3 -1
  116. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -1
  117. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +1 -4
  118. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +2 -4
  119. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  120. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +8 -4
  121. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +53 -24
  122. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +1 -1
  123. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +7 -5
  124. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +8 -2
  125. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -1
  126. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -1
  127. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +7 -0
  128. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
  129. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +1 -0
  130. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  131. package/dist/src/render-drivers/threadx/worker/renderer.js +2 -0
  132. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  133. package/dist/src/render-drivers/utils.js +6 -1
  134. package/dist/src/render-drivers/utils.js.map +1 -1
  135. package/dist/src/utils.js.map +1 -1
  136. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  137. package/dist/tsconfig.tsbuildinfo +1 -0
  138. package/package.json +10 -11
  139. package/src/core/CoreNode.ts +30 -9
  140. package/src/core/CoreTextureManager.ts +188 -10
  141. package/src/core/Stage.ts +5 -0
  142. package/src/core/lib/ImageWorker.ts +63 -11
  143. package/src/core/lib/WebGlContextWrapper.ts +16 -0
  144. package/src/core/renderers/CoreRenderer.ts +1 -0
  145. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +18 -3
  146. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +93 -0
  147. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +12 -5
  148. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +35 -5
  149. package/src/core/renderers/webgl/WebGlCoreShader.ts +7 -1
  150. package/src/core/renderers/webgl/internal/RendererUtils.ts +5 -0
  151. package/src/core/renderers/webgl/internal/ShaderUtils.ts +9 -3
  152. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +6 -4
  153. package/src/core/textures/ImageTexture.ts +78 -45
  154. package/src/main-api/Renderer.ts +9 -0
  155. package/dist/src/core/CoreStuff.d.ts +0 -1
  156. package/dist/src/core/CoreStuff.js +0 -138
  157. package/dist/src/core/CoreStuff.js.map +0 -1
  158. package/dist/src/core/LngNode.d.ts +0 -736
  159. package/dist/src/core/LngNode.js +0 -1174
  160. package/dist/src/core/LngNode.js.map +0 -1
  161. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  162. package/dist/src/core/Matrix2DContext.js +0 -45
  163. package/dist/src/core/Matrix2DContext.js.map +0 -1
  164. package/dist/src/core/ShaderNode.d.ts +0 -10
  165. package/dist/src/core/ShaderNode.js +0 -30
  166. package/dist/src/core/ShaderNode.js.map +0 -1
  167. package/dist/src/core/TextNode.d.ts +0 -103
  168. package/dist/src/core/TextNode.js +0 -331
  169. package/dist/src/core/TextNode.js.map +0 -1
  170. package/dist/src/core/lib/Coords.d.ts +0 -14
  171. package/dist/src/core/lib/Coords.js +0 -55
  172. package/dist/src/core/lib/Coords.js.map +0 -1
  173. package/dist/src/core/lib/glm/common.d.ts +0 -162
  174. package/dist/src/core/lib/glm/common.js +0 -81
  175. package/dist/src/core/lib/glm/common.js.map +0 -1
  176. package/dist/src/core/lib/glm/index.d.ts +0 -11
  177. package/dist/src/core/lib/glm/index.js +0 -30
  178. package/dist/src/core/lib/glm/index.js.map +0 -1
  179. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  180. package/dist/src/core/lib/glm/mat2.js +0 -396
  181. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  182. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  183. package/dist/src/core/lib/glm/mat2d.js +0 -442
  184. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  185. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  186. package/dist/src/core/lib/glm/mat3.js +0 -680
  187. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  188. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  189. package/dist/src/core/lib/glm/mat4.js +0 -1802
  190. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  191. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  192. package/dist/src/core/lib/glm/quat.js +0 -693
  193. package/dist/src/core/lib/glm/quat.js.map +0 -1
  194. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  195. package/dist/src/core/lib/glm/quat2.js +0 -754
  196. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  197. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  198. package/dist/src/core/lib/glm/vec2.js +0 -569
  199. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  200. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  201. package/dist/src/core/lib/glm/vec3.js +0 -720
  202. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  203. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  204. package/dist/src/core/lib/glm/vec4.js +0 -608
  205. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  206. package/dist/src/core/renderers/CoreShaderManager.d.ts +0 -19
  207. package/dist/src/core/renderers/CoreShaderManager.js +0 -33
  208. package/dist/src/core/renderers/CoreShaderManager.js.map +0 -1
  209. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +0 -27
  210. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +0 -82
  211. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +0 -1
  212. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +0 -11
  213. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +0 -34
  214. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +0 -1
  215. package/dist/src/core/scene/Scene.d.ts +0 -59
  216. package/dist/src/core/scene/Scene.js +0 -106
  217. package/dist/src/core/scene/Scene.js.map +0 -1
  218. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +0 -20
  219. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +0 -55
  220. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +0 -1
  221. package/dist/src/main-api/IRenderDriver.d.ts +0 -20
  222. package/dist/src/main-api/IRenderDriver.js +0 -20
  223. package/dist/src/main-api/IRenderDriver.js.map +0 -1
  224. package/dist/src/main-api/IShaderController.d.ts +0 -14
  225. package/dist/src/main-api/IShaderController.js +0 -30
  226. package/dist/src/main-api/IShaderController.js.map +0 -1
  227. package/dist/src/main-api/IShaderNode.d.ts +0 -17
  228. package/dist/src/main-api/IShaderNode.js +0 -19
  229. package/dist/src/main-api/IShaderNode.js.map +0 -1
  230. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +0 -6
  231. package/dist/src/render-drivers/main/MainOnlyShaderController.js +0 -15
  232. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +0 -1
  233. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +0 -7
  234. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +0 -34
  235. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +0 -1
  236. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +0 -17
  237. package/dist/src/render-drivers/main/MainRenderDriver.js +0 -88
  238. package/dist/src/render-drivers/main/MainRenderDriver.js.map +0 -1
  239. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +0 -6
  240. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +0 -16
  241. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +0 -1
  242. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +0 -7
  243. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +0 -15
  244. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +0 -1
  245. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +0 -21
  246. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +0 -198
  247. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +0 -1
@@ -25,6 +25,7 @@ import { NoiseTexture } from './textures/NoiseTexture.js';
25
25
  import { SubTexture } from './textures/SubTexture.js';
26
26
  import { RenderTexture } from './textures/RenderTexture.js';
27
27
  import type { Texture } from './textures/Texture.js';
28
+ import { EventEmitter } from '../common/EventEmitter.js';
28
29
 
29
30
  /**
30
31
  * Augmentable map of texture class types
@@ -42,6 +43,12 @@ export interface TextureMap {
42
43
  RenderTexture: typeof RenderTexture;
43
44
  }
44
45
 
46
+ export interface CreateImageBitmapSupport {
47
+ basic: boolean; // Supports createImageBitmap(image)
48
+ options: boolean; // Supports createImageBitmap(image, options)
49
+ full: boolean; // Supports createImageBitmap(image, sx, sy, sw, sh, options)
50
+ }
51
+
45
52
  export type ExtractProps<Type> = Type extends { z$__type__Props: infer Props }
46
53
  ? Props
47
54
  : never;
@@ -138,7 +145,7 @@ export interface TextureOptions {
138
145
  resizeMode?: ResizeModeOptions;
139
146
  }
140
147
 
141
- export class CoreTextureManager {
148
+ export class CoreTextureManager extends EventEmitter {
142
149
  /**
143
150
  * Map of textures by cache key
144
151
  */
@@ -156,6 +163,12 @@ export class CoreTextureManager {
156
163
 
157
164
  imageWorkerManager: ImageWorkerManager | null = null;
158
165
  hasCreateImageBitmap = !!self.createImageBitmap;
166
+ imageBitmapSupported = {
167
+ basic: false,
168
+ options: false,
169
+ full: false,
170
+ };
171
+
159
172
  hasWorker = !!self.Worker;
160
173
  /**
161
174
  * Renderer that this texture manager is associated with
@@ -178,16 +191,44 @@ export class CoreTextureManager {
178
191
  frameTime = 0;
179
192
 
180
193
  constructor(numImageWorkers: number) {
181
- // Register default known texture types
182
- if (this.hasCreateImageBitmap && this.hasWorker && numImageWorkers > 0) {
183
- this.imageWorkerManager = new ImageWorkerManager(numImageWorkers);
184
- }
194
+ super();
195
+ this.validateCreateImageBitmap()
196
+ .then((result) => {
197
+ this.hasCreateImageBitmap =
198
+ result.basic || result.options || result.full;
199
+ this.imageBitmapSupported = result;
185
200
 
186
- if (!this.hasCreateImageBitmap) {
187
- console.warn(
188
- '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
189
- );
190
- }
201
+ if (!this.hasCreateImageBitmap) {
202
+ console.warn(
203
+ '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
204
+ );
205
+ }
206
+
207
+ if (
208
+ this.hasCreateImageBitmap &&
209
+ this.hasWorker &&
210
+ numImageWorkers > 0
211
+ ) {
212
+ this.imageWorkerManager = new ImageWorkerManager(
213
+ numImageWorkers,
214
+ result,
215
+ );
216
+ } else {
217
+ console.warn(
218
+ '[Lightning] Imageworker is 0 or not supported on this browser. Image loading will be slower.',
219
+ );
220
+ }
221
+
222
+ this.emit('initialized');
223
+ })
224
+ .catch((e) => {
225
+ console.warn(
226
+ '[Lightning] createImageBitmap is not supported on this browser. ImageTexture will be slower.',
227
+ );
228
+
229
+ // initialized without image worker manager and createImageBitmap
230
+ this.emit('initialized');
231
+ });
191
232
 
192
233
  this.registerTextureType('ImageTexture', ImageTexture);
193
234
  this.registerTextureType('ColorTexture', ColorTexture);
@@ -196,6 +237,143 @@ export class CoreTextureManager {
196
237
  this.registerTextureType('RenderTexture', RenderTexture);
197
238
  }
198
239
 
240
+ private async validateCreateImageBitmap(): Promise<CreateImageBitmapSupport> {
241
+ // Test if createImageBitmap is supported using a simple 1x1 PNG image
242
+ // prettier-ignore (this is a binary PNG image)
243
+ const pngBinaryData = new Uint8Array([
244
+ 0x89,
245
+ 0x50,
246
+ 0x4e,
247
+ 0x47,
248
+ 0x0d,
249
+ 0x0a,
250
+ 0x1a,
251
+ 0x0a, // PNG signature
252
+ 0x00,
253
+ 0x00,
254
+ 0x00,
255
+ 0x0d, // IHDR chunk length
256
+ 0x49,
257
+ 0x48,
258
+ 0x44,
259
+ 0x52, // "IHDR" chunk type
260
+ 0x00,
261
+ 0x00,
262
+ 0x00,
263
+ 0x01, // Width: 1
264
+ 0x00,
265
+ 0x00,
266
+ 0x00,
267
+ 0x01, // Height: 1
268
+ 0x01, // Bit depth: 1
269
+ 0x03, // Color type: Indexed
270
+ 0x00, // Compression method: Deflate
271
+ 0x00, // Filter method: None
272
+ 0x00, // Interlace method: None
273
+ 0x25,
274
+ 0xdb,
275
+ 0x56,
276
+ 0xca, // CRC for IHDR
277
+ 0x00,
278
+ 0x00,
279
+ 0x00,
280
+ 0x03, // PLTE chunk length
281
+ 0x50,
282
+ 0x4c,
283
+ 0x54,
284
+ 0x45, // "PLTE" chunk type
285
+ 0x00,
286
+ 0x00,
287
+ 0x00, // Palette entry: Black
288
+ 0xa7,
289
+ 0x7a,
290
+ 0x3d,
291
+ 0xda, // CRC for PLTE
292
+ 0x00,
293
+ 0x00,
294
+ 0x00,
295
+ 0x01, // tRNS chunk length
296
+ 0x74,
297
+ 0x52,
298
+ 0x4e,
299
+ 0x53, // "tRNS" chunk type
300
+ 0x00, // Transparency for black: Fully transparent
301
+ 0x40,
302
+ 0xe6,
303
+ 0xd8,
304
+ 0x66, // CRC for tRNS
305
+ 0x00,
306
+ 0x00,
307
+ 0x00,
308
+ 0x0a, // IDAT chunk length
309
+ 0x49,
310
+ 0x44,
311
+ 0x41,
312
+ 0x54, // "IDAT" chunk type
313
+ 0x08,
314
+ 0xd7, // Deflate header
315
+ 0x63,
316
+ 0x60,
317
+ 0x00,
318
+ 0x00,
319
+ 0x00,
320
+ 0x02,
321
+ 0x00,
322
+ 0x01, // Zlib-compressed data
323
+ 0xe2,
324
+ 0x21,
325
+ 0xbc,
326
+ 0x33, // CRC for IDAT
327
+ 0x00,
328
+ 0x00,
329
+ 0x00,
330
+ 0x00, // IEND chunk length
331
+ 0x49,
332
+ 0x45,
333
+ 0x4e,
334
+ 0x44, // "IEND" chunk type
335
+ 0xae,
336
+ 0x42,
337
+ 0x60,
338
+ 0x82, // CRC for IEND
339
+ ]);
340
+
341
+ const support: CreateImageBitmapSupport = {
342
+ basic: false,
343
+ options: false,
344
+ full: false,
345
+ };
346
+
347
+ // Test basic createImageBitmap support
348
+ const blob = new Blob([pngBinaryData], { type: 'image/png' });
349
+ const bitmap = await createImageBitmap(blob);
350
+ bitmap.close?.();
351
+ support.basic = true;
352
+
353
+ // Test createImageBitmap with options support
354
+ try {
355
+ const options = { premultiplyAlpha: 'none' as const };
356
+ const bitmapWithOptions = await createImageBitmap(blob, options);
357
+ bitmapWithOptions.close?.();
358
+ support.options = true;
359
+ } catch (e) {
360
+ /* ignore */
361
+ }
362
+
363
+ // Test createImageBitmap with full options support
364
+ try {
365
+ const bitmapWithFullOptions = await createImageBitmap(blob, 0, 0, 1, 1, {
366
+ premultiplyAlpha: 'none',
367
+ });
368
+ bitmapWithFullOptions.close?.();
369
+ support.full = true;
370
+ } catch (e) {
371
+ /* ignore */
372
+ }
373
+
374
+ return support;
375
+ }
376
+
199
377
  registerTextureType<Type extends keyof TextureMap>(
200
378
  textureType: Type,
201
379
  textureClass: TextureMap[Type],
package/src/core/Stage.ts CHANGED
@@ -266,6 +266,11 @@ export class Stage {
266
266
  }
267
267
  }
268
268
 
269
+ setClearColor(color: number) {
270
+ this.renderer.updateClearColor(color);
271
+ this.renderRequested = true;
272
+ }
273
+
269
274
  updateFrameTime() {
270
275
  const newFrameTime = getTimeStamp();
271
276
  this.lastFrameTime = this.currentFrameTime;
@@ -17,6 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
+ import type { CreateImageBitmapSupport } from '../CoreTextureManager.js';
20
21
  import { type TextureData } from '../textures/Texture.js';
21
22
 
22
23
  type MessageCallback = [(value: any) => void, (reason: any) => void];
@@ -47,6 +48,9 @@ interface ImageWorkerMessage {
47
48
 
48
49
  /* eslint-disable */
49
50
  function createImageWorker() {
51
+ var supportsOptionsCreateImageBitmap = false;
52
+ var supportsFullCreateImageBitmap = false;
53
+
50
54
  function hasAlphaChannel(mimeType: string) {
51
55
  return mimeType.indexOf('image/png') !== -1;
52
56
  }
@@ -75,7 +79,12 @@ function createImageWorker() {
75
79
  ? premultiplyAlpha
76
80
  : hasAlphaChannel(blob.type);
77
81
 
78
- if (width !== null && height !== null) {
82
+ // createImageBitmap with crop and options
83
+ if (
84
+ supportsFullCreateImageBitmap === true &&
85
+ width !== null &&
86
+ height !== null
87
+ ) {
79
88
  createImageBitmap(blob, x || 0, y || 0, width, height, {
80
89
  premultiplyAlpha: withAlphaChannel ? 'premultiply' : 'none',
81
90
  colorSpaceConversion: 'none',
@@ -90,11 +99,25 @@ function createImageWorker() {
90
99
  return;
91
100
  }
92
101
 
93
- createImageBitmap(blob, {
94
- premultiplyAlpha: withAlphaChannel ? 'premultiply' : 'none',
95
- colorSpaceConversion: 'none',
96
- imageOrientation: 'none',
97
- })
102
+ // createImageBitmap without crop but with options
103
+ if (supportsOptionsCreateImageBitmap === true) {
104
+ createImageBitmap(blob, {
105
+ premultiplyAlpha: withAlphaChannel ? 'premultiply' : 'none',
106
+ colorSpaceConversion: 'none',
107
+ imageOrientation: 'none',
108
+ })
109
+ .then(function (data) {
110
+ resolve({ data, premultiplyAlpha: premultiplyAlpha });
111
+ })
112
+ .catch(function (error) {
113
+ reject(error);
114
+ });
115
+ return;
116
+ }
117
+
118
+ // Fallback for browsers that do not support createImageBitmap with options
119
+ // this is supported for Chrome v50 to v52/54 that doesn't support options
120
+ createImageBitmap(blob)
98
121
  .then(function (data) {
99
122
  resolve({ data, premultiplyAlpha: premultiplyAlpha });
100
123
  })
@@ -140,8 +163,14 @@ export class ImageWorkerManager {
140
163
  workerIndex = 0;
141
164
  nextId = 0;
142
165
 
143
- constructor(numImageWorkers: number) {
144
- this.workers = this.createWorkers(numImageWorkers);
166
+ constructor(
167
+ numImageWorkers: number,
168
+ createImageBitmapSupport: CreateImageBitmapSupport,
169
+ ) {
170
+ this.workers = this.createWorkers(
171
+ numImageWorkers,
172
+ createImageBitmapSupport,
173
+ );
145
174
  this.workers.forEach((worker) => {
146
175
  worker.onmessage = this.handleMessage.bind(this);
147
176
  });
@@ -161,8 +190,23 @@ export class ImageWorkerManager {
161
190
  }
162
191
  }
163
192
 
164
- private createWorkers(numWorkers = 1): Worker[] {
165
- const workerCode = `(${createImageWorker.toString()})()`;
193
+ private createWorkers(
194
+ numWorkers = 1,
195
+ createImageBitmapSupport: CreateImageBitmapSupport,
196
+ ): Worker[] {
197
+ let workerCode = `(${createImageWorker.toString()})()`;
198
+
199
+ // Replace placeholders with actual initialization values
200
+ const supportsOptions = createImageBitmapSupport.options ? 'true' : 'false';
201
+ const supportsFull = createImageBitmapSupport.full ? 'true' : 'false';
202
+ workerCode = workerCode.replace(
203
+ 'var supportsOptionsCreateImageBitmap = false;',
204
+ `var supportsOptionsCreateImageBitmap = ${supportsOptions};`,
205
+ );
206
+ workerCode = workerCode.replace(
207
+ 'var supportsFullCreateImageBitmap = false;',
208
+ `var supportsFullCreateImageBitmap = ${supportsFull};`,
209
+ );
166
210
 
167
211
  const blob: Blob = new Blob([workerCode.replace('"use strict";', '')], {
168
212
  type: 'application/javascript',
@@ -170,7 +214,15 @@ export class ImageWorkerManager {
170
214
  const blobURL: string = (self.URL ? URL : webkitURL).createObjectURL(blob);
171
215
  const workers: Worker[] = [];
172
216
  for (let i = 0; i < numWorkers; i++) {
173
- workers.push(new Worker(blobURL));
217
+ const worker = new Worker(blobURL);
218
+
219
+ // Pass `createImageBitmap` support level during worker initialization
220
+ worker.postMessage({
221
+ type: 'init',
222
+ support: createImageBitmapSupport,
223
+ });
224
+
225
+ workers.push(worker);
174
226
  }
175
227
  return workers;
176
228
  }
@@ -84,6 +84,8 @@ export class WebGlContextWrapper {
84
84
  public readonly LINK_STATUS;
85
85
  public readonly DYNAMIC_DRAW;
86
86
  public readonly COLOR_ATTACHMENT0;
87
+ public readonly INVALID_ENUM: number;
88
+ public readonly INVALID_OPERATION: number;
87
89
  //#endregion WebGL Enums
88
90
 
89
91
  constructor(private gl: WebGLRenderingContext | WebGL2RenderingContext) {
@@ -175,6 +177,8 @@ export class WebGlContextWrapper {
175
177
  this.LINK_STATUS = gl.LINK_STATUS;
176
178
  this.DYNAMIC_DRAW = gl.DYNAMIC_DRAW;
177
179
  this.COLOR_ATTACHMENT0 = gl.COLOR_ATTACHMENT0;
180
+ this.INVALID_ENUM = gl.INVALID_ENUM;
181
+ this.INVALID_OPERATION = gl.INVALID_OPERATION;
178
182
  }
179
183
  /**
180
184
  * Returns true if the WebGL context is WebGL2
@@ -1020,6 +1024,18 @@ export class WebGlContextWrapper {
1020
1024
  return gl.getExtension(name);
1021
1025
  }
1022
1026
 
1027
+ /**
1028
+ * ```
1029
+ * gl.getError(type);
1030
+ * ```
1031
+ *
1032
+ * @returns
1033
+ */
1034
+ getError() {
1035
+ const { gl } = this;
1036
+ return gl.getError();
1037
+ }
1038
+
1023
1039
  /**
1024
1040
  * ```
1025
1041
  * gl.createVertexArray();
@@ -110,4 +110,5 @@ export abstract class CoreRenderer {
110
110
  abstract renderToTexture(node: CoreNode): void;
111
111
  abstract getBufferInfo(): BufferInfo | null;
112
112
  abstract getDefShaderCtr(): BaseShaderController;
113
+ abstract updateClearColor(color: number): void;
113
114
  }
@@ -30,7 +30,12 @@ import {
30
30
  type QuadOptions,
31
31
  } from '../CoreRenderer.js';
32
32
  import { CanvasCoreTexture } from './CanvasCoreTexture.js';
33
- import { getBorder, getRadius, strokeLine } from './internal/C2DShaderUtils.js';
33
+ import {
34
+ getBorder,
35
+ getRadius,
36
+ roundRect,
37
+ strokeLine,
38
+ } from './internal/C2DShaderUtils.js';
34
39
  import {
35
40
  formatRgba,
36
41
  parseColorRgba,
@@ -166,7 +171,7 @@ export class CanvasCoreRenderer extends CoreRenderer {
166
171
 
167
172
  if (radius) {
168
173
  const path = new Path2D();
169
- path.roundRect(tx, ty, width, height, radius);
174
+ roundRect.call(path, tx, ty, width, height, radius);
170
175
  ctx.clip(path);
171
176
  }
172
177
 
@@ -224,7 +229,8 @@ export class CanvasCoreRenderer extends CoreRenderer {
224
229
  ctx.strokeStyle = borderColor;
225
230
  ctx.globalAlpha = alpha;
226
231
  if (radius) {
227
- ctx.roundRect(
232
+ roundRect.call(
233
+ ctx,
228
234
  tx + borderInnerWidth,
229
235
  ty + borderInnerWidth,
230
236
  width - borderWidth,
@@ -331,4 +337,13 @@ export class CanvasCoreRenderer extends CoreRenderer {
331
337
  getBufferInfo(): null {
332
338
  return null;
333
339
  }
340
+
341
+ /**
342
+ * Updates the clear color of the canvas renderer.
343
+ *
344
+ * @param color - The color to set as the clear color.
345
+ */
346
+ updateClearColor(color: number) {
347
+ this.clearColor = color ? getRgbaComponents(color) : undefined;
348
+ }
334
349
  }
@@ -84,6 +84,99 @@ export function getBorder(
84
84
  return undefined;
85
85
  }
86
86
 
87
+ export function roundRect(
88
+ this: CanvasRenderingContext2D | Path2D,
89
+ x: number,
90
+ y: number,
91
+ width: number,
92
+ height: number,
93
+ radius: number | DOMPointInit | (number | DOMPointInit)[],
94
+ ) {
95
+ const context = Object.getPrototypeOf(this) as Path2D;
96
+ if (!context.roundRect) {
97
+ const fixOverlappingCorners = (radii: {
98
+ topLeft: number;
99
+ topRight: number;
100
+ bottomRight: number;
101
+ bottomLeft: number;
102
+ }) => {
103
+ const maxRadius = Math.min(width / 2, height / 2);
104
+ const totalHorizontal =
105
+ radii.topLeft + radii.topRight + radii.bottomRight + radii.bottomLeft;
106
+
107
+ if (totalHorizontal > width || totalHorizontal > height) {
108
+ const scale =
109
+ maxRadius /
110
+ Math.max(
111
+ radii.topLeft,
112
+ radii.topRight,
113
+ radii.bottomRight,
114
+ radii.bottomLeft,
115
+ );
116
+ radii.topLeft *= scale;
117
+ radii.topRight *= scale;
118
+ radii.bottomRight *= scale;
119
+ radii.bottomLeft *= scale;
120
+ }
121
+ };
122
+ const radii =
123
+ typeof radius === 'number'
124
+ ? {
125
+ topLeft: radius,
126
+ topRight: radius,
127
+ bottomRight: radius,
128
+ bottomLeft: radius,
129
+ }
130
+ : { topLeft: 0, topRight: 0, bottomRight: 0, bottomLeft: 0, ...radius };
131
+
132
+ fixOverlappingCorners(radii);
133
+
134
+ this.moveTo(x + radii.topLeft, y);
135
+ this.lineTo(x + width - radii.topRight, y);
136
+ this.ellipse(
137
+ x + width - radii.topRight,
138
+ y + radii.topRight,
139
+ radii.topRight,
140
+ radii.topRight,
141
+ 0,
142
+ 1.5 * Math.PI,
143
+ 2 * Math.PI,
144
+ );
145
+ this.lineTo(x + width, y + height - radii.bottomRight);
146
+ this.ellipse(
147
+ x + width - radii.bottomRight,
148
+ y + height - radii.bottomRight,
149
+ radii.bottomRight,
150
+ radii.bottomRight,
151
+ 0,
152
+ 0,
153
+ 0.5 * Math.PI,
154
+ );
155
+ this.lineTo(x + radii.bottomLeft, y + height);
156
+ this.ellipse(
157
+ x + radii.bottomLeft,
158
+ y + height - radii.bottomLeft,
159
+ radii.bottomLeft,
160
+ radii.bottomLeft,
161
+ 0,
162
+ 0.5 * Math.PI,
163
+ Math.PI,
164
+ );
165
+ this.lineTo(x, y + radii.topLeft);
166
+ this.ellipse(
167
+ x + radii.topLeft,
168
+ y + radii.topLeft,
169
+ radii.topLeft,
170
+ radii.topLeft,
171
+ 0,
172
+ Math.PI,
173
+ 1.5 * Math.PI,
174
+ );
175
+ } else {
176
+ this.roundRect(x, y, width, height, radius);
177
+ }
178
+ }
179
+
87
180
  export function strokeLine(
88
181
  ctx: CanvasRenderingContext2D,
89
182
  x: number,
@@ -23,11 +23,9 @@ import type { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
23
23
  import type { WebGlCoreRendererOptions } from './WebGlCoreRenderer.js';
24
24
  import type { BufferCollection } from './internal/BufferCollection.js';
25
25
  import type { Dimensions } from '../../../common/CommonTypes.js';
26
- import type { Rect, RectWithValid } from '../../lib/utils.js';
26
+ import type { RectWithValid } from '../../lib/utils.js';
27
27
  import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
28
28
 
29
- const MAX_TEXTURES = 8; // TODO: get from gl
30
-
31
29
  /**
32
30
  * Can render multiple quads with multiple textures (up to vertex shader texture limit)
33
31
  *
@@ -95,13 +93,22 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
95
93
  // Clipping
96
94
  if (this.clippingRect.valid) {
97
95
  const { x, y, width, height } = this.clippingRect;
98
- const pixelRatio = options.pixelRatio;
96
+ const pixelRatio = this.parentHasRenderTexture ? 1 : options.pixelRatio;
99
97
  const canvasHeight = options.canvas.height;
100
98
 
101
99
  const clipX = Math.round(x * pixelRatio);
102
100
  const clipWidth = Math.round(width * pixelRatio);
103
101
  const clipHeight = Math.round(height * pixelRatio);
104
- const clipY = Math.round(canvasHeight - clipHeight - y * pixelRatio);
102
+ let clipY = Math.round(canvasHeight - clipHeight - y * pixelRatio);
103
+
104
+ // if parent has render texture, we need to adjust the scissor rect
105
+ // to be relative to the parent's framebuffer
106
+ if (this.parentHasRenderTexture) {
107
+ clipY = this.framebufferDimensions
108
+ ? this.framebufferDimensions.height - this.dimensions.height
109
+ : 0;
110
+ }
111
+
105
112
  glw.setScissorTest(true);
106
113
  glw.scissor(clipX, clipY, clipWidth, clipHeight);
107
114
  } else {
@@ -32,6 +32,7 @@ import {
32
32
  type CoreWebGlExtensions,
33
33
  getWebGlParameters,
34
34
  getWebGlExtensions,
35
+ type WebGlColor,
35
36
  } from './internal/RendererUtils.js';
36
37
  import { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
37
38
  import { Texture, TextureType } from '../../textures/Texture.js';
@@ -86,6 +87,11 @@ export class WebGlCoreRenderer extends CoreRenderer {
86
87
  defaultShader: WebGlCoreShader;
87
88
  quadBufferCollection: BufferCollection;
88
89
 
90
+ clearColor: WebGlColor = {
91
+ raw: 0x00000000,
92
+ normalized: [0, 0, 0, 0],
93
+ };
94
+
89
95
  /**
90
96
  * White pixel texture used by default when no texture is specified.
91
97
  */
@@ -127,10 +133,10 @@ export class WebGlCoreRenderer extends CoreRenderer {
127
133
  options.contextSpy,
128
134
  );
129
135
  const glw = (this.glw = new WebGlContextWrapper(gl));
130
-
131
- const color = getNormalizedRgbaComponents(clearColor);
132
136
  glw.viewport(0, 0, canvas.width, canvas.height);
133
- glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
137
+
138
+ this.updateClearColor(clearColor);
139
+
134
140
  glw.setBlend(true);
135
141
  glw.blendFunc(glw.ONE, glw.ONE_MINUS_SRC_ALPHA);
136
142
 
@@ -754,9 +760,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
754
760
  node.hasRTTupdates = false;
755
761
  }
756
762
 
757
- const color = getNormalizedRgbaComponents(this.stage.options.clearColor);
763
+ const clearColor = this.clearColor.normalized;
758
764
  // Restore the default clear color
759
- glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
765
+ glw.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
760
766
 
761
767
  // Bind the default framebuffer
762
768
  glw.bindFramebuffer(null);
@@ -784,4 +790,28 @@ export class WebGlCoreRenderer extends CoreRenderer {
784
790
  override getDefShaderCtr(): BaseShaderController {
785
791
  return this.defShaderCtrl;
786
792
  }
793
+
794
+ /**
795
+ * Updates the WebGL context's clear color and clears the color buffer.
796
+ *
797
+ * @param color - The color to set as the clear color, represented as a 32-bit integer.
798
+ */
799
+ updateClearColor(color: number) {
800
+ if (this.clearColor.raw === color) {
801
+ return;
802
+ }
803
+ const glw = this.glw;
804
+ const normalizedColor = getNormalizedRgbaComponents(color);
805
+ glw.clearColor(
806
+ normalizedColor[0],
807
+ normalizedColor[1],
808
+ normalizedColor[2],
809
+ normalizedColor[3],
810
+ );
811
+ this.clearColor = {
812
+ raw: color,
813
+ normalized: normalizedColor,
814
+ };
815
+ glw.clear();
816
+ }
787
817
  }
@@ -142,9 +142,15 @@ export abstract class WebGlCoreShader extends CoreShader {
142
142
  glw.FRAGMENT_SHADER,
143
143
  fragmentSource,
144
144
  );
145
+
145
146
  if (!vertexShader || !fragmentShader) {
146
147
  throw new Error(
147
- `Unable to create shader type: ${glw.FRAGMENT_SHADER}. Source: ${fragmentSource}`,
148
+ `Unable to create the following shader(s): ${[
149
+ !vertexShader && 'VERTEX_SHADER',
150
+ !fragmentShader && 'FRAGMENT_SHADER',
151
+ ]
152
+ .filter(Boolean)
153
+ .join(' and ')}`,
148
154
  );
149
155
  }
150
156