@knowvah/dot-engine 0.1.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 (986) hide show
  1. package/LICENSE +277 -0
  2. package/README.md +292 -0
  3. package/dist/api/builder.d.ts +78 -0
  4. package/dist/api/builder.d.ts.map +1 -0
  5. package/dist/api/edge-ops.d.ts +45 -0
  6. package/dist/api/edge-ops.d.ts.map +1 -0
  7. package/dist/api/geometry.d.ts +159 -0
  8. package/dist/api/geometry.d.ts.map +1 -0
  9. package/dist/api/index.d.ts +24 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api.js +719 -0
  12. package/dist/api.js.map +7 -0
  13. package/dist/bundle.js +101 -0
  14. package/dist/cdt/bag.d.ts +58 -0
  15. package/dist/cdt/bag.d.ts.map +1 -0
  16. package/dist/cdt/hash-core.d.ts +40 -0
  17. package/dist/cdt/hash-core.d.ts.map +1 -0
  18. package/dist/cdt/hash.d.ts +74 -0
  19. package/dist/cdt/hash.d.ts.map +1 -0
  20. package/dist/cdt/index.d.ts +16 -0
  21. package/dist/cdt/index.d.ts.map +1 -0
  22. package/dist/cdt/splay-core.d.ts +78 -0
  23. package/dist/cdt/splay-core.d.ts.map +1 -0
  24. package/dist/cdt/splay.d.ts +63 -0
  25. package/dist/cdt/splay.d.ts.map +1 -0
  26. package/dist/cdt/strhash.d.ts +26 -0
  27. package/dist/cdt/strhash.d.ts.map +1 -0
  28. package/dist/cdt/types.d.ts +11 -0
  29. package/dist/cdt/types.d.ts.map +1 -0
  30. package/dist/common/arith.d.ts +35 -0
  31. package/dist/common/arith.d.ts.map +1 -0
  32. package/dist/common/arm-pow-data.d.ts +17 -0
  33. package/dist/common/arm-pow-data.d.ts.map +1 -0
  34. package/dist/common/arm-pow.d.ts +12 -0
  35. package/dist/common/arm-pow.d.ts.map +1 -0
  36. package/dist/common/arrows-constants.d.ts +97 -0
  37. package/dist/common/arrows-constants.d.ts.map +1 -0
  38. package/dist/common/arrows-geometry.d.ts +24 -0
  39. package/dist/common/arrows-geometry.d.ts.map +1 -0
  40. package/dist/common/arrows-miter.d.ts +24 -0
  41. package/dist/common/arrows-miter.d.ts.map +1 -0
  42. package/dist/common/arrows-shapes-poly.d.ts +24 -0
  43. package/dist/common/arrows-shapes-poly.d.ts.map +1 -0
  44. package/dist/common/arrows-shapes-util.d.ts +77 -0
  45. package/dist/common/arrows-shapes-util.d.ts.map +1 -0
  46. package/dist/common/arrows-shapes.d.ts +48 -0
  47. package/dist/common/arrows-shapes.d.ts.map +1 -0
  48. package/dist/common/arrows-types.d.ts +59 -0
  49. package/dist/common/arrows-types.d.ts.map +1 -0
  50. package/dist/common/arrows.d.ts +69 -0
  51. package/dist/common/arrows.d.ts.map +1 -0
  52. package/dist/common/color.d.ts +66 -0
  53. package/dist/common/color.d.ts.map +1 -0
  54. package/dist/common/colorData.d.ts +10 -0
  55. package/dist/common/colorData.d.ts.map +1 -0
  56. package/dist/common/compass-port.d.ts +39 -0
  57. package/dist/common/compass-port.d.ts.map +1 -0
  58. package/dist/common/crand.d.ts +42 -0
  59. package/dist/common/crand.d.ts.map +1 -0
  60. package/dist/common/edge-label-init.d.ts +51 -0
  61. package/dist/common/edge-label-init.d.ts.map +1 -0
  62. package/dist/common/edge-offset.d.ts +66 -0
  63. package/dist/common/edge-offset.d.ts.map +1 -0
  64. package/dist/common/ellipse-wedge.d.ts +10 -0
  65. package/dist/common/ellipse-wedge.d.ts.map +1 -0
  66. package/dist/common/emit-types.d.ts +255 -0
  67. package/dist/common/emit-types.d.ts.map +1 -0
  68. package/dist/common/fma.d.ts +10 -0
  69. package/dist/common/fma.d.ts.map +1 -0
  70. package/dist/common/graph-init.d.ts +61 -0
  71. package/dist/common/graph-init.d.ts.map +1 -0
  72. package/dist/common/html-entities.d.ts +17 -0
  73. package/dist/common/html-entities.d.ts.map +1 -0
  74. package/dist/common/html-string.d.ts +14 -0
  75. package/dist/common/html-string.d.ts.map +1 -0
  76. package/dist/common/htmltable-emit-fill.d.ts +84 -0
  77. package/dist/common/htmltable-emit-fill.d.ts.map +1 -0
  78. package/dist/common/htmltable-emit-rules.d.ts +79 -0
  79. package/dist/common/htmltable-emit-rules.d.ts.map +1 -0
  80. package/dist/common/htmltable-emit.d.ts +63 -0
  81. package/dist/common/htmltable-emit.d.ts.map +1 -0
  82. package/dist/common/htmltable-lex.d.ts +16 -0
  83. package/dist/common/htmltable-lex.d.ts.map +1 -0
  84. package/dist/common/htmltable-parse.d.ts +37 -0
  85. package/dist/common/htmltable-parse.d.ts.map +1 -0
  86. package/dist/common/htmltable-port.d.ts +15 -0
  87. package/dist/common/htmltable-port.d.ts.map +1 -0
  88. package/dist/common/htmltable-pos-runs.d.ts +88 -0
  89. package/dist/common/htmltable-pos-runs.d.ts.map +1 -0
  90. package/dist/common/htmltable-pos.d.ts +192 -0
  91. package/dist/common/htmltable-pos.d.ts.map +1 -0
  92. package/dist/common/htmltable-types.d.ts +237 -0
  93. package/dist/common/htmltable-types.d.ts.map +1 -0
  94. package/dist/common/htmltable.d.ts +74 -0
  95. package/dist/common/htmltable.d.ts.map +1 -0
  96. package/dist/common/layers.d.ts +20 -0
  97. package/dist/common/layers.d.ts.map +1 -0
  98. package/dist/common/make-label.d.ts +60 -0
  99. package/dist/common/make-label.d.ts.map +1 -0
  100. package/dist/common/multicolor.d.ts +46 -0
  101. package/dist/common/multicolor.d.ts.map +1 -0
  102. package/dist/common/nodeinit.d.ts +45 -0
  103. package/dist/common/nodeinit.d.ts.map +1 -0
  104. package/dist/common/poly-gencode.d.ts +40 -0
  105. package/dist/common/poly-gencode.d.ts.map +1 -0
  106. package/dist/common/poly-init.d.ts +51 -0
  107. package/dist/common/poly-init.d.ts.map +1 -0
  108. package/dist/common/poly-inside.d.ts +37 -0
  109. package/dist/common/poly-inside.d.ts.map +1 -0
  110. package/dist/common/poly-shapes-cases.d.ts +31 -0
  111. package/dist/common/poly-shapes-cases.d.ts.map +1 -0
  112. package/dist/common/poly-shapes-cases2.d.ts +25 -0
  113. package/dist/common/poly-shapes-cases2.d.ts.map +1 -0
  114. package/dist/common/poly-shapes-util.d.ts +42 -0
  115. package/dist/common/poly-shapes-util.d.ts.map +1 -0
  116. package/dist/common/poly-shapes.d.ts +39 -0
  117. package/dist/common/poly-shapes.d.ts.map +1 -0
  118. package/dist/common/poly-sizing.d.ts +189 -0
  119. package/dist/common/poly-sizing.d.ts.map +1 -0
  120. package/dist/common/poly-vertices.d.ts +42 -0
  121. package/dist/common/poly-vertices.d.ts.map +1 -0
  122. package/dist/common/postproc.d.ts +49 -0
  123. package/dist/common/postproc.d.ts.map +1 -0
  124. package/dist/common/ps-fontalias.d.ts +36 -0
  125. package/dist/common/ps-fontalias.d.ts.map +1 -0
  126. package/dist/common/random.d.ts +8 -0
  127. package/dist/common/random.d.ts.map +1 -0
  128. package/dist/common/record-port.d.ts +34 -0
  129. package/dist/common/record-port.d.ts.map +1 -0
  130. package/dist/common/record.d.ts +105 -0
  131. package/dist/common/record.d.ts.map +1 -0
  132. package/dist/common/shapeData.d.ts +186 -0
  133. package/dist/common/shapeData.d.ts.map +1 -0
  134. package/dist/common/shapes.d.ts +36 -0
  135. package/dist/common/shapes.d.ts.map +1 -0
  136. package/dist/common/spline-midpoint.d.ts +31 -0
  137. package/dist/common/spline-midpoint.d.ts.map +1 -0
  138. package/dist/common/splines-clip.d.ts +21 -0
  139. package/dist/common/splines-clip.d.ts.map +1 -0
  140. package/dist/common/splines-constants.d.ts +42 -0
  141. package/dist/common/splines-constants.d.ts.map +1 -0
  142. package/dist/common/splines-geom.d.ts +51 -0
  143. package/dist/common/splines-geom.d.ts.map +1 -0
  144. package/dist/common/splines-path-begin.d.ts +17 -0
  145. package/dist/common/splines-path-begin.d.ts.map +1 -0
  146. package/dist/common/splines-path-end.d.ts +17 -0
  147. package/dist/common/splines-path-end.d.ts.map +1 -0
  148. package/dist/common/splines-path-shared.d.ts +53 -0
  149. package/dist/common/splines-path-shared.d.ts.map +1 -0
  150. package/dist/common/splines-routespl.d.ts +40 -0
  151. package/dist/common/splines-routespl.d.ts.map +1 -0
  152. package/dist/common/splines-selfedge.d.ts +21 -0
  153. package/dist/common/splines-selfedge.d.ts.map +1 -0
  154. package/dist/common/splines.d.ts +18 -0
  155. package/dist/common/splines.d.ts.map +1 -0
  156. package/dist/common/style-resolve.d.ts +197 -0
  157. package/dist/common/style-resolve.d.ts.map +1 -0
  158. package/dist/common/subst.d.ts +31 -0
  159. package/dist/common/subst.d.ts.map +1 -0
  160. package/dist/common/taper.d.ts +23 -0
  161. package/dist/common/taper.d.ts.map +1 -0
  162. package/dist/common/textmeasure-factory.d.ts +33 -0
  163. package/dist/common/textmeasure-factory.d.ts.map +1 -0
  164. package/dist/common/textmeasure-lookup.d.ts +17 -0
  165. package/dist/common/textmeasure-lookup.d.ts.map +1 -0
  166. package/dist/common/textmeasure-lut-data-a.d.ts +13 -0
  167. package/dist/common/textmeasure-lut-data-a.d.ts.map +1 -0
  168. package/dist/common/textmeasure-lut-data-b.d.ts +12 -0
  169. package/dist/common/textmeasure-lut-data-b.d.ts.map +1 -0
  170. package/dist/common/textmeasure-lut-data-c.d.ts +13 -0
  171. package/dist/common/textmeasure-lut-data-c.d.ts.map +1 -0
  172. package/dist/common/textmeasure-lut-data.d.ts +27 -0
  173. package/dist/common/textmeasure-lut-data.d.ts.map +1 -0
  174. package/dist/common/textmeasure.d.ts +120 -0
  175. package/dist/common/textmeasure.d.ts.map +1 -0
  176. package/dist/common/types.d.ts +316 -0
  177. package/dist/common/types.d.ts.map +1 -0
  178. package/dist/common/xlabels-place.d.ts +125 -0
  179. package/dist/common/xlabels-place.d.ts.map +1 -0
  180. package/dist/debug.d.ts +58 -0
  181. package/dist/debug.d.ts.map +1 -0
  182. package/dist/errors.d.ts +63 -0
  183. package/dist/errors.d.ts.map +1 -0
  184. package/dist/gvc/anchor.d.ts +86 -0
  185. package/dist/gvc/anchor.d.ts.map +1 -0
  186. package/dist/gvc/context.d.ts +177 -0
  187. package/dist/gvc/context.d.ts.map +1 -0
  188. package/dist/gvc/default-context.d.ts +20 -0
  189. package/dist/gvc/default-context.d.ts.map +1 -0
  190. package/dist/gvc/device-cluster.d.ts +25 -0
  191. package/dist/gvc/device-cluster.d.ts.map +1 -0
  192. package/dist/gvc/device.d.ts +99 -0
  193. package/dist/gvc/device.d.ts.map +1 -0
  194. package/dist/gvc/edge-labels.d.ts +10 -0
  195. package/dist/gvc/edge-labels.d.ts.map +1 -0
  196. package/dist/gvc/emit-walk.d.ts +22 -0
  197. package/dist/gvc/emit-walk.d.ts.map +1 -0
  198. package/dist/gvc/image-resolver.d.ts +44 -0
  199. package/dist/gvc/image-resolver.d.ts.map +1 -0
  200. package/dist/gvc/job.d.ts +234 -0
  201. package/dist/gvc/job.d.ts.map +1 -0
  202. package/dist/gvc/textlayout.d.ts +33 -0
  203. package/dist/gvc/textlayout.d.ts.map +1 -0
  204. package/dist/gvc/textspan-emit.d.ts +41 -0
  205. package/dist/gvc/textspan-emit.d.ts.map +1 -0
  206. package/dist/gvc/usershape.d.ts +25 -0
  207. package/dist/gvc/usershape.d.ts.map +1 -0
  208. package/dist/gvc/viewport.d.ts +71 -0
  209. package/dist/gvc/viewport.d.ts.map +1 -0
  210. package/dist/index.d.ts +54 -0
  211. package/dist/index.d.ts.map +1 -0
  212. package/dist/index.js +52862 -0
  213. package/dist/index.js.map +7 -0
  214. package/dist/label/index.d.ts +74 -0
  215. package/dist/label/index.d.ts.map +1 -0
  216. package/dist/label/node.d.ts +108 -0
  217. package/dist/label/node.d.ts.map +1 -0
  218. package/dist/label/rectangle.d.ts +60 -0
  219. package/dist/label/rectangle.d.ts.map +1 -0
  220. package/dist/label/split-q.d.ts +13 -0
  221. package/dist/label/split-q.d.ts.map +1 -0
  222. package/dist/label/xlabels-geom.d.ts +46 -0
  223. package/dist/label/xlabels-geom.d.ts.map +1 -0
  224. package/dist/label/xlabels-intersect.d.ts +79 -0
  225. package/dist/label/xlabels-intersect.d.ts.map +1 -0
  226. package/dist/label/xlabels.d.ts +67 -0
  227. package/dist/label/xlabels.d.ts.map +1 -0
  228. package/dist/layout/circo/blockpath.d.ts +120 -0
  229. package/dist/layout/circo/blockpath.d.ts.map +1 -0
  230. package/dist/layout/circo/blocks.d.ts +135 -0
  231. package/dist/layout/circo/blocks.d.ts.map +1 -0
  232. package/dist/layout/circo/blocktree.d.ts +51 -0
  233. package/dist/layout/circo/blocktree.d.ts.map +1 -0
  234. package/dist/layout/circo/circular.d.ts +59 -0
  235. package/dist/layout/circo/circular.d.ts.map +1 -0
  236. package/dist/layout/circo/index.d.ts +35 -0
  237. package/dist/layout/circo/index.d.ts.map +1 -0
  238. package/dist/layout/circo/init.d.ts +50 -0
  239. package/dist/layout/circo/init.d.ts.map +1 -0
  240. package/dist/layout/circo/position-helpers.d.ts +33 -0
  241. package/dist/layout/circo/position-helpers.d.ts.map +1 -0
  242. package/dist/layout/circo/position.d.ts +66 -0
  243. package/dist/layout/circo/position.d.ts.map +1 -0
  244. package/dist/layout/dot/acyclic.d.ts +8 -0
  245. package/dist/layout/dot/acyclic.d.ts.map +1 -0
  246. package/dist/layout/dot/aspect.d.ts +17 -0
  247. package/dist/layout/dot/aspect.d.ts.map +1 -0
  248. package/dist/layout/dot/classify.d.ts +52 -0
  249. package/dist/layout/dot/classify.d.ts.map +1 -0
  250. package/dist/layout/dot/cluster-path.d.ts +38 -0
  251. package/dist/layout/dot/cluster-path.d.ts.map +1 -0
  252. package/dist/layout/dot/cluster.d.ts +102 -0
  253. package/dist/layout/dot/cluster.d.ts.map +1 -0
  254. package/dist/layout/dot/compound-clip.d.ts +69 -0
  255. package/dist/layout/dot/compound-clip.d.ts.map +1 -0
  256. package/dist/layout/dot/compound-geom.d.ts +115 -0
  257. package/dist/layout/dot/compound-geom.d.ts.map +1 -0
  258. package/dist/layout/dot/compound.d.ts +56 -0
  259. package/dist/layout/dot/compound.d.ts.map +1 -0
  260. package/dist/layout/dot/conc.d.ts +88 -0
  261. package/dist/layout/dot/conc.d.ts.map +1 -0
  262. package/dist/layout/dot/decomp.d.ts +66 -0
  263. package/dist/layout/dot/decomp.d.ts.map +1 -0
  264. package/dist/layout/dot/edge-order.d.ts +27 -0
  265. package/dist/layout/dot/edge-order.d.ts.map +1 -0
  266. package/dist/layout/dot/edge-route-arrow.d.ts +46 -0
  267. package/dist/layout/dot/edge-route-arrow.d.ts.map +1 -0
  268. package/dist/layout/dot/edge-route-boxes.d.ts +75 -0
  269. package/dist/layout/dot/edge-route-boxes.d.ts.map +1 -0
  270. package/dist/layout/dot/edge-route-chain.d.ts +67 -0
  271. package/dist/layout/dot/edge-route-chain.d.ts.map +1 -0
  272. package/dist/layout/dot/edge-route-clip.d.ts +88 -0
  273. package/dist/layout/dot/edge-route-clip.d.ts.map +1 -0
  274. package/dist/layout/dot/edge-route-faithful.d.ts +94 -0
  275. package/dist/layout/dot/edge-route-faithful.d.ts.map +1 -0
  276. package/dist/layout/dot/edge-route-geom.d.ts +43 -0
  277. package/dist/layout/dot/edge-route-geom.d.ts.map +1 -0
  278. package/dist/layout/dot/edge-route-helpers.d.ts +50 -0
  279. package/dist/layout/dot/edge-route-helpers.d.ts.map +1 -0
  280. package/dist/layout/dot/edge-route-poly.d.ts +48 -0
  281. package/dist/layout/dot/edge-route-poly.d.ts.map +1 -0
  282. package/dist/layout/dot/edge-route-rank.d.ts +57 -0
  283. package/dist/layout/dot/edge-route-rank.d.ts.map +1 -0
  284. package/dist/layout/dot/edge-route-routing.d.ts +99 -0
  285. package/dist/layout/dot/edge-route-routing.d.ts.map +1 -0
  286. package/dist/layout/dot/edge-route.d.ts +57 -0
  287. package/dist/layout/dot/edge-route.d.ts.map +1 -0
  288. package/dist/layout/dot/fastgr.d.ts +147 -0
  289. package/dist/layout/dot/fastgr.d.ts.map +1 -0
  290. package/dist/layout/dot/flat-utils.d.ts +21 -0
  291. package/dist/layout/dot/flat-utils.d.ts.map +1 -0
  292. package/dist/layout/dot/flat.d.ts +152 -0
  293. package/dist/layout/dot/flat.d.ts.map +1 -0
  294. package/dist/layout/dot/graph-label.d.ts +18 -0
  295. package/dist/layout/dot/graph-label.d.ts.map +1 -0
  296. package/dist/layout/dot/index.d.ts +128 -0
  297. package/dist/layout/dot/index.d.ts.map +1 -0
  298. package/dist/layout/dot/init.d.ts +93 -0
  299. package/dist/layout/dot/init.d.ts.map +1 -0
  300. package/dist/layout/dot/label-order.d.ts +45 -0
  301. package/dist/layout/dot/label-order.d.ts.map +1 -0
  302. package/dist/layout/dot/mincross-build.d.ts +52 -0
  303. package/dist/layout/dot/mincross-build.d.ts.map +1 -0
  304. package/dist/layout/dot/mincross-cross.d.ts +80 -0
  305. package/dist/layout/dot/mincross-cross.d.ts.map +1 -0
  306. package/dist/layout/dot/mincross-flat.d.ts +27 -0
  307. package/dist/layout/dot/mincross-flat.d.ts.map +1 -0
  308. package/dist/layout/dot/mincross-order.d.ts +89 -0
  309. package/dist/layout/dot/mincross-order.d.ts.map +1 -0
  310. package/dist/layout/dot/mincross-utils.d.ts +60 -0
  311. package/dist/layout/dot/mincross-utils.d.ts.map +1 -0
  312. package/dist/layout/dot/mincross.d.ts +75 -0
  313. package/dist/layout/dot/mincross.d.ts.map +1 -0
  314. package/dist/layout/dot/ns-core.d.ts +37 -0
  315. package/dist/layout/dot/ns-core.d.ts.map +1 -0
  316. package/dist/layout/dot/ns-range.d.ts +17 -0
  317. package/dist/layout/dot/ns-range.d.ts.map +1 -0
  318. package/dist/layout/dot/ns-subtree.d.ts +78 -0
  319. package/dist/layout/dot/ns-subtree.d.ts.map +1 -0
  320. package/dist/layout/dot/ns.d.ts +86 -0
  321. package/dist/layout/dot/ns.d.ts.map +1 -0
  322. package/dist/layout/dot/ortho-adapter.d.ts +19 -0
  323. package/dist/layout/dot/ortho-adapter.d.ts.map +1 -0
  324. package/dist/layout/dot/pack-components.d.ts +100 -0
  325. package/dist/layout/dot/pack-components.d.ts.map +1 -0
  326. package/dist/layout/dot/position-aux.d.ts +110 -0
  327. package/dist/layout/dot/position-aux.d.ts.map +1 -0
  328. package/dist/layout/dot/position-bbox.d.ts +57 -0
  329. package/dist/layout/dot/position-bbox.d.ts.map +1 -0
  330. package/dist/layout/dot/position-cluster.d.ts +48 -0
  331. package/dist/layout/dot/position-cluster.d.ts.map +1 -0
  332. package/dist/layout/dot/position-ycoords.d.ts +42 -0
  333. package/dist/layout/dot/position-ycoords.d.ts.map +1 -0
  334. package/dist/layout/dot/position.d.ts +47 -0
  335. package/dist/layout/dot/position.d.ts.map +1 -0
  336. package/dist/layout/dot/rank-dot2.d.ts +114 -0
  337. package/dist/layout/dot/rank-dot2.d.ts.map +1 -0
  338. package/dist/layout/dot/rank.d.ts +119 -0
  339. package/dist/layout/dot/rank.d.ts.map +1 -0
  340. package/dist/layout/dot/sameport.d.ts +70 -0
  341. package/dist/layout/dot/sameport.d.ts.map +1 -0
  342. package/dist/layout/dot/self-loop.d.ts +54 -0
  343. package/dist/layout/dot/self-loop.d.ts.map +1 -0
  344. package/dist/layout/dot/splines-clone.d.ts +33 -0
  345. package/dist/layout/dot/splines-clone.d.ts.map +1 -0
  346. package/dist/layout/dot/splines-flat-labeled.d.ts +101 -0
  347. package/dist/layout/dot/splines-flat-labeled.d.ts.map +1 -0
  348. package/dist/layout/dot/splines-flat-multi.d.ts +35 -0
  349. package/dist/layout/dot/splines-flat-multi.d.ts.map +1 -0
  350. package/dist/layout/dot/splines-flat.d.ts +116 -0
  351. package/dist/layout/dot/splines-flat.d.ts.map +1 -0
  352. package/dist/layout/dot/splines-groups.d.ts +38 -0
  353. package/dist/layout/dot/splines-groups.d.ts.map +1 -0
  354. package/dist/layout/dot/splines-label.d.ts +105 -0
  355. package/dist/layout/dot/splines-label.d.ts.map +1 -0
  356. package/dist/layout/dot/splines-route-type.d.ts +28 -0
  357. package/dist/layout/dot/splines-route-type.d.ts.map +1 -0
  358. package/dist/layout/dot/splines-route.d.ts +99 -0
  359. package/dist/layout/dot/splines-route.d.ts.map +1 -0
  360. package/dist/layout/dot/splines.d.ts +157 -0
  361. package/dist/layout/dot/splines.d.ts.map +1 -0
  362. package/dist/layout/dot/straight-edges.d.ts +39 -0
  363. package/dist/layout/dot/straight-edges.d.ts.map +1 -0
  364. package/dist/layout/fdp/cluster-edges.d.ts +31 -0
  365. package/dist/layout/fdp/cluster-edges.d.ts.map +1 -0
  366. package/dist/layout/fdp/comp.d.ts +29 -0
  367. package/dist/layout/fdp/comp.d.ts.map +1 -0
  368. package/dist/layout/fdp/derive.d.ts +39 -0
  369. package/dist/layout/fdp/derive.d.ts.map +1 -0
  370. package/dist/layout/fdp/fdp-model.d.ts +101 -0
  371. package/dist/layout/fdp/fdp-model.d.ts.map +1 -0
  372. package/dist/layout/fdp/grid.d.ts +49 -0
  373. package/dist/layout/fdp/grid.d.ts.map +1 -0
  374. package/dist/layout/fdp/index.d.ts +36 -0
  375. package/dist/layout/fdp/index.d.ts.map +1 -0
  376. package/dist/layout/fdp/init.d.ts +26 -0
  377. package/dist/layout/fdp/init.d.ts.map +1 -0
  378. package/dist/layout/fdp/layout.d.ts +57 -0
  379. package/dist/layout/fdp/layout.d.ts.map +1 -0
  380. package/dist/layout/fdp/normalize.d.ts +18 -0
  381. package/dist/layout/fdp/normalize.d.ts.map +1 -0
  382. package/dist/layout/fdp/ports.d.ts +41 -0
  383. package/dist/layout/fdp/ports.d.ts.map +1 -0
  384. package/dist/layout/fdp/tlayout-init.d.ts +21 -0
  385. package/dist/layout/fdp/tlayout-init.d.ts.map +1 -0
  386. package/dist/layout/fdp/tlayout-parms.d.ts +98 -0
  387. package/dist/layout/fdp/tlayout-parms.d.ts.map +1 -0
  388. package/dist/layout/fdp/tlayout.d.ts +43 -0
  389. package/dist/layout/fdp/tlayout.d.ts.map +1 -0
  390. package/dist/layout/fdp/xlayout.d.ts +26 -0
  391. package/dist/layout/fdp/xlayout.d.ts.map +1 -0
  392. package/dist/layout/neato/bfs.d.ts +43 -0
  393. package/dist/layout/neato/bfs.d.ts.map +1 -0
  394. package/dist/layout/neato/cdt-surface.d.ts +16 -0
  395. package/dist/layout/neato/cdt-surface.d.ts.map +1 -0
  396. package/dist/layout/neato/conjgrad.d.ts +61 -0
  397. package/dist/layout/neato/conjgrad.d.ts.map +1 -0
  398. package/dist/layout/neato/delaunay.d.ts +28 -0
  399. package/dist/layout/neato/delaunay.d.ts.map +1 -0
  400. package/dist/layout/neato/dijkstra.d.ts +80 -0
  401. package/dist/layout/neato/dijkstra.d.ts.map +1 -0
  402. package/dist/layout/neato/fdp-adjust.d.ts +31 -0
  403. package/dist/layout/neato/fdp-adjust.d.ts.map +1 -0
  404. package/dist/layout/neato/index.d.ts +58 -0
  405. package/dist/layout/neato/index.d.ts.map +1 -0
  406. package/dist/layout/neato/init.d.ts +207 -0
  407. package/dist/layout/neato/init.d.ts.map +1 -0
  408. package/dist/layout/neato/legal.d.ts +7 -0
  409. package/dist/layout/neato/legal.d.ts.map +1 -0
  410. package/dist/layout/neato/matrix-ops.d.ts +28 -0
  411. package/dist/layout/neato/matrix-ops.d.ts.map +1 -0
  412. package/dist/layout/neato/multispline-router.d.ts +80 -0
  413. package/dist/layout/neato/multispline-router.d.ts.map +1 -0
  414. package/dist/layout/neato/multispline.d.ts +24 -0
  415. package/dist/layout/neato/multispline.d.ts.map +1 -0
  416. package/dist/layout/neato/overlap-prism.d.ts +26 -0
  417. package/dist/layout/neato/overlap-prism.d.ts.map +1 -0
  418. package/dist/layout/neato/overlap.d.ts +85 -0
  419. package/dist/layout/neato/overlap.d.ts.map +1 -0
  420. package/dist/layout/neato/sc-adjust.d.ts +33 -0
  421. package/dist/layout/neato/sc-adjust.d.ts.map +1 -0
  422. package/dist/layout/neato/sep-factor.d.ts +41 -0
  423. package/dist/layout/neato/sep-factor.d.ts.map +1 -0
  424. package/dist/layout/neato/set-aspect.d.ts +33 -0
  425. package/dist/layout/neato/set-aspect.d.ts.map +1 -0
  426. package/dist/layout/neato/sgd.d.ts +166 -0
  427. package/dist/layout/neato/sgd.d.ts.map +1 -0
  428. package/dist/layout/neato/splines.d.ts +153 -0
  429. package/dist/layout/neato/splines.d.ts.map +1 -0
  430. package/dist/layout/neato/stress-kernel.d.ts +53 -0
  431. package/dist/layout/neato/stress-kernel.d.ts.map +1 -0
  432. package/dist/layout/neato/stress.d.ts +158 -0
  433. package/dist/layout/neato/stress.d.ts.map +1 -0
  434. package/dist/layout/osage/index.d.ts +158 -0
  435. package/dist/layout/osage/index.d.ts.map +1 -0
  436. package/dist/layout/osage/layout.d.ts +49 -0
  437. package/dist/layout/osage/layout.d.ts.map +1 -0
  438. package/dist/layout/osage/types.d.ts +28 -0
  439. package/dist/layout/osage/types.d.ts.map +1 -0
  440. package/dist/layout/pack/array-pack.d.ts +114 -0
  441. package/dist/layout/pack/array-pack.d.ts.map +1 -0
  442. package/dist/layout/pack/index.d.ts +157 -0
  443. package/dist/layout/pack/index.d.ts.map +1 -0
  444. package/dist/layout/pack/poly-pack.d.ts +126 -0
  445. package/dist/layout/pack/poly-pack.d.ts.map +1 -0
  446. package/dist/layout/pack/poly-place.d.ts +27 -0
  447. package/dist/layout/pack/poly-place.d.ts.map +1 -0
  448. package/dist/layout/pack/spiral-search.d.ts +18 -0
  449. package/dist/layout/pack/spiral-search.d.ts.map +1 -0
  450. package/dist/layout/pack/test-helpers.d.ts +7 -0
  451. package/dist/layout/pack/test-helpers.d.ts.map +1 -0
  452. package/dist/layout/pack/types.d.ts +74 -0
  453. package/dist/layout/pack/types.d.ts.map +1 -0
  454. package/dist/layout/patchwork/index.d.ts +136 -0
  455. package/dist/layout/patchwork/index.d.ts.map +1 -0
  456. package/dist/layout/patchwork/tree-map.d.ts +32 -0
  457. package/dist/layout/patchwork/tree-map.d.ts.map +1 -0
  458. package/dist/layout/patchwork/tree-node.d.ts +46 -0
  459. package/dist/layout/patchwork/tree-node.d.ts.map +1 -0
  460. package/dist/layout/sfdp/index.d.ts +39 -0
  461. package/dist/layout/sfdp/index.d.ts.map +1 -0
  462. package/dist/layout/sfdp/init.d.ts +61 -0
  463. package/dist/layout/sfdp/init.d.ts.map +1 -0
  464. package/dist/layout/sfdp/multilevel.d.ts +23 -0
  465. package/dist/layout/sfdp/multilevel.d.ts.map +1 -0
  466. package/dist/layout/sfdp/quadtree.d.ts +45 -0
  467. package/dist/layout/sfdp/quadtree.d.ts.map +1 -0
  468. package/dist/layout/sfdp/sparse-matrix-multiply.d.ts +34 -0
  469. package/dist/layout/sfdp/sparse-matrix-multiply.d.ts.map +1 -0
  470. package/dist/layout/sfdp/sparse-matrix.d.ts +101 -0
  471. package/dist/layout/sfdp/sparse-matrix.d.ts.map +1 -0
  472. package/dist/layout/sfdp/sparse-solve.d.ts +14 -0
  473. package/dist/layout/sfdp/sparse-solve.d.ts.map +1 -0
  474. package/dist/layout/sfdp/spring-driver.d.ts +18 -0
  475. package/dist/layout/sfdp/spring-driver.d.ts.map +1 -0
  476. package/dist/layout/sfdp/spring-electrical.d.ts +61 -0
  477. package/dist/layout/sfdp/spring-electrical.d.ts.map +1 -0
  478. package/dist/layout/twopi/circle.d.ts +83 -0
  479. package/dist/layout/twopi/circle.d.ts.map +1 -0
  480. package/dist/layout/twopi/index.d.ts +24 -0
  481. package/dist/layout/twopi/index.d.ts.map +1 -0
  482. package/dist/layout/twopi/init.d.ts +85 -0
  483. package/dist/layout/twopi/init.d.ts.map +1 -0
  484. package/dist/layout/twopi/pipeline.d.ts +37 -0
  485. package/dist/layout/twopi/pipeline.d.ts.map +1 -0
  486. package/dist/layout/twopi/twopi-test-helpers.d.ts +12 -0
  487. package/dist/layout/twopi/twopi-test-helpers.d.ts.map +1 -0
  488. package/dist/model/algData.d.ts +175 -0
  489. package/dist/model/algData.d.ts.map +1 -0
  490. package/dist/model/cgraph-ops.d.ts +86 -0
  491. package/dist/model/cgraph-ops.d.ts.map +1 -0
  492. package/dist/model/edge.d.ts +80 -0
  493. package/dist/model/edge.d.ts.map +1 -0
  494. package/dist/model/edgeInfo.d.ts +299 -0
  495. package/dist/model/edgeInfo.d.ts.map +1 -0
  496. package/dist/model/geom.d.ts +149 -0
  497. package/dist/model/geom.d.ts.map +1 -0
  498. package/dist/model/graph.d.ts +135 -0
  499. package/dist/model/graph.d.ts.map +1 -0
  500. package/dist/model/graphInfo.d.ts +418 -0
  501. package/dist/model/graphInfo.d.ts.map +1 -0
  502. package/dist/model/index.d.ts +10 -0
  503. package/dist/model/index.d.ts.map +1 -0
  504. package/dist/model/layoutParams.d.ts +85 -0
  505. package/dist/model/layoutParams.d.ts.map +1 -0
  506. package/dist/model/node.d.ts +101 -0
  507. package/dist/model/node.d.ts.map +1 -0
  508. package/dist/model/nodeInfo.d.ts +278 -0
  509. package/dist/model/nodeInfo.d.ts.map +1 -0
  510. package/dist/model/rankEntry.d.ts +80 -0
  511. package/dist/model/rankEntry.d.ts.map +1 -0
  512. package/dist/ortho/chan-dict.d.ts +82 -0
  513. package/dist/ortho/chan-dict.d.ts.map +1 -0
  514. package/dist/ortho/fpq.d.ts +54 -0
  515. package/dist/ortho/fpq.d.ts.map +1 -0
  516. package/dist/ortho/index.d.ts +35 -0
  517. package/dist/ortho/index.d.ts.map +1 -0
  518. package/dist/ortho/maze-channels.d.ts +47 -0
  519. package/dist/ortho/maze-channels.d.ts.map +1 -0
  520. package/dist/ortho/maze.d.ts +27 -0
  521. package/dist/ortho/maze.d.ts.map +1 -0
  522. package/dist/ortho/ortho-parallel.d.ts +26 -0
  523. package/dist/ortho/ortho-parallel.d.ts.map +1 -0
  524. package/dist/ortho/ortho-route.d.ts +31 -0
  525. package/dist/ortho/ortho-route.d.ts.map +1 -0
  526. package/dist/ortho/partition.d.ts +34 -0
  527. package/dist/ortho/partition.d.ts.map +1 -0
  528. package/dist/ortho/rawgraph.d.ts +41 -0
  529. package/dist/ortho/rawgraph.d.ts.map +1 -0
  530. package/dist/ortho/sgraph.d.ts +74 -0
  531. package/dist/ortho/sgraph.d.ts.map +1 -0
  532. package/dist/ortho/trap-query.d.ts +32 -0
  533. package/dist/ortho/trap-query.d.ts.map +1 -0
  534. package/dist/ortho/trap-segment.d.ts +23 -0
  535. package/dist/ortho/trap-segment.d.ts.map +1 -0
  536. package/dist/ortho/trap-types.d.ts +91 -0
  537. package/dist/ortho/trap-types.d.ts.map +1 -0
  538. package/dist/ortho/trap-update.d.ts +12 -0
  539. package/dist/ortho/trap-update.d.ts.map +1 -0
  540. package/dist/ortho/trapezoid.d.ts +18 -0
  541. package/dist/ortho/trapezoid.d.ts.map +1 -0
  542. package/dist/ortho/types.d.ts +241 -0
  543. package/dist/ortho/types.d.ts.map +1 -0
  544. package/dist/parser/ast.d.ts +49 -0
  545. package/dist/parser/ast.d.ts.map +1 -0
  546. package/dist/parser/builder.d.ts +75 -0
  547. package/dist/parser/builder.d.ts.map +1 -0
  548. package/dist/parser/index.d.ts +97 -0
  549. package/dist/parser/index.d.ts.map +1 -0
  550. package/dist/pathplan/index.d.ts +8 -0
  551. package/dist/pathplan/index.d.ts.map +1 -0
  552. package/dist/pathplan/route.d.ts +9 -0
  553. package/dist/pathplan/route.d.ts.map +1 -0
  554. package/dist/pathplan/shortest.d.ts +5 -0
  555. package/dist/pathplan/shortest.d.ts.map +1 -0
  556. package/dist/pathplan/solvers.d.ts +5 -0
  557. package/dist/pathplan/solvers.d.ts.map +1 -0
  558. package/dist/pathplan/triang.d.ts +25 -0
  559. package/dist/pathplan/triang.d.ts.map +1 -0
  560. package/dist/pathplan/types.d.ts +22 -0
  561. package/dist/pathplan/types.d.ts.map +1 -0
  562. package/dist/pathplan/visibility.d.ts +13 -0
  563. package/dist/pathplan/visibility.d.ts.map +1 -0
  564. package/dist/pathplan/vispath.d.ts +9 -0
  565. package/dist/pathplan/vispath.d.ts.map +1 -0
  566. package/dist/rbtree/index.d.ts +127 -0
  567. package/dist/rbtree/index.d.ts.map +1 -0
  568. package/dist/render/color-resolve.d.ts +38 -0
  569. package/dist/render/color-resolve.d.ts.map +1 -0
  570. package/dist/render/dot.d.ts +379 -0
  571. package/dist/render/dot.d.ts.map +1 -0
  572. package/dist/render/index.d.ts +24 -0
  573. package/dist/render/index.d.ts.map +1 -0
  574. package/dist/render/json.d.ts +89 -0
  575. package/dist/render/json.d.ts.map +1 -0
  576. package/dist/render/map-test-helpers.d.ts +13 -0
  577. package/dist/render/map-test-helpers.d.ts.map +1 -0
  578. package/dist/render/map.d.ts +197 -0
  579. package/dist/render/map.d.ts.map +1 -0
  580. package/dist/render/public.d.ts +64 -0
  581. package/dist/render/public.d.ts.map +1 -0
  582. package/dist/render/svg-arrow-ops.d.ts +10 -0
  583. package/dist/render/svg-arrow-ops.d.ts.map +1 -0
  584. package/dist/render/svg-cluster.d.ts +9 -0
  585. package/dist/render/svg-cluster.d.ts.map +1 -0
  586. package/dist/render/svg-edge-ortho-radius.d.ts +31 -0
  587. package/dist/render/svg-edge-ortho-radius.d.ts.map +1 -0
  588. package/dist/render/svg-edge-split.d.ts +48 -0
  589. package/dist/render/svg-edge-split.d.ts.map +1 -0
  590. package/dist/render/svg-gradient.d.ts +46 -0
  591. package/dist/render/svg-gradient.d.ts.map +1 -0
  592. package/dist/render/svg-graph.d.ts +97 -0
  593. package/dist/render/svg-graph.d.ts.map +1 -0
  594. package/dist/render/svg-helpers.d.ts +122 -0
  595. package/dist/render/svg-helpers.d.ts.map +1 -0
  596. package/dist/render/svg-id.d.ts +28 -0
  597. package/dist/render/svg-id.d.ts.map +1 -0
  598. package/dist/render/svg-multicolor.d.ts +60 -0
  599. package/dist/render/svg-multicolor.d.ts.map +1 -0
  600. package/dist/render/svg-parallel-edge.d.ts +28 -0
  601. package/dist/render/svg-parallel-edge.d.ts.map +1 -0
  602. package/dist/render/svg-tapered-edge.d.ts +18 -0
  603. package/dist/render/svg-tapered-edge.d.ts.map +1 -0
  604. package/dist/render/svg.d.ts +104 -0
  605. package/dist/render/svg.d.ts.map +1 -0
  606. package/dist/render/xdot-public.d.ts +95 -0
  607. package/dist/render/xdot-public.d.ts.map +1 -0
  608. package/dist/render/xml-escape.d.ts +21 -0
  609. package/dist/render/xml-escape.d.ts.map +1 -0
  610. package/dist/render.js +52556 -0
  611. package/dist/render.js.map +7 -0
  612. package/dist/util/agxbuf.d.ts +72 -0
  613. package/dist/util/agxbuf.d.ts.map +1 -0
  614. package/dist/util/bsd-qsort.d.ts +22 -0
  615. package/dist/util/bsd-qsort.d.ts.map +1 -0
  616. package/dist/util/index.d.ts +11 -0
  617. package/dist/util/index.d.ts.map +1 -0
  618. package/dist/util/list.d.ts +47 -0
  619. package/dist/util/list.d.ts.map +1 -0
  620. package/dist/util/math.d.ts +54 -0
  621. package/dist/util/math.d.ts.map +1 -0
  622. package/dist/util/mt19937.d.ts +40 -0
  623. package/dist/util/mt19937.d.ts.map +1 -0
  624. package/dist/util/printf-round.d.ts +45 -0
  625. package/dist/util/printf-round.d.ts.map +1 -0
  626. package/dist/util/xml.d.ts +24 -0
  627. package/dist/util/xml.d.ts.map +1 -0
  628. package/dist/vpsc/Block.d.ts +116 -0
  629. package/dist/vpsc/Block.d.ts.map +1 -0
  630. package/dist/vpsc/Blocks.d.ts +66 -0
  631. package/dist/vpsc/Blocks.d.ts.map +1 -0
  632. package/dist/vpsc/Constraint.d.ts +51 -0
  633. package/dist/vpsc/Constraint.d.ts.map +1 -0
  634. package/dist/vpsc/HeapUtils.d.ts +37 -0
  635. package/dist/vpsc/HeapUtils.d.ts.map +1 -0
  636. package/dist/vpsc/Solver.d.ts +107 -0
  637. package/dist/vpsc/Solver.d.ts.map +1 -0
  638. package/dist/vpsc/SweepLine.d.ts +38 -0
  639. package/dist/vpsc/SweepLine.d.ts.map +1 -0
  640. package/dist/vpsc/Variable.d.ts +38 -0
  641. package/dist/vpsc/Variable.d.ts.map +1 -0
  642. package/dist/vpsc/index.d.ts +54 -0
  643. package/dist/vpsc/index.d.ts.map +1 -0
  644. package/dist/vpsc/sweepTypes.d.ts +29 -0
  645. package/dist/vpsc/sweepTypes.d.ts.map +1 -0
  646. package/dist/xdot/index.d.ts +6 -0
  647. package/dist/xdot/index.d.ts.map +1 -0
  648. package/dist/xdot/lex.d.ts +22 -0
  649. package/dist/xdot/lex.d.ts.map +1 -0
  650. package/dist/xdot/misc.d.ts +13 -0
  651. package/dist/xdot/misc.d.ts.map +1 -0
  652. package/dist/xdot/parse.d.ts +21 -0
  653. package/dist/xdot/parse.d.ts.map +1 -0
  654. package/dist/xdot/types.d.ts +152 -0
  655. package/dist/xdot/types.d.ts.map +1 -0
  656. package/package.json +113 -0
  657. package/src/api/builder.ts +277 -0
  658. package/src/api/edge-ops.ts +113 -0
  659. package/src/api/geometry.ts +307 -0
  660. package/src/api/index.ts +46 -0
  661. package/src/cdt/bag.ts +196 -0
  662. package/src/cdt/hash-core.ts +84 -0
  663. package/src/cdt/hash.ts +207 -0
  664. package/src/cdt/index.ts +17 -0
  665. package/src/cdt/splay-core.ts +301 -0
  666. package/src/cdt/splay.ts +191 -0
  667. package/src/cdt/strhash.ts +52 -0
  668. package/src/cdt/types.ts +13 -0
  669. package/src/common/arith.ts +39 -0
  670. package/src/common/arm-pow-data.ts +201 -0
  671. package/src/common/arm-pow.ts +296 -0
  672. package/src/common/arrows-constants.ts +175 -0
  673. package/src/common/arrows-geometry.ts +62 -0
  674. package/src/common/arrows-miter.ts +84 -0
  675. package/src/common/arrows-shapes-poly.ts +241 -0
  676. package/src/common/arrows-shapes-util.ts +162 -0
  677. package/src/common/arrows-shapes.ts +360 -0
  678. package/src/common/arrows-types.ts +59 -0
  679. package/src/common/arrows.ts +209 -0
  680. package/src/common/color.ts +340 -0
  681. package/src/common/colorData.ts +264 -0
  682. package/src/common/compass-port.ts +384 -0
  683. package/src/common/crand.ts +79 -0
  684. package/src/common/edge-label-init.ts +310 -0
  685. package/src/common/edge-offset.ts +140 -0
  686. package/src/common/ellipse-wedge.ts +189 -0
  687. package/src/common/emit-types.ts +332 -0
  688. package/src/common/fma.ts +52 -0
  689. package/src/common/graph-init.ts +359 -0
  690. package/src/common/html-entities.ts +299 -0
  691. package/src/common/html-string.ts +22 -0
  692. package/src/common/htmltable-emit-fill.ts +367 -0
  693. package/src/common/htmltable-emit-rules.ts +293 -0
  694. package/src/common/htmltable-emit.ts +345 -0
  695. package/src/common/htmltable-lex.ts +138 -0
  696. package/src/common/htmltable-parse.ts +539 -0
  697. package/src/common/htmltable-port.ts +32 -0
  698. package/src/common/htmltable-pos-runs.ts +313 -0
  699. package/src/common/htmltable-pos.ts +601 -0
  700. package/src/common/htmltable-types.ts +262 -0
  701. package/src/common/htmltable.ts +477 -0
  702. package/src/common/layers.ts +113 -0
  703. package/src/common/make-label.ts +192 -0
  704. package/src/common/multicolor.ts +167 -0
  705. package/src/common/nodeinit.ts +339 -0
  706. package/src/common/poly-gencode.ts +475 -0
  707. package/src/common/poly-init.ts +133 -0
  708. package/src/common/poly-inside.ts +202 -0
  709. package/src/common/poly-shapes-cases.ts +253 -0
  710. package/src/common/poly-shapes-cases2.ts +170 -0
  711. package/src/common/poly-shapes-util.ts +124 -0
  712. package/src/common/poly-shapes.ts +181 -0
  713. package/src/common/poly-sizing.ts +639 -0
  714. package/src/common/poly-vertices.ts +237 -0
  715. package/src/common/postproc.ts +436 -0
  716. package/src/common/ps-fontalias.ts +112 -0
  717. package/src/common/random.ts +37 -0
  718. package/src/common/record-port.ts +89 -0
  719. package/src/common/record.ts +523 -0
  720. package/src/common/shapeData.ts +502 -0
  721. package/src/common/shapes.ts +187 -0
  722. package/src/common/spline-midpoint.ts +105 -0
  723. package/src/common/splines-clip.ts +449 -0
  724. package/src/common/splines-constants.ts +53 -0
  725. package/src/common/splines-geom.ts +194 -0
  726. package/src/common/splines-path-begin.ts +243 -0
  727. package/src/common/splines-path-end.ts +231 -0
  728. package/src/common/splines-path-shared.ts +258 -0
  729. package/src/common/splines-routespl.ts +444 -0
  730. package/src/common/splines-selfedge.ts +403 -0
  731. package/src/common/splines.ts +33 -0
  732. package/src/common/style-resolve.ts +481 -0
  733. package/src/common/subst.ts +126 -0
  734. package/src/common/taper.ts +219 -0
  735. package/src/common/textmeasure-factory.ts +86 -0
  736. package/src/common/textmeasure-lookup.ts +50 -0
  737. package/src/common/textmeasure-lut-data-a.ts +182 -0
  738. package/src/common/textmeasure-lut-data-b.ts +140 -0
  739. package/src/common/textmeasure-lut-data-c.ts +221 -0
  740. package/src/common/textmeasure-lut-data.ts +78 -0
  741. package/src/common/textmeasure.ts +321 -0
  742. package/src/common/types.ts +425 -0
  743. package/src/common/xlabels-place.ts +475 -0
  744. package/src/debug.ts +38 -0
  745. package/src/errors.ts +95 -0
  746. package/src/gvc/anchor.ts +530 -0
  747. package/src/gvc/context.ts +260 -0
  748. package/src/gvc/default-context.ts +70 -0
  749. package/src/gvc/device-cluster.ts +114 -0
  750. package/src/gvc/device.ts +598 -0
  751. package/src/gvc/edge-labels.ts +116 -0
  752. package/src/gvc/emit-walk.ts +98 -0
  753. package/src/gvc/image-resolver.ts +137 -0
  754. package/src/gvc/job.ts +401 -0
  755. package/src/gvc/textlayout.ts +44 -0
  756. package/src/gvc/textspan-emit.ts +100 -0
  757. package/src/gvc/usershape.ts +33 -0
  758. package/src/gvc/viewport.ts +203 -0
  759. package/src/index.ts +165 -0
  760. package/src/label/index.ts +302 -0
  761. package/src/label/node.ts +278 -0
  762. package/src/label/rectangle.ts +123 -0
  763. package/src/label/split-q.ts +237 -0
  764. package/src/label/xlabels-geom.ts +132 -0
  765. package/src/label/xlabels-intersect.ts +421 -0
  766. package/src/label/xlabels.ts +212 -0
  767. package/src/layout/circo/blockpath.ts +560 -0
  768. package/src/layout/circo/blocks.ts +234 -0
  769. package/src/layout/circo/blocktree.ts +246 -0
  770. package/src/layout/circo/circular.ts +227 -0
  771. package/src/layout/circo/index.ts +90 -0
  772. package/src/layout/circo/init.ts +84 -0
  773. package/src/layout/circo/position-helpers.ts +104 -0
  774. package/src/layout/circo/position.ts +196 -0
  775. package/src/layout/dot/__fixtures__/xcoord-pivot-divergence.gv +79 -0
  776. package/src/layout/dot/acyclic.ts +60 -0
  777. package/src/layout/dot/aspect.ts +22 -0
  778. package/src/layout/dot/classify.ts +462 -0
  779. package/src/layout/dot/cluster-path.ts +200 -0
  780. package/src/layout/dot/cluster.ts +480 -0
  781. package/src/layout/dot/compound-clip.ts +224 -0
  782. package/src/layout/dot/compound-geom.ts +282 -0
  783. package/src/layout/dot/compound.ts +294 -0
  784. package/src/layout/dot/conc.ts +433 -0
  785. package/src/layout/dot/decomp.ts +165 -0
  786. package/src/layout/dot/edge-order.ts +62 -0
  787. package/src/layout/dot/edge-route-arrow.ts +87 -0
  788. package/src/layout/dot/edge-route-boxes.ts +99 -0
  789. package/src/layout/dot/edge-route-chain.ts +420 -0
  790. package/src/layout/dot/edge-route-clip.ts +253 -0
  791. package/src/layout/dot/edge-route-faithful.ts +404 -0
  792. package/src/layout/dot/edge-route-geom.ts +90 -0
  793. package/src/layout/dot/edge-route-helpers.ts +170 -0
  794. package/src/layout/dot/edge-route-poly.ts +174 -0
  795. package/src/layout/dot/edge-route-rank.ts +136 -0
  796. package/src/layout/dot/edge-route-routing.ts +219 -0
  797. package/src/layout/dot/edge-route.ts +490 -0
  798. package/src/layout/dot/fastgr.ts +377 -0
  799. package/src/layout/dot/flat-utils.ts +52 -0
  800. package/src/layout/dot/flat.ts +518 -0
  801. package/src/layout/dot/graph-label.ts +114 -0
  802. package/src/layout/dot/index.ts +302 -0
  803. package/src/layout/dot/init.ts +300 -0
  804. package/src/layout/dot/label-order.ts +161 -0
  805. package/src/layout/dot/mincross-build.ts +373 -0
  806. package/src/layout/dot/mincross-cross.ts +409 -0
  807. package/src/layout/dot/mincross-flat.ts +213 -0
  808. package/src/layout/dot/mincross-order.ts +401 -0
  809. package/src/layout/dot/mincross-utils.ts +170 -0
  810. package/src/layout/dot/mincross.ts +386 -0
  811. package/src/layout/dot/ns-core.ts +122 -0
  812. package/src/layout/dot/ns-range.ts +228 -0
  813. package/src/layout/dot/ns-subtree.ts +347 -0
  814. package/src/layout/dot/ns.ts +506 -0
  815. package/src/layout/dot/ortho-adapter.ts +133 -0
  816. package/src/layout/dot/pack-components.ts +433 -0
  817. package/src/layout/dot/position-aux.ts +382 -0
  818. package/src/layout/dot/position-bbox.ts +221 -0
  819. package/src/layout/dot/position-cluster.ts +286 -0
  820. package/src/layout/dot/position-ycoords.ts +287 -0
  821. package/src/layout/dot/position.ts +194 -0
  822. package/src/layout/dot/rank-dot2.ts +528 -0
  823. package/src/layout/dot/rank.ts +547 -0
  824. package/src/layout/dot/sameport.ts +278 -0
  825. package/src/layout/dot/self-loop.ts +147 -0
  826. package/src/layout/dot/splines-clone.ts +121 -0
  827. package/src/layout/dot/splines-flat-labeled.ts +408 -0
  828. package/src/layout/dot/splines-flat-multi.ts +188 -0
  829. package/src/layout/dot/splines-flat.ts +598 -0
  830. package/src/layout/dot/splines-groups.ts +190 -0
  831. package/src/layout/dot/splines-label.ts +432 -0
  832. package/src/layout/dot/splines-route-type.ts +44 -0
  833. package/src/layout/dot/splines-route.ts +478 -0
  834. package/src/layout/dot/splines.ts +538 -0
  835. package/src/layout/dot/straight-edges.ts +332 -0
  836. package/src/layout/fdp/cluster-edges.ts +0 -0
  837. package/src/layout/fdp/comp.ts +160 -0
  838. package/src/layout/fdp/derive.ts +272 -0
  839. package/src/layout/fdp/fdp-model.ts +238 -0
  840. package/src/layout/fdp/grid.ts +77 -0
  841. package/src/layout/fdp/index.ts +113 -0
  842. package/src/layout/fdp/init.ts +116 -0
  843. package/src/layout/fdp/layout.ts +485 -0
  844. package/src/layout/fdp/normalize.ts +100 -0
  845. package/src/layout/fdp/ports.ts +161 -0
  846. package/src/layout/fdp/tlayout-init.ts +230 -0
  847. package/src/layout/fdp/tlayout-parms.ts +234 -0
  848. package/src/layout/fdp/tlayout.ts +317 -0
  849. package/src/layout/fdp/xlayout.ts +350 -0
  850. package/src/layout/neato/bfs.ts +131 -0
  851. package/src/layout/neato/cdt-surface.ts +693 -0
  852. package/src/layout/neato/conjgrad.ts +159 -0
  853. package/src/layout/neato/delaunay.ts +259 -0
  854. package/src/layout/neato/dijkstra.ts +296 -0
  855. package/src/layout/neato/fdp-adjust.ts +124 -0
  856. package/src/layout/neato/index.ts +310 -0
  857. package/src/layout/neato/init.ts +505 -0
  858. package/src/layout/neato/legal.ts +316 -0
  859. package/src/layout/neato/matrix-ops.ts +112 -0
  860. package/src/layout/neato/multispline-router.ts +417 -0
  861. package/src/layout/neato/multispline.ts +427 -0
  862. package/src/layout/neato/overlap-prism.ts +503 -0
  863. package/src/layout/neato/overlap.ts +158 -0
  864. package/src/layout/neato/sc-adjust.ts +206 -0
  865. package/src/layout/neato/sep-factor.ts +118 -0
  866. package/src/layout/neato/set-aspect.ts +178 -0
  867. package/src/layout/neato/sgd.ts +461 -0
  868. package/src/layout/neato/splines.ts +1014 -0
  869. package/src/layout/neato/stress-kernel.ts +362 -0
  870. package/src/layout/neato/stress.ts +420 -0
  871. package/src/layout/osage/index.ts +548 -0
  872. package/src/layout/osage/layout.ts +254 -0
  873. package/src/layout/osage/types.ts +31 -0
  874. package/src/layout/pack/array-pack.ts +254 -0
  875. package/src/layout/pack/index.ts +570 -0
  876. package/src/layout/pack/poly-pack.ts +266 -0
  877. package/src/layout/pack/poly-place.ts +426 -0
  878. package/src/layout/pack/spiral-search.ts +106 -0
  879. package/src/layout/pack/test-helpers.ts +46 -0
  880. package/src/layout/pack/types.ts +85 -0
  881. package/src/layout/patchwork/index.ts +441 -0
  882. package/src/layout/patchwork/tree-map.ts +183 -0
  883. package/src/layout/patchwork/tree-node.ts +120 -0
  884. package/src/layout/sfdp/index.ts +231 -0
  885. package/src/layout/sfdp/init.ts +224 -0
  886. package/src/layout/sfdp/multilevel.ts +262 -0
  887. package/src/layout/sfdp/quadtree.ts +267 -0
  888. package/src/layout/sfdp/sparse-matrix-multiply.ts +160 -0
  889. package/src/layout/sfdp/sparse-matrix.ts +367 -0
  890. package/src/layout/sfdp/sparse-solve.ts +122 -0
  891. package/src/layout/sfdp/spring-driver.ts +209 -0
  892. package/src/layout/sfdp/spring-electrical.ts +431 -0
  893. package/src/layout/twopi/circle.ts +339 -0
  894. package/src/layout/twopi/index.ts +78 -0
  895. package/src/layout/twopi/init.ts +174 -0
  896. package/src/layout/twopi/pipeline.ts +98 -0
  897. package/src/layout/twopi/twopi-test-helpers.ts +44 -0
  898. package/src/model/algData.ts +194 -0
  899. package/src/model/cgraph-ops.ts +175 -0
  900. package/src/model/edge.ts +104 -0
  901. package/src/model/edgeInfo.ts +431 -0
  902. package/src/model/geom.ts +204 -0
  903. package/src/model/graph.ts +172 -0
  904. package/src/model/graphInfo.ts +528 -0
  905. package/src/model/index.ts +10 -0
  906. package/src/model/layoutParams.ts +127 -0
  907. package/src/model/node.ts +138 -0
  908. package/src/model/nodeInfo.ts +424 -0
  909. package/src/model/rankEntry.ts +95 -0
  910. package/src/ortho/chan-dict.ts +236 -0
  911. package/src/ortho/fpq.ts +149 -0
  912. package/src/ortho/index.ts +206 -0
  913. package/src/ortho/maze-channels.ts +196 -0
  914. package/src/ortho/maze.ts +311 -0
  915. package/src/ortho/ortho-parallel.ts +254 -0
  916. package/src/ortho/ortho-route.ts +349 -0
  917. package/src/ortho/partition.ts +303 -0
  918. package/src/ortho/rawgraph.ts +119 -0
  919. package/src/ortho/sgraph.ts +283 -0
  920. package/src/ortho/trap-query.ts +174 -0
  921. package/src/ortho/trap-segment.ts +303 -0
  922. package/src/ortho/trap-types.ts +171 -0
  923. package/src/ortho/trap-update.ts +89 -0
  924. package/src/ortho/trapezoid.ts +120 -0
  925. package/src/ortho/types.ts +286 -0
  926. package/src/parser/__fixtures__/directed.dot +10 -0
  927. package/src/parser/__fixtures__/simple.dot +7 -0
  928. package/src/parser/__fixtures__/subgraph.dot +17 -0
  929. package/src/parser/ast.ts +64 -0
  930. package/src/parser/builder.ts +401 -0
  931. package/src/parser/dot.d.ts +208 -0
  932. package/src/parser/dot.js +3321 -0
  933. package/src/parser/dot.pegjs +263 -0
  934. package/src/parser/index.ts +353 -0
  935. package/src/pathplan/index.ts +9 -0
  936. package/src/pathplan/route.ts +284 -0
  937. package/src/pathplan/shortest.ts +268 -0
  938. package/src/pathplan/solvers.ts +65 -0
  939. package/src/pathplan/triang.ts +221 -0
  940. package/src/pathplan/types.ts +16 -0
  941. package/src/pathplan/visibility.ts +170 -0
  942. package/src/pathplan/vispath.ts +118 -0
  943. package/src/rbtree/index.ts +418 -0
  944. package/src/render/color-resolve.ts +171 -0
  945. package/src/render/dot.ts +1514 -0
  946. package/src/render/index.ts +29 -0
  947. package/src/render/json.ts +734 -0
  948. package/src/render/map-test-helpers.ts +61 -0
  949. package/src/render/map.ts +528 -0
  950. package/src/render/public.ts +131 -0
  951. package/src/render/svg-arrow-ops.ts +113 -0
  952. package/src/render/svg-cluster.ts +24 -0
  953. package/src/render/svg-edge-ortho-radius.ts +228 -0
  954. package/src/render/svg-edge-split.ts +180 -0
  955. package/src/render/svg-gradient.ts +185 -0
  956. package/src/render/svg-graph.ts +415 -0
  957. package/src/render/svg-helpers.ts +623 -0
  958. package/src/render/svg-id.ts +76 -0
  959. package/src/render/svg-multicolor.ts +313 -0
  960. package/src/render/svg-parallel-edge.ts +123 -0
  961. package/src/render/svg-tapered-edge.ts +56 -0
  962. package/src/render/svg.ts +307 -0
  963. package/src/render/xdot-public.ts +164 -0
  964. package/src/render/xml-escape.ts +56 -0
  965. package/src/util/agxbuf.ts +138 -0
  966. package/src/util/bsd-qsort.ts +251 -0
  967. package/src/util/index.ts +25 -0
  968. package/src/util/list.ts +122 -0
  969. package/src/util/math.ts +104 -0
  970. package/src/util/mt19937.ts +143 -0
  971. package/src/util/printf-round.ts +163 -0
  972. package/src/util/xml.ts +184 -0
  973. package/src/vpsc/Block.ts +375 -0
  974. package/src/vpsc/Blocks.ts +164 -0
  975. package/src/vpsc/Constraint.ts +94 -0
  976. package/src/vpsc/HeapUtils.ts +88 -0
  977. package/src/vpsc/Solver.ts +274 -0
  978. package/src/vpsc/SweepLine.ts +214 -0
  979. package/src/vpsc/Variable.ts +54 -0
  980. package/src/vpsc/index.ts +122 -0
  981. package/src/vpsc/sweepTypes.ts +31 -0
  982. package/src/xdot/index.ts +7 -0
  983. package/src/xdot/lex.ts +151 -0
  984. package/src/xdot/misc.ts +226 -0
  985. package/src/xdot/parse.ts +349 -0
  986. package/src/xdot/types.ts +158 -0
@@ -0,0 +1,408 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * make_flat_labeled_edge — route a non-adjacent same-rank (flat) edge that
5
+ * carries a center label, around the label virtual node created by flat_node
6
+ * (flat.ts:flatNode, T1). Sets the label position and installs the spline.
7
+ *
8
+ * Split out of splines-flat.ts (which is at the file-size cap) and reuses its
9
+ * makeFlatEndBox / flatBboxCtx / freshFlatPath helpers. Dispatched from the
10
+ * live router (edge-route.ts:routeForwardEdge) — see decisions.md#ad-3.
11
+ *
12
+ * @see lib/dotgen/dotsplines.c:make_flat_labeled_edge
13
+ */
14
+
15
+ import type { Graph } from '../../model/graph.js';
16
+ import type { Edge } from '../../model/edge.js';
17
+ import type { Node } from '../../model/node.js';
18
+ import type { Box, Point } from '../../model/geom.js';
19
+ import { makeFlatEndBox, flatBboxCtx, freshFlatPath } from './splines-flat.js';
20
+ import { graphRanksep } from './position-aux.js';
21
+ import { addBox } from '../../common/splines-path-shared.js';
22
+ import { routeSplines, routePolylines } from '../../common/splines-routespl.js';
23
+ import { clipAndInstall } from '../../common/splines-clip.js';
24
+ import { buildDotSinfo } from './self-loop.js';
25
+ import { TOP } from '../../common/splines-constants.js';
26
+ import { edgeType, EDGETYPE_LINE, EDGETYPE_SPLINE, EDGETYPE_PLINE, getMainEdge, swapEndsP, swapEdgeSpline } from './splines.js';
27
+ import { shortestPath, routeSpline, polyBarriers, makePolyline } from '../../pathplan/index.js';
28
+ import { gvQsort } from '../../util/bsd-qsort.js';
29
+
30
+ /** Space between stacked flat labels, in points. @see lib/dotgen/dotsplines.c:937 */
31
+ const LBL_SPACE = 6;
32
+
33
+ /**
34
+ * Walk `ED_to_virt(e)` to the end of the chain; the tail of the last edge is the
35
+ * label virtual node `ln`. @see lib/dotgen/dotsplines.c:make_flat_labeled_edge 1328-1330
36
+ */
37
+ export function findLabelNode(e: Edge): Node | null {
38
+ let f = e.info.to_virt;
39
+ if (f === undefined) return null;
40
+ while (f.info.to_virt !== undefined) f = f.info.to_virt;
41
+ return f.tail;
42
+ }
43
+
44
+ /**
45
+ * The label box `lb` straddling the label node, with the C `ydelta`/6 clamp.
46
+ * @see lib/dotgen/dotsplines.c:make_flat_labeled_edge 1349-1355
47
+ */
48
+ export function flatLabelBox(g: Graph, ln: Node, tn: Node): Box {
49
+ const rk = g.info.rank![tn.info.rank!];
50
+ const ydelta = (ln.info.coord.y - rk.ht1 - tn.info.coord.y + rk.ht2) / 6;
51
+ const ury = ln.info.coord.y + ln.info.ht / 2;
52
+ return {
53
+ ll: { x: ln.info.coord.x - ln.info.lw, y: ury - Math.max(5, ydelta) },
54
+ ur: { x: ln.info.coord.x + ln.info.rw, y: ury },
55
+ };
56
+ }
57
+
58
+ /**
59
+ * The three connector boxes between the tail end, label box, and head end.
60
+ * @see lib/dotgen/dotsplines.c:make_flat_labeled_edge 1360-1393
61
+ */
62
+ export function flatLabeledBoxes(tlast: Box, hlast: Box, lb: Box): Box[] {
63
+ return [
64
+ { ll: { x: tlast.ll.x, y: tlast.ur.y }, ur: { x: lb.ll.x, y: lb.ll.y } },
65
+ { ll: { x: tlast.ll.x, y: lb.ll.y }, ur: { x: hlast.ur.x, y: lb.ur.y } },
66
+ { ll: { x: lb.ur.x, y: hlast.ur.y }, ur: { x: hlast.ur.x, y: lb.ll.y } },
67
+ ];
68
+ }
69
+
70
+ /**
71
+ * EDGETYPE_LINE 7-point polyline: start, label (lowered by half label height),
72
+ * end. @see lib/dotgen/dotsplines.c:make_flat_labeled_edge 1335-1347
73
+ */
74
+ export function flatLabeledLinePoints(tn: Node, hn: Node, e: Edge): Point[] {
75
+ const lbl = e.info.label!;
76
+ const sx = tn.info.coord.x + e.info.tail_port.p.x;
77
+ const sy = tn.info.coord.y + e.info.tail_port.p.y;
78
+ const ex = hn.info.coord.x + e.info.head_port.p.x;
79
+ const ey = hn.info.coord.y + e.info.head_port.p.y;
80
+ const lx = lbl.pos.x;
81
+ const ly = lbl.pos.y - lbl.dimen.y / 2;
82
+ return [
83
+ { x: sx, y: sy }, { x: sx, y: sy },
84
+ { x: lx, y: ly }, { x: lx, y: ly }, { x: lx, y: ly },
85
+ { x: ex, y: ey }, { x: ex, y: ey },
86
+ ];
87
+ }
88
+
89
+ /**
90
+ * Build the tail/label/head box channel and route a spline (or polyline)
91
+ * through it. @see lib/dotgen/dotsplines.c:make_flat_labeled_edge 1349-1411
92
+ */
93
+ export function routeFlatLabeledChannel(g: Graph, e: Edge, ln: Node, et: number): Point[] | null {
94
+ const tn = e.tail, hn = e.head;
95
+ const lb = flatLabelBox(g, ln, tn);
96
+ const ctx = flatBboxCtx(g);
97
+ const ranksep = graphRanksep(g);
98
+ const P = freshFlatPath();
99
+ const tend = makeFlatEndBox({ ctx, P, e, n: tn, side: TOP, ranksep, isBegin: true });
100
+ const hend = makeFlatEndBox({ ctx, P, e, n: hn, side: TOP, ranksep, isBegin: false });
101
+ const boxes = flatLabeledBoxes(tend.boxes[tend.boxn - 1], hend.boxes[hend.boxn - 1], lb);
102
+ for (let i = 0; i < tend.boxn; i++) addBox(P, tend.boxes[i]);
103
+ for (const b of boxes) addBox(P, b);
104
+ for (let i = hend.boxn - 1; i >= 0; i--) addBox(P, hend.boxes[i]);
105
+ return et === EDGETYPE_SPLINE ? routeSplines(P) : routePolylines(P);
106
+ }
107
+
108
+ /**
109
+ * Decline unless `e` is a non-adjacent, same-rank, labeled flat edge with a
110
+ * label vnode reachable via its to_virt chain; otherwise return that vnode.
111
+ */
112
+ export function flatLabelTarget(e: Edge): Node | null {
113
+ if (e.info.label === undefined || (e.info.adjacent ?? 0) !== 0) return null;
114
+ if (e.tail.info.rank === undefined || e.tail.info.rank !== e.head.info.rank) return null;
115
+ return findLabelNode(e);
116
+ }
117
+
118
+ /**
119
+ * Route a non-adjacent labeled flat edge around its label vnode and install the
120
+ * spline. Sets `ED_label(e).pos` / `.set` so the label `<text>` is emitted.
121
+ * Returns false (declining) when `e` is not such an edge so the caller falls
122
+ * back to its normal routing. @see lib/dotgen/dotsplines.c:make_flat_labeled_edge
123
+ */
124
+ export function makeFlatLabeledEdge(g: Graph, e: Edge): boolean {
125
+ const ln = flatLabelTarget(e);
126
+ if (ln === null) return false;
127
+ const lbl = e.info.label!;
128
+ lbl.pos = { x: ln.info.coord.x, y: ln.info.coord.y };
129
+ lbl.set = true;
130
+ const et = edgeType(g);
131
+ if (et === EDGETYPE_LINE) {
132
+ const ps = flatLabeledLinePoints(e.tail, e.head, e);
133
+ if (ps !== null && ps.length !== 0) clipAndInstall(e, e.head, ps, ps.length, buildDotSinfo());
134
+ return true;
135
+ }
136
+ // C make_flat_edge forward-normalizes a backward (tail right of head by node
137
+ // ORDER) flat edge via makefwdedge BEFORE make_flat_labeled_edge builds the
138
+ // left→right channel — else the middle box inverts (LL.x > UR.x) and
139
+ // routesplines returns no points. Build the channel on a left→right sample,
140
+ // then reverse the points for an edge whose tail is the right node so they run
141
+ // tail→head, and install with ignoreSwap (the orientation is already fixed).
142
+ // @see lib/dotgen/dotsplines.c:make_flat_edge (makefwdedge), make_flat_labeled_edge
143
+ const tailIsLeft = (e.tail.info.order ?? 0) <= (e.head.info.order ?? 0);
144
+ const sample: Edge = tailIsLeft ? e : {
145
+ ...e, tail: e.head, head: e.tail,
146
+ info: { ...e.info, tail_port: e.info.head_port, head_port: e.info.tail_port },
147
+ } as Edge;
148
+ const ps = routeFlatLabeledChannel(g, sample, ln, et);
149
+ // Degenerate route (routesplines pn=0): label set, no spline installed — C's
150
+ // make_flat_labeled_edge returns the same way; emit's edge_in_box then decides
151
+ // whether the (untranslated) label overlaps the clip. Still HANDLED → true.
152
+ if (ps === null || ps.length === 0) return true;
153
+ if (!tailIsLeft) ps.reverse();
154
+ clipAndInstall(e, e.head, ps, ps.length, { ...buildDotSinfo(), ignoreSwap: true });
155
+ return true;
156
+ }
157
+
158
+ /**
159
+ * True when `e` is an adjacent, same-rank flat edge with no declared ports —
160
+ * C's make_flat_adj_edges no-port dispatch (makeSimpleFlat / makeSimpleFlatLabels).
161
+ * Port-bearing adjacent flats route via the rotated aux graph instead.
162
+ *
163
+ * `adjacent` is read from the flat representative — the end of the `to_virt`
164
+ * chain — not from `e` directly. C's `dot_splines_` routes the `flat_out`/`other`
165
+ * edge that `checkFlatAdjacent` marked; the port instead routes the cgraph
166
+ * out-edge, which for a nonconstraint cross-cluster flat (e.g. 258 `B->D`) is a
167
+ * *different* object linked to the marked representative through `to_virt`
168
+ * (R -> v -> M, with `adjacent` set on M). Following the chain reunites the
169
+ * routed edge with its flag. For an ordinary adjacent flat the chain is empty,
170
+ * so the rep is `e` itself. @see lib/dotgen/dotsplines.c:dot_splines_ (flat gather)
171
+ */
172
+ export function isAdjFlatCandidate(e: Edge): boolean {
173
+ if (e.tail.info.rank === undefined || e.tail.info.rank !== e.head.info.rank) return false;
174
+ if (e.info.tail_port.defined || e.info.head_port.defined) return false;
175
+ // Resolve `adjacent` from the flat representative (to_virt chain end) ONLY
176
+ // when it is the SAME logical edge (same unordered endpoint pair). C's
177
+ // dot_splines_ routes the flat_out/other edge that carries the flag; the
178
+ // port routes the cgraph out-edge, which for a nonconstraint cross-cluster
179
+ // flat (258 B->D) reaches its marked rep through to_virt. The same-pair
180
+ // guard prevents inheriting an UNRELATED edge's adjacency on dense graphs
181
+ // (which would mis-route many edges through makeSimpleFlat). @see dotsplines.c
182
+ let rep = e;
183
+ while (rep.info.to_virt !== undefined && rep.info.to_virt !== rep) rep = rep.info.to_virt;
184
+ const samePair = (rep.tail === e.tail && rep.head === e.head)
185
+ || (rep.tail === e.head && rep.head === e.tail);
186
+ const adj = samePair ? rep.info.adjacent : e.info.adjacent;
187
+ return (adj ?? 0) !== 0;
188
+ }
189
+
190
+ /**
191
+ * Group: every no-port adjacent flat edge between e's two endpoints, in BOTH
192
+ * directions (the UNORDERED {tail,head} set). C's make_flat_adj_edges groups by
193
+ * the unordered pair — opposing legs (a->b and b->a) and parallel siblings route
194
+ * as one call (dotsplines.c:1122; the dispatch loop's "all flat adjacent edges
195
+ * at once" at dotsplines.c:357). Keying on the ordered (tail,head) split the
196
+ * opposing leg into its own cnt=1 group, drawn straight instead of as the
197
+ * earray[1] arc. @see lib/dotgen/flat.c:flat_edges (ND_other)
198
+ */
199
+ export function collectAdjFlatGroup(g: Graph, e: Edge): Edge[] {
200
+ const me = getMainEdge(e);
201
+ const out: Edge[] = [];
202
+ for (const f of g.edges) {
203
+ const samePair = (f.tail === e.tail && f.head === e.head)
204
+ || (f.tail === e.head && f.head === e.tail);
205
+ if (samePair && isAdjFlatCandidate(f) && getMainEdge(f) === me) out.push(f);
206
+ }
207
+ return out;
208
+ }
209
+
210
+ /**
211
+ * The group's tail/head, oriented left→right by node order. C's
212
+ * make_flat_adj_edges takes tn/hn from the forward-normalized representative
213
+ * (makefwdedge makes the lower-order node the tail); every routing point is
214
+ * built tp(tn)→hp(hn) and clip_and_install re-orients each reversed leg.
215
+ * @see lib/dotgen/dotsplines.c:make_flat_adj_edges 1136
216
+ */
217
+ function groupTnHn(group: Edge[]): { tn: Node; hn: Node } {
218
+ const a = group[0].tail, b = group[0].head;
219
+ return (a.info.order ?? 0) <= (b.info.order ?? 0) ? { tn: a, hn: b } : { tn: b, hn: a };
220
+ }
221
+
222
+ /** edgelblcmpfn: labeled first; among labeled, larger dimen (x then y) first. */
223
+ export function edgeLblCmp(a: Edge, b: Edge): number {
224
+ const la = a.info.label, lb = b.info.label;
225
+ if (la === undefined) return lb === undefined ? 0 : 1;
226
+ if (lb === undefined) return -1;
227
+ if (la.dimen.x !== lb.dimen.x) return la.dimen.x > lb.dimen.x ? -1 : 1;
228
+ if (la.dimen.y !== lb.dimen.y) return la.dimen.y > lb.dimen.y ? -1 : 1;
229
+ return 0;
230
+ }
231
+
232
+ /** Pshortestpath → (make_polyline | Proutespline) over an 8-point boundary poly.
233
+ * @see lib/common/routespl.c:simpleSplineRoute */
234
+ function simpleSplineRoute(tp: Point, hp: Point, polyPts: Point[], polyline: boolean): Point[] | null {
235
+ const route = shortestPath({ ps: polyPts }, [tp, hp]);
236
+ if (route === null) return null;
237
+ if (polyline) return makePolyline(route);
238
+ return routeSpline(polyBarriers([{ ps: polyPts }]), route, [{ x: 0, y: 0 }, { x: 0, y: 0 }]);
239
+ }
240
+
241
+ /** Running bounds + fixed endpoints for the stacked flat-label boxes. */
242
+ interface FlatStack {
243
+ miny: number; maxy: number; uminx: number; umaxx: number;
244
+ lminx: number; lmaxx: number; leftend: number; rightend: number; ctrx: number;
245
+ tp: Point; hp: Point; tn: Node;
246
+ }
247
+
248
+ /** Boundary poly for a flat edge routed BELOW the rank (i odd). @see dotsplines.c:1003-1010 */
249
+ function flatDownBox(tp: Point, hp: Point, miny: number, lminx: number, lmaxx: number): Point[] {
250
+ return [
251
+ { x: tp.x, y: tp.y }, { x: tp.x, y: miny - LBL_SPACE }, { x: hp.x, y: miny - LBL_SPACE },
252
+ { x: hp.x, y: hp.y }, { x: lmaxx, y: hp.y }, { x: lmaxx, y: miny },
253
+ { x: lminx, y: miny }, { x: lminx, y: tp.y },
254
+ ];
255
+ }
256
+
257
+ /** Boundary poly for a flat edge routed ABOVE the rank (i even). @see dotsplines.c:1012-1020 */
258
+ function flatUpBox(tp: Point, hp: Point, maxy: number, uminx: number, umaxx: number): Point[] {
259
+ return [
260
+ { x: tp.x, y: tp.y }, { x: uminx, y: tp.y }, { x: uminx, y: maxy }, { x: umaxx, y: maxy },
261
+ { x: umaxx, y: hp.y }, { x: hp.x, y: hp.y }, { x: hp.x, y: maxy + LBL_SPACE },
262
+ { x: tp.x, y: maxy + LBL_SPACE },
263
+ ];
264
+ }
265
+
266
+ /** Box + label-center for stacked edge i (down if odd, up if even); mutates bounds. */
267
+ function stackFlatBox(st: FlatStack, i: number, dim: Point, labeled: boolean): { box: Point[]; ctry: number } {
268
+ if (i % 2 === 1) {
269
+ if (i === 1 && labeled) { st.lminx = st.ctrx - dim.x / 2; st.lmaxx = st.ctrx + dim.x / 2; }
270
+ if (i === 1 && !labeled) { st.lminx = (2 * st.leftend + st.rightend) / 3; st.lmaxx = (st.leftend + 2 * st.rightend) / 3; }
271
+ st.miny -= LBL_SPACE + dim.y;
272
+ return { box: flatDownBox(st.tp, st.hp, st.miny, st.lminx, st.lmaxx), ctry: st.miny + dim.y / 2 };
273
+ }
274
+ const box = flatUpBox(st.tp, st.hp, st.maxy, st.uminx, st.umaxx);
275
+ const ctry = st.maxy + dim.y / 2 + LBL_SPACE;
276
+ st.maxy += dim.y + LBL_SPACE;
277
+ return { box, ctry };
278
+ }
279
+
280
+ /** Set an edge label position. */
281
+ function setFlatLabel(e: Edge, x: number, y: number): void {
282
+ const lbl = e.info.label!;
283
+ lbl.pos = { x, y };
284
+ lbl.set = true;
285
+ }
286
+
287
+ /**
288
+ * Install one flat leg. Points are always built left→right (tn→hn). For a leg
289
+ * whose tail is the RIGHT node (e.tail !== tn) the stored spline must run
290
+ * tail→head (right→left), so reverse the points and install with ignoreSwap
291
+ * (orientation already fixed). C's clip_and_install reverses such reversed flat
292
+ * legs internally; the port stores points verbatim, so the caller reverses —
293
+ * the same idiom makeFlatLabeledEdge uses (tailIsLeft + reverse + ignoreSwap).
294
+ */
295
+ function installFlatLeg(e: Edge, pts: Point[], _tn: Node): void {
296
+ // C makeSimpleFlat installs the tn->hn points FORWARD via
297
+ // `clip_and_install(e, aghead(e), points)`, letting clip_and_install swap
298
+ // tn/hn for a reversed flat edge (splines.c:252); the resulting spline is then
299
+ // emitted in the original tail->head direction (makefwdedge un-normalization).
300
+ // Clipping the FORWARD spline is load-bearing: bezier_clip's 0.5-tolerance
301
+ // bisection is direction-dependent, so clipping a PRE-reversed spline converged
302
+ // ~0.35px off C (pgram PP->OCT). So clip forward, then swap the spline back —
303
+ // exactly the regular back-edge pattern (edge-route-chain.ts:412).
304
+ // @see lib/dotgen/dotsplines.c:makeSimpleFlat, lib/common/splines.c:clip_and_install
305
+ clipAndInstall(e, e.head, pts, pts.length, buildDotSinfo());
306
+ if (swapEndsP(e)) swapEdgeSpline(e);
307
+ }
308
+
309
+ /** Route the stacked (i>=1) edges of the group through simpleSplineRoute. */
310
+ function routeStackedFlats(earray: Edge[], nLbls: number, st: FlatStack, et: number): void {
311
+ for (let i = 1; i < earray.length; i++) {
312
+ const labeled = i < nLbls;
313
+ const dim = labeled ? earray[i].info.label!.dimen : { x: 0, y: 0 };
314
+ const { box, ctry } = stackFlatBox(st, i, dim, labeled);
315
+ const ps = simpleSplineRoute(st.tp, st.hp, box, et === EDGETYPE_PLINE);
316
+ if (ps === null || ps.length === 0) return;
317
+ if (labeled) setFlatLabel(earray[i], st.ctrx, ctry);
318
+ installFlatLeg(earray[i], ps, st.tn);
319
+ }
320
+ }
321
+
322
+ /**
323
+ * Route a parallel group of adjacent (no-port) flat edges: the first goes
324
+ * straight with its label above; the rest stack up/down around the rank, each
325
+ * routed via simpleSplineRoute. @see lib/dotgen/dotsplines.c:makeSimpleFlatLabels
326
+ */
327
+ export function makeSimpleFlatLabels(group: Edge[], et: number): void {
328
+ // C qsort(earray, edgelblcmpfn) — UNSTABLE; edgelblcmpfn returns 0 when two
329
+ // edges' labels have equal dimensions, so the tie order is qsort's, not
330
+ // insertion order. @see util/bsd-qsort.ts · dotsplines.c:make_flat_labeled_edge
331
+ const earray = gvQsort([...group], edgeLblCmp);
332
+ // tn/hn are the group's left/right nodes (C: agtail/aghead of the
333
+ // forward-normalized rep), NOT earray[0]'s own direction — earray[0] (widest
334
+ // label) may run right->left. Every routing point is built tn->hn; the
335
+ // per-edge clip_and_install auto-swap (swapEndsP) re-orients each reversed leg.
336
+ const { tn, hn } = groupTnHn(group);
337
+ const e0 = earray[0];
338
+ const tp = { x: tn.info.coord.x + e0.info.tail_port.p.x, y: tn.info.coord.y + e0.info.tail_port.p.y };
339
+ const hp = { x: hn.info.coord.x + e0.info.head_port.p.x, y: hn.info.coord.y + e0.info.head_port.p.y };
340
+ const leftend = tp.x + tn.info.rw, rightend = hp.x - hn.info.lw;
341
+ const ctrx = (leftend + rightend) / 2;
342
+ const nLbls = earray.filter(e => e.info.label !== undefined).length;
343
+ const dim0 = e0.info.label!.dimen;
344
+ installFlatLeg(e0, [tp, { ...tp }, hp, { ...hp }], tn);
345
+ setFlatLabel(e0, ctrx, tp.y + (dim0.y + LBL_SPACE) / 2);
346
+ const st: FlatStack = {
347
+ miny: tp.y + LBL_SPACE / 2, maxy: tp.y + LBL_SPACE / 2 + dim0.y,
348
+ uminx: ctrx - dim0.x / 2, umaxx: ctrx + dim0.x / 2,
349
+ lminx: 0, lmaxx: 0, leftend, rightend, ctrx, tp, hp, tn,
350
+ };
351
+ routeStackedFlats(earray, nLbls, st, et);
352
+ }
353
+
354
+ /** Bezier (SPLINE/LINE) or polyline (PLINE) control points for one flat
355
+ * spindle edge at vertical height dy. @see dotsplines.c:makeSimpleFlat 1089-1106 */
356
+ function simpleFlatPoints(tp: Point, hp: Point, dy: number, et: number): Point[] {
357
+ const a = (2 * tp.x + hp.x) / 3, b = (2 * hp.x + tp.x) / 3;
358
+ if (et === EDGETYPE_SPLINE || et === EDGETYPE_LINE) {
359
+ return [{ x: tp.x, y: tp.y }, { x: a, y: dy }, { x: b, y: dy }, { x: hp.x, y: hp.y }];
360
+ }
361
+ return [
362
+ { x: tp.x, y: tp.y }, { x: tp.x, y: tp.y },
363
+ { x: a, y: dy }, { x: a, y: dy }, { x: a, y: dy },
364
+ { x: b, y: dy }, { x: b, y: dy }, { x: b, y: dy },
365
+ { x: hp.x, y: hp.y }, { x: hp.x, y: hp.y },
366
+ ];
367
+ }
368
+
369
+ /**
370
+ * Spindle of splines for a no-port, no-label adjacent flat group: fan the cnt
371
+ * edges vertically across the tail node's height (stepy = ht/(cnt-1), centred
372
+ * on tp.y). cnt == 1 yields a single straight line.
373
+ * @see lib/dotgen/dotsplines.c:makeSimpleFlat (1075)
374
+ */
375
+ export function makeSimpleFlat(group: Edge[], et: number): void {
376
+ const e0 = group[0];
377
+ const { tn, hn } = groupTnHn(group);
378
+ const tp = { x: tn.info.coord.x + e0.info.tail_port.p.x, y: tn.info.coord.y + e0.info.tail_port.p.y };
379
+ const hp = { x: hn.info.coord.x + e0.info.head_port.p.x, y: hn.info.coord.y + e0.info.head_port.p.y };
380
+ const cnt = group.length;
381
+ const stepy = cnt > 1 ? tn.info.ht / (cnt - 1) : 0;
382
+ let dy = tp.y - (cnt > 1 ? tn.info.ht / 2 : 0);
383
+ for (let i = 0; i < cnt; i++) {
384
+ const pts = simpleFlatPoints(tp, hp, dy, et);
385
+ dy += stepy;
386
+ installFlatLeg(group[i], pts, tn);
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Dispatch an adjacent no-port flat edge group (C's `make_flat_adj_edges`
392
+ * no-port branch): a group with any label routes via makeSimpleFlatLabels, a
393
+ * group with none via makeSimpleFlat. Both route the whole parallel group at
394
+ * once. Declines only when `e` is not a no-port adjacent flat.
395
+ * @see lib/dotgen/dotsplines.c:make_flat_adj_edges 1156-1166
396
+ */
397
+ export function makeAdjFlatNoPortEdge(g: Graph, e: Edge): boolean {
398
+ if (!isAdjFlatCandidate(e)) return false;
399
+ // The group is rendered as a unit (both directions). When the opposing leg is
400
+ // dispatched later it is already installed — skip re-rendering but report it
401
+ // handled. C does the whole unordered group in one make_flat_adj_edges call.
402
+ if (e.info.spl !== undefined) return true;
403
+ const group = collectAdjFlatGroup(g, e);
404
+ const et = edgeType(g);
405
+ if (group.some(x => x.info.label !== undefined)) makeSimpleFlatLabels(group, et);
406
+ else makeSimpleFlat(group, et);
407
+ return true;
408
+ }
@@ -0,0 +1,188 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * Faithful cnt>=2 non-adjacent flat multi-edge routing.
5
+ *
6
+ * C make_flat_edge (top branch, dotsplines.c:1502) and make_flat_bottom_edges
7
+ * (bottom branch, 1418) group every non-labeled, identical-port, non-adjacent
8
+ * flat edge between a same-rank node pair into ONE call and NEST their splines:
9
+ * `stepx = Multisep/(cnt+1)`, `stepy = vspace/(cnt+1)`; ONE shared makeFlatEnd
10
+ * tail+head; then edge `i` is offset by `(i+1)*step` on the two END boxes while
11
+ * the MIDDLE box keeps plain `stepy`. cnt=1 reduces to routeFlatEdgeFaithful
12
+ * (`Multisep/2 = nodesep/2`, `(0+1)*step = step`) — identical (AD-1).
13
+ *
14
+ * The port routes each non-adjacent flat independently at `nodesep/2`, so cnt>=2
15
+ * edges come out identical/overlapping; this module restores the nesting.
16
+ *
17
+ * @see lib/dotgen/dotsplines.c:make_flat_edge, make_flat_bottom_edges, dot_splines_
18
+ */
19
+
20
+ import type { Graph } from '../../model/graph.js';
21
+ import type { Edge } from '../../model/edge.js';
22
+ import type { Node } from '../../model/node.js';
23
+ import type { Port, Box } from '../../model/geom.js';
24
+ import type { Path, PathendT } from '../../common/types.js';
25
+ import { routeSplines } from '../../common/splines-routespl.js';
26
+ import { clipAndInstall } from '../../common/splines-clip.js';
27
+ import { graphRanksep } from './position-aux.js';
28
+ import { buildDotSinfo } from './self-loop.js';
29
+ import {
30
+ isFlatAdjacent, makeFlatEndBox, topBoxes, bottomBoxes, flatSide, flatVspace,
31
+ freshFlatPath, assembleFlatPath, flatBboxCtx,
32
+ } from './splines-flat.js';
33
+
34
+ /** Loop-invariant routing context shared across the cnt-loop iterations.
35
+ * Declared here (not between functions) so lizard's length accounting does not
36
+ * fold it into a neighbour. @see lizard-length-inter-comment */
37
+ interface GroupRouteCtx {
38
+ P: Path;
39
+ tend: PathendT;
40
+ hend: PathendT;
41
+ tlast: Box;
42
+ hlast: Box;
43
+ bottom: boolean;
44
+ stepx: number;
45
+ stepy: number;
46
+ /** Geometric left end node of the channel (lower order). routeSplines yields
47
+ * points left→right; an edge whose tail is the RIGHT node is reversed so the
48
+ * installed spline runs tail→head, matching C's clip_and_install orientation. */
49
+ leftNode: Node;
50
+ }
51
+
52
+
53
+ /**
54
+ * portcmp == 0: both undefined, or both defined with an equal aiming point.
55
+ * @see lib/dotgen/dotsplines.c:portcmp
56
+ */
57
+ function portEq(a: Port, b: Port): boolean {
58
+ if (!a.defined && !b.defined) return true;
59
+ if (!a.defined || !b.defined) return false;
60
+ return a.p.x === b.p.x && a.p.y === b.p.y;
61
+ }
62
+
63
+ /** The declared ports of e oriented relative to the left node `lo`. */
64
+ function flatPortKey(e: Edge, lo: Node): { loP: Port; hiP: Port } {
65
+ return e.tail === lo
66
+ ? { loP: e.info.tail_port, hiP: e.info.head_port }
67
+ : { loP: e.info.head_port, hiP: e.info.tail_port };
68
+ }
69
+
70
+ /** True when x is an unrouted non-adjacent same-rank flat edge (C make_flat_edge
71
+ * routes EVERY non-adjacent flat; side ports are not a precondition). */
72
+ function isNonAdjGroupable(x: Edge, g: Graph): boolean {
73
+ return x.info.spl === undefined
74
+ && x.tail.info.rank !== undefined
75
+ && x.tail.info.rank === x.head.info.rank
76
+ && !isFlatAdjacent(g, x);
77
+ }
78
+
79
+ /** True when x's ports (oriented to lo) equal the lead key (C portcmp == 0). */
80
+ function samePortsAs(x: Edge, lo: Node, key: { loP: Port; hiP: Port }): boolean {
81
+ const k = flatPortKey(x, lo);
82
+ return portEq(k.loP, key.loP) && portEq(k.hiP, key.hiP);
83
+ }
84
+
85
+ /**
86
+ * Collect all unrouted non-adjacent same-rank side-port flat edges between e's
87
+ * endpoints that share e's tail/head ports (C portcmp), ordered so group[0].tail
88
+ * is the lower-order (left) node, ties by seq (AD-3). Mirrors edge-route.ts:
89
+ * collectAdjacentFlatGroup with the non-adjacent + identical-port group key.
90
+ * @see lib/dotgen/dotsplines.c:dot_splines_ (portcmp 370-373), make_flat_edge
91
+ */
92
+ export function collectNonAdjacentFlatGroup(e: Edge, g: Graph): Edge[] {
93
+ const u = e.tail, v = e.head;
94
+ const lo = (u.info.order ?? 0) <= (v.info.order ?? 0) ? u : v;
95
+ const key = flatPortKey(e, lo);
96
+ const sharesPair = (x: Edge): boolean =>
97
+ (x.tail === u && x.head === v) || (x.tail === v && x.head === u);
98
+ // C's edgecmp keeps a flat group contiguous only while labels are equal
99
+ // (ED_label(e0)!=ED_label(e1) breaks the run); a labeled opposing leg must not
100
+ // be pulled into an unlabeled rep's group. @see lib/dotgen/dotsplines.c:edgecmp
101
+ const group = g.edges.filter(
102
+ x => sharesPair(x) && isNonAdjGroupable(x, g) && samePortsAs(x, lo, key)
103
+ && x.info.label === e.info.label);
104
+ group.sort((a, b) => Number(b.tail === lo) - Number(a.tail === lo) || a.seq - b.seq);
105
+ return group;
106
+ }
107
+
108
+ /**
109
+ * Deep-copy a pathend's boxes so routeSplines (which mutates boxes in place)
110
+ * cannot corrupt the shared tend/hend reused across the cnt-loop. C copies each
111
+ * box by value via add_box; the port stores references, so the loop must copy.
112
+ * @see lib/common/routespl.c:routesplines (mutates boxes), add_box (value copy)
113
+ */
114
+ function copyPathEnd(end: PathendT): PathendT {
115
+ return {
116
+ ...end,
117
+ boxes: end.boxes.map(b => ({ ll: { ...b.ll }, ur: { ...b.ur } })),
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Build edge i's three connecting boxes (END boxes offset (i+1)*step, MIDDLE
123
+ * plain stepy), assemble the path, route, and clip+install on e. Resets P.nbox
124
+ * first (C: `P->nbox = 0` per iteration). Returns false on an empty route.
125
+ * @see lib/dotgen/dotsplines.c:make_flat_edge / make_flat_bottom_edges (loop body)
126
+ */
127
+ function routeGroupEdge(e: Edge, i: number, c: GroupRouteCtx): boolean {
128
+ c.P.nbox = 0;
129
+ const endStepX = (i + 1) * c.stepx;
130
+ const endStepY = (i + 1) * c.stepy;
131
+ const mid = c.bottom
132
+ ? bottomBoxes(c.tlast, c.hlast, endStepX, endStepY, c.stepy)
133
+ : topBoxes(c.tlast, c.hlast, endStepX, endStepY, c.stepy);
134
+ assembleFlatPath(c.P, copyPathEnd(c.tend), copyPathEnd(c.hend), mid);
135
+ const pts = routeSplines(c.P);
136
+ if (pts === null || pts.length === 0) return false;
137
+ // routeSplines returns points left→right (tend = leftNode). Reverse for an edge
138
+ // whose tail is the right node so the points run tail→head; pass ignoreSwap so
139
+ // clipAndInstall clips/arrows by the real tail/head instead of re-deriving the
140
+ // orientation from node order (which would undo the reversal).
141
+ // @see lib/dotgen/dotsplines.c:make_flat_edge (clip_and_install)
142
+ if (e.tail !== c.leftNode) pts.reverse();
143
+ clipAndInstall(e, e.head, pts, pts.length, { ...buildDotSinfo(), ignoreSwap: true });
144
+ return true;
145
+ }
146
+
147
+ /**
148
+ * Faithful make_flat_edge / make_flat_bottom_edges cnt-loop: ONE shared
149
+ * makeFlatEnd tail+head; for i in 0..cnt-1 route edge i nested by (i+1)*step.
150
+ * Installs spl on every edges[i]; returns true iff all installed. cnt=1 reduces
151
+ * to routeFlatEdgeFaithful (AD-1). `edges` must be group-ordered (collect...).
152
+ * @see lib/dotgen/dotsplines.c:make_flat_edge, make_flat_bottom_edges
153
+ */
154
+ export function routeFlatEdgeGroupFaithful(g: Graph, edges: Edge[], cnt: number): boolean {
155
+ const lead = edges[0];
156
+ if (g.info.rank === undefined || lead.tail.info.rank === undefined
157
+ || lead.head.info.rank !== lead.tail.info.rank) return false;
158
+ // C makefwdedge: build the channel left→right by node order, else the middle
159
+ // box inverts for a right-to-left (tail right of head) flat edge.
160
+ const tailIsLeft = (lead.tail.info.order ?? 0) <= (lead.head.info.order ?? 0);
161
+ const leftNode = tailIsLeft ? lead.tail : lead.head;
162
+ const rightNode = tailIsLeft ? lead.head : lead.tail;
163
+ // C makefwdedge: the box-building sample edge must run left→right so beginpath
164
+ // anchors the path START at the LEFT node (not the original tail). For a
165
+ // right-to-left flat edge, swap tail/head + ports for the sample only; the
166
+ // per-edge clip/install still uses the original edge.
167
+ // @see lib/dotgen/dotsplines.c:make_flat_edge (makefwdedge), makefwdedge
168
+ const sample: Edge = tailIsLeft ? lead : {
169
+ ...lead, tail: leftNode, head: rightNode,
170
+ info: { ...lead.info, tail_port: lead.info.head_port, head_port: lead.info.tail_port },
171
+ } as Edge;
172
+ const { bottom, side } = flatSide(sample);
173
+ const ctx = flatBboxCtx(g);
174
+ const ranksep = graphRanksep(g);
175
+ const P = freshFlatPath();
176
+ const tend = makeFlatEndBox({ ctx, P, e: sample, n: leftNode, side, ranksep, isBegin: true });
177
+ const hend = makeFlatEndBox({ ctx, P, e: sample, n: rightNode, side, ranksep, isBegin: false });
178
+ const stepx = (g.info.nodesep ?? 18) / (cnt + 1);
179
+ const stepy = flatVspace(g, leftNode, !bottom) / (cnt + 1);
180
+ const rc: GroupRouteCtx = {
181
+ P, tend, hend, tlast: tend.boxes[tend.boxn - 1], hlast: hend.boxes[hend.boxn - 1],
182
+ bottom, stepx, stepy, leftNode,
183
+ };
184
+ for (let i = 0; i < cnt; i++) {
185
+ if (!routeGroupEdge(edges[i], i, rc)) return false;
186
+ }
187
+ return true;
188
+ }