@zephyr3d/scene 0.9.2 → 0.9.4

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 (513) hide show
  1. package/dist/animation/animationset.js +135 -135
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/ik/ik_chain_builder.js +68 -0
  4. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  5. package/dist/animation/ik/ik_pole_constraint.js +2 -7
  6. package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
  7. package/dist/animation/joint_dynamics/controller.js +146 -146
  8. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  9. package/dist/animation/joint_dynamics/math.js +16 -0
  10. package/dist/animation/joint_dynamics/math.js.map +1 -0
  11. package/dist/animation/spring/spring_system.js +75 -75
  12. package/dist/animation/spring/spring_system.js.map +1 -1
  13. package/dist/animation/spring2/constraints.js.map +1 -1
  14. package/dist/animation/spring2/controller.js +64 -64
  15. package/dist/animation/spring2/controller.js.map +1 -1
  16. package/dist/animation/spring2/math.js.map +1 -1
  17. package/dist/animation/spring2/spring_system.js +8 -8
  18. package/dist/animation/spring2/spring_system.js.map +1 -1
  19. package/dist/app/engine.js +119 -71
  20. package/dist/app/engine.js.map +1 -1
  21. package/dist/asset/assetmanager.js +296 -244
  22. package/dist/asset/assetmanager.js.map +1 -1
  23. package/dist/asset/loaders/gltf/gltf_loader.js +1 -0
  24. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  25. package/dist/camera/camera.js +184 -184
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/index.d.ts +685 -38
  28. package/dist/index.js +11 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/material/material.js +290 -290
  31. package/dist/material/material.js.map +1 -1
  32. package/dist/material/msdf_text.js +180 -0
  33. package/dist/material/msdf_text.js.map +1 -0
  34. package/dist/material/msdf_text_sprite.js +64 -0
  35. package/dist/material/msdf_text_sprite.js.map +1 -0
  36. package/dist/material/pbrblueprint.js +123 -108
  37. package/dist/material/pbrblueprint.js.map +1 -1
  38. package/dist/material/shader/helper.js +6 -3
  39. package/dist/material/shader/helper.js.map +1 -1
  40. package/dist/material/sprite_sdf.js +106 -0
  41. package/dist/material/sprite_sdf.js.map +1 -0
  42. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +38 -0
  43. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +1 -0
  44. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +10 -0
  45. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +1 -0
  46. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +127 -0
  47. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +1 -0
  48. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +263 -0
  49. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +1 -0
  50. package/dist/posteffect/ssr.js +1 -0
  51. package/dist/posteffect/ssr.js.map +1 -1
  52. package/dist/render/abuffer_oit.js +1 -0
  53. package/dist/render/abuffer_oit.js.map +1 -1
  54. package/dist/render/cluster_light.js +3 -4
  55. package/dist/render/cluster_light.js.map +1 -1
  56. package/dist/render/cull_visitor.js +28 -0
  57. package/dist/render/cull_visitor.js.map +1 -1
  58. package/dist/render/drawable.js.map +1 -1
  59. package/dist/render/drawable_mixin.js +1 -0
  60. package/dist/render/drawable_mixin.js.map +1 -1
  61. package/dist/render/fbm_wavegenerator.js +1 -0
  62. package/dist/render/fbm_wavegenerator.js.map +1 -1
  63. package/dist/render/gerstner_wavegenerator.js +1 -0
  64. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  65. package/dist/render/globalbindgroup_allocator.js +1 -0
  66. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  67. package/dist/render/render_queue.js +1 -0
  68. package/dist/render/render_queue.js.map +1 -1
  69. package/dist/render/rendergraph/history_resource_manager.js +93 -93
  70. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  71. package/dist/render/rendergraph/history_resources.js +3 -3
  72. package/dist/render/rendergraph/history_resources.js.map +1 -1
  73. package/dist/render/rendergraph/types.js +22 -22
  74. package/dist/render/rendergraph/types.js.map +1 -1
  75. package/dist/scene/basesprite.js +1 -5
  76. package/dist/scene/basesprite.js.map +1 -1
  77. package/dist/scene/batchgroup.js +29 -17
  78. package/dist/scene/batchgroup.js.map +1 -1
  79. package/dist/scene/environment.js +1 -0
  80. package/dist/scene/environment.js.map +1 -1
  81. package/dist/scene/mesh.js +8 -9
  82. package/dist/scene/mesh.js.map +1 -1
  83. package/dist/scene/meshdrawable.js +96 -0
  84. package/dist/scene/meshdrawable.js.map +1 -0
  85. package/dist/scene/msdftext.js +341 -0
  86. package/dist/scene/msdftext.js.map +1 -0
  87. package/dist/scene/msdftextsprite.js +349 -0
  88. package/dist/scene/msdftextsprite.js.map +1 -0
  89. package/dist/scene/particlesys.js +1 -0
  90. package/dist/scene/particlesys.js.map +1 -1
  91. package/dist/scene/scene.js +1 -0
  92. package/dist/scene/scene.js.map +1 -1
  93. package/dist/scene/scene_node.js +6 -0
  94. package/dist/scene/scene_node.js.map +1 -1
  95. package/dist/scene/sdftextsprite.js +322 -0
  96. package/dist/scene/sdftextsprite.js.map +1 -0
  97. package/dist/scene/terrain-cm/grass.js +1 -0
  98. package/dist/scene/terrain-cm/grass.js.map +1 -1
  99. package/dist/scene/terrain-cm/grassmaterial.js +1 -0
  100. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  101. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  102. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  103. package/dist/scene/textsprite.js +120 -0
  104. package/dist/scene/textsprite.js.map +1 -0
  105. package/dist/scene/water.js +1 -0
  106. package/dist/scene/water.js.map +1 -1
  107. package/dist/shadow/shader.js +1 -0
  108. package/dist/shadow/shader.js.map +1 -1
  109. package/dist/shapes/torus.js +90 -59
  110. package/dist/shapes/torus.js.map +1 -1
  111. package/dist/src/animation/animation.js +127 -0
  112. package/dist/src/animation/animation.js.map +1 -0
  113. package/dist/src/animation/animationset.js +255 -0
  114. package/dist/src/animation/animationset.js.map +1 -0
  115. package/dist/src/animation/animationtrack.js +34 -0
  116. package/dist/src/animation/animationtrack.js.map +1 -0
  117. package/dist/src/animation/eulerrotationtrack.js +52 -0
  118. package/dist/src/animation/eulerrotationtrack.js.map +1 -0
  119. package/dist/src/animation/morphtarget.js +93 -0
  120. package/dist/src/animation/morphtarget.js.map +1 -0
  121. package/dist/src/animation/morphtrack.js +70 -0
  122. package/dist/src/animation/morphtrack.js.map +1 -0
  123. package/dist/src/animation/proptrack.js +161 -0
  124. package/dist/src/animation/proptrack.js.map +1 -0
  125. package/dist/src/animation/rotationtrack.js +51 -0
  126. package/dist/src/animation/rotationtrack.js.map +1 -0
  127. package/dist/src/animation/scaletrack.js +50 -0
  128. package/dist/src/animation/scaletrack.js.map +1 -0
  129. package/dist/src/animation/skeleton.js +204 -0
  130. package/dist/src/animation/skeleton.js.map +1 -0
  131. package/dist/src/animation/translationtrack.js +50 -0
  132. package/dist/src/animation/translationtrack.js.map +1 -0
  133. package/dist/src/app/app.js +129 -0
  134. package/dist/src/app/app.js.map +1 -0
  135. package/dist/src/app/inputmgr.js +267 -0
  136. package/dist/src/app/inputmgr.js.map +1 -0
  137. package/dist/src/asset/assetmanager.js +404 -0
  138. package/dist/src/asset/assetmanager.js.map +1 -0
  139. package/dist/src/asset/builtin.js +337 -0
  140. package/dist/src/asset/builtin.js.map +1 -0
  141. package/dist/src/asset/loaders/dds/dds.js +470 -0
  142. package/dist/src/asset/loaders/dds/dds.js.map +1 -0
  143. package/dist/src/asset/loaders/dds/dds_loader.js +28 -0
  144. package/dist/src/asset/loaders/dds/dds_loader.js.map +1 -0
  145. package/dist/src/asset/loaders/gltf/gltf_loader.js +1265 -0
  146. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +1 -0
  147. package/dist/src/asset/loaders/gltf/helpers.js +327 -0
  148. package/dist/src/asset/loaders/gltf/helpers.js.map +1 -0
  149. package/dist/src/asset/loaders/hdr/hdr.js +180 -0
  150. package/dist/src/asset/loaders/hdr/hdr.js.map +1 -0
  151. package/dist/src/asset/loaders/image/tga_Loader.js +116 -0
  152. package/dist/src/asset/loaders/image/tga_Loader.js.map +1 -0
  153. package/dist/src/asset/loaders/image/webimage_loader.js +63 -0
  154. package/dist/src/asset/loaders/image/webimage_loader.js.map +1 -0
  155. package/dist/src/asset/loaders/loader.js +45 -0
  156. package/dist/src/asset/loaders/loader.js.map +1 -0
  157. package/dist/src/asset/model.js +414 -0
  158. package/dist/src/asset/model.js.map +1 -0
  159. package/dist/src/blitter/bilateralblur.js +221 -0
  160. package/dist/src/blitter/bilateralblur.js.map +1 -0
  161. package/dist/src/blitter/blitter.js +390 -0
  162. package/dist/src/blitter/blitter.js.map +1 -0
  163. package/dist/src/blitter/box.js +118 -0
  164. package/dist/src/blitter/box.js.map +1 -0
  165. package/dist/src/blitter/copy.js +22 -0
  166. package/dist/src/blitter/copy.js.map +1 -0
  167. package/dist/src/blitter/gaussianblur.js +228 -0
  168. package/dist/src/blitter/gaussianblur.js.map +1 -0
  169. package/dist/src/camera/base.js +92 -0
  170. package/dist/src/camera/base.js.map +1 -0
  171. package/dist/src/camera/camera.js +1005 -0
  172. package/dist/src/camera/camera.js.map +1 -0
  173. package/dist/src/camera/fps.js +238 -0
  174. package/dist/src/camera/fps.js.map +1 -0
  175. package/dist/src/camera/orbit.js +245 -0
  176. package/dist/src/camera/orbit.js.map +1 -0
  177. package/dist/src/camera/orthocamera.js +167 -0
  178. package/dist/src/camera/orthocamera.js.map +1 -0
  179. package/dist/src/camera/perspectivecamera.js +141 -0
  180. package/dist/src/camera/perspectivecamera.js.map +1 -0
  181. package/dist/src/index.js +120 -0
  182. package/dist/src/index.js.map +1 -0
  183. package/dist/src/material/blinn.js +81 -0
  184. package/dist/src/material/blinn.js.map +1 -0
  185. package/dist/src/material/grassmaterial.js +113 -0
  186. package/dist/src/material/grassmaterial.js.map +1 -0
  187. package/dist/src/material/lambert.js +92 -0
  188. package/dist/src/material/lambert.js.map +1 -0
  189. package/dist/src/material/material.js +301 -0
  190. package/dist/src/material/material.js.map +1 -0
  191. package/dist/src/material/meshmaterial.js +704 -0
  192. package/dist/src/material/meshmaterial.js.map +1 -0
  193. package/dist/src/material/mixins/albedocolor.js +76 -0
  194. package/dist/src/material/mixins/albedocolor.js.map +1 -0
  195. package/dist/src/material/mixins/foliage.js +47 -0
  196. package/dist/src/material/mixins/foliage.js.map +1 -0
  197. package/dist/src/material/mixins/lightmodel/blinnphong.js +112 -0
  198. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +1 -0
  199. package/dist/src/material/mixins/lightmodel/lambert.js +58 -0
  200. package/dist/src/material/mixins/lightmodel/lambert.js.map +1 -0
  201. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +178 -0
  202. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -0
  203. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +139 -0
  204. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -0
  205. package/dist/src/material/mixins/lit.js +476 -0
  206. package/dist/src/material/mixins/lit.js.map +1 -0
  207. package/dist/src/material/mixins/pbr/common.js +918 -0
  208. package/dist/src/material/mixins/pbr/common.js.map +1 -0
  209. package/dist/src/material/mixins/texture.js +172 -0
  210. package/dist/src/material/mixins/texture.js.map +1 -0
  211. package/dist/src/material/mixins/vertexcolor.js +56 -0
  212. package/dist/src/material/mixins/vertexcolor.js.map +1 -0
  213. package/dist/src/material/particle.js +178 -0
  214. package/dist/src/material/particle.js.map +1 -0
  215. package/dist/src/material/pbrmr.js +97 -0
  216. package/dist/src/material/pbrmr.js.map +1 -0
  217. package/dist/src/material/pbrsg.js +97 -0
  218. package/dist/src/material/pbrsg.js.map +1 -0
  219. package/dist/src/material/shader/helper.js +1209 -0
  220. package/dist/src/material/shader/helper.js.map +1 -0
  221. package/dist/src/material/terrain-cm.js +606 -0
  222. package/dist/src/material/terrain-cm.js.map +1 -0
  223. package/dist/src/material/terrainmaterial.js +375 -0
  224. package/dist/src/material/terrainmaterial.js.map +1 -0
  225. package/dist/src/material/unlit.js +41 -0
  226. package/dist/src/material/unlit.js.map +1 -0
  227. package/dist/src/material/water.js +417 -0
  228. package/dist/src/material/water.js.map +1 -0
  229. package/dist/src/posteffect/bloom.js +361 -0
  230. package/dist/src/posteffect/bloom.js.map +1 -0
  231. package/dist/src/posteffect/compositor.js +226 -0
  232. package/dist/src/posteffect/compositor.js.map +1 -0
  233. package/dist/src/posteffect/fxaa.js +273 -0
  234. package/dist/src/posteffect/fxaa.js.map +1 -0
  235. package/dist/src/posteffect/grayscale.js +69 -0
  236. package/dist/src/posteffect/grayscale.js.map +1 -0
  237. package/dist/src/posteffect/motionblur.js +96 -0
  238. package/dist/src/posteffect/motionblur.js.map +1 -0
  239. package/dist/src/posteffect/posteffect.js +126 -0
  240. package/dist/src/posteffect/posteffect.js.map +1 -0
  241. package/dist/src/posteffect/sao.js +324 -0
  242. package/dist/src/posteffect/sao.js.map +1 -0
  243. package/dist/src/posteffect/ssr.js +489 -0
  244. package/dist/src/posteffect/ssr.js.map +1 -0
  245. package/dist/src/posteffect/taa.js +172 -0
  246. package/dist/src/posteffect/taa.js.map +1 -0
  247. package/dist/src/posteffect/tonemap.js +94 -0
  248. package/dist/src/posteffect/tonemap.js.map +1 -0
  249. package/dist/src/render/abuffer_oit.js +361 -0
  250. package/dist/src/render/abuffer_oit.js.map +1 -0
  251. package/dist/src/render/clipmap.js +851 -0
  252. package/dist/src/render/clipmap.js.map +1 -0
  253. package/dist/src/render/cluster_light.js +333 -0
  254. package/dist/src/render/cluster_light.js.map +1 -0
  255. package/dist/src/render/cull_visitor.js +187 -0
  256. package/dist/src/render/cull_visitor.js.map +1 -0
  257. package/dist/src/render/depthpass.js +68 -0
  258. package/dist/src/render/depthpass.js.map +1 -0
  259. package/dist/src/render/drawable_mixin.js +227 -0
  260. package/dist/src/render/drawable_mixin.js.map +1 -0
  261. package/dist/src/render/envlight.js +463 -0
  262. package/dist/src/render/envlight.js.map +1 -0
  263. package/dist/src/render/fbm_wavegenerator.js +251 -0
  264. package/dist/src/render/fbm_wavegenerator.js.map +1 -0
  265. package/dist/src/render/fft_wavegenerator.js +1006 -0
  266. package/dist/src/render/fft_wavegenerator.js.map +1 -0
  267. package/dist/src/render/fullscreenquad.js +38 -0
  268. package/dist/src/render/fullscreenquad.js.map +1 -0
  269. package/dist/src/render/gerstner_wavegenerator.js +314 -0
  270. package/dist/src/render/gerstner_wavegenerator.js.map +1 -0
  271. package/dist/src/render/globalbindgroup_allocator.js +60 -0
  272. package/dist/src/render/globalbindgroup_allocator.js.map +1 -0
  273. package/dist/src/render/hzb.js +273 -0
  274. package/dist/src/render/hzb.js.map +1 -0
  275. package/dist/src/render/lightpass.js +172 -0
  276. package/dist/src/render/lightpass.js.map +1 -0
  277. package/dist/src/render/objectcolorpass.js +51 -0
  278. package/dist/src/render/objectcolorpass.js.map +1 -0
  279. package/dist/src/render/primitive.js +364 -0
  280. package/dist/src/render/primitive.js.map +1 -0
  281. package/dist/src/render/render_queue.js +467 -0
  282. package/dist/src/render/render_queue.js.map +1 -0
  283. package/dist/src/render/renderbundle_wrapper.js +152 -0
  284. package/dist/src/render/renderbundle_wrapper.js.map +1 -0
  285. package/dist/src/render/renderer.js +455 -0
  286. package/dist/src/render/renderer.js.map +1 -0
  287. package/dist/src/render/renderpass.js +200 -0
  288. package/dist/src/render/renderpass.js.map +1 -0
  289. package/dist/src/render/shadowmap_pass.js +56 -0
  290. package/dist/src/render/shadowmap_pass.js.map +1 -0
  291. package/dist/src/render/sky.js +1103 -0
  292. package/dist/src/render/sky.js.map +1 -0
  293. package/dist/src/render/weightedblended_oit.js +168 -0
  294. package/dist/src/render/weightedblended_oit.js.map +1 -0
  295. package/dist/src/scene/batchgroup.js +162 -0
  296. package/dist/src/scene/batchgroup.js.map +1 -0
  297. package/dist/src/scene/environment.js +209 -0
  298. package/dist/src/scene/environment.js.map +1 -0
  299. package/dist/src/scene/graph_node.js +72 -0
  300. package/dist/src/scene/graph_node.js.map +1 -0
  301. package/dist/src/scene/light.js +416 -0
  302. package/dist/src/scene/light.js.map +1 -0
  303. package/dist/src/scene/mesh.js +341 -0
  304. package/dist/src/scene/mesh.js.map +1 -0
  305. package/dist/src/scene/octree.js +649 -0
  306. package/dist/src/scene/octree.js.map +1 -0
  307. package/dist/src/scene/particlesys.js +738 -0
  308. package/dist/src/scene/particlesys.js.map +1 -0
  309. package/dist/src/scene/raycast_visitor.js +103 -0
  310. package/dist/src/scene/raycast_visitor.js.map +1 -0
  311. package/dist/src/scene/scene.js +284 -0
  312. package/dist/src/scene/scene.js.map +1 -0
  313. package/dist/src/scene/scene_node.js +732 -0
  314. package/dist/src/scene/scene_node.js.map +1 -0
  315. package/dist/src/scene/terrain/grass.js +278 -0
  316. package/dist/src/scene/terrain/grass.js.map +1 -0
  317. package/dist/src/scene/terrain/heightfield.js +475 -0
  318. package/dist/src/scene/terrain/heightfield.js.map +1 -0
  319. package/dist/src/scene/terrain/patch.js +530 -0
  320. package/dist/src/scene/terrain/patch.js.map +1 -0
  321. package/dist/src/scene/terrain/quadtree.js +461 -0
  322. package/dist/src/scene/terrain/quadtree.js.map +1 -0
  323. package/dist/src/scene/terrain/terrain.js +246 -0
  324. package/dist/src/scene/terrain/terrain.js.map +1 -0
  325. package/dist/src/scene/terrain-cm/grass.js +594 -0
  326. package/dist/src/scene/terrain-cm/grass.js.map +1 -0
  327. package/dist/src/scene/terrain-cm/grassmaterial.js +159 -0
  328. package/dist/src/scene/terrain-cm/grassmaterial.js.map +1 -0
  329. package/dist/src/scene/terrain-cm/terrain-cm.js +538 -0
  330. package/dist/src/scene/terrain-cm/terrain-cm.js.map +1 -0
  331. package/dist/src/scene/water.js +374 -0
  332. package/dist/src/scene/water.js.map +1 -0
  333. package/dist/src/shaders/atmosphere.js +957 -0
  334. package/dist/src/shaders/atmosphere.js.map +1 -0
  335. package/dist/src/shaders/fog.js +112 -0
  336. package/dist/src/shaders/fog.js.map +1 -0
  337. package/dist/src/shaders/misc.js +266 -0
  338. package/dist/src/shaders/misc.js.map +1 -0
  339. package/dist/src/shaders/noise.js +222 -0
  340. package/dist/src/shaders/noise.js.map +1 -0
  341. package/dist/src/shaders/pbr.js +51 -0
  342. package/dist/src/shaders/pbr.js.map +1 -0
  343. package/dist/src/shaders/shadow.js +636 -0
  344. package/dist/src/shaders/shadow.js.map +1 -0
  345. package/dist/src/shaders/ssr.js +490 -0
  346. package/dist/src/shaders/ssr.js.map +1 -0
  347. package/dist/src/shaders/temporal.js +215 -0
  348. package/dist/src/shaders/temporal.js.map +1 -0
  349. package/dist/src/shaders/water.js +756 -0
  350. package/dist/src/shaders/water.js.map +1 -0
  351. package/dist/src/shadow/esm.js +237 -0
  352. package/dist/src/shadow/esm.js.map +1 -0
  353. package/dist/src/shadow/pcf_opt.js +181 -0
  354. package/dist/src/shadow/pcf_opt.js.map +1 -0
  355. package/dist/src/shadow/pcf_pd.js +189 -0
  356. package/dist/src/shadow/pcf_pd.js.map +1 -0
  357. package/dist/src/shadow/shader.js +37 -0
  358. package/dist/src/shadow/shader.js.map +1 -0
  359. package/dist/src/shadow/shadow_impl.js +15 -0
  360. package/dist/src/shadow/shadow_impl.js.map +1 -0
  361. package/dist/src/shadow/shadowmapper.js +790 -0
  362. package/dist/src/shadow/shadowmapper.js.map +1 -0
  363. package/dist/src/shadow/ssm.js +159 -0
  364. package/dist/src/shadow/ssm.js.map +1 -0
  365. package/dist/src/shadow/vsm.js +297 -0
  366. package/dist/src/shadow/vsm.js.map +1 -0
  367. package/dist/src/shapes/box.js +386 -0
  368. package/dist/src/shapes/box.js.map +1 -0
  369. package/dist/src/shapes/cylinder.js +125 -0
  370. package/dist/src/shapes/cylinder.js.map +1 -0
  371. package/dist/src/shapes/plane.js +88 -0
  372. package/dist/src/shapes/plane.js.map +1 -0
  373. package/dist/src/shapes/shape.js +87 -0
  374. package/dist/src/shapes/shape.js.map +1 -0
  375. package/dist/src/shapes/sphere.js +114 -0
  376. package/dist/src/shapes/sphere.js.map +1 -0
  377. package/dist/src/shapes/tetrahedron.js +188 -0
  378. package/dist/src/shapes/tetrahedron.js.map +1 -0
  379. package/dist/src/shapes/torus.js +111 -0
  380. package/dist/src/shapes/torus.js.map +1 -0
  381. package/dist/src/utility/aabbtree.js +400 -0
  382. package/dist/src/utility/aabbtree.js.map +1 -0
  383. package/dist/src/utility/bounding_volume.js +29 -0
  384. package/dist/src/utility/bounding_volume.js.map +1 -0
  385. package/dist/src/utility/debug.js +28 -0
  386. package/dist/src/utility/debug.js.map +1 -0
  387. package/dist/src/utility/draco/decoder.js +116 -0
  388. package/dist/src/utility/draco/decoder.js.map +1 -0
  389. package/dist/src/utility/misc.js +105 -0
  390. package/dist/src/utility/misc.js.map +1 -0
  391. package/dist/src/utility/panorama.js +163 -0
  392. package/dist/src/utility/panorama.js.map +1 -0
  393. package/dist/src/utility/pmrem.js +354 -0
  394. package/dist/src/utility/pmrem.js.map +1 -0
  395. package/dist/src/utility/rendermipmap.js +115 -0
  396. package/dist/src/utility/rendermipmap.js.map +1 -0
  397. package/dist/src/utility/serialization/json.js +402 -0
  398. package/dist/src/utility/serialization/json.js.map +1 -0
  399. package/dist/src/utility/serialization/manager.js +623 -0
  400. package/dist/src/utility/serialization/manager.js.map +1 -0
  401. package/dist/src/utility/serialization/scene/animation.js +248 -0
  402. package/dist/src/utility/serialization/scene/animation.js.map +1 -0
  403. package/dist/src/utility/serialization/scene/batch.js +59 -0
  404. package/dist/src/utility/serialization/scene/batch.js.map +1 -0
  405. package/dist/src/utility/serialization/scene/camera.js +790 -0
  406. package/dist/src/utility/serialization/scene/camera.js.map +1 -0
  407. package/dist/src/utility/serialization/scene/common.js +222 -0
  408. package/dist/src/utility/serialization/scene/common.js.map +1 -0
  409. package/dist/src/utility/serialization/scene/light.js +575 -0
  410. package/dist/src/utility/serialization/scene/light.js.map +1 -0
  411. package/dist/src/utility/serialization/scene/material.js +1111 -0
  412. package/dist/src/utility/serialization/scene/material.js.map +1 -0
  413. package/dist/src/utility/serialization/scene/mesh.js +148 -0
  414. package/dist/src/utility/serialization/scene/mesh.js.map +1 -0
  415. package/dist/src/utility/serialization/scene/misc.js +39 -0
  416. package/dist/src/utility/serialization/scene/misc.js.map +1 -0
  417. package/dist/src/utility/serialization/scene/node.js +451 -0
  418. package/dist/src/utility/serialization/scene/node.js.map +1 -0
  419. package/dist/src/utility/serialization/scene/particle.js +425 -0
  420. package/dist/src/utility/serialization/scene/particle.js.map +1 -0
  421. package/dist/src/utility/serialization/scene/primitive.js +692 -0
  422. package/dist/src/utility/serialization/scene/primitive.js.map +1 -0
  423. package/dist/src/utility/serialization/scene/scene.js +704 -0
  424. package/dist/src/utility/serialization/scene/scene.js.map +1 -0
  425. package/dist/src/utility/serialization/scene/terrain.js +488 -0
  426. package/dist/src/utility/serialization/scene/terrain.js.map +1 -0
  427. package/dist/src/utility/serialization/scene/water.js +465 -0
  428. package/dist/src/utility/serialization/scene/water.js.map +1 -0
  429. package/dist/src/utility/shprojector.js +297 -0
  430. package/dist/src/utility/shprojector.js.map +1 -0
  431. package/dist/src/utility/textures/ggxlut.js +213 -0
  432. package/dist/src/utility/textures/ggxlut.js.map +1 -0
  433. package/dist/src/utility/textures/gradientnoise.js +62 -0
  434. package/dist/src/utility/textures/gradientnoise.js.map +1 -0
  435. package/dist/src/utility/textures/randomnoise.js +41 -0
  436. package/dist/src/utility/textures/randomnoise.js.map +1 -0
  437. package/dist/src/values.js +162 -0
  438. package/dist/src/values.js.map +1 -0
  439. package/dist/text/font/font_asset.js +884 -0
  440. package/dist/text/font/font_asset.js.map +1 -0
  441. package/dist/text/font/sfnt_reader.js +43 -0
  442. package/dist/text/font/sfnt_reader.js.map +1 -0
  443. package/dist/text/msdf/generator.js +417 -0
  444. package/dist/text/msdf/generator.js.map +1 -0
  445. package/dist/text/msdf/shape.js +143 -0
  446. package/dist/text/msdf/shape.js.map +1 -0
  447. package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
  448. package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
  449. package/dist/text/runtime/msdf_text_atlas_manager.js +47 -0
  450. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
  451. package/dist/text/runtime/text_layout.js +96 -0
  452. package/dist/text/runtime/text_layout.js.map +1 -0
  453. package/dist/utility/blueprint/material/common.js +7 -0
  454. package/dist/utility/blueprint/material/common.js.map +1 -0
  455. package/dist/utility/blueprint/material/inputs.js +1275 -1091
  456. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  457. package/dist/utility/blueprint/material/ir.js +505 -490
  458. package/dist/utility/blueprint/material/ir.js.map +1 -1
  459. package/dist/utility/blueprint/material/pbr.js +32 -0
  460. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  461. package/dist/utility/serialization/blueprint/constants.js +255 -0
  462. package/dist/utility/serialization/blueprint/constants.js.map +1 -0
  463. package/dist/utility/serialization/blueprint/material/constants.js +203 -0
  464. package/dist/utility/serialization/blueprint/material/constants.js.map +1 -0
  465. package/dist/utility/serialization/blueprint/material/texture.js +165 -0
  466. package/dist/utility/serialization/blueprint/material/texture.js.map +1 -0
  467. package/dist/utility/serialization/manager.js +55 -11
  468. package/dist/utility/serialization/manager.js.map +1 -1
  469. package/dist/utility/serialization/scene/animation.js +2 -0
  470. package/dist/utility/serialization/scene/animation.js.map +1 -1
  471. package/dist/utility/serialization/scene/batch.js +2 -0
  472. package/dist/utility/serialization/scene/batch.js.map +1 -1
  473. package/dist/utility/serialization/scene/camera.js +2 -0
  474. package/dist/utility/serialization/scene/camera.js.map +1 -1
  475. package/dist/utility/serialization/scene/common.js.map +1 -1
  476. package/dist/utility/serialization/scene/light.js +2 -0
  477. package/dist/utility/serialization/scene/light.js.map +1 -1
  478. package/dist/utility/serialization/scene/material.js +1 -0
  479. package/dist/utility/serialization/scene/material.js.map +1 -1
  480. package/dist/utility/serialization/scene/mesh.js +2 -0
  481. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  482. package/dist/utility/serialization/scene/node.js +2 -0
  483. package/dist/utility/serialization/scene/node.js.map +1 -1
  484. package/dist/utility/serialization/scene/particle.js +2 -0
  485. package/dist/utility/serialization/scene/particle.js.map +1 -1
  486. package/dist/utility/serialization/scene/primitive.js +1 -0
  487. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  488. package/dist/utility/serialization/scene/scene.js.map +1 -1
  489. package/dist/utility/serialization/scene/sprite.js +2 -0
  490. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  491. package/dist/utility/serialization/scene/terrain.js +2 -0
  492. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  493. package/dist/utility/serialization/scene/text.js +516 -0
  494. package/dist/utility/serialization/scene/text.js.map +1 -0
  495. package/dist/utility/serialization/scene/water.js +2 -0
  496. package/dist/utility/serialization/scene/water.js.map +1 -1
  497. package/dist/utility/serialization/types.js +4 -4
  498. package/dist/utility/serialization/types.js.map +1 -1
  499. package/dist/values.js +1 -5
  500. package/dist/values.js.map +1 -1
  501. package/package.json +3 -3
  502. package/dist/animation/joint_dynamics/vrm_spring_bone.js +0 -46
  503. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +0 -1
  504. package/dist/animation/spring/spring_bone.js +0 -240
  505. package/dist/animation/spring/spring_bone.js.map +0 -1
  506. package/dist/animation/spring/spring_bone_collider.js +0 -198
  507. package/dist/animation/spring/spring_bone_collider.js.map +0 -1
  508. package/dist/animation/spring/spring_bone_constraint.js +0 -170
  509. package/dist/animation/spring/spring_bone_constraint.js.map +0 -1
  510. package/dist/animation/spring/spring_bone_system.js +0 -328
  511. package/dist/animation/spring/spring_bone_system.js.map +0 -1
  512. package/dist/render/sky_motion_vector.js +0 -85
  513. package/dist/render/sky_motion_vector.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font_asset.js","sources":["../../../src/text/font/font_asset.ts"],"sourcesContent":["import { SFNTReader } from './sfnt_reader';\r\nimport type { FontMetrics, GlyphContour, GlyphData, GlyphPoint } from './types';\r\n\r\nexport type FontAssetFetchOptions = {\r\n pageSize?: number;\r\n glyphSize?: number;\r\n};\r\n\r\nexport type FontAssetMSDFAtlasSettings = Readonly<{\r\n pageSize: number;\r\n glyphSize: number;\r\n}>;\r\n\r\ntype TableRecord = {\r\n offset: number;\r\n length: number;\r\n};\r\n\r\ntype GlyphHeader = {\r\n numberOfContours: number;\r\n xMin: number;\r\n yMin: number;\r\n xMax: number;\r\n yMax: number;\r\n};\r\n\r\ntype CompositeComponent = {\r\n glyphIndex: number;\r\n dx: number;\r\n dy: number;\r\n xx: number;\r\n xy: number;\r\n yx: number;\r\n yy: number;\r\n};\r\n\r\ntype CoverageTable =\r\n | { format: 1; glyphs: Uint16Array<ArrayBuffer> }\r\n | { format: 2; ranges: { start: number; end: number; startIndex: number }[] };\r\n\r\ntype ClassDefTable =\r\n | { format: 1; startGlyphId: number; classes: Uint16Array<ArrayBuffer> }\r\n | { format: 2; ranges: { start: number; end: number; classId: number }[] };\r\n\r\ntype GPOSPairSubtable =\r\n | {\r\n kind: 'format1';\r\n coverage: CoverageTable;\r\n pairs: Map<number, Map<number, PairAdjustment>>;\r\n }\r\n | {\r\n kind: 'format2';\r\n coverage: CoverageTable;\r\n classDef1: ClassDefTable;\r\n classDef2: ClassDefTable;\r\n class1Count: number;\r\n class2Count: number;\r\n values: PairAdjustment[];\r\n };\r\n\r\n/**\r\n * Minimal horizontal pair adjustment extracted from GPOS.\r\n *\r\n * @public\r\n */\r\nexport type PairAdjustment = {\r\n firstXPlacement: number;\r\n firstXAdvance: number;\r\n secondXPlacement: number;\r\n secondXAdvance: number;\r\n};\r\n\r\nconst ARG_1_AND_2_ARE_WORDS = 1 << 0;\r\nconst ARGS_ARE_XY_VALUES = 1 << 1;\r\nconst WE_HAVE_A_SCALE = 1 << 3;\r\nconst MORE_COMPONENTS = 1 << 5;\r\nconst WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;\r\nconst WE_HAVE_A_TWO_BY_TWO = 1 << 7;\r\nconst DEFAULT_MSDF_ATLAS_PAGE_SIZE = 1024;\r\nconst DEFAULT_MSDF_GLYPH_SIZE = 32;\r\n\r\n/**\r\n * Minimal runtime font asset for TrueType outlines.\r\n *\r\n * @public\r\n */\r\nexport class FontAsset {\r\n private readonly _reader: SFNTReader;\r\n private readonly _tables: Map<string, TableRecord>;\r\n private readonly _glyphOffsets: Uint32Array<ArrayBuffer>;\r\n private readonly _advanceWidths: Uint16Array<ArrayBuffer>;\r\n private readonly _leftSideBearings: Int16Array<ArrayBuffer>;\r\n private readonly _glyphCache: Map<number, GlyphData | null>;\r\n private readonly _cmapFormat4: { offset: number; platformId: number; encodingId: number } | null;\r\n private readonly _cmapFormat12: { offset: number; platformId: number; encodingId: number } | null;\r\n private readonly _kernPairs: Map<number, number>;\r\n private readonly _gposPairs: GPOSPairSubtable[];\r\n private readonly _metrics: FontMetrics;\r\n private readonly _numberOfHMetrics: number;\r\n private readonly _msdfAtlasSettings: FontAssetMSDFAtlasSettings;\r\n private constructor(buffer: ArrayBuffer, options?: FontAssetFetchOptions) {\r\n this._reader = new SFNTReader(buffer);\r\n this._tables = parseTableDirectory(this._reader);\r\n const head = this.requireTable('head');\r\n const maxp = this.requireTable('maxp');\r\n const hhea = this.requireTable('hhea');\r\n const hmtx = this.requireTable('hmtx');\r\n const loca = this.requireTable('loca');\r\n this.requireTable('glyf');\r\n this.requireTable('cmap');\r\n this._numberOfHMetrics = this._reader.uint16(hhea.offset + 34);\r\n this._metrics = {\r\n unitsPerEm: this._reader.uint16(head.offset + 18),\r\n ascent: this._reader.int16(hhea.offset + 4),\r\n descent: this._reader.int16(hhea.offset + 6),\r\n lineGap: this._reader.int16(hhea.offset + 8),\r\n glyphCount: this._reader.uint16(maxp.offset + 4)\r\n };\r\n this._glyphOffsets = parseGlyphOffsets(\r\n this._reader,\r\n loca.offset,\r\n this._metrics.glyphCount,\r\n this._reader.int16(head.offset + 50)\r\n );\r\n const metrics = parseHorizontalMetrics(\r\n this._reader,\r\n hmtx.offset,\r\n this._metrics.glyphCount,\r\n this._numberOfHMetrics\r\n );\r\n this._advanceWidths = metrics.advanceWidths;\r\n this._leftSideBearings = metrics.leftSideBearings;\r\n const cmap = parseBestCMap(this._reader, this.requireTable('cmap').offset);\r\n this._cmapFormat4 = cmap.format4;\r\n this._cmapFormat12 = cmap.format12;\r\n this._kernPairs = parseKernPairs(this._reader, this.getTable('kern'));\r\n this._gposPairs = parseGPOSPairs(this._reader, this.getTable('GPOS'));\r\n this._glyphCache = new Map();\r\n this._msdfAtlasSettings = Object.freeze({\r\n pageSize: normalizeMSDFAtlasPageSize(options?.pageSize),\r\n glyphSize: normalizeMSDFGlyphSize(options?.glyphSize)\r\n });\r\n }\r\n static fromBuffer(buffer: ArrayBuffer, options?: FontAssetFetchOptions) {\r\n return new FontAsset(buffer, options);\r\n }\r\n get metrics(): FontMetrics {\r\n return this._metrics;\r\n }\r\n get msdfAtlasSettings(): FontAssetMSDFAtlasSettings {\r\n return this._msdfAtlasSettings;\r\n }\r\n get msdfAtlasPageSize() {\r\n return this._msdfAtlasSettings.pageSize;\r\n }\r\n get msdfGlyphSize() {\r\n return this._msdfAtlasSettings.glyphSize;\r\n }\r\n getGlyphIndex(codePoint: number) {\r\n if (this._cmapFormat12) {\r\n const glyphIndex = lookupCMapFormat12(this._reader, this._cmapFormat12.offset, codePoint);\r\n if (glyphIndex !== 0) {\r\n return glyphIndex;\r\n }\r\n }\r\n if (this._cmapFormat4 && codePoint <= 0xffff) {\r\n return lookupCMapFormat4(this._reader, this._cmapFormat4.offset, codePoint);\r\n }\r\n return 0;\r\n }\r\n getKerning(leftGlyphIndex: number, rightGlyphIndex: number) {\r\n const gpos = this.getPairAdjustment(leftGlyphIndex, rightGlyphIndex);\r\n if (gpos) {\r\n return gpos.firstXAdvance + gpos.secondXAdvance;\r\n }\r\n return this._kernPairs.get((leftGlyphIndex << 16) | rightGlyphIndex) ?? 0;\r\n }\r\n getPairAdjustment(leftGlyphIndex: number, rightGlyphIndex: number): PairAdjustment | null {\r\n return lookupGPOSPair(this._gposPairs, leftGlyphIndex, rightGlyphIndex);\r\n }\r\n getGlyph(glyphIndex: number): GlyphData | null {\r\n if (glyphIndex < 0 || glyphIndex >= this._metrics.glyphCount) {\r\n return null;\r\n }\r\n if (this._glyphCache.has(glyphIndex)) {\r\n return this._glyphCache.get(glyphIndex)!;\r\n }\r\n const glyph = this.loadGlyph(glyphIndex, 0);\r\n this._glyphCache.set(glyphIndex, glyph);\r\n return glyph;\r\n }\r\n private getTable(tag: string) {\r\n return this._tables.get(tag) ?? null;\r\n }\r\n private requireTable(tag: string) {\r\n const table = this.getTable(tag);\r\n if (!table) {\r\n throw new Error(`Font table not found: ${tag}`);\r\n }\r\n return table;\r\n }\r\n private loadGlyph(glyphIndex: number, depth: number): GlyphData | null {\r\n if (depth > 16) {\r\n throw new Error(`Composite glyph nesting too deep: ${glyphIndex}`);\r\n }\r\n const glyf = this.requireTable('glyf');\r\n const offset = this._glyphOffsets[glyphIndex];\r\n const nextOffset = this._glyphOffsets[glyphIndex + 1];\r\n if (offset === nextOffset) {\r\n return buildGlyphData(glyphIndex, this._advanceWidths, this._leftSideBearings, [], 0, 0, 0, 0);\r\n }\r\n const glyphOffset = glyf.offset + offset;\r\n const header = parseGlyphHeader(this._reader, glyphOffset);\r\n if (header.numberOfContours >= 0) {\r\n const contours = parseSimpleGlyph(this._reader, glyphOffset, header.numberOfContours);\r\n return buildGlyphData(\r\n glyphIndex,\r\n this._advanceWidths,\r\n this._leftSideBearings,\r\n contours,\r\n header.xMin,\r\n header.yMin,\r\n header.xMax,\r\n header.yMax\r\n );\r\n }\r\n const contours = parseCompositeGlyph(this._reader, glyphOffset, (childIndex) =>\r\n this.loadGlyph(childIndex, depth + 1)\r\n );\r\n const bounds = computeBounds(contours);\r\n return buildGlyphData(\r\n glyphIndex,\r\n this._advanceWidths,\r\n this._leftSideBearings,\r\n contours,\r\n bounds.xMin,\r\n bounds.yMin,\r\n bounds.xMax,\r\n bounds.yMax\r\n );\r\n }\r\n}\r\n\r\nfunction parseTableDirectory(reader: SFNTReader) {\r\n const numTables = reader.uint16(4);\r\n const tables = new Map<string, TableRecord>();\r\n let offset = 12;\r\n for (let i = 0; i < numTables; i++) {\r\n const tag = reader.tag(offset);\r\n tables.set(tag, {\r\n offset: reader.uint32(offset + 8),\r\n length: reader.uint32(offset + 12)\r\n });\r\n offset += 16;\r\n }\r\n return tables;\r\n}\r\n\r\nfunction parseGlyphOffsets(reader: SFNTReader, offset: number, glyphCount: number, indexToLocFormat: number) {\r\n const result = new Uint32Array(glyphCount + 1);\r\n if (indexToLocFormat === 0) {\r\n for (let i = 0; i <= glyphCount; i++) {\r\n result[i] = reader.uint16(offset + i * 2) * 2;\r\n }\r\n } else {\r\n for (let i = 0; i <= glyphCount; i++) {\r\n result[i] = reader.uint32(offset + i * 4);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseHorizontalMetrics(\r\n reader: SFNTReader,\r\n offset: number,\r\n glyphCount: number,\r\n numberOfHMetrics: number\r\n) {\r\n const advanceWidths = new Uint16Array(glyphCount);\r\n const leftSideBearings = new Int16Array(glyphCount);\r\n let cursor = offset;\r\n let lastAdvanceWidth = 0;\r\n for (let i = 0; i < glyphCount; i++) {\r\n if (i < numberOfHMetrics) {\r\n lastAdvanceWidth = reader.uint16(cursor);\r\n advanceWidths[i] = lastAdvanceWidth;\r\n leftSideBearings[i] = reader.int16(cursor + 2);\r\n cursor += 4;\r\n } else {\r\n advanceWidths[i] = lastAdvanceWidth;\r\n leftSideBearings[i] = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n }\r\n return { advanceWidths, leftSideBearings };\r\n}\r\n\r\nfunction parseBestCMap(reader: SFNTReader, offset: number) {\r\n const numTables = reader.uint16(offset + 2);\r\n let format4: { offset: number; platformId: number; encodingId: number } | null = null;\r\n let format12: { offset: number; platformId: number; encodingId: number } | null = null;\r\n for (let i = 0; i < numTables; i++) {\r\n const recordOffset = offset + 4 + i * 8;\r\n const platformId = reader.uint16(recordOffset);\r\n const encodingId = reader.uint16(recordOffset + 2);\r\n const subtableOffset = offset + reader.uint32(recordOffset + 4);\r\n const format = reader.uint16(subtableOffset);\r\n if (format === 12) {\r\n if (!format12 || isPreferredCMap(platformId, encodingId, format12.platformId, format12.encodingId)) {\r\n format12 = { offset: subtableOffset, platformId, encodingId };\r\n }\r\n } else if (format === 4) {\r\n if (!format4 || isPreferredCMap(platformId, encodingId, format4.platformId, format4.encodingId)) {\r\n format4 = { offset: subtableOffset, platformId, encodingId };\r\n }\r\n }\r\n }\r\n return { format4, format12 };\r\n}\r\n\r\nfunction isPreferredCMap(\r\n platformId: number,\r\n encodingId: number,\r\n currentPlatformId: number,\r\n currentEncodingId: number\r\n) {\r\n const nextScore = getCMapScore(platformId, encodingId);\r\n const currentScore = getCMapScore(currentPlatformId, currentEncodingId);\r\n return nextScore > currentScore;\r\n}\r\n\r\nfunction getCMapScore(platformId: number, encodingId: number) {\r\n if (platformId === 3 && encodingId === 10) {\r\n return 5;\r\n }\r\n if (platformId === 0 && encodingId <= 6) {\r\n return 4;\r\n }\r\n if (platformId === 3 && encodingId === 1) {\r\n return 3;\r\n }\r\n if (platformId === 0) {\r\n return 2;\r\n }\r\n return 1;\r\n}\r\n\r\nfunction lookupCMapFormat12(reader: SFNTReader, offset: number, codePoint: number) {\r\n const nGroups = reader.uint32(offset + 12);\r\n let low = 0;\r\n let high = nGroups - 1;\r\n while (low <= high) {\r\n const mid = (low + high) >> 1;\r\n const groupOffset = offset + 16 + mid * 12;\r\n const startCharCode = reader.uint32(groupOffset);\r\n const endCharCode = reader.uint32(groupOffset + 4);\r\n if (codePoint < startCharCode) {\r\n high = mid - 1;\r\n } else if (codePoint > endCharCode) {\r\n low = mid + 1;\r\n } else {\r\n return reader.uint32(groupOffset + 8) + (codePoint - startCharCode);\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction lookupCMapFormat4(reader: SFNTReader, offset: number, codePoint: number) {\r\n const segCount = reader.uint16(offset + 6) >> 1;\r\n const endCodeOffset = offset + 14;\r\n const startCodeOffset = endCodeOffset + segCount * 2 + 2;\r\n const idDeltaOffset = startCodeOffset + segCount * 2;\r\n const idRangeOffsetOffset = idDeltaOffset + segCount * 2;\r\n for (let i = 0; i < segCount; i++) {\r\n const endCode = reader.uint16(endCodeOffset + i * 2);\r\n if (codePoint > endCode) {\r\n continue;\r\n }\r\n const startCode = reader.uint16(startCodeOffset + i * 2);\r\n if (codePoint < startCode) {\r\n return 0;\r\n }\r\n const idDelta = reader.int16(idDeltaOffset + i * 2);\r\n const idRangeOffset = reader.uint16(idRangeOffsetOffset + i * 2);\r\n if (idRangeOffset === 0) {\r\n return (codePoint + idDelta) & 0xffff;\r\n }\r\n const glyphIndexAddress = idRangeOffsetOffset + i * 2 + idRangeOffset + (codePoint - startCode) * 2;\r\n const glyphIndex = reader.uint16(glyphIndexAddress);\r\n return glyphIndex === 0 ? 0 : (glyphIndex + idDelta) & 0xffff;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseKernPairs(reader: SFNTReader, table: TableRecord | null) {\r\n const result = new Map<number, number>();\r\n if (!table || table.length < 4) {\r\n return result;\r\n }\r\n const version = reader.uint16(table.offset);\r\n if (version !== 0) {\r\n return result;\r\n }\r\n const nTables = reader.uint16(table.offset + 2);\r\n let cursor = table.offset + 4;\r\n for (let i = 0; i < nTables; i++) {\r\n const length = reader.uint16(cursor + 2);\r\n const coverage = reader.uint16(cursor + 4);\r\n const format = coverage >> 8;\r\n if (format === 0) {\r\n const nPairs = reader.uint16(cursor + 6);\r\n let pairOffset = cursor + 14;\r\n for (let j = 0; j < nPairs; j++) {\r\n const left = reader.uint16(pairOffset);\r\n const right = reader.uint16(pairOffset + 2);\r\n const value = reader.int16(pairOffset + 4);\r\n result.set((left << 16) | right, value);\r\n pairOffset += 6;\r\n }\r\n }\r\n cursor += length;\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseGPOSPairs(reader: SFNTReader, table: TableRecord | null) {\r\n if (!table || table.length < 10) {\r\n return [];\r\n }\r\n const majorVersion = reader.uint16(table.offset);\r\n if (majorVersion !== 1) {\r\n return [];\r\n }\r\n const featureListOffset = reader.uint16(table.offset + 6);\r\n const lookupListOffset = reader.uint16(table.offset + 8);\r\n if (!featureListOffset || !lookupListOffset) {\r\n return [];\r\n }\r\n const featureLookupIndices = collectGPOSFeatureLookupIndices(reader, table.offset + featureListOffset);\r\n if (featureLookupIndices.length === 0) {\r\n return [];\r\n }\r\n return parseGPOSLookupSubtables(\r\n reader,\r\n table.offset + lookupListOffset,\r\n table.offset,\r\n featureLookupIndices\r\n );\r\n}\r\n\r\nfunction collectGPOSFeatureLookupIndices(reader: SFNTReader, featureListOffset: number) {\r\n const featureCount = reader.uint16(featureListOffset);\r\n const featureTags = new Set(['kern']);\r\n const lookupIndices = new Set<number>();\r\n for (let i = 0; i < featureCount; i++) {\r\n const recordOffset = featureListOffset + 2 + i * 6;\r\n const tag = reader.tag(recordOffset);\r\n if (!featureTags.has(tag)) {\r\n continue;\r\n }\r\n const featureOffset = featureListOffset + reader.uint16(recordOffset + 4);\r\n const lookupIndexCount = reader.uint16(featureOffset + 2);\r\n for (let j = 0; j < lookupIndexCount; j++) {\r\n lookupIndices.add(reader.uint16(featureOffset + 4 + j * 2));\r\n }\r\n }\r\n return [...lookupIndices].sort((a, b) => a - b);\r\n}\r\n\r\nfunction parseGPOSLookupSubtables(\r\n reader: SFNTReader,\r\n lookupListOffset: number,\r\n gposOffset: number,\r\n lookupIndices: number[]\r\n) {\r\n const lookupCount = reader.uint16(lookupListOffset);\r\n const result: GPOSPairSubtable[] = [];\r\n for (const lookupIndex of lookupIndices) {\r\n if (lookupIndex >= lookupCount) {\r\n continue;\r\n }\r\n const lookupOffset = lookupListOffset + reader.uint16(lookupListOffset + 2 + lookupIndex * 2);\r\n const lookupType = reader.uint16(lookupOffset);\r\n const subtableCount = reader.uint16(lookupOffset + 4);\r\n for (let i = 0; i < subtableCount; i++) {\r\n const subtableOffset = lookupOffset + reader.uint16(lookupOffset + 6 + i * 2);\r\n if (lookupType === 2) {\r\n const parsed = parsePairPosSubtable(reader, subtableOffset);\r\n if (parsed) {\r\n result.push(parsed);\r\n }\r\n } else if (lookupType === 9) {\r\n const extensionLookupType = reader.uint16(subtableOffset + 2);\r\n const extensionOffset = reader.uint32(subtableOffset + 4);\r\n if (extensionLookupType === 2) {\r\n const parsed = parsePairPosSubtable(reader, subtableOffset + extensionOffset);\r\n if (parsed) {\r\n result.push(parsed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction parsePairPosSubtable(reader: SFNTReader, offset: number): GPOSPairSubtable | null {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n return parsePairPosFormat1(reader, offset);\r\n }\r\n if (format === 2) {\r\n return parsePairPosFormat2(reader, offset);\r\n }\r\n return null;\r\n}\r\n\r\nfunction parsePairPosFormat1(reader: SFNTReader, offset: number): GPOSPairSubtable {\r\n const coverage = parseCoverageTable(reader, offset + reader.uint16(offset + 2));\r\n const valueFormat1 = reader.uint16(offset + 4);\r\n const valueFormat2 = reader.uint16(offset + 6);\r\n const pairSetCount = reader.uint16(offset + 8);\r\n const pairs = new Map<number, Map<number, PairAdjustment>>();\r\n for (let i = 0; i < pairSetCount; i++) {\r\n const firstGlyph = getCoverageGlyph(coverage, i);\r\n if (firstGlyph < 0) {\r\n continue;\r\n }\r\n const pairSetOffset = offset + reader.uint16(offset + 10 + i * 2);\r\n const pairValueCount = reader.uint16(pairSetOffset);\r\n let cursor = pairSetOffset + 2;\r\n const secondMap = new Map<number, PairAdjustment>();\r\n for (let j = 0; j < pairValueCount; j++) {\r\n const secondGlyph = reader.uint16(cursor);\r\n cursor += 2;\r\n const value1 = readValueRecordX(reader, cursor, valueFormat1);\r\n cursor += getValueRecordSize(valueFormat1);\r\n const value2 = readValueRecordX(reader, cursor, valueFormat2);\r\n cursor += getValueRecordSize(valueFormat2);\r\n const adjustment = {\r\n firstXPlacement: value1.xPlacement,\r\n firstXAdvance: value1.xAdvance,\r\n secondXPlacement: value2.xPlacement,\r\n secondXAdvance: value2.xAdvance\r\n } satisfies PairAdjustment;\r\n if (\r\n adjustment.firstXPlacement !== 0 ||\r\n adjustment.firstXAdvance !== 0 ||\r\n adjustment.secondXPlacement !== 0 ||\r\n adjustment.secondXAdvance !== 0\r\n ) {\r\n secondMap.set(secondGlyph, adjustment);\r\n }\r\n }\r\n pairs.set(firstGlyph, secondMap);\r\n }\r\n return { kind: 'format1', coverage, pairs };\r\n}\r\n\r\nfunction parsePairPosFormat2(reader: SFNTReader, offset: number): GPOSPairSubtable {\r\n const coverage = parseCoverageTable(reader, offset + reader.uint16(offset + 2));\r\n const valueFormat1 = reader.uint16(offset + 4);\r\n const valueFormat2 = reader.uint16(offset + 6);\r\n const classDef1 = parseClassDefTable(reader, offset + reader.uint16(offset + 8));\r\n const classDef2 = parseClassDefTable(reader, offset + reader.uint16(offset + 10));\r\n const class1Count = reader.uint16(offset + 12);\r\n const class2Count = reader.uint16(offset + 14);\r\n const values: PairAdjustment[] = new Array(class1Count * class2Count);\r\n let cursor = offset + 16;\r\n for (let c1 = 0; c1 < class1Count; c1++) {\r\n for (let c2 = 0; c2 < class2Count; c2++) {\r\n const value1 = readValueRecordX(reader, cursor, valueFormat1);\r\n cursor += getValueRecordSize(valueFormat1);\r\n const value2 = readValueRecordX(reader, cursor, valueFormat2);\r\n cursor += getValueRecordSize(valueFormat2);\r\n values[c1 * class2Count + c2] = {\r\n firstXPlacement: value1.xPlacement,\r\n firstXAdvance: value1.xAdvance,\r\n secondXPlacement: value2.xPlacement,\r\n secondXAdvance: value2.xAdvance\r\n };\r\n }\r\n }\r\n return { kind: 'format2', coverage, classDef1, classDef2, class1Count, class2Count, values };\r\n}\r\n\r\nfunction parseCoverageTable(reader: SFNTReader, offset: number): CoverageTable {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n const glyphCount = reader.uint16(offset + 2);\r\n const glyphs = new Uint16Array(glyphCount);\r\n for (let i = 0; i < glyphCount; i++) {\r\n glyphs[i] = reader.uint16(offset + 4 + i * 2);\r\n }\r\n return { format: 1, glyphs };\r\n }\r\n const rangeCount = reader.uint16(offset + 2);\r\n const ranges: { start: number; end: number; startIndex: number }[] = [];\r\n for (let i = 0; i < rangeCount; i++) {\r\n const rangeOffset = offset + 4 + i * 6;\r\n ranges.push({\r\n start: reader.uint16(rangeOffset),\r\n end: reader.uint16(rangeOffset + 2),\r\n startIndex: reader.uint16(rangeOffset + 4)\r\n });\r\n }\r\n return { format: 2, ranges };\r\n}\r\n\r\nfunction getCoverageGlyph(coverage: CoverageTable, index: number) {\r\n if (coverage.format === 1) {\r\n return coverage.glyphs[index] ?? -1;\r\n }\r\n for (const range of coverage.ranges) {\r\n const rangeLength = range.end - range.start + 1;\r\n if (index >= range.startIndex && index < range.startIndex + rangeLength) {\r\n return range.start + (index - range.startIndex);\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction coverageContains(coverage: CoverageTable, glyphIndex: number) {\r\n if (coverage.format === 1) {\r\n return binarySearchU16(coverage.glyphs, glyphIndex) >= 0;\r\n }\r\n for (const range of coverage.ranges) {\r\n if (glyphIndex >= range.start && glyphIndex <= range.end) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction parseClassDefTable(reader: SFNTReader, offset: number): ClassDefTable {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n const startGlyphId = reader.uint16(offset + 2);\r\n const glyphCount = reader.uint16(offset + 4);\r\n const classes = new Uint16Array(glyphCount);\r\n for (let i = 0; i < glyphCount; i++) {\r\n classes[i] = reader.uint16(offset + 6 + i * 2);\r\n }\r\n return { format: 1, startGlyphId, classes };\r\n }\r\n const classRangeCount = reader.uint16(offset + 2);\r\n const ranges: { start: number; end: number; classId: number }[] = [];\r\n for (let i = 0; i < classRangeCount; i++) {\r\n const rangeOffset = offset + 4 + i * 6;\r\n ranges.push({\r\n start: reader.uint16(rangeOffset),\r\n end: reader.uint16(rangeOffset + 2),\r\n classId: reader.uint16(rangeOffset + 4)\r\n });\r\n }\r\n return { format: 2, ranges };\r\n}\r\n\r\nfunction getGlyphClass(classDef: ClassDefTable, glyphIndex: number) {\r\n if (classDef.format === 1) {\r\n const index = glyphIndex - classDef.startGlyphId;\r\n return index >= 0 && index < classDef.classes.length ? classDef.classes[index] : 0;\r\n }\r\n for (const range of classDef.ranges) {\r\n if (glyphIndex >= range.start && glyphIndex <= range.end) {\r\n return range.classId;\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction readValueRecordX(reader: SFNTReader, offset: number, valueFormat: number) {\r\n let cursor = offset;\r\n let xPlacement = 0;\r\n let xAdvance = 0;\r\n if (valueFormat & 0x0001) {\r\n xPlacement = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0002) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0004) {\r\n xAdvance = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0008) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0010) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0020) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0040) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0080) {\r\n cursor += 2;\r\n }\r\n return { xPlacement, xAdvance };\r\n}\r\n\r\nfunction getValueRecordSize(valueFormat: number) {\r\n let size = 0;\r\n for (let bit = 0; bit < 8; bit++) {\r\n if (valueFormat & (1 << bit)) {\r\n size += 2;\r\n }\r\n }\r\n return size;\r\n}\r\n\r\nfunction lookupGPOSPair(subtables: GPOSPairSubtable[], leftGlyphIndex: number, rightGlyphIndex: number) {\r\n let merged: PairAdjustment | null = null;\r\n for (const subtable of subtables) {\r\n if (!coverageContains(subtable.coverage, leftGlyphIndex)) {\r\n continue;\r\n }\r\n if (subtable.kind === 'format1') {\r\n const secondMap = subtable.pairs.get(leftGlyphIndex);\r\n if (secondMap) {\r\n const adjustment = secondMap.get(rightGlyphIndex);\r\n if (adjustment) {\r\n merged = mergePairAdjustment(merged, adjustment);\r\n }\r\n }\r\n } else {\r\n const class1 = getGlyphClass(subtable.classDef1, leftGlyphIndex);\r\n const class2 = getGlyphClass(subtable.classDef2, rightGlyphIndex);\r\n if (class1 < subtable.class1Count && class2 < subtable.class2Count) {\r\n const adjustment = subtable.values[class1 * subtable.class2Count + class2];\r\n if (adjustment) {\r\n merged = mergePairAdjustment(merged, adjustment);\r\n }\r\n }\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nfunction binarySearchU16(values: Uint16Array<ArrayBuffer>, target: number) {\r\n let low = 0;\r\n let high = values.length - 1;\r\n while (low <= high) {\r\n const mid = (low + high) >> 1;\r\n const value = values[mid];\r\n if (value < target) {\r\n low = mid + 1;\r\n } else if (value > target) {\r\n high = mid - 1;\r\n } else {\r\n return mid;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction mergePairAdjustment(base: PairAdjustment | null, next: PairAdjustment): PairAdjustment {\r\n if (!base) {\r\n return { ...next };\r\n }\r\n return {\r\n firstXPlacement: base.firstXPlacement + next.firstXPlacement,\r\n firstXAdvance: base.firstXAdvance + next.firstXAdvance,\r\n secondXPlacement: base.secondXPlacement + next.secondXPlacement,\r\n secondXAdvance: base.secondXAdvance + next.secondXAdvance\r\n };\r\n}\r\n\r\nfunction parseGlyphHeader(reader: SFNTReader, offset: number): GlyphHeader {\r\n return {\r\n numberOfContours: reader.int16(offset),\r\n xMin: reader.int16(offset + 2),\r\n yMin: reader.int16(offset + 4),\r\n xMax: reader.int16(offset + 6),\r\n yMax: reader.int16(offset + 8)\r\n };\r\n}\r\n\r\nfunction parseSimpleGlyph(reader: SFNTReader, offset: number, numberOfContours: number): GlyphContour[] {\r\n const endPts: number[] = [];\r\n let cursor = offset + 10;\r\n for (let i = 0; i < numberOfContours; i++) {\r\n endPts.push(reader.uint16(cursor));\r\n cursor += 2;\r\n }\r\n const pointCount = endPts[numberOfContours - 1] + 1;\r\n const instructionLength = reader.uint16(cursor);\r\n cursor += 2 + instructionLength;\r\n const flags = new Uint8Array(pointCount);\r\n for (let i = 0; i < pointCount; ) {\r\n const flag = reader.uint8(cursor++);\r\n flags[i++] = flag;\r\n if (flag & 0x08) {\r\n const repeatCount = reader.uint8(cursor++);\r\n for (let j = 0; j < repeatCount; j++) {\r\n flags[i++] = flag;\r\n }\r\n }\r\n }\r\n const xs = new Int16Array(pointCount);\r\n const ys = new Int16Array(pointCount);\r\n let currentX = 0;\r\n for (let i = 0; i < pointCount; i++) {\r\n const flag = flags[i];\r\n if (flag & 0x02) {\r\n const dx = reader.uint8(cursor++);\r\n currentX += flag & 0x10 ? dx : -dx;\r\n } else if (!(flag & 0x10)) {\r\n currentX += reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n xs[i] = currentX;\r\n }\r\n let currentY = 0;\r\n for (let i = 0; i < pointCount; i++) {\r\n const flag = flags[i];\r\n if (flag & 0x04) {\r\n const dy = reader.uint8(cursor++);\r\n currentY += flag & 0x20 ? dy : -dy;\r\n } else if (!(flag & 0x20)) {\r\n currentY += reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n ys[i] = currentY;\r\n }\r\n const points: GlyphPoint[] = [];\r\n for (let i = 0; i < pointCount; i++) {\r\n points.push({\r\n x: xs[i],\r\n y: ys[i],\r\n onCurve: !!(flags[i] & 0x01)\r\n });\r\n }\r\n const contours: GlyphContour[] = [];\r\n let start = 0;\r\n for (const end of endPts) {\r\n contours.push(expandImplicitPoints(points.slice(start, end + 1)));\r\n start = end + 1;\r\n }\r\n return contours;\r\n}\r\n\r\nfunction parseCompositeGlyph(\r\n reader: SFNTReader,\r\n offset: number,\r\n loadGlyph: (glyphIndex: number) => GlyphData | null\r\n): GlyphContour[] {\r\n let cursor = offset + 10;\r\n const contours: GlyphContour[] = [];\r\n let flags = 0;\r\n do {\r\n flags = reader.uint16(cursor);\r\n const glyphIndex = reader.uint16(cursor + 2);\r\n cursor += 4;\r\n const component = parseCompositeComponent(reader, cursor, flags, glyphIndex);\r\n cursor = component.cursor;\r\n const child = loadGlyph(component.data.glyphIndex);\r\n if (child) {\r\n for (const contour of child.contours) {\r\n contours.push(\r\n contour.map((point) => ({\r\n x: point.x * component.data.xx + point.y * component.data.xy + component.data.dx,\r\n y: point.x * component.data.yx + point.y * component.data.yy + component.data.dy,\r\n onCurve: point.onCurve\r\n }))\r\n );\r\n }\r\n }\r\n } while (flags & MORE_COMPONENTS);\r\n return contours;\r\n}\r\n\r\nfunction parseCompositeComponent(reader: SFNTReader, offset: number, flags: number, glyphIndex: number) {\r\n let cursor = offset;\r\n let arg1 = 0;\r\n let arg2 = 0;\r\n if (flags & ARG_1_AND_2_ARE_WORDS) {\r\n arg1 = reader.int16(cursor);\r\n arg2 = reader.int16(cursor + 2);\r\n cursor += 4;\r\n } else {\r\n arg1 = reader.int8(cursor);\r\n arg2 = reader.int8(cursor + 1);\r\n cursor += 2;\r\n }\r\n let dx = 0;\r\n let dy = 0;\r\n if (flags & ARGS_ARE_XY_VALUES) {\r\n dx = arg1;\r\n dy = arg2;\r\n }\r\n let xx = 1;\r\n let xy = 0;\r\n let yx = 0;\r\n let yy = 1;\r\n if (flags & WE_HAVE_A_SCALE) {\r\n const scale = readF2Dot14(reader, cursor);\r\n cursor += 2;\r\n xx = scale;\r\n yy = scale;\r\n } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\r\n xx = readF2Dot14(reader, cursor);\r\n yy = readF2Dot14(reader, cursor + 2);\r\n cursor += 4;\r\n } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\r\n xx = readF2Dot14(reader, cursor);\r\n xy = readF2Dot14(reader, cursor + 2);\r\n yx = readF2Dot14(reader, cursor + 4);\r\n yy = readF2Dot14(reader, cursor + 6);\r\n cursor += 8;\r\n }\r\n return {\r\n data: { glyphIndex, dx, dy, xx, xy, yx, yy } satisfies CompositeComponent,\r\n cursor\r\n };\r\n}\r\n\r\nfunction readF2Dot14(reader: SFNTReader, offset: number) {\r\n return reader.int16(offset) / 16384;\r\n}\r\n\r\nfunction expandImplicitPoints(points: GlyphPoint[]) {\r\n if (points.length === 0) {\r\n return points;\r\n }\r\n const result: GlyphPoint[] = [];\r\n for (let i = 0; i < points.length; i++) {\r\n const current = points[i];\r\n const next = points[(i + 1) % points.length];\r\n result.push(current);\r\n if (!current.onCurve && !next.onCurve) {\r\n result.push({\r\n x: (current.x + next.x) * 0.5,\r\n y: (current.y + next.y) * 0.5,\r\n onCurve: true\r\n });\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction computeBounds(contours: GlyphContour[]) {\r\n if (contours.length === 0) {\r\n return { xMin: 0, yMin: 0, xMax: 0, yMax: 0 };\r\n }\r\n let xMin = Number.POSITIVE_INFINITY;\r\n let yMin = Number.POSITIVE_INFINITY;\r\n let xMax = Number.NEGATIVE_INFINITY;\r\n let yMax = Number.NEGATIVE_INFINITY;\r\n for (const contour of contours) {\r\n for (const point of contour) {\r\n xMin = Math.min(xMin, point.x);\r\n yMin = Math.min(yMin, point.y);\r\n xMax = Math.max(xMax, point.x);\r\n yMax = Math.max(yMax, point.y);\r\n }\r\n }\r\n return { xMin, yMin, xMax, yMax };\r\n}\r\n\r\nfunction buildGlyphData(\r\n glyphIndex: number,\r\n advanceWidths: Uint16Array<ArrayBuffer>,\r\n leftSideBearings: Int16Array<ArrayBuffer>,\r\n contours: GlyphContour[],\r\n xMin: number,\r\n yMin: number,\r\n xMax: number,\r\n yMax: number\r\n): GlyphData {\r\n return {\r\n glyphIndex,\r\n advanceWidth: advanceWidths[glyphIndex] ?? 0,\r\n leftSideBearing: leftSideBearings[glyphIndex] ?? 0,\r\n xMin,\r\n yMin,\r\n xMax,\r\n yMax,\r\n contours\r\n };\r\n}\r\n\r\nfunction normalizeMSDFAtlasPageSize(value: number | undefined) {\r\n return Math.max(32, Math.round(Number.isFinite(value) ? value! : DEFAULT_MSDF_ATLAS_PAGE_SIZE));\r\n}\r\n\r\nfunction normalizeMSDFGlyphSize(value: number | undefined) {\r\n return Math.max(8, Math.round(Number.isFinite(value) ? value! : DEFAULT_MSDF_GLYPH_SIZE));\r\n}\r\n"],"names":["ARG_1_AND_2_ARE_WORDS","ARGS_ARE_XY_VALUES","WE_HAVE_A_SCALE","MORE_COMPONENTS","WE_HAVE_AN_X_AND_Y_SCALE","WE_HAVE_A_TWO_BY_TWO","DEFAULT_MSDF_ATLAS_PAGE_SIZE","DEFAULT_MSDF_GLYPH_SIZE","FontAsset","_reader","_tables","_glyphOffsets","_advanceWidths","_leftSideBearings","_glyphCache","_cmapFormat4","_cmapFormat12","_kernPairs","_gposPairs","_metrics","_numberOfHMetrics","_msdfAtlasSettings","buffer","options","SFNTReader","parseTableDirectory","head","requireTable","maxp","hhea","hmtx","loca","uint16","offset","unitsPerEm","ascent","int16","descent","lineGap","glyphCount","parseGlyphOffsets","metrics","parseHorizontalMetrics","advanceWidths","leftSideBearings","cmap","parseBestCMap","format4","format12","parseKernPairs","getTable","parseGPOSPairs","Map","Object","freeze","pageSize","normalizeMSDFAtlasPageSize","glyphSize","normalizeMSDFGlyphSize","fromBuffer","msdfAtlasSettings","msdfAtlasPageSize","msdfGlyphSize","getGlyphIndex","codePoint","glyphIndex","lookupCMapFormat12","lookupCMapFormat4","getKerning","leftGlyphIndex","rightGlyphIndex","gpos","getPairAdjustment","firstXAdvance","secondXAdvance","get","lookupGPOSPair","getGlyph","has","glyph","loadGlyph","set","tag","table","Error","depth","glyf","nextOffset","buildGlyphData","glyphOffset","header","parseGlyphHeader","numberOfContours","contours","parseSimpleGlyph","xMin","yMin","xMax","yMax","parseCompositeGlyph","childIndex","bounds","computeBounds","reader","numTables","tables","i","uint32","length","indexToLocFormat","result","Uint32Array","numberOfHMetrics","Uint16Array","Int16Array","cursor","lastAdvanceWidth","recordOffset","platformId","encodingId","subtableOffset","format","isPreferredCMap","currentPlatformId","currentEncodingId","nextScore","getCMapScore","currentScore","nGroups","low","high","mid","groupOffset","startCharCode","endCharCode","segCount","endCodeOffset","startCodeOffset","idDeltaOffset","idRangeOffsetOffset","endCode","startCode","idDelta","idRangeOffset","glyphIndexAddress","version","nTables","coverage","nPairs","pairOffset","j","left","right","value","majorVersion","featureListOffset","lookupListOffset","featureLookupIndices","collectGPOSFeatureLookupIndices","parseGPOSLookupSubtables","featureCount","featureTags","Set","lookupIndices","featureOffset","lookupIndexCount","add","sort","a","b","gposOffset","lookupCount","lookupIndex","lookupOffset","lookupType","subtableCount","parsed","parsePairPosSubtable","push","extensionLookupType","extensionOffset","parsePairPosFormat1","parsePairPosFormat2","parseCoverageTable","valueFormat1","valueFormat2","pairSetCount","pairs","firstGlyph","getCoverageGlyph","pairSetOffset","pairValueCount","secondMap","secondGlyph","value1","readValueRecordX","getValueRecordSize","value2","adjustment","firstXPlacement","xPlacement","xAdvance","secondXPlacement","kind","classDef1","parseClassDefTable","classDef2","class1Count","class2Count","values","Array","c1","c2","glyphs","rangeCount","ranges","rangeOffset","start","end","startIndex","index","range","rangeLength","coverageContains","binarySearchU16","startGlyphId","classes","classRangeCount","classId","getGlyphClass","classDef","valueFormat","size","bit","subtables","merged","subtable","mergePairAdjustment","class1","class2","target","base","next","endPts","pointCount","instructionLength","flags","Uint8Array","flag","uint8","repeatCount","xs","ys","currentX","dx","currentY","dy","points","x","y","onCurve","expandImplicitPoints","slice","component","parseCompositeComponent","child","data","contour","map","point","xx","xy","yx","yy","arg1","arg2","int8","scale","readF2Dot14","current","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","Math","min","max","advanceWidth","leftSideBearing","round","isFinite"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ class SFNTReader {
2
+ _buffer;
3
+ _byteOffset;
4
+ _view;
5
+ constructor(_buffer, _byteOffset = 0){
6
+ this._buffer = _buffer;
7
+ this._byteOffset = _byteOffset;
8
+ this._view = new DataView(_buffer);
9
+ }
10
+ get buffer() {
11
+ return this._buffer;
12
+ }
13
+ uint8(offset) {
14
+ return this._view.getUint8(this._byteOffset + offset);
15
+ }
16
+ int8(offset) {
17
+ return this._view.getInt8(this._byteOffset + offset);
18
+ }
19
+ uint16(offset) {
20
+ return this._view.getUint16(this._byteOffset + offset, false);
21
+ }
22
+ int16(offset) {
23
+ return this._view.getInt16(this._byteOffset + offset, false);
24
+ }
25
+ uint32(offset) {
26
+ return this._view.getUint32(this._byteOffset + offset, false);
27
+ }
28
+ int32(offset) {
29
+ return this._view.getInt32(this._byteOffset + offset, false);
30
+ }
31
+ fixed(offset) {
32
+ return this.int32(offset) / 65536;
33
+ }
34
+ tag(offset) {
35
+ return String.fromCharCode(this.uint8(offset), this.uint8(offset + 1), this.uint8(offset + 2), this.uint8(offset + 3));
36
+ }
37
+ slice(offset, length) {
38
+ return new DataView(this._buffer, this._byteOffset + offset, length);
39
+ }
40
+ }
41
+
42
+ export { SFNTReader };
43
+ //# sourceMappingURL=sfnt_reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfnt_reader.js","sources":["../../../src/text/font/sfnt_reader.ts"],"sourcesContent":["export class SFNTReader {\r\n private readonly _view: DataView;\r\n constructor(\r\n private readonly _buffer: ArrayBuffer,\r\n private readonly _byteOffset = 0\r\n ) {\r\n this._view = new DataView(_buffer);\r\n }\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n uint8(offset: number) {\r\n return this._view.getUint8(this._byteOffset + offset);\r\n }\r\n int8(offset: number) {\r\n return this._view.getInt8(this._byteOffset + offset);\r\n }\r\n uint16(offset: number) {\r\n return this._view.getUint16(this._byteOffset + offset, false);\r\n }\r\n int16(offset: number) {\r\n return this._view.getInt16(this._byteOffset + offset, false);\r\n }\r\n uint32(offset: number) {\r\n return this._view.getUint32(this._byteOffset + offset, false);\r\n }\r\n int32(offset: number) {\r\n return this._view.getInt32(this._byteOffset + offset, false);\r\n }\r\n fixed(offset: number) {\r\n return this.int32(offset) / 65536;\r\n }\r\n tag(offset: number) {\r\n return String.fromCharCode(\r\n this.uint8(offset),\r\n this.uint8(offset + 1),\r\n this.uint8(offset + 2),\r\n this.uint8(offset + 3)\r\n );\r\n }\r\n slice(offset: number, length: number) {\r\n return new DataView(this._buffer, this._byteOffset + offset, length);\r\n }\r\n}\r\n"],"names":["SFNTReader","_view","_byteOffset","_buffer","DataView","buffer","uint8","offset","getUint8","int8","getInt8","uint16","getUint16","int16","getInt16","uint32","getUint32","int32","getInt32","fixed","tag","String","fromCharCode","slice","length"],"mappings":"AAAO,MAAMA,UAAAA,CAAAA;;;IACMC,KAAgB;AACjC,IAAA,WAAA,CACE,OAAqC,EACrC,WAAiBC,GAAc,CAAC,CAChC;aAFiBC,OAAAA,GAAAA,OAAAA;aACAD,WAAAA,GAAAA,WAAAA;AAEjB,QAAA,IAAI,CAACD,KAAK,GAAG,IAAIG,QAASD,CAAAA,OAAAA,CAAAA;AAC5B;AACA,IAAA,IAAIE,MAAS,GAAA;QACX,OAAO,IAAI,CAACF,OAAO;AACrB;AACAG,IAAAA,KAAAA,CAAMC,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACO,QAAQ,CAAC,IAAI,CAACN,WAAW,GAAGK,MAAAA,CAAAA;AAChD;AACAE,IAAAA,IAAAA,CAAKF,MAAc,EAAE;QACnB,OAAO,IAAI,CAACN,KAAK,CAACS,OAAO,CAAC,IAAI,CAACR,WAAW,GAAGK,MAAAA,CAAAA;AAC/C;AACAI,IAAAA,MAAAA,CAAOJ,MAAc,EAAE;QACrB,OAAO,IAAI,CAACN,KAAK,CAACW,SAAS,CAAC,IAAI,CAACV,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACzD;AACAM,IAAAA,KAAAA,CAAMN,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACa,QAAQ,CAAC,IAAI,CAACZ,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACxD;AACAQ,IAAAA,MAAAA,CAAOR,MAAc,EAAE;QACrB,OAAO,IAAI,CAACN,KAAK,CAACe,SAAS,CAAC,IAAI,CAACd,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACzD;AACAU,IAAAA,KAAAA,CAAMV,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACiB,QAAQ,CAAC,IAAI,CAAChB,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACxD;AACAY,IAAAA,KAAAA,CAAMZ,MAAc,EAAE;AACpB,QAAA,OAAO,IAAI,CAACU,KAAK,CAACV,MAAU,CAAA,GAAA,KAAA;AAC9B;AACAa,IAAAA,GAAAA,CAAIb,MAAc,EAAE;QAClB,OAAOc,MAAAA,CAAOC,YAAY,CACxB,IAAI,CAAChB,KAAK,CAACC,MAAAA,CAAAA,EACX,IAAI,CAACD,KAAK,CAACC,SAAS,CACpB,CAAA,EAAA,IAAI,CAACD,KAAK,CAACC,MAAAA,GAAS,IACpB,IAAI,CAACD,KAAK,CAACC,MAAS,GAAA,CAAA,CAAA,CAAA;AAExB;IACAgB,KAAMhB,CAAAA,MAAc,EAAEiB,MAAc,EAAE;QACpC,OAAO,IAAIpB,QAAS,CAAA,IAAI,CAACD,OAAO,EAAE,IAAI,CAACD,WAAW,GAAGK,MAAQiB,EAAAA,MAAAA,CAAAA;AAC/D;AACF;;;;"}
@@ -0,0 +1,417 @@
1
+ import { clamp } from '@zephyr3d/base';
2
+ import { buildMSDFShape } from './shape.js';
3
+
4
+ const DEFAULT_PADDING = 1;
5
+ const CHANNEL_MASKS = [
6
+ 1,
7
+ 2,
8
+ 4
9
+ ];
10
+ const EPSILON = 1e-8;
11
+ const CONTOUR_PROBE_DISTANCES = [
12
+ 1,
13
+ 4,
14
+ 16
15
+ ];
16
+ /**
17
+ * Generate a runtime RGB(A) distance field bitmap from a parsed glyph.
18
+ *
19
+ * Distances are encoded in output texel units, which matches the shader-side
20
+ * `distanceRange` logic and keeps the field scale-invariant across font sizes.
21
+ *
22
+ * @public
23
+ */ function generateMSDF(glyph, options) {
24
+ const shape = buildMSDFShape(glyph.contours);
25
+ const width = Math.max(1, options.width | 0);
26
+ const height = Math.max(1, options.height | 0);
27
+ const padding = options.padding ?? DEFAULT_PADDING;
28
+ const boundsWidth = Math.max(1, glyph.xMax - glyph.xMin);
29
+ const boundsHeight = Math.max(1, glyph.yMax - glyph.yMin);
30
+ const drawableWidth = Math.max(1, width - padding * 2);
31
+ const drawableHeight = Math.max(1, height - padding * 2);
32
+ const scale = Math.min(drawableWidth / boundsWidth, drawableHeight / boundsHeight);
33
+ const placedWidth = boundsWidth * scale;
34
+ const placedHeight = boundsHeight * scale;
35
+ const translateX = padding + (drawableWidth - placedWidth) * 0.5 - glyph.xMin * scale;
36
+ const translateY = padding + (drawableHeight - placedHeight) * 0.5 + glyph.yMax * scale;
37
+ const contourInsideSigns = shape.contours.map((contour)=>determineContourInsideSign(contour, shape.contours));
38
+ const fields = new Float32Array(width * height * 4);
39
+ for(let y = 0; y < height; y++){
40
+ for(let x = 0; x < width; x++){
41
+ const sourceX = (x + 0.5 - translateX) / scale;
42
+ const sourceY = -(y + 0.5 - translateY) / scale;
43
+ const inside = pointInShape(sourceX, sourceY, shape.contours);
44
+ let minDistance = Number.POSITIVE_INFINITY;
45
+ const channelSamples = [
46
+ null,
47
+ null,
48
+ null
49
+ ];
50
+ for(let contourIndex = 0; contourIndex < shape.contours.length; contourIndex++){
51
+ const contour = shape.contours[contourIndex];
52
+ const insideSign = contourInsideSigns[contourIndex];
53
+ for (const edge of contour){
54
+ const sample = sampleEdge(edge, sourceX, sourceY, insideSign);
55
+ if (sample.absDistance < minDistance) {
56
+ minDistance = sample.absDistance;
57
+ }
58
+ for(let channelIndex = 0; channelIndex < CHANNEL_MASKS.length; channelIndex++){
59
+ if ((edge.color & CHANNEL_MASKS[channelIndex]) !== 0 && betterSample(sample, channelSamples[channelIndex])) {
60
+ channelSamples[channelIndex] = sample;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ if (!Number.isFinite(minDistance)) {
66
+ minDistance = 0;
67
+ }
68
+ const sdfDistance = (inside ? minDistance : -minDistance) * scale;
69
+ const base = (y * width + x) * 4;
70
+ fields[base + 0] = (channelSamples[0]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
71
+ fields[base + 1] = (channelSamples[1]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
72
+ fields[base + 2] = (channelSamples[2]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
73
+ fields[base + 3] = sdfDistance;
74
+ }
75
+ }
76
+ applyMedianCorrection(fields, width, height, options.range);
77
+ const pixels = new Uint8Array(width * height * 4);
78
+ for(let i = 0; i < width * height; i++){
79
+ const base = i * 4;
80
+ pixels[base + 0] = encodeDistance(fields[base + 0], options.range);
81
+ pixels[base + 1] = encodeDistance(fields[base + 1], options.range);
82
+ pixels[base + 2] = encodeDistance(fields[base + 2], options.range);
83
+ pixels[base + 3] = encodeDistance(fields[base + 3], options.range);
84
+ }
85
+ return {
86
+ width,
87
+ height,
88
+ pixels,
89
+ scale,
90
+ translateX,
91
+ translateY
92
+ };
93
+ }
94
+ function encodeDistance(distance, range) {
95
+ return Math.round(clamp(0.5 + distance / (2 * Math.max(range, 1e-6)), 0, 1) * 255);
96
+ }
97
+ function betterSample(next, current) {
98
+ return !current || next.absDistance < current.absDistance - 1e-6 || Math.abs(next.absDistance - current.absDistance) <= 1e-6 && next.dot < current.dot;
99
+ }
100
+ function sampleEdge(edge, x, y, insideSign) {
101
+ return edge.kind === 'line' ? sampleLineEdge(edge, x, y, insideSign) : sampleQuadraticEdge(edge, x, y, insideSign);
102
+ }
103
+ function sampleLineEdge(edge, x, y, insideSign) {
104
+ const dx = edge.p1.x - edge.p0.x;
105
+ const dy = edge.p1.y - edge.p0.y;
106
+ const lenSq = dx * dx + dy * dy;
107
+ if (lenSq <= EPSILON) {
108
+ return sampleEndpoint(edge.p0.x, edge.p0.y, 1, 0, x, y, insideSign);
109
+ }
110
+ const qx = x - edge.p0.x;
111
+ const qy = y - edge.p0.y;
112
+ const t = (qx * dx + qy * dy) / lenSq;
113
+ if (t <= 0) {
114
+ return sampleEndpoint(edge.p0.x, edge.p0.y, dx, dy, x, y, insideSign);
115
+ }
116
+ if (t >= 1) {
117
+ return sampleEndpoint(edge.p1.x, edge.p1.y, dx, dy, x, y, insideSign);
118
+ }
119
+ const cx = edge.p0.x + dx * t;
120
+ const cy = edge.p0.y + dy * t;
121
+ const deltaX = x - cx;
122
+ const deltaY = y - cy;
123
+ const absDistance = Math.hypot(deltaX, deltaY);
124
+ return {
125
+ distance: signedPerpendicularDistance(dx, dy, deltaX, deltaY, insideSign),
126
+ absDistance,
127
+ dot: directionDot(deltaX, deltaY, dx, dy, absDistance)
128
+ };
129
+ }
130
+ function sampleQuadraticEdge(edge, x, y, insideSign) {
131
+ const t = findNearestQuadraticParameter(edge, x, y);
132
+ if (t <= EPSILON) {
133
+ const tangent = quadraticEndpointTangent(edge, true);
134
+ return sampleEndpoint(edge.p0.x, edge.p0.y, tangent.x, tangent.y, x, y, insideSign);
135
+ }
136
+ if (t >= 1 - EPSILON) {
137
+ const tangent = quadraticEndpointTangent(edge, false);
138
+ return sampleEndpoint(edge.p2.x, edge.p2.y, tangent.x, tangent.y, x, y, insideSign);
139
+ }
140
+ const point = evaluateQuadratic(edge, t);
141
+ const tangent = quadraticTangent(edge, t);
142
+ const deltaX = x - point.x;
143
+ const deltaY = y - point.y;
144
+ const absDistance = Math.hypot(deltaX, deltaY);
145
+ return {
146
+ distance: signedPerpendicularDistance(tangent.x, tangent.y, deltaX, deltaY, insideSign),
147
+ absDistance,
148
+ dot: directionDot(deltaX, deltaY, tangent.x, tangent.y, absDistance)
149
+ };
150
+ }
151
+ function sampleEndpoint(px, py, tx, ty, x, y, insideSign) {
152
+ const deltaX = x - px;
153
+ const deltaY = y - py;
154
+ const absDistance = Math.hypot(deltaX, deltaY);
155
+ return {
156
+ distance: signedPerpendicularDistance(tx, ty, deltaX, deltaY, insideSign),
157
+ absDistance,
158
+ dot: directionDot(deltaX, deltaY, tx, ty, absDistance)
159
+ };
160
+ }
161
+ function signedPerpendicularDistance(tx, ty, dx, dy, insideSign) {
162
+ const tangentLength = Math.hypot(tx, ty);
163
+ if (tangentLength <= EPSILON) {
164
+ return 0;
165
+ }
166
+ return insideSign * cross(tx, ty, dx, dy) / tangentLength;
167
+ }
168
+ function directionDot(dx, dy, tx, ty, absDistance) {
169
+ const tangentLength = Math.hypot(tx, ty);
170
+ if (absDistance <= EPSILON || tangentLength <= EPSILON) {
171
+ return 0;
172
+ }
173
+ return Math.abs((dx * tx + dy * ty) / (absDistance * tangentLength));
174
+ }
175
+ function findNearestQuadraticParameter(edge, x, y) {
176
+ const ax = edge.p0.x - 2 * edge.p1.x + edge.p2.x;
177
+ const ay = edge.p0.y - 2 * edge.p1.y + edge.p2.y;
178
+ const bx = 2 * (edge.p1.x - edge.p0.x);
179
+ const by = 2 * (edge.p1.y - edge.p0.y);
180
+ const cx = edge.p0.x - x;
181
+ const cy = edge.p0.y - y;
182
+ const roots = solveCubic(2 * dot(ax, ay, ax, ay), 3 * dot(ax, ay, bx, by), dot(bx, by, bx, by) + 2 * dot(ax, ay, cx, cy), dot(bx, by, cx, cy));
183
+ let nearestT = 0;
184
+ let minDistanceSq = Number.POSITIVE_INFINITY;
185
+ for (const candidate of [
186
+ 0,
187
+ ...roots,
188
+ 1
189
+ ]){
190
+ const t = clamp(candidate, 0, 1);
191
+ const point = evaluateQuadratic(edge, t);
192
+ const distX = x - point.x;
193
+ const distY = y - point.y;
194
+ const distanceSq = distX * distX + distY * distY;
195
+ if (distanceSq < minDistanceSq - 1e-6) {
196
+ minDistanceSq = distanceSq;
197
+ nearestT = t;
198
+ }
199
+ }
200
+ return nearestT;
201
+ }
202
+ function evaluateQuadratic(edge, t) {
203
+ const mt = 1 - t;
204
+ return {
205
+ x: mt * mt * edge.p0.x + 2 * mt * t * edge.p1.x + t * t * edge.p2.x,
206
+ y: mt * mt * edge.p0.y + 2 * mt * t * edge.p1.y + t * t * edge.p2.y
207
+ };
208
+ }
209
+ function quadraticTangent(edge, t) {
210
+ const x = 2 * ((1 - t) * (edge.p1.x - edge.p0.x) + t * (edge.p2.x - edge.p1.x));
211
+ const y = 2 * ((1 - t) * (edge.p1.y - edge.p0.y) + t * (edge.p2.y - edge.p1.y));
212
+ if (Math.hypot(x, y) > EPSILON) {
213
+ return {
214
+ x,
215
+ y
216
+ };
217
+ }
218
+ return quadraticEndpointTangent(edge, t < 0.5);
219
+ }
220
+ function quadraticEndpointTangent(edge, atStart) {
221
+ const tx = atStart ? edge.p1.x - edge.p0.x : edge.p2.x - edge.p1.x;
222
+ const ty = atStart ? edge.p1.y - edge.p0.y : edge.p2.y - edge.p1.y;
223
+ if (Math.hypot(tx, ty) > EPSILON) {
224
+ return {
225
+ x: tx,
226
+ y: ty
227
+ };
228
+ }
229
+ const fallbackX = edge.p2.x - edge.p0.x;
230
+ const fallbackY = edge.p2.y - edge.p0.y;
231
+ if (Math.hypot(fallbackX, fallbackY) > EPSILON) {
232
+ return {
233
+ x: fallbackX,
234
+ y: fallbackY
235
+ };
236
+ }
237
+ return {
238
+ x: 1,
239
+ y: 0
240
+ };
241
+ }
242
+ function solveCubic(a, b, c, d) {
243
+ if (Math.abs(a) <= EPSILON) {
244
+ return solveQuadratic(b, c, d);
245
+ }
246
+ const invA = 1 / a;
247
+ const B = b * invA;
248
+ const C = c * invA;
249
+ const D = d * invA;
250
+ const p = C - B * B / 3;
251
+ const q = 2 * B * B * B / 27 - B * C / 3 + D;
252
+ const disc = q * q / 4 + p * p * p / 27;
253
+ const shift = -B / 3;
254
+ if (disc > EPSILON) {
255
+ const sqrtDisc = Math.sqrt(disc);
256
+ return [
257
+ Math.cbrt(-q / 2 + sqrtDisc) + Math.cbrt(-q / 2 - sqrtDisc) + shift
258
+ ];
259
+ }
260
+ if (disc < -1e-8) {
261
+ const acosArg = clamp(-q / 2 / Math.sqrt(-p * p * p / 27), -1, 1);
262
+ const theta = Math.acos(acosArg);
263
+ const rho = 2 * Math.sqrt(-p / 3);
264
+ return dedupeRoots([
265
+ rho * Math.cos(theta / 3) + shift,
266
+ rho * Math.cos((theta + 2 * Math.PI) / 3) + shift,
267
+ rho * Math.cos((theta + 4 * Math.PI) / 3) + shift
268
+ ]);
269
+ }
270
+ const u = Math.cbrt(-q / 2);
271
+ return dedupeRoots([
272
+ 2 * u + shift,
273
+ -u + shift
274
+ ]);
275
+ }
276
+ function solveQuadratic(a, b, c) {
277
+ if (Math.abs(a) <= EPSILON) {
278
+ return Math.abs(b) <= EPSILON ? [] : [
279
+ -c / b
280
+ ];
281
+ }
282
+ const disc = b * b - 4 * a * c;
283
+ if (disc < -1e-8) {
284
+ return [];
285
+ }
286
+ if (Math.abs(disc) <= EPSILON) {
287
+ return [
288
+ -b / (2 * a)
289
+ ];
290
+ }
291
+ const sqrtDisc = Math.sqrt(Math.max(disc, 0));
292
+ return dedupeRoots([
293
+ (-b - sqrtDisc) / (2 * a),
294
+ (-b + sqrtDisc) / (2 * a)
295
+ ]);
296
+ }
297
+ function dedupeRoots(values) {
298
+ const roots = [];
299
+ for (const value of values){
300
+ if (!roots.some((root)=>Math.abs(root - value) <= 1e-7)) {
301
+ roots.push(value);
302
+ }
303
+ }
304
+ return roots;
305
+ }
306
+ function determineContourInsideSign(contour, allContours) {
307
+ for (const edge of contour){
308
+ const probe = edgeProbe(edge);
309
+ const tangentLength = Math.hypot(probe.tangent.x, probe.tangent.y);
310
+ if (tangentLength <= EPSILON) {
311
+ continue;
312
+ }
313
+ const normalX = -probe.tangent.y / tangentLength;
314
+ const normalY = probe.tangent.x / tangentLength;
315
+ for (const distance of CONTOUR_PROBE_DISTANCES){
316
+ const leftInside = pointInShape(probe.point.x + normalX * distance, probe.point.y + normalY * distance, allContours);
317
+ const rightInside = pointInShape(probe.point.x - normalX * distance, probe.point.y - normalY * distance, allContours);
318
+ if (leftInside !== rightInside) {
319
+ return leftInside ? 1 : -1;
320
+ }
321
+ }
322
+ }
323
+ return approximateContourSign(contour);
324
+ }
325
+ function edgeProbe(edge) {
326
+ if (edge.kind === 'line') {
327
+ return {
328
+ point: {
329
+ x: (edge.p0.x + edge.p1.x) * 0.5,
330
+ y: (edge.p0.y + edge.p1.y) * 0.5
331
+ },
332
+ tangent: {
333
+ x: edge.p1.x - edge.p0.x,
334
+ y: edge.p1.y - edge.p0.y
335
+ }
336
+ };
337
+ }
338
+ return {
339
+ point: evaluateQuadratic(edge, 0.5),
340
+ tangent: quadraticTangent(edge, 0.5)
341
+ };
342
+ }
343
+ function approximateContourSign(contour) {
344
+ let area = 0;
345
+ for (const edge of contour){
346
+ if (edge.kind === 'line') {
347
+ area += cross(edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
348
+ } else {
349
+ area += cross(edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
350
+ area += cross(edge.p1.x, edge.p1.y, edge.p2.x, edge.p2.y);
351
+ }
352
+ }
353
+ return area >= 0 ? 1 : -1;
354
+ }
355
+ function applyMedianCorrection(fields, width, height, range) {
356
+ const correctionThreshold = 1;
357
+ const edgeThreshold = Math.max(range + 1, 1);
358
+ for(let i = 0; i < width * height; i++){
359
+ const base = i * 4;
360
+ const median = median3(fields[base + 0], fields[base + 1], fields[base + 2]);
361
+ const sdf = fields[base + 3];
362
+ if (Math.abs(sdf) <= edgeThreshold && Math.abs(median - sdf) > correctionThreshold) {
363
+ fields[base + 0] = sdf;
364
+ fields[base + 1] = sdf;
365
+ fields[base + 2] = sdf;
366
+ }
367
+ }
368
+ }
369
+ function pointInShape(x, y, contours) {
370
+ let winding = 0;
371
+ for (const contour of contours){
372
+ winding += contourWinding(x, y, contour);
373
+ }
374
+ return winding !== 0;
375
+ }
376
+ function contourWinding(x, y, contour) {
377
+ let winding = 0;
378
+ for (const edge of contour){
379
+ if (edge.kind === 'line') {
380
+ winding += windingContribution(x, y, edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
381
+ } else {
382
+ let prevX = edge.p0.x;
383
+ let prevY = edge.p0.y;
384
+ const steps = 16;
385
+ for(let i = 1; i <= steps; i++){
386
+ const t = i / steps;
387
+ const point = evaluateQuadratic(edge, t);
388
+ winding += windingContribution(x, y, prevX, prevY, point.x, point.y);
389
+ prevX = point.x;
390
+ prevY = point.y;
391
+ }
392
+ }
393
+ }
394
+ return winding;
395
+ }
396
+ function windingContribution(px, py, x0, y0, x1, y1) {
397
+ if (y0 <= py) {
398
+ if (y1 > py && cross(x1 - x0, y1 - y0, px - x0, py - y0) > 0) {
399
+ return 1;
400
+ }
401
+ } else if (y1 <= py && cross(x1 - x0, y1 - y0, px - x0, py - y0) < 0) {
402
+ return -1;
403
+ }
404
+ return 0;
405
+ }
406
+ function median3(a, b, c) {
407
+ return a + b + c - Math.min(a, b, c) - Math.max(a, b, c);
408
+ }
409
+ function cross(ax, ay, bx, by) {
410
+ return ax * by - ay * bx;
411
+ }
412
+ function dot(ax, ay, bx, by) {
413
+ return ax * bx + ay * by;
414
+ }
415
+
416
+ export { generateMSDF };
417
+ //# sourceMappingURL=generator.js.map