@lightningjs/renderer 2.16.0 → 3.0.0-beta10

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 (443) hide show
  1. package/COPYING +1 -0
  2. package/LICENSE +202 -202
  3. package/NOTICE +3 -3
  4. package/README.md +133 -147
  5. package/dist/exports/canvas.d.ts +8 -2
  6. package/dist/exports/canvas.js +8 -2
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +16 -13
  9. package/dist/exports/index.js +8 -9
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/utils.d.ts +2 -1
  12. package/dist/exports/utils.js +2 -1
  13. package/dist/exports/utils.js.map +1 -1
  14. package/dist/exports/webgl.d.ts +11 -2
  15. package/dist/exports/webgl.js +11 -2
  16. package/dist/exports/webgl.js.map +1 -1
  17. package/dist/src/core/CoreNode.d.ts +47 -76
  18. package/dist/src/core/CoreNode.js +322 -309
  19. package/dist/src/core/CoreNode.js.map +1 -1
  20. package/dist/src/core/CoreShaderManager.d.ts +29 -73
  21. package/dist/src/core/CoreShaderManager.js +110 -97
  22. package/dist/src/core/CoreShaderManager.js.map +1 -1
  23. package/dist/src/core/CoreTextNode.d.ts +58 -87
  24. package/dist/src/core/CoreTextNode.js +243 -237
  25. package/dist/src/core/CoreTextNode.js.map +1 -1
  26. package/dist/src/core/CoreTextureManager.d.ts +2 -0
  27. package/dist/src/core/CoreTextureManager.js +12 -10
  28. package/dist/src/core/CoreTextureManager.js.map +1 -1
  29. package/dist/src/core/Stage.d.ts +58 -53
  30. package/dist/src/core/Stage.js +260 -196
  31. package/dist/src/core/Stage.js.map +1 -1
  32. package/dist/src/core/TextureMemoryManager.d.ts +3 -0
  33. package/dist/src/core/TextureMemoryManager.js +78 -74
  34. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  35. package/dist/src/core/animations/CoreAnimation.d.ts +0 -1
  36. package/dist/src/core/animations/CoreAnimation.js +6 -52
  37. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  38. package/dist/src/core/lib/ImageWorker.js +1 -1
  39. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  40. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  41. package/dist/src/core/lib/RenderCoords.js +43 -55
  42. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  43. package/dist/src/core/lib/WebGlContextWrapper.d.ts +117 -55
  44. package/dist/src/core/lib/WebGlContextWrapper.js +196 -157
  45. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  46. package/dist/src/core/lib/colorCache.d.ts +1 -0
  47. package/dist/src/core/lib/colorCache.js +19 -0
  48. package/dist/src/core/lib/colorCache.js.map +1 -0
  49. package/dist/src/core/lib/colorParser.d.ts +21 -0
  50. package/dist/src/core/lib/colorParser.js +72 -0
  51. package/dist/src/core/lib/colorParser.js.map +1 -0
  52. package/dist/src/core/lib/textureCompression.js +0 -1
  53. package/dist/src/core/lib/textureCompression.js.map +1 -1
  54. package/dist/src/core/lib/utils.d.ts +3 -1
  55. package/dist/src/core/lib/utils.js +19 -0
  56. package/dist/src/core/lib/utils.js.map +1 -1
  57. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  58. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  59. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  60. package/dist/src/core/platforms/web/WebPlatform.js +29 -3
  61. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  62. package/dist/src/core/renderers/CoreRenderer.d.ts +15 -22
  63. package/dist/src/core/renderers/CoreRenderer.js +0 -6
  64. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  65. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +0 -2
  66. package/dist/src/core/renderers/canvas/CanvasRenderer.js +7 -21
  67. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  68. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +2 -1
  69. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  70. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +2 -2
  71. package/dist/src/core/renderers/canvas/CanvasTexture.js +8 -7
  72. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  73. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -13
  74. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +192 -113
  75. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
  76. package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +2 -0
  77. package/dist/src/core/renderers/canvas/internal/ColorUtils.js +14 -0
  78. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +3 -0
  80. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +5 -6
  82. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +30 -18
  83. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +4 -2
  85. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +31 -13
  86. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  87. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +32 -5
  88. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +50 -0
  89. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  90. package/dist/src/core/shaders/canvas/Border.js +1 -1
  91. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  92. package/dist/src/core/shaders/webgl/Border.js +82 -82
  93. package/dist/src/core/shaders/webgl/Default.js +47 -47
  94. package/dist/src/core/shaders/webgl/DefaultBatched.js +61 -61
  95. package/dist/src/core/shaders/webgl/HolePunch.js +32 -32
  96. package/dist/src/core/shaders/webgl/LinearGradient.js +36 -36
  97. package/dist/src/core/shaders/webgl/RadialGradient.js +33 -33
  98. package/dist/src/core/shaders/webgl/Rounded.js +71 -71
  99. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +111 -111
  100. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +130 -130
  101. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +54 -54
  102. package/dist/src/core/shaders/webgl/SdfShader.js +62 -62
  103. package/dist/src/core/shaders/webgl/Shadow.js +83 -83
  104. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +4 -4
  105. package/dist/src/core/text-rendering/CanvasFontHandler.js +19 -6
  106. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  107. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +18 -2
  108. package/dist/src/core/text-rendering/CanvasTextRenderer.js +296 -69
  109. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  110. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +4 -4
  111. package/dist/src/core/text-rendering/SdfFontHandler.js +6 -6
  112. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
  113. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +4 -8
  114. package/dist/src/core/text-rendering/SdfTextRenderer.js +68 -37
  115. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
  116. package/dist/src/core/text-rendering/TextRenderer.d.ts +37 -113
  117. package/dist/src/core/text-rendering/TextRenderer.js +1 -51
  118. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -1
  119. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +1 -1
  120. package/dist/src/core/text-rendering/canvas/Settings.d.ts +14 -3
  121. package/dist/src/core/text-rendering/canvas/Utils.d.ts +3 -2
  122. package/dist/src/core/text-rendering/canvas/Utils.js +9 -4
  123. package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -1
  124. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +32 -9
  125. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +52 -57
  126. package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -1
  127. package/dist/src/core/text-rendering/canvas/draw.d.ts +3 -10
  128. package/dist/src/core/text-rendering/canvas/draw.js +26 -27
  129. package/dist/src/core/text-rendering/canvas/draw.js.map +1 -1
  130. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
  131. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  132. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +5 -0
  133. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  134. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +7 -1
  135. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +50 -2
  136. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  137. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -3
  138. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +42 -83
  139. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  140. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +1 -1
  141. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +66 -8
  142. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  143. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +14 -4
  144. package/dist/src/core/text-rendering/renderers/TextRenderer.js +3 -0
  145. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  146. package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
  147. package/dist/src/core/text-rendering/sdf/Utils.js +304 -0
  148. package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
  149. package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
  150. package/{src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts → dist/src/core/text-rendering/sdf/index.js} +3 -21
  151. package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
  152. package/dist/src/core/textures/ImageTexture.d.ts +1 -0
  153. package/dist/src/core/textures/ImageTexture.js +11 -4
  154. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  155. package/dist/src/core/textures/Texture.d.ts +6 -1
  156. package/dist/src/core/textures/Texture.js.map +1 -1
  157. package/dist/src/main-api/INode.d.ts +9 -9
  158. package/dist/src/main-api/Inspector.d.ts +6 -1
  159. package/dist/src/main-api/Inspector.js +43 -7
  160. package/dist/src/main-api/Inspector.js.map +1 -1
  161. package/dist/src/main-api/Renderer.d.ts +83 -136
  162. package/dist/src/main-api/Renderer.js +139 -91
  163. package/dist/src/main-api/Renderer.js.map +1 -1
  164. package/dist/src/utils.d.ts +5 -4
  165. package/dist/src/utils.js +20 -9
  166. package/dist/src/utils.js.map +1 -1
  167. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  168. package/exports/canvas-shaders.ts +28 -0
  169. package/exports/canvas.ts +45 -39
  170. package/exports/index.ts +82 -89
  171. package/exports/inspector.ts +24 -24
  172. package/exports/utils.ts +50 -44
  173. package/exports/webgl-shaders.ts +28 -0
  174. package/exports/webgl.ts +52 -38
  175. package/package.json +4 -4
  176. package/src/common/CommonTypes.ts +146 -146
  177. package/src/common/EventEmitter.ts +77 -77
  178. package/src/common/IAnimationController.ts +92 -92
  179. package/src/common/IEventEmitter.ts +28 -28
  180. package/src/core/CoreNode.test.ts +202 -202
  181. package/src/core/CoreNode.ts +2491 -2487
  182. package/src/core/CoreShaderManager.ts +188 -292
  183. package/src/core/CoreTextNode.ts +443 -455
  184. package/src/core/CoreTextureManager.ts +565 -561
  185. package/src/core/Stage.ts +906 -826
  186. package/src/core/TextureMemoryManager.ts +445 -431
  187. package/src/core/animations/AnimationManager.ts +38 -38
  188. package/src/core/animations/CoreAnimation.ts +291 -347
  189. package/src/core/animations/CoreAnimationController.ts +166 -166
  190. package/src/core/lib/ContextSpy.ts +41 -41
  191. package/src/core/lib/ImageWorker.ts +286 -280
  192. package/src/core/lib/Matrix3d.ts +244 -244
  193. package/src/core/lib/RenderCoords.ts +71 -86
  194. package/src/core/lib/WebGlContextWrapper.ts +1381 -1332
  195. package/src/core/lib/colorCache.ts +20 -0
  196. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +85 -69
  197. package/src/core/lib/textureCompression.ts +152 -152
  198. package/src/core/lib/textureSvg.ts +78 -78
  199. package/src/core/lib/utils.ts +412 -388
  200. package/src/core/lib/validateImageBitmap.ts +87 -76
  201. package/src/core/platforms/Platform.ts +77 -0
  202. package/src/core/platforms/web/WebPlatform.ts +121 -0
  203. package/src/core/renderers/CoreContextTexture.ts +43 -43
  204. package/src/core/renderers/CoreRenderOp.ts +22 -22
  205. package/src/core/renderers/CoreRenderer.ts +110 -115
  206. package/src/core/renderers/CoreShaderNode.ts +175 -0
  207. package/{dist/src/core/renderers/CoreShader.js → src/core/renderers/CoreShaderProgram.ts} +23 -28
  208. package/src/core/renderers/canvas/CanvasRenderer.ts +283 -0
  209. package/src/core/renderers/canvas/CanvasShaderNode.ts +96 -0
  210. package/src/core/renderers/canvas/{CanvasCoreTexture.ts → CanvasTexture.ts} +156 -153
  211. package/src/core/renderers/webgl/{WebGlCoreCtxRenderTexture.ts → WebGlCtxRenderTexture.ts} +91 -91
  212. package/src/core/renderers/webgl/{WebGlCoreCtxSubTexture.ts → WebGlCtxSubTexture.ts} +50 -50
  213. package/src/core/renderers/webgl/{WebGlCoreCtxTexture.ts → WebGlCtxTexture.ts} +310 -313
  214. package/src/core/renderers/webgl/WebGlRenderOp.ts +167 -0
  215. package/src/core/renderers/webgl/{WebGlCoreRenderer.ts → WebGlRenderer.ts} +747 -821
  216. package/src/core/renderers/webgl/WebGlShaderNode.ts +435 -0
  217. package/src/core/renderers/webgl/WebGlShaderProgram.ts +341 -0
  218. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  219. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  220. package/src/core/renderers/webgl/internal/ShaderUtils.ts +281 -143
  221. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  222. package/src/core/shaders/canvas/Border.ts +75 -0
  223. package/src/core/shaders/canvas/HolePunch.ts +62 -0
  224. package/src/core/shaders/canvas/LinearGradient.ts +71 -0
  225. package/src/core/shaders/canvas/RadialGradient.ts +99 -0
  226. package/src/core/shaders/canvas/Rounded.ts +55 -0
  227. package/src/core/shaders/canvas/RoundedWithBorder.ts +74 -0
  228. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +90 -0
  229. package/src/core/shaders/canvas/RoundedWithShadow.ts +70 -0
  230. package/src/core/shaders/canvas/Shadow.ts +52 -0
  231. package/src/core/shaders/canvas/utils/render.ts +151 -0
  232. package/src/core/shaders/templates/BorderTemplate.ts +115 -0
  233. package/src/core/shaders/templates/HolePunchTemplate.ts +82 -0
  234. package/src/core/shaders/templates/LinearGradientTemplate.ts +71 -0
  235. package/src/core/shaders/templates/RadialGradientTemplate.ts +81 -0
  236. package/src/core/shaders/templates/RoundedTemplate.ts +98 -0
  237. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +38 -0
  238. package/{dist/src/core/shaders/templates/shaderUtils.js → src/core/shaders/templates/RoundedWithBorderTemplate.ts} +35 -41
  239. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +35 -0
  240. package/src/core/shaders/templates/ShadowTemplate.ts +106 -0
  241. package/src/core/shaders/utils.ts +46 -0
  242. package/src/core/shaders/webgl/Border.ts +116 -0
  243. package/src/core/shaders/webgl/Default.ts +89 -0
  244. package/src/core/shaders/webgl/DefaultBatched.ts +129 -0
  245. package/src/core/shaders/webgl/HolePunch.ts +75 -0
  246. package/src/core/shaders/webgl/LinearGradient.ts +82 -0
  247. package/src/core/shaders/webgl/RadialGradient.ts +85 -0
  248. package/src/core/shaders/webgl/Rounded.ts +117 -0
  249. package/src/core/shaders/webgl/RoundedWithBorder.ts +155 -0
  250. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +175 -0
  251. package/src/core/shaders/webgl/RoundedWithShadow.ts +98 -0
  252. package/src/core/shaders/webgl/SdfShader.ts +134 -0
  253. package/src/core/shaders/webgl/Shadow.ts +115 -0
  254. package/src/core/text-rendering/CanvasFontHandler.ts +176 -0
  255. package/src/core/text-rendering/CanvasTextRenderer.ts +622 -0
  256. package/src/core/text-rendering/SdfFontHandler.ts +517 -0
  257. package/src/core/text-rendering/SdfTextRenderer.ts +466 -0
  258. package/src/core/text-rendering/TextRenderer.ts +404 -0
  259. package/src/core/text-rendering/{TextTextureRendererUtils.ts → Utils.ts} +257 -263
  260. package/src/core/text-rendering/canvas/Settings.ts +99 -0
  261. package/src/core/text-rendering/canvas/Utils.test.ts +206 -0
  262. package/src/core/text-rendering/canvas/Utils.ts +178 -0
  263. package/src/core/text-rendering/canvas/calculateRenderInfo.ts +299 -0
  264. package/src/core/text-rendering/canvas/draw.ts +165 -0
  265. package/src/core/text-rendering/sdf/Utils.test.ts +402 -0
  266. package/src/core/text-rendering/sdf/Utils.ts +436 -0
  267. package/src/core/text-rendering/{renderers/SdfTextRenderer/internal/constants.ts → sdf/index.ts} +20 -32
  268. package/src/core/textures/ColorTexture.ts +102 -102
  269. package/src/core/textures/ImageTexture.ts +418 -400
  270. package/src/core/textures/NoiseTexture.ts +104 -104
  271. package/src/core/textures/RenderTexture.ts +85 -85
  272. package/src/core/textures/SubTexture.ts +205 -205
  273. package/src/core/textures/Texture.ts +381 -376
  274. package/src/core/utils.ts +227 -227
  275. package/src/env.d.ts +7 -7
  276. package/src/main-api/INode.ts +100 -101
  277. package/src/main-api/Inspector.ts +567 -522
  278. package/src/main-api/Renderer.ts +873 -807
  279. package/src/main-api/utils.ts +45 -45
  280. package/src/utils.ts +267 -248
  281. package/dist/src/core/platform.d.ts +0 -10
  282. package/dist/src/core/platform.js +0 -81
  283. package/dist/src/core/platform.js.map +0 -1
  284. package/dist/src/core/renderers/CoreShader.d.ts +0 -9
  285. package/dist/src/core/renderers/CoreShader.js.map +0 -1
  286. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -33
  287. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +0 -250
  288. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +0 -1
  289. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -16
  290. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +0 -124
  291. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +0 -1
  292. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.d.ts +0 -10
  293. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js +0 -43
  294. package/dist/src/core/renderers/canvas/shaders/UnsupportedShader.js.map +0 -1
  295. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +0 -12
  296. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +0 -58
  297. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +0 -1
  298. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +0 -9
  299. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +0 -38
  300. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +0 -1
  301. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -56
  302. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +0 -239
  303. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +0 -1
  304. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +0 -34
  305. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +0 -114
  306. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +0 -1
  307. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -133
  308. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +0 -616
  309. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +0 -1
  310. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +0 -83
  311. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +0 -233
  312. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +0 -1
  313. package/dist/src/core/renderers/webgl/shaders/DefaultShader.d.ts +0 -9
  314. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +0 -87
  315. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +0 -1
  316. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.d.ts +0 -10
  317. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -119
  318. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +0 -1
  319. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +0 -29
  320. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +0 -413
  321. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +0 -1
  322. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +0 -28
  323. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +0 -131
  324. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +0 -1
  325. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +0 -47
  326. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -160
  327. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +0 -1
  328. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +0 -31
  329. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +0 -71
  330. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +0 -1
  331. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +0 -30
  332. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +0 -58
  333. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +0 -1
  334. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +0 -31
  335. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +0 -71
  336. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +0 -1
  337. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +0 -31
  338. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +0 -71
  339. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +0 -1
  340. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +0 -31
  341. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +0 -71
  342. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +0 -1
  343. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +0 -9
  344. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +0 -136
  345. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +0 -1
  346. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +0 -36
  347. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +0 -85
  348. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +0 -1
  349. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +0 -45
  350. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +0 -104
  351. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +0 -1
  352. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +0 -22
  353. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +0 -45
  354. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +0 -1
  355. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.d.ts +0 -58
  356. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +0 -80
  357. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +0 -1
  358. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +0 -35
  359. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +0 -129
  360. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +0 -1
  361. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -39
  362. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +0 -116
  363. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +0 -1
  364. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.d.ts +0 -61
  365. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +0 -127
  366. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +0 -1
  367. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +0 -40
  368. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +0 -71
  369. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +0 -1
  370. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +0 -115
  371. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js +0 -61
  372. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +0 -1
  373. package/dist/src/core/shaders/templates/shaderUtils.d.ts +0 -5
  374. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  375. package/dist/src/core/shaders/webgl/Spinner.d.ts +0 -1
  376. package/dist/src/core/shaders/webgl/Spinner.js +0 -2
  377. package/dist/src/core/shaders/webgl/Spinner.js.map +0 -1
  378. package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +0 -12
  379. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +0 -61
  380. package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +0 -1
  381. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +0 -45
  382. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +0 -69
  383. package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +0 -1
  384. package/dist/src/main-api/DynamicShaderController.d.ts +0 -29
  385. package/dist/src/main-api/DynamicShaderController.js +0 -58
  386. package/dist/src/main-api/DynamicShaderController.js.map +0 -1
  387. package/dist/src/main-api/ShaderController.d.ts +0 -31
  388. package/dist/src/main-api/ShaderController.js +0 -37
  389. package/dist/src/main-api/ShaderController.js.map +0 -1
  390. package/scripts/please-use-pnpm.js +0 -13
  391. package/src/core/platform.ts +0 -100
  392. package/src/core/renderers/CoreShader.ts +0 -41
  393. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +0 -375
  394. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -231
  395. package/src/core/renderers/canvas/shaders/UnsupportedShader.ts +0 -48
  396. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +0 -125
  397. package/src/core/renderers/webgl/WebGlCoreShader.ts +0 -365
  398. package/src/core/renderers/webgl/shaders/DefaultShader.ts +0 -93
  399. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +0 -132
  400. package/src/core/renderers/webgl/shaders/DynamicShader.ts +0 -580
  401. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +0 -167
  402. package/src/core/renderers/webgl/shaders/SdfShader.ts +0 -204
  403. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +0 -101
  404. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +0 -87
  405. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +0 -101
  406. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +0 -101
  407. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +0 -101
  408. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +0 -159
  409. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +0 -127
  410. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +0 -148
  411. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +0 -67
  412. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +0 -157
  413. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +0 -171
  414. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +0 -168
  415. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +0 -187
  416. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +0 -110
  417. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +0 -196
  418. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  419. package/src/core/text-rendering/TrFontManager.ts +0 -183
  420. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  421. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  422. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  423. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  424. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  425. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  426. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  427. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  428. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -808
  429. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -853
  430. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  431. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  432. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  433. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  434. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  435. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  436. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  437. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  438. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  439. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  440. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  441. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -557
  442. package/src/main-api/DynamicShaderController.ts +0 -104
  443. package/src/main-api/ShaderController.ts +0 -80
@@ -1,313 +1,310 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast Cable Communications Management, LLC.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
-
20
- import type { Dimensions } from '../../../common/CommonTypes.js';
21
- import { assertTruthy } from '../../../utils.js';
22
- import type { TextureMemoryManager } from '../../TextureMemoryManager.js';
23
- import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
24
- import type { Texture } from '../../textures/Texture.js';
25
- import { isPowerOfTwo } from '../../utils.js';
26
- import { CoreContextTexture } from '../CoreContextTexture.js';
27
- import { isHTMLImageElement } from './internal/RendererUtils.js';
28
-
29
- const TRANSPARENT_TEXTURE_DATA = new Uint8Array([0, 0, 0, 0]);
30
-
31
- /**
32
- * A wrapper around a WebGLTexture that handles loading the texture data
33
- * from a Texture source and uploading it to the GPU as well as freeing
34
- * the uploaded texture.
35
- *
36
- * @remarks
37
- * When accessing the ctxTexture property, the texture will be loaded if
38
- * it hasn't been already. ctxTexture will always return a valid WebGLTexture
39
- * and trigger the loading/uploading of the texture's data if it hasn't been
40
- * loaded yet.
41
- */
42
- export class WebGlCoreCtxTexture extends CoreContextTexture {
43
- protected _nativeCtxTexture: WebGLTexture | null = null;
44
- private _w = 0;
45
- private _h = 0;
46
-
47
- constructor(
48
- protected glw: WebGlContextWrapper,
49
- memManager: TextureMemoryManager,
50
- textureSource: Texture,
51
- ) {
52
- super(memManager, textureSource);
53
- }
54
-
55
- get ctxTexture(): WebGLTexture | null {
56
- if (this.state === 'freed') {
57
- this.load();
58
- return null;
59
- }
60
- assertTruthy(this._nativeCtxTexture);
61
- return this._nativeCtxTexture;
62
- }
63
-
64
- get w() {
65
- return this._w;
66
- }
67
-
68
- get h() {
69
- return this._h;
70
- }
71
-
72
- /**
73
- * Load the texture data from the Texture source and upload it to the GPU
74
- *
75
- * @remarks
76
- * This method is called automatically when accessing the ctxTexture property
77
- * if the texture hasn't been loaded yet. But it can also be called manually
78
- * to force the texture to be pre-loaded prior to accessing the ctxTexture
79
- * property.
80
- */
81
- async load(): Promise<void> {
82
- // If the texture is already loading or loaded, return resolved promise
83
- if (this.state === 'loading' || this.state === 'loaded') {
84
- return Promise.resolve();
85
- }
86
-
87
- this.state = 'loading';
88
- this.textureSource.setState('loading');
89
-
90
- // Await the native texture creation to ensure GPU buffer is fully allocated
91
- this._nativeCtxTexture = this.createNativeCtxTexture();
92
-
93
- if (this._nativeCtxTexture === null) {
94
- this.state = 'failed';
95
- const error = new Error('Could not create WebGL Texture');
96
- this.textureSource.setState('failed', error);
97
- console.error('Could not create WebGL Texture');
98
- throw error;
99
- }
100
-
101
- try {
102
- const { width, height } = await this.onLoadRequest();
103
-
104
- // If the texture has been freed while loading, return early.
105
- // Type assertion needed because state could change during async operations
106
- if ((this.state as string) === 'freed') {
107
- return;
108
- }
109
-
110
- this.state = 'loaded';
111
- this._w = width;
112
- this._h = height;
113
- // Update the texture source's width and height so that it can be used
114
- // for rendering.
115
- this.textureSource.setState('loaded', { width, height });
116
-
117
- // cleanup source texture data next tick
118
- // This is done using queueMicrotask to ensure it runs after the current
119
- // event loop tick, allowing the texture to be fully loaded and bound
120
- // to the GL context before freeing the source data.
121
- // This is important to avoid issues with the texture data being
122
- // freed while the texture is still being loaded or used.
123
- queueMicrotask(() => {
124
- this.textureSource.freeTextureData();
125
- });
126
- } catch (err: unknown) {
127
- // If the texture has been freed while loading, return early.
128
- // Type assertion needed because state could change during async operations
129
- if ((this.state as string) === 'freed') {
130
- return;
131
- }
132
-
133
- this.state = 'failed';
134
- const error = err instanceof Error ? err : new Error(String(err));
135
- this.textureSource.setState('failed', error);
136
- this.textureSource.freeTextureData();
137
- console.error(err);
138
- throw error; // Re-throw to propagate the error
139
- }
140
- }
141
-
142
- /**
143
- * Called when the texture data needs to be loaded and uploaded to a texture
144
- */
145
- async onLoadRequest(): Promise<Dimensions> {
146
- const { glw } = this;
147
- const textureData = this.textureSource.textureData;
148
- if (textureData === null || this._nativeCtxTexture === null) {
149
- throw new Error(
150
- 'Texture data or native texture is null ' + this.textureSource.type,
151
- );
152
- }
153
-
154
- // Set to a 1x1 transparent texture
155
- glw.texImage2D(0, glw.RGBA, 1, 1, 0, glw.RGBA, glw.UNSIGNED_BYTE, null);
156
- this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
157
-
158
- let width = 0;
159
- let height = 0;
160
-
161
- glw.activeTexture(0);
162
-
163
- const tdata = textureData.data;
164
- const format = glw.RGBA;
165
- const formatBytes = 4;
166
- const memoryPadding = 1.1; // Add padding to account for GPU Padding
167
-
168
- // If textureData is null, the texture is empty (0, 0) and we don't need to
169
- // upload any data to the GPU.
170
- if (
171
- (typeof ImageBitmap !== 'undefined' && tdata instanceof ImageBitmap) ||
172
- tdata instanceof ImageData ||
173
- // not using typeof HTMLImageElement due to web worker
174
- isHTMLImageElement(tdata)
175
- ) {
176
- width = tdata.width;
177
- height = tdata.height;
178
- glw.bindTexture(this._nativeCtxTexture);
179
- glw.pixelStorei(
180
- glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
181
- !!textureData.premultiplyAlpha,
182
- );
183
-
184
- glw.texImage2D(0, format, format, glw.UNSIGNED_BYTE, tdata);
185
-
186
- this.setTextureMemUse(height * width * formatBytes * memoryPadding);
187
- } else if (tdata === null) {
188
- width = 0;
189
- height = 0;
190
- // Reset to a 1x1 transparent texture
191
- glw.bindTexture(this._nativeCtxTexture);
192
-
193
- glw.texImage2D(
194
- 0,
195
- format,
196
- 1,
197
- 1,
198
- 0,
199
- format,
200
- glw.UNSIGNED_BYTE,
201
- TRANSPARENT_TEXTURE_DATA,
202
- );
203
- this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
204
- } else if ('mipmaps' in tdata && tdata.mipmaps) {
205
- const { mipmaps, width = 0, height = 0, type, glInternalFormat } = tdata;
206
- const view =
207
- type === 'ktx'
208
- ? new DataView(mipmaps[0] ?? new ArrayBuffer(0))
209
- : (mipmaps[0] as unknown as ArrayBufferView);
210
-
211
- glw.bindTexture(this._nativeCtxTexture);
212
-
213
- glw.compressedTexImage2D(0, glInternalFormat, width, height, 0, view);
214
- glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
215
- glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
216
- glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
217
- glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
218
-
219
- this.setTextureMemUse(view.byteLength);
220
- } else if (tdata && tdata instanceof Uint8Array) {
221
- // Color Texture
222
- width = 1;
223
- height = 1;
224
-
225
- glw.bindTexture(this._nativeCtxTexture);
226
- glw.pixelStorei(
227
- glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
228
- !!textureData.premultiplyAlpha,
229
- );
230
-
231
- glw.texImage2D(
232
- 0,
233
- format,
234
- width,
235
- height,
236
- 0,
237
- format,
238
- glw.UNSIGNED_BYTE,
239
- tdata,
240
- );
241
-
242
- this.setTextureMemUse(width * height * formatBytes);
243
- } else {
244
- console.error(
245
- `WebGlCoreCtxTexture.onLoadRequest: Unexpected textureData returned`,
246
- textureData,
247
- );
248
- }
249
-
250
- return {
251
- width,
252
- height,
253
- };
254
- }
255
-
256
- /**
257
- * Free the WebGLTexture from the GPU
258
- *
259
- * @returns
260
- */
261
- free() {
262
- if (this.state === 'freed') {
263
- return;
264
- }
265
-
266
- this.state = 'freed';
267
- this.textureSource.setState('freed');
268
- this._w = 0;
269
- this._h = 0;
270
-
271
- if (this._nativeCtxTexture !== null) {
272
- this.glw.deleteTexture(this._nativeCtxTexture);
273
- this.setTextureMemUse(0);
274
- this._nativeCtxTexture = null;
275
- }
276
-
277
- // if the texture still has source data, free it
278
- this.textureSource.freeTextureData();
279
- }
280
-
281
- /**
282
- * Create native context texture asynchronously
283
- *
284
- * @remarks
285
- * When this method resolves, the returned texture will be bound to the GL context state
286
- * and fully ready for use. This ensures proper GPU resource allocation timing.
287
- *
288
- * @returns Promise that resolves to the native WebGL texture or null on failure
289
- */
290
- protected createNativeCtxTexture(): WebGLTexture | null {
291
- const { glw } = this;
292
-
293
- const nativeTexture = glw.createTexture();
294
- if (!nativeTexture) {
295
- return null;
296
- }
297
-
298
- // On initial load request, create a 1x1 transparent texture to use until
299
- // the texture data is finally loaded.
300
- glw.activeTexture(0);
301
- glw.bindTexture(nativeTexture);
302
-
303
- // linear texture filtering
304
- glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
305
- glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
306
-
307
- // texture wrapping method
308
- glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
309
- glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
310
-
311
- return nativeTexture;
312
- }
313
- }
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2023 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+
20
+ import type { Dimensions } from '../../../common/CommonTypes.js';
21
+ import type { TextureMemoryManager } from '../../TextureMemoryManager.js';
22
+ import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
23
+ import type { Texture } from '../../textures/Texture.js';
24
+ import { CoreContextTexture } from '../CoreContextTexture.js';
25
+ import { isHTMLImageElement } from './internal/RendererUtils.js';
26
+
27
+ const TRANSPARENT_TEXTURE_DATA = new Uint8Array([0, 0, 0, 0]);
28
+
29
+ /**
30
+ * A wrapper around a WebGLTexture that handles loading the texture data
31
+ * from a Texture source and uploading it to the GPU as well as freeing
32
+ * the uploaded texture.
33
+ *
34
+ * @remarks
35
+ * When accessing the ctxTexture property, the texture will be loaded if
36
+ * it hasn't been already. ctxTexture will always return a valid WebGLTexture
37
+ * and trigger the loading/uploading of the texture's data if it hasn't been
38
+ * loaded yet.
39
+ */
40
+ export class WebGlCtxTexture extends CoreContextTexture {
41
+ protected _nativeCtxTexture: WebGLTexture | null = null;
42
+ private _w = 0;
43
+ private _h = 0;
44
+
45
+ constructor(
46
+ protected glw: WebGlContextWrapper,
47
+ memManager: TextureMemoryManager,
48
+ textureSource: Texture,
49
+ ) {
50
+ super(memManager, textureSource);
51
+ }
52
+
53
+ get ctxTexture(): WebGLTexture | null {
54
+ if (this.state === 'freed') {
55
+ this.load();
56
+ return null;
57
+ }
58
+ return this._nativeCtxTexture;
59
+ }
60
+
61
+ get w() {
62
+ return this._w;
63
+ }
64
+
65
+ get h() {
66
+ return this._h;
67
+ }
68
+
69
+ /**
70
+ * Load the texture data from the Texture source and upload it to the GPU
71
+ *
72
+ * @remarks
73
+ * This method is called automatically when accessing the ctxTexture property
74
+ * if the texture hasn't been loaded yet. But it can also be called manually
75
+ * to force the texture to be pre-loaded prior to accessing the ctxTexture
76
+ * property.
77
+ */
78
+ async load(): Promise<void> {
79
+ // If the texture is already loading or loaded, return resolved promise
80
+ if (this.state === 'loading' || this.state === 'loaded') {
81
+ return Promise.resolve();
82
+ }
83
+
84
+ this.state = 'loading';
85
+ this.textureSource.setState('loading');
86
+
87
+ // Await the native texture creation to ensure GPU buffer is fully allocated
88
+ this._nativeCtxTexture = this.createNativeCtxTexture();
89
+
90
+ if (this._nativeCtxTexture === null) {
91
+ this.state = 'failed';
92
+ const error = new Error('Could not create WebGL Texture');
93
+ this.textureSource.setState('failed', error);
94
+ console.error('Could not create WebGL Texture');
95
+ throw error;
96
+ }
97
+
98
+ try {
99
+ const { width, height } = await this.onLoadRequest();
100
+
101
+ // If the texture has been freed while loading, return early.
102
+ // Type assertion needed because state could change during async operations
103
+ if ((this.state as string) === 'freed') {
104
+ return;
105
+ }
106
+
107
+ this.state = 'loaded';
108
+ this._w = width;
109
+ this._h = height;
110
+ // Update the texture source's width and height so that it can be used
111
+ // for rendering.
112
+ this.textureSource.setState('loaded', { width, height });
113
+
114
+ // cleanup source texture data next tick
115
+ // This is done using queueMicrotask to ensure it runs after the current
116
+ // event loop tick, allowing the texture to be fully loaded and bound
117
+ // to the GL context before freeing the source data.
118
+ // This is important to avoid issues with the texture data being
119
+ // freed while the texture is still being loaded or used.
120
+ queueMicrotask(() => {
121
+ this.textureSource.freeTextureData();
122
+ });
123
+ } catch (err: unknown) {
124
+ // If the texture has been freed while loading, return early.
125
+ // Type assertion needed because state could change during async operations
126
+ if ((this.state as string) === 'freed') {
127
+ return;
128
+ }
129
+
130
+ this.state = 'failed';
131
+ const error = err instanceof Error ? err : new Error(String(err));
132
+ this.textureSource.setState('failed', error);
133
+ this.textureSource.freeTextureData();
134
+ console.error(err);
135
+ throw error; // Re-throw to propagate the error
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Called when the texture data needs to be loaded and uploaded to a texture
141
+ */
142
+ async onLoadRequest(): Promise<Dimensions> {
143
+ const { glw } = this;
144
+ const textureData = this.textureSource.textureData;
145
+ if (textureData === null || this._nativeCtxTexture === null) {
146
+ throw new Error(
147
+ 'Texture data or native texture is null ' + this.textureSource.type,
148
+ );
149
+ }
150
+
151
+ // Set to a 1x1 transparent texture
152
+ glw.texImage2D(0, glw.RGBA, 1, 1, 0, glw.RGBA, glw.UNSIGNED_BYTE, null);
153
+ this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
154
+
155
+ let width = 0;
156
+ let height = 0;
157
+
158
+ glw.activeTexture(0);
159
+
160
+ const tdata = textureData.data;
161
+ const format = glw.RGBA;
162
+ const formatBytes = 4;
163
+ const memoryPadding = 1.1; // Add padding to account for GPU Padding
164
+
165
+ // If textureData is null, the texture is empty (0, 0) and we don't need to
166
+ // upload any data to the GPU.
167
+ if (
168
+ (typeof ImageBitmap !== 'undefined' && tdata instanceof ImageBitmap) ||
169
+ tdata instanceof ImageData ||
170
+ // not using typeof HTMLImageElement due to web worker
171
+ isHTMLImageElement(tdata)
172
+ ) {
173
+ width = tdata.width;
174
+ height = tdata.height;
175
+ glw.bindTexture(this._nativeCtxTexture);
176
+ glw.pixelStorei(
177
+ glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
178
+ !!textureData.premultiplyAlpha,
179
+ );
180
+
181
+ glw.texImage2D(0, format, format, glw.UNSIGNED_BYTE, tdata);
182
+
183
+ this.setTextureMemUse(height * width * formatBytes * memoryPadding);
184
+ } else if (tdata === null) {
185
+ width = 0;
186
+ height = 0;
187
+ // Reset to a 1x1 transparent texture
188
+ glw.bindTexture(this._nativeCtxTexture);
189
+
190
+ glw.texImage2D(
191
+ 0,
192
+ format,
193
+ 1,
194
+ 1,
195
+ 0,
196
+ format,
197
+ glw.UNSIGNED_BYTE,
198
+ TRANSPARENT_TEXTURE_DATA,
199
+ );
200
+ this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
201
+ } else if ('mipmaps' in tdata && tdata.mipmaps) {
202
+ const { mipmaps, width = 0, height = 0, type, glInternalFormat } = tdata;
203
+ const view =
204
+ type === 'ktx'
205
+ ? new DataView(mipmaps[0] ?? new ArrayBuffer(0))
206
+ : (mipmaps[0] as unknown as ArrayBufferView);
207
+
208
+ glw.bindTexture(this._nativeCtxTexture);
209
+
210
+ glw.compressedTexImage2D(0, glInternalFormat, width, height, 0, view);
211
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
212
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
213
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
214
+ glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
215
+
216
+ this.setTextureMemUse(view.byteLength);
217
+ } else if (tdata && tdata instanceof Uint8Array) {
218
+ // Color Texture
219
+ width = 1;
220
+ height = 1;
221
+
222
+ glw.bindTexture(this._nativeCtxTexture);
223
+ glw.pixelStorei(
224
+ glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
225
+ !!textureData.premultiplyAlpha,
226
+ );
227
+
228
+ glw.texImage2D(
229
+ 0,
230
+ format,
231
+ width,
232
+ height,
233
+ 0,
234
+ format,
235
+ glw.UNSIGNED_BYTE,
236
+ tdata,
237
+ );
238
+
239
+ this.setTextureMemUse(width * height * formatBytes);
240
+ } else {
241
+ console.error(
242
+ `WebGlCoreCtxTexture.onLoadRequest: Unexpected textureData returned`,
243
+ textureData,
244
+ );
245
+ }
246
+
247
+ return {
248
+ width,
249
+ height,
250
+ };
251
+ }
252
+
253
+ /**
254
+ * Free the WebGLTexture from the GPU
255
+ *
256
+ * @returns
257
+ */
258
+ free() {
259
+ if (this.state === 'freed') {
260
+ return;
261
+ }
262
+
263
+ this.state = 'freed';
264
+ this.textureSource.setState('freed');
265
+ this._w = 0;
266
+ this._h = 0;
267
+
268
+ if (this._nativeCtxTexture !== null) {
269
+ this.glw.deleteTexture(this._nativeCtxTexture);
270
+ this.setTextureMemUse(0);
271
+ this._nativeCtxTexture = null;
272
+ }
273
+
274
+ // if the texture still has source data, free it
275
+ this.textureSource.freeTextureData();
276
+ }
277
+
278
+ /**
279
+ * Create native context texture asynchronously
280
+ *
281
+ * @remarks
282
+ * When this method resolves, the returned texture will be bound to the GL context state
283
+ * and fully ready for use. This ensures proper GPU resource allocation timing.
284
+ *
285
+ * @returns Promise that resolves to the native WebGL texture or null on failure
286
+ */
287
+ protected createNativeCtxTexture(): WebGLTexture | null {
288
+ const { glw } = this;
289
+
290
+ const nativeTexture = glw.createTexture();
291
+ if (!nativeTexture) {
292
+ return null;
293
+ }
294
+
295
+ // On initial load request, create a 1x1 transparent texture to use until
296
+ // the texture data is finally loaded.
297
+ glw.activeTexture(0);
298
+ glw.bindTexture(nativeTexture);
299
+
300
+ // linear texture filtering
301
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
302
+ glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
303
+
304
+ // texture wrapping method
305
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
306
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
307
+
308
+ return nativeTexture;
309
+ }
310
+ }