@lightningtv/renderer 3.0.0-beta1 → 3.2.4

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 (503) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +22 -28
  3. package/dist/exports/canvas-shaders.js +0 -16
  4. package/dist/exports/canvas-shaders.js.map +1 -1
  5. package/dist/exports/canvas.d.ts +1 -1
  6. package/dist/exports/canvas.js +1 -19
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +2 -5
  9. package/dist/exports/index.js +1 -23
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/inspector.js +0 -18
  12. package/dist/exports/inspector.js.map +1 -1
  13. package/dist/exports/utils.d.ts +2 -1
  14. package/dist/exports/utils.js +2 -19
  15. package/dist/exports/utils.js.map +1 -1
  16. package/dist/exports/webgl-shaders.js +0 -16
  17. package/dist/exports/webgl-shaders.js.map +1 -1
  18. package/dist/exports/webgl.d.ts +2 -1
  19. package/dist/exports/webgl.js +2 -19
  20. package/dist/exports/webgl.js.map +1 -1
  21. package/dist/src/common/CommonTypes.d.ts +15 -3
  22. package/dist/src/common/CommonTypes.js +0 -18
  23. package/dist/src/common/CommonTypes.js.map +1 -1
  24. package/dist/src/common/EventEmitter.js +0 -18
  25. package/dist/src/common/EventEmitter.js.map +1 -1
  26. package/dist/src/common/IEventEmitter.js +0 -16
  27. package/dist/src/common/IEventEmitter.js.map +1 -1
  28. package/dist/src/core/Autosizer.d.ts +35 -0
  29. package/dist/src/core/Autosizer.js +178 -0
  30. package/dist/src/core/Autosizer.js.map +1 -0
  31. package/dist/src/core/CoreNode.d.ts +139 -101
  32. package/dist/src/core/CoreNode.js +813 -528
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +3 -3
  35. package/dist/src/core/CoreShaderManager.js +0 -18
  36. package/dist/src/core/CoreShaderManager.js.map +1 -1
  37. package/dist/src/core/CoreTextNode.d.ts +75 -87
  38. package/dist/src/core/CoreTextNode.js +380 -258
  39. package/dist/src/core/CoreTextNode.js.map +1 -1
  40. package/dist/src/core/CoreTextureManager.d.ts +25 -14
  41. package/dist/src/core/CoreTextureManager.js +83 -140
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +102 -36
  44. package/dist/src/core/Stage.js +424 -191
  45. package/dist/src/core/Stage.js.map +1 -1
  46. package/dist/src/core/TextureError.d.ts +11 -0
  47. package/dist/src/core/TextureError.js +37 -0
  48. package/dist/src/core/TextureError.js.map +1 -0
  49. package/dist/src/core/TextureMemoryManager.d.ts +11 -4
  50. package/dist/src/core/TextureMemoryManager.js +114 -134
  51. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  52. package/dist/src/core/animations/AnimationManager.js +0 -18
  53. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  54. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  55. package/dist/src/core/animations/CoreAnimation.js +8 -24
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  58. package/dist/src/core/animations/CoreAnimationController.js +11 -22
  59. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  60. package/dist/src/core/lib/ContextSpy.js +0 -18
  61. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  62. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  63. package/dist/src/core/lib/ImageWorker.js +33 -31
  64. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  65. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  66. package/dist/src/core/lib/Matrix3d.js +7 -19
  67. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  68. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  69. package/dist/src/core/lib/RenderCoords.js +27 -55
  70. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  71. package/dist/src/core/lib/WebGlContextWrapper.d.ts +78 -3
  72. package/dist/src/core/lib/WebGlContextWrapper.js +150 -25
  73. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  74. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  75. package/dist/src/core/lib/collectionUtils.js +82 -0
  76. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  77. package/dist/src/core/lib/colorCache.d.ts +1 -0
  78. package/dist/src/core/lib/colorCache.js +19 -0
  79. package/dist/src/core/lib/colorCache.js.map +1 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +1 -19
  81. package/dist/src/core/lib/colorParser.js.map +1 -0
  82. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  83. package/dist/src/core/lib/textureCompression.js +320 -85
  84. package/dist/src/core/lib/textureCompression.js.map +1 -1
  85. package/dist/src/core/lib/textureSvg.js +0 -18
  86. package/dist/src/core/lib/textureSvg.js.map +1 -1
  87. package/dist/src/core/lib/utils.d.ts +8 -1
  88. package/dist/src/core/lib/utils.js +44 -20
  89. package/dist/src/core/lib/utils.js.map +1 -1
  90. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  91. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  92. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  93. package/dist/src/core/platforms/Platform.d.ts +42 -0
  94. package/dist/src/core/platforms/Platform.js +4 -0
  95. package/dist/src/core/platforms/Platform.js.map +1 -0
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  100. package/dist/src/core/renderers/CoreContextTexture.js +0 -18
  101. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  102. package/dist/src/core/renderers/CoreRenderOp.js +0 -18
  103. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/CoreRenderer.d.ts +15 -3
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -18
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +13 -3
  108. package/dist/src/core/renderers/CoreShaderNode.js +25 -2
  109. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
  111. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +89 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -21
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +18 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/BatchRenderOp.d.ts +25 -0
  121. package/dist/src/core/renderers/webgl/BatchRenderOp.js +60 -0
  122. package/dist/src/core/renderers/webgl/BatchRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  124. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  125. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  126. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  128. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  130. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  131. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  133. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
  134. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
  136. package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
  137. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
  139. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  140. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  141. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  142. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
  143. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  144. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  145. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  146. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  147. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  148. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  149. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
  150. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  151. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  152. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  154. package/dist/src/core/shaders/canvas/Border.js +67 -41
  155. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  156. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  157. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  158. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
  159. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  160. package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
  161. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  162. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  163. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
  166. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  168. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
  169. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  170. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
  171. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  172. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  173. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  174. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  175. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  176. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  177. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  178. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
  179. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  181. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
  182. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  183. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  184. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  186. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  187. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  188. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
  189. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  190. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  191. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  192. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  193. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
  194. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  195. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  197. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  198. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  200. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  201. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  202. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  203. package/dist/src/core/shaders/utils.js +25 -0
  204. package/dist/src/core/shaders/utils.js.map +1 -0
  205. package/dist/src/core/shaders/webgl/Border.js +118 -51
  206. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  207. package/dist/src/core/shaders/webgl/Default.js +6 -41
  208. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  209. package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
  210. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  211. package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
  212. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  213. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
  214. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  215. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  216. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  217. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
  218. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  219. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
  220. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  221. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  222. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  223. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  224. package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
  225. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  226. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  227. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  228. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  229. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  230. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  231. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  232. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  233. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  234. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  235. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  236. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  237. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  238. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  239. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  240. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  241. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  242. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  243. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  244. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  245. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  246. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  247. package/dist/src/core/text-rendering/Utils.js +66 -0
  248. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  249. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  250. package/dist/src/core/textures/ColorTexture.js +3 -22
  251. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  252. package/dist/src/core/textures/ImageTexture.d.ts +13 -6
  253. package/dist/src/core/textures/ImageTexture.js +57 -66
  254. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  255. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  256. package/dist/src/core/textures/NoiseTexture.js +8 -26
  257. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  258. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  259. package/dist/src/core/textures/RenderTexture.js +12 -30
  260. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  261. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  262. package/dist/src/core/textures/SubTexture.js +19 -55
  263. package/dist/src/core/textures/SubTexture.js.map +1 -1
  264. package/dist/src/core/textures/Texture.d.ts +90 -12
  265. package/dist/src/core/textures/Texture.js +160 -35
  266. package/dist/src/core/textures/Texture.js.map +1 -1
  267. package/dist/src/core/utils.d.ts +2 -1
  268. package/dist/src/core/utils.js +1 -19
  269. package/dist/src/core/utils.js.map +1 -1
  270. package/dist/src/main-api/INode.js.map +1 -1
  271. package/dist/src/main-api/Inspector.d.ts +135 -2
  272. package/dist/src/main-api/Inspector.js +507 -30
  273. package/dist/src/main-api/Inspector.js.map +1 -1
  274. package/dist/src/main-api/Renderer.d.ts +294 -81
  275. package/dist/src/main-api/Renderer.js +225 -96
  276. package/dist/src/main-api/Renderer.js.map +1 -1
  277. package/dist/src/utils.d.ts +19 -6
  278. package/dist/src/utils.js +32 -27
  279. package/dist/src/utils.js.map +1 -1
  280. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  281. package/dist/tsconfig.tsbuildinfo +1 -0
  282. package/exports/canvas-shaders.ts +0 -17
  283. package/exports/canvas.ts +1 -19
  284. package/exports/index.ts +6 -27
  285. package/exports/inspector.ts +0 -19
  286. package/exports/utils.ts +7 -19
  287. package/exports/webgl-shaders.ts +0 -16
  288. package/exports/webgl.ts +3 -20
  289. package/package.json +23 -22
  290. package/src/common/CommonTypes.ts +20 -22
  291. package/src/common/EventEmitter.ts +0 -19
  292. package/src/common/IAnimationController.ts +0 -18
  293. package/src/common/IEventEmitter.ts +0 -17
  294. package/src/core/Autosizer.ts +205 -0
  295. package/src/core/CoreNode.test.ts +376 -45
  296. package/src/core/CoreNode.ts +1017 -656
  297. package/src/core/CoreShaderManager.ts +3 -21
  298. package/src/core/CoreTextNode.ts +457 -314
  299. package/src/core/CoreTextureManager.ts +123 -168
  300. package/src/core/Stage.ts +526 -236
  301. package/src/core/TextureError.ts +46 -0
  302. package/src/core/TextureMemoryManager.ts +150 -167
  303. package/src/core/animations/AnimationManager.ts +0 -19
  304. package/src/core/animations/CoreAnimation.ts +15 -32
  305. package/src/core/animations/CoreAnimationController.ts +13 -23
  306. package/src/core/lib/ContextSpy.ts +0 -19
  307. package/src/core/lib/ImageWorker.ts +45 -32
  308. package/src/core/lib/Matrix3d.ts +7 -20
  309. package/src/core/lib/RenderCoords.ts +36 -67
  310. package/src/core/lib/WebGlContextWrapper.ts +196 -72
  311. package/src/core/lib/collectionUtils.ts +99 -0
  312. package/src/core/lib/colorCache.ts +20 -0
  313. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
  314. package/src/core/lib/textureCompression.ts +433 -93
  315. package/src/core/lib/textureSvg.ts +0 -19
  316. package/src/core/lib/utils.ts +58 -19
  317. package/src/core/lib/validateImageBitmap.ts +17 -6
  318. package/src/core/platforms/Platform.ts +64 -0
  319. package/src/core/platforms/web/WebPlatform.ts +132 -0
  320. package/src/core/renderers/CoreContextTexture.ts +2 -20
  321. package/src/core/renderers/CoreRenderOp.ts +0 -19
  322. package/src/core/renderers/CoreRenderer.ts +16 -23
  323. package/src/core/renderers/CoreShaderNode.ts +37 -6
  324. package/src/core/renderers/CoreShaderProgram.ts +0 -19
  325. package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
  326. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
  327. package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
  328. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  329. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
  330. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
  331. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
  332. package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
  333. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
  334. package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
  335. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  336. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  337. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
  338. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  339. package/src/core/shaders/canvas/Border.ts +91 -50
  340. package/src/core/shaders/canvas/HolePunch.ts +4 -28
  341. package/src/core/shaders/canvas/LinearGradient.ts +10 -25
  342. package/src/core/shaders/canvas/RadialGradient.ts +23 -54
  343. package/src/core/shaders/canvas/Rounded.ts +2 -19
  344. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
  345. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
  346. package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
  347. package/src/core/shaders/canvas/Shadow.ts +0 -17
  348. package/src/core/shaders/canvas/utils/render.ts +45 -53
  349. package/src/core/shaders/templates/BorderTemplate.ts +42 -29
  350. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
  351. package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
  352. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
  353. package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
  354. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
  355. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
  356. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
  357. package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
  358. package/src/core/shaders/utils.ts +30 -0
  359. package/src/core/shaders/webgl/Border.ts +118 -55
  360. package/src/core/shaders/webgl/Default.ts +6 -43
  361. package/src/core/shaders/webgl/HolePunch.ts +4 -24
  362. package/src/core/shaders/webgl/LinearGradient.ts +73 -35
  363. package/src/core/shaders/webgl/RadialGradient.ts +58 -51
  364. package/src/core/shaders/webgl/Rounded.ts +25 -45
  365. package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
  366. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
  367. package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
  368. package/src/core/shaders/webgl/SdfShader.ts +8 -41
  369. package/src/core/shaders/webgl/Shadow.ts +39 -35
  370. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  371. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  372. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  373. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  374. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  375. package/src/core/text-rendering/TextRenderer.ts +426 -0
  376. package/src/core/text-rendering/Utils.ts +80 -0
  377. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  378. package/src/core/textures/ColorTexture.ts +7 -24
  379. package/src/core/textures/ImageTexture.ts +110 -92
  380. package/src/core/textures/NoiseTexture.ts +14 -31
  381. package/src/core/textures/RenderTexture.ts +18 -35
  382. package/src/core/textures/SubTexture.ts +25 -65
  383. package/src/core/textures/Texture.ts +214 -46
  384. package/src/core/utils.ts +9 -26
  385. package/src/main-api/INode.ts +0 -18
  386. package/src/main-api/Inspector.ts +794 -38
  387. package/src/main-api/Renderer.ts +519 -159
  388. package/src/utils.ts +64 -29
  389. package/dist/src/core/platform.d.ts +0 -10
  390. package/dist/src/core/platform.js +0 -56
  391. package/dist/src/core/platform.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
  393. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
  394. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  395. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  396. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
  397. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
  398. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  399. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  400. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  401. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +0 -2
  402. package/dist/src/core/shaders/webgl/DefaultBatched.js +0 -104
  403. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +0 -1
  404. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  405. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  406. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  407. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  408. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  409. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  410. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  411. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  412. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  413. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  414. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  415. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  416. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  417. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  418. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  419. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  420. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  421. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  422. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  423. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  424. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  425. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  426. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  427. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  428. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  429. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  430. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  431. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  432. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  433. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  434. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
  435. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  436. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  437. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
  438. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
  439. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  440. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  441. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  442. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  443. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  444. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  445. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  446. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  447. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  448. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  449. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  450. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  451. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  452. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  453. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  454. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  455. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  456. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  457. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  458. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  459. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  460. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  461. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  462. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  463. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  464. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  465. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  466. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  467. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
  468. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  469. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  470. package/scripts/please-use-pnpm.js +0 -13
  471. package/src/core/platform.ts +0 -64
  472. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  473. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
  474. package/src/core/shaders/templates/shaderUtils.ts +0 -47
  475. package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
  476. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  477. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  478. package/src/core/text-rendering/TrFontManager.ts +0 -183
  479. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  480. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  481. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  482. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  483. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  484. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  485. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  486. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  487. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  496. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  497. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  498. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  499. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  500. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  501. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  502. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  503. /package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +0 -0
@@ -1,23 +1,11 @@
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
- */
1
+ import { type CompressedData, type TextureData } from '../textures/Texture.js';
2
+ import type { WebGlContextWrapper } from './WebGlContextWrapper.js';
19
3
 
20
- import { type TextureData } from '../textures/Texture.js';
4
+ export type UploadCompressedTextureFunction = (
5
+ glw: WebGlContextWrapper,
6
+ texture: WebGLTexture,
7
+ data: CompressedData,
8
+ ) => void;
21
9
 
22
10
  /**
23
11
  * Tests if the given location is a compressed texture container
@@ -27,10 +15,38 @@ import { type TextureData } from '../textures/Texture.js';
27
15
  * and only supports the following extensions: .ktx and .pvr
28
16
  * @returns
29
17
  */
30
- export function isCompressedTextureContainer(url: string): boolean {
31
- return /\.(ktx|pvr)$/.test(url);
18
+ export function isCompressedTextureContainer(src: string): boolean {
19
+ return /\.(ktx|pvr)$/.test(src);
32
20
  }
33
21
 
22
+ const PVR_MAGIC = 0x03525650; // 'PVR3' in little-endian
23
+ const PVR_TO_GL_INTERNAL_FORMAT: Record<string, number> = {
24
+ 0: 0x8c01,
25
+ 1: 0x8c03,
26
+ 2: 0x8c00,
27
+ 3: 0x8c02, // PVRTC1
28
+ 6: 0x8d64, // ETC1
29
+ 7: 0x83f0,
30
+ 8: 0x83f2,
31
+ 9: 0x83f2,
32
+ 10: 0x83f3,
33
+ 11: 0x83f3, // DXT variants
34
+ };
35
+ const ASTC_MAGIC = 0x5ca1ab13;
36
+
37
+ const ASTC_TO_GL_INTERNAL_FORMAT: Record<string, number> = {
38
+ '4x4': 0x93b0, // COMPRESSED_RGBA_ASTC_4x4_KHR
39
+ '5x5': 0x93b1, // COMPRESSED_RGBA_ASTC_5x5_KHR
40
+ '6x6': 0x93b2, // COMPRESSED_RGBA_ASTC_6x6_KHR
41
+ '8x8': 0x93b3, // COMPRESSED_RGBA_ASTC_8x8_KHR
42
+ '10x10': 0x93b4, // COMPRESSED_RGBA_ASTC_10x10_KHR
43
+ '12x12': 0x93b5, // COMPRESSED_RGBA_ASTC_12x12_KHR
44
+ };
45
+
46
+ // KTX file identifier
47
+ const KTX_IDENTIFIER = [
48
+ 0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a,
49
+ ];
34
50
  /**
35
51
  * Loads a compressed texture container
36
52
  * @param url
@@ -39,114 +55,438 @@ export function isCompressedTextureContainer(url: string): boolean {
39
55
  export const loadCompressedTexture = async (
40
56
  url: string,
41
57
  ): Promise<TextureData> => {
42
- const response = await fetch(url);
43
- const arrayBuffer = await response.arrayBuffer();
58
+ try {
59
+ const response = await fetch(url);
60
+ if (!response.ok) {
61
+ throw new Error(
62
+ `Failed to fetch compressed texture: ${response.status} ${response.statusText}`,
63
+ );
64
+ }
44
65
 
45
- if (url.indexOf('.ktx') !== -1) {
46
- return loadKTXData(arrayBuffer);
47
- }
66
+ const arrayBuffer = await response.arrayBuffer();
67
+
68
+ // Ensure we have enough data to check magic numbers
69
+ if (arrayBuffer.byteLength < 16) {
70
+ throw new Error(
71
+ `File too small to be a valid compressed texture (${arrayBuffer.byteLength} bytes). Expected at least 16 bytes for header inspection.`,
72
+ );
73
+ }
48
74
 
49
- return loadPVRData(arrayBuffer);
75
+ const view = new DataView(arrayBuffer);
76
+ const magic = view.getUint32(0, true);
77
+
78
+ if (magic === PVR_MAGIC) {
79
+ return loadPVR(view);
80
+ }
81
+
82
+ if (magic === ASTC_MAGIC) {
83
+ return loadASTC(view);
84
+ }
85
+
86
+ let isKTX = true;
87
+
88
+ for (let i = 0; i < KTX_IDENTIFIER.length; i++) {
89
+ if (view.getUint8(i) !== KTX_IDENTIFIER[i]) {
90
+ isKTX = false;
91
+ break;
92
+ }
93
+ }
94
+
95
+ if (isKTX === true) {
96
+ return loadKTX(view);
97
+ } else {
98
+ throw new Error('Unrecognized compressed texture format');
99
+ }
100
+ } catch (error) {
101
+ throw new Error(`Failed to load compressed texture from ${url}: ${error}`);
102
+ }
50
103
  };
51
104
 
105
+ function readUint24(view: DataView, offset: number) {
106
+ return (
107
+ view.getUint8(offset) +
108
+ (view.getUint8(offset + 1) << 8) +
109
+ (view.getUint8(offset + 2) << 16)
110
+ );
111
+ }
112
+
52
113
  /**
53
- * Loads a KTX texture container and returns the texture data
54
- * @param buffer
114
+ * Loads an ASTC texture container and returns the texture data
115
+ * @param view
55
116
  * @returns
56
117
  */
57
- const loadKTXData = async (buffer: ArrayBuffer): Promise<TextureData> => {
58
- const view = new DataView(buffer);
59
- const littleEndian = view.getUint32(12) === 16909060 ? true : false;
118
+ const loadASTC = async function (view: DataView): Promise<TextureData> {
119
+ const blockX = view.getUint8(4);
120
+ const blockY = view.getUint8(5);
121
+ const sizeX = readUint24(view, 7);
122
+ const sizeY = readUint24(view, 10);
123
+
124
+ if (sizeX === 0 || sizeY === 0) {
125
+ throw new Error(`Invalid ASTC texture dimensions: ${sizeX}x${sizeY}`);
126
+ }
127
+ const expected = Math.ceil(sizeX / blockX) * Math.ceil(sizeY / blockY) * 16;
128
+ const dataSize = view.byteLength - 16;
129
+ if (expected !== dataSize) {
130
+ throw new Error(
131
+ `Invalid ASTC texture data size: expected ${expected}, got ${dataSize}`,
132
+ );
133
+ }
134
+
135
+ const internalFormat = ASTC_TO_GL_INTERNAL_FORMAT[`${blockX}x${blockY}`];
136
+ if (internalFormat === undefined) {
137
+ throw new Error(`Unsupported ASTC block size: ${blockX}x${blockY}`);
138
+ }
139
+
140
+ const buffer = view.buffer as ArrayBuffer;
141
+
60
142
  const mipmaps: ArrayBuffer[] = [];
143
+ mipmaps.push(buffer.slice(16));
61
144
 
62
- const data = {
63
- glInternalFormat: view.getUint32(28, littleEndian),
64
- pixelWidth: view.getUint32(36, littleEndian),
65
- pixelHeight: view.getUint32(40, littleEndian),
66
- numberOfMipmapLevels: view.getUint32(56, littleEndian),
67
- bytesOfKeyValueData: view.getUint32(60, littleEndian),
145
+ return {
146
+ data: {
147
+ blockInfo: blockInfoMap[internalFormat]!,
148
+ glInternalFormat: internalFormat,
149
+ mipmaps,
150
+ w: sizeX,
151
+ h: sizeY,
152
+ type: 'astc',
153
+ },
154
+ premultiplyAlpha: false,
68
155
  };
156
+ };
157
+
158
+ const uploadASTC = function (
159
+ glw: WebGlContextWrapper,
160
+ texture: WebGLTexture,
161
+ data: CompressedData,
162
+ ) {
163
+ if (glw.getExtension('WEBGL_compressed_texture_astc') === null) {
164
+ throw new Error('ASTC compressed textures not supported by this device');
165
+ }
166
+
167
+ glw.bindTexture(texture);
168
+
169
+ const { glInternalFormat, mipmaps, w, h } = data;
170
+ if (mipmaps === undefined) {
171
+ return;
172
+ }
173
+
174
+ const view = new Uint8Array(mipmaps[0]!);
69
175
 
70
- let offset = 64;
176
+ glw.compressedTexImage2D(0, glInternalFormat, w, h, 0, view);
177
+ // ASTC textures MUST use no mipmaps unless stored
178
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
179
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
180
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
181
+ glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
182
+ };
183
+ /**
184
+ * Loads a KTX texture container and returns the texture data
185
+ * @param view
186
+ * @returns
187
+ */
188
+ const loadKTX = async function (view: DataView): Promise<TextureData> {
189
+ const endianness = view.getUint32(12, true);
190
+ const littleEndian = endianness === 0x04030201;
191
+ if (littleEndian === false && endianness !== 0x01020304) {
192
+ throw new Error('Invalid KTX endianness value');
193
+ }
194
+
195
+ const glType = view.getUint32(16, littleEndian);
196
+ const glFormat = view.getUint32(24, littleEndian);
197
+ if (glType !== 0 || glFormat !== 0) {
198
+ throw new Error(
199
+ `KTX texture is not compressed (glType: ${glType}, glFormat: ${glFormat})`,
200
+ );
201
+ }
202
+
203
+ const glInternalFormat = view.getUint32(28, littleEndian);
204
+ if (blockInfoMap[glInternalFormat] === undefined) {
205
+ throw new Error(
206
+ `Unsupported KTX compressed texture format: 0x${glInternalFormat.toString(
207
+ 16,
208
+ )}`,
209
+ );
210
+ }
211
+
212
+ const width = view.getUint32(36, littleEndian);
213
+ const height = view.getUint32(40, littleEndian);
214
+ if (width === 0 || height === 0) {
215
+ throw new Error(`Invalid KTX texture dimensions: ${width}x${height}`);
216
+ }
217
+
218
+ const mipmapLevels = view.getUint32(56, littleEndian);
219
+ if (mipmapLevels === 0) {
220
+ throw new Error('KTX texture has no mipmap levels');
221
+ }
222
+
223
+ const bytesOfKeyValueData = view.getUint32(60, littleEndian);
224
+ const mipmaps: ArrayBuffer[] = [];
225
+ const buffer = view.buffer as ArrayBuffer;
226
+ let offset = 64 + bytesOfKeyValueData;
71
227
 
72
- // Key Value Pairs of data start at byte offset 64
73
- // But the only known kvp is the API version, so skipping parsing.
74
- offset += data.bytesOfKeyValueData;
228
+ if (offset > view.byteLength) {
229
+ throw new Error('Invalid KTX file: key/value data exceeds file size');
230
+ }
75
231
 
76
- for (let i = 0; i < data.numberOfMipmapLevels; i++) {
77
- const imageSize = view.getUint32(offset);
232
+ for (let i = 0; i < mipmapLevels; i++) {
233
+ const imageSize = view.getUint32(offset, littleEndian);
78
234
  offset += 4;
79
235
 
80
- mipmaps.push(view.buffer.slice(offset, imageSize));
81
- offset += imageSize;
236
+ const end = offset + imageSize;
237
+
238
+ mipmaps.push(buffer.slice(offset, end));
239
+ offset = end;
240
+ if (offset % 4 !== 0) {
241
+ offset += 4 - (offset % 4);
242
+ }
82
243
  }
83
244
 
84
245
  return {
85
246
  data: {
86
- glInternalFormat: data.glInternalFormat,
247
+ blockInfo: blockInfoMap[glInternalFormat]!,
248
+ glInternalFormat: glInternalFormat,
87
249
  mipmaps,
88
- width: data.pixelWidth || 0,
89
- height: data.pixelHeight || 0,
250
+ w: width,
251
+ h: height,
90
252
  type: 'ktx',
91
253
  },
92
254
  premultiplyAlpha: false,
93
255
  };
94
256
  };
95
257
 
96
- /**
97
- * Loads a PVR texture container and returns the texture data
98
- * @param buffer
99
- * @returns
100
- */
101
- const loadPVRData = async (buffer: ArrayBuffer): Promise<TextureData> => {
102
- // pvr header length in 32 bits
103
- const pvrHeaderLength = 13;
104
- // for now only we only support: COMPRESSED_RGB_ETC1_WEBGL
105
- const pvrFormatEtc1 = 0x8d64;
106
- const pvrWidth = 7;
107
- const pvrHeight = 6;
108
- const pvrMipmapCount = 11;
109
- const pvrMetadata = 12;
110
- const arrayBuffer = buffer;
111
- const header = new Int32Array(arrayBuffer, 0, pvrHeaderLength);
112
-
113
- // @ts-expect-error Object possibly undefined
114
-
115
- const dataOffset = header[pvrMetadata] + 52;
116
- const pvrtcData = new Uint8Array(arrayBuffer, dataOffset);
117
- const mipmaps: Uint8Array[] = [];
118
- const data = {
119
- pixelWidth: header[pvrWidth],
120
- pixelHeight: header[pvrHeight],
121
- numberOfMipmapLevels: header[pvrMipmapCount] || 0,
122
- };
258
+ const uploadKTX = function (
259
+ glw: WebGlContextWrapper,
260
+ texture: WebGLTexture,
261
+ data: CompressedData,
262
+ ) {
263
+ const { glInternalFormat, mipmaps, w: width, h: height, blockInfo } = data;
264
+ if (mipmaps === undefined) {
265
+ return;
266
+ }
267
+ glw.bindTexture(texture);
123
268
 
124
- let offset = 0;
125
- let width = data.pixelWidth || 0;
126
- let height = data.pixelHeight || 0;
269
+ const blockWidth = blockInfo.width;
270
+ const blockHeight = blockInfo.height;
271
+ let w = width;
272
+ let h = height;
273
+
274
+ for (let i = 0; i < mipmaps!.length; i++) {
275
+ let view = new Uint8Array(mipmaps![i]!);
276
+
277
+ const uploadW = Math.ceil(w / blockWidth) * blockWidth;
278
+ const uploadH = Math.ceil(h / blockHeight) * blockHeight;
279
+
280
+ const expectedBytes =
281
+ Math.ceil(w / blockWidth) * Math.ceil(h / blockHeight) * blockInfo.bytes;
282
+
283
+ if (view.byteLength < expectedBytes) {
284
+ const padded = new Uint8Array(expectedBytes);
285
+ padded.set(view);
286
+ view = padded;
287
+ }
288
+
289
+ glw.compressedTexImage2D(i, glInternalFormat, uploadW, uploadH, 0, view);
290
+
291
+ w = Math.max(1, w >> 1);
292
+ h = Math.max(1, h >> 1);
293
+ }
127
294
 
128
- for (let i = 0; i < data.numberOfMipmapLevels; i++) {
129
- const level = ((width + 3) >> 2) * ((height + 3) >> 2) * 8;
130
- const view = new Uint8Array(
131
- arrayBuffer,
132
- pvrtcData.byteOffset + offset,
133
- level,
295
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
296
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
297
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
298
+ glw.texParameteri(
299
+ glw.TEXTURE_MIN_FILTER,
300
+ mipmaps!.length > 1 ? glw.LINEAR_MIPMAP_LINEAR : glw.LINEAR,
301
+ );
302
+ };
303
+
304
+ function pvrtcMipSize(width: number, height: number, bpp: 2 | 4) {
305
+ const minW = bpp === 2 ? 16 : 8;
306
+ const minH = 8;
307
+ const w = Math.max(width, minW);
308
+ const h = Math.max(height, minH);
309
+ return (w * h * bpp) / 8;
310
+ }
311
+
312
+ const loadPVR = async function (view: DataView): Promise<TextureData> {
313
+ const pixelFormatLow = view.getUint32(8, true);
314
+ const internalFormat = PVR_TO_GL_INTERNAL_FORMAT[pixelFormatLow];
315
+
316
+ if (internalFormat === undefined) {
317
+ throw new Error(
318
+ `Unsupported PVR pixel format: 0x${pixelFormatLow.toString(16)}`,
134
319
  );
320
+ }
321
+
322
+ const height = view.getInt32(24, true);
323
+ const width = view.getInt32(28, true);
324
+
325
+ // validate dimensions
326
+ if (width === 0 || height === 0) {
327
+ throw new Error(`Invalid PVR texture dimensions: ${width}x${height}`);
328
+ }
329
+ const mipmapLevels = view.getInt32(44, true);
330
+ const metadataSize = view.getUint32(48, true);
331
+ const buffer = view.buffer as ArrayBuffer;
332
+
333
+ let offset = 52 + metadataSize;
334
+ if (offset > buffer.byteLength) {
335
+ throw new Error('Invalid PVR file: metadata exceeds file size');
336
+ }
337
+
338
+ const mipmaps: ArrayBuffer[] = [];
135
339
 
136
- mipmaps.push(view);
137
- offset += level;
138
- width = width >> 1;
139
- height = height >> 1;
340
+ const block = blockInfoMap[internalFormat]!;
341
+
342
+ for (let i = 0; i < mipmapLevels; i++) {
343
+ const declaredSize = view.getUint32(offset, true);
344
+ const max = buffer.byteLength - (offset + 4);
345
+
346
+ if (declaredSize > 0 && declaredSize <= max) {
347
+ offset += 4;
348
+ const start = offset;
349
+ const end = offset + declaredSize;
350
+
351
+ mipmaps.push(buffer.slice(start, end));
352
+ offset = end;
353
+ offset = (offset + 3) & ~3; // align to 4 bytes
354
+ continue;
355
+ }
356
+
357
+ if (
358
+ pixelFormatLow === 0 ||
359
+ pixelFormatLow === 1 ||
360
+ pixelFormatLow === 2 ||
361
+ pixelFormatLow === 3
362
+ ) {
363
+ const bpp = pixelFormatLow === 0 || pixelFormatLow === 1 ? 2 : 4;
364
+ const computed = pvrtcMipSize(width >> i, height >> i, bpp);
365
+
366
+ mipmaps.push(buffer.slice(offset, offset + computed));
367
+ offset += computed;
368
+ offset = (offset + 3) & ~3; // align to 4 bytes
369
+ continue;
370
+ }
371
+
372
+ if (block !== undefined) {
373
+ const blockW = Math.ceil((width >> i) / block.width);
374
+ const blockH = Math.ceil((height >> i) / block.height);
375
+ const computed = blockW * blockH * block.bytes;
376
+
377
+ mipmaps.push(buffer.slice(offset, offset + computed));
378
+ offset += computed;
379
+ offset = (offset + 3) & ~3;
380
+ }
140
381
  }
141
382
 
142
383
  return {
143
384
  data: {
144
- glInternalFormat: pvrFormatEtc1,
145
- mipmaps: mipmaps,
146
- width: data.pixelWidth || 0,
147
- height: data.pixelHeight || 0,
385
+ blockInfo: blockInfoMap[internalFormat]!,
386
+ glInternalFormat: internalFormat,
387
+ mipmaps,
388
+ w: width,
389
+ h: height,
148
390
  type: 'pvr',
149
391
  },
150
392
  premultiplyAlpha: false,
151
393
  };
152
394
  };
395
+
396
+ const uploadPVR = function (
397
+ glw: WebGlContextWrapper,
398
+ texture: WebGLTexture,
399
+ data: CompressedData,
400
+ ) {
401
+ const { glInternalFormat, mipmaps, w: width, h: height } = data;
402
+ if (mipmaps === undefined) {
403
+ return;
404
+ }
405
+ glw.bindTexture(texture);
406
+
407
+ let w = width;
408
+ let h = height;
409
+
410
+ for (let i = 0; i < mipmaps!.length; i++) {
411
+ glw.compressedTexImage2D(
412
+ i,
413
+ glInternalFormat,
414
+ w,
415
+ h,
416
+ 0,
417
+ new Uint8Array(mipmaps[i]!),
418
+ );
419
+
420
+ w = Math.max(1, w >> 1);
421
+ h = Math.max(1, h >> 1);
422
+ }
423
+
424
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
425
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
426
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
427
+ glw.texParameteri(
428
+ glw.TEXTURE_MIN_FILTER,
429
+ mipmaps.length > 1 ? glw.LINEAR_MIPMAP_LINEAR : glw.LINEAR,
430
+ );
431
+ };
432
+
433
+ type BlockInfo = {
434
+ width: number;
435
+ height: number;
436
+ bytes: number;
437
+ };
438
+
439
+ // Predefined block info for common compressed texture formats
440
+ const BLOCK_4x4x8: BlockInfo = { width: 4, height: 4, bytes: 8 };
441
+ const BLOCK_4x4x16: BlockInfo = { width: 4, height: 4, bytes: 16 };
442
+ const BLOCK_5x5x16: BlockInfo = { width: 5, height: 5, bytes: 16 };
443
+ const BLOCK_6x6x16: BlockInfo = { width: 6, height: 6, bytes: 16 };
444
+ const BLOCK_8x4x8: BlockInfo = { width: 8, height: 4, bytes: 8 };
445
+ const BLOCK_8x8x16: BlockInfo = { width: 8, height: 8, bytes: 16 };
446
+ const BLOCK_10x10x16: BlockInfo = { width: 10, height: 10, bytes: 16 };
447
+ const BLOCK_12x12x16: BlockInfo = { width: 12, height: 12, bytes: 16 };
448
+
449
+ // Map of GL internal formats to their corresponding block info
450
+ export const blockInfoMap: { [key: number]: BlockInfo } = {
451
+ // S3TC / DXTn (WEBGL_compressed_texture_s3tc, sRGB variants)
452
+ 0x83f0: BLOCK_4x4x8, // COMPRESSED_RGB_S3TC_DXT1_EXT
453
+ 0x83f1: BLOCK_4x4x8, // COMPRESSED_RGBA_S3TC_DXT1_EXT
454
+ 0x83f2: BLOCK_4x4x16, // COMPRESSED_RGBA_S3TC_DXT3_EXT
455
+ 0x83f3: BLOCK_4x4x16, // COMPRESSED_RGBA_S3TC_DXT5_EXT
456
+
457
+ // ETC1 / ETC2 / EAC
458
+ 0x8d64: BLOCK_4x4x8, // COMPRESSED_RGB_ETC1_WEBGL
459
+ 0x9274: BLOCK_4x4x8, // COMPRESSED_RGB8_ETC2
460
+ 0x9275: BLOCK_4x4x8, // COMPRESSED_SRGB8_ETC2
461
+ 0x9278: BLOCK_4x4x16, // COMPRESSED_RGBA8_ETC2_EAC
462
+ 0x9279: BLOCK_4x4x16, // COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
463
+
464
+ // PVRTC (WEBGL_compressed_texture_pvrtc)
465
+ 0x8c00: BLOCK_4x4x8, // COMPRESSED_RGB_PVRTC_4BPPV1_IMG
466
+ 0x8c02: BLOCK_4x4x8, // COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
467
+ 0x8c01: BLOCK_8x4x8, // COMPRESSED_RGB_PVRTC_2BPPV1_IMG
468
+ 0x8c03: BLOCK_8x4x8,
469
+
470
+ // ASTC (WEBGL_compressed_texture_astc)
471
+ 0x93b0: BLOCK_4x4x16, // COMPRESSED_RGBA_ASTC_4x4_KHR
472
+ 0x93d0: BLOCK_4x4x16, // COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
473
+ 0x93b1: BLOCK_5x5x16, // 5x5
474
+ 0x93d1: BLOCK_5x5x16,
475
+ 0x93b2: BLOCK_6x6x16, // 6x6
476
+ 0x93d2: BLOCK_6x6x16,
477
+ 0x93b3: BLOCK_8x8x16, // 8x8
478
+ 0x93d3: BLOCK_8x8x16,
479
+ 0x93b4: BLOCK_10x10x16, // 10x10
480
+ 0x93d4: BLOCK_10x10x16,
481
+ 0x93b5: BLOCK_12x12x16, // 12x12
482
+ 0x93d5: BLOCK_12x12x16,
483
+ };
484
+
485
+ export const uploadCompressedTexture: Record<
486
+ string,
487
+ UploadCompressedTextureFunction
488
+ > = {
489
+ ktx: uploadKTX,
490
+ pvr: uploadPVR,
491
+ astc: uploadASTC,
492
+ };
@@ -1,22 +1,3 @@
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
1
  import { assertTruthy } from '../../utils.js';
21
2
  import { type TextureData } from '../textures/Texture.js';
22
3