@next2d/webgpu 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +574 -0
  3. package/package.json +30 -0
  4. package/src/AtlasManager.d.ts +23 -0
  5. package/src/AtlasManager.js +123 -0
  6. package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.d.ts +13 -0
  7. package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.js +24 -0
  8. package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.d.ts +15 -0
  9. package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.js +31 -0
  10. package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.d.ts +5 -0
  11. package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.js +42 -0
  12. package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.d.ts +16 -0
  13. package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.js +28 -0
  14. package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.d.ts +17 -0
  15. package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.js +33 -0
  16. package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.d.ts +16 -0
  17. package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.js +28 -0
  18. package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.d.ts +17 -0
  19. package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.js +27 -0
  20. package/src/AttachmentManager/service/AttachmentManagerGetTextureService.d.ts +18 -0
  21. package/src/AttachmentManager/service/AttachmentManagerGetTextureService.js +27 -0
  22. package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.d.ts +12 -0
  23. package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.js +17 -0
  24. package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.d.ts +26 -0
  25. package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.js +43 -0
  26. package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.d.ts +18 -0
  27. package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.js +33 -0
  28. package/src/AttachmentManager.d.ts +19 -0
  29. package/src/AttachmentManager.js +105 -0
  30. package/src/BezierConverter/BezierConverter.d.ts +16 -0
  31. package/src/BezierConverter/BezierConverter.js +15 -0
  32. package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.d.ts +15 -0
  33. package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.js +37 -0
  34. package/src/BezierConverter/service/BezierConverterSplitCubicService.d.ts +15 -0
  35. package/src/BezierConverter/service/BezierConverterSplitCubicService.js +47 -0
  36. package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.d.ts +29 -0
  37. package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.js +80 -0
  38. package/src/Blend/BlendInstancedManager.d.ts +35 -0
  39. package/src/Blend/BlendInstancedManager.js +147 -0
  40. package/src/Blend/service/BlendAddService.d.ts +1 -0
  41. package/src/Blend/service/BlendAddService.js +8 -0
  42. package/src/Blend/service/BlendAlphaService.d.ts +1 -0
  43. package/src/Blend/service/BlendAlphaService.js +8 -0
  44. package/src/Blend/service/BlendEraseService.d.ts +1 -0
  45. package/src/Blend/service/BlendEraseService.js +8 -0
  46. package/src/Blend/service/BlendGetStateService.d.ts +12 -0
  47. package/src/Blend/service/BlendGetStateService.js +13 -0
  48. package/src/Blend/service/BlendOneZeroService.d.ts +1 -0
  49. package/src/Blend/service/BlendOneZeroService.js +8 -0
  50. package/src/Blend/service/BlendResetService.d.ts +1 -0
  51. package/src/Blend/service/BlendResetService.js +8 -0
  52. package/src/Blend/service/BlendScreenService.d.ts +1 -0
  53. package/src/Blend/service/BlendScreenService.js +8 -0
  54. package/src/Blend/service/BlendSetModeService.d.ts +2 -0
  55. package/src/Blend/service/BlendSetModeService.js +4 -0
  56. package/src/Blend/usecase/BlendApplyComplexBlendUseCase.d.ts +6 -0
  57. package/src/Blend/usecase/BlendApplyComplexBlendUseCase.js +79 -0
  58. package/src/Blend/usecase/BlendOperationUseCase.d.ts +11 -0
  59. package/src/Blend/usecase/BlendOperationUseCase.js +31 -0
  60. package/src/Blend.d.ts +8 -0
  61. package/src/Blend.js +91 -0
  62. package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.d.ts +15 -0
  63. package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.js +37 -0
  64. package/src/BufferManager/service/BufferManagerCreateRectVerticesService.d.ts +13 -0
  65. package/src/BufferManager/service/BufferManagerCreateRectVerticesService.js +23 -0
  66. package/src/BufferManager/service/BufferManagerCreateStorageBufferService.d.ts +17 -0
  67. package/src/BufferManager/service/BufferManagerCreateStorageBufferService.js +23 -0
  68. package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.d.ts +12 -0
  69. package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.js +32 -0
  70. package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.d.ts +12 -0
  71. package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.js +32 -0
  72. package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.d.ts +12 -0
  73. package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.js +20 -0
  74. package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.d.ts +10 -0
  75. package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.js +18 -0
  76. package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.d.ts +15 -0
  77. package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.js +51 -0
  78. package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.d.ts +13 -0
  79. package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.js +26 -0
  80. package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.d.ts +14 -0
  81. package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.js +46 -0
  82. package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.d.ts +12 -0
  83. package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.js +20 -0
  84. package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.d.ts +9 -0
  85. package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.js +15 -0
  86. package/src/BufferManager.d.ts +93 -0
  87. package/src/BufferManager.js +487 -0
  88. package/src/Compute/ComputePipelineManager.d.ts +61 -0
  89. package/src/Compute/ComputePipelineManager.js +313 -0
  90. package/src/Compute/service/ComputeExecuteBlurService.d.ts +21 -0
  91. package/src/Compute/service/ComputeExecuteBlurService.js +81 -0
  92. package/src/Context/service/ContextComputeBitmapMatrixService.d.ts +1 -0
  93. package/src/Context/service/ContextComputeBitmapMatrixService.js +74 -0
  94. package/src/Context/service/ContextComputeGradientMatrixService.d.ts +4 -0
  95. package/src/Context/service/ContextComputeGradientMatrixService.js +88 -0
  96. package/src/Context/service/ContextFillSimpleService.d.ts +2 -0
  97. package/src/Context/service/ContextFillSimpleService.js +28 -0
  98. package/src/Context/service/ContextFillWithStencilMainService.d.ts +2 -0
  99. package/src/Context/service/ContextFillWithStencilMainService.js +19 -0
  100. package/src/Context/service/ContextFillWithStencilService.d.ts +2 -0
  101. package/src/Context/service/ContextFillWithStencilService.js +19 -0
  102. package/src/Context/usecase/ContextApplyFilterUseCase.d.ts +5 -0
  103. package/src/Context/usecase/ContextApplyFilterUseCase.js +668 -0
  104. package/src/Context/usecase/ContextBitmapFillUseCase.d.ts +4 -0
  105. package/src/Context/usecase/ContextBitmapFillUseCase.js +210 -0
  106. package/src/Context/usecase/ContextBitmapStrokeUseCase.d.ts +4 -0
  107. package/src/Context/usecase/ContextBitmapStrokeUseCase.js +119 -0
  108. package/src/Context/usecase/ContextClipUseCase.d.ts +5 -0
  109. package/src/Context/usecase/ContextClipUseCase.js +101 -0
  110. package/src/Context/usecase/ContextContainerEndLayerUseCase.d.ts +5 -0
  111. package/src/Context/usecase/ContextContainerEndLayerUseCase.js +476 -0
  112. package/src/Context/usecase/ContextDrawArraysInstancedUseCase.d.ts +6 -0
  113. package/src/Context/usecase/ContextDrawArraysInstancedUseCase.js +135 -0
  114. package/src/Context/usecase/ContextDrawIndirectUseCase.d.ts +6 -0
  115. package/src/Context/usecase/ContextDrawIndirectUseCase.js +154 -0
  116. package/src/Context/usecase/ContextGradientFillUseCase.d.ts +4 -0
  117. package/src/Context/usecase/ContextGradientFillUseCase.js +230 -0
  118. package/src/Context/usecase/ContextGradientStrokeUseCase.d.ts +4 -0
  119. package/src/Context/usecase/ContextGradientStrokeUseCase.js +138 -0
  120. package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.d.ts +6 -0
  121. package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.js +213 -0
  122. package/src/Context.d.ts +430 -0
  123. package/src/Context.js +2453 -0
  124. package/src/FillTexturePool.d.ts +6 -0
  125. package/src/FillTexturePool.js +72 -0
  126. package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.d.ts +10 -0
  127. package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.js +214 -0
  128. package/src/Filter/BevelFilterShader.d.ts +2 -0
  129. package/src/Filter/BevelFilterShader.js +107 -0
  130. package/src/Filter/BitmapFilterShader.d.ts +2 -0
  131. package/src/Filter/BitmapFilterShader.js +207 -0
  132. package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.d.ts +16 -0
  133. package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.js +243 -0
  134. package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.d.ts +40 -0
  135. package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.js +51 -0
  136. package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.d.ts +25 -0
  137. package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.js +180 -0
  138. package/src/Filter/BlurFilterShader.d.ts +5 -0
  139. package/src/Filter/BlurFilterShader.js +109 -0
  140. package/src/Filter/BlurFilterUseCase.d.ts +36 -0
  141. package/src/Filter/BlurFilterUseCase.js +85 -0
  142. package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.d.ts +12 -0
  143. package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.js +90 -0
  144. package/src/Filter/ColorMatrixFilterShader.d.ts +4 -0
  145. package/src/Filter/ColorMatrixFilterShader.js +51 -0
  146. package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.d.ts +6 -0
  147. package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.js +144 -0
  148. package/src/Filter/ConvolutionFilterShader.d.ts +2 -0
  149. package/src/Filter/ConvolutionFilterShader.js +115 -0
  150. package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.d.ts +6 -0
  151. package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.js +172 -0
  152. package/src/Filter/DisplacementMapFilterShader.d.ts +2 -0
  153. package/src/Filter/DisplacementMapFilterShader.js +114 -0
  154. package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.d.ts +24 -0
  155. package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.js +179 -0
  156. package/src/Filter/DropShadowFilterShader.d.ts +4 -0
  157. package/src/Filter/DropShadowFilterShader.js +93 -0
  158. package/src/Filter/FilterGradientLUTCache.d.ts +29 -0
  159. package/src/Filter/FilterGradientLUTCache.js +84 -0
  160. package/src/Filter/FilterOffset.d.ts +8 -0
  161. package/src/Filter/FilterOffset.js +10 -0
  162. package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.d.ts +24 -0
  163. package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.js +143 -0
  164. package/src/Filter/GlowFilterShader.d.ts +4 -0
  165. package/src/Filter/GlowFilterShader.js +66 -0
  166. package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.d.ts +29 -0
  167. package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.js +216 -0
  168. package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.d.ts +29 -0
  169. package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.js +164 -0
  170. package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.d.ts +4 -0
  171. package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.js +23 -0
  172. package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.d.ts +4 -0
  173. package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.js +28 -0
  174. package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.d.ts +11 -0
  175. package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.js +19 -0
  176. package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.d.ts +23 -0
  177. package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.js +125 -0
  178. package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.d.ts +14 -0
  179. package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.js +23 -0
  180. package/src/FrameBufferManager.d.ts +24 -0
  181. package/src/FrameBufferManager.js +161 -0
  182. package/src/Gradient/GradientLUTCache.d.ts +61 -0
  183. package/src/Gradient/GradientLUTCache.js +153 -0
  184. package/src/Gradient/GradientLUTGenerator.d.ts +30 -0
  185. package/src/Gradient/GradientLUTGenerator.js +202 -0
  186. package/src/Grid.d.ts +18 -0
  187. package/src/Grid.js +21 -0
  188. package/src/Mask/service/MaskBeginMaskService.d.ts +9 -0
  189. package/src/Mask/service/MaskBeginMaskService.js +22 -0
  190. package/src/Mask/service/MaskEndMaskService.d.ts +15 -0
  191. package/src/Mask/service/MaskEndMaskService.js +36 -0
  192. package/src/Mask/service/MaskSetMaskBoundsService.d.ts +13 -0
  193. package/src/Mask/service/MaskSetMaskBoundsService.js +36 -0
  194. package/src/Mask/service/MaskUnionMaskService.d.ts +4 -0
  195. package/src/Mask/service/MaskUnionMaskService.js +74 -0
  196. package/src/Mask/usecase/MaskBindUseCase.d.ts +10 -0
  197. package/src/Mask/usecase/MaskBindUseCase.js +20 -0
  198. package/src/Mask/usecase/MaskLeaveMaskUseCase.d.ts +13 -0
  199. package/src/Mask/usecase/MaskLeaveMaskUseCase.js +51 -0
  200. package/src/Mask.d.ts +12 -0
  201. package/src/Mask.js +41 -0
  202. package/src/Mesh/service/MeshFillGenerateService.d.ts +19 -0
  203. package/src/Mesh/service/MeshFillGenerateService.js +76 -0
  204. package/src/Mesh/service/MeshLerpService.d.ts +13 -0
  205. package/src/Mesh/service/MeshLerpService.js +17 -0
  206. package/src/Mesh/service/MeshStrokeFillGenerateService.d.ts +19 -0
  207. package/src/Mesh/service/MeshStrokeFillGenerateService.js +76 -0
  208. package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.d.ts +13 -0
  209. package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.js +65 -0
  210. package/src/Mesh/usecase/MeshFillGenerateUseCase.d.ts +12 -0
  211. package/src/Mesh/usecase/MeshFillGenerateUseCase.js +48 -0
  212. package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.d.ts +13 -0
  213. package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.js +65 -0
  214. package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.d.ts +14 -0
  215. package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.js +28 -0
  216. package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.d.ts +18 -0
  217. package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.js +54 -0
  218. package/src/Mesh/usecase/MeshStrokeGenerateUseCase.d.ts +25 -0
  219. package/src/Mesh/usecase/MeshStrokeGenerateUseCase.js +608 -0
  220. package/src/PathCommand.d.ts +123 -0
  221. package/src/PathCommand.js +317 -0
  222. package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.d.ts +11 -0
  223. package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.js +35 -0
  224. package/src/SamplerCache/service/SamplerCacheGenerateKeyService.d.ts +13 -0
  225. package/src/SamplerCache/service/SamplerCacheGenerateKeyService.js +15 -0
  226. package/src/SamplerCache/service/SamplerCacheGetOrCreateService.d.ts +15 -0
  227. package/src/SamplerCache/service/SamplerCacheGetOrCreateService.js +30 -0
  228. package/src/SamplerCache.d.ts +18 -0
  229. package/src/SamplerCache.js +61 -0
  230. package/src/Shader/BlendModeShader.d.ts +51 -0
  231. package/src/Shader/BlendModeShader.js +71 -0
  232. package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.d.ts +12 -0
  233. package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.js +28 -0
  234. package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.d.ts +13 -0
  235. package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.js +61 -0
  236. package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.d.ts +19 -0
  237. package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.js +37 -0
  238. package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.d.ts +11 -0
  239. package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.js +24 -0
  240. package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.d.ts +14 -0
  241. package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.js +24 -0
  242. package/src/Shader/PipelineManager.d.ts +57 -0
  243. package/src/Shader/PipelineManager.js +2868 -0
  244. package/src/Shader/ShaderInstancedManager.d.ts +8 -0
  245. package/src/Shader/ShaderInstancedManager.js +18 -0
  246. package/src/Shader/ShaderSource.d.ts +60 -0
  247. package/src/Shader/ShaderSource.js +518 -0
  248. package/src/Shader/wgsl/common/SharedWgsl.d.ts +5 -0
  249. package/src/Shader/wgsl/common/SharedWgsl.js +37 -0
  250. package/src/Shader/wgsl/fragment/BasicFragment.d.ts +2 -0
  251. package/src/Shader/wgsl/fragment/BasicFragment.js +28 -0
  252. package/src/Shader/wgsl/fragment/BitmapFragment.d.ts +1 -0
  253. package/src/Shader/wgsl/fragment/BitmapFragment.js +43 -0
  254. package/src/Shader/wgsl/fragment/BlendFragment.d.ts +8 -0
  255. package/src/Shader/wgsl/fragment/BlendFragment.js +63 -0
  256. package/src/Shader/wgsl/fragment/EffectFragment.d.ts +6 -0
  257. package/src/Shader/wgsl/fragment/EffectFragment.js +324 -0
  258. package/src/Shader/wgsl/fragment/FillFragment.d.ts +1 -0
  259. package/src/Shader/wgsl/fragment/FillFragment.js +28 -0
  260. package/src/Shader/wgsl/fragment/FilterFragment.d.ts +10 -0
  261. package/src/Shader/wgsl/fragment/FilterFragment.js +212 -0
  262. package/src/Shader/wgsl/fragment/GradientFragment.d.ts +3 -0
  263. package/src/Shader/wgsl/fragment/GradientFragment.js +118 -0
  264. package/src/Shader/wgsl/fragment/InstancedFragment.d.ts +1 -0
  265. package/src/Shader/wgsl/fragment/InstancedFragment.js +20 -0
  266. package/src/Shader/wgsl/fragment/MaskFragment.d.ts +1 -0
  267. package/src/Shader/wgsl/fragment/MaskFragment.js +17 -0
  268. package/src/Shader/wgsl/fragment/StencilFragment.d.ts +2 -0
  269. package/src/Shader/wgsl/fragment/StencilFragment.js +33 -0
  270. package/src/Shader/wgsl/vertex/BasicVertex.d.ts +1 -0
  271. package/src/Shader/wgsl/vertex/BasicVertex.js +37 -0
  272. package/src/Shader/wgsl/vertex/BitmapVertex.d.ts +1 -0
  273. package/src/Shader/wgsl/vertex/BitmapVertex.js +43 -0
  274. package/src/Shader/wgsl/vertex/FillVertex.d.ts +1 -0
  275. package/src/Shader/wgsl/vertex/FillVertex.js +35 -0
  276. package/src/Shader/wgsl/vertex/FilterVertex.d.ts +12 -0
  277. package/src/Shader/wgsl/vertex/FilterVertex.js +193 -0
  278. package/src/Shader/wgsl/vertex/GradientVertex.d.ts +1 -0
  279. package/src/Shader/wgsl/vertex/GradientVertex.js +44 -0
  280. package/src/Shader/wgsl/vertex/InstancedVertex.d.ts +1 -0
  281. package/src/Shader/wgsl/vertex/InstancedVertex.js +48 -0
  282. package/src/Shader/wgsl/vertex/MaskVertex.d.ts +1 -0
  283. package/src/Shader/wgsl/vertex/MaskVertex.js +36 -0
  284. package/src/Shader/wgsl/vertex/StencilVertex.d.ts +2 -0
  285. package/src/Shader/wgsl/vertex/StencilVertex.js +66 -0
  286. package/src/TextureManager/service/TextureManagerInitializeSamplersService.d.ts +11 -0
  287. package/src/TextureManager/service/TextureManagerInitializeSamplersService.js +48 -0
  288. package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.d.ts +13 -0
  289. package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.js +30 -0
  290. package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.d.ts +15 -0
  291. package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.js +26 -0
  292. package/src/TextureManager.d.ts +15 -0
  293. package/src/TextureManager.js +87 -0
  294. package/src/TexturePool/service/TexturePoolCleanupService.d.ts +14 -0
  295. package/src/TexturePool/service/TexturePoolCleanupService.js +28 -0
  296. package/src/TexturePool/service/TexturePoolEvictOldestService.d.ts +11 -0
  297. package/src/TexturePool/service/TexturePoolEvictOldestService.js +24 -0
  298. package/src/TexturePool/service/TexturePoolReleaseService.d.ts +13 -0
  299. package/src/TexturePool/service/TexturePoolReleaseService.js +22 -0
  300. package/src/TexturePool/usecase/TexturePoolAcquireUseCase.d.ts +19 -0
  301. package/src/TexturePool/usecase/TexturePoolAcquireUseCase.js +90 -0
  302. package/src/TexturePool.d.ts +69 -0
  303. package/src/TexturePool.js +151 -0
  304. package/src/WebGPUUtil.d.ts +102 -0
  305. package/src/WebGPUUtil.js +157 -0
  306. package/src/index.d.ts +1 -0
  307. package/src/index.js +1 -0
  308. package/src/interface/IAttachmentObject.d.ts +41 -0
  309. package/src/interface/IAttachmentObject.js +1 -0
  310. package/src/interface/IBlendMode.d.ts +1 -0
  311. package/src/interface/IBlendMode.js +1 -0
  312. package/src/interface/IBlendState.d.ts +8 -0
  313. package/src/interface/IBlendState.js +1 -0
  314. package/src/interface/IBounds.d.ts +6 -0
  315. package/src/interface/IBounds.js +1 -0
  316. package/src/interface/ICachedBindGroup.d.ts +8 -0
  317. package/src/interface/ICachedBindGroup.js +1 -0
  318. package/src/interface/IColorBufferObject.d.ts +17 -0
  319. package/src/interface/IColorBufferObject.js +1 -0
  320. package/src/interface/IComplexBlendItem.d.ts +19 -0
  321. package/src/interface/IComplexBlendItem.js +1 -0
  322. package/src/interface/IFilterConfig.d.ts +29 -0
  323. package/src/interface/IFilterConfig.js +1 -0
  324. package/src/interface/IGradientLUTData.d.ts +8 -0
  325. package/src/interface/IGradientLUTData.js +1 -0
  326. package/src/interface/IGradientStop.d.ts +11 -0
  327. package/src/interface/IGradientStop.js +1 -0
  328. package/src/interface/ILocalFilterConfig.d.ts +21 -0
  329. package/src/interface/ILocalFilterConfig.js +1 -0
  330. package/src/interface/IMeshResult.d.ts +8 -0
  331. package/src/interface/IMeshResult.js +1 -0
  332. package/src/interface/IPath.d.ts +8 -0
  333. package/src/interface/IPath.js +1 -0
  334. package/src/interface/IPoint.d.ts +4 -0
  335. package/src/interface/IPoint.js +1 -0
  336. package/src/interface/IPooledBuffer.d.ts +8 -0
  337. package/src/interface/IPooledBuffer.js +1 -0
  338. package/src/interface/IPooledTexture.d.ts +17 -0
  339. package/src/interface/IPooledTexture.js +1 -0
  340. package/src/interface/IQuadraticSegment.d.ts +9 -0
  341. package/src/interface/IQuadraticSegment.js +1 -0
  342. package/src/interface/IRectangleInfo.d.ts +13 -0
  343. package/src/interface/IRectangleInfo.js +1 -0
  344. package/src/interface/IStencilBufferObject.d.ts +16 -0
  345. package/src/interface/IStencilBufferObject.js +1 -0
  346. package/src/interface/IStorageBufferConfig.d.ts +40 -0
  347. package/src/interface/IStorageBufferConfig.js +1 -0
  348. package/src/interface/ITextureObject.d.ts +16 -0
  349. package/src/interface/ITextureObject.js +1 -0
@@ -0,0 +1,668 @@
1
+ import { $getAtlasAttachmentObject } from "../../AtlasManager";
2
+ import { $offset } from "../../Filter/FilterOffset";
3
+ import { WebGPUUtil } from "../../WebGPUUtil";
4
+ import { execute as filterApplyBlurFilterUseCase } from "../../Filter/BlurFilter/FilterApplyBlurFilterUseCase";
5
+ import { execute as filterApplyColorMatrixFilterUseCase } from "../../Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase";
6
+ import { execute as filterApplyGlowFilterUseCase } from "../../Filter/GlowFilter/FilterApplyGlowFilterUseCase";
7
+ import { execute as filterApplyDropShadowFilterUseCase } from "../../Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase";
8
+ import { execute as filterApplyBevelFilterUseCase } from "../../Filter/BevelFilter/FilterApplyBevelFilterUseCase";
9
+ import { execute as filterApplyConvolutionFilterUseCase } from "../../Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase";
10
+ import { execute as filterApplyGradientBevelFilterUseCase } from "../../Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase";
11
+ import { execute as filterApplyGradientGlowFilterUseCase } from "../../Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase";
12
+ import { execute as filterApplyDisplacementMapFilterUseCase } from "../../Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase";
13
+ import { execute as blendApplyComplexBlendUseCase } from "../../Blend/usecase/BlendApplyComplexBlendUseCase";
14
+ const $uniform4 = new Float32Array(4);
15
+ const $uniform6a = new Float32Array(6);
16
+ const $uniform6b = new Float32Array(6);
17
+ const $uniform8 = new Float32Array(8);
18
+ const $uniform12 = new Float32Array(12);
19
+ const $uniform20 = new Float32Array(20);
20
+ // プリアロケート BindGroup Entry 配列
21
+ const $entries3 = [
22
+ { "binding": 0, "resource": { "buffer": null } },
23
+ { "binding": 1, "resource": null },
24
+ { "binding": 2, "resource": null }
25
+ ];
26
+ const SIMPLE_BLEND_MODES = new Set([
27
+ "normal", "layer", "add", "screen", "alpha", "erase", "copy"
28
+ ]);
29
+ const Y_FLIP_UNIFORM = new Float32Array([1, -1, 0, 1]);
30
+ const isIdentityColorTransform = (ct) => {
31
+ return ct[0] === 1 && ct[1] === 1 && ct[2] === 1 && ct[3] === 1
32
+ && ct[4] === 0 && ct[5] === 0 && ct[6] === 0 && ct[7] === 0;
33
+ };
34
+ const applyColorTransform = (config, attachment, colorTransform) => {
35
+ const ctAttachment = config.frameBufferManager.createTemporaryAttachment(attachment.width, attachment.height);
36
+ const pipeline = config.pipelineManager.getPipeline("color_transform");
37
+ const bindGroupLayout = config.pipelineManager.getBindGroupLayout("texture_copy");
38
+ if (!pipeline || !bindGroupLayout || !attachment.texture || !ctAttachment.texture) {
39
+ return attachment;
40
+ }
41
+ // uniform: mul(vec4) + add(vec4) = 32 bytes
42
+ // add値は0-255スケールの生値をそのまま渡す(WebGLのフィルターCTパスと同じ)
43
+ $uniform8[0] = colorTransform[0];
44
+ $uniform8[1] = colorTransform[1];
45
+ $uniform8[2] = colorTransform[2];
46
+ $uniform8[3] = colorTransform[3];
47
+ $uniform8[4] = colorTransform[4];
48
+ $uniform8[5] = colorTransform[5];
49
+ $uniform8[6] = colorTransform[6];
50
+ $uniform8[7] = 0;
51
+ const uniformBuffer = config.bufferManager.acquireAndWriteUniformBuffer($uniform8);
52
+ const sampler = config.textureManager.createSampler("color_transform_sampler", false);
53
+ $entries3[0].resource.buffer = uniformBuffer;
54
+ $entries3[1].resource = sampler;
55
+ $entries3[2].resource = attachment.texture.view;
56
+ const bindGroup = config.device.createBindGroup({
57
+ "layout": bindGroupLayout,
58
+ "entries": $entries3
59
+ });
60
+ const renderPassDescriptor = config.frameBufferManager.createRenderPassDescriptor(ctAttachment.texture.view, 0, 0, 0, 0, "clear");
61
+ const passEncoder = config.commandEncoder.beginRenderPass(renderPassDescriptor);
62
+ passEncoder.setPipeline(pipeline);
63
+ passEncoder.setBindGroup(0, bindGroup);
64
+ passEncoder.draw(6, 1, 0, 0);
65
+ passEncoder.end();
66
+ return ctAttachment;
67
+ };
68
+ const getTextureFromNode = (node, command_encoder, frame_buffer_manager) => {
69
+ // 一時アタッチメントを作成(ノードのサイズを使用)
70
+ const attachment = frame_buffer_manager.createTemporaryAttachment(node.w, node.h);
71
+ // アトラステクスチャから該当部分をコピー(複数アトラス対応)
72
+ // AtlasManagerから取得、フォールバックとしてFrameBufferManagerから取得
73
+ const atlasAttachment = $getAtlasAttachmentObject() || frame_buffer_manager.getAttachment("atlas");
74
+ if (atlasAttachment && atlasAttachment.texture && attachment.texture) {
75
+ // command_encoderを使ってコピー
76
+ command_encoder.copyTextureToTexture({
77
+ "texture": atlasAttachment.texture.resource,
78
+ "origin": { "x": node.x, "y": node.y, "z": 0 }
79
+ }, {
80
+ "texture": attachment.texture.resource,
81
+ "origin": { "x": 0, "y": 0, "z": 0 }
82
+ }, {
83
+ "width": node.w,
84
+ "height": node.h
85
+ });
86
+ }
87
+ else {
88
+ console.error("[WebGPU Filter] getTextureFromNode: FAILED - missing atlas or textures");
89
+ }
90
+ return attachment;
91
+ };
92
+ const isSimpleBlendMode = (blendMode) => {
93
+ return SIMPLE_BLEND_MODES.has(blendMode);
94
+ };
95
+ const copyMainAttachmentRegion = (config, mainAttachment, x, y, width, height) => {
96
+ // 一時アタッチメントを作成
97
+ const dstAttachment = config.frameBufferManager.createTemporaryAttachment(width, height);
98
+ // レンダーパスでコピー(フォーマット変換: bgra8unorm -> rgba8unorm)
99
+ const pipeline = config.pipelineManager.getPipeline("complex_blend_copy");
100
+ const bindGroupLayout = config.pipelineManager.getBindGroupLayout("texture_copy");
101
+ if (!pipeline || !bindGroupLayout || !mainAttachment.texture || !dstAttachment.texture) {
102
+ return dstAttachment;
103
+ }
104
+ // ユニフォームバッファ: scale (vec2) + offset (vec2)
105
+ const scaleX = width / mainAttachment.width;
106
+ const scaleY = height / mainAttachment.height;
107
+ const offsetX = x / mainAttachment.width;
108
+ const offsetY = y / mainAttachment.height;
109
+ $uniform4[0] = scaleX;
110
+ $uniform4[1] = scaleY;
111
+ $uniform4[2] = offsetX;
112
+ $uniform4[3] = offsetY;
113
+ const uniformBuffer = config.bufferManager.acquireAndWriteUniformBuffer($uniform4);
114
+ const sampler = config.textureManager.createSampler("filter_copy_sampler", false);
115
+ $entries3[0].resource.buffer = uniformBuffer;
116
+ $entries3[1].resource = sampler;
117
+ $entries3[2].resource = mainAttachment.texture.view;
118
+ const bindGroup = config.device.createBindGroup({
119
+ "layout": bindGroupLayout,
120
+ "entries": $entries3
121
+ });
122
+ const renderPassDescriptor = config.frameBufferManager.createRenderPassDescriptor(dstAttachment.texture.view, 0, 0, 0, 0, "clear");
123
+ const passEncoder = config.commandEncoder.beginRenderPass(renderPassDescriptor);
124
+ passEncoder.setPipeline(pipeline);
125
+ passEncoder.setBindGroup(0, bindGroup);
126
+ passEncoder.draw(6, 1, 0, 0);
127
+ passEncoder.end();
128
+ return dstAttachment;
129
+ };
130
+ const drawBlendResultToMain = (config, srcAttachment, mainAttachment, x, y) => {
131
+ // フィルター+複雑なブレンド用のパイプライン(Y軸反転あり)を使用
132
+ // MSAA有効時はMSAA版パイプラインを使用してmsaaTextureに描画→texture.viewにresolve
133
+ const useMsaa = mainAttachment.msaa && mainAttachment.msaaTexture?.view;
134
+ const pipelineName = useMsaa ? "filter_complex_blend_output_msaa" : "filter_complex_blend_output";
135
+ const pipeline = config.pipelineManager.getPipeline(pipelineName);
136
+ const bindGroupLayout = config.pipelineManager.getBindGroupLayout("positioned_texture");
137
+ if (!pipeline || !bindGroupLayout || !srcAttachment.texture || !mainAttachment.texture) {
138
+ return;
139
+ }
140
+ // ユニフォームデータ: offset, size, viewport, padding
141
+ $uniform8[0] = x;
142
+ $uniform8[1] = y;
143
+ $uniform8[2] = srcAttachment.width;
144
+ $uniform8[3] = srcAttachment.height;
145
+ $uniform8[4] = mainAttachment.width;
146
+ $uniform8[5] = mainAttachment.height;
147
+ $uniform8[6] = 0;
148
+ $uniform8[7] = 0;
149
+ const uniformBuffer = config.bufferManager.acquireAndWriteUniformBuffer($uniform8);
150
+ const sampler = config.textureManager.createSampler("filter_blend_output_sampler", false);
151
+ $entries3[0].resource.buffer = uniformBuffer;
152
+ $entries3[1].resource = sampler;
153
+ $entries3[2].resource = srcAttachment.texture.view;
154
+ const bindGroup = config.device.createBindGroup({
155
+ "layout": bindGroupLayout,
156
+ "entries": $entries3
157
+ });
158
+ // メインアタッチメントへの描画(loadで既存内容を保持)
159
+ // MSAA有効時はmsaaTextureに描画してtexture.viewにresolve
160
+ const colorView = useMsaa ? mainAttachment.msaaTexture.view : mainAttachment.texture.view;
161
+ const resolveTarget = useMsaa ? mainAttachment.texture.view : null;
162
+ const renderPassDescriptor = config.frameBufferManager.createRenderPassDescriptor(colorView, 0, 0, 0, 0, "load", resolveTarget);
163
+ const passEncoder = config.commandEncoder.beginRenderPass(renderPassDescriptor);
164
+ passEncoder.setPipeline(pipeline);
165
+ passEncoder.setBindGroup(0, bindGroup);
166
+ passEncoder.draw(6, 1, 0, 0);
167
+ passEncoder.end();
168
+ };
169
+ const drawFilterToMain = (config, filter_attachment, color_transform, blend_mode, x, y, _main_texture_view, _buffer_manager) => {
170
+ // メインアタッチメントに描画
171
+ // コンテナレイヤー内ではconfig.mainAttachmentがコンテナのテンポラリアタッチメントを指す
172
+ const mainAttachment = config.mainAttachment || config.frameBufferManager.getAttachment("main");
173
+ if (!mainAttachment || !mainAttachment.texture || !filter_attachment.texture) {
174
+ return;
175
+ }
176
+ // 描画位置とサイズを計算
177
+ // WebGLと同じサブピクセル精度を維持するため、Math.floorを使用しない
178
+ // Math.floorを使うと -0.012 → -1 になり、1ピクセル余分にクリップされてしまう
179
+ let drawX = x;
180
+ let drawY = y;
181
+ let drawWidth = filter_attachment.width;
182
+ let drawHeight = filter_attachment.height;
183
+ // 負の描画位置を処理(画面外の部分をクリップ)
184
+ let uvOffsetX = 0;
185
+ let uvOffsetY = 0;
186
+ if (drawX < 0) {
187
+ uvOffsetX = -drawX / filter_attachment.width;
188
+ drawWidth += drawX;
189
+ drawX = 0;
190
+ }
191
+ if (drawY < 0) {
192
+ uvOffsetY = -drawY / filter_attachment.height;
193
+ drawHeight += drawY;
194
+ drawY = 0;
195
+ }
196
+ // 描画サイズが0以下なら描画しない
197
+ if (drawWidth <= 0 || drawHeight <= 0) {
198
+ return;
199
+ }
200
+ // メインアタッチメントの範囲内にクランプ
201
+ const mainWidth = mainAttachment.width;
202
+ const mainHeight = mainAttachment.height;
203
+ if (drawX + drawWidth > mainWidth) {
204
+ drawWidth = mainWidth - drawX;
205
+ }
206
+ if (drawY + drawHeight > mainHeight) {
207
+ drawHeight = mainHeight - drawY;
208
+ }
209
+ // シンプルなブレンドモードの場合
210
+ if (isSimpleBlendMode(blend_mode)) {
211
+ // MSAA有効時はMSAA版パイプラインを使用してmsaaTextureに描画→texture.viewにresolve
212
+ const useMsaa = mainAttachment.msaa && mainAttachment.msaaTexture?.view;
213
+ // ブレンドモードに応じたパイプラインを選択
214
+ let pipelineName;
215
+ switch (blend_mode) {
216
+ case "add":
217
+ pipelineName = useMsaa ? "filter_output_add_msaa" : "filter_output_add";
218
+ break;
219
+ case "screen":
220
+ pipelineName = useMsaa ? "filter_output_screen_msaa" : "filter_output_screen";
221
+ break;
222
+ case "alpha":
223
+ pipelineName = useMsaa ? "filter_output_alpha_msaa" : "filter_output_alpha";
224
+ break;
225
+ case "erase":
226
+ pipelineName = useMsaa ? "filter_output_erase_msaa" : "filter_output_erase";
227
+ break;
228
+ case "copy":
229
+ pipelineName = useMsaa ? "texture_copy_bgra_msaa" : "texture_copy_bgra";
230
+ break;
231
+ default:
232
+ // normal, layer
233
+ pipelineName = useMsaa ? "filter_output_msaa" : "filter_output";
234
+ break;
235
+ }
236
+ let pipeline = config.pipelineManager.getPipeline(pipelineName);
237
+ let bindGroupLayout = config.pipelineManager.getBindGroupLayout("texture_copy");
238
+ if (!pipeline || !bindGroupLayout) {
239
+ // フォールバック
240
+ pipelineName = useMsaa ? "filter_output_msaa" : "filter_output";
241
+ pipeline = config.pipelineManager.getPipeline(pipelineName);
242
+ bindGroupLayout = config.pipelineManager.getBindGroupLayout("texture_copy");
243
+ if (!pipeline || !bindGroupLayout) {
244
+ return;
245
+ }
246
+ }
247
+ const sampler = config.textureManager.createSampler("filter_output_sampler", true);
248
+ // UV座標の設定
249
+ // viewportをdrawWidth/drawHeightに合わせるため、uvScaleでテクスチャの表示範囲を制御
250
+ // uv = texCoord * scale + offset で texCoord[0,1] → uv[uvOffset, uvOffset+uvScale]
251
+ const uvScaleX = drawWidth / filter_attachment.width;
252
+ const uvScaleY = drawHeight / filter_attachment.height;
253
+ $uniform4[0] = uvScaleX;
254
+ $uniform4[1] = uvScaleY;
255
+ $uniform4[2] = uvOffsetX;
256
+ $uniform4[3] = uvOffsetY;
257
+ const uniformBuffer = config.bufferManager.acquireAndWriteUniformBuffer($uniform4);
258
+ $entries3[0].resource.buffer = uniformBuffer;
259
+ $entries3[1].resource = sampler;
260
+ $entries3[2].resource = filter_attachment.texture.view;
261
+ const bindGroup = config.device.createBindGroup({
262
+ "layout": bindGroupLayout,
263
+ "entries": $entries3
264
+ });
265
+ // MSAA有効時はmsaaTextureに描画してtexture.viewにresolve
266
+ const colorView = useMsaa ? mainAttachment.msaaTexture.view : mainAttachment.texture.view;
267
+ const resolveTarget = useMsaa ? mainAttachment.texture.view : null;
268
+ const renderPassDescriptor = config.frameBufferManager.createRenderPassDescriptor(colorView, 0, 0, 0, 0, "load", resolveTarget);
269
+ // Viewportはfloat値でサブピクセル精度を維持(WebGLのsetTransform相当)
270
+ // ScissorはGPUIntegerCoordinate必須のため整数化し、viewport領域を包含する
271
+ const vpX = Math.max(0, drawX);
272
+ const vpY = Math.max(0, drawY);
273
+ const vpW = Math.max(1, drawWidth);
274
+ const vpH = Math.max(1, drawHeight);
275
+ const scissorX = Math.max(0, Math.floor(vpX));
276
+ const scissorY = Math.max(0, Math.floor(vpY));
277
+ const scissorW = Math.max(1, Math.min(Math.ceil(vpX + vpW) - scissorX, mainWidth - scissorX));
278
+ const scissorH = Math.max(1, Math.min(Math.ceil(vpY + vpH) - scissorY, mainHeight - scissorY));
279
+ // 描画が有効な範囲内でのみ実行
280
+ if (scissorW <= 0 || scissorH <= 0 || scissorX >= mainWidth || scissorY >= mainHeight) {
281
+ return;
282
+ }
283
+ const passEncoder = config.commandEncoder.beginRenderPass(renderPassDescriptor);
284
+ passEncoder.setPipeline(pipeline);
285
+ passEncoder.setBindGroup(0, bindGroup);
286
+ passEncoder.setViewport(vpX, vpY, vpW, vpH, 0, 1);
287
+ passEncoder.setScissorRect(scissorX, scissorY, scissorW, scissorH);
288
+ passEncoder.draw(6, 1, 0, 0);
289
+ passEncoder.end();
290
+ }
291
+ else {
292
+ // 複雑なブレンドモード(multiply, overlay, darken, lighten, hardlight等)
293
+ // 1. メインアタッチメントから描画先の矩形をコピー
294
+ const dstAttachment = copyMainAttachmentRegion(config, mainAttachment, drawX, drawY, drawWidth, drawHeight);
295
+ // 2. カラートランスフォームを準備(WebGL版と同じ:add値は生値)
296
+ $uniform8[0] = color_transform[0]; // mulR
297
+ $uniform8[1] = color_transform[1]; // mulG
298
+ $uniform8[2] = color_transform[2]; // mulB
299
+ $uniform8[3] = color_transform[3]; // mulA (globalAlpha)
300
+ $uniform8[4] = color_transform[4]; // addR
301
+ $uniform8[5] = color_transform[5]; // addG
302
+ $uniform8[6] = color_transform[6]; // addB
303
+ $uniform8[7] = 0; // addA
304
+ // 3. 複雑なブレンドを適用
305
+ const blendedAttachment = blendApplyComplexBlendUseCase(filter_attachment, dstAttachment, blend_mode, $uniform8, {
306
+ "device": config.device,
307
+ "commandEncoder": config.commandEncoder,
308
+ "bufferManager": config.bufferManager,
309
+ "frameBufferManager": config.frameBufferManager,
310
+ "pipelineManager": config.pipelineManager,
311
+ "textureManager": config.textureManager,
312
+ "frameTextures": config.frameTextures
313
+ });
314
+ // 4. 結果をメインアタッチメントに描画
315
+ drawBlendResultToMain(config, blendedAttachment, mainAttachment, drawX, drawY);
316
+ // 5. 一時テクスチャを解放
317
+ config.frameBufferManager.releaseTemporaryAttachment(dstAttachment);
318
+ config.frameBufferManager.releaseTemporaryAttachment(blendedAttachment);
319
+ }
320
+ };
321
+ export const execute = (node, width, height, is_bitmap, matrix, color_transform, blend_mode, bounds, params, config, main_texture_view, buffer_manager) => {
322
+ // オフセットを初期化
323
+ $offset.x = 0;
324
+ $offset.y = 0;
325
+ // ノードからテクスチャを取得
326
+ let filterAttachment = getTextureFromNode(node, config.commandEncoder, config.frameBufferManager);
327
+ // アトラスのY反転を補正
328
+ // WebGPUではアトラスに描画する際にY軸が反転して格納される:
329
+ // - Shape: FillVertexがndc.yを反転なしで使用するため、WebGPUのNDC→ピクセル変換でY反転
330
+ // - Bitmap/TextField: PositionedTextureVertexのtexCoord Y反転 + position.y反転
331
+ // どちらも同じ方向にY反転しているため、フィルタ処理前に全コンテンツを補正する
332
+ if (filterAttachment.texture) {
333
+ const flippedAttachment = config.frameBufferManager.createTemporaryAttachment(node.w, node.h);
334
+ const flipPipeline = config.pipelineManager.getPipeline("texture_copy_rgba8");
335
+ const flipBindGroupLayout = config.pipelineManager.getBindGroupLayout("texture_copy");
336
+ if (flipPipeline && flipBindGroupLayout && flippedAttachment.texture) {
337
+ const sampler = config.textureManager.createSampler("filter_flip_sampler", false);
338
+ // scale=(1, -1), offset=(0, 1) で UV.y = texCoord.y * (-1) + 1 = 1 - texCoord.y
339
+ const uniformBuffer = config.bufferManager.acquireAndWriteUniformBuffer(Y_FLIP_UNIFORM);
340
+ $entries3[0].resource.buffer = uniformBuffer;
341
+ $entries3[1].resource = sampler;
342
+ $entries3[2].resource = filterAttachment.texture.view;
343
+ const bindGroup = config.device.createBindGroup({
344
+ "layout": flipBindGroupLayout,
345
+ "entries": $entries3
346
+ });
347
+ const renderPassDescriptor = config.frameBufferManager.createRenderPassDescriptor(flippedAttachment.texture.view, 0, 0, 0, 0, "clear");
348
+ const passEncoder = config.commandEncoder.beginRenderPass(renderPassDescriptor);
349
+ passEncoder.setPipeline(flipPipeline);
350
+ passEncoder.setBindGroup(0, bindGroup);
351
+ passEncoder.draw(6, 1, 0, 0);
352
+ passEncoder.end();
353
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
354
+ filterAttachment = flippedAttachment;
355
+ }
356
+ }
357
+ const devicePixelRatio = WebGPUUtil.getDevicePixelRatio();
358
+ // スケール・回転が適用されているかチェック(WebGL版と同じロジック)
359
+ const scaleX = Math.sqrt(matrix[0] * matrix[0] + matrix[1] * matrix[1]);
360
+ const scaleY = Math.sqrt(matrix[2] * matrix[2] + matrix[3] * matrix[3]);
361
+ const radianX = Math.atan2(matrix[1], matrix[0]);
362
+ const radianY = Math.atan2(-matrix[2], matrix[3]);
363
+ // is_bitmap=true(Video/Bitmap)の場合はスケールを適用、false(Shape)の場合はスケールなし
364
+ const a0 = is_bitmap ? scaleX * Math.cos(radianX) : Math.cos(radianX);
365
+ const b1 = is_bitmap ? scaleX * Math.sin(radianX) : Math.sin(radianX);
366
+ const c2 = is_bitmap ? -scaleY * Math.sin(radianY) : -Math.sin(radianY);
367
+ const d3 = is_bitmap ? scaleY * Math.cos(radianY) : Math.cos(radianY);
368
+ // 変換行列を計算(WebGL版と同じ)
369
+ $uniform6a[0] = a0;
370
+ $uniform6a[1] = b1;
371
+ $uniform6a[2] = c2;
372
+ $uniform6a[3] = d3;
373
+ $uniform6a[4] = width / 2;
374
+ $uniform6a[5] = height / 2;
375
+ $uniform6b[0] = 1;
376
+ $uniform6b[1] = 0;
377
+ $uniform6b[2] = 0;
378
+ $uniform6b[3] = 1;
379
+ $uniform6b[4] = -node.w / 2;
380
+ $uniform6b[5] = -node.h / 2;
381
+ // 行列乗算: a * b
382
+ const tMatrix0 = $uniform6a[0] * $uniform6b[0] + $uniform6a[2] * $uniform6b[1];
383
+ const tMatrix1 = $uniform6a[1] * $uniform6b[0] + $uniform6a[3] * $uniform6b[1];
384
+ const tMatrix2 = $uniform6a[0] * $uniform6b[2] + $uniform6a[2] * $uniform6b[3];
385
+ const tMatrix3 = $uniform6a[1] * $uniform6b[2] + $uniform6a[3] * $uniform6b[3];
386
+ const tMatrix4 = $uniform6a[0] * $uniform6b[4] + $uniform6a[2] * $uniform6b[5] + $uniform6a[4];
387
+ const tMatrix5 = $uniform6a[1] * $uniform6b[4] + $uniform6a[3] * $uniform6b[5] + $uniform6a[5];
388
+ let offsetX = 0;
389
+ let offsetY = 0;
390
+ // スケール・回転変換が必要な場合(WebGL版と同じ条件)
391
+ if (tMatrix0 !== 1 || tMatrix1 !== 0 || tMatrix2 !== 0 || tMatrix3 !== 1) {
392
+ // スケール変換用のアタッチメントを作成
393
+ const scaledAttachment = config.frameBufferManager.createTemporaryAttachment(width, height);
394
+ // スケール変換用パイプラインを使用
395
+ // ビットマップ/TextFieldのY反転はフィルタ処理前に補正済みのため、常にtexture_scaleを使用
396
+ const scalePipelineName = "texture_scale";
397
+ const scalePipeline = config.pipelineManager.getPipeline(scalePipelineName);
398
+ const scaleBindGroupLayout = config.pipelineManager.getBindGroupLayout("texture_scale");
399
+ if (scalePipeline && scaleBindGroupLayout) {
400
+ // ユニフォームデータ: matrix (6 floats) + srcSize (2 floats) + dstSize (2 floats) + padding (2 floats)
401
+ $uniform12[0] = tMatrix0;
402
+ $uniform12[1] = tMatrix1;
403
+ $uniform12[2] = tMatrix2;
404
+ $uniform12[3] = tMatrix3;
405
+ $uniform12[4] = tMatrix4;
406
+ $uniform12[5] = tMatrix5;
407
+ $uniform12[6] = node.w;
408
+ $uniform12[7] = node.h;
409
+ $uniform12[8] = width;
410
+ $uniform12[9] = height;
411
+ $uniform12[10] = 0;
412
+ $uniform12[11] = 0;
413
+ const uniformBuffer = config.bufferManager.acquireAndWriteUniformBuffer($uniform12, 48);
414
+ const sampler = config.textureManager.createSampler("filter_scale_sampler", true);
415
+ $entries3[0].resource.buffer = uniformBuffer;
416
+ $entries3[1].resource = sampler;
417
+ $entries3[2].resource = filterAttachment.texture.view;
418
+ const bindGroup = config.device.createBindGroup({
419
+ "layout": scaleBindGroupLayout,
420
+ "entries": $entries3
421
+ });
422
+ const renderPassDescriptor = config.frameBufferManager.createRenderPassDescriptor(scaledAttachment.texture.view, 0, 0, 0, 0, "clear");
423
+ const passEncoder = config.commandEncoder.beginRenderPass(renderPassDescriptor);
424
+ passEncoder.setPipeline(scalePipeline);
425
+ passEncoder.setBindGroup(0, bindGroup);
426
+ passEncoder.draw(6, 1, 0, 0);
427
+ passEncoder.end();
428
+ offsetX = tMatrix4;
429
+ offsetY = tMatrix5;
430
+ // 元のアタッチメントを解放してスケール済みアタッチメントを使用
431
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
432
+ filterAttachment = scaledAttachment;
433
+ }
434
+ }
435
+ // フィルターを適用
436
+ for (let idx = 0; params.length > idx;) {
437
+ const type = params[idx++];
438
+ switch (type) {
439
+ case 0: // BevelFilter
440
+ {
441
+ const bevelDistance = params[idx++];
442
+ const bevelAngle = params[idx++];
443
+ const bevelHighlightColor = params[idx++];
444
+ const bevelHighlightAlpha = params[idx++];
445
+ const bevelShadowColor = params[idx++];
446
+ const bevelShadowAlpha = params[idx++];
447
+ const bevelBlurX = params[idx++];
448
+ const bevelBlurY = params[idx++];
449
+ const bevelStrength = params[idx++];
450
+ const bevelQuality = params[idx++];
451
+ const bevelType = params[idx++];
452
+ const bevelKnockout = Boolean(params[idx++]);
453
+ const newAttachment = filterApplyBevelFilterUseCase(filterAttachment, matrix, bevelDistance, bevelAngle, bevelHighlightColor, bevelHighlightAlpha, bevelShadowColor, bevelShadowAlpha, bevelBlurX, bevelBlurY, bevelStrength, bevelQuality, bevelType, bevelKnockout, devicePixelRatio, config);
454
+ if (filterAttachment !== newAttachment) {
455
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
456
+ }
457
+ filterAttachment = newAttachment;
458
+ }
459
+ break;
460
+ case 1: // BlurFilter
461
+ {
462
+ const blurX = params[idx++];
463
+ const blurY = params[idx++];
464
+ const quality = params[idx++];
465
+ const newAttachment = filterApplyBlurFilterUseCase(filterAttachment, matrix, blurX, blurY, quality, devicePixelRatio, config);
466
+ if (filterAttachment !== newAttachment) {
467
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
468
+ }
469
+ filterAttachment = newAttachment;
470
+ }
471
+ break;
472
+ case 2: // ColorMatrixFilter
473
+ {
474
+ $uniform20[0] = params[idx++];
475
+ $uniform20[1] = params[idx++];
476
+ $uniform20[2] = params[idx++];
477
+ $uniform20[3] = params[idx++];
478
+ $uniform20[4] = params[idx++];
479
+ $uniform20[5] = params[idx++];
480
+ $uniform20[6] = params[idx++];
481
+ $uniform20[7] = params[idx++];
482
+ $uniform20[8] = params[idx++];
483
+ $uniform20[9] = params[idx++];
484
+ $uniform20[10] = params[idx++];
485
+ $uniform20[11] = params[idx++];
486
+ $uniform20[12] = params[idx++];
487
+ $uniform20[13] = params[idx++];
488
+ $uniform20[14] = params[idx++];
489
+ $uniform20[15] = params[idx++];
490
+ $uniform20[16] = params[idx++];
491
+ $uniform20[17] = params[idx++];
492
+ $uniform20[18] = params[idx++];
493
+ $uniform20[19] = params[idx++];
494
+ const newAttachment = filterApplyColorMatrixFilterUseCase(filterAttachment, $uniform20, config);
495
+ if (filterAttachment !== newAttachment) {
496
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
497
+ }
498
+ filterAttachment = newAttachment;
499
+ }
500
+ break;
501
+ case 3: // ConvolutionFilter
502
+ {
503
+ const convMatrixX = params[idx++];
504
+ const convMatrixY = params[idx++];
505
+ const convLength = convMatrixX * convMatrixY;
506
+ const convMatrix = new Float32Array(convLength);
507
+ for (let i = 0; i < convLength; i++) {
508
+ convMatrix[i] = params[idx++];
509
+ }
510
+ const convDivisor = params[idx++];
511
+ const convBias = params[idx++];
512
+ const convPreserveAlpha = Boolean(params[idx++]);
513
+ const convClamp = Boolean(params[idx++]);
514
+ const convColor = params[idx++];
515
+ const convAlpha = params[idx++];
516
+ const newAttachment = filterApplyConvolutionFilterUseCase(filterAttachment, convMatrixX, convMatrixY, convMatrix, convDivisor, convBias, convPreserveAlpha, convClamp, convColor, convAlpha, config);
517
+ if (filterAttachment !== newAttachment) {
518
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
519
+ }
520
+ filterAttachment = newAttachment;
521
+ }
522
+ break;
523
+ case 4: // DisplacementMapFilter
524
+ {
525
+ const dmBufferLength = params[idx++];
526
+ const dmBuffer = new Uint8Array(dmBufferLength);
527
+ for (let i = 0; i < dmBufferLength; i++) {
528
+ dmBuffer[i] = params[idx++];
529
+ }
530
+ const dmBitmapWidth = params[idx++];
531
+ const dmBitmapHeight = params[idx++];
532
+ const dmMapPointX = params[idx++];
533
+ const dmMapPointY = params[idx++];
534
+ const dmComponentX = params[idx++];
535
+ const dmComponentY = params[idx++];
536
+ const dmScaleX = params[idx++];
537
+ const dmScaleY = params[idx++];
538
+ const dmMode = params[idx++];
539
+ const dmColor = params[idx++];
540
+ const dmAlpha = params[idx++];
541
+ const newAttachment = filterApplyDisplacementMapFilterUseCase(filterAttachment, matrix, dmBuffer, dmBitmapWidth, dmBitmapHeight, dmMapPointX, dmMapPointY, dmComponentX, dmComponentY, dmScaleX, dmScaleY, dmMode, dmColor, dmAlpha, devicePixelRatio, config);
542
+ if (filterAttachment !== newAttachment) {
543
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
544
+ }
545
+ filterAttachment = newAttachment;
546
+ }
547
+ break;
548
+ case 5: // DropShadowFilter
549
+ {
550
+ const dsDistance = params[idx++];
551
+ const dsAngle = params[idx++];
552
+ const dsColor = params[idx++];
553
+ const dsAlpha = params[idx++];
554
+ const dsBlurX = params[idx++];
555
+ const dsBlurY = params[idx++];
556
+ const dsStrength = params[idx++];
557
+ const dsQuality = params[idx++];
558
+ const dsInner = Boolean(params[idx++]);
559
+ const dsKnockout = Boolean(params[idx++]);
560
+ const dsHideObject = Boolean(params[idx++]);
561
+ const newAttachment = filterApplyDropShadowFilterUseCase(filterAttachment, matrix, dsDistance, dsAngle, dsColor, dsAlpha, dsBlurX, dsBlurY, dsStrength, dsQuality, dsInner, dsKnockout, dsHideObject, devicePixelRatio, config);
562
+ if (filterAttachment !== newAttachment) {
563
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
564
+ }
565
+ filterAttachment = newAttachment;
566
+ }
567
+ break;
568
+ case 6: // GlowFilter
569
+ {
570
+ const glowColor = params[idx++];
571
+ const glowAlpha = params[idx++];
572
+ const glowBlurX = params[idx++];
573
+ const glowBlurY = params[idx++];
574
+ const glowStrength = params[idx++];
575
+ const glowQuality = params[idx++];
576
+ const glowInner = Boolean(params[idx++]);
577
+ const glowKnockout = Boolean(params[idx++]);
578
+ const newAttachment = filterApplyGlowFilterUseCase(filterAttachment, matrix, glowColor, glowAlpha, glowBlurX, glowBlurY, glowStrength, glowQuality, glowInner, glowKnockout, devicePixelRatio, config);
579
+ if (filterAttachment !== newAttachment) {
580
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
581
+ }
582
+ filterAttachment = newAttachment;
583
+ }
584
+ break;
585
+ case 7: // GradientBevelFilter
586
+ {
587
+ const gbDistance = params[idx++];
588
+ const gbAngle = params[idx++];
589
+ const gbColorsLen = params[idx++];
590
+ const gbColors = new Float32Array(gbColorsLen);
591
+ for (let i = 0; i < gbColorsLen; i++) {
592
+ gbColors[i] = params[idx++];
593
+ }
594
+ const gbAlphasLen = params[idx++];
595
+ const gbAlphas = new Float32Array(gbAlphasLen);
596
+ for (let i = 0; i < gbAlphasLen; i++) {
597
+ gbAlphas[i] = params[idx++];
598
+ }
599
+ const gbRatiosLen = params[idx++];
600
+ const gbRatios = new Float32Array(gbRatiosLen);
601
+ for (let i = 0; i < gbRatiosLen; i++) {
602
+ gbRatios[i] = params[idx++];
603
+ }
604
+ const gbBlurX = params[idx++];
605
+ const gbBlurY = params[idx++];
606
+ const gbStrength = params[idx++];
607
+ const gbQuality = params[idx++];
608
+ const gbType = params[idx++];
609
+ const gbKnockout = Boolean(params[idx++]);
610
+ const newAttachment = filterApplyGradientBevelFilterUseCase(filterAttachment, matrix, gbDistance, gbAngle, gbColors, gbAlphas, gbRatios, gbBlurX, gbBlurY, gbStrength, gbQuality, gbType, gbKnockout, devicePixelRatio, config);
611
+ if (filterAttachment !== newAttachment) {
612
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
613
+ }
614
+ filterAttachment = newAttachment;
615
+ }
616
+ break;
617
+ case 8: // GradientGlowFilter
618
+ {
619
+ const ggDistance = params[idx++];
620
+ const ggAngle = params[idx++];
621
+ const ggColorsLen = params[idx++];
622
+ const ggColors = new Float32Array(ggColorsLen);
623
+ for (let i = 0; i < ggColorsLen; i++) {
624
+ ggColors[i] = params[idx++];
625
+ }
626
+ const ggAlphasLen = params[idx++];
627
+ const ggAlphas = new Float32Array(ggAlphasLen);
628
+ for (let i = 0; i < ggAlphasLen; i++) {
629
+ ggAlphas[i] = params[idx++];
630
+ }
631
+ const ggRatiosLen = params[idx++];
632
+ const ggRatios = new Float32Array(ggRatiosLen);
633
+ for (let i = 0; i < ggRatiosLen; i++) {
634
+ ggRatios[i] = params[idx++];
635
+ }
636
+ const ggBlurX = params[idx++];
637
+ const ggBlurY = params[idx++];
638
+ const ggStrength = params[idx++];
639
+ const ggQuality = params[idx++];
640
+ const ggType = params[idx++];
641
+ const ggKnockout = Boolean(params[idx++]);
642
+ const newAttachment = filterApplyGradientGlowFilterUseCase(filterAttachment, matrix, ggDistance, ggAngle, ggColors, ggAlphas, ggRatios, ggBlurX, ggBlurY, ggStrength, ggQuality, ggType, ggKnockout, devicePixelRatio, config);
643
+ if (filterAttachment !== newAttachment) {
644
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
645
+ }
646
+ filterAttachment = newAttachment;
647
+ }
648
+ break;
649
+ }
650
+ }
651
+ // ColorTransformが恒等変換でない場合、フィルター結果に適用
652
+ // WebGL版と同じ: フィルターチェーン適用後、メイン描画前にColorTransformを適用
653
+ if (!isIdentityColorTransform(color_transform)) {
654
+ const ctAttachment = applyColorTransform(config, filterAttachment, color_transform);
655
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
656
+ filterAttachment = ctAttachment;
657
+ }
658
+ // フィルター適用後のテクスチャをメインキャンバスに描画
659
+ // scaleX, scaleYは上部で計算済み
660
+ const xMin = bounds[0] * (scaleX / devicePixelRatio);
661
+ const yMin = bounds[1] * (scaleY / devicePixelRatio);
662
+ // WebGL版と同じ: スケール変換のオフセットを考慮($offsetはフィルターチェーン内部用で最終位置には不要)
663
+ const drawX = -offsetX + xMin + matrix[4];
664
+ const drawY = -offsetY + yMin + matrix[5];
665
+ drawFilterToMain(config, filterAttachment, color_transform, blend_mode, drawX, drawY, main_texture_view, buffer_manager);
666
+ // フィルター用アタッチメントを解放
667
+ config.frameBufferManager.releaseTemporaryAttachment(filterAttachment);
668
+ };