@solidtv/renderer 1.0.0

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 (424) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +7 -0
  3. package/README.md +137 -0
  4. package/dist/exports/canvas-shaders.d.ts +10 -0
  5. package/dist/exports/canvas-shaders.js +11 -0
  6. package/dist/exports/canvas-shaders.js.map +1 -0
  7. package/dist/exports/canvas.d.ts +26 -0
  8. package/dist/exports/canvas.js +27 -0
  9. package/dist/exports/canvas.js.map +1 -0
  10. package/dist/exports/index.d.ts +50 -0
  11. package/dist/exports/index.js +40 -0
  12. package/dist/exports/index.js.map +1 -0
  13. package/dist/exports/inspector.d.ts +4 -0
  14. package/dist/exports/inspector.js +5 -0
  15. package/dist/exports/inspector.js.map +1 -0
  16. package/dist/exports/utils.d.ts +27 -0
  17. package/dist/exports/utils.js +28 -0
  18. package/dist/exports/utils.js.map +1 -0
  19. package/dist/exports/webgl-shaders.d.ts +11 -0
  20. package/dist/exports/webgl-shaders.js +12 -0
  21. package/dist/exports/webgl-shaders.js.map +1 -0
  22. package/dist/exports/webgl.d.ts +28 -0
  23. package/dist/exports/webgl.js +29 -0
  24. package/dist/exports/webgl.js.map +1 -0
  25. package/dist/src/common/CommonTypes.d.ts +110 -0
  26. package/dist/src/common/CommonTypes.js +2 -0
  27. package/dist/src/common/CommonTypes.js.map +1 -0
  28. package/dist/src/common/EventEmitter.d.ts +12 -0
  29. package/dist/src/common/EventEmitter.js +48 -0
  30. package/dist/src/common/EventEmitter.js.map +1 -0
  31. package/dist/src/common/IAnimationController.d.ts +58 -0
  32. package/dist/src/common/IAnimationController.js +2 -0
  33. package/dist/src/common/IAnimationController.js.map +1 -0
  34. package/dist/src/common/IEventEmitter.d.ts +8 -0
  35. package/dist/src/common/IEventEmitter.js +2 -0
  36. package/dist/src/common/IEventEmitter.js.map +1 -0
  37. package/dist/src/core/Autosizer.d.ts +35 -0
  38. package/dist/src/core/Autosizer.js +178 -0
  39. package/dist/src/core/Autosizer.js.map +1 -0
  40. package/dist/src/core/CoreNode.d.ts +908 -0
  41. package/dist/src/core/CoreNode.js +1837 -0
  42. package/dist/src/core/CoreNode.js.map +1 -0
  43. package/dist/src/core/CoreShaderManager.d.ts +38 -0
  44. package/dist/src/core/CoreShaderManager.js +123 -0
  45. package/dist/src/core/CoreShaderManager.js.map +1 -0
  46. package/dist/src/core/CoreTextNode.d.ts +91 -0
  47. package/dist/src/core/CoreTextNode.js +440 -0
  48. package/dist/src/core/CoreTextNode.js.map +1 -0
  49. package/dist/src/core/CoreTextureManager.d.ts +264 -0
  50. package/dist/src/core/CoreTextureManager.js +318 -0
  51. package/dist/src/core/CoreTextureManager.js.map +1 -0
  52. package/dist/src/core/Stage.d.ts +238 -0
  53. package/dist/src/core/Stage.js +804 -0
  54. package/dist/src/core/Stage.js.map +1 -0
  55. package/dist/src/core/TextureError.d.ts +11 -0
  56. package/dist/src/core/TextureError.js +37 -0
  57. package/dist/src/core/TextureError.js.map +1 -0
  58. package/dist/src/core/TextureMemoryManager.d.ts +150 -0
  59. package/dist/src/core/TextureMemoryManager.js +239 -0
  60. package/dist/src/core/TextureMemoryManager.js.map +1 -0
  61. package/dist/src/core/animations/AnimationManager.d.ts +33 -0
  62. package/dist/src/core/animations/AnimationManager.js +137 -0
  63. package/dist/src/core/animations/AnimationManager.js.map +1 -0
  64. package/dist/src/core/animations/CoreAnimation.d.ts +12 -0
  65. package/dist/src/core/animations/CoreAnimation.js +107 -0
  66. package/dist/src/core/animations/CoreAnimation.js.map +1 -0
  67. package/dist/src/core/lib/ContextSpy.d.ts +12 -0
  68. package/dist/src/core/lib/ContextSpy.js +20 -0
  69. package/dist/src/core/lib/ContextSpy.js.map +1 -0
  70. package/dist/src/core/lib/ImageWorker.d.ts +16 -0
  71. package/dist/src/core/lib/ImageWorker.js +202 -0
  72. package/dist/src/core/lib/ImageWorker.js.map +1 -0
  73. package/dist/src/core/lib/Matrix3d.d.ts +74 -0
  74. package/dist/src/core/lib/Matrix3d.js +218 -0
  75. package/dist/src/core/lib/Matrix3d.js.map +1 -0
  76. package/dist/src/core/lib/RenderCoords.d.ts +12 -0
  77. package/dist/src/core/lib/RenderCoords.js +35 -0
  78. package/dist/src/core/lib/RenderCoords.js.map +1 -0
  79. package/dist/src/core/lib/WebGlContextWrapper.d.ts +782 -0
  80. package/dist/src/core/lib/WebGlContextWrapper.js +1143 -0
  81. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -0
  82. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  83. package/dist/src/core/lib/collectionUtils.js +82 -0
  84. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  85. package/dist/src/core/lib/colorCache.d.ts +1 -0
  86. package/dist/src/core/lib/colorCache.js +19 -0
  87. package/dist/src/core/lib/colorCache.js.map +1 -0
  88. package/dist/src/core/lib/colorParser.d.ts +21 -0
  89. package/dist/src/core/lib/colorParser.js +54 -0
  90. package/dist/src/core/lib/colorParser.js.map +1 -0
  91. package/dist/src/core/lib/textureCompression.d.ts +28 -0
  92. package/dist/src/core/lib/textureCompression.js +363 -0
  93. package/dist/src/core/lib/textureCompression.js.map +1 -0
  94. package/dist/src/core/lib/textureSvg.d.ts +16 -0
  95. package/dist/src/core/lib/textureSvg.js +45 -0
  96. package/dist/src/core/lib/textureSvg.js.map +1 -0
  97. package/dist/src/core/lib/utils.d.ts +66 -0
  98. package/dist/src/core/lib/utils.js +268 -0
  99. package/dist/src/core/lib/utils.js.map +1 -0
  100. package/dist/src/core/lib/validateImageBitmap.d.ts +7 -0
  101. package/dist/src/core/lib/validateImageBitmap.js +68 -0
  102. package/dist/src/core/lib/validateImageBitmap.js.map +1 -0
  103. package/dist/src/core/platforms/Platform.d.ts +42 -0
  104. package/dist/src/core/platforms/Platform.js +4 -0
  105. package/dist/src/core/platforms/Platform.js.map +1 -0
  106. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  107. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  108. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  109. package/dist/src/core/renderers/CoreContextTexture.d.ts +13 -0
  110. package/dist/src/core/renderers/CoreContextTexture.js +16 -0
  111. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -0
  112. package/dist/src/core/renderers/CoreRenderOp.d.ts +3 -0
  113. package/dist/src/core/renderers/CoreRenderOp.js +3 -0
  114. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -0
  115. package/dist/src/core/renderers/CoreRenderer.d.ts +81 -0
  116. package/dist/src/core/renderers/CoreRenderer.js +14 -0
  117. package/dist/src/core/renderers/CoreRenderer.js.map +1 -0
  118. package/dist/src/core/renderers/CoreShaderNode.d.ts +69 -0
  119. package/dist/src/core/renderers/CoreShaderNode.js +130 -0
  120. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -0
  121. package/dist/src/core/renderers/CoreShaderProgram.d.ts +4 -0
  122. package/dist/src/core/renderers/CoreShaderProgram.js +2 -0
  123. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -0
  124. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +36 -0
  125. package/dist/src/core/renderers/canvas/CanvasRenderer.js +221 -0
  126. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -0
  127. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +21 -0
  128. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +42 -0
  129. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -0
  130. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +17 -0
  131. package/dist/src/core/renderers/canvas/CanvasTexture.js +110 -0
  132. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -0
  133. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +41 -0
  134. package/dist/src/core/renderers/webgl/SdfRenderOp.js +88 -0
  135. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  136. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +14 -0
  137. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +45 -0
  138. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -0
  139. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +22 -0
  140. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +49 -0
  141. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -0
  142. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +67 -0
  143. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +259 -0
  144. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -0
  145. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +221 -0
  146. package/dist/src/core/renderers/webgl/WebGlRenderer.js +1015 -0
  147. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -0
  148. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +213 -0
  149. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +331 -0
  150. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -0
  151. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +37 -0
  152. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +240 -0
  153. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -0
  154. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +28 -0
  155. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +39 -0
  156. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -0
  157. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +55 -0
  158. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +88 -0
  159. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -0
  160. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +74 -0
  161. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +83 -0
  162. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -0
  163. package/dist/src/core/renderers/webgl/internal/WebGlUtils.d.ts +10 -0
  164. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +13 -0
  165. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -0
  166. package/dist/src/core/shaders/canvas/Border.d.ts +15 -0
  167. package/dist/src/core/shaders/canvas/Border.js +83 -0
  168. package/dist/src/core/shaders/canvas/Border.js.map +1 -0
  169. package/dist/src/core/shaders/canvas/HolePunch.d.ts +7 -0
  170. package/dist/src/core/shaders/canvas/HolePunch.js +22 -0
  171. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -0
  172. package/dist/src/core/shaders/canvas/LinearGradient.d.ts +10 -0
  173. package/dist/src/core/shaders/canvas/LinearGradient.js +32 -0
  174. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -0
  175. package/dist/src/core/shaders/canvas/RadialGradient.d.ts +11 -0
  176. package/dist/src/core/shaders/canvas/RadialGradient.js +54 -0
  177. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -0
  178. package/dist/src/core/shaders/canvas/Rounded.d.ts +7 -0
  179. package/dist/src/core/shaders/canvas/Rounded.js +17 -0
  180. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -0
  181. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +10 -0
  182. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +57 -0
  183. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -0
  184. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +7 -0
  185. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +61 -0
  186. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -0
  187. package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +7 -0
  188. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +26 -0
  189. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -0
  190. package/dist/src/core/shaders/canvas/Shadow.d.ts +8 -0
  191. package/dist/src/core/shaders/canvas/Shadow.js +15 -0
  192. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -0
  193. package/dist/src/core/shaders/canvas/utils/render.d.ts +5 -0
  194. package/dist/src/core/shaders/canvas/utils/render.js +81 -0
  195. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -0
  196. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +47 -0
  197. package/dist/src/core/shaders/templates/BorderTemplate.js +77 -0
  198. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -0
  199. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +46 -0
  200. package/dist/src/core/shaders/templates/HolePunchTemplate.js +19 -0
  201. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -0
  202. package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +23 -0
  203. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +31 -0
  204. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -0
  205. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +33 -0
  206. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +33 -0
  207. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -0
  208. package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +29 -0
  209. package/dist/src/core/shaders/templates/RoundedTemplate.js +51 -0
  210. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -0
  211. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +7 -0
  212. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +8 -0
  213. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -0
  214. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +8 -0
  215. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +9 -0
  216. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -0
  217. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +6 -0
  218. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +7 -0
  219. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -0
  220. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +34 -0
  221. package/dist/src/core/shaders/templates/ShadowTemplate.js +50 -0
  222. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -0
  223. package/dist/src/core/shaders/utils.d.ts +5 -0
  224. package/dist/src/core/shaders/utils.js +25 -0
  225. package/dist/src/core/shaders/utils.js.map +1 -0
  226. package/dist/src/core/shaders/webgl/Border.d.ts +3 -0
  227. package/dist/src/core/shaders/webgl/Border.js +153 -0
  228. package/dist/src/core/shaders/webgl/Border.js.map +1 -0
  229. package/dist/src/core/shaders/webgl/Default.d.ts +2 -0
  230. package/dist/src/core/shaders/webgl/Default.js +51 -0
  231. package/dist/src/core/shaders/webgl/Default.js.map +1 -0
  232. package/dist/src/core/shaders/webgl/HolePunch.d.ts +3 -0
  233. package/dist/src/core/shaders/webgl/HolePunch.js +49 -0
  234. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -0
  235. package/dist/src/core/shaders/webgl/LinearGradient.d.ts +3 -0
  236. package/dist/src/core/shaders/webgl/LinearGradient.js +114 -0
  237. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -0
  238. package/dist/src/core/shaders/webgl/RadialGradient.d.ts +3 -0
  239. package/dist/src/core/shaders/webgl/RadialGradient.js +81 -0
  240. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -0
  241. package/dist/src/core/shaders/webgl/Rounded.d.ts +7 -0
  242. package/dist/src/core/shaders/webgl/Rounded.js +88 -0
  243. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -0
  244. package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +3 -0
  245. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +202 -0
  246. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -0
  247. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +3 -0
  248. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +223 -0
  249. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -0
  250. package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +3 -0
  251. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +123 -0
  252. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -0
  253. package/dist/src/core/shaders/webgl/SdfShader.d.ts +13 -0
  254. package/dist/src/core/shaders/webgl/SdfShader.js +72 -0
  255. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -0
  256. package/dist/src/core/shaders/webgl/Shadow.d.ts +3 -0
  257. package/dist/src/core/shaders/webgl/Shadow.js +115 -0
  258. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -0
  259. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  260. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  261. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  262. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  263. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  264. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  265. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  266. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  267. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  268. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +17 -0
  269. package/dist/src/core/text-rendering/SdfTextRenderer.js +249 -0
  270. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  271. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  272. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  273. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  274. package/dist/src/core/text-rendering/TextRenderer.d.ts +406 -0
  275. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  276. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  277. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  278. package/dist/src/core/text-rendering/Utils.js +66 -0
  279. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  280. package/dist/src/core/textures/ColorTexture.d.ts +36 -0
  281. package/dist/src/core/textures/ColorTexture.js +57 -0
  282. package/dist/src/core/textures/ColorTexture.js.map +1 -0
  283. package/dist/src/core/textures/ImageTexture.d.ts +131 -0
  284. package/dist/src/core/textures/ImageTexture.js +211 -0
  285. package/dist/src/core/textures/ImageTexture.js.map +1 -0
  286. package/dist/src/core/textures/NoiseTexture.d.ts +43 -0
  287. package/dist/src/core/textures/NoiseTexture.js +50 -0
  288. package/dist/src/core/textures/NoiseTexture.js.map +1 -0
  289. package/dist/src/core/textures/RenderTexture.d.ts +29 -0
  290. package/dist/src/core/textures/RenderTexture.js +36 -0
  291. package/dist/src/core/textures/RenderTexture.js.map +1 -0
  292. package/dist/src/core/textures/SubTexture.d.ts +61 -0
  293. package/dist/src/core/textures/SubTexture.js +99 -0
  294. package/dist/src/core/textures/SubTexture.js.map +1 -0
  295. package/dist/src/core/textures/Texture.d.ts +275 -0
  296. package/dist/src/core/textures/Texture.js +326 -0
  297. package/dist/src/core/textures/Texture.js.map +1 -0
  298. package/dist/src/core/utils.d.ts +23 -0
  299. package/dist/src/core/utils.js +155 -0
  300. package/dist/src/core/utils.js.map +1 -0
  301. package/dist/src/main-api/INode.d.ts +65 -0
  302. package/dist/src/main-api/INode.js +2 -0
  303. package/dist/src/main-api/INode.js.map +1 -0
  304. package/dist/src/main-api/Inspector.d.ts +154 -0
  305. package/dist/src/main-api/Inspector.js +844 -0
  306. package/dist/src/main-api/Inspector.js.map +1 -0
  307. package/dist/src/main-api/Renderer.d.ts +629 -0
  308. package/dist/src/main-api/Renderer.js +471 -0
  309. package/dist/src/main-api/Renderer.js.map +1 -0
  310. package/dist/src/main-api/utils.d.ts +2 -0
  311. package/dist/src/main-api/utils.js +34 -0
  312. package/dist/src/main-api/utils.js.map +1 -0
  313. package/dist/src/utils.d.ts +123 -0
  314. package/dist/src/utils.js +234 -0
  315. package/dist/src/utils.js.map +1 -0
  316. package/dist/tsconfig.dist.tsbuildinfo +1 -0
  317. package/exports/canvas-shaders.ts +11 -0
  318. package/exports/canvas.ts +27 -0
  319. package/exports/index.ts +69 -0
  320. package/exports/inspector.ts +5 -0
  321. package/exports/utils.ts +32 -0
  322. package/exports/webgl-shaders.ts +12 -0
  323. package/exports/webgl.ts +33 -0
  324. package/package.json +99 -0
  325. package/src/common/CommonTypes.ts +145 -0
  326. package/src/common/EventEmitter.ts +58 -0
  327. package/src/common/IAnimationController.ts +65 -0
  328. package/src/common/IEventEmitter.ts +11 -0
  329. package/src/core/Autosizer.ts +205 -0
  330. package/src/core/CoreNode.test.ts +535 -0
  331. package/src/core/CoreNode.ts +2883 -0
  332. package/src/core/CoreShaderManager.ts +170 -0
  333. package/src/core/CoreTextNode.ts +573 -0
  334. package/src/core/CoreTextureManager.ts +552 -0
  335. package/src/core/Stage.ts +1037 -0
  336. package/src/core/TextureError.ts +46 -0
  337. package/src/core/TextureMemoryManager.ts +378 -0
  338. package/src/core/animations/AnimationManager.ts +178 -0
  339. package/src/core/animations/CoreAnimation.ts +138 -0
  340. package/src/core/lib/ContextSpy.ts +22 -0
  341. package/src/core/lib/ImageWorker.ts +292 -0
  342. package/src/core/lib/Matrix3d.ts +231 -0
  343. package/src/core/lib/RenderCoords.ts +55 -0
  344. package/src/core/lib/WebGlContextWrapper.ts +1448 -0
  345. package/src/core/lib/collectionUtils.ts +99 -0
  346. package/src/core/lib/colorCache.ts +20 -0
  347. package/src/core/lib/colorParser.ts +66 -0
  348. package/src/core/lib/textureCompression.ts +492 -0
  349. package/src/core/lib/textureSvg.ts +59 -0
  350. package/src/core/lib/utils.ts +400 -0
  351. package/src/core/lib/validateImageBitmap.ts +87 -0
  352. package/src/core/platforms/Platform.ts +64 -0
  353. package/src/core/platforms/web/WebPlatform.ts +132 -0
  354. package/src/core/renderers/CoreContextTexture.ts +25 -0
  355. package/src/core/renderers/CoreRenderOp.ts +3 -0
  356. package/src/core/renderers/CoreRenderer.ts +101 -0
  357. package/src/core/renderers/CoreShaderNode.ts +202 -0
  358. package/src/core/renderers/CoreShaderProgram.ts +4 -0
  359. package/src/core/renderers/canvas/CanvasRenderer.ts +274 -0
  360. package/src/core/renderers/canvas/CanvasShaderNode.ts +79 -0
  361. package/src/core/renderers/canvas/CanvasTexture.ts +141 -0
  362. package/src/core/renderers/webgl/SdfRenderOp.ts +103 -0
  363. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +70 -0
  364. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +76 -0
  365. package/src/core/renderers/webgl/WebGlCtxTexture.ts +332 -0
  366. package/src/core/renderers/webgl/WebGlRenderer.ts +1323 -0
  367. package/src/core/renderers/webgl/WebGlShaderNode.ts +423 -0
  368. package/src/core/renderers/webgl/WebGlShaderProgram.ts +346 -0
  369. package/src/core/renderers/webgl/internal/BufferCollection.ts +46 -0
  370. package/src/core/renderers/webgl/internal/RendererUtils.ts +136 -0
  371. package/src/core/renderers/webgl/internal/ShaderUtils.ts +262 -0
  372. package/src/core/renderers/webgl/internal/WebGlUtils.ts +16 -0
  373. package/src/core/shaders/canvas/Border.ts +119 -0
  374. package/src/core/shaders/canvas/HolePunch.ts +38 -0
  375. package/src/core/shaders/canvas/LinearGradient.ts +54 -0
  376. package/src/core/shaders/canvas/RadialGradient.ts +82 -0
  377. package/src/core/shaders/canvas/Rounded.ts +38 -0
  378. package/src/core/shaders/canvas/RoundedWithBorder.ts +105 -0
  379. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +118 -0
  380. package/src/core/shaders/canvas/RoundedWithShadow.ts +56 -0
  381. package/src/core/shaders/canvas/Shadow.ts +35 -0
  382. package/src/core/shaders/canvas/utils/render.ts +143 -0
  383. package/src/core/shaders/templates/BorderTemplate.ts +128 -0
  384. package/src/core/shaders/templates/HolePunchTemplate.ts +65 -0
  385. package/src/core/shaders/templates/LinearGradientTemplate.ts +54 -0
  386. package/src/core/shaders/templates/RadialGradientTemplate.ts +66 -0
  387. package/src/core/shaders/templates/RoundedTemplate.ts +81 -0
  388. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +21 -0
  389. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +23 -0
  390. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +18 -0
  391. package/src/core/shaders/templates/ShadowTemplate.ts +89 -0
  392. package/src/core/shaders/utils.ts +30 -0
  393. package/src/core/shaders/webgl/Border.ts +158 -0
  394. package/src/core/shaders/webgl/Default.ts +52 -0
  395. package/src/core/shaders/webgl/HolePunch.ts +58 -0
  396. package/src/core/shaders/webgl/LinearGradient.ts +119 -0
  397. package/src/core/shaders/webgl/RadialGradient.ts +91 -0
  398. package/src/core/shaders/webgl/Rounded.ts +97 -0
  399. package/src/core/shaders/webgl/RoundedWithBorder.ts +212 -0
  400. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +235 -0
  401. package/src/core/shaders/webgl/RoundedWithShadow.ts +132 -0
  402. package/src/core/shaders/webgl/SdfShader.ts +73 -0
  403. package/src/core/shaders/webgl/Shadow.ts +119 -0
  404. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  405. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  406. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  407. package/src/core/text-rendering/SdfTextRenderer.ts +352 -0
  408. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  409. package/src/core/text-rendering/TextRenderer.ts +449 -0
  410. package/src/core/text-rendering/Utils.ts +80 -0
  411. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  412. package/src/core/textures/ColorTexture.ts +85 -0
  413. package/src/core/textures/ImageTexture.ts +394 -0
  414. package/src/core/textures/NoiseTexture.ts +87 -0
  415. package/src/core/textures/RenderTexture.ts +68 -0
  416. package/src/core/textures/SubTexture.ts +165 -0
  417. package/src/core/textures/Texture.ts +505 -0
  418. package/src/core/utils.ts +210 -0
  419. package/src/env.d.ts +7 -0
  420. package/src/main-api/INode.ts +92 -0
  421. package/src/main-api/Inspector.ts +1267 -0
  422. package/src/main-api/Renderer.ts +1011 -0
  423. package/src/main-api/utils.ts +45 -0
  424. package/src/utils.ts +302 -0
@@ -0,0 +1,99 @@
1
+ import type { CoreNode } from '../CoreNode.js';
2
+
3
+ //Bucket sort implementation for sorting CoreNode arrays by zIndex
4
+ export const bucketSortByZIndex = (nodes: CoreNode[], min: number): void => {
5
+ const buckets: CoreNode[][] = [];
6
+ const bucketIndices: number[] = [];
7
+ //distribute nodes into buckets
8
+ for (let i = 0; i < nodes.length; i++) {
9
+ const node = nodes[i]!;
10
+ const index = node.props.zIndex - min;
11
+ //create bucket if it doesn't exist
12
+ if (buckets[index] === undefined) {
13
+ buckets[index] = [];
14
+ bucketIndices.push(index);
15
+ }
16
+ buckets[index]!.push(node);
17
+ }
18
+
19
+ //sort each bucket using insertion sort
20
+ for (let i = 1; i < bucketIndices.length; i++) {
21
+ const key = bucketIndices[i]!;
22
+ let j = i - 1;
23
+ while (j >= 0 && bucketIndices[j]! > key) {
24
+ bucketIndices[j + 1] = bucketIndices[j]!;
25
+ j--;
26
+ }
27
+ bucketIndices[j + 1] = key;
28
+ }
29
+
30
+ //flatten buckets
31
+ let idx = 0;
32
+ for (let i = 0; i < bucketIndices.length; i++) {
33
+ const bucket = buckets[bucketIndices[i]!]!;
34
+ for (let j = 0; j < bucket.length; j++) {
35
+ nodes[idx++] = bucket[j]!;
36
+ }
37
+ }
38
+
39
+ //clean up
40
+ buckets.length = 0;
41
+ bucketIndices.length = 0;
42
+ };
43
+
44
+ export const incrementalRepositionByZIndex = (
45
+ changedNodes: CoreNode[],
46
+ nodes: CoreNode[],
47
+ ): void => {
48
+ for (let i = 0; i < changedNodes.length; i++) {
49
+ const node = changedNodes[i]!;
50
+ const currentIndex = findChildIndexById(node, nodes);
51
+ if (currentIndex === -1) continue;
52
+
53
+ const targetZIndex = node.props.zIndex;
54
+
55
+ //binary search for correct insertion position
56
+ let left = 0;
57
+ let right = nodes.length;
58
+
59
+ while (left < right) {
60
+ const mid = (left + right) >>> 1;
61
+ if (nodes[mid]!.props.zIndex <= targetZIndex) {
62
+ left = mid + 1;
63
+ } else {
64
+ right = mid;
65
+ }
66
+ }
67
+
68
+ //adjust target position if it's after the current position
69
+ const targetIndex = left > currentIndex ? left - 1 : left;
70
+
71
+ //only reposition if target is different from current
72
+ if (targetIndex !== currentIndex) {
73
+ nodes.splice(currentIndex, 1);
74
+ nodes.splice(targetIndex, 0, node);
75
+ }
76
+ }
77
+ };
78
+
79
+ export const findChildIndexById = (
80
+ node: CoreNode,
81
+ children: CoreNode[],
82
+ ): number => {
83
+ for (let i = 0; i < children.length; i++) {
84
+ const child = children[i]!;
85
+
86
+ // @ts-ignore - accessing protected property
87
+ if (child._id === node._id) {
88
+ return i;
89
+ }
90
+ }
91
+ return -1;
92
+ };
93
+
94
+ export const removeChild = (node: CoreNode, children: CoreNode[]): void => {
95
+ const index = findChildIndexById(node, children);
96
+ if (index !== -1) {
97
+ children.splice(index, 1);
98
+ }
99
+ };
@@ -0,0 +1,20 @@
1
+ import { parseToAbgrString, parseToRgbaString } from './colorParser.js';
2
+
3
+ const parsedArgbColors: Map<number, string> = new Map();
4
+ const parsedRgbaColors: Map<number, string> = new Map();
5
+
6
+ export function normalizeCanvasColor(color: number, isRGBA: boolean = false) {
7
+ let targetCache = isRGBA === true ? parsedRgbaColors : parsedArgbColors;
8
+ let out = targetCache.get(color);
9
+ if (out !== undefined) {
10
+ return out;
11
+ }
12
+
13
+ if (isRGBA === true) {
14
+ out = parseToRgbaString(color);
15
+ } else {
16
+ out = parseToAbgrString(color);
17
+ }
18
+ targetCache.set(color, out);
19
+ return out;
20
+ }
@@ -0,0 +1,66 @@
1
+ export interface IParsedColor {
2
+ isWhite: boolean;
3
+ a: number;
4
+ r: number;
5
+ g: number;
6
+ b: number;
7
+ }
8
+
9
+ const WHITE: IParsedColor = {
10
+ isWhite: true,
11
+ a: 1,
12
+ r: 0xff,
13
+ g: 0xff,
14
+ b: 0xff,
15
+ };
16
+
17
+ /**
18
+ * Extract color components
19
+ */
20
+ export function parseColor(abgr: number): IParsedColor {
21
+ if (abgr === 0xffffffff) {
22
+ return WHITE;
23
+ }
24
+ const a = ((abgr >>> 24) & 0xff) / 255;
25
+ const b = (abgr >>> 16) & 0xff & 0xff;
26
+ const g = (abgr >>> 8) & 0xff & 0xff;
27
+ const r = abgr & 0xff & 0xff;
28
+ return { isWhite: false, a, r, g, b };
29
+ }
30
+
31
+ export function parseToAbgrString(abgr: number): string {
32
+ const a = ((abgr >>> 24) & 0xff) / 255;
33
+ const b = (abgr >>> 16) & 0xff & 0xff;
34
+ const g = (abgr >>> 8) & 0xff & 0xff;
35
+ const r = abgr & 0xff & 0xff;
36
+ return `rgba(${r},${g},${b},${a})`;
37
+ }
38
+
39
+ export function parseToRgbaString(rgba: number): string {
40
+ const r = (rgba >>> 24) & 0xff;
41
+ const g = (rgba >>> 16) & 0xff & 0xff;
42
+ const b = (rgba >>> 8) & 0xff & 0xff;
43
+ const a = (rgba & 0xff & 0xff) / 255;
44
+ return `rgba(${r},${g},${b},${a})`;
45
+ }
46
+
47
+ /**
48
+ * Extract color components
49
+ */
50
+ export function parseColorRgba(rgba: number): IParsedColor {
51
+ if (rgba === 0xffffffff) {
52
+ return WHITE;
53
+ }
54
+ const r = (rgba >>> 24) & 0xff;
55
+ const g = (rgba >>> 16) & 0xff & 0xff;
56
+ const b = (rgba >>> 8) & 0xff & 0xff;
57
+ const a = (rgba & 0xff & 0xff) / 255;
58
+ return { isWhite: false, r, g, b, a };
59
+ }
60
+
61
+ /**
62
+ * Format a parsed color into a rgba CSS color
63
+ */
64
+ export function formatRgba({ a, r, g, b }: IParsedColor): string {
65
+ return `rgba(${r},${g},${b},${a})`;
66
+ }
@@ -0,0 +1,492 @@
1
+ import { type CompressedData, type TextureData } from '../textures/Texture.js';
2
+ import type { WebGlContextWrapper } from './WebGlContextWrapper.js';
3
+
4
+ export type UploadCompressedTextureFunction = (
5
+ glw: WebGlContextWrapper,
6
+ texture: WebGLTexture,
7
+ data: CompressedData,
8
+ ) => void;
9
+
10
+ /**
11
+ * Tests if the given location is a compressed texture container
12
+ * @param url
13
+ * @remarks
14
+ * This function is used to determine if the given image url is a compressed
15
+ * and only supports the following extensions: .ktx and .pvr
16
+ * @returns
17
+ */
18
+ export function isCompressedTextureContainer(src: string): boolean {
19
+ return /\.(ktx|pvr)$/.test(src);
20
+ }
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
+ ];
50
+ /**
51
+ * Loads a compressed texture container
52
+ * @param url
53
+ * @returns
54
+ */
55
+ export const loadCompressedTexture = async (
56
+ url: string,
57
+ ): Promise<TextureData> => {
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
+ }
65
+
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
+ }
74
+
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
+ }
103
+ };
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
+
113
+ /**
114
+ * Loads an ASTC texture container and returns the texture data
115
+ * @param view
116
+ * @returns
117
+ */
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
+
142
+ const mipmaps: ArrayBuffer[] = [];
143
+ mipmaps.push(buffer.slice(16));
144
+
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,
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]!);
175
+
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;
227
+
228
+ if (offset > view.byteLength) {
229
+ throw new Error('Invalid KTX file: key/value data exceeds file size');
230
+ }
231
+
232
+ for (let i = 0; i < mipmapLevels; i++) {
233
+ const imageSize = view.getUint32(offset, littleEndian);
234
+ offset += 4;
235
+
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
+ }
243
+ }
244
+
245
+ return {
246
+ data: {
247
+ blockInfo: blockInfoMap[glInternalFormat]!,
248
+ glInternalFormat: glInternalFormat,
249
+ mipmaps,
250
+ w: width,
251
+ h: height,
252
+ type: 'ktx',
253
+ },
254
+ premultiplyAlpha: false,
255
+ };
256
+ };
257
+
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);
268
+
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
+ }
294
+
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)}`,
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[] = [];
339
+
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
+ }
381
+ }
382
+
383
+ return {
384
+ data: {
385
+ blockInfo: blockInfoMap[internalFormat]!,
386
+ glInternalFormat: internalFormat,
387
+ mipmaps,
388
+ w: width,
389
+ h: height,
390
+ type: 'pvr',
391
+ },
392
+ premultiplyAlpha: false,
393
+ };
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
+ };