@lightningjs/renderer 2.8.0 → 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 (231) hide show
  1. package/README.md +7 -4
  2. package/dist/src/common/EventEmitter.js.map +1 -1
  3. package/dist/src/core/CoreNode.js.map +1 -1
  4. package/dist/src/core/CoreShaderManager.js.map +1 -1
  5. package/dist/src/core/CoreTextNode.js.map +1 -1
  6. package/dist/src/core/CoreTextureManager.d.ts +13 -1
  7. package/dist/src/core/CoreTextureManager.js +163 -7
  8. package/dist/src/core/CoreTextureManager.js.map +1 -1
  9. package/dist/src/core/Stage.js +1 -1
  10. package/dist/src/core/Stage.js.map +1 -1
  11. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  12. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  13. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  14. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  15. package/dist/src/core/lib/ImageWorker.d.ts +2 -1
  16. package/dist/src/core/lib/ImageWorker.js +40 -11
  17. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  18. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  19. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  20. package/dist/src/core/lib/WebGlContextWrapper.d.ts +10 -0
  21. package/dist/src/core/lib/WebGlContextWrapper.js +15 -0
  22. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  23. package/dist/src/core/lib/textureCompression.js.map +1 -1
  24. package/dist/src/core/lib/utils.js.map +1 -1
  25. package/dist/src/core/platform.js.map +1 -1
  26. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +3 -3
  27. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  28. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  29. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +1 -0
  30. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +38 -0
  31. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  32. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  33. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
  34. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  35. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +9 -3
  36. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
  37. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +4 -4
  38. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  39. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +6 -1
  40. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  41. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +1 -1
  42. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  43. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +4 -3
  44. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  46. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  47. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  48. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
  49. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  50. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
  52. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  53. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -1
  54. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +3 -4
  55. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  56. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
  57. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
  58. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
  59. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  60. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  61. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +4 -4
  62. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  63. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +1 -1
  64. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -1
  65. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +1 -1
  66. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  67. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +1 -1
  68. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -1
  69. package/dist/src/core/text-rendering/renderers/TextRenderer.js +1 -1
  70. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  71. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  72. package/dist/src/core/textures/ImageTexture.d.ts +8 -0
  73. package/dist/src/core/textures/ImageTexture.js +52 -39
  74. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  75. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  76. package/dist/src/core/textures/SubTexture.js.map +1 -1
  77. package/dist/src/core/textures/Texture.js.map +1 -1
  78. package/dist/src/core/utils.d.ts +1 -1
  79. package/dist/src/core/utils.js.map +1 -1
  80. package/dist/src/main-api/DynamicShaderController.js.map +1 -1
  81. package/dist/src/main-api/ICoreDriver.d.ts +1 -4
  82. package/dist/src/main-api/Inspector.js.map +1 -1
  83. package/dist/src/main-api/Renderer.js.map +1 -1
  84. package/dist/src/main-api/RendererMain.d.ts +5 -2
  85. package/dist/src/main-api/RendererMain.js +6 -4
  86. package/dist/src/main-api/RendererMain.js.map +1 -1
  87. package/dist/src/main-api/ShaderController.js.map +1 -1
  88. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -1
  89. package/dist/src/main-api/utils.js.map +1 -1
  90. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +1 -4
  91. package/dist/src/render-drivers/main/MainCoreDriver.js +1 -4
  92. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  93. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +8 -6
  94. package/dist/src/render-drivers/main/MainOnlyNode.js +30 -1
  95. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  96. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +1 -1
  97. package/dist/src/render-drivers/main/MainOnlyTextNode.js +2 -3
  98. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  99. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +3 -0
  100. package/dist/src/render-drivers/threadx/NodeStruct.js +9 -0
  101. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
  102. package/dist/src/render-drivers/threadx/SharedNode.d.ts +1 -0
  103. package/dist/src/render-drivers/threadx/SharedNode.js +1 -0
  104. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
  105. package/dist/src/render-drivers/threadx/TextNodeStruct.js +3 -1
  106. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -1
  107. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +1 -4
  108. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +2 -4
  109. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  110. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +8 -4
  111. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +53 -24
  112. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +1 -1
  113. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +7 -5
  114. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +8 -2
  115. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -1
  116. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -1
  117. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +7 -0
  118. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
  119. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +1 -0
  120. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  121. package/dist/src/render-drivers/threadx/worker/renderer.js +2 -0
  122. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  123. package/dist/src/render-drivers/utils.js +6 -1
  124. package/dist/src/render-drivers/utils.js.map +1 -1
  125. package/dist/src/utils.js.map +1 -1
  126. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  127. package/dist/tsconfig.tsbuildinfo +1 -0
  128. package/package.json +10 -11
  129. package/src/core/CoreTextureManager.ts +188 -10
  130. package/src/core/lib/ImageWorker.ts +63 -11
  131. package/src/core/lib/WebGlContextWrapper.ts +16 -0
  132. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +9 -3
  133. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +93 -0
  134. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +12 -5
  135. package/src/core/renderers/webgl/WebGlCoreShader.ts +7 -1
  136. package/src/core/renderers/webgl/internal/ShaderUtils.ts +9 -3
  137. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +6 -4
  138. package/src/core/textures/ImageTexture.ts +78 -45
  139. package/dist/src/core/CoreStuff.d.ts +0 -1
  140. package/dist/src/core/CoreStuff.js +0 -138
  141. package/dist/src/core/CoreStuff.js.map +0 -1
  142. package/dist/src/core/LngNode.d.ts +0 -736
  143. package/dist/src/core/LngNode.js +0 -1174
  144. package/dist/src/core/LngNode.js.map +0 -1
  145. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  146. package/dist/src/core/Matrix2DContext.js +0 -45
  147. package/dist/src/core/Matrix2DContext.js.map +0 -1
  148. package/dist/src/core/ShaderNode.d.ts +0 -10
  149. package/dist/src/core/ShaderNode.js +0 -30
  150. package/dist/src/core/ShaderNode.js.map +0 -1
  151. package/dist/src/core/TextNode.d.ts +0 -103
  152. package/dist/src/core/TextNode.js +0 -331
  153. package/dist/src/core/TextNode.js.map +0 -1
  154. package/dist/src/core/lib/Coords.d.ts +0 -14
  155. package/dist/src/core/lib/Coords.js +0 -55
  156. package/dist/src/core/lib/Coords.js.map +0 -1
  157. package/dist/src/core/lib/glm/common.d.ts +0 -162
  158. package/dist/src/core/lib/glm/common.js +0 -81
  159. package/dist/src/core/lib/glm/common.js.map +0 -1
  160. package/dist/src/core/lib/glm/index.d.ts +0 -11
  161. package/dist/src/core/lib/glm/index.js +0 -30
  162. package/dist/src/core/lib/glm/index.js.map +0 -1
  163. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  164. package/dist/src/core/lib/glm/mat2.js +0 -396
  165. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  166. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  167. package/dist/src/core/lib/glm/mat2d.js +0 -442
  168. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  169. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  170. package/dist/src/core/lib/glm/mat3.js +0 -680
  171. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  172. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  173. package/dist/src/core/lib/glm/mat4.js +0 -1802
  174. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  175. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  176. package/dist/src/core/lib/glm/quat.js +0 -693
  177. package/dist/src/core/lib/glm/quat.js.map +0 -1
  178. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  179. package/dist/src/core/lib/glm/quat2.js +0 -754
  180. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  181. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  182. package/dist/src/core/lib/glm/vec2.js +0 -569
  183. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  184. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  185. package/dist/src/core/lib/glm/vec3.js +0 -720
  186. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  187. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  188. package/dist/src/core/lib/glm/vec4.js +0 -608
  189. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  190. package/dist/src/core/renderers/CoreShaderManager.d.ts +0 -19
  191. package/dist/src/core/renderers/CoreShaderManager.js +0 -33
  192. package/dist/src/core/renderers/CoreShaderManager.js.map +0 -1
  193. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.d.ts +0 -27
  194. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js +0 -82
  195. package/dist/src/core/renderers/webgl/WebGlCoreShaderManager.js.map +0 -1
  196. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.d.ts +0 -11
  197. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js +0 -34
  198. package/dist/src/core/renderers/webgl/WebGlCoreShaderProgram.js.map +0 -1
  199. package/dist/src/core/scene/Scene.d.ts +0 -59
  200. package/dist/src/core/scene/Scene.js +0 -106
  201. package/dist/src/core/scene/Scene.js.map +0 -1
  202. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +0 -20
  203. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +0 -55
  204. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +0 -1
  205. package/dist/src/main-api/IRenderDriver.d.ts +0 -20
  206. package/dist/src/main-api/IRenderDriver.js +0 -20
  207. package/dist/src/main-api/IRenderDriver.js.map +0 -1
  208. package/dist/src/main-api/IShaderController.d.ts +0 -14
  209. package/dist/src/main-api/IShaderController.js +0 -30
  210. package/dist/src/main-api/IShaderController.js.map +0 -1
  211. package/dist/src/main-api/IShaderNode.d.ts +0 -17
  212. package/dist/src/main-api/IShaderNode.js +0 -19
  213. package/dist/src/main-api/IShaderNode.js.map +0 -1
  214. package/dist/src/render-drivers/main/MainOnlyShaderController.d.ts +0 -6
  215. package/dist/src/render-drivers/main/MainOnlyShaderController.js +0 -15
  216. package/dist/src/render-drivers/main/MainOnlyShaderController.js.map +0 -1
  217. package/dist/src/render-drivers/main/MainOnlyShaderNode.d.ts +0 -7
  218. package/dist/src/render-drivers/main/MainOnlyShaderNode.js +0 -34
  219. package/dist/src/render-drivers/main/MainOnlyShaderNode.js.map +0 -1
  220. package/dist/src/render-drivers/main/MainRenderDriver.d.ts +0 -17
  221. package/dist/src/render-drivers/main/MainRenderDriver.js +0 -88
  222. package/dist/src/render-drivers/main/MainRenderDriver.js.map +0 -1
  223. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.d.ts +0 -6
  224. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js +0 -16
  225. package/dist/src/render-drivers/threadx/ThreadXMainShaderController.js.map +0 -1
  226. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.d.ts +0 -7
  227. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js +0 -15
  228. package/dist/src/render-drivers/threadx/ThreadXMainShaderNode.js.map +0 -1
  229. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.d.ts +0 -21
  230. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +0 -198
  231. 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],
@@ -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();
@@ -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,
@@ -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 {
@@ -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
 
@@ -100,8 +100,14 @@ export function createShader(
100
100
  ) {
101
101
  const shader = glw.createShader(type);
102
102
  if (!shader) {
103
- throw new Error(`Unable to create shader type: ${type}. Source: ${source}`);
103
+ const glError = glw.getError();
104
+ throw new Error(
105
+ `Unable to create the shader: ${
106
+ type === glw.VERTEX_SHADER ? 'VERTEX_SHADER' : 'FRAGMENT_SHADER'
107
+ }.${glError ? ` WebGlContext Error: ${glError}` : ''}`,
108
+ );
104
109
  }
110
+
105
111
  glw.shaderSource(shader, source);
106
112
  glw.compileShader(shader);
107
113
  const success = !!glw.getShaderParameter(shader, glw.COMPILE_STATUS);
@@ -109,7 +115,7 @@ export function createShader(
109
115
  return shader;
110
116
  }
111
117
 
112
- console.log(glw.getShaderInfoLog(shader));
118
+ console.error(glw.getShaderInfoLog(shader));
113
119
  glw.deleteShader(shader);
114
120
  }
115
121
 
@@ -131,7 +137,7 @@ export function createProgram(
131
137
  return program;
132
138
  }
133
139
 
134
- console.log(glw.getProgramInfoLog(program));
140
+ console.warn(glw.getProgramInfoLog(program));
135
141
  glw.deleteProgram(program);
136
142
  return undefined;
137
143
  }
@@ -93,7 +93,9 @@ export class SdfTrFontFace<
93
93
  });
94
94
 
95
95
  // Pre-load it
96
- this.texture.ctxTexture.load();
96
+ stage.txManager.once('initialized', () => {
97
+ this.texture.ctxTexture.load();
98
+ });
97
99
 
98
100
  // Set this.data to the fetched data from dataUrl
99
101
  fetch(atlasDataUrl)
@@ -102,7 +104,7 @@ export class SdfTrFontFace<
102
104
  (this.data as SdfFontData) = await response.json();
103
105
  assertTruthy(this.data);
104
106
  // Add all the glyphs to the glyph map
105
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
107
+
106
108
  let maxCharHeight = 0;
107
109
  this.data.chars.forEach((glyph) => {
108
110
  this.glyphMap.set(glyph.id, glyph);
@@ -111,10 +113,10 @@ export class SdfTrFontFace<
111
113
  maxCharHeight = charHeight;
112
114
  }
113
115
  });
114
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
116
+
115
117
  (this.maxCharHeight as number) = maxCharHeight;
116
118
  // We know `data` is defined here, because we just set it
117
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
119
+
118
120
  (this.shaper as FontShaper) = new SdfFontShaper(
119
121
  this.data,
120
122
  this.glyphMap,