@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,598 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * Device render loop and coordinate transform.
5
+ *
6
+ * Ports gvrender_ptf, gvrender_begin_graph, and gvrender_end_graph from
7
+ * lib/gvc/gvrender.c. render() is the top-level entry point; it lives here
8
+ * (not on GvcContext) to avoid a circular import.
9
+ *
10
+ * @see lib/gvc/gvrender.c
11
+ * @see lib/gvc/gvdevice.c
12
+ */
13
+
14
+ import type { Point, Box } from '../model/geom.js';
15
+ import { boxOverlap, POINTS_PER_INCH } from '../model/geom.js';
16
+ import { lateDouble } from '../common/nodeinit.js';
17
+ import { parseDrawingSize, initJobViewportZoom, parseLandscape, parseGraphPad, parseGraphMargin } from './viewport.js';
18
+ import type { Graph } from '../model/graph.js';
19
+ import type { Node } from '../model/node.js';
20
+ import type { Edge } from '../model/edge.js';
21
+ import type { RendererPlugin, GvcContext } from './context.js';
22
+ import { PenType } from './context.js';
23
+ import { gvrenderTextspan, withLabelEmitState } from './textspan-emit.js';
24
+ import { resolveEdgeAnchor, resolveObjAnchor, beginAnchorIf } from './anchor.js';
25
+ import type { ShapeDesc, TextlabelT } from '../common/types.js';
26
+ import type { TextSpan } from '../common/emit-types.js';
27
+ import { type LayerInfo, parseLayers } from '../common/layers.js';
28
+ import { RenderJob, GVRENDER_DOES_TRANSFORM, EMIT_CLUSTERS_LAST, createObjState, ObjType, EmitState } from './job.js';
29
+ import { walkNodesAndEdges } from './emit-walk.js';
30
+ import { polyInit } from '../common/poly-init.js';
31
+ import { emitHtmlLabel } from '../common/htmltable-emit.js';
32
+ import {
33
+ setHtmlAnchorObj,
34
+ setHtmlObjImgscale,
35
+ resetHtmlAnchorIds,
36
+ } from '../common/htmltable-emit-rules.js';
37
+ import { nodeAttr } from '../common/poly-init.js';
38
+ import type { PlacedHtml } from '../common/htmltable-pos.js';
39
+ import {
40
+ parseStyleFlags,
41
+ resolvePenColor,
42
+ resolvePenType,
43
+ resolvePenWidth,
44
+ styleHasInvisibleAlias,
45
+ styleTokens,
46
+ } from '../common/style-resolve.js';
47
+ import { isPointNode } from '../common/poly-gencode.js';
48
+ import { resolveRenderColor, withColorScheme } from '../render/color-resolve.js';
49
+ import { emitRoundedBezier } from '../common/poly-shapes.js';
50
+ import { applyClusterObjState, clusterStyle, clusterPeripheries } from './device-cluster.js';
51
+ /** Cluster labels go through the single emit_label port. @see labels.c:emit_label */
52
+ export function renderClusterLabel(sg: Graph, renderer: RendererPlugin, job: RenderJob): void {
53
+ renderOneLabel(sg.info.label as TextlabelT | undefined, renderer, job);
54
+ }
55
+ import { svgNodeId, svgEdgeId, svgClusterId, svgGraphId } from '../render/svg-id.js';
56
+
57
+ // ---------------------------------------------------------------------------
58
+ // AD-1 (image-api): `inlineImages` on RenderJob via module augmentation
59
+ //
60
+ // Declared here (not as an edit to job.ts) so the field lives with the one
61
+ // caller that sets it (render(), below) and the one caller that reads it
62
+ // (svg.ts usershape()). Purely additive: an unset field reads `undefined`,
63
+ // which is falsy, so any RenderJob built without going through this render()
64
+ // (tests, other call sites) keeps today's raw-src passthrough unchanged.
65
+ // @see src/render/public.ts:RenderOptions.inlineImages
66
+ // @see src/gvc/image-resolver.ts
67
+ // ---------------------------------------------------------------------------
68
+ declare module './job.js' {
69
+ interface RenderJob {
70
+ /** When true, usershape() inlines resolved image bytes as a data: URI. */
71
+ inlineImages?: boolean;
72
+ }
73
+ }
74
+
75
+ // ---------------------------------------------------------------------------
76
+ // transformPoint — @see lib/gvc/gvrender.c:gvrender_ptf
77
+ // ---------------------------------------------------------------------------
78
+
79
+ /**
80
+ * Transform a point from graph to device coordinates.
81
+ * Short-circuits when GVRENDER_DOES_TRANSFORM is set (renderer owns mapping).
82
+ *
83
+ * @see lib/gvc/gvrender.c:gvrender_ptf
84
+ */
85
+ export function transformPoint(p: Point, job: RenderJob): Point {
86
+ if ((job.flags & GVRENDER_DOES_TRANSFORM) !== 0) {
87
+ return p;
88
+ }
89
+ const sx = job.zoom * job.devscale.x;
90
+ const sy = job.zoom * job.devscale.y;
91
+ const tx = job.translation.x;
92
+ const ty = job.translation.y;
93
+ // ADR-2: SVG landscape rotation lives entirely in the graph `<g>` group
94
+ // transform (svg_begin_page emits rotate(-job->rotation)); inner coords stay
95
+ // in the unrotated frame. The ptf rotation branch (applyRotation) is the
96
+ // raster/imagemap path and must NOT fire here, else job.rotation=90 would
97
+ // double-rotate every SVG coordinate. applyRotation stays exported as the
98
+ // faithful gvrender_ptf port (currently dead). @see ADR-2; gvrender.c:gvrender_ptf
99
+ return applyScale(p, tx, ty, sx, sy);
100
+ }
101
+
102
+ /** Rotation branch: out.x = -(p.y+ty)*sx, out.y = (p.x+tx)*sy @see gvrender_ptf */
103
+ export function applyRotation(p: Point, tx: number, ty: number, sx: number, sy: number): Point {
104
+ const x = -(p.y + ty) * sx;
105
+ const y = (p.x + tx) * sy;
106
+ return buildPoint(x, y);
107
+ }
108
+
109
+ /** No-rotation branch: out.x = (p.x+tx)*sx, out.y = (p.y+ty)*sy @see gvrender_ptf */
110
+ export function applyScale(p: Point, tx: number, ty: number, sx: number, sy: number): Point {
111
+ const x = (p.x + tx) * sx;
112
+ const y = (p.y + ty) * sy;
113
+ return buildPoint(x, y);
114
+ }
115
+
116
+ /** Construct a Point value. Extracted to avoid inline object literals in return position. */
117
+ export function buildPoint(x: number, y: number): Point {
118
+ const pt: Point = { x, y };
119
+ return pt;
120
+ }
121
+
122
+ // ---------------------------------------------------------------------------
123
+ // Node/Edge walk helpers
124
+ // ---------------------------------------------------------------------------
125
+
126
+ /** Label text for anchor tooltip defaults (C: obj->label). */
127
+ function labelTextOf(lp: unknown): string | null {
128
+ return (lp as TextlabelT | undefined)?.text ?? null;
129
+ }
130
+
131
+ /**
132
+ * A node's own layout bounding box: coord ± (lw/rw, ht/2).
133
+ * @see lib/common/types.h:ND_bb
134
+ * @see lib/common/emit.c:4140-4143 init_bb_node
135
+ */
136
+ function nodeBBox(n: Node): Box {
137
+ const { coord, lw, rw, ht } = n.info;
138
+ return {
139
+ ll: { x: coord.x - lw, y: coord.y - ht / 2 },
140
+ ur: { x: coord.x + rw, y: coord.y + ht / 2 },
141
+ };
142
+ }
143
+
144
+ /**
145
+ * node_in_box: is the node's own bbox within job's page/view clip?
146
+ *
147
+ * C's `job->clip` is derived from `job->bb` (= `GD_bb(g)`) expanded by
148
+ * `job->pad` on every side (init_job_viewport's `job->bb = gvc->bb ±
149
+ * job->pad`, feeding `job->view`/`job->focus`, which setup_page's `job->clip`
150
+ * algebraically reduces back to for the single-page, unpaginated case this
151
+ * port implements — Z and rotation cancel out of that derivation). This port
152
+ * has no separate `page=` pagination model, so `job.bb` padded by `job.pad`
153
+ * IS `job->clip` here.
154
+ *
155
+ * @see lib/common/emit.c:1636-1639 node_in_box
156
+ * @see lib/common/emit.c:1808 emit_node gate
157
+ * @see lib/common/emit.c:3356 init_job_viewport (job->bb = gvc->bb ± pad)
158
+ * @see lib/common/emit.c:1553-1564 setup_page (job->clip from focus/view)
159
+ */
160
+ function nodeInBox(n: Node, job: RenderJob): boolean {
161
+ const clip: Box = {
162
+ ll: { x: job.bb.ll.x - job.pad.x, y: job.bb.ll.y - job.pad.y },
163
+ ur: { x: job.bb.ur.x + job.pad.x, y: job.bb.ur.y + job.pad.y },
164
+ };
165
+ return boxOverlap(nodeBBox(n), clip);
166
+ }
167
+
168
+ /**
169
+ * Inner body of renderNode — runs inside the push/pop try block.
170
+ * Extracted to keep renderNode under the 30-line hook limit.
171
+ * @see lib/common/emit.c:emit_begin_node:1654
172
+ */
173
+ function emitNodeBody(n: Node, renderer: RendererPlugin, job: RenderJob): void {
174
+ setHtmlAnchorObj(svgNodeId(n, job), labelTextOf(n.info.label), job.obj ?? undefined);
175
+ setHtmlObjImgscale(nodeAttr(n, n.root, 'imagescale'));
176
+ renderer.beginNode(n, job);
177
+ const shape = n.info.shape as ShapeDesc | undefined;
178
+ if (shape?.fns?.codefn) shape.fns.codefn(job, n);
179
+ renderNodeXLabel(n, renderer, job);
180
+ renderer.endNode(n, job);
181
+ }
182
+
183
+ /**
184
+ * Render a single node if not already rendered.
185
+ * push_obj_state before emit_begin_node; pop_obj_state in emit_end_node.
186
+ * @see lib/common/emit.c:emit_node
187
+ * @see lib/common/emit.c:emit_begin_node:1654
188
+ * @see lib/common/emit.c:emit_end_node:1794
189
+ */
190
+ export function renderNode(n: Node, renderer: RendererPlugin, job: RenderJob, done: Set<Node>): void {
191
+ if (done.has(n)) return;
192
+ done.add(n);
193
+ // "and is in page/view" gate. @see lib/common/emit.c:1808 node_in_box
194
+ if (!nodeInBox(n, job)) return;
195
+ // Shortcircuit invisible nodes: C omits the whole node before emit_begin_node.
196
+ // @see lib/common/emit.c:emit_node (style "invis" return)
197
+ const nodeStyle = n.attrs.get('style');
198
+ if (parseStyleFlags(nodeStyle).invis) return;
199
+ // The "invisible" alias also suppresses drawing (gvrender_set_style →
200
+ // PEN_NONE) for shapes that pass their raw style through — but NOT the point
201
+ // shape, whose gencode overrides style with an exact-"invis" whitelist. C
202
+ // proceeds past emit_node here and skips only the draw ops (pen-none); the
203
+ // early return produces the same xdot (node present, no draw ops).
204
+ // @see lib/gvc/gvrender.c:497 · lib/common/shapes.c:point_gencode
205
+ if (!isPointNode(n) && styleHasInvisibleAlias(nodeStyle)) return;
206
+ const obj = createObjState(ObjType.Node);
207
+ obj.emitState = EmitState.NDraw;
208
+ job.pushObj(obj);
209
+ try {
210
+ emitNodeBody(n, renderer, job);
211
+ } finally {
212
+ job.popObj();
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Render a single edge.
218
+ * push_obj_state before beginEdge; pop_obj_state after endEdge.
219
+ * @see lib/common/emit.c:emit_edge
220
+ * @see lib/common/emit.c:emit_begin_edge:2715
221
+ * @see lib/common/emit.c:emit_end_edge:3028
222
+ * @see lib/common/emit.c:emit_edge_graphics:2350 (color/pencolor/penwidth)
223
+ */
224
+ /**
225
+ * Set the edge pen color/type/width on job.obj from the edge's attrs — mirrors
226
+ * emit_edge_graphics. (AD1: style flows through job.obj, not ad-hoc renderer reads.)
227
+ */
228
+ function setEdgePen(e: Edge, job: RenderJob): void {
229
+ if (job.obj === null) return;
230
+ const obj = job.obj;
231
+ const flags = parseStyleFlags(e.attrs.get('style'));
232
+ obj.penColor = withColorScheme(e.attrs.get('colorscheme'),
233
+ () => resolveRenderColor(resolvePenColor(e.attrs.get('color'))));
234
+ obj.pen = resolvePenType(flags);
235
+ obj.penWidth = resolvePenWidth(flags, e.attrs.get('penwidth'));
236
+ // Raw style tokens for xdot's `S` ops (e.g. explicit style="solid"); SVG
237
+ // reads only obj.pen, so this is xdot-only. @see gvrender_core_dot.c xdot_style
238
+ obj.rawStyle = styleTokens(e.attrs.get('style'));
239
+ }
240
+
241
+ export function renderEdge(e: Edge, renderer: RendererPlugin, job: RenderJob): void {
242
+ // Shortcircuit invisible edges: C omits the whole edge (no group/title/path)
243
+ // before emit_begin_edge. @see lib/common/emit.c:emit_edge (style "invis" return)
244
+ // The "invisible" alias likewise suppresses all edge draw ops via PEN_NONE
245
+ // (edges never use the point-shape whitelist). @see lib/gvc/gvrender.c:497
246
+ const edgeStyle = e.attrs.get('style');
247
+ if (parseStyleFlags(edgeStyle).invis || styleHasInvisibleAlias(edgeStyle)) return;
248
+ // push_obj_state in emit_begin_edge (line 2715)
249
+ const obj = createObjState(ObjType.Edge);
250
+ obj.emitState = EmitState.EDraw;
251
+ job.pushObj(obj);
252
+ setEdgePen(e, job);
253
+ try {
254
+ // @see lib/common/emit.c:emit_begin_edge / getObjId
255
+ setHtmlAnchorObj(svgEdgeId(e, job), labelTextOf(e.info.label), job.obj ?? undefined);
256
+ // Resolve edge url/tooltip/target/id into obj for the whole-edge anchor
257
+ // (svg endEdge) and the per-label sub-anchors (renderEdgeLabels).
258
+ resolveEdgeAnchor(e, svgEdgeId(e, job), obj);
259
+ // Activate the edge's colorscheme around the whole emission so label
260
+ // textspans resolve numeric color indices (e.g. fontcolor=2) against it,
261
+ // mirroring C's setColorScheme window in emit_edge.
262
+ // @see lib/common/emit.c:emit_edge (begin/end color context)
263
+ withColorScheme(e.attrs.get('colorscheme'), () => {
264
+ renderer.beginEdge(e, job);
265
+ renderer.endEdge(e, job);
266
+ });
267
+ } finally {
268
+ // pop_obj_state in emit_end_edge (line 3028)
269
+ job.popObj();
270
+ }
271
+ }
272
+
273
+ /** valign codes stored on textlabel_t. @see lib/common/types.h:textlabel_t.valign */
274
+ const VALIGN_TOP = 't'.charCodeAt(0);
275
+ const VALIGN_BOTTOM = 'b'.charCodeAt(0);
276
+
277
+ /** First-span baseline y per valign. @see lib/common/labels.c:emit_label (240-251) */
278
+ function labelFirstSpanY(lp: TextlabelT): number {
279
+ if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2.0 - lp.fontsize;
280
+ if (lp.valign === VALIGN_BOTTOM) {
281
+ return lp.pos.y - lp.space.y / 2.0 + lp.dimen.y - lp.fontsize;
282
+ }
283
+ return lp.pos.y + lp.dimen.y / 2.0 - lp.fontsize;
284
+ }
285
+
286
+ /** Span x position per justification. @see lib/common/labels.c:emit_label (254-266) */
287
+ function labelSpanX(lp: TextlabelT, just: 'l' | 'n' | 'r'): number {
288
+ if (just === 'l') return lp.pos.x - lp.space.x / 2.0;
289
+ if (just === 'r') return lp.pos.x + lp.space.x / 2.0;
290
+ return lp.pos.x;
291
+ }
292
+
293
+ /**
294
+ * Emit one label's text spans if present and placed.
295
+ * Shared by edge-label, node-xlabel, and graph-label slots.
296
+ * URL/anchor/map machinery and E_decorate attachment (emit.c:emit_attachment)
297
+ * are not ported, matching the live path's AD-2 scope.
298
+ * @see lib/common/emit.c:emit_label
299
+ * @see lib/common/labels.c:emit_label
300
+ */
301
+ export function renderOneLabel(
302
+ lp: TextlabelT | undefined,
303
+ renderer: RendererPlugin,
304
+ job: RenderJob,
305
+ ): void {
306
+ if (!lp?.set) return; // emit_label: lbl == NULL || !lbl->set
307
+ // HTML branch: @see lib/common/labels.c:emit_label (226-230)
308
+ // C routes to emit_html_label(job, lp->u.html, lp) using lp->pos as anchor.
309
+ if (lp.html) {
310
+ if (lp.u.kind === 'html') {
311
+ // Route the whole HTML label (table box/fill polygons + text) into the
312
+ // object's LABEL emit-state so its ops land in _ldraw_, not _draw_.
313
+ const html = lp.u.html as PlacedHtml;
314
+ const pos = lp.pos;
315
+ withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
316
+ }
317
+ return;
318
+ }
319
+ if (lp.u.kind !== 'txt' || lp.u.nspans < 1) return;
320
+ let y = labelFirstSpanY(lp);
321
+ for (let i = 0; i < lp.u.nspans; i++) {
322
+ const span = lp.u.span[i] as TextSpan | undefined;
323
+ if (!span) break;
324
+ // Emit only visible spans; the baseline still advances below so blank
325
+ // lines reserve vertical space. @see gvrender_textspan (gvrender.c:419).
326
+ gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
327
+ y -= span.size.y; // UL position for next span (unconditional)
328
+ }
329
+ }
330
+
331
+ /**
332
+ * Emit node external label (ND_xlabel) if placed.
333
+ * Must run inside the node group, after codefn (shape draw), matching C order.
334
+ * @see lib/common/emit.c:emit_node (1829-1830)
335
+ */
336
+ export function renderNodeXLabel(n: Node, renderer: RendererPlugin, job: RenderJob): void {
337
+ renderOneLabel(n.info.xlabel as TextlabelT | undefined, renderer, job);
338
+ }
339
+
340
+ /**
341
+ * Emit root-graph label (GD_label) if present and placed.
342
+ * Must run before clusters and nodes (emit_page order: background, then label,
343
+ * then emit_view which contains clusters+nodes+edges).
344
+ * @see lib/common/emit.c:emit_page (3656-3657)
345
+ */
346
+ export function renderGraphLabel(g: Graph, renderer: RendererPlugin, job: RenderJob): void {
347
+ // @see lib/common/emit.c:emit_begin_graph / getObjId (root graph → graph0)
348
+ setHtmlAnchorObj(svgGraphId(g, job), labelTextOf(g.info.label), job.obj ?? undefined);
349
+ renderOneLabel(g.info.label as TextlabelT | undefined, renderer, job);
350
+ }
351
+
352
+ // ---------------------------------------------------------------------------
353
+ // renderGraph — @see lib/gvc/gvrender.c:gvrender_begin_graph / end_graph
354
+ // ---------------------------------------------------------------------------
355
+
356
+ /**
357
+ * Draw a cluster boundary: a rounded bezier `<path>` when `style=rounded`,
358
+ * else the sharp `<polygon>`. Rounded mirrors emit.c's round_corners AF order
359
+ * LL,(UR.x,LL.y),UR,(LL.x,UR.y); sharp keeps gvrender_box's order.
360
+ * @see lib/common/emit.c:3877-3892 / lib/gvc/gvrender.c:gvrender_box
361
+ */
362
+ function renderClusterBox(
363
+ sg: Graph, filled: boolean, renderer: RendererPlugin, job: RenderJob,
364
+ ): void {
365
+ const { ll, ur } = sg.info.bb!;
366
+ if (parseStyleFlags(clusterStyle(sg)).rounded) {
367
+ const af = [{ x: ll.x, y: ll.y }, { x: ur.x, y: ll.y }, { x: ur.x, y: ur.y }, { x: ll.x, y: ur.y }];
368
+ emitRoundedBezier(af, { x: 0, y: 0 }, filled, { renderer, job });
369
+ return;
370
+ }
371
+ const rawPts = [{ x: ll.x, y: ll.y }, { x: ll.x, y: ur.y }, { x: ur.x, y: ur.y }, { x: ur.x, y: ll.y }];
372
+ renderer.polygon(rawPts.map(p => transformPoint(p, job)), filled, job);
373
+ }
374
+
375
+ /**
376
+ * Render one cluster: box, label, endCluster, then recurse into sub-clusters.
377
+ * push_obj_state in emit_begin_cluster (3762); pop in emit_end_cluster (3774).
378
+ * Sub-cluster recursion follows emit_end_cluster (line 3940-3941) — the pop
379
+ * completes before recursing; sub-clusters are separate pushes on a clean stack.
380
+ * @see lib/common/emit.c:emit_clusters:3777
381
+ */
382
+ function renderOneCluster(sg: Graph, renderer: RendererPlugin, job: RenderJob): void {
383
+ // EMIT_CLUSTERS_LAST (map device): recurse into sub-clusters BEFORE emitting
384
+ // this cluster's anchor, so an inner cluster's <area> precedes its parent's
385
+ // (child-first). Drawing devices recurse AFTER (parent-first), below.
386
+ // @see lib/common/emit.c:emit_clusters (3795 vs 3940)
387
+ const clustersLast = (job.flags & EMIT_CLUSTERS_LAST) !== 0;
388
+ if (clustersLast) renderClusters(sg, renderer, job);
389
+ // push_obj_state in emit_begin_cluster (line 3762), before beginCluster
390
+ const obj = createObjState(ObjType.Cluster);
391
+ obj.emitState = EmitState.CDraw;
392
+ job.pushObj(obj);
393
+ try {
394
+ // Resolve and wire cluster fill/pen into job.obj before the polygon.
395
+ // emit_clusters:3805-3874 — must happen before gvrender_box.
396
+ const filled = applyClusterObjState(sg, job);
397
+ // Cluster id is clust<AGSEQ seq> (getObjId); obj.id feeds emitGradientDefs
398
+ // the "clustN_l_0" gradient prefix. seq is stable on the subgraph, so the
399
+ // begin/assign order below is no longer load-bearing.
400
+ // @see lib/common/emit.c:209 getObjId (AGRAPH/cluster: pfx="clust")
401
+ renderer.beginCluster?.(sg, job);
402
+ if (job.obj !== null) job.obj.id = svgClusterId(sg, job);
403
+ // @see lib/common/emit.c:emit_begin_cluster / getObjId
404
+ setHtmlAnchorObj(svgClusterId(sg, job), labelTextOf(sg.info.label), job.obj ?? undefined);
405
+ // Resolve and open the cluster anchor around the box + label (closed before
406
+ // the cluster's child nodes — sibling of them). @see emit.c:3803.
407
+ if (job.obj !== null) {
408
+ resolveObjAnchor(sg, labelTextOf(sg.info.label), svgClusterId(sg, job), job.obj);
409
+ }
410
+ const anchored = beginAnchorIf(renderer, job);
411
+ // C draws the boundary box only when peripheries != 0, or (peripheries == 0
412
+ // and the cluster is filled). peripheries=0 + unfilled emits nothing.
413
+ // style=invis sets PEN_NONE and gvrender_polygon skips the whole box
414
+ // (fill included); the group/title still emit.
415
+ // @see lib/common/emit.c:3907-3917, lib/gvc/gvrender.c:543
416
+ if ((clusterPeripheries(sg) !== 0 || filled) && job.obj?.pen !== PenType.None) {
417
+ renderClusterBox(sg, filled, renderer, job);
418
+ }
419
+ renderClusterLabel(sg, renderer, job);
420
+ if (anchored) renderer.endAnchor?.(job);
421
+ renderer.endCluster?.(sg, job);
422
+ } finally {
423
+ // pop_obj_state in emit_end_cluster (line 3774), before sub-cluster recursion
424
+ job.popObj();
425
+ }
426
+ // C recurses AFTER emit_end_cluster (line 3940-3941): sub-clusters are drawn
427
+ // with the parent already popped — each has its own independent push/pop.
428
+ // The map device recursed first (child-first), above.
429
+ if (!clustersLast) renderClusters(sg, renderer, job);
430
+ }
431
+
432
+ /**
433
+ * Render cluster boundary polygons and labels, depth-first.
434
+ * Corner order matches C's gvrender_box: LL, (LL.x,UR.y), UR, (UR.x,LL.y).
435
+ * @see lib/gvc/gvrender.c:gvrender_box
436
+ * @see lib/common/emit.c:emit_clusters
437
+ */
438
+ export function renderClusters(g: Graph, renderer: RendererPlugin, job: RenderJob): void {
439
+ const nClust = g.info.n_cluster ?? 0;
440
+ const clust = g.info.clust;
441
+ if (nClust === 0 || !clust) return;
442
+ for (let c = 0; c < nClust; c++) {
443
+ const sg = clust[c];
444
+ if (sg) renderOneCluster(sg, renderer, job);
445
+ }
446
+ }
447
+
448
+ /**
449
+ * Primary render loop: beginGraph → graph-label → clusters → nodes → edges → endGraph.
450
+ * Graph label emits before clusters/nodes to match C's emit_page order
451
+ * (emit_background, GD_label, then emit_view).
452
+ *
453
+ * @see lib/gvc/gvrender.c:gvrender_begin_graph
454
+ * @see lib/gvc/gvrender.c:gvrender_end_graph
455
+ * @see lib/common/emit.c:emit_page (3655-3660)
456
+ */
457
+ export function renderGraph(g: Graph, job: RenderJob, renderer: RendererPlugin): string {
458
+ // push_obj_state in emit_begin_graph (line 3573), before beginGraph call
459
+ const obj = createObjState(ObjType.RootGraph);
460
+ obj.emitState = EmitState.GDraw;
461
+ job.pushObj(obj);
462
+ try {
463
+ const info = parseLayers(g);
464
+ // Only layer-capable renderers (SVG) do the layer loop; others collapse to
465
+ // one pass. @see lib/common/emit.c:1140 (GVDEVICE_DOES_LAYERS)
466
+ const layered = renderer.beginLayer !== undefined && info.numLayers > 1;
467
+ job.numLayers = layered ? info.numLayers : 1;
468
+ job.layerIDs = info.layerIDs;
469
+ renderer.beginGraph(g, job);
470
+ for (let ln = 1; ln <= job.numLayers; ln++) {
471
+ job.layerNum = ln;
472
+ if (layered) renderer.beginLayer!(info.layerIDs[ln]!, job);
473
+ renderPage(g, renderer, job, info);
474
+ if (layered) renderer.endLayer!(job);
475
+ }
476
+ renderer.endGraph(g, job);
477
+ } finally {
478
+ // pop_obj_state in emit_end_graph (line 3586), after endGraph
479
+ job.popObj();
480
+ }
481
+ return job.output.join('');
482
+ }
483
+
484
+ /** One page (per layer): graph group, background+label (in the graph anchor),
485
+ * clusters, nodes/edges. The graph anchor wraps emit_background + the graph
486
+ * label, closing before emit_view (clusters/nodes) — siblings.
487
+ * @see lib/common/emit.c:emit_page (3651-3660) */
488
+ function renderPage(g: Graph, renderer: RendererPlugin, job: RenderJob, info: LayerInfo): void {
489
+ renderer.beginPage?.(g, job);
490
+ if (job.obj !== null) {
491
+ resolveObjAnchor(g, labelTextOf(g.info.label), svgGraphId(g, job), job.obj);
492
+ }
493
+ const anchored = beginAnchorIf(renderer, job);
494
+ renderer.pageBackground?.(g, job);
495
+ // emit root-graph label before clusters/nodes @see lib/common/emit.c:emit_page
496
+ renderGraphLabel(g, renderer, job);
497
+ if (anchored) renderer.endAnchor?.(job);
498
+ // emit_view: clusters are drawn BEFORE nodes/edges normally, but the map
499
+ // device (EMIT_CLUSTERS_LAST) emits their <area> AFTER, so a node/edge area
500
+ // precedes its enclosing cluster's. @see lib/common/emit.c:emit_view (3513-3565)
501
+ const clustersLast = (job.flags & EMIT_CLUSTERS_LAST) !== 0;
502
+ if (!clustersLast) renderClusters(g, renderer, job);
503
+ walkNodesAndEdges(g, renderer, job, info);
504
+ if (clustersLast) renderClusters(g, renderer, job);
505
+ renderer.endPage?.(g, job);
506
+ }
507
+
508
+ // ---------------------------------------------------------------------------
509
+ // render — top-level convenience
510
+ // ---------------------------------------------------------------------------
511
+
512
+ /**
513
+ * Select renderer, create job, initialise bb from graph, then render.
514
+ *
515
+ * @param inlineImages - AD-1 (additive, default false): when true, the SVG
516
+ * renderer's usershape() consults the registered image resolver
517
+ * (`setImageResolver`) and inlines a `data:` URI on a hit instead of the
518
+ * raw src passthrough. Unset/false reproduces byte-identical pre-AD-1
519
+ * output. @see src/render/public.ts:RenderOptions.inlineImages
520
+ * @throws Error if no renderer is registered for format
521
+ * @see lib/gvc/gvrender.c:gvrender_select
522
+ */
523
+ export function render(ctx: GvcContext, g: Graph, format: string, inlineImages = false): string {
524
+ const renderer = ctx.bestRenderer(format);
525
+ const job = new RenderJob(format, ctx.textMeasurer);
526
+ job.inlineImages = inlineImages;
527
+ // gvc->bb = GD_bb(g) verbatim -- no recompute fallback. Every layout engine
528
+ // sets g.info.bb itself before render() runs (set_aspect for dot,
529
+ // compute_bb-equivalent computeSubgraphBB calls in neato/circo/sfdp/fdp/
530
+ // twopi/osage); when a layout phase aborts before that point (2825: dot_
531
+ // position fails before set_aspect), C leaves GD_bb at its zero default and
532
+ // the degenerate box propagates into job.bb/job.pad-derived clip below,
533
+ // excluding every node via node_in_box -- do not paper over that with a
534
+ // recompute, it is the mechanism that produces C's near-empty output.
535
+ // @see lib/common/emit.c:3272 init_gvc (gvc->bb = GD_bb(g))
536
+ job.bb = g.info.bb;
537
+ // init_job_pad: resolve job.pad from the `pad=` graph attribute before the
538
+ // size= fit is computed — C calls init_job_pad before init_job_viewport
539
+ // (emit.c:4289-4291) because the fit uses the padded bb.
540
+ // @see lib/common/emit.c:3241-3251 (attr read); :3290-3304 (fallback)
541
+ job.pad = parseGraphPad(g.attrs.get('pad'));
542
+ // init_job_margin: resolve job.margin from the `margin=` graph attribute,
543
+ // immediately after init_job_pad (C's call order, emit.c:4290-4291).
544
+ // margin does NOT feed the size= zoom fit below (only pad does) -- it is
545
+ // read here and consumed later, after Z is known, by emitSvgTag/svgBeginPage
546
+ // (job.width/height and the page group translate), matching C's
547
+ // init_job_margin -> init_job_dpi -> init_job_viewport -> init_job_pagination
548
+ // order where margin is resolved before Z but only used after it.
549
+ // @see lib/common/emit.c:3229-3239 (attr read); :3309-3331 (fallback)
550
+ job.margin = parseGraphMargin(g.attrs.get('margin'));
551
+ // init_job_viewport: fit the drawing into size= via a zoom Z carried by the
552
+ // SVG group transform (D1: parse here, not graph_init).
553
+ //
554
+ // Correction to D3: only the trailing `!` on size= sets the *filled* flag
555
+ // that init_job_viewport reads (input.c:694 GD_drawing->filled =
556
+ // getdoubles2ptf). `ratio=fill` instead sets ratio_kind=R_FILL (setRatio),
557
+ // which reshapes the *layout* (out of scope, D3) and does NOT feed
558
+ // init_job_viewport — so it is not OR-ed into filled here (doing so upscales
559
+ // ~31x where the oracle reshapes to ~1x). ratio=fill graphs therefore diverge
560
+ // on node positions, the deferred ratio-aspect-layout mission.
561
+ //
562
+ // Deviation from D4's stated mechanism: the brief assumed transformPoint
563
+ // short-circuits on GVRENDER_DOES_TRANSFORM for SVG, leaving job.zoom free to
564
+ // scale coordinates. In this port that flag is never set, so transformPoint
565
+ // (the shared raster ptf path — do not touch) applies job.zoom*devscale to
566
+ // every coordinate. To keep SVG coords full-size (D4's intent) WITHOUT
567
+ // altering the ptf path, carry Z in job.scale instead — which is exactly what
568
+ // C's SVG group emits (svg_begin_page prints job->scale.x/y = zoom*dpi/72),
569
+ // not job->zoom. job.scale is read only by the SVG group/dims.
570
+ const z = initJobViewportZoom(job.bb, parseDrawingSize(g.attrs.get('size')), job.pad);
571
+ // init_job_dpi (emit.c:3333): GD_drawing->dpi = late_double(dpi, resolution, 0)
572
+ // (input.c:713). When >0 it becomes job->dpi; otherwise the SVG device's
573
+ // default_dpi = 72 (gvrender_core_svg.c:814) applies. init_job_viewport then
574
+ // sets job->scale = zoom * dpi / POINTS_PER_INCH (emit.c:3680), and job->width
575
+ // = ROUND((pageSize+2*margin) * dpi/72) (emit.c:1249) — both carried here via
576
+ // job.scale, so a graph with dpi=96 scales the whole SVG group + dims by
577
+ // 96/72 = 1.333 exactly as native (e.g. 2619_1/2619_2). Absent the attribute
578
+ // dpi=72 makes this a no-op, leaving every other corpus byte unchanged.
579
+ const drawingDpi = lateDouble(
580
+ g.attrs.get('dpi'),
581
+ lateDouble(g.attrs.get('resolution'), 0, 0),
582
+ 0,
583
+ );
584
+ const jobDpi = drawingDpi > 0 ? drawingDpi : POINTS_PER_INCH;
585
+ job.dpi = { x: jobDpi, y: jobDpi };
586
+ const dpiScale = jobDpi / POINTS_PER_INCH;
587
+ job.scale = { x: z * dpiScale, y: z * dpiScale };
588
+ // init_job_viewport: job->rotation = gvc->rotation (= 90 for landscape, set in
589
+ // emit_graph from GD_drawing->landscape). Emit-only — drives the SVG group
590
+ // transform + dim swap (T2), never layout/routing (ADR-1). transformPoint is
591
+ // guarded against the ptf rotation branch (ADR-2).
592
+ // @see lib/common/emit.c:3260 (gvc->rotation=90); :3390 (job->rotation)
593
+ job.rotation = parseLandscape(g) ? 90 : 0;
594
+ job.renderer = renderer;
595
+ resetHtmlAnchorIds(); // C: fresh anchorId per dot invocation
596
+ for (const n of g.nodes.values()) polyInit(n, g, job.measurer);
597
+ return renderGraph(g, job, renderer);
598
+ }