@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,274 @@
1
+ import type { CoreNode } from '../../CoreNode.js';
2
+ import { SubTexture } from '../../textures/SubTexture.js';
3
+ import { TextureType, type Texture } from '../../textures/Texture.js';
4
+ import type { CoreContextTexture } from '../CoreContextTexture.js';
5
+ import {
6
+ CoreRenderer,
7
+ type CoreRendererOptions,
8
+ type QuadOptions,
9
+ } from '../CoreRenderer.js';
10
+ import { CanvasTexture } from './CanvasTexture.js';
11
+ import { parseColor } from '../../lib/colorParser.js';
12
+ import { CanvasShaderNode, type CanvasShaderType } from './CanvasShaderNode.js';
13
+ import { normalizeCanvasColor } from '../../lib/colorCache.js';
14
+
15
+ export class CanvasRenderer extends CoreRenderer {
16
+ private context: CanvasRenderingContext2D;
17
+ private canvas: HTMLCanvasElement;
18
+ private pixelRatio: number;
19
+ private clearColor: string;
20
+ public renderToTextureActive = false;
21
+ activeRttNode: CoreNode | null = null;
22
+
23
+ constructor(options: CoreRendererOptions) {
24
+ super(options);
25
+
26
+ this.mode = 'canvas';
27
+ const { canvas } = options;
28
+ this.canvas = canvas as HTMLCanvasElement;
29
+ this.context = canvas.getContext('2d') as CanvasRenderingContext2D;
30
+ this.pixelRatio = this.stage.pixelRatio;
31
+ this.clearColor = normalizeCanvasColor(this.stage.clearColor);
32
+ }
33
+
34
+ reset(): void {
35
+ this.canvas.width = this.canvas.width; // quick reset canvas
36
+
37
+ const ctx = this.context;
38
+
39
+ if (this.clearColor) {
40
+ ctx.fillStyle = this.clearColor;
41
+ ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
42
+ }
43
+
44
+ ctx.scale(this.pixelRatio, this.pixelRatio);
45
+ }
46
+
47
+ render(): void {
48
+ // noop
49
+ }
50
+
51
+ addQuad(node: CoreNode): void {
52
+ const ctx = this.context;
53
+ const { tx, ty, ta, tb, tc, td } = node.globalTransform!;
54
+ const clippingRect = node.clippingRect;
55
+ let texture = node.renderTexture;
56
+ // The Canvas2D renderer only supports image textures, no textures are used for color blocks
57
+ if (texture !== null) {
58
+ const textureType = texture.type;
59
+ if (
60
+ textureType !== TextureType.image &&
61
+ textureType !== TextureType.subTexture &&
62
+ textureType !== TextureType.color &&
63
+ textureType !== TextureType.noise
64
+ ) {
65
+ return;
66
+ }
67
+ }
68
+
69
+ const hasTransform = ta !== 1;
70
+ const hasClipping = clippingRect.width !== 0 && clippingRect.height !== 0;
71
+ const shader = node.props.shader;
72
+ const hasShader = shader !== null;
73
+
74
+ let saveAndRestore = hasTransform === true || hasClipping === true;
75
+ if (hasShader === true) {
76
+ saveAndRestore = saveAndRestore || (shader as CanvasShaderNode).applySNR;
77
+ }
78
+
79
+ if (saveAndRestore) {
80
+ ctx.save();
81
+ }
82
+
83
+ if (hasClipping === true) {
84
+ const path = new Path2D();
85
+ const { x, y, width, height } = clippingRect;
86
+ path.rect(x, y, width, height);
87
+ ctx.clip(path);
88
+ }
89
+
90
+ if (hasTransform === true) {
91
+ // Quad transform:
92
+ // | ta tb tx |
93
+ // | tc td ty |
94
+ // | 0 0 1 |
95
+ // C2D transform:
96
+ // | a c e |
97
+ // | b d f |
98
+ // | 0 0 1 |
99
+ const scale = this.pixelRatio;
100
+ ctx.setTransform(ta, tc, tb, td, tx * scale, ty * scale);
101
+ ctx.scale(scale, scale);
102
+ ctx.translate(-tx, -ty);
103
+ }
104
+
105
+ if (hasShader === true) {
106
+ let renderContext: (() => void) | null = () => {
107
+ this.renderContext(node);
108
+ };
109
+ const quad: QuadOptions = {
110
+ width: node.props.w,
111
+ height: node.props.h,
112
+ colorTl: node.premultipliedColorTl,
113
+ colorTr: node.premultipliedColorTr,
114
+ colorBl: node.premultipliedColorBl,
115
+ colorBr: node.premultipliedColorBr,
116
+ texture: texture,
117
+ textureOptions: node.props.textureOptions,
118
+ textureCoords: node.renderTextureCoords,
119
+ zIndex: node.zIndex, // zIndex usage?
120
+ shader: shader,
121
+ alpha: node.worldAlpha,
122
+ clippingRect: clippingRect,
123
+ tx,
124
+ ty,
125
+ ta,
126
+ tb,
127
+ tc,
128
+ td,
129
+ renderCoords: node.renderCoords,
130
+ rtt: node.props.rtt,
131
+ parentHasRenderTexture: node.parentHasRenderTexture,
132
+ framebufferDimensions: node.parentHasRenderTexture
133
+ ? node.parentFramebufferDimensions
134
+ : null,
135
+ };
136
+
137
+ (shader as CanvasShaderNode).render(ctx, quad, renderContext);
138
+ renderContext = null;
139
+ } else {
140
+ this.renderContext(node);
141
+ }
142
+
143
+ if (saveAndRestore) {
144
+ ctx.restore();
145
+ }
146
+ }
147
+
148
+ renderContext(node: CoreNode) {
149
+ const color = node.premultipliedColorTl;
150
+ const texture = node.renderTexture!;
151
+ const textureType = texture.type;
152
+ const tx = node.globalTransform!.tx;
153
+ const ty = node.globalTransform!.ty;
154
+ const width = node.props.w;
155
+ const height = node.props.h;
156
+
157
+ if (textureType !== TextureType.color) {
158
+ const tintColor = parseColor(color);
159
+ if (textureType !== TextureType.subTexture) {
160
+ const image = (texture.ctxTexture as CanvasTexture).getImage(tintColor);
161
+ this.context.globalAlpha = tintColor.a ?? node.worldAlpha;
162
+ this.context.drawImage(image, tx, ty, width, height);
163
+ this.context.globalAlpha = 1;
164
+ return;
165
+ }
166
+ const image = (
167
+ (texture as SubTexture).parentTexture.ctxTexture as CanvasTexture
168
+ ).getImage(tintColor);
169
+ const props = (texture as SubTexture).props;
170
+
171
+ this.context.globalAlpha = tintColor.a ?? node.worldAlpha;
172
+ this.context.drawImage(
173
+ image,
174
+ props.x,
175
+ props.y,
176
+ props.w,
177
+ props.h,
178
+ tx,
179
+ ty,
180
+ width,
181
+ height,
182
+ );
183
+ this.context.globalAlpha = 1;
184
+ return;
185
+ }
186
+ const hasGradient =
187
+ node.premultipliedColorTl !== node.premultipliedColorTr ||
188
+ node.premultipliedColorTl !== node.premultipliedColorBr;
189
+ if (hasGradient === true) {
190
+ let endX: number = tx;
191
+ let endY: number = ty;
192
+ let endColor: number;
193
+ if (node.premultipliedColorTl === node.premultipliedColorTr) {
194
+ // vertical
195
+ endX = tx;
196
+ endY = ty + height;
197
+ endColor = node.premultipliedColorBr;
198
+ } else {
199
+ // horizontal
200
+ endX = tx + width;
201
+ endY = ty;
202
+ endColor = node.premultipliedColorTr;
203
+ }
204
+ const gradient = this.context.createLinearGradient(tx, ty, endX, endY);
205
+ gradient.addColorStop(0, normalizeCanvasColor(color));
206
+ gradient.addColorStop(1, normalizeCanvasColor(endColor));
207
+ this.context.fillStyle = gradient;
208
+ this.context.fillRect(tx, ty, width, height);
209
+ } else {
210
+ this.context.fillStyle = normalizeCanvasColor(color);
211
+ this.context.fillRect(tx, ty, width, height);
212
+ }
213
+ }
214
+
215
+ createShaderNode(
216
+ shaderKey: string,
217
+ shaderType: Readonly<CanvasShaderType>,
218
+ props?: Record<string, any>,
219
+ ) {
220
+ return new CanvasShaderNode(shaderKey, shaderType, this.stage, props);
221
+ }
222
+
223
+ createShaderProgram(shaderConfig) {
224
+ return null;
225
+ }
226
+
227
+ override supportsShaderType(shaderType: Readonly<CanvasShaderType>): boolean {
228
+ return shaderType.render !== undefined;
229
+ }
230
+
231
+ createCtxTexture(textureSource: Texture): CoreContextTexture {
232
+ return new CanvasTexture(this.stage.txMemManager, textureSource);
233
+ }
234
+
235
+ renderRTTNodes(): void {
236
+ // noop
237
+ }
238
+
239
+ removeRTTNode(node: CoreNode): void {
240
+ // noop
241
+ }
242
+
243
+ renderToTexture(node: CoreNode): void {
244
+ // noop
245
+ }
246
+ getBufferInfo(): null {
247
+ return null;
248
+ }
249
+
250
+ getQuadCount(): null {
251
+ return null;
252
+ }
253
+
254
+ getRenderOpCount(): null {
255
+ return null;
256
+ }
257
+
258
+ /**
259
+ * Updates the clear color of the canvas renderer.
260
+ *
261
+ * @param color - The color to set as the clear color.
262
+ */
263
+ updateClearColor(color: number) {
264
+ this.clearColor = normalizeCanvasColor(color);
265
+ }
266
+
267
+ override updateViewport(): void {
268
+ // noop
269
+ }
270
+
271
+ getDefaultShaderNode() {
272
+ return null;
273
+ }
274
+ }
@@ -0,0 +1,79 @@
1
+ import type { CoreNode } from '../../CoreNode.js';
2
+ import { normalizeCanvasColor } from '../../lib/colorCache.js';
3
+ import type { Stage } from '../../Stage.js';
4
+ import type { QuadOptions } from '../CoreRenderer.js';
5
+ import { CoreShaderNode, type CoreShaderType } from '../CoreShaderNode.js';
6
+
7
+ export type CanvasShaderType<
8
+ T extends object = Record<string, unknown>,
9
+ C extends object = Record<string, unknown>,
10
+ > = CoreShaderType<T> & {
11
+ render: (
12
+ this: CanvasShaderNode<T, C>,
13
+ ctx: CanvasRenderingContext2D,
14
+ quad: QuadOptions,
15
+ renderContext: () => void,
16
+ ) => void;
17
+ update?: (this: CanvasShaderNode<T, C>, node: CoreNode) => void;
18
+ /**
19
+ * Set this to true when using ctx functions that scale, clip, rotate, etc..
20
+ */
21
+ saveAndRestore?: boolean;
22
+ };
23
+
24
+ export class CanvasShaderNode<
25
+ Props extends object = Record<string, unknown>,
26
+ Computed extends object = Record<string, unknown>,
27
+ > extends CoreShaderNode<Props> {
28
+ private updater: ((node: CoreNode, props?: Props) => void) | undefined =
29
+ undefined;
30
+ private valueKey: string = '';
31
+ computed: Partial<Computed> = {};
32
+ applySNR: boolean;
33
+ render: CanvasShaderType<Props>['render'];
34
+
35
+ constructor(
36
+ shaderKey: string,
37
+ config: CanvasShaderType<Props>,
38
+ stage: Stage,
39
+ props?: Props,
40
+ ) {
41
+ super(shaderKey, config, stage, props);
42
+ this.applySNR = config.saveAndRestore || false;
43
+ this.render = config.render;
44
+ if (config.update !== undefined) {
45
+ this.updater = config.update!;
46
+ if (this.props === undefined) {
47
+ this.updater!(this.node as CoreNode, this.props);
48
+ return;
49
+ }
50
+
51
+ this.update = () => {
52
+ const prevKey = this.valueKey;
53
+ this.valueKey = this.createValueKey();
54
+
55
+ if (prevKey === this.valueKey) {
56
+ return;
57
+ }
58
+
59
+ if (prevKey.length > 0) {
60
+ this.stage.shManager.mutateShaderValueUsage(prevKey, -1);
61
+ }
62
+
63
+ const computed = this.stage.shManager.getShaderValues(
64
+ this.valueKey,
65
+ ) as Record<string, unknown>;
66
+ if (computed !== undefined) {
67
+ this.computed = computed as Computed;
68
+ }
69
+ this.computed = {};
70
+ this.updater!(this.node as CoreNode);
71
+ this.stage.shManager.setShaderValues(this.valueKey, this.computed);
72
+ };
73
+ }
74
+ }
75
+
76
+ toColorString(rgba: number) {
77
+ return normalizeCanvasColor(rgba, true);
78
+ }
79
+ }
@@ -0,0 +1,141 @@
1
+ import type { Dimensions } from '../../../common/CommonTypes.js';
2
+ import { assertTruthy } from '../../../utils.js';
3
+ import { formatRgba, type IParsedColor } from '../../lib/colorParser.js';
4
+ import { CoreContextTexture } from '../CoreContextTexture.js';
5
+
6
+ export class CanvasTexture extends CoreContextTexture {
7
+ protected image:
8
+ | ImageBitmap
9
+ | HTMLCanvasElement
10
+ | HTMLImageElement
11
+ | undefined;
12
+ protected tintCache:
13
+ | {
14
+ key: string;
15
+ image: HTMLCanvasElement;
16
+ }
17
+ | undefined;
18
+
19
+ async load(): Promise<void> {
20
+ this.textureSource.setState('loading');
21
+
22
+ try {
23
+ const size = await this.onLoadRequest();
24
+ this.textureSource.setState('loaded', size);
25
+ this.textureSource.freeTextureData();
26
+ this.updateMemSize();
27
+ } catch (err) {
28
+ this.textureSource.setState('failed', err as Error);
29
+ this.textureSource.freeTextureData();
30
+ throw err;
31
+ }
32
+ }
33
+
34
+ release(): void {
35
+ this.image = undefined;
36
+ this.tintCache = undefined;
37
+ }
38
+
39
+ free(): void {
40
+ this.release();
41
+ this.textureSource.setState('freed');
42
+ this.setTextureMemUse(0);
43
+ this.textureSource.freeTextureData();
44
+ }
45
+
46
+ updateMemSize(): void {
47
+ // Counting memory usage for:
48
+ // - main image
49
+ // - tinted image
50
+ const mult = this.tintCache ? 8 : 4;
51
+ if (this.textureSource.dimensions) {
52
+ this.setTextureMemUse(
53
+ this.textureSource.dimensions.w *
54
+ this.textureSource.dimensions.h *
55
+ mult,
56
+ );
57
+ }
58
+ }
59
+
60
+ hasImage(): boolean {
61
+ return this.image !== undefined;
62
+ }
63
+
64
+ getImage(
65
+ color: IParsedColor,
66
+ ): ImageBitmap | HTMLCanvasElement | HTMLImageElement {
67
+ const image = this.image;
68
+ assertTruthy(image, 'Attempt to get unloaded image texture');
69
+
70
+ if (color.isWhite) {
71
+ if (this.tintCache) {
72
+ this.tintCache = undefined;
73
+ this.updateMemSize();
74
+ }
75
+ return image;
76
+ }
77
+ const key = formatRgba(color);
78
+ if (this.tintCache?.key === key) {
79
+ return this.tintCache.image;
80
+ }
81
+
82
+ const tintedImage = this.tintTexture(image, key);
83
+ this.tintCache = {
84
+ key,
85
+ image: tintedImage,
86
+ };
87
+ this.updateMemSize();
88
+ return tintedImage;
89
+ }
90
+
91
+ protected tintTexture(
92
+ source: ImageBitmap | HTMLCanvasElement | HTMLImageElement,
93
+ color: string,
94
+ ) {
95
+ const { width, height } = source;
96
+ const canvas = document.createElement('canvas');
97
+ canvas.width = width;
98
+ canvas.height = height;
99
+ const ctx = canvas.getContext('2d');
100
+ if (ctx) {
101
+ // fill with target color
102
+ ctx.fillStyle = color;
103
+ ctx.globalCompositeOperation = 'copy';
104
+ ctx.fillRect(0, 0, width, height);
105
+
106
+ // multiply with image, resulting in non-transparent tinted image
107
+ ctx.globalCompositeOperation = 'multiply';
108
+ ctx.drawImage(source, 0, 0, width, height, 0, 0, width, height);
109
+
110
+ // apply original image alpha
111
+ ctx.globalCompositeOperation = 'destination-in';
112
+ ctx.drawImage(source, 0, 0, width, height, 0, 0, width, height);
113
+ }
114
+ return canvas;
115
+ }
116
+
117
+ private async onLoadRequest(): Promise<Dimensions> {
118
+ assertTruthy(this.textureSource?.textureData?.data, 'Texture data is null');
119
+ const { data } = this.textureSource.textureData;
120
+
121
+ // TODO: canvas from text renderer should be able to provide the canvas directly
122
+ // instead of having to re-draw it into a new canvas...
123
+ if (data instanceof ImageData) {
124
+ const canvas = document.createElement('canvas');
125
+ canvas.width = data.width;
126
+ canvas.height = data.height;
127
+ const ctx = canvas.getContext('2d');
128
+ if (ctx) ctx.putImageData(data, 0, 0);
129
+ this.image = canvas;
130
+ return { w: data.width, h: data.height };
131
+ } else if (
132
+ (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap) ||
133
+ data instanceof HTMLImageElement
134
+ ) {
135
+ this.image = data;
136
+ return { w: data.width, h: data.height };
137
+ }
138
+
139
+ return { w: 0, h: 0 };
140
+ }
141
+ }
@@ -0,0 +1,103 @@
1
+ import { CoreRenderOp } from '../CoreRenderOp.js';
2
+ import { USE_RTT } from '../../../utils.js';
3
+ import type { WebGlCtxTexture } from './WebGlCtxTexture.js';
4
+ import type { WebGlRenderer } from './WebGlRenderer.js';
5
+ import type { BufferCollection } from './internal/BufferCollection.js';
6
+ import type { WebGlShaderNode } from './WebGlShaderNode.js';
7
+ import type { RectWithValid } from '../../lib/utils.js';
8
+ import type { Dimensions } from '../../../common/CommonTypes.js';
9
+ import type { Stage } from '../../Stage.js';
10
+
11
+ /**
12
+ * A batched SDF text render operation.
13
+ *
14
+ * Rather than owning its own WebGL buffer, this op references a range
15
+ * inside the renderer's shared SDF vertex buffer. Multiple text nodes
16
+ * that share the same atlas texture and clipping state are merged into
17
+ * a single SdfRenderOp, producing one draw call for many strings.
18
+ */
19
+ export class SdfRenderOp extends CoreRenderOp {
20
+ public numQuads = 0;
21
+ public readonly isCoreNode = false as const;
22
+ public renderOpTextures: WebGlCtxTexture[] = [];
23
+ public time: number = 0;
24
+ readonly stage: Stage;
25
+
26
+ /**
27
+ * Index of the first quad in the shared SDF buffer.
28
+ * Used to compute the byte offset into the element index buffer.
29
+ */
30
+ public startQuad = 0;
31
+
32
+ constructor(
33
+ readonly renderer: WebGlRenderer,
34
+ readonly shader: WebGlShaderNode,
35
+ readonly quadBufferCollection: BufferCollection,
36
+ public worldAlpha: number,
37
+ public clippingRect: RectWithValid,
38
+ readonly width: number,
39
+ readonly height: number,
40
+ readonly rtt: boolean,
41
+ public parentHasRenderTexture: boolean,
42
+ public framebufferDimensions: Dimensions | null,
43
+ ) {
44
+ super();
45
+ this.stage = renderer.stage;
46
+ }
47
+
48
+ addTexture(texture: WebGlCtxTexture): number {
49
+ const { renderOpTextures } = this;
50
+ const length = renderOpTextures.length;
51
+
52
+ for (let i = 0; i < length; i++) {
53
+ if (renderOpTextures[i] === texture) {
54
+ return i;
55
+ }
56
+ }
57
+
58
+ renderOpTextures.push(texture);
59
+ return length;
60
+ }
61
+
62
+ draw() {
63
+ const { glw, options, stage } = this.renderer;
64
+
65
+ stage.shManager.useShader(this.shader.program);
66
+ this.shader.program.bindRenderOp(this);
67
+
68
+ // Clipping
69
+ if (this.clippingRect.valid === true) {
70
+ const pixelRatio =
71
+ USE_RTT && this.parentHasRenderTexture ? 1 : stage.pixelRatio;
72
+ const clipX = Math.round(this.clippingRect.x * pixelRatio);
73
+ const clipWidth = Math.round(this.clippingRect.width * pixelRatio);
74
+ const clipHeight = Math.round(this.clippingRect.height * pixelRatio);
75
+ let clipY = Math.round(
76
+ options.canvas.height - clipHeight - this.clippingRect.y * pixelRatio,
77
+ );
78
+ // if parent has render texture, we need to adjust the scissor rect
79
+ // to be relative to the parent's framebuffer
80
+ if (USE_RTT && this.parentHasRenderTexture) {
81
+ clipY = this.framebufferDimensions
82
+ ? this.framebufferDimensions.h - this.height
83
+ : 0;
84
+ }
85
+
86
+ glw.setScissorTest(true);
87
+ glw.scissor(clipX, clipY, clipWidth, clipHeight);
88
+ } else {
89
+ glw.setScissorTest(false);
90
+ }
91
+
92
+ // Draw the batch range from the shared SDF buffer using indexed rendering.
93
+ // 4 vertices per glyph, 6 indices per glyph (2 triangles).
94
+ // Byte offset into the shared Uint16 index buffer:
95
+ const byteOffset = this.startQuad * 6 * 2;
96
+ glw.drawElements(
97
+ glw.TRIANGLES,
98
+ 6 * this.numQuads,
99
+ glw.UNSIGNED_SHORT,
100
+ byteOffset,
101
+ );
102
+ }
103
+ }
@@ -0,0 +1,70 @@
1
+ import type { Dimensions } from '../../../common/CommonTypes.js';
2
+ import type { TextureMemoryManager } from '../../TextureMemoryManager.js';
3
+ import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
4
+ import type { Bound } from '../../lib/utils.js';
5
+ import type { RenderTexture } from '../../textures/RenderTexture.js';
6
+ import { WebGlCtxTexture } from './WebGlCtxTexture.js';
7
+
8
+ export class WebGlCtxRenderTexture extends WebGlCtxTexture {
9
+ declare textureSource: RenderTexture;
10
+
11
+ public framebuffer: WebGLFramebuffer | null = null;
12
+
13
+ override txCoords: Bound = {
14
+ x1: 0,
15
+ y1: 1,
16
+ x2: 1,
17
+ y2: 0,
18
+ };
19
+
20
+ constructor(
21
+ glw: WebGlContextWrapper,
22
+ memManager: TextureMemoryManager,
23
+ textureSource: RenderTexture,
24
+ ) {
25
+ super(glw, memManager, textureSource);
26
+ }
27
+
28
+ override async onLoadRequest(): Promise<Dimensions> {
29
+ const { glw } = this;
30
+ const nativeTexture = (this._nativeCtxTexture =
31
+ this.createNativeCtxTexture());
32
+
33
+ if (!nativeTexture) {
34
+ throw new Error('Failed to create native texture for RenderTexture');
35
+ }
36
+
37
+ const { w, h } = this.textureSource;
38
+
39
+ // Create Framebuffer object
40
+ this.framebuffer = glw.createFramebuffer();
41
+
42
+ // Set the dimensions of the render texture
43
+ glw.texImage2D(0, glw.RGBA, w, h, 0, glw.RGBA, glw.UNSIGNED_BYTE, null);
44
+
45
+ // Update the texture memory manager
46
+ this.setTextureMemUse(w * h * 4);
47
+
48
+ // Bind the framebuffer
49
+ glw.bindFramebuffer(this.framebuffer);
50
+
51
+ // Attach the texture to the framebuffer
52
+ glw.framebufferTexture2D(glw.COLOR_ATTACHMENT0, nativeTexture, 0);
53
+
54
+ // Unbind the framebuffer
55
+ glw.bindFramebuffer(null);
56
+
57
+ return {
58
+ w,
59
+ h,
60
+ };
61
+ }
62
+
63
+ override free(): void {
64
+ super.free();
65
+
66
+ // Delete the framebuffer
67
+ this.glw.deleteFramebuffer(this.framebuffer);
68
+ this.framebuffer = null;
69
+ }
70
+ }