@blakron/core 0.2.4 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +169 -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 +188 -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 +859 -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,859 @@
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
+ }
301
+ const w = target.width;
302
+ const h = target.height;
303
+ // Step 1 — flush pending commands (leaf draws into the offscreen FBO).
304
+ this.flush();
305
+ // Step 2 — multi-pass blur (operates entirely via direct GL calls on
306
+ // temporary FBOs; does NOT touch the batched command queue).
307
+ for (const filter of filters) {
308
+ if (filter instanceof BlurFilter && (filter.blurX > 0 || filter.blurY > 0)) {
309
+ this._drawBlurPingPong(target.texture, w, h, filter, offscreen);
310
+ }
311
+ }
312
+ // Step 3 — ensure the parent buffer's FBO is the active GL framebuffer.
313
+ if (this._currentBuffer) {
314
+ this._currentBuffer.rootRenderTarget.activate();
315
+ this.onResize(this._currentBuffer.width, this._currentBuffer.height);
316
+ }
317
+ // Step 4 — queue a batched drawTexture so the parent buffer's
318
+ // globalMatrix positions the quad correctly.
319
+ const nonBlurFilter = filters.find(f => !(f instanceof BlurFilter));
320
+ this.activeFilter = nonBlurFilter;
321
+ this.drawTexture(target.texture, 0, 0, w, h, 0, 0, w, h, w, h);
322
+ this.activeFilter = undefined;
323
+ // Step 5 — flush immediately.
324
+ this.flush();
325
+ }
326
+ /**
327
+ * Two-pass separable Gaussian blur.
328
+ * Horizontal pass renders into a temporary FBO; vertical pass writes the
329
+ * blurred result back into the offscreen buffer's FBO so that the caller
330
+ * (compositeFilterResult) can composite it onto the parent buffer.
331
+ *
332
+ * Optimisations vs. the naive approach:
333
+ * - FBO pool: temporary textures/framebuffers are reused across frames
334
+ * (keyed by size) to avoid the expensive create/delete cycle on mobile.
335
+ * - Dynamic shader tier: the loop bound in the GLSL is a compile-time
336
+ * constant chosen from {4, 8, 16, 32} so the GPU can unroll/optimise it,
337
+ * while still supporting blur radii up to 32 px.
338
+ *
339
+ * NOTE: This method does NOT restore the parent buffer's FBO — the caller
340
+ * is responsible for activating the correct destination FBO before the
341
+ * final composite draw.
342
+ */
343
+ _drawBlurPingPong(texture, w, h, filter, buffer) {
344
+ const gl = this.gl;
345
+ // ── Acquire a temporary FBO from the pool (or create a new one) ───────
346
+ const poolKey = `${w}x${h}`;
347
+ let pool = this._blurFboPool.get(poolKey);
348
+ if (!pool) {
349
+ pool = [];
350
+ this._blurFboPool.set(poolKey, pool);
351
+ }
352
+ let tmpEntry = pool.pop();
353
+ if (!tmpEntry) {
354
+ const tmpTex = gl.createTexture();
355
+ gl.bindTexture(gl.TEXTURE_2D, tmpTex);
356
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
357
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
358
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
359
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
360
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
361
+ const tmpFbo = gl.createFramebuffer();
362
+ gl.bindFramebuffer(gl.FRAMEBUFFER, tmpFbo);
363
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tmpTex, 0);
364
+ tmpEntry = { texture: tmpTex, fbo: tmpFbo };
365
+ }
366
+ // Clear the temporary FBO before use.
367
+ gl.bindFramebuffer(gl.FRAMEBUFFER, tmpEntry.fbo);
368
+ gl.viewport(0, 0, w, h);
369
+ gl.clearColor(0, 0, 0, 0);
370
+ gl.clear(gl.COLOR_BUFFER_BIT);
371
+ // ── Select shader tier based on actual blur radius ────────────────────
372
+ const hTier = getBlurTier(filter.blurX);
373
+ const vTier = getBlurTier(filter.blurY);
374
+ const hKey = `blur_h_${hTier}`;
375
+ const vKey = `blur_v_${vTier}`;
376
+ // ── Pass 1: horizontal blur → tmpFbo ──────────────────────────────────
377
+ const hProg = WebGLProgram.get(gl, ShaderLib.default_vert, makeBlurHFrag(hTier), hKey);
378
+ this._drawFullscreenQuad(hProg, texture, w, h, prog => {
379
+ const uBlurX = prog.uniforms['blurX'];
380
+ const uSize = prog.uniforms['uTextureSize'];
381
+ if (uBlurX)
382
+ gl.uniform1f(uBlurX, filter.blurX);
383
+ if (uSize)
384
+ gl.uniform2f(uSize, w, h);
385
+ });
386
+ // ── Pass 2: vertical blur → offscreen FBO ────────────────────────────
387
+ buffer.rootRenderTarget.activate();
388
+ this.onResize(w, h);
389
+ const vProg = WebGLProgram.get(gl, ShaderLib.default_vert, makeBlurVFrag(vTier), vKey);
390
+ this._drawFullscreenQuad(vProg, tmpEntry.texture, w, h, prog => {
391
+ const uBlurY = prog.uniforms['blurY'];
392
+ const uSize = prog.uniforms['uTextureSize'];
393
+ if (uBlurY)
394
+ gl.uniform1f(uBlurY, filter.blurY);
395
+ if (uSize)
396
+ gl.uniform2f(uSize, w, h);
397
+ });
398
+ // ── Return the temporary FBO to the pool ──────────────────────────────
399
+ pool.push(tmpEntry);
400
+ }
401
+ /**
402
+ * Draws a single full-screen quad using the given program and texture.
403
+ * `setUniforms` is called after `useProgram` to let the caller set
404
+ * filter-specific uniforms.
405
+ */
406
+ _drawFullscreenQuad(prog, texture, w, h, setUniforms) {
407
+ const gl = this.gl;
408
+ gl.useProgram(prog.id);
409
+ const stride = 5 * 4;
410
+ const aPos = prog.attributes['aVertexPosition'];
411
+ const aUV = prog.attributes['aTextureCoord'];
412
+ const aColor = prog.attributes['aColor'];
413
+ if (aPos !== undefined && aPos >= 0) {
414
+ gl.enableVertexAttribArray(aPos);
415
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
416
+ }
417
+ if (aUV !== undefined && aUV >= 0) {
418
+ gl.enableVertexAttribArray(aUV);
419
+ gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, stride, 8);
420
+ }
421
+ if (aColor !== undefined && aColor >= 0) {
422
+ gl.enableVertexAttribArray(aColor);
423
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
424
+ }
425
+ const uProj = prog.uniforms['projectionVector'];
426
+ if (uProj)
427
+ gl.uniform2f(uProj, w / 2, -h / 2);
428
+ const uSampler = prog.uniforms['uSampler'];
429
+ if (uSampler)
430
+ gl.uniform1i(uSampler, 0);
431
+ gl.bindTexture(gl.TEXTURE_2D, texture);
432
+ setUniforms(prog);
433
+ // Build a single quad covering [0,w] × [0,h] directly in a local buffer.
434
+ const f32 = new Float32Array(20);
435
+ const u32 = new Uint32Array(f32.buffer);
436
+ const packed = 0xffffffff; // white, full alpha (premultiplied)
437
+ // v0 (0,0)
438
+ f32[0] = 0;
439
+ f32[1] = 0;
440
+ f32[2] = 0;
441
+ f32[3] = 0;
442
+ u32[4] = packed;
443
+ // v1 (w,0)
444
+ f32[5] = w;
445
+ f32[6] = 0;
446
+ f32[7] = 1;
447
+ f32[8] = 0;
448
+ u32[9] = packed;
449
+ // v2 (w,h)
450
+ f32[10] = w;
451
+ f32[11] = h;
452
+ f32[12] = 1;
453
+ f32[13] = 1;
454
+ u32[14] = packed;
455
+ // v3 (0,h)
456
+ f32[15] = 0;
457
+ f32[16] = h;
458
+ f32[17] = 0;
459
+ f32[18] = 1;
460
+ u32[19] = packed;
461
+ gl.bufferData(gl.ARRAY_BUFFER, f32, gl.STREAM_DRAW);
462
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), gl.STATIC_DRAW);
463
+ gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
464
+ // Restore the GPU vertex buffer to its pre-allocated size so that the
465
+ // next _flush() call can safely use bufferSubData without overflowing.
466
+ // _drawFullscreenQuad replaces the buffer with a tiny 80-byte quad;
467
+ // without this restore, bufferSubData would write past the end of the
468
+ // GPU allocation and trigger INVALID_VALUE / buffer overflow errors.
469
+ gl.bufferData(gl.ARRAY_BUFFER, this._gpuVertexBufferSize, gl.DYNAMIC_DRAW);
470
+ this._bindIndices = false;
471
+ }
472
+ clear() {
473
+ this.drawCmdManager.pushClearColor();
474
+ }
475
+ getPixels(x, y, width, height, pixels) {
476
+ this.gl.readPixels(x, y, width, height, this.gl.RGBA, this.gl.UNSIGNED_BYTE, pixels);
477
+ }
478
+ // ── Execute ───────────────────────────────────────────────────────────────
479
+ flush() {
480
+ this._flush();
481
+ }
482
+ // ── Private — flush & dispatch ────────────────────────────────────────────
483
+ _onContextRestored() {
484
+ const gl = this.gl;
485
+ // Re-apply baseline GL state.
486
+ gl.disable(gl.DEPTH_TEST);
487
+ gl.disable(gl.CULL_FACE);
488
+ gl.enable(gl.BLEND);
489
+ gl.colorMask(true, true, true, true);
490
+ gl.activeTexture(gl.TEXTURE0);
491
+ // Re-bind the vertex and index buffers (they are lost on context loss).
492
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
493
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
494
+ // Re-allocate the GPU vertex buffer after context loss.
495
+ gl.bufferData(gl.ARRAY_BUFFER, this._gpuVertexBufferSize, gl.DYNAMIC_DRAW);
496
+ // Clear the shader program cache — all programs are invalid after context loss.
497
+ WebGLProgram.clearCache();
498
+ // Reset internal state.
499
+ this._bindIndices = false;
500
+ this._batcher.reset();
501
+ this.drawCmdManager.clear();
502
+ this._vao.clear();
503
+ // The default empty texture is also lost.
504
+ this._defaultEmptyTexture = undefined;
505
+ // All blur FBO pool entries are invalid after context loss — discard them.
506
+ this._blurFboPool.clear();
507
+ // Invalidate all cached WebGL textures on BitmapData instances.
508
+ // After context loss every WebGLTexture handle is invalid; clearing the
509
+ // reference lets getWebGLTexture() lazily re-upload from the source.
510
+ for (const ref of this._trackedBitmapDatas) {
511
+ const bd = ref.deref();
512
+ if (bd) {
513
+ bd.webGLTexture = undefined;
514
+ }
515
+ else {
516
+ // BitmapData was garbage collected — remove the dead WeakRef.
517
+ this._trackedBitmapDatas.delete(ref);
518
+ }
519
+ }
520
+ // Restore projection.
521
+ this.onResize();
522
+ // Notify listeners (e.g. WebGLRenderer) so they can rebuild instructions
523
+ // and invalidate texture references.
524
+ for (const fn of this._contextRestoredCallbacks)
525
+ fn();
526
+ }
527
+ _flush() {
528
+ const gl = this.gl;
529
+ const cmds = this.drawCmdManager;
530
+ const vao = this._vao;
531
+ if (vao.getVerticesByteLength() === 0 && cmds.drawDataLen === 0)
532
+ return;
533
+ // Upload only the vertices written this frame.
534
+ // If the batch switched to multi-texture layout the GPU buffer may need
535
+ // to grow (multi stride is 24B vs 20B for single); re-allocate once.
536
+ const neededBytes = vao.getVerticesByteLength();
537
+ if (neededBytes > 0) {
538
+ if (neededBytes > this._gpuVertexBufferSize) {
539
+ // Grow: re-allocate at the new maximum capacity.
540
+ const newSize = WebGLVertexArrayObject.MAX_MULTI_VERTEX_BYTES;
541
+ gl.bufferData(gl.ARRAY_BUFFER, newSize, gl.DYNAMIC_DRAW);
542
+ this._gpuVertexBufferSize = newSize;
543
+ }
544
+ // Upload only the used portion — no GPU memory reallocation.
545
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Uint8Array(vao.getVerticesBuffer(), 0, neededBytes));
546
+ }
547
+ if (!this._bindIndices) {
548
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, vao.isMesh() ? vao.getMeshIndices() : vao.getIndices(), gl.STATIC_DRAW);
549
+ // Quad indices are static — cache after first upload.
550
+ // Mesh indices vary per frame — never cache.
551
+ if (!vao.isMesh()) {
552
+ this._bindIndices = true;
553
+ }
554
+ }
555
+ let indexOffset = 0;
556
+ let gpuDrawCalls = 0;
557
+ for (let i = 0; i < cmds.drawDataLen; i++) {
558
+ const cmd = cmds.drawData[i];
559
+ switch (cmd.type) {
560
+ case 7 /* DrawCmdType.ACT_BUFFER */:
561
+ this._activateBuffer(cmd.buffer, cmd.width, cmd.height);
562
+ break;
563
+ case 5 /* DrawCmdType.RESIZE_TARGET */:
564
+ cmd.buffer.rootRenderTarget?.resize(cmd.width, cmd.height);
565
+ break;
566
+ case 6 /* DrawCmdType.CLEAR_COLOR */:
567
+ gl.colorMask(true, true, true, true);
568
+ gl.clearColor(0, 0, 0, 0);
569
+ gl.clear(gl.COLOR_BUFFER_BIT);
570
+ break;
571
+ case 4 /* DrawCmdType.BLEND */:
572
+ this._applyBlend(cmd.value);
573
+ break;
574
+ case 8 /* DrawCmdType.ENABLE_SCISSOR */:
575
+ gl.enable(gl.SCISSOR_TEST);
576
+ gl.scissor(cmd.x, cmd.y, cmd.width, cmd.height);
577
+ break;
578
+ case 9 /* DrawCmdType.DISABLE_SCISSOR */:
579
+ gl.disable(gl.SCISSOR_TEST);
580
+ break;
581
+ case 2 /* DrawCmdType.PUSH_MASK */:
582
+ this._pushMaskDraw(indexOffset, cmd.count);
583
+ indexOffset += cmd.count;
584
+ break;
585
+ case 3 /* DrawCmdType.POP_MASK */:
586
+ this._popMaskDraw(indexOffset, cmd.count);
587
+ indexOffset += cmd.count;
588
+ break;
589
+ case 10 /* DrawCmdType.SMOOTHING */:
590
+ if (cmd.texture) {
591
+ gl.bindTexture(gl.TEXTURE_2D, cmd.texture);
592
+ const filter = cmd.smoothing ? gl.LINEAR : gl.NEAREST;
593
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
594
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
595
+ }
596
+ break;
597
+ case 0 /* DrawCmdType.TEXTURE */:
598
+ this._drawTextureBatch(cmd.texture, indexOffset, cmd.count, cmd.filter, cmd.textureWidth, cmd.textureHeight);
599
+ indexOffset += cmd.count;
600
+ gpuDrawCalls++;
601
+ break;
602
+ case 11 /* DrawCmdType.MULTI_TEXTURE */:
603
+ if (cmd.multiCmd) {
604
+ this._drawMultiTextureBatch(cmd.multiCmd, indexOffset, cmd.count);
605
+ indexOffset += cmd.count;
606
+ gpuDrawCalls++;
607
+ }
608
+ break;
609
+ case 1 /* DrawCmdType.RECT */:
610
+ this._drawRectBatch(indexOffset, cmd.count);
611
+ indexOffset += cmd.count;
612
+ gpuDrawCalls++;
613
+ break;
614
+ }
615
+ }
616
+ vao.clear();
617
+ cmds.clear();
618
+ this._batcher.reset();
619
+ this._bindIndices = false;
620
+ if (gpuDrawCalls > 0 && this._currentBuffer) {
621
+ this._currentBuffer.drawCalls += gpuDrawCalls;
622
+ }
623
+ }
624
+ // ── Private — blend & program ─────────────────────────────────────────────
625
+ _activateBuffer(buffer, width, height) {
626
+ const gl = this.gl;
627
+ buffer.rootRenderTarget?.activate();
628
+ if (!this._bindIndices) {
629
+ const vao = this._vao;
630
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, vao.isMesh() ? vao.getMeshIndices() : vao.getIndices(), gl.STATIC_DRAW);
631
+ }
632
+ buffer.restoreStencil();
633
+ buffer.restoreScissor();
634
+ this.onResize(width, height);
635
+ }
636
+ _applyBlend(value) {
637
+ const gl = this.gl;
638
+ switch (value) {
639
+ case 'source-over':
640
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
641
+ break;
642
+ case 'lighter':
643
+ gl.blendFunc(gl.ONE, gl.ONE);
644
+ break;
645
+ case 'destination-out':
646
+ gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_ALPHA);
647
+ break;
648
+ case 'destination-in':
649
+ gl.blendFunc(gl.ZERO, gl.SRC_ALPHA);
650
+ break;
651
+ default:
652
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
653
+ break;
654
+ }
655
+ }
656
+ // ── Private — draw batches ────────────────────────────────────────────────
657
+ _drawMultiTextureBatch(cmd, indexOffset, count) {
658
+ const gl = this.gl;
659
+ const prog = WebGLProgram.get(gl, ShaderLib.multi_vert, ShaderLib.multi_frag, 'multi');
660
+ gl.useProgram(prog.id);
661
+ const stride = 6 * 4; // MULTI_VERT_BYTE_SIZE
662
+ const aPos = prog.attributes['aVertexPosition'];
663
+ const aUV = prog.attributes['aTextureCoord'];
664
+ const aColor = prog.attributes['aColor'];
665
+ const aTid = prog.attributes['aTextureId'];
666
+ if (aPos !== undefined && aPos >= 0) {
667
+ gl.enableVertexAttribArray(aPos);
668
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
669
+ }
670
+ if (aUV !== undefined && aUV >= 0) {
671
+ gl.enableVertexAttribArray(aUV);
672
+ gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, stride, 8);
673
+ }
674
+ if (aColor !== undefined && aColor >= 0) {
675
+ gl.enableVertexAttribArray(aColor);
676
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
677
+ }
678
+ if (aTid !== undefined && aTid >= 0) {
679
+ gl.enableVertexAttribArray(aTid);
680
+ gl.vertexAttribPointer(aTid, 1, gl.FLOAT, false, stride, 20);
681
+ }
682
+ const uProj = prog.uniforms['projectionVector'];
683
+ if (uProj)
684
+ gl.uniform2f(uProj, this.projectionX, this.projectionY);
685
+ // Bind each texture to its unit and set the sampler uniform array.
686
+ const uSamplers = prog.uniforms['uSamplers[0]'];
687
+ const samplerIndices = new Int32Array(cmd.textureCount);
688
+ for (let i = 0; i < cmd.textureCount; i++) {
689
+ gl.activeTexture(gl.TEXTURE0 + i);
690
+ gl.bindTexture(gl.TEXTURE_2D, cmd.textures[i] ?? null);
691
+ samplerIndices[i] = i;
692
+ }
693
+ if (uSamplers)
694
+ gl.uniform1iv(uSamplers, samplerIndices);
695
+ // Restore active texture unit to 0 for subsequent single-texture draws.
696
+ gl.activeTexture(gl.TEXTURE0);
697
+ gl.drawElements(gl.TRIANGLES, count * 3, gl.UNSIGNED_SHORT, indexOffset * 6);
698
+ }
699
+ _getTextureProgram(filter) {
700
+ if (filter instanceof ColorMatrixFilter) {
701
+ return WebGLProgram.get(this.gl, ShaderLib.default_vert, ShaderLib.colorTransform_frag, 'colorTransform');
702
+ }
703
+ if (filter instanceof BlurFilter || filter instanceof GlowFilter || filter instanceof DropShadowFilter) {
704
+ return WebGLProgram.get(this.gl, ShaderLib.default_vert, ShaderLib.glow_frag, 'glow');
705
+ }
706
+ return WebGLProgram.get(this.gl, ShaderLib.default_vert, ShaderLib.texture_frag, 'texture');
707
+ }
708
+ _drawTextureBatch(texture, indexOffset, count, filter, texW, texH) {
709
+ const gl = this.gl;
710
+ const prog = this._getTextureProgram(filter);
711
+ gl.useProgram(prog.id);
712
+ // Vertex attributes: x,y (2f), uv (2f), color (4ub)
713
+ const stride = 5 * 4;
714
+ const aPos = prog.attributes['aVertexPosition'];
715
+ const aUV = prog.attributes['aTextureCoord'];
716
+ const aColor = prog.attributes['aColor'];
717
+ if (aPos !== undefined && aPos >= 0) {
718
+ gl.enableVertexAttribArray(aPos);
719
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
720
+ }
721
+ if (aUV !== undefined && aUV >= 0) {
722
+ gl.enableVertexAttribArray(aUV);
723
+ gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, stride, 8);
724
+ }
725
+ if (aColor !== undefined && aColor >= 0) {
726
+ gl.enableVertexAttribArray(aColor);
727
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
728
+ }
729
+ const uProj = prog.uniforms['projectionVector'];
730
+ if (uProj)
731
+ gl.uniform2f(uProj, this.projectionX, this.projectionY);
732
+ const uSampler = prog.uniforms['uSampler'];
733
+ if (uSampler)
734
+ gl.uniform1i(uSampler, 0);
735
+ gl.bindTexture(gl.TEXTURE_2D, texture);
736
+ // Apply filter uniforms
737
+ if (filter instanceof ColorMatrixFilter) {
738
+ const uMatrix = prog.uniforms['matrix'];
739
+ const uAdd = prog.uniforms['colorAdd'];
740
+ const fu = filter.uniforms;
741
+ if (uMatrix)
742
+ gl.uniformMatrix4fv(uMatrix, false, new Float32Array(fu.matrix));
743
+ if (uAdd)
744
+ gl.uniform4f(uAdd, fu.colorAdd.x, fu.colorAdd.y, fu.colorAdd.z, fu.colorAdd.w);
745
+ }
746
+ else if (filter instanceof BlurFilter) {
747
+ const uBlur = prog.uniforms['blur'];
748
+ const uSize = prog.uniforms['uTextureSize'];
749
+ if (uBlur)
750
+ gl.uniform2f(uBlur, filter.blurX, filter.blurY);
751
+ if (uSize)
752
+ gl.uniform2f(uSize, texW, texH);
753
+ }
754
+ else if (filter instanceof GlowFilter || filter instanceof DropShadowFilter) {
755
+ const uSize = prog.uniforms['uTextureSize'];
756
+ if (uSize)
757
+ gl.uniform2f(uSize, texW, texH);
758
+ const uColor = prog.uniforms['color'];
759
+ const c = filter.color;
760
+ if (uColor)
761
+ gl.uniform4f(uColor, ((c >> 16) & 0xff) / 255, ((c >> 8) & 0xff) / 255, (c & 0xff) / 255, 1);
762
+ const uAlpha = prog.uniforms['alpha'];
763
+ if (uAlpha)
764
+ gl.uniform1f(uAlpha, filter.alpha);
765
+ const uStrength = prog.uniforms['strength'];
766
+ if (uStrength)
767
+ gl.uniform1f(uStrength, filter.strength);
768
+ const uBlurX = prog.uniforms['blurX'];
769
+ if (uBlurX)
770
+ gl.uniform1f(uBlurX, filter.blurX);
771
+ const uBlurY = prog.uniforms['blurY'];
772
+ if (uBlurY)
773
+ gl.uniform1f(uBlurY, filter.blurY);
774
+ if (filter instanceof DropShadowFilter) {
775
+ const uDist = prog.uniforms['dist'];
776
+ if (uDist)
777
+ gl.uniform1f(uDist, filter.distance);
778
+ const uAngle = prog.uniforms['angle'];
779
+ if (uAngle)
780
+ gl.uniform1f(uAngle, -(filter.angle / 180) * Math.PI);
781
+ const uHide = prog.uniforms['hideObject'];
782
+ if (uHide)
783
+ gl.uniform1f(uHide, filter.hideObject ? 1 : 0);
784
+ }
785
+ else {
786
+ // GlowFilter: zero out DropShadow-specific uniforms so stale
787
+ // values from a previous DropShadowFilter draw don't leak in.
788
+ const uDist = prog.uniforms['dist'];
789
+ if (uDist)
790
+ gl.uniform1f(uDist, 0);
791
+ const uAngle = prog.uniforms['angle'];
792
+ if (uAngle)
793
+ gl.uniform1f(uAngle, 0);
794
+ const uHide = prog.uniforms['hideObject'];
795
+ if (uHide)
796
+ gl.uniform1f(uHide, 0);
797
+ }
798
+ const uInner = prog.uniforms['inner'];
799
+ if (uInner)
800
+ gl.uniform1f(uInner, filter instanceof GlowFilter && filter.inner ? 1 : 0);
801
+ const uKnockout = prog.uniforms['knockout'];
802
+ if (uKnockout)
803
+ gl.uniform1f(uKnockout, filter instanceof GlowFilter && filter.knockout ? 1 : 0);
804
+ }
805
+ gl.drawElements(gl.TRIANGLES, count * 3, gl.UNSIGNED_SHORT, indexOffset * 6);
806
+ }
807
+ _drawRectBatch(indexOffset, count) {
808
+ const gl = this.gl;
809
+ const prog = WebGLProgram.get(gl, ShaderLib.default_vert, ShaderLib.primitive_frag, 'primitive');
810
+ gl.useProgram(prog.id);
811
+ const stride = 5 * 4;
812
+ const aPos = prog.attributes['aVertexPosition'];
813
+ const aColor = prog.attributes['aColor'];
814
+ if (aPos !== undefined && aPos >= 0) {
815
+ gl.enableVertexAttribArray(aPos);
816
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, stride, 0);
817
+ }
818
+ if (aColor !== undefined && aColor >= 0) {
819
+ gl.enableVertexAttribArray(aColor);
820
+ gl.vertexAttribPointer(aColor, 4, gl.UNSIGNED_BYTE, true, stride, 16);
821
+ }
822
+ const uProj = prog.uniforms['projectionVector'];
823
+ if (uProj)
824
+ gl.uniform2f(uProj, this.projectionX, this.projectionY);
825
+ gl.drawElements(gl.TRIANGLES, count * 3, gl.UNSIGNED_SHORT, indexOffset * 6);
826
+ }
827
+ // ── Private — stencil mask ────────────────────────────────────────────────
828
+ _pushMaskDraw(indexOffset, count) {
829
+ const gl = this.gl;
830
+ const buf = this._currentBuffer;
831
+ buf.enableStencil();
832
+ gl.colorMask(false, false, false, false);
833
+ gl.stencilFunc(gl.ALWAYS, 1, 0xff);
834
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
835
+ this._drawRectBatch(indexOffset, count);
836
+ gl.colorMask(true, true, true, true);
837
+ gl.stencilFunc(gl.EQUAL, buf.stencilHandleCount + 1, 0xff);
838
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
839
+ buf.stencilHandleCount++;
840
+ }
841
+ _popMaskDraw(indexOffset, count) {
842
+ const gl = this.gl;
843
+ const buf = this._currentBuffer;
844
+ gl.colorMask(false, false, false, false);
845
+ gl.stencilFunc(gl.ALWAYS, 1, 0xff);
846
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR);
847
+ this._drawRectBatch(indexOffset, count);
848
+ gl.colorMask(true, true, true, true);
849
+ buf.stencilHandleCount--;
850
+ if (buf.stencilHandleCount === 0) {
851
+ buf.disableStencil();
852
+ }
853
+ else {
854
+ gl.stencilFunc(gl.EQUAL, buf.stencilHandleCount, 0xff);
855
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
856
+ }
857
+ }
858
+ }
859
+ //# sourceMappingURL=WebGLRenderContext.js.map