@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.
- package/LICENSE +277 -0
- package/README.md +292 -0
- package/dist/api/builder.d.ts +78 -0
- package/dist/api/builder.d.ts.map +1 -0
- package/dist/api/edge-ops.d.ts +45 -0
- package/dist/api/edge-ops.d.ts.map +1 -0
- package/dist/api/geometry.d.ts +159 -0
- package/dist/api/geometry.d.ts.map +1 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api.js +719 -0
- package/dist/api.js.map +7 -0
- package/dist/bundle.js +101 -0
- package/dist/cdt/bag.d.ts +58 -0
- package/dist/cdt/bag.d.ts.map +1 -0
- package/dist/cdt/hash-core.d.ts +40 -0
- package/dist/cdt/hash-core.d.ts.map +1 -0
- package/dist/cdt/hash.d.ts +74 -0
- package/dist/cdt/hash.d.ts.map +1 -0
- package/dist/cdt/index.d.ts +16 -0
- package/dist/cdt/index.d.ts.map +1 -0
- package/dist/cdt/splay-core.d.ts +78 -0
- package/dist/cdt/splay-core.d.ts.map +1 -0
- package/dist/cdt/splay.d.ts +63 -0
- package/dist/cdt/splay.d.ts.map +1 -0
- package/dist/cdt/strhash.d.ts +26 -0
- package/dist/cdt/strhash.d.ts.map +1 -0
- package/dist/cdt/types.d.ts +11 -0
- package/dist/cdt/types.d.ts.map +1 -0
- package/dist/common/arith.d.ts +35 -0
- package/dist/common/arith.d.ts.map +1 -0
- package/dist/common/arm-pow-data.d.ts +17 -0
- package/dist/common/arm-pow-data.d.ts.map +1 -0
- package/dist/common/arm-pow.d.ts +12 -0
- package/dist/common/arm-pow.d.ts.map +1 -0
- package/dist/common/arrows-constants.d.ts +97 -0
- package/dist/common/arrows-constants.d.ts.map +1 -0
- package/dist/common/arrows-geometry.d.ts +24 -0
- package/dist/common/arrows-geometry.d.ts.map +1 -0
- package/dist/common/arrows-miter.d.ts +24 -0
- package/dist/common/arrows-miter.d.ts.map +1 -0
- package/dist/common/arrows-shapes-poly.d.ts +24 -0
- package/dist/common/arrows-shapes-poly.d.ts.map +1 -0
- package/dist/common/arrows-shapes-util.d.ts +77 -0
- package/dist/common/arrows-shapes-util.d.ts.map +1 -0
- package/dist/common/arrows-shapes.d.ts +48 -0
- package/dist/common/arrows-shapes.d.ts.map +1 -0
- package/dist/common/arrows-types.d.ts +59 -0
- package/dist/common/arrows-types.d.ts.map +1 -0
- package/dist/common/arrows.d.ts +69 -0
- package/dist/common/arrows.d.ts.map +1 -0
- package/dist/common/color.d.ts +66 -0
- package/dist/common/color.d.ts.map +1 -0
- package/dist/common/colorData.d.ts +10 -0
- package/dist/common/colorData.d.ts.map +1 -0
- package/dist/common/compass-port.d.ts +39 -0
- package/dist/common/compass-port.d.ts.map +1 -0
- package/dist/common/crand.d.ts +42 -0
- package/dist/common/crand.d.ts.map +1 -0
- package/dist/common/edge-label-init.d.ts +51 -0
- package/dist/common/edge-label-init.d.ts.map +1 -0
- package/dist/common/edge-offset.d.ts +66 -0
- package/dist/common/edge-offset.d.ts.map +1 -0
- package/dist/common/ellipse-wedge.d.ts +10 -0
- package/dist/common/ellipse-wedge.d.ts.map +1 -0
- package/dist/common/emit-types.d.ts +255 -0
- package/dist/common/emit-types.d.ts.map +1 -0
- package/dist/common/fma.d.ts +10 -0
- package/dist/common/fma.d.ts.map +1 -0
- package/dist/common/graph-init.d.ts +61 -0
- package/dist/common/graph-init.d.ts.map +1 -0
- package/dist/common/html-entities.d.ts +17 -0
- package/dist/common/html-entities.d.ts.map +1 -0
- package/dist/common/html-string.d.ts +14 -0
- package/dist/common/html-string.d.ts.map +1 -0
- package/dist/common/htmltable-emit-fill.d.ts +84 -0
- package/dist/common/htmltable-emit-fill.d.ts.map +1 -0
- package/dist/common/htmltable-emit-rules.d.ts +79 -0
- package/dist/common/htmltable-emit-rules.d.ts.map +1 -0
- package/dist/common/htmltable-emit.d.ts +63 -0
- package/dist/common/htmltable-emit.d.ts.map +1 -0
- package/dist/common/htmltable-lex.d.ts +16 -0
- package/dist/common/htmltable-lex.d.ts.map +1 -0
- package/dist/common/htmltable-parse.d.ts +37 -0
- package/dist/common/htmltable-parse.d.ts.map +1 -0
- package/dist/common/htmltable-port.d.ts +15 -0
- package/dist/common/htmltable-port.d.ts.map +1 -0
- package/dist/common/htmltable-pos-runs.d.ts +88 -0
- package/dist/common/htmltable-pos-runs.d.ts.map +1 -0
- package/dist/common/htmltable-pos.d.ts +192 -0
- package/dist/common/htmltable-pos.d.ts.map +1 -0
- package/dist/common/htmltable-types.d.ts +237 -0
- package/dist/common/htmltable-types.d.ts.map +1 -0
- package/dist/common/htmltable.d.ts +74 -0
- package/dist/common/htmltable.d.ts.map +1 -0
- package/dist/common/layers.d.ts +20 -0
- package/dist/common/layers.d.ts.map +1 -0
- package/dist/common/make-label.d.ts +60 -0
- package/dist/common/make-label.d.ts.map +1 -0
- package/dist/common/multicolor.d.ts +46 -0
- package/dist/common/multicolor.d.ts.map +1 -0
- package/dist/common/nodeinit.d.ts +45 -0
- package/dist/common/nodeinit.d.ts.map +1 -0
- package/dist/common/poly-gencode.d.ts +40 -0
- package/dist/common/poly-gencode.d.ts.map +1 -0
- package/dist/common/poly-init.d.ts +51 -0
- package/dist/common/poly-init.d.ts.map +1 -0
- package/dist/common/poly-inside.d.ts +37 -0
- package/dist/common/poly-inside.d.ts.map +1 -0
- package/dist/common/poly-shapes-cases.d.ts +31 -0
- package/dist/common/poly-shapes-cases.d.ts.map +1 -0
- package/dist/common/poly-shapes-cases2.d.ts +25 -0
- package/dist/common/poly-shapes-cases2.d.ts.map +1 -0
- package/dist/common/poly-shapes-util.d.ts +42 -0
- package/dist/common/poly-shapes-util.d.ts.map +1 -0
- package/dist/common/poly-shapes.d.ts +39 -0
- package/dist/common/poly-shapes.d.ts.map +1 -0
- package/dist/common/poly-sizing.d.ts +189 -0
- package/dist/common/poly-sizing.d.ts.map +1 -0
- package/dist/common/poly-vertices.d.ts +42 -0
- package/dist/common/poly-vertices.d.ts.map +1 -0
- package/dist/common/postproc.d.ts +49 -0
- package/dist/common/postproc.d.ts.map +1 -0
- package/dist/common/ps-fontalias.d.ts +36 -0
- package/dist/common/ps-fontalias.d.ts.map +1 -0
- package/dist/common/random.d.ts +8 -0
- package/dist/common/random.d.ts.map +1 -0
- package/dist/common/record-port.d.ts +34 -0
- package/dist/common/record-port.d.ts.map +1 -0
- package/dist/common/record.d.ts +105 -0
- package/dist/common/record.d.ts.map +1 -0
- package/dist/common/shapeData.d.ts +186 -0
- package/dist/common/shapeData.d.ts.map +1 -0
- package/dist/common/shapes.d.ts +36 -0
- package/dist/common/shapes.d.ts.map +1 -0
- package/dist/common/spline-midpoint.d.ts +31 -0
- package/dist/common/spline-midpoint.d.ts.map +1 -0
- package/dist/common/splines-clip.d.ts +21 -0
- package/dist/common/splines-clip.d.ts.map +1 -0
- package/dist/common/splines-constants.d.ts +42 -0
- package/dist/common/splines-constants.d.ts.map +1 -0
- package/dist/common/splines-geom.d.ts +51 -0
- package/dist/common/splines-geom.d.ts.map +1 -0
- package/dist/common/splines-path-begin.d.ts +17 -0
- package/dist/common/splines-path-begin.d.ts.map +1 -0
- package/dist/common/splines-path-end.d.ts +17 -0
- package/dist/common/splines-path-end.d.ts.map +1 -0
- package/dist/common/splines-path-shared.d.ts +53 -0
- package/dist/common/splines-path-shared.d.ts.map +1 -0
- package/dist/common/splines-routespl.d.ts +40 -0
- package/dist/common/splines-routespl.d.ts.map +1 -0
- package/dist/common/splines-selfedge.d.ts +21 -0
- package/dist/common/splines-selfedge.d.ts.map +1 -0
- package/dist/common/splines.d.ts +18 -0
- package/dist/common/splines.d.ts.map +1 -0
- package/dist/common/style-resolve.d.ts +197 -0
- package/dist/common/style-resolve.d.ts.map +1 -0
- package/dist/common/subst.d.ts +31 -0
- package/dist/common/subst.d.ts.map +1 -0
- package/dist/common/taper.d.ts +23 -0
- package/dist/common/taper.d.ts.map +1 -0
- package/dist/common/textmeasure-factory.d.ts +33 -0
- package/dist/common/textmeasure-factory.d.ts.map +1 -0
- package/dist/common/textmeasure-lookup.d.ts +17 -0
- package/dist/common/textmeasure-lookup.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data-a.d.ts +13 -0
- package/dist/common/textmeasure-lut-data-a.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data-b.d.ts +12 -0
- package/dist/common/textmeasure-lut-data-b.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data-c.d.ts +13 -0
- package/dist/common/textmeasure-lut-data-c.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data.d.ts +27 -0
- package/dist/common/textmeasure-lut-data.d.ts.map +1 -0
- package/dist/common/textmeasure.d.ts +120 -0
- package/dist/common/textmeasure.d.ts.map +1 -0
- package/dist/common/types.d.ts +316 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/xlabels-place.d.ts +125 -0
- package/dist/common/xlabels-place.d.ts.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/errors.d.ts +63 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/gvc/anchor.d.ts +86 -0
- package/dist/gvc/anchor.d.ts.map +1 -0
- package/dist/gvc/context.d.ts +177 -0
- package/dist/gvc/context.d.ts.map +1 -0
- package/dist/gvc/default-context.d.ts +20 -0
- package/dist/gvc/default-context.d.ts.map +1 -0
- package/dist/gvc/device-cluster.d.ts +25 -0
- package/dist/gvc/device-cluster.d.ts.map +1 -0
- package/dist/gvc/device.d.ts +99 -0
- package/dist/gvc/device.d.ts.map +1 -0
- package/dist/gvc/edge-labels.d.ts +10 -0
- package/dist/gvc/edge-labels.d.ts.map +1 -0
- package/dist/gvc/emit-walk.d.ts +22 -0
- package/dist/gvc/emit-walk.d.ts.map +1 -0
- package/dist/gvc/image-resolver.d.ts +44 -0
- package/dist/gvc/image-resolver.d.ts.map +1 -0
- package/dist/gvc/job.d.ts +234 -0
- package/dist/gvc/job.d.ts.map +1 -0
- package/dist/gvc/textlayout.d.ts +33 -0
- package/dist/gvc/textlayout.d.ts.map +1 -0
- package/dist/gvc/textspan-emit.d.ts +41 -0
- package/dist/gvc/textspan-emit.d.ts.map +1 -0
- package/dist/gvc/usershape.d.ts +25 -0
- package/dist/gvc/usershape.d.ts.map +1 -0
- package/dist/gvc/viewport.d.ts +71 -0
- package/dist/gvc/viewport.d.ts.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52862 -0
- package/dist/index.js.map +7 -0
- package/dist/label/index.d.ts +74 -0
- package/dist/label/index.d.ts.map +1 -0
- package/dist/label/node.d.ts +108 -0
- package/dist/label/node.d.ts.map +1 -0
- package/dist/label/rectangle.d.ts +60 -0
- package/dist/label/rectangle.d.ts.map +1 -0
- package/dist/label/split-q.d.ts +13 -0
- package/dist/label/split-q.d.ts.map +1 -0
- package/dist/label/xlabels-geom.d.ts +46 -0
- package/dist/label/xlabels-geom.d.ts.map +1 -0
- package/dist/label/xlabels-intersect.d.ts +79 -0
- package/dist/label/xlabels-intersect.d.ts.map +1 -0
- package/dist/label/xlabels.d.ts +67 -0
- package/dist/label/xlabels.d.ts.map +1 -0
- package/dist/layout/circo/blockpath.d.ts +120 -0
- package/dist/layout/circo/blockpath.d.ts.map +1 -0
- package/dist/layout/circo/blocks.d.ts +135 -0
- package/dist/layout/circo/blocks.d.ts.map +1 -0
- package/dist/layout/circo/blocktree.d.ts +51 -0
- package/dist/layout/circo/blocktree.d.ts.map +1 -0
- package/dist/layout/circo/circular.d.ts +59 -0
- package/dist/layout/circo/circular.d.ts.map +1 -0
- package/dist/layout/circo/index.d.ts +35 -0
- package/dist/layout/circo/index.d.ts.map +1 -0
- package/dist/layout/circo/init.d.ts +50 -0
- package/dist/layout/circo/init.d.ts.map +1 -0
- package/dist/layout/circo/position-helpers.d.ts +33 -0
- package/dist/layout/circo/position-helpers.d.ts.map +1 -0
- package/dist/layout/circo/position.d.ts +66 -0
- package/dist/layout/circo/position.d.ts.map +1 -0
- package/dist/layout/dot/acyclic.d.ts +8 -0
- package/dist/layout/dot/acyclic.d.ts.map +1 -0
- package/dist/layout/dot/aspect.d.ts +17 -0
- package/dist/layout/dot/aspect.d.ts.map +1 -0
- package/dist/layout/dot/classify.d.ts +52 -0
- package/dist/layout/dot/classify.d.ts.map +1 -0
- package/dist/layout/dot/cluster-path.d.ts +38 -0
- package/dist/layout/dot/cluster-path.d.ts.map +1 -0
- package/dist/layout/dot/cluster.d.ts +102 -0
- package/dist/layout/dot/cluster.d.ts.map +1 -0
- package/dist/layout/dot/compound-clip.d.ts +69 -0
- package/dist/layout/dot/compound-clip.d.ts.map +1 -0
- package/dist/layout/dot/compound-geom.d.ts +115 -0
- package/dist/layout/dot/compound-geom.d.ts.map +1 -0
- package/dist/layout/dot/compound.d.ts +56 -0
- package/dist/layout/dot/compound.d.ts.map +1 -0
- package/dist/layout/dot/conc.d.ts +88 -0
- package/dist/layout/dot/conc.d.ts.map +1 -0
- package/dist/layout/dot/decomp.d.ts +66 -0
- package/dist/layout/dot/decomp.d.ts.map +1 -0
- package/dist/layout/dot/edge-order.d.ts +27 -0
- package/dist/layout/dot/edge-order.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-arrow.d.ts +46 -0
- package/dist/layout/dot/edge-route-arrow.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-boxes.d.ts +75 -0
- package/dist/layout/dot/edge-route-boxes.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-chain.d.ts +67 -0
- package/dist/layout/dot/edge-route-chain.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-clip.d.ts +88 -0
- package/dist/layout/dot/edge-route-clip.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-faithful.d.ts +94 -0
- package/dist/layout/dot/edge-route-faithful.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-geom.d.ts +43 -0
- package/dist/layout/dot/edge-route-geom.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-helpers.d.ts +50 -0
- package/dist/layout/dot/edge-route-helpers.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-poly.d.ts +48 -0
- package/dist/layout/dot/edge-route-poly.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-rank.d.ts +57 -0
- package/dist/layout/dot/edge-route-rank.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-routing.d.ts +99 -0
- package/dist/layout/dot/edge-route-routing.d.ts.map +1 -0
- package/dist/layout/dot/edge-route.d.ts +57 -0
- package/dist/layout/dot/edge-route.d.ts.map +1 -0
- package/dist/layout/dot/fastgr.d.ts +147 -0
- package/dist/layout/dot/fastgr.d.ts.map +1 -0
- package/dist/layout/dot/flat-utils.d.ts +21 -0
- package/dist/layout/dot/flat-utils.d.ts.map +1 -0
- package/dist/layout/dot/flat.d.ts +152 -0
- package/dist/layout/dot/flat.d.ts.map +1 -0
- package/dist/layout/dot/graph-label.d.ts +18 -0
- package/dist/layout/dot/graph-label.d.ts.map +1 -0
- package/dist/layout/dot/index.d.ts +128 -0
- package/dist/layout/dot/index.d.ts.map +1 -0
- package/dist/layout/dot/init.d.ts +93 -0
- package/dist/layout/dot/init.d.ts.map +1 -0
- package/dist/layout/dot/label-order.d.ts +45 -0
- package/dist/layout/dot/label-order.d.ts.map +1 -0
- package/dist/layout/dot/mincross-build.d.ts +52 -0
- package/dist/layout/dot/mincross-build.d.ts.map +1 -0
- package/dist/layout/dot/mincross-cross.d.ts +80 -0
- package/dist/layout/dot/mincross-cross.d.ts.map +1 -0
- package/dist/layout/dot/mincross-flat.d.ts +27 -0
- package/dist/layout/dot/mincross-flat.d.ts.map +1 -0
- package/dist/layout/dot/mincross-order.d.ts +89 -0
- package/dist/layout/dot/mincross-order.d.ts.map +1 -0
- package/dist/layout/dot/mincross-utils.d.ts +60 -0
- package/dist/layout/dot/mincross-utils.d.ts.map +1 -0
- package/dist/layout/dot/mincross.d.ts +75 -0
- package/dist/layout/dot/mincross.d.ts.map +1 -0
- package/dist/layout/dot/ns-core.d.ts +37 -0
- package/dist/layout/dot/ns-core.d.ts.map +1 -0
- package/dist/layout/dot/ns-range.d.ts +17 -0
- package/dist/layout/dot/ns-range.d.ts.map +1 -0
- package/dist/layout/dot/ns-subtree.d.ts +78 -0
- package/dist/layout/dot/ns-subtree.d.ts.map +1 -0
- package/dist/layout/dot/ns.d.ts +86 -0
- package/dist/layout/dot/ns.d.ts.map +1 -0
- package/dist/layout/dot/ortho-adapter.d.ts +19 -0
- package/dist/layout/dot/ortho-adapter.d.ts.map +1 -0
- package/dist/layout/dot/pack-components.d.ts +100 -0
- package/dist/layout/dot/pack-components.d.ts.map +1 -0
- package/dist/layout/dot/position-aux.d.ts +110 -0
- package/dist/layout/dot/position-aux.d.ts.map +1 -0
- package/dist/layout/dot/position-bbox.d.ts +57 -0
- package/dist/layout/dot/position-bbox.d.ts.map +1 -0
- package/dist/layout/dot/position-cluster.d.ts +48 -0
- package/dist/layout/dot/position-cluster.d.ts.map +1 -0
- package/dist/layout/dot/position-ycoords.d.ts +42 -0
- package/dist/layout/dot/position-ycoords.d.ts.map +1 -0
- package/dist/layout/dot/position.d.ts +47 -0
- package/dist/layout/dot/position.d.ts.map +1 -0
- package/dist/layout/dot/rank-dot2.d.ts +114 -0
- package/dist/layout/dot/rank-dot2.d.ts.map +1 -0
- package/dist/layout/dot/rank.d.ts +119 -0
- package/dist/layout/dot/rank.d.ts.map +1 -0
- package/dist/layout/dot/sameport.d.ts +70 -0
- package/dist/layout/dot/sameport.d.ts.map +1 -0
- package/dist/layout/dot/self-loop.d.ts +54 -0
- package/dist/layout/dot/self-loop.d.ts.map +1 -0
- package/dist/layout/dot/splines-clone.d.ts +33 -0
- package/dist/layout/dot/splines-clone.d.ts.map +1 -0
- package/dist/layout/dot/splines-flat-labeled.d.ts +101 -0
- package/dist/layout/dot/splines-flat-labeled.d.ts.map +1 -0
- package/dist/layout/dot/splines-flat-multi.d.ts +35 -0
- package/dist/layout/dot/splines-flat-multi.d.ts.map +1 -0
- package/dist/layout/dot/splines-flat.d.ts +116 -0
- package/dist/layout/dot/splines-flat.d.ts.map +1 -0
- package/dist/layout/dot/splines-groups.d.ts +38 -0
- package/dist/layout/dot/splines-groups.d.ts.map +1 -0
- package/dist/layout/dot/splines-label.d.ts +105 -0
- package/dist/layout/dot/splines-label.d.ts.map +1 -0
- package/dist/layout/dot/splines-route-type.d.ts +28 -0
- package/dist/layout/dot/splines-route-type.d.ts.map +1 -0
- package/dist/layout/dot/splines-route.d.ts +99 -0
- package/dist/layout/dot/splines-route.d.ts.map +1 -0
- package/dist/layout/dot/splines.d.ts +157 -0
- package/dist/layout/dot/splines.d.ts.map +1 -0
- package/dist/layout/dot/straight-edges.d.ts +39 -0
- package/dist/layout/dot/straight-edges.d.ts.map +1 -0
- package/dist/layout/fdp/cluster-edges.d.ts +31 -0
- package/dist/layout/fdp/cluster-edges.d.ts.map +1 -0
- package/dist/layout/fdp/comp.d.ts +29 -0
- package/dist/layout/fdp/comp.d.ts.map +1 -0
- package/dist/layout/fdp/derive.d.ts +39 -0
- package/dist/layout/fdp/derive.d.ts.map +1 -0
- package/dist/layout/fdp/fdp-model.d.ts +101 -0
- package/dist/layout/fdp/fdp-model.d.ts.map +1 -0
- package/dist/layout/fdp/grid.d.ts +49 -0
- package/dist/layout/fdp/grid.d.ts.map +1 -0
- package/dist/layout/fdp/index.d.ts +36 -0
- package/dist/layout/fdp/index.d.ts.map +1 -0
- package/dist/layout/fdp/init.d.ts +26 -0
- package/dist/layout/fdp/init.d.ts.map +1 -0
- package/dist/layout/fdp/layout.d.ts +57 -0
- package/dist/layout/fdp/layout.d.ts.map +1 -0
- package/dist/layout/fdp/normalize.d.ts +18 -0
- package/dist/layout/fdp/normalize.d.ts.map +1 -0
- package/dist/layout/fdp/ports.d.ts +41 -0
- package/dist/layout/fdp/ports.d.ts.map +1 -0
- package/dist/layout/fdp/tlayout-init.d.ts +21 -0
- package/dist/layout/fdp/tlayout-init.d.ts.map +1 -0
- package/dist/layout/fdp/tlayout-parms.d.ts +98 -0
- package/dist/layout/fdp/tlayout-parms.d.ts.map +1 -0
- package/dist/layout/fdp/tlayout.d.ts +43 -0
- package/dist/layout/fdp/tlayout.d.ts.map +1 -0
- package/dist/layout/fdp/xlayout.d.ts +26 -0
- package/dist/layout/fdp/xlayout.d.ts.map +1 -0
- package/dist/layout/neato/bfs.d.ts +43 -0
- package/dist/layout/neato/bfs.d.ts.map +1 -0
- package/dist/layout/neato/cdt-surface.d.ts +16 -0
- package/dist/layout/neato/cdt-surface.d.ts.map +1 -0
- package/dist/layout/neato/conjgrad.d.ts +61 -0
- package/dist/layout/neato/conjgrad.d.ts.map +1 -0
- package/dist/layout/neato/delaunay.d.ts +28 -0
- package/dist/layout/neato/delaunay.d.ts.map +1 -0
- package/dist/layout/neato/dijkstra.d.ts +80 -0
- package/dist/layout/neato/dijkstra.d.ts.map +1 -0
- package/dist/layout/neato/fdp-adjust.d.ts +31 -0
- package/dist/layout/neato/fdp-adjust.d.ts.map +1 -0
- package/dist/layout/neato/index.d.ts +58 -0
- package/dist/layout/neato/index.d.ts.map +1 -0
- package/dist/layout/neato/init.d.ts +207 -0
- package/dist/layout/neato/init.d.ts.map +1 -0
- package/dist/layout/neato/legal.d.ts +7 -0
- package/dist/layout/neato/legal.d.ts.map +1 -0
- package/dist/layout/neato/matrix-ops.d.ts +28 -0
- package/dist/layout/neato/matrix-ops.d.ts.map +1 -0
- package/dist/layout/neato/multispline-router.d.ts +80 -0
- package/dist/layout/neato/multispline-router.d.ts.map +1 -0
- package/dist/layout/neato/multispline.d.ts +24 -0
- package/dist/layout/neato/multispline.d.ts.map +1 -0
- package/dist/layout/neato/overlap-prism.d.ts +26 -0
- package/dist/layout/neato/overlap-prism.d.ts.map +1 -0
- package/dist/layout/neato/overlap.d.ts +85 -0
- package/dist/layout/neato/overlap.d.ts.map +1 -0
- package/dist/layout/neato/sc-adjust.d.ts +33 -0
- package/dist/layout/neato/sc-adjust.d.ts.map +1 -0
- package/dist/layout/neato/sep-factor.d.ts +41 -0
- package/dist/layout/neato/sep-factor.d.ts.map +1 -0
- package/dist/layout/neato/set-aspect.d.ts +33 -0
- package/dist/layout/neato/set-aspect.d.ts.map +1 -0
- package/dist/layout/neato/sgd.d.ts +166 -0
- package/dist/layout/neato/sgd.d.ts.map +1 -0
- package/dist/layout/neato/splines.d.ts +153 -0
- package/dist/layout/neato/splines.d.ts.map +1 -0
- package/dist/layout/neato/stress-kernel.d.ts +53 -0
- package/dist/layout/neato/stress-kernel.d.ts.map +1 -0
- package/dist/layout/neato/stress.d.ts +158 -0
- package/dist/layout/neato/stress.d.ts.map +1 -0
- package/dist/layout/osage/index.d.ts +158 -0
- package/dist/layout/osage/index.d.ts.map +1 -0
- package/dist/layout/osage/layout.d.ts +49 -0
- package/dist/layout/osage/layout.d.ts.map +1 -0
- package/dist/layout/osage/types.d.ts +28 -0
- package/dist/layout/osage/types.d.ts.map +1 -0
- package/dist/layout/pack/array-pack.d.ts +114 -0
- package/dist/layout/pack/array-pack.d.ts.map +1 -0
- package/dist/layout/pack/index.d.ts +157 -0
- package/dist/layout/pack/index.d.ts.map +1 -0
- package/dist/layout/pack/poly-pack.d.ts +126 -0
- package/dist/layout/pack/poly-pack.d.ts.map +1 -0
- package/dist/layout/pack/poly-place.d.ts +27 -0
- package/dist/layout/pack/poly-place.d.ts.map +1 -0
- package/dist/layout/pack/spiral-search.d.ts +18 -0
- package/dist/layout/pack/spiral-search.d.ts.map +1 -0
- package/dist/layout/pack/test-helpers.d.ts +7 -0
- package/dist/layout/pack/test-helpers.d.ts.map +1 -0
- package/dist/layout/pack/types.d.ts +74 -0
- package/dist/layout/pack/types.d.ts.map +1 -0
- package/dist/layout/patchwork/index.d.ts +136 -0
- package/dist/layout/patchwork/index.d.ts.map +1 -0
- package/dist/layout/patchwork/tree-map.d.ts +32 -0
- package/dist/layout/patchwork/tree-map.d.ts.map +1 -0
- package/dist/layout/patchwork/tree-node.d.ts +46 -0
- package/dist/layout/patchwork/tree-node.d.ts.map +1 -0
- package/dist/layout/sfdp/index.d.ts +39 -0
- package/dist/layout/sfdp/index.d.ts.map +1 -0
- package/dist/layout/sfdp/init.d.ts +61 -0
- package/dist/layout/sfdp/init.d.ts.map +1 -0
- package/dist/layout/sfdp/multilevel.d.ts +23 -0
- package/dist/layout/sfdp/multilevel.d.ts.map +1 -0
- package/dist/layout/sfdp/quadtree.d.ts +45 -0
- package/dist/layout/sfdp/quadtree.d.ts.map +1 -0
- package/dist/layout/sfdp/sparse-matrix-multiply.d.ts +34 -0
- package/dist/layout/sfdp/sparse-matrix-multiply.d.ts.map +1 -0
- package/dist/layout/sfdp/sparse-matrix.d.ts +101 -0
- package/dist/layout/sfdp/sparse-matrix.d.ts.map +1 -0
- package/dist/layout/sfdp/sparse-solve.d.ts +14 -0
- package/dist/layout/sfdp/sparse-solve.d.ts.map +1 -0
- package/dist/layout/sfdp/spring-driver.d.ts +18 -0
- package/dist/layout/sfdp/spring-driver.d.ts.map +1 -0
- package/dist/layout/sfdp/spring-electrical.d.ts +61 -0
- package/dist/layout/sfdp/spring-electrical.d.ts.map +1 -0
- package/dist/layout/twopi/circle.d.ts +83 -0
- package/dist/layout/twopi/circle.d.ts.map +1 -0
- package/dist/layout/twopi/index.d.ts +24 -0
- package/dist/layout/twopi/index.d.ts.map +1 -0
- package/dist/layout/twopi/init.d.ts +85 -0
- package/dist/layout/twopi/init.d.ts.map +1 -0
- package/dist/layout/twopi/pipeline.d.ts +37 -0
- package/dist/layout/twopi/pipeline.d.ts.map +1 -0
- package/dist/layout/twopi/twopi-test-helpers.d.ts +12 -0
- package/dist/layout/twopi/twopi-test-helpers.d.ts.map +1 -0
- package/dist/model/algData.d.ts +175 -0
- package/dist/model/algData.d.ts.map +1 -0
- package/dist/model/cgraph-ops.d.ts +86 -0
- package/dist/model/cgraph-ops.d.ts.map +1 -0
- package/dist/model/edge.d.ts +80 -0
- package/dist/model/edge.d.ts.map +1 -0
- package/dist/model/edgeInfo.d.ts +299 -0
- package/dist/model/edgeInfo.d.ts.map +1 -0
- package/dist/model/geom.d.ts +149 -0
- package/dist/model/geom.d.ts.map +1 -0
- package/dist/model/graph.d.ts +135 -0
- package/dist/model/graph.d.ts.map +1 -0
- package/dist/model/graphInfo.d.ts +418 -0
- package/dist/model/graphInfo.d.ts.map +1 -0
- package/dist/model/index.d.ts +10 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/layoutParams.d.ts +85 -0
- package/dist/model/layoutParams.d.ts.map +1 -0
- package/dist/model/node.d.ts +101 -0
- package/dist/model/node.d.ts.map +1 -0
- package/dist/model/nodeInfo.d.ts +278 -0
- package/dist/model/nodeInfo.d.ts.map +1 -0
- package/dist/model/rankEntry.d.ts +80 -0
- package/dist/model/rankEntry.d.ts.map +1 -0
- package/dist/ortho/chan-dict.d.ts +82 -0
- package/dist/ortho/chan-dict.d.ts.map +1 -0
- package/dist/ortho/fpq.d.ts +54 -0
- package/dist/ortho/fpq.d.ts.map +1 -0
- package/dist/ortho/index.d.ts +35 -0
- package/dist/ortho/index.d.ts.map +1 -0
- package/dist/ortho/maze-channels.d.ts +47 -0
- package/dist/ortho/maze-channels.d.ts.map +1 -0
- package/dist/ortho/maze.d.ts +27 -0
- package/dist/ortho/maze.d.ts.map +1 -0
- package/dist/ortho/ortho-parallel.d.ts +26 -0
- package/dist/ortho/ortho-parallel.d.ts.map +1 -0
- package/dist/ortho/ortho-route.d.ts +31 -0
- package/dist/ortho/ortho-route.d.ts.map +1 -0
- package/dist/ortho/partition.d.ts +34 -0
- package/dist/ortho/partition.d.ts.map +1 -0
- package/dist/ortho/rawgraph.d.ts +41 -0
- package/dist/ortho/rawgraph.d.ts.map +1 -0
- package/dist/ortho/sgraph.d.ts +74 -0
- package/dist/ortho/sgraph.d.ts.map +1 -0
- package/dist/ortho/trap-query.d.ts +32 -0
- package/dist/ortho/trap-query.d.ts.map +1 -0
- package/dist/ortho/trap-segment.d.ts +23 -0
- package/dist/ortho/trap-segment.d.ts.map +1 -0
- package/dist/ortho/trap-types.d.ts +91 -0
- package/dist/ortho/trap-types.d.ts.map +1 -0
- package/dist/ortho/trap-update.d.ts +12 -0
- package/dist/ortho/trap-update.d.ts.map +1 -0
- package/dist/ortho/trapezoid.d.ts +18 -0
- package/dist/ortho/trapezoid.d.ts.map +1 -0
- package/dist/ortho/types.d.ts +241 -0
- package/dist/ortho/types.d.ts.map +1 -0
- package/dist/parser/ast.d.ts +49 -0
- package/dist/parser/ast.d.ts.map +1 -0
- package/dist/parser/builder.d.ts +75 -0
- package/dist/parser/builder.d.ts.map +1 -0
- package/dist/parser/index.d.ts +97 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/pathplan/index.d.ts +8 -0
- package/dist/pathplan/index.d.ts.map +1 -0
- package/dist/pathplan/route.d.ts +9 -0
- package/dist/pathplan/route.d.ts.map +1 -0
- package/dist/pathplan/shortest.d.ts +5 -0
- package/dist/pathplan/shortest.d.ts.map +1 -0
- package/dist/pathplan/solvers.d.ts +5 -0
- package/dist/pathplan/solvers.d.ts.map +1 -0
- package/dist/pathplan/triang.d.ts +25 -0
- package/dist/pathplan/triang.d.ts.map +1 -0
- package/dist/pathplan/types.d.ts +22 -0
- package/dist/pathplan/types.d.ts.map +1 -0
- package/dist/pathplan/visibility.d.ts +13 -0
- package/dist/pathplan/visibility.d.ts.map +1 -0
- package/dist/pathplan/vispath.d.ts +9 -0
- package/dist/pathplan/vispath.d.ts.map +1 -0
- package/dist/rbtree/index.d.ts +127 -0
- package/dist/rbtree/index.d.ts.map +1 -0
- package/dist/render/color-resolve.d.ts +38 -0
- package/dist/render/color-resolve.d.ts.map +1 -0
- package/dist/render/dot.d.ts +379 -0
- package/dist/render/dot.d.ts.map +1 -0
- package/dist/render/index.d.ts +24 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/json.d.ts +89 -0
- package/dist/render/json.d.ts.map +1 -0
- package/dist/render/map-test-helpers.d.ts +13 -0
- package/dist/render/map-test-helpers.d.ts.map +1 -0
- package/dist/render/map.d.ts +197 -0
- package/dist/render/map.d.ts.map +1 -0
- package/dist/render/public.d.ts +64 -0
- package/dist/render/public.d.ts.map +1 -0
- package/dist/render/svg-arrow-ops.d.ts +10 -0
- package/dist/render/svg-arrow-ops.d.ts.map +1 -0
- package/dist/render/svg-cluster.d.ts +9 -0
- package/dist/render/svg-cluster.d.ts.map +1 -0
- package/dist/render/svg-edge-ortho-radius.d.ts +31 -0
- package/dist/render/svg-edge-ortho-radius.d.ts.map +1 -0
- package/dist/render/svg-edge-split.d.ts +48 -0
- package/dist/render/svg-edge-split.d.ts.map +1 -0
- package/dist/render/svg-gradient.d.ts +46 -0
- package/dist/render/svg-gradient.d.ts.map +1 -0
- package/dist/render/svg-graph.d.ts +97 -0
- package/dist/render/svg-graph.d.ts.map +1 -0
- package/dist/render/svg-helpers.d.ts +122 -0
- package/dist/render/svg-helpers.d.ts.map +1 -0
- package/dist/render/svg-id.d.ts +28 -0
- package/dist/render/svg-id.d.ts.map +1 -0
- package/dist/render/svg-multicolor.d.ts +60 -0
- package/dist/render/svg-multicolor.d.ts.map +1 -0
- package/dist/render/svg-parallel-edge.d.ts +28 -0
- package/dist/render/svg-parallel-edge.d.ts.map +1 -0
- package/dist/render/svg-tapered-edge.d.ts +18 -0
- package/dist/render/svg-tapered-edge.d.ts.map +1 -0
- package/dist/render/svg.d.ts +104 -0
- package/dist/render/svg.d.ts.map +1 -0
- package/dist/render/xdot-public.d.ts +95 -0
- package/dist/render/xdot-public.d.ts.map +1 -0
- package/dist/render/xml-escape.d.ts +21 -0
- package/dist/render/xml-escape.d.ts.map +1 -0
- package/dist/render.js +52556 -0
- package/dist/render.js.map +7 -0
- package/dist/util/agxbuf.d.ts +72 -0
- package/dist/util/agxbuf.d.ts.map +1 -0
- package/dist/util/bsd-qsort.d.ts +22 -0
- package/dist/util/bsd-qsort.d.ts.map +1 -0
- package/dist/util/index.d.ts +11 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/list.d.ts +47 -0
- package/dist/util/list.d.ts.map +1 -0
- package/dist/util/math.d.ts +54 -0
- package/dist/util/math.d.ts.map +1 -0
- package/dist/util/mt19937.d.ts +40 -0
- package/dist/util/mt19937.d.ts.map +1 -0
- package/dist/util/printf-round.d.ts +45 -0
- package/dist/util/printf-round.d.ts.map +1 -0
- package/dist/util/xml.d.ts +24 -0
- package/dist/util/xml.d.ts.map +1 -0
- package/dist/vpsc/Block.d.ts +116 -0
- package/dist/vpsc/Block.d.ts.map +1 -0
- package/dist/vpsc/Blocks.d.ts +66 -0
- package/dist/vpsc/Blocks.d.ts.map +1 -0
- package/dist/vpsc/Constraint.d.ts +51 -0
- package/dist/vpsc/Constraint.d.ts.map +1 -0
- package/dist/vpsc/HeapUtils.d.ts +37 -0
- package/dist/vpsc/HeapUtils.d.ts.map +1 -0
- package/dist/vpsc/Solver.d.ts +107 -0
- package/dist/vpsc/Solver.d.ts.map +1 -0
- package/dist/vpsc/SweepLine.d.ts +38 -0
- package/dist/vpsc/SweepLine.d.ts.map +1 -0
- package/dist/vpsc/Variable.d.ts +38 -0
- package/dist/vpsc/Variable.d.ts.map +1 -0
- package/dist/vpsc/index.d.ts +54 -0
- package/dist/vpsc/index.d.ts.map +1 -0
- package/dist/vpsc/sweepTypes.d.ts +29 -0
- package/dist/vpsc/sweepTypes.d.ts.map +1 -0
- package/dist/xdot/index.d.ts +6 -0
- package/dist/xdot/index.d.ts.map +1 -0
- package/dist/xdot/lex.d.ts +22 -0
- package/dist/xdot/lex.d.ts.map +1 -0
- package/dist/xdot/misc.d.ts +13 -0
- package/dist/xdot/misc.d.ts.map +1 -0
- package/dist/xdot/parse.d.ts +21 -0
- package/dist/xdot/parse.d.ts.map +1 -0
- package/dist/xdot/types.d.ts +152 -0
- package/dist/xdot/types.d.ts.map +1 -0
- package/package.json +113 -0
- package/src/api/builder.ts +277 -0
- package/src/api/edge-ops.ts +113 -0
- package/src/api/geometry.ts +307 -0
- package/src/api/index.ts +46 -0
- package/src/cdt/bag.ts +196 -0
- package/src/cdt/hash-core.ts +84 -0
- package/src/cdt/hash.ts +207 -0
- package/src/cdt/index.ts +17 -0
- package/src/cdt/splay-core.ts +301 -0
- package/src/cdt/splay.ts +191 -0
- package/src/cdt/strhash.ts +52 -0
- package/src/cdt/types.ts +13 -0
- package/src/common/arith.ts +39 -0
- package/src/common/arm-pow-data.ts +201 -0
- package/src/common/arm-pow.ts +296 -0
- package/src/common/arrows-constants.ts +175 -0
- package/src/common/arrows-geometry.ts +62 -0
- package/src/common/arrows-miter.ts +84 -0
- package/src/common/arrows-shapes-poly.ts +241 -0
- package/src/common/arrows-shapes-util.ts +162 -0
- package/src/common/arrows-shapes.ts +360 -0
- package/src/common/arrows-types.ts +59 -0
- package/src/common/arrows.ts +209 -0
- package/src/common/color.ts +340 -0
- package/src/common/colorData.ts +264 -0
- package/src/common/compass-port.ts +384 -0
- package/src/common/crand.ts +79 -0
- package/src/common/edge-label-init.ts +310 -0
- package/src/common/edge-offset.ts +140 -0
- package/src/common/ellipse-wedge.ts +189 -0
- package/src/common/emit-types.ts +332 -0
- package/src/common/fma.ts +52 -0
- package/src/common/graph-init.ts +359 -0
- package/src/common/html-entities.ts +299 -0
- package/src/common/html-string.ts +22 -0
- package/src/common/htmltable-emit-fill.ts +367 -0
- package/src/common/htmltable-emit-rules.ts +293 -0
- package/src/common/htmltable-emit.ts +345 -0
- package/src/common/htmltable-lex.ts +138 -0
- package/src/common/htmltable-parse.ts +539 -0
- package/src/common/htmltable-port.ts +32 -0
- package/src/common/htmltable-pos-runs.ts +313 -0
- package/src/common/htmltable-pos.ts +601 -0
- package/src/common/htmltable-types.ts +262 -0
- package/src/common/htmltable.ts +477 -0
- package/src/common/layers.ts +113 -0
- package/src/common/make-label.ts +192 -0
- package/src/common/multicolor.ts +167 -0
- package/src/common/nodeinit.ts +339 -0
- package/src/common/poly-gencode.ts +475 -0
- package/src/common/poly-init.ts +133 -0
- package/src/common/poly-inside.ts +202 -0
- package/src/common/poly-shapes-cases.ts +253 -0
- package/src/common/poly-shapes-cases2.ts +170 -0
- package/src/common/poly-shapes-util.ts +124 -0
- package/src/common/poly-shapes.ts +181 -0
- package/src/common/poly-sizing.ts +639 -0
- package/src/common/poly-vertices.ts +237 -0
- package/src/common/postproc.ts +436 -0
- package/src/common/ps-fontalias.ts +112 -0
- package/src/common/random.ts +37 -0
- package/src/common/record-port.ts +89 -0
- package/src/common/record.ts +523 -0
- package/src/common/shapeData.ts +502 -0
- package/src/common/shapes.ts +187 -0
- package/src/common/spline-midpoint.ts +105 -0
- package/src/common/splines-clip.ts +449 -0
- package/src/common/splines-constants.ts +53 -0
- package/src/common/splines-geom.ts +194 -0
- package/src/common/splines-path-begin.ts +243 -0
- package/src/common/splines-path-end.ts +231 -0
- package/src/common/splines-path-shared.ts +258 -0
- package/src/common/splines-routespl.ts +444 -0
- package/src/common/splines-selfedge.ts +403 -0
- package/src/common/splines.ts +33 -0
- package/src/common/style-resolve.ts +481 -0
- package/src/common/subst.ts +126 -0
- package/src/common/taper.ts +219 -0
- package/src/common/textmeasure-factory.ts +86 -0
- package/src/common/textmeasure-lookup.ts +50 -0
- package/src/common/textmeasure-lut-data-a.ts +182 -0
- package/src/common/textmeasure-lut-data-b.ts +140 -0
- package/src/common/textmeasure-lut-data-c.ts +221 -0
- package/src/common/textmeasure-lut-data.ts +78 -0
- package/src/common/textmeasure.ts +321 -0
- package/src/common/types.ts +425 -0
- package/src/common/xlabels-place.ts +475 -0
- package/src/debug.ts +38 -0
- package/src/errors.ts +95 -0
- package/src/gvc/anchor.ts +530 -0
- package/src/gvc/context.ts +260 -0
- package/src/gvc/default-context.ts +70 -0
- package/src/gvc/device-cluster.ts +114 -0
- package/src/gvc/device.ts +598 -0
- package/src/gvc/edge-labels.ts +116 -0
- package/src/gvc/emit-walk.ts +98 -0
- package/src/gvc/image-resolver.ts +137 -0
- package/src/gvc/job.ts +401 -0
- package/src/gvc/textlayout.ts +44 -0
- package/src/gvc/textspan-emit.ts +100 -0
- package/src/gvc/usershape.ts +33 -0
- package/src/gvc/viewport.ts +203 -0
- package/src/index.ts +165 -0
- package/src/label/index.ts +302 -0
- package/src/label/node.ts +278 -0
- package/src/label/rectangle.ts +123 -0
- package/src/label/split-q.ts +237 -0
- package/src/label/xlabels-geom.ts +132 -0
- package/src/label/xlabels-intersect.ts +421 -0
- package/src/label/xlabels.ts +212 -0
- package/src/layout/circo/blockpath.ts +560 -0
- package/src/layout/circo/blocks.ts +234 -0
- package/src/layout/circo/blocktree.ts +246 -0
- package/src/layout/circo/circular.ts +227 -0
- package/src/layout/circo/index.ts +90 -0
- package/src/layout/circo/init.ts +84 -0
- package/src/layout/circo/position-helpers.ts +104 -0
- package/src/layout/circo/position.ts +196 -0
- package/src/layout/dot/__fixtures__/xcoord-pivot-divergence.gv +79 -0
- package/src/layout/dot/acyclic.ts +60 -0
- package/src/layout/dot/aspect.ts +22 -0
- package/src/layout/dot/classify.ts +462 -0
- package/src/layout/dot/cluster-path.ts +200 -0
- package/src/layout/dot/cluster.ts +480 -0
- package/src/layout/dot/compound-clip.ts +224 -0
- package/src/layout/dot/compound-geom.ts +282 -0
- package/src/layout/dot/compound.ts +294 -0
- package/src/layout/dot/conc.ts +433 -0
- package/src/layout/dot/decomp.ts +165 -0
- package/src/layout/dot/edge-order.ts +62 -0
- package/src/layout/dot/edge-route-arrow.ts +87 -0
- package/src/layout/dot/edge-route-boxes.ts +99 -0
- package/src/layout/dot/edge-route-chain.ts +420 -0
- package/src/layout/dot/edge-route-clip.ts +253 -0
- package/src/layout/dot/edge-route-faithful.ts +404 -0
- package/src/layout/dot/edge-route-geom.ts +90 -0
- package/src/layout/dot/edge-route-helpers.ts +170 -0
- package/src/layout/dot/edge-route-poly.ts +174 -0
- package/src/layout/dot/edge-route-rank.ts +136 -0
- package/src/layout/dot/edge-route-routing.ts +219 -0
- package/src/layout/dot/edge-route.ts +490 -0
- package/src/layout/dot/fastgr.ts +377 -0
- package/src/layout/dot/flat-utils.ts +52 -0
- package/src/layout/dot/flat.ts +518 -0
- package/src/layout/dot/graph-label.ts +114 -0
- package/src/layout/dot/index.ts +302 -0
- package/src/layout/dot/init.ts +300 -0
- package/src/layout/dot/label-order.ts +161 -0
- package/src/layout/dot/mincross-build.ts +373 -0
- package/src/layout/dot/mincross-cross.ts +409 -0
- package/src/layout/dot/mincross-flat.ts +213 -0
- package/src/layout/dot/mincross-order.ts +401 -0
- package/src/layout/dot/mincross-utils.ts +170 -0
- package/src/layout/dot/mincross.ts +386 -0
- package/src/layout/dot/ns-core.ts +122 -0
- package/src/layout/dot/ns-range.ts +228 -0
- package/src/layout/dot/ns-subtree.ts +347 -0
- package/src/layout/dot/ns.ts +506 -0
- package/src/layout/dot/ortho-adapter.ts +133 -0
- package/src/layout/dot/pack-components.ts +433 -0
- package/src/layout/dot/position-aux.ts +382 -0
- package/src/layout/dot/position-bbox.ts +221 -0
- package/src/layout/dot/position-cluster.ts +286 -0
- package/src/layout/dot/position-ycoords.ts +287 -0
- package/src/layout/dot/position.ts +194 -0
- package/src/layout/dot/rank-dot2.ts +528 -0
- package/src/layout/dot/rank.ts +547 -0
- package/src/layout/dot/sameport.ts +278 -0
- package/src/layout/dot/self-loop.ts +147 -0
- package/src/layout/dot/splines-clone.ts +121 -0
- package/src/layout/dot/splines-flat-labeled.ts +408 -0
- package/src/layout/dot/splines-flat-multi.ts +188 -0
- package/src/layout/dot/splines-flat.ts +598 -0
- package/src/layout/dot/splines-groups.ts +190 -0
- package/src/layout/dot/splines-label.ts +432 -0
- package/src/layout/dot/splines-route-type.ts +44 -0
- package/src/layout/dot/splines-route.ts +478 -0
- package/src/layout/dot/splines.ts +538 -0
- package/src/layout/dot/straight-edges.ts +332 -0
- package/src/layout/fdp/cluster-edges.ts +0 -0
- package/src/layout/fdp/comp.ts +160 -0
- package/src/layout/fdp/derive.ts +272 -0
- package/src/layout/fdp/fdp-model.ts +238 -0
- package/src/layout/fdp/grid.ts +77 -0
- package/src/layout/fdp/index.ts +113 -0
- package/src/layout/fdp/init.ts +116 -0
- package/src/layout/fdp/layout.ts +485 -0
- package/src/layout/fdp/normalize.ts +100 -0
- package/src/layout/fdp/ports.ts +161 -0
- package/src/layout/fdp/tlayout-init.ts +230 -0
- package/src/layout/fdp/tlayout-parms.ts +234 -0
- package/src/layout/fdp/tlayout.ts +317 -0
- package/src/layout/fdp/xlayout.ts +350 -0
- package/src/layout/neato/bfs.ts +131 -0
- package/src/layout/neato/cdt-surface.ts +693 -0
- package/src/layout/neato/conjgrad.ts +159 -0
- package/src/layout/neato/delaunay.ts +259 -0
- package/src/layout/neato/dijkstra.ts +296 -0
- package/src/layout/neato/fdp-adjust.ts +124 -0
- package/src/layout/neato/index.ts +310 -0
- package/src/layout/neato/init.ts +505 -0
- package/src/layout/neato/legal.ts +316 -0
- package/src/layout/neato/matrix-ops.ts +112 -0
- package/src/layout/neato/multispline-router.ts +417 -0
- package/src/layout/neato/multispline.ts +427 -0
- package/src/layout/neato/overlap-prism.ts +503 -0
- package/src/layout/neato/overlap.ts +158 -0
- package/src/layout/neato/sc-adjust.ts +206 -0
- package/src/layout/neato/sep-factor.ts +118 -0
- package/src/layout/neato/set-aspect.ts +178 -0
- package/src/layout/neato/sgd.ts +461 -0
- package/src/layout/neato/splines.ts +1014 -0
- package/src/layout/neato/stress-kernel.ts +362 -0
- package/src/layout/neato/stress.ts +420 -0
- package/src/layout/osage/index.ts +548 -0
- package/src/layout/osage/layout.ts +254 -0
- package/src/layout/osage/types.ts +31 -0
- package/src/layout/pack/array-pack.ts +254 -0
- package/src/layout/pack/index.ts +570 -0
- package/src/layout/pack/poly-pack.ts +266 -0
- package/src/layout/pack/poly-place.ts +426 -0
- package/src/layout/pack/spiral-search.ts +106 -0
- package/src/layout/pack/test-helpers.ts +46 -0
- package/src/layout/pack/types.ts +85 -0
- package/src/layout/patchwork/index.ts +441 -0
- package/src/layout/patchwork/tree-map.ts +183 -0
- package/src/layout/patchwork/tree-node.ts +120 -0
- package/src/layout/sfdp/index.ts +231 -0
- package/src/layout/sfdp/init.ts +224 -0
- package/src/layout/sfdp/multilevel.ts +262 -0
- package/src/layout/sfdp/quadtree.ts +267 -0
- package/src/layout/sfdp/sparse-matrix-multiply.ts +160 -0
- package/src/layout/sfdp/sparse-matrix.ts +367 -0
- package/src/layout/sfdp/sparse-solve.ts +122 -0
- package/src/layout/sfdp/spring-driver.ts +209 -0
- package/src/layout/sfdp/spring-electrical.ts +431 -0
- package/src/layout/twopi/circle.ts +339 -0
- package/src/layout/twopi/index.ts +78 -0
- package/src/layout/twopi/init.ts +174 -0
- package/src/layout/twopi/pipeline.ts +98 -0
- package/src/layout/twopi/twopi-test-helpers.ts +44 -0
- package/src/model/algData.ts +194 -0
- package/src/model/cgraph-ops.ts +175 -0
- package/src/model/edge.ts +104 -0
- package/src/model/edgeInfo.ts +431 -0
- package/src/model/geom.ts +204 -0
- package/src/model/graph.ts +172 -0
- package/src/model/graphInfo.ts +528 -0
- package/src/model/index.ts +10 -0
- package/src/model/layoutParams.ts +127 -0
- package/src/model/node.ts +138 -0
- package/src/model/nodeInfo.ts +424 -0
- package/src/model/rankEntry.ts +95 -0
- package/src/ortho/chan-dict.ts +236 -0
- package/src/ortho/fpq.ts +149 -0
- package/src/ortho/index.ts +206 -0
- package/src/ortho/maze-channels.ts +196 -0
- package/src/ortho/maze.ts +311 -0
- package/src/ortho/ortho-parallel.ts +254 -0
- package/src/ortho/ortho-route.ts +349 -0
- package/src/ortho/partition.ts +303 -0
- package/src/ortho/rawgraph.ts +119 -0
- package/src/ortho/sgraph.ts +283 -0
- package/src/ortho/trap-query.ts +174 -0
- package/src/ortho/trap-segment.ts +303 -0
- package/src/ortho/trap-types.ts +171 -0
- package/src/ortho/trap-update.ts +89 -0
- package/src/ortho/trapezoid.ts +120 -0
- package/src/ortho/types.ts +286 -0
- package/src/parser/__fixtures__/directed.dot +10 -0
- package/src/parser/__fixtures__/simple.dot +7 -0
- package/src/parser/__fixtures__/subgraph.dot +17 -0
- package/src/parser/ast.ts +64 -0
- package/src/parser/builder.ts +401 -0
- package/src/parser/dot.d.ts +208 -0
- package/src/parser/dot.js +3321 -0
- package/src/parser/dot.pegjs +263 -0
- package/src/parser/index.ts +353 -0
- package/src/pathplan/index.ts +9 -0
- package/src/pathplan/route.ts +284 -0
- package/src/pathplan/shortest.ts +268 -0
- package/src/pathplan/solvers.ts +65 -0
- package/src/pathplan/triang.ts +221 -0
- package/src/pathplan/types.ts +16 -0
- package/src/pathplan/visibility.ts +170 -0
- package/src/pathplan/vispath.ts +118 -0
- package/src/rbtree/index.ts +418 -0
- package/src/render/color-resolve.ts +171 -0
- package/src/render/dot.ts +1514 -0
- package/src/render/index.ts +29 -0
- package/src/render/json.ts +734 -0
- package/src/render/map-test-helpers.ts +61 -0
- package/src/render/map.ts +528 -0
- package/src/render/public.ts +131 -0
- package/src/render/svg-arrow-ops.ts +113 -0
- package/src/render/svg-cluster.ts +24 -0
- package/src/render/svg-edge-ortho-radius.ts +228 -0
- package/src/render/svg-edge-split.ts +180 -0
- package/src/render/svg-gradient.ts +185 -0
- package/src/render/svg-graph.ts +415 -0
- package/src/render/svg-helpers.ts +623 -0
- package/src/render/svg-id.ts +76 -0
- package/src/render/svg-multicolor.ts +313 -0
- package/src/render/svg-parallel-edge.ts +123 -0
- package/src/render/svg-tapered-edge.ts +56 -0
- package/src/render/svg.ts +307 -0
- package/src/render/xdot-public.ts +164 -0
- package/src/render/xml-escape.ts +56 -0
- package/src/util/agxbuf.ts +138 -0
- package/src/util/bsd-qsort.ts +251 -0
- package/src/util/index.ts +25 -0
- package/src/util/list.ts +122 -0
- package/src/util/math.ts +104 -0
- package/src/util/mt19937.ts +143 -0
- package/src/util/printf-round.ts +163 -0
- package/src/util/xml.ts +184 -0
- package/src/vpsc/Block.ts +375 -0
- package/src/vpsc/Blocks.ts +164 -0
- package/src/vpsc/Constraint.ts +94 -0
- package/src/vpsc/HeapUtils.ts +88 -0
- package/src/vpsc/Solver.ts +274 -0
- package/src/vpsc/SweepLine.ts +214 -0
- package/src/vpsc/Variable.ts +54 -0
- package/src/vpsc/index.ts +122 -0
- package/src/vpsc/sweepTypes.ts +31 -0
- package/src/xdot/index.ts +7 -0
- package/src/xdot/lex.ts +151 -0
- package/src/xdot/misc.ts +226 -0
- package/src/xdot/parse.ts +349 -0
- 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
|
+
}
|