@lightningtv/renderer 3.0.0-beta1 → 3.2.3

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 (497) 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 +140 -102
  32. package/dist/src/core/CoreNode.js +812 -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 +82 -139
  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 +83 -8
  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/SdfRenderOp.d.ts +33 -0
  121. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  122. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  124. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  125. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  126. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  128. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  130. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
  131. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
  133. package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
  134. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
  136. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  137. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  139. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
  140. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  141. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  142. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  143. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  144. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  145. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  146. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
  147. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  148. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  149. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  150. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  151. package/dist/src/core/shaders/canvas/Border.js +67 -41
  152. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  154. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  155. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
  156. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  157. package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
  158. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  159. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  160. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  161. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  162. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
  163. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
  166. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
  168. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  169. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  170. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  171. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  172. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  173. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  174. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  175. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
  176. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  177. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  178. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
  179. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  181. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  182. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  183. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  184. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
  186. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  187. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  188. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  189. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  190. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
  191. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  192. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  193. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  194. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  195. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  197. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  198. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  200. package/dist/src/core/shaders/utils.js +25 -0
  201. package/dist/src/core/shaders/utils.js.map +1 -0
  202. package/dist/src/core/shaders/webgl/Border.js +118 -51
  203. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  204. package/dist/src/core/shaders/webgl/Default.js +6 -41
  205. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  206. package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
  207. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  208. package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
  209. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  210. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
  211. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  212. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  213. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  214. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
  215. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  216. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
  217. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  218. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  219. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  220. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  221. package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
  222. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  223. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  224. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  225. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  226. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  227. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  228. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  229. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  230. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  231. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  232. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  233. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  234. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  235. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  236. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  237. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  238. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  239. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  240. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  241. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  242. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  243. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  244. package/dist/src/core/text-rendering/Utils.js +66 -0
  245. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  246. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  247. package/dist/src/core/textures/ColorTexture.js +3 -22
  248. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  249. package/dist/src/core/textures/ImageTexture.d.ts +13 -6
  250. package/dist/src/core/textures/ImageTexture.js +57 -66
  251. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  252. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  253. package/dist/src/core/textures/NoiseTexture.js +8 -26
  254. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  255. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  256. package/dist/src/core/textures/RenderTexture.js +12 -30
  257. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  258. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  259. package/dist/src/core/textures/SubTexture.js +19 -55
  260. package/dist/src/core/textures/SubTexture.js.map +1 -1
  261. package/dist/src/core/textures/Texture.d.ts +90 -12
  262. package/dist/src/core/textures/Texture.js +160 -35
  263. package/dist/src/core/textures/Texture.js.map +1 -1
  264. package/dist/src/core/utils.d.ts +2 -1
  265. package/dist/src/core/utils.js +1 -19
  266. package/dist/src/core/utils.js.map +1 -1
  267. package/dist/src/main-api/INode.js.map +1 -1
  268. package/dist/src/main-api/Inspector.d.ts +135 -2
  269. package/dist/src/main-api/Inspector.js +507 -30
  270. package/dist/src/main-api/Inspector.js.map +1 -1
  271. package/dist/src/main-api/Renderer.d.ts +294 -81
  272. package/dist/src/main-api/Renderer.js +225 -96
  273. package/dist/src/main-api/Renderer.js.map +1 -1
  274. package/dist/src/utils.d.ts +19 -6
  275. package/dist/src/utils.js +32 -27
  276. package/dist/src/utils.js.map +1 -1
  277. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  278. package/dist/tsconfig.tsbuildinfo +1 -0
  279. package/exports/canvas-shaders.ts +0 -17
  280. package/exports/canvas.ts +1 -19
  281. package/exports/index.ts +6 -27
  282. package/exports/inspector.ts +0 -19
  283. package/exports/utils.ts +7 -19
  284. package/exports/webgl-shaders.ts +0 -16
  285. package/exports/webgl.ts +3 -20
  286. package/package.json +23 -22
  287. package/src/common/CommonTypes.ts +20 -22
  288. package/src/common/EventEmitter.ts +0 -19
  289. package/src/common/IAnimationController.ts +0 -18
  290. package/src/common/IEventEmitter.ts +0 -17
  291. package/src/core/Autosizer.ts +205 -0
  292. package/src/core/CoreNode.test.ts +376 -45
  293. package/src/core/CoreNode.ts +1015 -656
  294. package/src/core/CoreShaderManager.ts +3 -21
  295. package/src/core/CoreTextNode.ts +457 -314
  296. package/src/core/CoreTextureManager.ts +110 -167
  297. package/src/core/Stage.ts +526 -236
  298. package/src/core/TextureError.ts +46 -0
  299. package/src/core/TextureMemoryManager.ts +150 -167
  300. package/src/core/animations/AnimationManager.ts +0 -19
  301. package/src/core/animations/CoreAnimation.ts +15 -32
  302. package/src/core/animations/CoreAnimationController.ts +13 -23
  303. package/src/core/lib/ContextSpy.ts +0 -19
  304. package/src/core/lib/ImageWorker.ts +45 -32
  305. package/src/core/lib/Matrix3d.ts +7 -20
  306. package/src/core/lib/RenderCoords.ts +36 -67
  307. package/src/core/lib/WebGlContextWrapper.ts +196 -72
  308. package/src/core/lib/collectionUtils.ts +99 -0
  309. package/src/core/lib/colorCache.ts +20 -0
  310. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
  311. package/src/core/lib/textureCompression.ts +433 -93
  312. package/src/core/lib/textureSvg.ts +0 -19
  313. package/src/core/lib/utils.ts +58 -19
  314. package/src/core/lib/validateImageBitmap.ts +17 -6
  315. package/src/core/platforms/Platform.ts +64 -0
  316. package/src/core/platforms/web/WebPlatform.ts +132 -0
  317. package/src/core/renderers/CoreContextTexture.ts +2 -20
  318. package/src/core/renderers/CoreRenderOp.ts +0 -19
  319. package/src/core/renderers/CoreRenderer.ts +16 -23
  320. package/src/core/renderers/CoreShaderNode.ts +37 -6
  321. package/src/core/renderers/CoreShaderProgram.ts +0 -19
  322. package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
  323. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
  324. package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
  325. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  326. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
  327. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
  328. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
  329. package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
  330. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
  331. package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
  332. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  333. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  334. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
  335. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  336. package/src/core/shaders/canvas/Border.ts +91 -50
  337. package/src/core/shaders/canvas/HolePunch.ts +4 -28
  338. package/src/core/shaders/canvas/LinearGradient.ts +10 -25
  339. package/src/core/shaders/canvas/RadialGradient.ts +23 -54
  340. package/src/core/shaders/canvas/Rounded.ts +2 -19
  341. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
  342. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
  343. package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
  344. package/src/core/shaders/canvas/Shadow.ts +0 -17
  345. package/src/core/shaders/canvas/utils/render.ts +45 -53
  346. package/src/core/shaders/templates/BorderTemplate.ts +42 -29
  347. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
  348. package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
  349. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
  350. package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
  351. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
  352. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
  353. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
  354. package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
  355. package/src/core/shaders/utils.ts +30 -0
  356. package/src/core/shaders/webgl/Border.ts +118 -55
  357. package/src/core/shaders/webgl/Default.ts +6 -43
  358. package/src/core/shaders/webgl/HolePunch.ts +4 -24
  359. package/src/core/shaders/webgl/LinearGradient.ts +73 -35
  360. package/src/core/shaders/webgl/RadialGradient.ts +58 -51
  361. package/src/core/shaders/webgl/Rounded.ts +25 -45
  362. package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
  363. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
  364. package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
  365. package/src/core/shaders/webgl/SdfShader.ts +8 -41
  366. package/src/core/shaders/webgl/Shadow.ts +39 -35
  367. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  368. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  369. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  370. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  371. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  372. package/src/core/text-rendering/TextRenderer.ts +426 -0
  373. package/src/core/text-rendering/Utils.ts +80 -0
  374. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  375. package/src/core/textures/ColorTexture.ts +7 -24
  376. package/src/core/textures/ImageTexture.ts +110 -92
  377. package/src/core/textures/NoiseTexture.ts +14 -31
  378. package/src/core/textures/RenderTexture.ts +18 -35
  379. package/src/core/textures/SubTexture.ts +25 -65
  380. package/src/core/textures/Texture.ts +214 -46
  381. package/src/core/utils.ts +9 -26
  382. package/src/main-api/INode.ts +0 -18
  383. package/src/main-api/Inspector.ts +794 -38
  384. package/src/main-api/Renderer.ts +519 -159
  385. package/src/utils.ts +64 -29
  386. package/dist/src/core/platform.d.ts +0 -10
  387. package/dist/src/core/platform.js +0 -56
  388. package/dist/src/core/platform.js.map +0 -1
  389. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
  390. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
  391. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  393. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
  394. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
  395. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  396. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  397. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  398. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  399. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  400. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  401. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  402. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  403. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  404. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  405. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  406. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  407. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  408. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  409. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  410. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  411. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  412. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  413. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  414. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  415. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  416. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  417. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  418. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  419. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  420. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  421. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  422. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  423. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  424. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  425. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  426. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  427. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  428. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
  429. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  430. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  431. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
  432. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
  433. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  434. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  435. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  436. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  437. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  438. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  439. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  440. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  441. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  442. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  443. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  444. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  445. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  446. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  447. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  448. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  449. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  450. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  451. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  452. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  453. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  454. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  455. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  456. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  457. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  458. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  459. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  460. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  461. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
  462. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  463. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  464. package/scripts/please-use-pnpm.js +0 -13
  465. package/src/core/platform.ts +0 -64
  466. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  467. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
  468. package/src/core/shaders/templates/shaderUtils.ts +0 -47
  469. package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
  470. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  471. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  472. package/src/core/text-rendering/TrFontManager.ts +0 -183
  473. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  474. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  475. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  476. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  477. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  478. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  479. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  480. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  481. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  482. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  483. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  484. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  485. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  486. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  487. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  496. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  497. /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