@blakron/core 0.2.4 → 0.3.1

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 (550) hide show
  1. package/README.md +3 -1
  2. package/dist/blakron/benchmark/BenchmarkRunner.d.ts +60 -0
  3. package/dist/blakron/benchmark/BenchmarkRunner.d.ts.map +1 -0
  4. package/dist/blakron/benchmark/BenchmarkRunner.js +112 -0
  5. package/dist/blakron/benchmark/BenchmarkRunner.js.map +1 -0
  6. package/dist/blakron/benchmark/MetricsCollector.d.ts +34 -0
  7. package/dist/blakron/benchmark/MetricsCollector.d.ts.map +1 -0
  8. package/dist/blakron/benchmark/MetricsCollector.js +123 -0
  9. package/dist/blakron/benchmark/MetricsCollector.js.map +1 -0
  10. package/dist/blakron/benchmark/PerfPanel.d.ts +24 -0
  11. package/dist/blakron/benchmark/PerfPanel.d.ts.map +1 -0
  12. package/dist/blakron/benchmark/PerfPanel.js +131 -0
  13. package/dist/blakron/benchmark/PerfPanel.js.map +1 -0
  14. package/dist/blakron/benchmark/ReportExporter.d.ts +8 -0
  15. package/dist/blakron/benchmark/ReportExporter.d.ts.map +1 -0
  16. package/dist/blakron/benchmark/ReportExporter.js +54 -0
  17. package/dist/blakron/benchmark/ReportExporter.js.map +1 -0
  18. package/dist/blakron/benchmark/SceneRegistry.d.ts +16 -0
  19. package/dist/blakron/benchmark/SceneRegistry.d.ts.map +1 -0
  20. package/dist/blakron/benchmark/SceneRegistry.js +233 -0
  21. package/dist/blakron/benchmark/SceneRegistry.js.map +1 -0
  22. package/dist/blakron/benchmark/types.d.ts +47 -0
  23. package/dist/blakron/benchmark/types.d.ts.map +1 -0
  24. package/dist/blakron/benchmark/types.js +2 -0
  25. package/dist/blakron/benchmark/types.js.map +1 -0
  26. package/dist/blakron/display/Bitmap.d.ts +53 -0
  27. package/dist/blakron/display/Bitmap.d.ts.map +1 -0
  28. package/dist/blakron/display/Bitmap.js +176 -0
  29. package/dist/blakron/display/Bitmap.js.map +1 -0
  30. package/dist/blakron/display/DisplayObject.d.ts +206 -0
  31. package/dist/blakron/display/DisplayObject.d.ts.map +1 -0
  32. package/dist/blakron/display/DisplayObject.js +827 -0
  33. package/dist/blakron/display/DisplayObject.js.map +1 -0
  34. package/dist/blakron/display/DisplayObjectContainer.d.ts +58 -0
  35. package/dist/blakron/display/DisplayObjectContainer.d.ts.map +1 -0
  36. package/dist/blakron/display/DisplayObjectContainer.js +348 -0
  37. package/dist/blakron/display/DisplayObjectContainer.js.map +1 -0
  38. package/dist/blakron/display/Graphics.d.ts +49 -0
  39. package/dist/blakron/display/Graphics.d.ts.map +1 -0
  40. package/dist/blakron/display/Graphics.js +315 -0
  41. package/dist/blakron/display/Graphics.js.map +1 -0
  42. package/dist/blakron/display/GraphicsPath.d.ts +112 -0
  43. package/dist/blakron/display/GraphicsPath.d.ts.map +1 -0
  44. package/dist/blakron/display/GraphicsPath.js +2 -0
  45. package/dist/blakron/display/GraphicsPath.js.map +1 -0
  46. package/dist/blakron/display/Mesh.d.ts +21 -0
  47. package/dist/blakron/display/Mesh.d.ts.map +1 -0
  48. package/dist/blakron/display/Mesh.js +56 -0
  49. package/dist/blakron/display/Mesh.js.map +1 -0
  50. package/dist/blakron/display/Shape.d.ts +12 -0
  51. package/dist/blakron/display/Shape.d.ts.map +1 -0
  52. package/dist/blakron/display/Shape.js +35 -0
  53. package/dist/blakron/display/Shape.js.map +1 -0
  54. package/dist/blakron/display/Sprite.d.ts +13 -0
  55. package/dist/blakron/display/Sprite.d.ts.map +1 -0
  56. package/dist/blakron/display/Sprite.js +37 -0
  57. package/dist/blakron/display/Sprite.js.map +1 -0
  58. package/dist/blakron/display/Stage.d.ts +45 -0
  59. package/dist/blakron/display/Stage.d.ts.map +1 -0
  60. package/dist/blakron/display/Stage.js +107 -0
  61. package/dist/blakron/display/Stage.js.map +1 -0
  62. package/dist/blakron/display/enums/BitmapFillMode.d.ts +7 -0
  63. package/dist/blakron/display/enums/BitmapFillMode.d.ts.map +1 -0
  64. package/dist/blakron/display/enums/BitmapFillMode.js +6 -0
  65. package/dist/blakron/display/enums/BitmapFillMode.js.map +1 -0
  66. package/dist/blakron/display/enums/BlendMode.d.ts +24 -0
  67. package/dist/blakron/display/enums/BlendMode.d.ts.map +1 -0
  68. package/dist/blakron/display/enums/BlendMode.js +31 -0
  69. package/dist/blakron/display/enums/BlendMode.js.map +1 -0
  70. package/dist/blakron/display/enums/CapsStyle.d.ts +7 -0
  71. package/dist/blakron/display/enums/CapsStyle.d.ts.map +1 -0
  72. package/dist/blakron/display/enums/CapsStyle.js +6 -0
  73. package/dist/blakron/display/enums/CapsStyle.js.map +1 -0
  74. package/dist/blakron/display/enums/GradientType.d.ts +6 -0
  75. package/dist/blakron/display/enums/GradientType.d.ts.map +1 -0
  76. package/dist/blakron/display/enums/GradientType.js +5 -0
  77. package/dist/blakron/display/enums/GradientType.js.map +1 -0
  78. package/dist/blakron/display/enums/JointStyle.d.ts +7 -0
  79. package/dist/blakron/display/enums/JointStyle.d.ts.map +1 -0
  80. package/dist/blakron/display/enums/JointStyle.js +6 -0
  81. package/dist/blakron/display/enums/JointStyle.js.map +1 -0
  82. package/dist/blakron/display/enums/OrientationMode.d.ts +8 -0
  83. package/dist/blakron/display/enums/OrientationMode.d.ts.map +1 -0
  84. package/dist/blakron/display/enums/OrientationMode.js +7 -0
  85. package/dist/blakron/display/enums/OrientationMode.js.map +1 -0
  86. package/dist/blakron/display/enums/StageScaleMode.d.ts +12 -0
  87. package/dist/blakron/display/enums/StageScaleMode.d.ts.map +1 -0
  88. package/dist/blakron/display/enums/StageScaleMode.js +11 -0
  89. package/dist/blakron/display/enums/StageScaleMode.js.map +1 -0
  90. package/dist/blakron/display/enums/index.d.ts +8 -0
  91. package/dist/blakron/display/enums/index.d.ts.map +1 -0
  92. package/dist/blakron/display/enums/index.js +8 -0
  93. package/dist/blakron/display/enums/index.js.map +1 -0
  94. package/dist/blakron/display/index.d.ts +21 -0
  95. package/dist/blakron/display/index.d.ts.map +1 -0
  96. package/dist/blakron/display/index.js +20 -0
  97. package/dist/blakron/display/index.js.map +1 -0
  98. package/dist/blakron/display/texture/BitmapData.d.ts +37 -0
  99. package/dist/blakron/display/texture/BitmapData.d.ts.map +1 -0
  100. package/dist/blakron/display/texture/BitmapData.js +144 -0
  101. package/dist/blakron/display/texture/BitmapData.js.map +1 -0
  102. package/dist/blakron/display/texture/RenderTexture.d.ts +13 -0
  103. package/dist/blakron/display/texture/RenderTexture.d.ts.map +1 -0
  104. package/dist/blakron/display/texture/RenderTexture.js +51 -0
  105. package/dist/blakron/display/texture/RenderTexture.js.map +1 -0
  106. package/dist/blakron/display/texture/SpriteSheet.d.ts +13 -0
  107. package/dist/blakron/display/texture/SpriteSheet.d.ts.map +1 -0
  108. package/dist/blakron/display/texture/SpriteSheet.js +34 -0
  109. package/dist/blakron/display/texture/SpriteSheet.js.map +1 -0
  110. package/dist/blakron/display/texture/Texture.d.ts +33 -0
  111. package/dist/blakron/display/texture/Texture.d.ts.map +1 -0
  112. package/dist/blakron/display/texture/Texture.js +77 -0
  113. package/dist/blakron/display/texture/Texture.js.map +1 -0
  114. package/dist/blakron/display/texture/index.d.ts +5 -0
  115. package/dist/blakron/display/texture/index.d.ts.map +1 -0
  116. package/dist/blakron/display/texture/index.js +5 -0
  117. package/dist/blakron/display/texture/index.js.map +1 -0
  118. package/dist/blakron/events/Event.d.ts +57 -0
  119. package/dist/blakron/events/Event.d.ts.map +1 -0
  120. package/dist/blakron/events/Event.js +139 -0
  121. package/dist/blakron/events/Event.js.map +1 -0
  122. package/dist/blakron/events/EventDispatcher.d.ts +23 -0
  123. package/dist/blakron/events/EventDispatcher.d.ts.map +1 -0
  124. package/dist/blakron/events/EventDispatcher.js +123 -0
  125. package/dist/blakron/events/EventDispatcher.js.map +1 -0
  126. package/dist/blakron/events/EventPhase.d.ts +6 -0
  127. package/dist/blakron/events/EventPhase.d.ts.map +1 -0
  128. package/dist/blakron/events/EventPhase.js +2 -0
  129. package/dist/blakron/events/EventPhase.js.map +1 -0
  130. package/dist/blakron/events/FocusEvent.d.ts +7 -0
  131. package/dist/blakron/events/FocusEvent.d.ts.map +1 -0
  132. package/dist/blakron/events/FocusEvent.js +11 -0
  133. package/dist/blakron/events/FocusEvent.js.map +1 -0
  134. package/dist/blakron/events/HTTPStatusEvent.d.ts +10 -0
  135. package/dist/blakron/events/HTTPStatusEvent.d.ts.map +1 -0
  136. package/dist/blakron/events/HTTPStatusEvent.js +24 -0
  137. package/dist/blakron/events/HTTPStatusEvent.js.map +1 -0
  138. package/dist/blakron/events/IEventDispatcher.d.ts +11 -0
  139. package/dist/blakron/events/IEventDispatcher.d.ts.map +1 -0
  140. package/dist/blakron/events/IEventDispatcher.js +2 -0
  141. package/dist/blakron/events/IEventDispatcher.js.map +1 -0
  142. package/dist/blakron/events/IOErrorEvent.d.ts +8 -0
  143. package/dist/blakron/events/IOErrorEvent.d.ts.map +1 -0
  144. package/dist/blakron/events/IOErrorEvent.js +17 -0
  145. package/dist/blakron/events/IOErrorEvent.js.map +1 -0
  146. package/dist/blakron/events/ProgressEvent.d.ts +11 -0
  147. package/dist/blakron/events/ProgressEvent.d.ts.map +1 -0
  148. package/dist/blakron/events/ProgressEvent.js +25 -0
  149. package/dist/blakron/events/ProgressEvent.js.map +1 -0
  150. package/dist/blakron/events/StageOrientationEvent.d.ts +8 -0
  151. package/dist/blakron/events/StageOrientationEvent.d.ts.map +1 -0
  152. package/dist/blakron/events/StageOrientationEvent.js +17 -0
  153. package/dist/blakron/events/StageOrientationEvent.js.map +1 -0
  154. package/dist/blakron/events/TextEvent.d.ts +9 -0
  155. package/dist/blakron/events/TextEvent.d.ts.map +1 -0
  156. package/dist/blakron/events/TextEvent.js +21 -0
  157. package/dist/blakron/events/TextEvent.js.map +1 -0
  158. package/dist/blakron/events/TimerEvent.d.ts +14 -0
  159. package/dist/blakron/events/TimerEvent.d.ts.map +1 -0
  160. package/dist/blakron/events/TimerEvent.js +27 -0
  161. package/dist/blakron/events/TimerEvent.js.map +1 -0
  162. package/dist/blakron/events/TouchEvent.d.ts +32 -0
  163. package/dist/blakron/events/TouchEvent.d.ts.map +1 -0
  164. package/dist/blakron/events/TouchEvent.js +85 -0
  165. package/dist/blakron/events/TouchEvent.js.map +1 -0
  166. package/dist/blakron/events/index.d.ts +13 -0
  167. package/dist/blakron/events/index.d.ts.map +1 -0
  168. package/dist/blakron/events/index.js +11 -0
  169. package/dist/blakron/events/index.js.map +1 -0
  170. package/dist/blakron/external/ExternalInterface.d.ts +18 -0
  171. package/dist/blakron/external/ExternalInterface.d.ts.map +1 -0
  172. package/dist/blakron/external/ExternalInterface.js +23 -0
  173. package/dist/blakron/external/ExternalInterface.js.map +1 -0
  174. package/dist/blakron/external/index.d.ts +2 -0
  175. package/dist/blakron/external/index.d.ts.map +1 -0
  176. package/dist/blakron/external/index.js +2 -0
  177. package/dist/blakron/external/index.js.map +1 -0
  178. package/dist/blakron/filters/BlurFilter.d.ts +16 -0
  179. package/dist/blakron/filters/BlurFilter.d.ts.map +1 -0
  180. package/dist/blakron/filters/BlurFilter.js +56 -0
  181. package/dist/blakron/filters/BlurFilter.js.map +1 -0
  182. package/dist/blakron/filters/ColorMatrixFilter.d.ts +10 -0
  183. package/dist/blakron/filters/ColorMatrixFilter.d.ts.map +1 -0
  184. package/dist/blakron/filters/ColorMatrixFilter.js +51 -0
  185. package/dist/blakron/filters/ColorMatrixFilter.js.map +1 -0
  186. package/dist/blakron/filters/CustomFilter.d.ts +12 -0
  187. package/dist/blakron/filters/CustomFilter.d.ts.map +1 -0
  188. package/dist/blakron/filters/CustomFilter.js +43 -0
  189. package/dist/blakron/filters/CustomFilter.js.map +1 -0
  190. package/dist/blakron/filters/DropShadowFilter.d.ts +16 -0
  191. package/dist/blakron/filters/DropShadowFilter.d.ts.map +1 -0
  192. package/dist/blakron/filters/DropShadowFilter.js +76 -0
  193. package/dist/blakron/filters/DropShadowFilter.js.map +1 -0
  194. package/dist/blakron/filters/Filter.d.ts +20 -0
  195. package/dist/blakron/filters/Filter.d.ts.map +1 -0
  196. package/dist/blakron/filters/Filter.js +27 -0
  197. package/dist/blakron/filters/Filter.js.map +1 -0
  198. package/dist/blakron/filters/GlowFilter.d.ts +34 -0
  199. package/dist/blakron/filters/GlowFilter.d.ts.map +1 -0
  200. package/dist/blakron/filters/GlowFilter.js +131 -0
  201. package/dist/blakron/filters/GlowFilter.js.map +1 -0
  202. package/dist/blakron/filters/index.d.ts +7 -0
  203. package/dist/blakron/filters/index.d.ts.map +1 -0
  204. package/dist/blakron/filters/index.js +7 -0
  205. package/dist/blakron/filters/index.js.map +1 -0
  206. package/dist/blakron/geom/Matrix.d.ts +51 -0
  207. package/dist/blakron/geom/Matrix.d.ts.map +1 -0
  208. package/dist/blakron/geom/Matrix.js +312 -0
  209. package/dist/blakron/geom/Matrix.js.map +1 -0
  210. package/dist/blakron/geom/Point.d.ts +24 -0
  211. package/dist/blakron/geom/Point.d.ts.map +1 -0
  212. package/dist/blakron/geom/Point.js +75 -0
  213. package/dist/blakron/geom/Point.js.map +1 -0
  214. package/dist/blakron/geom/Rectangle.d.ts +48 -0
  215. package/dist/blakron/geom/Rectangle.d.ts.map +1 -0
  216. package/dist/blakron/geom/Rectangle.js +176 -0
  217. package/dist/blakron/geom/Rectangle.js.map +1 -0
  218. package/dist/blakron/geom/index.d.ts +4 -0
  219. package/dist/blakron/geom/index.d.ts.map +1 -0
  220. package/dist/blakron/geom/index.js +4 -0
  221. package/dist/blakron/geom/index.js.map +1 -0
  222. package/dist/blakron/localStorage/index.d.ts +2 -0
  223. package/dist/blakron/localStorage/index.d.ts.map +1 -0
  224. package/dist/blakron/localStorage/index.js +2 -0
  225. package/dist/blakron/localStorage/index.js.map +1 -0
  226. package/dist/blakron/localStorage/localStorage.d.ts +5 -0
  227. package/dist/blakron/localStorage/localStorage.d.ts.map +1 -0
  228. package/dist/blakron/localStorage/localStorage.js +19 -0
  229. package/dist/blakron/localStorage/localStorage.js.map +1 -0
  230. package/dist/blakron/media/Sound.d.ts +26 -0
  231. package/dist/blakron/media/Sound.d.ts.map +1 -0
  232. package/dist/blakron/media/Sound.js +145 -0
  233. package/dist/blakron/media/Sound.js.map +1 -0
  234. package/dist/blakron/media/SoundChannel.d.ts +28 -0
  235. package/dist/blakron/media/SoundChannel.d.ts.map +1 -0
  236. package/dist/blakron/media/SoundChannel.js +117 -0
  237. package/dist/blakron/media/SoundChannel.js.map +1 -0
  238. package/dist/blakron/media/Video.d.ts +50 -0
  239. package/dist/blakron/media/Video.d.ts.map +1 -0
  240. package/dist/blakron/media/Video.js +249 -0
  241. package/dist/blakron/media/Video.js.map +1 -0
  242. package/dist/blakron/media/index.d.ts +4 -0
  243. package/dist/blakron/media/index.d.ts.map +1 -0
  244. package/dist/blakron/media/index.js +4 -0
  245. package/dist/blakron/media/index.js.map +1 -0
  246. package/dist/blakron/net/HttpMethod.d.ts +6 -0
  247. package/dist/blakron/net/HttpMethod.d.ts.map +1 -0
  248. package/dist/blakron/net/HttpMethod.js +5 -0
  249. package/dist/blakron/net/HttpMethod.js.map +1 -0
  250. package/dist/blakron/net/HttpRequest.d.ts +19 -0
  251. package/dist/blakron/net/HttpRequest.d.ts.map +1 -0
  252. package/dist/blakron/net/HttpRequest.js +63 -0
  253. package/dist/blakron/net/HttpRequest.js.map +1 -0
  254. package/dist/blakron/net/HttpResponseType.d.ts +6 -0
  255. package/dist/blakron/net/HttpResponseType.d.ts.map +1 -0
  256. package/dist/blakron/net/HttpResponseType.js +5 -0
  257. package/dist/blakron/net/HttpResponseType.js.map +1 -0
  258. package/dist/blakron/net/ImageLoader.d.ts +10 -0
  259. package/dist/blakron/net/ImageLoader.d.ts.map +1 -0
  260. package/dist/blakron/net/ImageLoader.js +32 -0
  261. package/dist/blakron/net/ImageLoader.js.map +1 -0
  262. package/dist/blakron/net/index.d.ts +7 -0
  263. package/dist/blakron/net/index.d.ts.map +1 -0
  264. package/dist/blakron/net/index.js +5 -0
  265. package/dist/blakron/net/index.js.map +1 -0
  266. package/dist/blakron/player/BlakronOptions.d.ts +25 -0
  267. package/dist/blakron/player/BlakronOptions.d.ts.map +1 -0
  268. package/dist/blakron/player/BlakronOptions.js +2 -0
  269. package/dist/blakron/player/BlakronOptions.js.map +1 -0
  270. package/dist/blakron/player/CanvasRenderer.d.ts +49 -0
  271. package/dist/blakron/player/CanvasRenderer.d.ts.map +1 -0
  272. package/dist/blakron/player/CanvasRenderer.js +767 -0
  273. package/dist/blakron/player/CanvasRenderer.js.map +1 -0
  274. package/dist/blakron/player/DisplayList.d.ts +32 -0
  275. package/dist/blakron/player/DisplayList.d.ts.map +1 -0
  276. package/dist/blakron/player/DisplayList.js +78 -0
  277. package/dist/blakron/player/DisplayList.js.map +1 -0
  278. package/dist/blakron/player/InstructionSet.d.ts +49 -0
  279. package/dist/blakron/player/InstructionSet.d.ts.map +1 -0
  280. package/dist/blakron/player/InstructionSet.js +45 -0
  281. package/dist/blakron/player/InstructionSet.js.map +1 -0
  282. package/dist/blakron/player/Player.d.ts +45 -0
  283. package/dist/blakron/player/Player.d.ts.map +1 -0
  284. package/dist/blakron/player/Player.js +149 -0
  285. package/dist/blakron/player/Player.js.map +1 -0
  286. package/dist/blakron/player/RenderBuffer.d.ts +35 -0
  287. package/dist/blakron/player/RenderBuffer.d.ts.map +1 -0
  288. package/dist/blakron/player/RenderBuffer.js +81 -0
  289. package/dist/blakron/player/RenderBuffer.js.map +1 -0
  290. package/dist/blakron/player/RenderPipe.d.ts +33 -0
  291. package/dist/blakron/player/RenderPipe.d.ts.map +1 -0
  292. package/dist/blakron/player/RenderPipe.js +2 -0
  293. package/dist/blakron/player/RenderPipe.js.map +1 -0
  294. package/dist/blakron/player/ScreenAdapter.d.ts +29 -0
  295. package/dist/blakron/player/ScreenAdapter.d.ts.map +1 -0
  296. package/dist/blakron/player/ScreenAdapter.js +127 -0
  297. package/dist/blakron/player/ScreenAdapter.js.map +1 -0
  298. package/dist/blakron/player/SystemTicker.d.ts +63 -0
  299. package/dist/blakron/player/SystemTicker.d.ts.map +1 -0
  300. package/dist/blakron/player/SystemTicker.js +207 -0
  301. package/dist/blakron/player/SystemTicker.js.map +1 -0
  302. package/dist/blakron/player/TouchHandler.d.ts +39 -0
  303. package/dist/blakron/player/TouchHandler.d.ts.map +1 -0
  304. package/dist/blakron/player/TouchHandler.js +149 -0
  305. package/dist/blakron/player/TouchHandler.js.map +1 -0
  306. package/dist/blakron/player/createPlayer.d.ts +35 -0
  307. package/dist/blakron/player/createPlayer.d.ts.map +1 -0
  308. package/dist/blakron/player/createPlayer.js +74 -0
  309. package/dist/blakron/player/createPlayer.js.map +1 -0
  310. package/dist/blakron/player/index.d.ts +13 -0
  311. package/dist/blakron/player/index.d.ts.map +1 -0
  312. package/dist/blakron/player/index.js +16 -0
  313. package/dist/blakron/player/index.js.map +1 -0
  314. package/dist/blakron/player/pipes/BitmapPipe.d.ts +35 -0
  315. package/dist/blakron/player/pipes/BitmapPipe.d.ts.map +1 -0
  316. package/dist/blakron/player/pipes/BitmapPipe.js +130 -0
  317. package/dist/blakron/player/pipes/BitmapPipe.js.map +1 -0
  318. package/dist/blakron/player/pipes/FilterPipe.d.ts +68 -0
  319. package/dist/blakron/player/pipes/FilterPipe.d.ts.map +1 -0
  320. package/dist/blakron/player/pipes/FilterPipe.js +157 -0
  321. package/dist/blakron/player/pipes/FilterPipe.js.map +1 -0
  322. package/dist/blakron/player/pipes/GraphicsPipe.d.ts +36 -0
  323. package/dist/blakron/player/pipes/GraphicsPipe.d.ts.map +1 -0
  324. package/dist/blakron/player/pipes/GraphicsPipe.js +126 -0
  325. package/dist/blakron/player/pipes/GraphicsPipe.js.map +1 -0
  326. package/dist/blakron/player/pipes/MaskPipe.d.ts +58 -0
  327. package/dist/blakron/player/pipes/MaskPipe.d.ts.map +1 -0
  328. package/dist/blakron/player/pipes/MaskPipe.js +185 -0
  329. package/dist/blakron/player/pipes/MaskPipe.js.map +1 -0
  330. package/dist/blakron/player/pipes/MeshPipe.d.ts +22 -0
  331. package/dist/blakron/player/pipes/MeshPipe.d.ts.map +1 -0
  332. package/dist/blakron/player/pipes/MeshPipe.js +50 -0
  333. package/dist/blakron/player/pipes/MeshPipe.js.map +1 -0
  334. package/dist/blakron/player/pipes/TextPipe.d.ts +52 -0
  335. package/dist/blakron/player/pipes/TextPipe.d.ts.map +1 -0
  336. package/dist/blakron/player/pipes/TextPipe.js +163 -0
  337. package/dist/blakron/player/pipes/TextPipe.js.map +1 -0
  338. package/dist/blakron/player/webgl/MultiTextureBatcher.d.ts +37 -0
  339. package/dist/blakron/player/webgl/MultiTextureBatcher.d.ts.map +1 -0
  340. package/dist/blakron/player/webgl/MultiTextureBatcher.js +63 -0
  341. package/dist/blakron/player/webgl/MultiTextureBatcher.js.map +1 -0
  342. package/dist/blakron/player/webgl/ShaderLib.d.ts +34 -0
  343. package/dist/blakron/player/webgl/ShaderLib.d.ts.map +1 -0
  344. package/dist/blakron/player/webgl/ShaderLib.js +268 -0
  345. package/dist/blakron/player/webgl/ShaderLib.js.map +1 -0
  346. package/dist/blakron/player/webgl/WebGLDrawCmdManager.d.ts +58 -0
  347. package/dist/blakron/player/webgl/WebGLDrawCmdManager.d.ts.map +1 -0
  348. package/dist/blakron/player/webgl/WebGLDrawCmdManager.js +197 -0
  349. package/dist/blakron/player/webgl/WebGLDrawCmdManager.js.map +1 -0
  350. package/dist/blakron/player/webgl/WebGLProgram.d.ts +14 -0
  351. package/dist/blakron/player/webgl/WebGLProgram.d.ts.map +1 -0
  352. package/dist/blakron/player/webgl/WebGLProgram.js +32 -0
  353. package/dist/blakron/player/webgl/WebGLProgram.js.map +1 -0
  354. package/dist/blakron/player/webgl/WebGLRenderBuffer.d.ts +52 -0
  355. package/dist/blakron/player/webgl/WebGLRenderBuffer.d.ts.map +1 -0
  356. package/dist/blakron/player/webgl/WebGLRenderBuffer.js +227 -0
  357. package/dist/blakron/player/webgl/WebGLRenderBuffer.js.map +1 -0
  358. package/dist/blakron/player/webgl/WebGLRenderContext.d.ts +114 -0
  359. package/dist/blakron/player/webgl/WebGLRenderContext.d.ts.map +1 -0
  360. package/dist/blakron/player/webgl/WebGLRenderContext.js +852 -0
  361. package/dist/blakron/player/webgl/WebGLRenderContext.js.map +1 -0
  362. package/dist/blakron/player/webgl/WebGLRenderTarget.d.ts +19 -0
  363. package/dist/blakron/player/webgl/WebGLRenderTarget.d.ts.map +1 -0
  364. package/dist/blakron/player/webgl/WebGLRenderTarget.js +90 -0
  365. package/dist/blakron/player/webgl/WebGLRenderTarget.js.map +1 -0
  366. package/dist/blakron/player/webgl/WebGLRenderer.d.ts +91 -0
  367. package/dist/blakron/player/webgl/WebGLRenderer.d.ts.map +1 -0
  368. package/dist/blakron/player/webgl/WebGLRenderer.js +721 -0
  369. package/dist/blakron/player/webgl/WebGLRenderer.js.map +1 -0
  370. package/dist/blakron/player/webgl/WebGLUtils.d.ts +11 -0
  371. package/dist/blakron/player/webgl/WebGLUtils.d.ts.map +1 -0
  372. package/dist/blakron/player/webgl/WebGLUtils.js +57 -0
  373. package/dist/blakron/player/webgl/WebGLUtils.js.map +1 -0
  374. package/dist/blakron/player/webgl/WebGLVertexArrayObject.d.ts +39 -0
  375. package/dist/blakron/player/webgl/WebGLVertexArrayObject.d.ts.map +1 -0
  376. package/dist/blakron/player/webgl/WebGLVertexArrayObject.js +367 -0
  377. package/dist/blakron/player/webgl/WebGLVertexArrayObject.js.map +1 -0
  378. package/dist/blakron/player/webgl/index.d.ts +11 -0
  379. package/dist/blakron/player/webgl/index.d.ts.map +1 -0
  380. package/dist/blakron/player/webgl/index.js +11 -0
  381. package/dist/blakron/player/webgl/index.js.map +1 -0
  382. package/dist/blakron/resource/Resource.d.ts +114 -0
  383. package/dist/blakron/resource/Resource.d.ts.map +1 -0
  384. package/dist/blakron/resource/Resource.js +363 -0
  385. package/dist/blakron/resource/Resource.js.map +1 -0
  386. package/dist/blakron/resource/ResourceConfig.d.ts +71 -0
  387. package/dist/blakron/resource/ResourceConfig.d.ts.map +1 -0
  388. package/dist/blakron/resource/ResourceConfig.js +144 -0
  389. package/dist/blakron/resource/ResourceConfig.js.map +1 -0
  390. package/dist/blakron/resource/ResourceEvent.d.ts +29 -0
  391. package/dist/blakron/resource/ResourceEvent.d.ts.map +1 -0
  392. package/dist/blakron/resource/ResourceEvent.js +12 -0
  393. package/dist/blakron/resource/ResourceEvent.js.map +1 -0
  394. package/dist/blakron/resource/ResourceItem.d.ts +24 -0
  395. package/dist/blakron/resource/ResourceItem.d.ts.map +1 -0
  396. package/dist/blakron/resource/ResourceItem.js +29 -0
  397. package/dist/blakron/resource/ResourceItem.js.map +1 -0
  398. package/dist/blakron/resource/ResourceLoader.d.ts +50 -0
  399. package/dist/blakron/resource/ResourceLoader.d.ts.map +1 -0
  400. package/dist/blakron/resource/ResourceLoader.js +138 -0
  401. package/dist/blakron/resource/ResourceLoader.js.map +1 -0
  402. package/dist/blakron/resource/analyzers/AnalyzerBase.d.ts +31 -0
  403. package/dist/blakron/resource/analyzers/AnalyzerBase.d.ts.map +1 -0
  404. package/dist/blakron/resource/analyzers/AnalyzerBase.js +38 -0
  405. package/dist/blakron/resource/analyzers/AnalyzerBase.js.map +1 -0
  406. package/dist/blakron/resource/analyzers/ImageAnalyzer.d.ts +13 -0
  407. package/dist/blakron/resource/analyzers/ImageAnalyzer.d.ts.map +1 -0
  408. package/dist/blakron/resource/analyzers/ImageAnalyzer.js +54 -0
  409. package/dist/blakron/resource/analyzers/ImageAnalyzer.js.map +1 -0
  410. package/dist/blakron/resource/analyzers/JsonAnalyzer.d.ts +12 -0
  411. package/dist/blakron/resource/analyzers/JsonAnalyzer.d.ts.map +1 -0
  412. package/dist/blakron/resource/analyzers/JsonAnalyzer.js +54 -0
  413. package/dist/blakron/resource/analyzers/JsonAnalyzer.js.map +1 -0
  414. package/dist/blakron/resource/analyzers/SheetAnalyzer.d.ts +32 -0
  415. package/dist/blakron/resource/analyzers/SheetAnalyzer.d.ts.map +1 -0
  416. package/dist/blakron/resource/analyzers/SheetAnalyzer.js +182 -0
  417. package/dist/blakron/resource/analyzers/SheetAnalyzer.js.map +1 -0
  418. package/dist/blakron/resource/analyzers/SoundAnalyzer.d.ts +13 -0
  419. package/dist/blakron/resource/analyzers/SoundAnalyzer.d.ts.map +1 -0
  420. package/dist/blakron/resource/analyzers/SoundAnalyzer.js +45 -0
  421. package/dist/blakron/resource/analyzers/SoundAnalyzer.js.map +1 -0
  422. package/dist/blakron/resource/analyzers/TextAnalyzer.d.ts +12 -0
  423. package/dist/blakron/resource/analyzers/TextAnalyzer.d.ts.map +1 -0
  424. package/dist/blakron/resource/analyzers/TextAnalyzer.js +49 -0
  425. package/dist/blakron/resource/analyzers/TextAnalyzer.js.map +1 -0
  426. package/dist/blakron/resource/analyzers/index.d.ts +7 -0
  427. package/dist/blakron/resource/analyzers/index.d.ts.map +1 -0
  428. package/dist/blakron/resource/analyzers/index.js +7 -0
  429. package/dist/blakron/resource/analyzers/index.js.map +1 -0
  430. package/dist/blakron/resource/index.d.ts +15 -0
  431. package/dist/blakron/resource/index.d.ts.map +1 -0
  432. package/dist/blakron/resource/index.js +15 -0
  433. package/dist/blakron/resource/index.js.map +1 -0
  434. package/dist/blakron/system/Capabilities.d.ts +46 -0
  435. package/dist/blakron/system/Capabilities.d.ts.map +1 -0
  436. package/dist/blakron/system/Capabilities.js +100 -0
  437. package/dist/blakron/system/Capabilities.js.map +1 -0
  438. package/dist/blakron/system/index.d.ts +2 -0
  439. package/dist/blakron/system/index.d.ts.map +1 -0
  440. package/dist/blakron/system/index.js +2 -0
  441. package/dist/blakron/system/index.js.map +1 -0
  442. package/dist/blakron/text/BitmapFont.d.ts +31 -0
  443. package/dist/blakron/text/BitmapFont.d.ts.map +1 -0
  444. package/dist/blakron/text/BitmapFont.js +86 -0
  445. package/dist/blakron/text/BitmapFont.js.map +1 -0
  446. package/dist/blakron/text/BitmapText.d.ts +56 -0
  447. package/dist/blakron/text/BitmapText.d.ts.map +1 -0
  448. package/dist/blakron/text/BitmapText.js +230 -0
  449. package/dist/blakron/text/BitmapText.js.map +1 -0
  450. package/dist/blakron/text/HtmlTextParser.d.ts +14 -0
  451. package/dist/blakron/text/HtmlTextParser.d.ts.map +1 -0
  452. package/dist/blakron/text/HtmlTextParser.js +147 -0
  453. package/dist/blakron/text/HtmlTextParser.js.map +1 -0
  454. package/dist/blakron/text/InputController.d.ts +29 -0
  455. package/dist/blakron/text/InputController.d.ts.map +1 -0
  456. package/dist/blakron/text/InputController.js +131 -0
  457. package/dist/blakron/text/InputController.js.map +1 -0
  458. package/dist/blakron/text/StageText.d.ts +53 -0
  459. package/dist/blakron/text/StageText.d.ts.map +1 -0
  460. package/dist/blakron/text/StageText.js +392 -0
  461. package/dist/blakron/text/StageText.js.map +1 -0
  462. package/dist/blakron/text/TextField.d.ts +145 -0
  463. package/dist/blakron/text/TextField.d.ts.map +1 -0
  464. package/dist/blakron/text/TextField.js +716 -0
  465. package/dist/blakron/text/TextField.js.map +1 -0
  466. package/dist/blakron/text/TextMeasurer.d.ts +9 -0
  467. package/dist/blakron/text/TextMeasurer.d.ts.map +1 -0
  468. package/dist/blakron/text/TextMeasurer.js +36 -0
  469. package/dist/blakron/text/TextMeasurer.js.map +1 -0
  470. package/dist/blakron/text/WordWrap.d.ts +15 -0
  471. package/dist/blakron/text/WordWrap.d.ts.map +1 -0
  472. package/dist/blakron/text/WordWrap.js +50 -0
  473. package/dist/blakron/text/WordWrap.js.map +1 -0
  474. package/dist/blakron/text/enums/HorizontalAlign.d.ts +9 -0
  475. package/dist/blakron/text/enums/HorizontalAlign.d.ts.map +1 -0
  476. package/dist/blakron/text/enums/HorizontalAlign.js +8 -0
  477. package/dist/blakron/text/enums/HorizontalAlign.js.map +1 -0
  478. package/dist/blakron/text/enums/TextFieldInputType.d.ts +7 -0
  479. package/dist/blakron/text/enums/TextFieldInputType.d.ts.map +1 -0
  480. package/dist/blakron/text/enums/TextFieldInputType.js +6 -0
  481. package/dist/blakron/text/enums/TextFieldInputType.js.map +1 -0
  482. package/dist/blakron/text/enums/TextFieldType.d.ts +6 -0
  483. package/dist/blakron/text/enums/TextFieldType.d.ts.map +1 -0
  484. package/dist/blakron/text/enums/TextFieldType.js +5 -0
  485. package/dist/blakron/text/enums/TextFieldType.js.map +1 -0
  486. package/dist/blakron/text/enums/VerticalAlign.d.ts +9 -0
  487. package/dist/blakron/text/enums/VerticalAlign.d.ts.map +1 -0
  488. package/dist/blakron/text/enums/VerticalAlign.js +8 -0
  489. package/dist/blakron/text/enums/VerticalAlign.js.map +1 -0
  490. package/dist/blakron/text/enums/index.d.ts +5 -0
  491. package/dist/blakron/text/enums/index.d.ts.map +1 -0
  492. package/dist/blakron/text/enums/index.js +5 -0
  493. package/dist/blakron/text/enums/index.js.map +1 -0
  494. package/dist/blakron/text/index.d.ts +14 -0
  495. package/dist/blakron/text/index.d.ts.map +1 -0
  496. package/dist/blakron/text/index.js +13 -0
  497. package/dist/blakron/text/index.js.map +1 -0
  498. package/dist/blakron/text/types/ITextElement.d.ts +31 -0
  499. package/dist/blakron/text/types/ITextElement.d.ts.map +1 -0
  500. package/dist/blakron/text/types/ITextElement.js +2 -0
  501. package/dist/blakron/text/types/ITextElement.js.map +1 -0
  502. package/dist/blakron/text/types/index.d.ts +2 -0
  503. package/dist/blakron/text/types/index.d.ts.map +1 -0
  504. package/dist/blakron/text/types/index.js +2 -0
  505. package/dist/blakron/text/types/index.js.map +1 -0
  506. package/dist/blakron/utils/Base64Util.d.ts +5 -0
  507. package/dist/blakron/utils/Base64Util.d.ts.map +1 -0
  508. package/dist/blakron/utils/Base64Util.js +45 -0
  509. package/dist/blakron/utils/Base64Util.js.map +1 -0
  510. package/dist/blakron/utils/ByteArray.d.ts +66 -0
  511. package/dist/blakron/utils/ByteArray.d.ts.map +1 -0
  512. package/dist/blakron/utils/ByteArray.js +303 -0
  513. package/dist/blakron/utils/ByteArray.js.map +1 -0
  514. package/dist/blakron/utils/DebugLog.d.ts +9 -0
  515. package/dist/blakron/utils/DebugLog.d.ts.map +1 -0
  516. package/dist/blakron/utils/DebugLog.js +25 -0
  517. package/dist/blakron/utils/DebugLog.js.map +1 -0
  518. package/dist/blakron/utils/FontManager.d.ts +11 -0
  519. package/dist/blakron/utils/FontManager.d.ts.map +1 -0
  520. package/dist/blakron/utils/FontManager.js +39 -0
  521. package/dist/blakron/utils/FontManager.js.map +1 -0
  522. package/dist/blakron/utils/HashObject.d.ts +9 -0
  523. package/dist/blakron/utils/HashObject.d.ts.map +1 -0
  524. package/dist/blakron/utils/HashObject.js +11 -0
  525. package/dist/blakron/utils/HashObject.js.map +1 -0
  526. package/dist/blakron/utils/Logger.d.ts +16 -0
  527. package/dist/blakron/utils/Logger.d.ts.map +1 -0
  528. package/dist/blakron/utils/Logger.js +26 -0
  529. package/dist/blakron/utils/Logger.js.map +1 -0
  530. package/dist/blakron/utils/NumberUtils.d.ts +15 -0
  531. package/dist/blakron/utils/NumberUtils.d.ts.map +1 -0
  532. package/dist/blakron/utils/NumberUtils.js +60 -0
  533. package/dist/blakron/utils/NumberUtils.js.map +1 -0
  534. package/dist/blakron/utils/Timer.d.ts +22 -0
  535. package/dist/blakron/utils/Timer.d.ts.map +1 -0
  536. package/dist/blakron/utils/Timer.js +67 -0
  537. package/dist/blakron/utils/Timer.js.map +1 -0
  538. package/dist/blakron/utils/index.d.ts +11 -0
  539. package/dist/blakron/utils/index.d.ts.map +1 -0
  540. package/dist/blakron/utils/index.js +10 -0
  541. package/dist/blakron/utils/index.js.map +1 -0
  542. package/dist/blakron/utils/toColorString.d.ts +2 -0
  543. package/dist/blakron/utils/toColorString.d.ts.map +1 -0
  544. package/dist/blakron/utils/toColorString.js +5 -0
  545. package/dist/blakron/utils/toColorString.js.map +1 -0
  546. package/dist/index.d.ts +13 -12
  547. package/dist/index.d.ts.map +1 -1
  548. package/dist/index.js +13 -12
  549. package/dist/index.js.map +1 -1
  550. package/package.json +52 -51
@@ -0,0 +1,852 @@
1
+ import { ColorMatrixFilter } from '../../filters/ColorMatrixFilter.js';
2
+ import { BlurFilter } from '../../filters/BlurFilter.js';
3
+ import { GlowFilter } from '../../filters/GlowFilter.js';
4
+ import { DropShadowFilter } from '../../filters/DropShadowFilter.js';
5
+ import { WebGLVertexArrayObject } from './WebGLVertexArrayObject.js';
6
+ import { WebGLDrawCmdManager } from './WebGLDrawCmdManager.js';
7
+ import { WebGLProgram } from './WebGLProgram.js';
8
+ import { ShaderLib, getBlurTier, makeBlurHFrag, makeBlurVFrag } from './ShaderLib.js';
9
+ import { SYM_GL_CONTEXT, SYM_PREMULTIPLIED, SYM_DEFAULT_EMPTY, SYM_SMOOTHING } from './WebGLUtils.js';
10
+ import { MultiTextureBatcher, makeMultiCmd } from './MultiTextureBatcher.js';
11
+ export class WebGLRenderContext {
12
+ // ── Static fields ─────────────────────────────────────────────────────────
13
+ static _instance;
14
+ static getInstance(canvas) {
15
+ if (!this._instance)
16
+ this._instance = new WebGLRenderContext(canvas);
17
+ return this._instance;
18
+ }
19
+ static resetInstance() {
20
+ this._instance = undefined;
21
+ }
22
+ // ── Public readonly fields ────────────────────────────────────────────────
23
+ gl;
24
+ surface;
25
+ drawCmdManager;
26
+ // ── Public mutable fields ─────────────────────────────────────────────────
27
+ maxTextureSize = 2048;
28
+ contextLost = false;
29
+ projectionX = 0;
30
+ projectionY = 0;
31
+ activeFilter;
32
+ currentBlendMode = 'source-over';
33
+ // ── Private fields ────────────────────────────────────────────────────────
34
+ _vao;
35
+ _batcher = new MultiTextureBatcher();
36
+ _bufferStack = [];
37
+ _currentBuffer;
38
+ _vertexBuffer;
39
+ _indexBuffer;
40
+ _bindIndices = false;
41
+ // Track which GPU buffer size is currently allocated so we only re-allocate
42
+ // when switching between single-texture and multi-texture layouts.
43
+ _gpuVertexBufferSize = 0;
44
+ _defaultEmptyTexture;
45
+ _maxTextureUnits = MultiTextureBatcher.MAX_TEXTURES;
46
+ _contextRestoredCallbacks = [];
47
+ _trackedBitmapDatas = new Set();
48
+ // ── Blur FBO pool ─────────────────────────────────────────────────────────
49
+ // Key: "${width}x${height}", Value: stack of reusable { texture, fbo } pairs.
50
+ _blurFboPool = new Map();
51
+ constructor(canvas) {
52
+ this.surface = canvas;
53
+ const gl = (canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl'));
54
+ if (!gl)
55
+ throw new Error('WebGL not supported');
56
+ this.gl = gl;
57
+ gl.disable(gl.DEPTH_TEST);
58
+ gl.disable(gl.CULL_FACE);
59
+ gl.enable(gl.BLEND);
60
+ gl.colorMask(true, true, true, true);
61
+ gl.activeTexture(gl.TEXTURE0);
62
+ this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
63
+ this._maxTextureUnits = Math.min(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), MultiTextureBatcher.MAX_TEXTURES);
64
+ this._vertexBuffer = gl.createBuffer();
65
+ this._indexBuffer = gl.createBuffer();
66
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
67
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
68
+ this.drawCmdManager = new WebGLDrawCmdManager();
69
+ this._vao = new WebGLVertexArrayObject();
70
+ // Pre-allocate the GPU vertex buffer at maximum single-texture capacity.
71
+ // bufferSubData will update only the used portion each frame without
72
+ // triggering a GPU memory reallocation.
73
+ gl.bufferData(gl.ARRAY_BUFFER, WebGLVertexArrayObject.MAX_VERTEX_BYTES, gl.DYNAMIC_DRAW);
74
+ this._gpuVertexBufferSize = WebGLVertexArrayObject.MAX_VERTEX_BYTES;
75
+ this.setGlobalCompositeOperation('source-over');
76
+ canvas.addEventListener('webglcontextlost', e => {
77
+ e.preventDefault();
78
+ this.contextLost = true;
79
+ });
80
+ canvas.addEventListener('webglcontextrestored', () => {
81
+ this.contextLost = false;
82
+ this._onContextRestored();
83
+ });
84
+ }
85
+ // ── Getter ────────────────────────────────────────────────────────────────
86
+ /**
87
+ * Register a callback to be invoked after the WebGL context is restored.
88
+ * Returns an unregister function.
89
+ */
90
+ addContextRestoredListener(fn) {
91
+ this._contextRestoredCallbacks.push(fn);
92
+ return () => {
93
+ const i = this._contextRestoredCallbacks.indexOf(fn);
94
+ if (i >= 0)
95
+ this._contextRestoredCallbacks.splice(i, 1);
96
+ };
97
+ }
98
+ get activatedBuffer() {
99
+ return this._currentBuffer;
100
+ }
101
+ get defaultEmptyTexture() {
102
+ if (!this._defaultEmptyTexture) {
103
+ const canvas = document.createElement('canvas');
104
+ canvas.width = canvas.height = 16;
105
+ const ctx = canvas.getContext('2d');
106
+ ctx.fillStyle = 'white';
107
+ ctx.fillRect(0, 0, 16, 16);
108
+ this._defaultEmptyTexture = this.createTexture(canvas);
109
+ this._defaultEmptyTexture[SYM_DEFAULT_EMPTY] = true;
110
+ }
111
+ return this._defaultEmptyTexture;
112
+ }
113
+ // ── Buffer stack ──────────────────────────────────────────────────────────
114
+ pushBuffer(buffer) {
115
+ this._bufferStack.push(buffer);
116
+ if (buffer !== this._currentBuffer) {
117
+ this.drawCmdManager.pushActivateBuffer(buffer);
118
+ }
119
+ this._currentBuffer = buffer;
120
+ }
121
+ popBuffer() {
122
+ if (this._bufferStack.length <= 1)
123
+ return;
124
+ this._bufferStack.pop();
125
+ const last = this._bufferStack[this._bufferStack.length - 1];
126
+ if (last !== this._currentBuffer) {
127
+ this.drawCmdManager.pushActivateBuffer(last);
128
+ }
129
+ this._currentBuffer = last;
130
+ }
131
+ // ── Resize ────────────────────────────────────────────────────────────────
132
+ resize(width, height) {
133
+ this.surface.width = width;
134
+ this.surface.height = height;
135
+ this.onResize(width, height);
136
+ }
137
+ onResize(width, height) {
138
+ const w = width ?? this.surface.width;
139
+ const h = height ?? this.surface.height;
140
+ this.projectionX = w / 2;
141
+ this.projectionY = -h / 2;
142
+ this.gl.viewport(0, 0, w, h);
143
+ }
144
+ // ── Stencil / Scissor ─────────────────────────────────────────────────────
145
+ enableStencilTest() {
146
+ this.gl.enable(this.gl.STENCIL_TEST);
147
+ }
148
+ disableStencilTest() {
149
+ this.gl.disable(this.gl.STENCIL_TEST);
150
+ }
151
+ enableScissorTest(rect) {
152
+ const gl = this.gl;
153
+ gl.enable(gl.SCISSOR_TEST);
154
+ gl.scissor(rect.x, rect.y, rect.width, rect.height);
155
+ }
156
+ disableScissorTest() {
157
+ this.gl.disable(this.gl.SCISSOR_TEST);
158
+ }
159
+ enableScissor(x, y, width, height) {
160
+ this.drawCmdManager.pushEnableScissor(x, y, width, height);
161
+ }
162
+ disableScissor() {
163
+ this.drawCmdManager.pushDisableScissor();
164
+ }
165
+ // ── Mask (stencil-based) ──────────────────────────────────────────────────
166
+ pushMask(x, y, width, height) {
167
+ this.drawCmdManager.pushPushMask();
168
+ const buf = this._currentBuffer;
169
+ this._vao.cacheArrays(buf, 0, 0, width, height, x, y, width, height, width, height);
170
+ this.drawCmdManager.pushDrawRect();
171
+ }
172
+ popMask() {
173
+ this.drawCmdManager.pushPopMask();
174
+ const buf = this._currentBuffer;
175
+ const rect = buf.stencilList[buf.stencilList.length - 1];
176
+ if (rect) {
177
+ this._vao.cacheArrays(buf, 0, 0, rect.width, rect.height, rect.x, rect.y, rect.width, rect.height, rect.width, rect.height);
178
+ this.drawCmdManager.pushDrawRect();
179
+ }
180
+ }
181
+ // ── Blend mode ────────────────────────────────────────────────────────────
182
+ setGlobalCompositeOperation(value) {
183
+ this.currentBlendMode = value;
184
+ this.drawCmdManager.pushSetBlend(value);
185
+ }
186
+ // ── Texture ───────────────────────────────────────────────────────────────
187
+ createTexture(source) {
188
+ const gl = this.gl;
189
+ const texture = gl.createTexture();
190
+ texture[SYM_GL_CONTEXT] = gl;
191
+ gl.bindTexture(gl.TEXTURE_2D, texture);
192
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);
193
+ texture[SYM_PREMULTIPLIED] = true;
194
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
195
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
196
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
197
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
198
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
199
+ return texture;
200
+ }
201
+ updateTexture(texture, source) {
202
+ const gl = this.gl;
203
+ gl.bindTexture(gl.TEXTURE_2D, texture);
204
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);
205
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
206
+ }
207
+ getWebGLTexture(bitmapData) {
208
+ const source = bitmapData.source;
209
+ if (!source)
210
+ return undefined;
211
+ if (!bitmapData.webGLTexture) {
212
+ const tex = this.createTexture(source);
213
+ bitmapData.webGLTexture = tex;
214
+ tex[SYM_SMOOTHING] = true;
215
+ this._trackedBitmapDatas.add(new WeakRef(bitmapData));
216
+ }
217
+ else if (source instanceof HTMLVideoElement) {
218
+ // Video frames change every tick — re-upload the current frame
219
+ this.updateTexture(bitmapData.webGLTexture, source);
220
+ }
221
+ return bitmapData.webGLTexture;
222
+ }
223
+ // ── Draw ──────────────────────────────────────────────────────────────────
224
+ drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, imageSourceWidth, imageSourceHeight, rotated, smoothing) {
225
+ if (this.contextLost || !image || !this._currentBuffer)
226
+ return;
227
+ const texture = this.getWebGLTexture(image);
228
+ if (!texture)
229
+ return;
230
+ this.drawTexture(texture, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, imageSourceWidth, imageSourceHeight, undefined, undefined, undefined, undefined, rotated, smoothing);
231
+ }
232
+ drawMesh(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, imageSourceWidth, imageSourceHeight, meshUVs, meshVertices, meshIndices, rotated, smoothing) {
233
+ if (this.contextLost || !image || !this._currentBuffer)
234
+ return;
235
+ const texture = this.getWebGLTexture(image);
236
+ if (!texture)
237
+ return;
238
+ this.drawTexture(texture, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, imageSourceWidth, imageSourceHeight, meshUVs, meshVertices, meshIndices, undefined, rotated, smoothing);
239
+ }
240
+ drawTexture(texture, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, textureWidth, textureHeight, meshUVs, meshVertices, meshIndices, _bounds, rotated, smoothing) {
241
+ if (this.contextLost || !texture || !this._currentBuffer)
242
+ return;
243
+ const buf = this._currentBuffer;
244
+ if (meshVertices && meshIndices) {
245
+ const meshNum = meshIndices.length / 3;
246
+ if (this._vao.reachMaxSize(meshNum * 4, meshNum * 6))
247
+ this.flush();
248
+ }
249
+ else {
250
+ if (this._vao.reachMaxSize())
251
+ this.flush();
252
+ }
253
+ if (smoothing !== undefined && texture[SYM_SMOOTHING] !== smoothing) {
254
+ this.drawCmdManager.pushChangeSmoothing(texture, smoothing);
255
+ }
256
+ if (meshUVs)
257
+ this._vao.changeToMeshIndices();
258
+ // ── Multi-texture path (plain quads without filter) ───────────────────
259
+ const useMulti = !this.activeFilter && !meshVertices && this._maxTextureUnits > 1;
260
+ if (useMulti) {
261
+ let slot = this._batcher.getOrAssignSlot(texture);
262
+ if (slot === -1) {
263
+ this.flush();
264
+ slot = this._batcher.getOrAssignSlot(texture);
265
+ }
266
+ if (!this._vao.isMultiTexture())
267
+ this._vao.setMultiTexture(true);
268
+ this._vao.cacheArrays(buf, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, textureWidth, textureHeight, undefined, undefined, undefined, rotated, slot);
269
+ const cmd = makeMultiCmd(2, this._batcher.slots, this._batcher.textureCount);
270
+ this.drawCmdManager.pushDrawMultiTexture(cmd);
271
+ return;
272
+ }
273
+ // ── Single-texture path (filter, mesh, or single-unit device) ─────────
274
+ if (this._vao.isMultiTexture())
275
+ this.flush();
276
+ this._vao.cacheArrays(buf, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight, textureWidth, textureHeight, meshUVs, meshVertices, meshIndices, rotated);
277
+ const count = meshIndices ? meshIndices.length / 3 : 2;
278
+ this.drawCmdManager.pushDrawTexture(texture, count, this.activeFilter, textureWidth, textureHeight);
279
+ }
280
+ /**
281
+ * Composite the offscreen filter result back onto the current (parent) buffer.
282
+ *
283
+ * Strategy (following Egret's WebGLRenderer._drawWithFilter pattern):
284
+ *
285
+ * 1. Flush all pending batched commands so the offscreen FBO content is
286
+ * fully rasterised and the GL state is clean.
287
+ * 2. Apply multi-pass effects (blur ping-pong) directly on the offscreen
288
+ * texture via temporary FBOs.
289
+ * 3. Activate the parent buffer's FBO.
290
+ * 4. Draw the offscreen texture onto the parent buffer using the batched
291
+ * drawTexture() path so that the parent buffer's globalMatrix is
292
+ * correctly applied to position the result.
293
+ * 5. Flush immediately so the draw executes while the GL FBO state is
294
+ * known-good, preventing feedback loops.
295
+ */
296
+ compositeFilterResult(filters, offscreen) {
297
+ const target = offscreen.rootRenderTarget;
298
+ if (!target?.texture)
299
+ return;
300
+ const w = target.width;
301
+ const h = target.height;
302
+ // Step 1 — flush pending commands (leaf draws into the offscreen FBO).
303
+ this.flush();
304
+ // Step 2 — multi-pass blur (operates entirely via direct GL calls on
305
+ // temporary FBOs; does NOT touch the batched command queue).
306
+ for (const filter of filters) {
307
+ if (filter instanceof BlurFilter && (filter.blurX > 0 || filter.blurY > 0)) {
308
+ this._drawBlurPingPong(target.texture, w, h, filter, offscreen);
309
+ }
310
+ }
311
+ // Step 3 — ensure the parent buffer's FBO is the active GL framebuffer.
312
+ if (this._currentBuffer) {
313
+ this._currentBuffer.rootRenderTarget.activate();
314
+ this.onResize(this._currentBuffer.width, this._currentBuffer.height);
315
+ }
316
+ // Step 4 — queue a batched drawTexture so the parent buffer's
317
+ // globalMatrix positions the quad correctly.
318
+ const nonBlurFilter = filters.find(f => !(f instanceof BlurFilter));
319
+ this.activeFilter = nonBlurFilter;
320
+ this.drawTexture(target.texture, 0, 0, w, h, 0, 0, w, h, w, h);
321
+ this.activeFilter = undefined;
322
+ // Step 5 — flush immediately.
323
+ this.flush();
324
+ }
325
+ /**
326
+ * Two-pass separable Gaussian blur.
327
+ * Horizontal pass renders into a temporary FBO; vertical pass writes the
328
+ * blurred result back into the offscreen buffer's FBO so that the caller
329
+ * (compositeFilterResult) can composite it onto the parent buffer.
330
+ *
331
+ * Optimisations vs. the naive approach:
332
+ * - FBO pool: temporary textures/framebuffers are reused across frames
333
+ * (keyed by size) to avoid the expensive create/delete cycle on mobile.
334
+ * - Dynamic shader tier: the loop bound in the GLSL is a compile-time
335
+ * constant chosen from {4, 8, 16, 32} so the GPU can unroll/optimise it,
336
+ * while still supporting blur radii up to 32 px.
337
+ *
338
+ * NOTE: This method does NOT restore the parent buffer's FBO — the caller
339
+ * is responsible for activating the correct destination FBO before the
340
+ * final composite draw.
341
+ */
342
+ _drawBlurPingPong(texture, w, h, filter, buffer) {
343
+ const gl = this.gl;
344
+ // ── Acquire a temporary FBO from the pool (or create a new one) ───────
345
+ const poolKey = `${w}x${h}`;
346
+ let pool = this._blurFboPool.get(poolKey);
347
+ if (!pool) {
348
+ pool = [];
349
+ this._blurFboPool.set(poolKey, pool);
350
+ }
351
+ let tmpEntry = pool.pop();
352
+ if (!tmpEntry) {
353
+ const tmpTex = gl.createTexture();
354
+ gl.bindTexture(gl.TEXTURE_2D, tmpTex);
355
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
356
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
357
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
358
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
359
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
360
+ const tmpFbo = gl.createFramebuffer();
361
+ gl.bindFramebuffer(gl.FRAMEBUFFER, tmpFbo);
362
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tmpTex, 0);
363
+ tmpEntry = { texture: tmpTex, fbo: tmpFbo };
364
+ }
365
+ // Clear the temporary FBO before use.
366
+ gl.bindFramebuffer(gl.FRAMEBUFFER, tmpEntry.fbo);
367
+ gl.viewport(0, 0, w, h);
368
+ gl.clearColor(0, 0, 0, 0);
369
+ gl.clear(gl.COLOR_BUFFER_BIT);
370
+ // ── Select shader tier based on actual blur radius ────────────────────
371
+ const hTier = getBlurTier(filter.blurX);
372
+ const vTier = getBlurTier(filter.blurY);
373
+ const hKey = `blur_h_${hTier}`;
374
+ const vKey = `blur_v_${vTier}`;
375
+ // ── Pass 1: horizontal blur → tmpFbo ──────────────────────────────────
376
+ const hProg = WebGLProgram.get(gl, ShaderLib.default_vert, makeBlurHFrag(hTier), hKey);
377
+ this._drawFullscreenQuad(hProg, texture, w, h, prog => {
378
+ const uBlurX = prog.uniforms['blurX'];
379
+ const uSize = prog.uniforms['uTextureSize'];
380
+ if (uBlurX)
381
+ gl.uniform1f(uBlurX, filter.blurX);
382
+ if (uSize)
383
+ gl.uniform2f(uSize, w, h);
384
+ });
385
+ // ── Pass 2: vertical blur → offscreen FBO ────────────────────────────
386
+ buffer.rootRenderTarget.activate();
387
+ this.onResize(w, h);
388
+ const vProg = WebGLProgram.get(gl, ShaderLib.default_vert, makeBlurVFrag(vTier), vKey);
389
+ this._drawFullscreenQuad(vProg, tmpEntry.texture, w, h, prog => {
390
+ const uBlurY = prog.uniforms['blurY'];
391
+ const uSize = prog.uniforms['uTextureSize'];
392
+ if (uBlurY)
393
+ gl.uniform1f(uBlurY, filter.blurY);
394
+ if (uSize)
395
+ gl.uniform2f(uSize, w, h);
396
+ });
397
+ // ── Return the temporary FBO to the pool ──────────────────────────────
398
+ pool.push(tmpEntry);
399
+ }
400
+ /**
401
+ * Draws a single full-screen quad using the given program and texture.
402
+ * `setUniforms` is called after `useProgram` to let the caller set
403
+ * filter-specific uniforms.
404
+ */
405
+ _drawFullscreenQuad(prog, texture, w, h, setUniforms) {
406
+ const gl = this.gl;
407
+ gl.useProgram(prog.id);
408
+ const stride = 5 * 4;
409
+ const aPos = prog.attributes['aVertexPosition'];
410
+ const aUV = prog.attributes['aTextureCoord'];
411
+ const aColor = prog.attributes['aColor'];
412
+ if (aPos !== undefined && aPos >= 0) {
413
+ gl.enableVertexAttribArray(aPos);
414
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
415
+ }
416
+ if (aUV !== undefined && aUV >= 0) {
417
+ gl.enableVertexAttribArray(aUV);
418
+ gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, stride, 8);
419
+ }
420
+ if (aColor !== undefined && aColor >= 0) {
421
+ gl.enableVertexAttribArray(aColor);
422
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
423
+ }
424
+ const uProj = prog.uniforms['projectionVector'];
425
+ if (uProj)
426
+ gl.uniform2f(uProj, w / 2, -h / 2);
427
+ const uSampler = prog.uniforms['uSampler'];
428
+ if (uSampler)
429
+ gl.uniform1i(uSampler, 0);
430
+ gl.bindTexture(gl.TEXTURE_2D, texture);
431
+ setUniforms(prog);
432
+ // Build a single quad covering [0,w] × [0,h] directly in a local buffer.
433
+ const f32 = new Float32Array(20);
434
+ const u32 = new Uint32Array(f32.buffer);
435
+ const packed = 0xffffffff; // white, full alpha (premultiplied)
436
+ // v0 (0,0)
437
+ f32[0] = 0;
438
+ f32[1] = 0;
439
+ f32[2] = 0;
440
+ f32[3] = 0;
441
+ u32[4] = packed;
442
+ // v1 (w,0)
443
+ f32[5] = w;
444
+ f32[6] = 0;
445
+ f32[7] = 1;
446
+ f32[8] = 0;
447
+ u32[9] = packed;
448
+ // v2 (w,h)
449
+ f32[10] = w;
450
+ f32[11] = h;
451
+ f32[12] = 1;
452
+ f32[13] = 1;
453
+ u32[14] = packed;
454
+ // v3 (0,h)
455
+ f32[15] = 0;
456
+ f32[16] = h;
457
+ f32[17] = 0;
458
+ f32[18] = 1;
459
+ u32[19] = packed;
460
+ gl.bufferData(gl.ARRAY_BUFFER, f32, gl.STREAM_DRAW);
461
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), gl.STATIC_DRAW);
462
+ gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
463
+ this._bindIndices = false;
464
+ }
465
+ clear() {
466
+ this.drawCmdManager.pushClearColor();
467
+ }
468
+ getPixels(x, y, width, height, pixels) {
469
+ this.gl.readPixels(x, y, width, height, this.gl.RGBA, this.gl.UNSIGNED_BYTE, pixels);
470
+ }
471
+ // ── Execute ───────────────────────────────────────────────────────────────
472
+ flush() {
473
+ this._flush();
474
+ }
475
+ // ── Private — flush & dispatch ────────────────────────────────────────────
476
+ _onContextRestored() {
477
+ const gl = this.gl;
478
+ // Re-apply baseline GL state.
479
+ gl.disable(gl.DEPTH_TEST);
480
+ gl.disable(gl.CULL_FACE);
481
+ gl.enable(gl.BLEND);
482
+ gl.colorMask(true, true, true, true);
483
+ gl.activeTexture(gl.TEXTURE0);
484
+ // Re-bind the vertex and index buffers (they are lost on context loss).
485
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
486
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
487
+ // Re-allocate the GPU vertex buffer after context loss.
488
+ gl.bufferData(gl.ARRAY_BUFFER, this._gpuVertexBufferSize, gl.DYNAMIC_DRAW);
489
+ // Clear the shader program cache — all programs are invalid after context loss.
490
+ WebGLProgram.clearCache();
491
+ // Reset internal state.
492
+ this._bindIndices = false;
493
+ this._batcher.reset();
494
+ this.drawCmdManager.clear();
495
+ this._vao.clear();
496
+ // The default empty texture is also lost.
497
+ this._defaultEmptyTexture = undefined;
498
+ // All blur FBO pool entries are invalid after context loss — discard them.
499
+ this._blurFboPool.clear();
500
+ // Invalidate all cached WebGL textures on BitmapData instances.
501
+ // After context loss every WebGLTexture handle is invalid; clearing the
502
+ // reference lets getWebGLTexture() lazily re-upload from the source.
503
+ for (const ref of this._trackedBitmapDatas) {
504
+ const bd = ref.deref();
505
+ if (bd) {
506
+ bd.webGLTexture = undefined;
507
+ }
508
+ else {
509
+ // BitmapData was garbage collected — remove the dead WeakRef.
510
+ this._trackedBitmapDatas.delete(ref);
511
+ }
512
+ }
513
+ // Restore projection.
514
+ this.onResize();
515
+ // Notify listeners (e.g. WebGLRenderer) so they can rebuild instructions
516
+ // and invalidate texture references.
517
+ for (const fn of this._contextRestoredCallbacks)
518
+ fn();
519
+ }
520
+ _flush() {
521
+ const gl = this.gl;
522
+ const cmds = this.drawCmdManager;
523
+ const vao = this._vao;
524
+ if (vao.getVerticesByteLength() === 0 && cmds.drawDataLen === 0)
525
+ return;
526
+ // Upload only the vertices written this frame.
527
+ // If the batch switched to multi-texture layout the GPU buffer may need
528
+ // to grow (multi stride is 24B vs 20B for single); re-allocate once.
529
+ const neededBytes = vao.getVerticesByteLength();
530
+ if (neededBytes > 0) {
531
+ if (neededBytes > this._gpuVertexBufferSize) {
532
+ // Grow: re-allocate at the new maximum capacity.
533
+ const newSize = WebGLVertexArrayObject.MAX_MULTI_VERTEX_BYTES;
534
+ gl.bufferData(gl.ARRAY_BUFFER, newSize, gl.DYNAMIC_DRAW);
535
+ this._gpuVertexBufferSize = newSize;
536
+ }
537
+ // Upload only the used portion — no GPU memory reallocation.
538
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Uint8Array(vao.getVerticesBuffer(), 0, neededBytes));
539
+ }
540
+ if (!this._bindIndices) {
541
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, vao.isMesh() ? vao.getMeshIndices() : vao.getIndices(), gl.STATIC_DRAW);
542
+ // Quad indices are static — cache after first upload.
543
+ // Mesh indices vary per frame — never cache.
544
+ if (!vao.isMesh()) {
545
+ this._bindIndices = true;
546
+ }
547
+ }
548
+ let indexOffset = 0;
549
+ let gpuDrawCalls = 0;
550
+ for (let i = 0; i < cmds.drawDataLen; i++) {
551
+ const cmd = cmds.drawData[i];
552
+ switch (cmd.type) {
553
+ case 7 /* DrawCmdType.ACT_BUFFER */:
554
+ this._activateBuffer(cmd.buffer, cmd.width, cmd.height);
555
+ break;
556
+ case 5 /* DrawCmdType.RESIZE_TARGET */:
557
+ cmd.buffer.rootRenderTarget?.resize(cmd.width, cmd.height);
558
+ break;
559
+ case 6 /* DrawCmdType.CLEAR_COLOR */:
560
+ gl.colorMask(true, true, true, true);
561
+ gl.clearColor(0, 0, 0, 0);
562
+ gl.clear(gl.COLOR_BUFFER_BIT);
563
+ break;
564
+ case 4 /* DrawCmdType.BLEND */:
565
+ this._applyBlend(cmd.value);
566
+ break;
567
+ case 8 /* DrawCmdType.ENABLE_SCISSOR */:
568
+ gl.enable(gl.SCISSOR_TEST);
569
+ gl.scissor(cmd.x, cmd.y, cmd.width, cmd.height);
570
+ break;
571
+ case 9 /* DrawCmdType.DISABLE_SCISSOR */:
572
+ gl.disable(gl.SCISSOR_TEST);
573
+ break;
574
+ case 2 /* DrawCmdType.PUSH_MASK */:
575
+ this._pushMaskDraw(indexOffset, cmd.count);
576
+ indexOffset += cmd.count;
577
+ break;
578
+ case 3 /* DrawCmdType.POP_MASK */:
579
+ this._popMaskDraw(indexOffset, cmd.count);
580
+ indexOffset += cmd.count;
581
+ break;
582
+ case 10 /* DrawCmdType.SMOOTHING */:
583
+ if (cmd.texture) {
584
+ gl.bindTexture(gl.TEXTURE_2D, cmd.texture);
585
+ const filter = cmd.smoothing ? gl.LINEAR : gl.NEAREST;
586
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
587
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
588
+ }
589
+ break;
590
+ case 0 /* DrawCmdType.TEXTURE */:
591
+ this._drawTextureBatch(cmd.texture, indexOffset, cmd.count, cmd.filter, cmd.textureWidth, cmd.textureHeight);
592
+ indexOffset += cmd.count;
593
+ gpuDrawCalls++;
594
+ break;
595
+ case 11 /* DrawCmdType.MULTI_TEXTURE */:
596
+ if (cmd.multiCmd) {
597
+ this._drawMultiTextureBatch(cmd.multiCmd, indexOffset, cmd.count);
598
+ indexOffset += cmd.count;
599
+ gpuDrawCalls++;
600
+ }
601
+ break;
602
+ case 1 /* DrawCmdType.RECT */:
603
+ this._drawRectBatch(indexOffset, cmd.count);
604
+ indexOffset += cmd.count;
605
+ gpuDrawCalls++;
606
+ break;
607
+ }
608
+ }
609
+ vao.clear();
610
+ cmds.clear();
611
+ this._batcher.reset();
612
+ this._bindIndices = false;
613
+ if (gpuDrawCalls > 0 && this._currentBuffer) {
614
+ this._currentBuffer.drawCalls += gpuDrawCalls;
615
+ }
616
+ }
617
+ // ── Private — blend & program ─────────────────────────────────────────────
618
+ _activateBuffer(buffer, width, height) {
619
+ const gl = this.gl;
620
+ buffer.rootRenderTarget?.activate();
621
+ if (!this._bindIndices) {
622
+ const vao = this._vao;
623
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, vao.isMesh() ? vao.getMeshIndices() : vao.getIndices(), gl.STATIC_DRAW);
624
+ }
625
+ buffer.restoreStencil();
626
+ buffer.restoreScissor();
627
+ this.onResize(width, height);
628
+ }
629
+ _applyBlend(value) {
630
+ const gl = this.gl;
631
+ switch (value) {
632
+ case 'source-over':
633
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
634
+ break;
635
+ case 'lighter':
636
+ gl.blendFunc(gl.ONE, gl.ONE);
637
+ break;
638
+ case 'destination-out':
639
+ gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_ALPHA);
640
+ break;
641
+ case 'destination-in':
642
+ gl.blendFunc(gl.ZERO, gl.SRC_ALPHA);
643
+ break;
644
+ default:
645
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
646
+ break;
647
+ }
648
+ }
649
+ // ── Private — draw batches ────────────────────────────────────────────────
650
+ _drawMultiTextureBatch(cmd, indexOffset, count) {
651
+ const gl = this.gl;
652
+ const prog = WebGLProgram.get(gl, ShaderLib.multi_vert, ShaderLib.multi_frag, 'multi');
653
+ gl.useProgram(prog.id);
654
+ const stride = 6 * 4; // MULTI_VERT_BYTE_SIZE
655
+ const aPos = prog.attributes['aVertexPosition'];
656
+ const aUV = prog.attributes['aTextureCoord'];
657
+ const aColor = prog.attributes['aColor'];
658
+ const aTid = prog.attributes['aTextureId'];
659
+ if (aPos !== undefined && aPos >= 0) {
660
+ gl.enableVertexAttribArray(aPos);
661
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
662
+ }
663
+ if (aUV !== undefined && aUV >= 0) {
664
+ gl.enableVertexAttribArray(aUV);
665
+ gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, stride, 8);
666
+ }
667
+ if (aColor !== undefined && aColor >= 0) {
668
+ gl.enableVertexAttribArray(aColor);
669
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
670
+ }
671
+ if (aTid !== undefined && aTid >= 0) {
672
+ gl.enableVertexAttribArray(aTid);
673
+ gl.vertexAttribPointer(aTid, 1, gl.FLOAT, false, stride, 20);
674
+ }
675
+ const uProj = prog.uniforms['projectionVector'];
676
+ if (uProj)
677
+ gl.uniform2f(uProj, this.projectionX, this.projectionY);
678
+ // Bind each texture to its unit and set the sampler uniform array.
679
+ const uSamplers = prog.uniforms['uSamplers[0]'];
680
+ const samplerIndices = new Int32Array(cmd.textureCount);
681
+ for (let i = 0; i < cmd.textureCount; i++) {
682
+ gl.activeTexture(gl.TEXTURE0 + i);
683
+ gl.bindTexture(gl.TEXTURE_2D, cmd.textures[i] ?? null);
684
+ samplerIndices[i] = i;
685
+ }
686
+ if (uSamplers)
687
+ gl.uniform1iv(uSamplers, samplerIndices);
688
+ // Restore active texture unit to 0 for subsequent single-texture draws.
689
+ gl.activeTexture(gl.TEXTURE0);
690
+ gl.drawElements(gl.TRIANGLES, count * 3, gl.UNSIGNED_SHORT, indexOffset * 6);
691
+ }
692
+ _getTextureProgram(filter) {
693
+ if (filter instanceof ColorMatrixFilter) {
694
+ return WebGLProgram.get(this.gl, ShaderLib.default_vert, ShaderLib.colorTransform_frag, 'colorTransform');
695
+ }
696
+ if (filter instanceof BlurFilter || filter instanceof GlowFilter || filter instanceof DropShadowFilter) {
697
+ return WebGLProgram.get(this.gl, ShaderLib.default_vert, ShaderLib.glow_frag, 'glow');
698
+ }
699
+ return WebGLProgram.get(this.gl, ShaderLib.default_vert, ShaderLib.texture_frag, 'texture');
700
+ }
701
+ _drawTextureBatch(texture, indexOffset, count, filter, texW, texH) {
702
+ const gl = this.gl;
703
+ const prog = this._getTextureProgram(filter);
704
+ gl.useProgram(prog.id);
705
+ // Vertex attributes: x,y (2f), uv (2f), color (4ub)
706
+ const stride = 5 * 4;
707
+ const aPos = prog.attributes['aVertexPosition'];
708
+ const aUV = prog.attributes['aTextureCoord'];
709
+ const aColor = prog.attributes['aColor'];
710
+ if (aPos !== undefined && aPos >= 0) {
711
+ gl.enableVertexAttribArray(aPos);
712
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
713
+ }
714
+ if (aUV !== undefined && aUV >= 0) {
715
+ gl.enableVertexAttribArray(aUV);
716
+ gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, stride, 8);
717
+ }
718
+ if (aColor !== undefined && aColor >= 0) {
719
+ gl.enableVertexAttribArray(aColor);
720
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
721
+ }
722
+ const uProj = prog.uniforms['projectionVector'];
723
+ if (uProj)
724
+ gl.uniform2f(uProj, this.projectionX, this.projectionY);
725
+ const uSampler = prog.uniforms['uSampler'];
726
+ if (uSampler)
727
+ gl.uniform1i(uSampler, 0);
728
+ gl.bindTexture(gl.TEXTURE_2D, texture);
729
+ // Apply filter uniforms
730
+ if (filter instanceof ColorMatrixFilter) {
731
+ const uMatrix = prog.uniforms['matrix'];
732
+ const uAdd = prog.uniforms['colorAdd'];
733
+ const fu = filter.uniforms;
734
+ if (uMatrix)
735
+ gl.uniformMatrix4fv(uMatrix, false, new Float32Array(fu.matrix));
736
+ if (uAdd)
737
+ gl.uniform4f(uAdd, fu.colorAdd.x, fu.colorAdd.y, fu.colorAdd.z, fu.colorAdd.w);
738
+ }
739
+ else if (filter instanceof BlurFilter) {
740
+ const uBlur = prog.uniforms['blur'];
741
+ const uSize = prog.uniforms['uTextureSize'];
742
+ if (uBlur)
743
+ gl.uniform2f(uBlur, filter.blurX, filter.blurY);
744
+ if (uSize)
745
+ gl.uniform2f(uSize, texW, texH);
746
+ }
747
+ else if (filter instanceof GlowFilter || filter instanceof DropShadowFilter) {
748
+ const uSize = prog.uniforms['uTextureSize'];
749
+ if (uSize)
750
+ gl.uniform2f(uSize, texW, texH);
751
+ const uColor = prog.uniforms['color'];
752
+ const c = filter.color;
753
+ if (uColor)
754
+ gl.uniform4f(uColor, ((c >> 16) & 0xff) / 255, ((c >> 8) & 0xff) / 255, (c & 0xff) / 255, 1);
755
+ const uAlpha = prog.uniforms['alpha'];
756
+ if (uAlpha)
757
+ gl.uniform1f(uAlpha, filter.alpha);
758
+ const uStrength = prog.uniforms['strength'];
759
+ if (uStrength)
760
+ gl.uniform1f(uStrength, filter.strength);
761
+ const uBlurX = prog.uniforms['blurX'];
762
+ if (uBlurX)
763
+ gl.uniform1f(uBlurX, filter.blurX);
764
+ const uBlurY = prog.uniforms['blurY'];
765
+ if (uBlurY)
766
+ gl.uniform1f(uBlurY, filter.blurY);
767
+ if (filter instanceof DropShadowFilter) {
768
+ const uDist = prog.uniforms['dist'];
769
+ if (uDist)
770
+ gl.uniform1f(uDist, filter.distance);
771
+ const uAngle = prog.uniforms['angle'];
772
+ if (uAngle)
773
+ gl.uniform1f(uAngle, -(filter.angle / 180) * Math.PI);
774
+ const uHide = prog.uniforms['hideObject'];
775
+ if (uHide)
776
+ gl.uniform1f(uHide, filter.hideObject ? 1 : 0);
777
+ }
778
+ else {
779
+ // GlowFilter: zero out DropShadow-specific uniforms so stale
780
+ // values from a previous DropShadowFilter draw don't leak in.
781
+ const uDist = prog.uniforms['dist'];
782
+ if (uDist)
783
+ gl.uniform1f(uDist, 0);
784
+ const uAngle = prog.uniforms['angle'];
785
+ if (uAngle)
786
+ gl.uniform1f(uAngle, 0);
787
+ const uHide = prog.uniforms['hideObject'];
788
+ if (uHide)
789
+ gl.uniform1f(uHide, 0);
790
+ }
791
+ const uInner = prog.uniforms['inner'];
792
+ if (uInner)
793
+ gl.uniform1f(uInner, filter instanceof GlowFilter && filter.inner ? 1 : 0);
794
+ const uKnockout = prog.uniforms['knockout'];
795
+ if (uKnockout)
796
+ gl.uniform1f(uKnockout, filter instanceof GlowFilter && filter.knockout ? 1 : 0);
797
+ }
798
+ gl.drawElements(gl.TRIANGLES, count * 3, gl.UNSIGNED_SHORT, indexOffset * 6);
799
+ }
800
+ _drawRectBatch(indexOffset, count) {
801
+ const gl = this.gl;
802
+ const prog = WebGLProgram.get(gl, ShaderLib.default_vert, ShaderLib.primitive_frag, 'primitive');
803
+ gl.useProgram(prog.id);
804
+ const stride = 5 * 4;
805
+ const aPos = prog.attributes['aVertexPosition'];
806
+ const aColor = prog.attributes['aColor'];
807
+ if (aPos !== undefined && aPos >= 0) {
808
+ gl.enableVertexAttribArray(aPos);
809
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
810
+ }
811
+ if (aColor !== undefined && aColor >= 0) {
812
+ gl.enableVertexAttribArray(aColor);
813
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
814
+ }
815
+ const uProj = prog.uniforms['projectionVector'];
816
+ if (uProj)
817
+ gl.uniform2f(uProj, this.projectionX, this.projectionY);
818
+ gl.drawElements(gl.TRIANGLES, count * 3, gl.UNSIGNED_SHORT, indexOffset * 6);
819
+ }
820
+ // ── Private — stencil mask ────────────────────────────────────────────────
821
+ _pushMaskDraw(indexOffset, count) {
822
+ const gl = this.gl;
823
+ const buf = this._currentBuffer;
824
+ buf.enableStencil();
825
+ gl.colorMask(false, false, false, false);
826
+ gl.stencilFunc(gl.ALWAYS, 1, 0xff);
827
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
828
+ this._drawRectBatch(indexOffset, count);
829
+ gl.colorMask(true, true, true, true);
830
+ gl.stencilFunc(gl.EQUAL, buf.stencilHandleCount + 1, 0xff);
831
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
832
+ buf.stencilHandleCount++;
833
+ }
834
+ _popMaskDraw(indexOffset, count) {
835
+ const gl = this.gl;
836
+ const buf = this._currentBuffer;
837
+ gl.colorMask(false, false, false, false);
838
+ gl.stencilFunc(gl.ALWAYS, 1, 0xff);
839
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR);
840
+ this._drawRectBatch(indexOffset, count);
841
+ gl.colorMask(true, true, true, true);
842
+ buf.stencilHandleCount--;
843
+ if (buf.stencilHandleCount === 0) {
844
+ buf.disableStencil();
845
+ }
846
+ else {
847
+ gl.stencilFunc(gl.EQUAL, buf.stencilHandleCount, 0xff);
848
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
849
+ }
850
+ }
851
+ }
852
+ //# sourceMappingURL=WebGLRenderContext.js.map