@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,190 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Edge-group formation and dispatch for the dot_splines_ routing loop —
|
|
5
|
+
* C's inner group loop (groupSize) and the per-group router selection.
|
|
6
|
+
*
|
|
7
|
+
* @see lib/dotgen/dotsplines.c:dot_splines_ (343-419)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { Graph } from '../../model/graph.js';
|
|
11
|
+
import type { Edge } from '../../model/edge.js';
|
|
12
|
+
import type { TextlabelT } from '../../common/types.js';
|
|
13
|
+
import {
|
|
14
|
+
getMainEdge, resolveOrigEdge, portcmp, gatePorts, edgeTreeIndex, nodeRankOf,
|
|
15
|
+
swapEndsP, swapEdgeSpline, EDGETYPE_CURVED, EDGETYPEMASK, FLATEDGE, MAINGRAPH,
|
|
16
|
+
} from './splines.js';
|
|
17
|
+
import { routeLoneEdge } from './edge-route.js';
|
|
18
|
+
import { routeEntryRun } from './edge-route-chain.js';
|
|
19
|
+
import { routeSelfEdgeGroup, buildDotSinfo } from './self-loop.js';
|
|
20
|
+
import { updateBB } from './splines-label.js';
|
|
21
|
+
import { routeParallelEdgeGroup } from './splines-route.js';
|
|
22
|
+
import { makeStraightEdges } from './straight-edges.js';
|
|
23
|
+
|
|
24
|
+
/** Per-loop routing context: separations, edge type, per-run orig record. */
|
|
25
|
+
export interface GroupRouteCtx {
|
|
26
|
+
multisep: number;
|
|
27
|
+
et: number;
|
|
28
|
+
/** Originals that received per-run bezier appends (normalized post-loop). */
|
|
29
|
+
runOrigs: Set<Edge>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Count how many consecutive entries in `edges` starting at `ind` join one
|
|
34
|
+
* routing group — C's inner group loop verbatim: break on a different main
|
|
35
|
+
* edge; flat ED_adjacent groups take everything at once; otherwise break on a
|
|
36
|
+
* tail/head portcmp mismatch (gate edges viewed forward), on a FLAT label
|
|
37
|
+
* change, or when the candidate carries MAINGRAPH ("Aha! -C is on"): under
|
|
38
|
+
* concentrate, consecutive same-main REGULAREDGE entries are merge-bounded
|
|
39
|
+
* chain runs that must each route their own make_regular_edge call, while
|
|
40
|
+
* AUXGRAPH copies (parallel multi-edges from ND_other) still group.
|
|
41
|
+
* @see lib/dotgen/dotsplines.c:dot_splines_ (344-376)
|
|
42
|
+
*/
|
|
43
|
+
function groupSize(edges: Edge[], ind: number): number {
|
|
44
|
+
const e0 = edges[ind];
|
|
45
|
+
const le0 = getMainEdge(e0);
|
|
46
|
+
const [eaT, eaH] = gatePorts(e0, le0);
|
|
47
|
+
const e0flat = (edgeTreeIndex(e0) & EDGETYPEMASK) === FLATEDGE;
|
|
48
|
+
let cnt = 1;
|
|
49
|
+
while (ind + cnt < edges.length) {
|
|
50
|
+
const e1 = edges[ind + cnt];
|
|
51
|
+
const le1 = getMainEdge(e1);
|
|
52
|
+
if (le1 !== le0) break;
|
|
53
|
+
if ((e0.info.adjacent ?? 0) !== 0) { cnt++; continue; } // all flat adjacent at once
|
|
54
|
+
const [ebT, ebH] = gatePorts(e1, le1);
|
|
55
|
+
if (portcmp(eaT, ebT) !== 0) break;
|
|
56
|
+
if (portcmp(eaH, ebH) !== 0) break;
|
|
57
|
+
if (e0flat && e0.info.label !== e1.info.label) break;
|
|
58
|
+
if ((edgeTreeIndex(e1) & MAINGRAPH) !== 0) break; // Aha! -C is on
|
|
59
|
+
cnt++;
|
|
60
|
+
}
|
|
61
|
+
return cnt;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Original-edge creation seq (resolve virtuals) — restores C's edgecmp order. */
|
|
65
|
+
function origSeq(e: Edge): number { return resolveOrigEdge(e).seq; }
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Collapse a main-edge group to one representative per distinct original edge.
|
|
69
|
+
* The opposing `a->b`/`b->a` case collects three entries but two distinct
|
|
70
|
+
* originals; dedup by `resolveOrigEdge` yields one per original (parallels
|
|
71
|
+
* untouched). Pushes the RESOLVED original `o`, not the raw group member `e`:
|
|
72
|
+
* a raw member can be a swapped internal proxy (e.g. a same-rank flat edge
|
|
73
|
+
* whose canonical orientation is tail/head-swapped) whose endpoints don't
|
|
74
|
+
* match the edge actually rendered — routing against the proxy leaves the
|
|
75
|
+
* real edge's geometry unset. C's `edges` list carries no such proxy object
|
|
76
|
+
* (its group members are already the real/virtual edges), so this recovers
|
|
77
|
+
* C's outcome for the TS-specific proxy representation. Distinct originals
|
|
78
|
+
* (genuine parallels, or a multi-rank edge's own per-hop virtual segments)
|
|
79
|
+
* each resolve to their OWN root, so this dedup never merges or renames them.
|
|
80
|
+
* @see dotsplines.c:make_regular_edge (one clip_and_install per orig)
|
|
81
|
+
*/
|
|
82
|
+
export function dedupByOrig(group: Edge[]): Edge[] {
|
|
83
|
+
const seen = new Set<Edge>();
|
|
84
|
+
const out: Edge[] = [];
|
|
85
|
+
for (const e of group) {
|
|
86
|
+
const o = resolveOrigEdge(e);
|
|
87
|
+
if (seen.has(o)) continue;
|
|
88
|
+
seen.add(o);
|
|
89
|
+
out.push(o);
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Dispatch one edgecmp group: self-loop → routeSelfEdgeGroup; cross-rank cnt>1 →
|
|
96
|
+
* routeParallelEdgeGroup (Multisep offsets); cross-rank cnt==1 → per-run or
|
|
97
|
+
* whole-chain lone routing in-place (C order); same-rank flat → left for the
|
|
98
|
+
* routeDotEdges sweep.
|
|
99
|
+
* @see lib/dotgen/dotsplines.c:367-419
|
|
100
|
+
*/
|
|
101
|
+
function dispatchEdgeGroup(g: Graph, group: Edge[], ctx: GroupRouteCtx): void {
|
|
102
|
+
const e0 = group[0];
|
|
103
|
+
if (e0.tail === e0.head) {
|
|
104
|
+
routeSelfEdgeGroup(g, group, group.length, ctx.multisep, buildDotSinfo());
|
|
105
|
+
// Grow the graph bbox to include each labeled self-loop's label. C does this
|
|
106
|
+
// after makeSelfEdge; it is the ONLY canvas-growth path for left/top loops
|
|
107
|
+
// (right-going loops also reserve label space at ranking time via
|
|
108
|
+
// selfRightSpace, so they grow without it). @see dotsplines.c:405-409
|
|
109
|
+
for (const e of group) {
|
|
110
|
+
const l = e.info.label as TextlabelT | undefined;
|
|
111
|
+
if (l) updateBB(g, l);
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (nodeRankOf(e0.tail) === nodeRankOf(e0.head)) return;
|
|
116
|
+
const uniq = dedupByOrig(group);
|
|
117
|
+
// Lone edge: route HERE at its edgecmp position (interleaved with groups), as C
|
|
118
|
+
// does, so it reads recover_slack-moved vnodes correctly. @see root-cause.md
|
|
119
|
+
if (uniq.length <= 1) {
|
|
120
|
+
// Concentrate merge-bounded partial run (either end at a splineMerge node):
|
|
121
|
+
// route ONLY this entry's run and append its bezier on the orig — every
|
|
122
|
+
// such run is its own cnt=1 group (groupSize's MAINGRAPH break), and the
|
|
123
|
+
// orig's spline accumulates one bezier per run in edgecmp order, exactly
|
|
124
|
+
// C's per-entry make_regular_edge + clip_and_install. The orig is recorded
|
|
125
|
+
// for the post-loop swap (C normalizes the assembled spline once, at the
|
|
126
|
+
// end). @see lib/dotgen/dotsplines.c:dot_splines_ (group loop)
|
|
127
|
+
const runOrig = routeEntryRun(g, e0);
|
|
128
|
+
if (runOrig !== null) {
|
|
129
|
+
ctx.runOrigs.add(runOrig);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const lone = resolveOrigEdge(uniq[0]);
|
|
133
|
+
// Plain chains (no interior splineMerge boundary) keep the whole-chain
|
|
134
|
+
// routers. @see dotsplines.c:make_regular_edge (spline_merge)
|
|
135
|
+
routeLoneEdge(lone, g);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Lane offsets follow the edgecmp collected order — C passes the sorted list
|
|
139
|
+
// slice straight into make_regular_edge with NO re-sort, so the MAINGRAPH
|
|
140
|
+
// forward rep gets lane 0 (interior x -dx) and AUXGRAPH ND_other entries
|
|
141
|
+
// (including an opposing 2-cycle's reversed member) follow, regardless of
|
|
142
|
+
// original creation seq. @see dotsplines.c:419, make_regular_edge:1885-1907
|
|
143
|
+
routeParallelEdgeGroup(g, uniq, ctx.multisep);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Route one curved group via makeStraightEdges. C routes the whole same-endpoint
|
|
148
|
+
* group at once — parallels AND opposing edges (`a->b`/`b->a`) together (a 2-cycle
|
|
149
|
+
* is one cnt=2 group, ports (0,0); the visible separation is perp-spread clipped
|
|
150
|
+
* to the node). Dedup the TS virtual duplicates to distinct originals; sort by
|
|
151
|
+
* creation seq so index→perp-offset matches C (first → +perp); makeStraightEdges
|
|
152
|
+
* reverses the opposing edge's control points via its head==group-head check.
|
|
153
|
+
* @see lib/dotgen/dotsplines.c:381-387, lib/common/routespl.c:1000-1041
|
|
154
|
+
*/
|
|
155
|
+
function routeCurvedGroup(g: Graph, group: Edge[]): void {
|
|
156
|
+
const uniq = dedupByOrig(group);
|
|
157
|
+
uniq.sort((a, b) => origSeq(a) - origSeq(b));
|
|
158
|
+
makeStraightEdges(g, uniq, uniq.length, EDGETYPE_CURVED, buildDotSinfo());
|
|
159
|
+
// Reversed back edges live in ND_other (edgeNormalize skips them); swap here.
|
|
160
|
+
for (const e of uniq) {
|
|
161
|
+
if (swapEndsP(e)) swapEdgeSpline(e);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Route one parallel-edge group from the sorted edge list.
|
|
167
|
+
* Returns the number of edges consumed (cnt). For `splines=curved` the group is
|
|
168
|
+
* routed via `makeStraightEdges` instead of the normal per-group router.
|
|
169
|
+
* @see lib/dotgen/dotsplines.c:343-419
|
|
170
|
+
*/
|
|
171
|
+
function routeEdgeGroup(g: Graph, edges: Edge[], ind: number, ctx: GroupRouteCtx): number {
|
|
172
|
+
const cnt = groupSize(edges, ind);
|
|
173
|
+
if (ctx.et === EDGETYPE_CURVED) {
|
|
174
|
+
routeCurvedGroup(g, edges.slice(ind, ind + cnt));
|
|
175
|
+
return cnt;
|
|
176
|
+
}
|
|
177
|
+
dispatchEdgeGroup(g, edges.slice(ind, ind + cnt), ctx);
|
|
178
|
+
return cnt;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Run the whole group-routing loop over the sorted edge list; returns the set
|
|
183
|
+
* of originals that received per-run bezier appends, for the caller's
|
|
184
|
+
* post-loop normalize pass. @see lib/dotgen/dotsplines.c:dot_splines_ (343-419)
|
|
185
|
+
*/
|
|
186
|
+
export function routeEdgeGroups(g: Graph, edges: Edge[], multisep: number, et: number): Set<Edge> {
|
|
187
|
+
const ctx: GroupRouteCtx = { multisep, et, runOrigs: new Set<Edge>() };
|
|
188
|
+
for (let l = 0; l < edges.length;) l += routeEdgeGroup(g, edges, l, ctx);
|
|
189
|
+
return ctx.runOrigs;
|
|
190
|
+
}
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Label placement for edge virtual nodes and port labels.
|
|
5
|
+
*
|
|
6
|
+
* @see lib/dotgen/dotsplines.c:place_vnlabel, setEdgeLabelPos
|
|
7
|
+
* @see lib/common/splines.c:place_portlabel (lines 1316-1360)
|
|
8
|
+
* @see lib/dotgen/dotsplines.c:440-458 (port-label placement loop)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Graph } from '../../model/graph.js';
|
|
12
|
+
import type { Node } from '../../model/node.js';
|
|
13
|
+
import type { Edge } from '../../model/edge.js';
|
|
14
|
+
import type { TextlabelT } from '../../common/types.js';
|
|
15
|
+
import { VIRTUAL } from './fastgr.js';
|
|
16
|
+
import { IGNORED } from './rank.js';
|
|
17
|
+
import { lateDouble } from '../../common/nodeinit.js';
|
|
18
|
+
import { nodesInSeq } from './decomp.js';
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// TextLabel interface (minimal — full type deferred to Batch 5b)
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
/** Minimal label shape sufficient for placement. */
|
|
25
|
+
export interface TextLabel {
|
|
26
|
+
pos: { x: number; y: number };
|
|
27
|
+
dimen: { x: number; y: number };
|
|
28
|
+
set: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Helpers
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
/** Cast an unknown label to TextLabel if it has the required shape. */
|
|
36
|
+
export function asTextLabel(label: unknown): TextLabel | undefined {
|
|
37
|
+
const l = label as Record<string, unknown>;
|
|
38
|
+
if (l && typeof l['pos'] === 'object' && typeof l['dimen'] === 'object') {
|
|
39
|
+
return l as unknown as TextLabel;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Walk to_orig until edge_type is NORMAL (0). */
|
|
45
|
+
export function findNormalOutEdge(first: Edge): Edge | undefined {
|
|
46
|
+
let e: Edge | undefined = first;
|
|
47
|
+
while (e && (e.info.edge_type ?? 0) !== 0) e = e.info.to_orig;
|
|
48
|
+
return e;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Compute label x-position from node coord, dimen, and flip flag. */
|
|
52
|
+
export function labelXPos(n: Node, l: TextLabel): number {
|
|
53
|
+
const flip = !!(n.root?.info.flip);
|
|
54
|
+
const width = flip ? l.dimen.y : l.dimen.x;
|
|
55
|
+
return n.info.coord.x + width / 2.0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// place_vnlabel
|
|
60
|
+
// @see lib/dotgen/dotsplines.c:place_vnlabel
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Assign position of an edge label from its virtual node.
|
|
65
|
+
* @see lib/dotgen/dotsplines.c:place_vnlabel
|
|
66
|
+
*/
|
|
67
|
+
export function placeVnlabel(n: Node): void {
|
|
68
|
+
if ((n.info.in?.size ?? 0) === 0) return; // skip flat edge labels
|
|
69
|
+
const first = n.info.out?.list[0];
|
|
70
|
+
if (!first) return;
|
|
71
|
+
const e = findNormalOutEdge(first);
|
|
72
|
+
if (!e) return;
|
|
73
|
+
const l = asTextLabel(e.info.label);
|
|
74
|
+
if (!l) return;
|
|
75
|
+
l.pos.x = labelXPos(n, l);
|
|
76
|
+
l.pos.y = n.info.coord.y;
|
|
77
|
+
l.set = true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// setEdgeLabelPos
|
|
82
|
+
// @see lib/dotgen/dotsplines.c:setEdgeLabelPos
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
|
|
85
|
+
/** Set label pos from posAlg edge for virtual label nodes. */
|
|
86
|
+
export function setAlgLabelPos(n: Node): void {
|
|
87
|
+
const fe = n.info.posAlg;
|
|
88
|
+
if (!fe) return;
|
|
89
|
+
const l = asTextLabel(fe.info.label);
|
|
90
|
+
if (!l) return;
|
|
91
|
+
l.pos = { x: n.info.coord.x, y: n.info.coord.y };
|
|
92
|
+
l.set = true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Set edge label position information for regular and non-adjacent flat edges.
|
|
97
|
+
* @see lib/dotgen/dotsplines.c:setEdgeLabelPos
|
|
98
|
+
*/
|
|
99
|
+
export function setEdgeLabelPos(g: Graph): void {
|
|
100
|
+
for (let n: Node | undefined = g.info.nlist; n; n = n.info.next) {
|
|
101
|
+
if ((n.info.node_type ?? 0) !== VIRTUAL) continue;
|
|
102
|
+
// C tracks l from the posAlg edge label or the regular vnode label, then
|
|
103
|
+
// updateBB(g, l). @see lib/dotgen/dotsplines.c:205-216
|
|
104
|
+
let l: TextlabelT | undefined;
|
|
105
|
+
if (n.info.posAlg) {
|
|
106
|
+
setAlgLabelPos(n);
|
|
107
|
+
l = n.info.posAlg.info.label as TextlabelT | undefined;
|
|
108
|
+
} else if (n.info.label) {
|
|
109
|
+
placeVnlabel(n);
|
|
110
|
+
l = n.info.label as TextlabelT | undefined;
|
|
111
|
+
}
|
|
112
|
+
if (l) updateBB(g, l);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Port-label constants
|
|
118
|
+
// @see lib/common/const.h:PORT_LABEL_DISTANCE / PORT_LABEL_ANGLE
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
|
|
121
|
+
/** Default port-label distance in points. @see lib/common/const.h:PORT_LABEL_DISTANCE */
|
|
122
|
+
export const PORT_LABEL_DISTANCE = 10;
|
|
123
|
+
|
|
124
|
+
/** Default port-label angle in degrees (CW negative). @see lib/common/const.h:PORT_LABEL_ANGLE */
|
|
125
|
+
export const PORT_LABEL_ANGLE = -25;
|
|
126
|
+
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// cubicBezierAt — de Casteljau at parameter t (Bezier() in utils.c)
|
|
129
|
+
// @see lib/common/utils.c:175-203
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Evaluate a cubic Bezier curve at parameter t using the de Casteljau
|
|
134
|
+
* triangle computation. Requires pts[0..3]. No Left/Right subdivision
|
|
135
|
+
* output needed here, so they are omitted.
|
|
136
|
+
*
|
|
137
|
+
* @see lib/common/utils.c:Bezier
|
|
138
|
+
*/
|
|
139
|
+
function cubicBezierAt(pts: readonly { x: number; y: number }[], t: number): { x: number; y: number } {
|
|
140
|
+
// Triangle computation (degree = 3)
|
|
141
|
+
const p0 = pts[0], p1 = pts[1], p2 = pts[2], p3 = pts[3];
|
|
142
|
+
const mt = 1.0 - t;
|
|
143
|
+
// Level 1
|
|
144
|
+
const q0 = { x: mt * p0.x + t * p1.x, y: mt * p0.y + t * p1.y };
|
|
145
|
+
const q1 = { x: mt * p1.x + t * p2.x, y: mt * p1.y + t * p2.y };
|
|
146
|
+
const q2 = { x: mt * p2.x + t * p3.x, y: mt * p2.y + t * p3.y };
|
|
147
|
+
// Level 2
|
|
148
|
+
const r0 = { x: mt * q0.x + t * q1.x, y: mt * q0.y + t * q1.y };
|
|
149
|
+
const r1 = { x: mt * q1.x + t * q2.x, y: mt * q1.y + t * q2.y };
|
|
150
|
+
// Level 3
|
|
151
|
+
return { x: mt * r0.x + t * r1.x, y: mt * r0.y + t * r1.y };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Bezier endpoint extraction helpers
|
|
156
|
+
// @see lib/common/splines.c:place_portlabel:1331-1351
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
|
|
159
|
+
type BezierSeg = { list: { x: number; y: number }[]; size: number; sflag: number; eflag: number; sp: { x: number; y: number }; ep: { x: number; y: number } };
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Extract (pe = endpoint, pf = near-endpoint) for the tail end of the spline.
|
|
163
|
+
* pe is the exact endpoint; pf is a point 10% along the curve toward the head,
|
|
164
|
+
* used to compute the tangent direction for label placement.
|
|
165
|
+
*
|
|
166
|
+
* @see lib/common/splines.c:place_portlabel:1331-1339
|
|
167
|
+
*/
|
|
168
|
+
function tailEndpoints(bez: BezierSeg): { pe: { x: number; y: number }; pf: { x: number; y: number } } {
|
|
169
|
+
if (bez.sflag) {
|
|
170
|
+
return { pe: bez.sp, pf: bez.list[0] };
|
|
171
|
+
}
|
|
172
|
+
const pe = bez.list[0];
|
|
173
|
+
const pf = cubicBezierAt(bez.list, 0.1);
|
|
174
|
+
return { pe, pf };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Extract (pe = endpoint, pf = near-endpoint) for the head end of the spline.
|
|
179
|
+
* pe is the exact endpoint; pf is a point 90% along the curve from the tail,
|
|
180
|
+
* used to compute the tangent direction for label placement.
|
|
181
|
+
*
|
|
182
|
+
* C indexes with `bez->size`, NOT the allocation length: arrow clipping
|
|
183
|
+
* (`arrow_clip`) shrinks `size` while the backing array keeps stale trailing
|
|
184
|
+
* points, so `list.length` can exceed the live point count.
|
|
185
|
+
*
|
|
186
|
+
* @see lib/common/splines.c:place_portlabel:1341-1351
|
|
187
|
+
*/
|
|
188
|
+
function headEndpoints(bez: BezierSeg): { pe: { x: number; y: number }; pf: { x: number; y: number } } {
|
|
189
|
+
if (bez.eflag) {
|
|
190
|
+
return { pe: bez.ep, pf: bez.list[bez.size - 1] };
|
|
191
|
+
}
|
|
192
|
+
const pe = bez.list[bez.size - 1];
|
|
193
|
+
const last4 = bez.list.slice(bez.size - 4, bez.size);
|
|
194
|
+
const pf = cubicBezierAt(last4, 0.9);
|
|
195
|
+
return { pe, pf };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// place_portlabel
|
|
200
|
+
// @see lib/common/splines.c:1316-1360
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Place the head or tail port label for edge e.
|
|
205
|
+
*
|
|
206
|
+
* Returns true on success, false when:
|
|
207
|
+
* - edge_type is IGNORED, or
|
|
208
|
+
* - neither labelangle nor labeldistance attrs are set (labels are then
|
|
209
|
+
* treated as external xlabel-style labels, not placed here), or
|
|
210
|
+
* - the spline is not yet computed.
|
|
211
|
+
*
|
|
212
|
+
* NOTE: The C code only places port labels when at least one of
|
|
213
|
+
* E_labelangle / E_labeldistance has a non-empty value. When both are
|
|
214
|
+
* absent (the common case), it returns 0 and the labels remain unpositioned.
|
|
215
|
+
* In the C pipeline the renderer then falls back to xlabel-style placement.
|
|
216
|
+
* For the quarantine reference, the labels *are* placed — meaning one of
|
|
217
|
+
* the two attrs has an implicit value in the C attr-symbol table. We
|
|
218
|
+
* replicate the C condition faithfully: check whether the edge's own
|
|
219
|
+
* attrs contain a non-empty value for either key.
|
|
220
|
+
*
|
|
221
|
+
* @see lib/common/splines.c:place_portlabel
|
|
222
|
+
*/
|
|
223
|
+
export function placePortlabel(e: Edge, headP: boolean): boolean {
|
|
224
|
+
if (edgeTypeIgnored(e)) return false;
|
|
225
|
+
if (noAngleAttrs(e)) return false;
|
|
226
|
+
if (labelMissing(e, headP)) return false;
|
|
227
|
+
if (splineMissing(e)) return false;
|
|
228
|
+
return applyPortlabelPos(e, headP);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** True when edge_type is IGNORED (0 when unset counts as not-IGNORED). */
|
|
232
|
+
function edgeTypeIgnored(e: Edge): boolean {
|
|
233
|
+
const et = e.info.edge_type;
|
|
234
|
+
if (et === undefined) return false;
|
|
235
|
+
return et === IGNORED;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** True when neither labelangle nor labeldistance has a non-empty value. */
|
|
239
|
+
function noAngleAttrs(e: Edge): boolean {
|
|
240
|
+
const a = e.attrs.get('labelangle');
|
|
241
|
+
const d = e.attrs.get('labeldistance');
|
|
242
|
+
if (a !== undefined && a !== '') return false;
|
|
243
|
+
if (d !== undefined && d !== '') return false;
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** True when the relevant port label is absent. */
|
|
248
|
+
function labelMissing(e: Edge, headP: boolean): boolean {
|
|
249
|
+
if (headP) return e.info.head_label === undefined;
|
|
250
|
+
return e.info.tail_label === undefined;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** True when no computed spline exists yet. */
|
|
254
|
+
function splineMissing(e: Edge): boolean {
|
|
255
|
+
if (e.info.spl === undefined) return true;
|
|
256
|
+
return e.info.spl.list.length === 0;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Compute and write position for one port label; returns true.
|
|
261
|
+
* Pre-condition: guards passed (label exists, spline exists).
|
|
262
|
+
* @see lib/common/splines.c:place_portlabel:1353-1359
|
|
263
|
+
*/
|
|
264
|
+
function applyPortlabelPos(e: Edge, headP: boolean): boolean {
|
|
265
|
+
const spl = e.info.spl!;
|
|
266
|
+
// C: &spl->list[spl->size - 1] — index by the live size, not list.length.
|
|
267
|
+
const ends = headP
|
|
268
|
+
? headEndpoints(spl.list[spl.size - 1])
|
|
269
|
+
: tailEndpoints(spl.list[0]);
|
|
270
|
+
const l = headP ? e.info.head_label! : e.info.tail_label!;
|
|
271
|
+
const angleStr = e.attrs.get('labelangle') ?? '';
|
|
272
|
+
const distanceStr = e.attrs.get('labeldistance') ?? '';
|
|
273
|
+
writePortlabelPos(l, ends.pe, ends.pf, angleStr, distanceStr);
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Write pos onto label given endpoint pair and attr strings.
|
|
279
|
+
* @see lib/common/splines.c:place_portlabel:1353-1359
|
|
280
|
+
*/
|
|
281
|
+
function writePortlabelPos(
|
|
282
|
+
l: TextlabelT,
|
|
283
|
+
pe: { x: number; y: number },
|
|
284
|
+
pf: { x: number; y: number },
|
|
285
|
+
angleStr: string,
|
|
286
|
+
distanceStr: string,
|
|
287
|
+
): void {
|
|
288
|
+
const angleDeg = lateDouble(angleStr, PORT_LABEL_ANGLE, -180.0);
|
|
289
|
+
const angle = Math.atan2(pf.y - pe.y, pf.x - pe.x) + (Math.PI / 180) * angleDeg;
|
|
290
|
+
const distMult = lateDouble(distanceStr || undefined, 1.0, 0.0);
|
|
291
|
+
const dist = PORT_LABEL_DISTANCE * distMult;
|
|
292
|
+
l.pos.x = pe.x + dist * Math.cos(angle);
|
|
293
|
+
l.pos.y = pe.y + dist * Math.sin(angle);
|
|
294
|
+
l.set = true;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
// updateBB — extend graph bb to include label
|
|
299
|
+
// @see lib/dotgen/dotsplines.c:446 (updateBB call)
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
|
|
302
|
+
/** Expand g.info.bb to include the label's bounding box. */
|
|
303
|
+
export function updateBB(g: Graph, l: TextlabelT): void {
|
|
304
|
+
const bb = g.info.bb;
|
|
305
|
+
// C's updateBB -> addLabelBB(bb, lp, GD_flip(g)) swaps the label's dimen axes
|
|
306
|
+
// under flip (rankdir=LR/RL): the stored dimen is unflipped, so in flipped
|
|
307
|
+
// coordinate space width=dimen.y and height=dimen.x. Labels are stored
|
|
308
|
+
// unflipped here too (every other consumer swaps via `flip ? dimen.y : x`),
|
|
309
|
+
// so updateBB must swap as well. @see lib/common/utils.c:569 addLabelBB
|
|
310
|
+
const flip = g.info.flip === true;
|
|
311
|
+
const hw = (flip ? l.dimen.y : l.dimen.x) / 2;
|
|
312
|
+
const hh = (flip ? l.dimen.x : l.dimen.y) / 2;
|
|
313
|
+
if (l.pos.x - hw < bb.ll.x) bb.ll.x = l.pos.x - hw;
|
|
314
|
+
if (l.pos.y - hh < bb.ll.y) bb.ll.y = l.pos.y - hh;
|
|
315
|
+
if (l.pos.x + hw > bb.ur.x) bb.ur.x = l.pos.x + hw;
|
|
316
|
+
if (l.pos.y + hh > bb.ur.y) bb.ur.y = l.pos.y + hh;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// placeRegularEdgeLabels — post-routing label placement loop
|
|
321
|
+
// @see lib/dotgen/dotsplines.c:422-430
|
|
322
|
+
// ---------------------------------------------------------------------------
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* After edge routing completes, place regular edge labels from virtual nodes
|
|
326
|
+
* and expand the graph bounding box to include each label.
|
|
327
|
+
*
|
|
328
|
+
* Called once per graph after the parallel-edge routing loop and before
|
|
329
|
+
* edge_normalize. Mirrors the C post-routing place_vnlabel + updateBB loop
|
|
330
|
+
* at dotsplines.c:422-430. Flat-edge virtual nodes (in.size == 0) are
|
|
331
|
+
* skipped inside placeVnlabel as in C.
|
|
332
|
+
*
|
|
333
|
+
* @see lib/dotgen/dotsplines.c:422-430
|
|
334
|
+
*/
|
|
335
|
+
export function placeRegularEdgeLabels(g: Graph): void {
|
|
336
|
+
for (let n: Node | undefined = g.info.nlist; n; n = n.info.next) {
|
|
337
|
+
if ((n.info.node_type ?? 0) !== VIRTUAL) continue;
|
|
338
|
+
const l = n.info.label as TextlabelT | undefined;
|
|
339
|
+
if (!l) continue;
|
|
340
|
+
placeVnlabel(n);
|
|
341
|
+
if (l.set) updateBB(g, l);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// placePortLabels — the placement loop from dotsplines.c:440-458
|
|
347
|
+
// @see lib/dotgen/dotsplines.c:440-458
|
|
348
|
+
// ---------------------------------------------------------------------------
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Is an edge attribute DECLARED anywhere in the graph? Models C's
|
|
352
|
+
* `E_<attr> = agfindedgeattr(g, "<attr>")` (`input.c:772-778`), which resolves
|
|
353
|
+
* the attribute *declaration* on the **root** — it is graph-global, not
|
|
354
|
+
* per-subgraph.
|
|
355
|
+
*
|
|
356
|
+
* Scoping to the root is load-bearing under `pack`: `dot_position` runs on each
|
|
357
|
+
* projected COMPONENT, and a component holds only its own edges. Scanning `g`
|
|
358
|
+
* would miss a declaration made on an edge in a sibling component, where C's
|
|
359
|
+
* root-scoped `agfindedgeattr` still sees it.
|
|
360
|
+
*
|
|
361
|
+
* @see lib/common/input.c:772 (E_headlabel/E_taillabel/E_labelangle/E_labeldistance)
|
|
362
|
+
*/
|
|
363
|
+
function edgeAttrDeclared(g: Graph, ...names: string[]): boolean {
|
|
364
|
+
const root = g.root;
|
|
365
|
+
for (const name of names) {
|
|
366
|
+
if (root.attrs.has(name)) return true; // `edge [<name>=...]` default
|
|
367
|
+
}
|
|
368
|
+
for (const e of root.edges) {
|
|
369
|
+
for (const name of names) {
|
|
370
|
+
if (e.attrs.has(name)) return true;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Walk all nodes and edges; call placePortlabel for head/tail labels.
|
|
378
|
+
*
|
|
379
|
+
* C's gates are on the attribute DECLARATIONS, not on `GD_has_labels`:
|
|
380
|
+
*
|
|
381
|
+
* if ((E_headlabel || E_taillabel) && (E_labelangle || E_labeldistance)) {
|
|
382
|
+
* for (n = agfstnode(g); ...) {
|
|
383
|
+
* if (E_headlabel) { ...place_portlabel(e, true)... }
|
|
384
|
+
* if (E_taillabel) { ...place_portlabel(e, false)... }
|
|
385
|
+
* }
|
|
386
|
+
* }
|
|
387
|
+
*
|
|
388
|
+
* The port previously gated the two inner branches on
|
|
389
|
+
* `GD_has_labels & HEAD_LABEL/TAIL_LABEL`. That is NOT C, and it broke under
|
|
390
|
+
* `pack`: `has_labels` is OR'd onto the true cgraph root (`common_init_edge`,
|
|
391
|
+
* utils.c:521), so a projected component's own flag is 0 and BOTH branches were
|
|
392
|
+
* skipped — the head/tail labels kept their unplaced default position instead
|
|
393
|
+
* of being offset by labelangle/labeldistance. The per-edge
|
|
394
|
+
* `ED_head_label == NULL` checks inside the loops already do the real filtering,
|
|
395
|
+
* exactly as in C.
|
|
396
|
+
*
|
|
397
|
+
* @see lib/dotgen/dotsplines.c:440-458
|
|
398
|
+
*/
|
|
399
|
+
export function placePortLabels(g: Graph): void {
|
|
400
|
+
if (!edgeAttrDeclared(g, 'headlabel', 'taillabel')) return;
|
|
401
|
+
if (!edgeAttrDeclared(g, 'labelangle', 'labeldistance')) return;
|
|
402
|
+
if (edgeAttrDeclared(g, 'headlabel')) placeHeadLabels(g);
|
|
403
|
+
if (edgeAttrDeclared(g, 'taillabel')) placeTailLabels(g);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Place head port labels for all in-edges of every node.
|
|
408
|
+
* @see lib/dotgen/dotsplines.c:442-447
|
|
409
|
+
*/
|
|
410
|
+
function placeHeadLabels(g: Graph): void {
|
|
411
|
+
for (const n of nodesInSeq(g)) {
|
|
412
|
+
for (const e of g.edges) {
|
|
413
|
+
if (e.head !== n) continue;
|
|
414
|
+
if (e.info.head_label === undefined) continue;
|
|
415
|
+
if (placePortlabel(e, true)) updateBB(g, e.info.head_label);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Place tail port labels for all out-edges of every node.
|
|
422
|
+
* @see lib/dotgen/dotsplines.c:449-455
|
|
423
|
+
*/
|
|
424
|
+
function placeTailLabels(g: Graph): void {
|
|
425
|
+
for (const n of nodesInSeq(g)) {
|
|
426
|
+
for (const e of g.edges) {
|
|
427
|
+
if (e.tail !== n) continue;
|
|
428
|
+
if (e.info.tail_label === undefined) continue;
|
|
429
|
+
if (placePortlabel(e, false)) updateBB(g, e.info.tail_label);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Edge-type dispatch for regular (cross-rank) edge routing.
|
|
5
|
+
*
|
|
6
|
+
* `make_regular_edge` routes the box corridor through `routesplines` for
|
|
7
|
+
* `EDGETYPE_SPLINE` and `routepolylines` otherwise; for `EDGETYPE_LINE` it
|
|
8
|
+
* additionally straightens a polyline of more than 4 points down to a 4-point
|
|
9
|
+
* line (first/last control points only). This module is the single home for
|
|
10
|
+
* that dispatch + straighten, called by every box-corridor emit point.
|
|
11
|
+
*
|
|
12
|
+
* @see lib/dotgen/dotsplines.c:make_regular_edge (1799-1808, 1849-1861)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { Point } from '../../model/geom.js';
|
|
16
|
+
import type { Path } from '../../common/types.js';
|
|
17
|
+
import { routeSplines, routePolylines } from '../../common/splines-routespl.js';
|
|
18
|
+
import { EDGETYPE_SPLINE, EDGETYPE_LINE } from './splines.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Route the box corridor in `P` according to the edge type `et`.
|
|
22
|
+
*
|
|
23
|
+
* - `EDGETYPE_SPLINE` → `routeSplines` (the default; identical to before).
|
|
24
|
+
* - any other type → `routePolylines`.
|
|
25
|
+
* - `EDGETYPE_LINE` with a result of more than 4 points → straighten to the
|
|
26
|
+
* 4-point line `[p0, p0, pLast, pLast]`.
|
|
27
|
+
*
|
|
28
|
+
* Returns the control points, or `null`/empty exactly as the underlying
|
|
29
|
+
* `routeSplines`/`routePolylines` do (the caller treats that as a decline).
|
|
30
|
+
*
|
|
31
|
+
* @see lib/dotgen/dotsplines.c:make_regular_edge
|
|
32
|
+
*/
|
|
33
|
+
export function routeRegularByType(P: Path, et: number): Point[] | null {
|
|
34
|
+
if (et === EDGETYPE_SPLINE) return routeSplines(P);
|
|
35
|
+
const ps = routePolylines(P);
|
|
36
|
+
if (et === EDGETYPE_LINE && ps !== null && ps.length > 4) {
|
|
37
|
+
// Straighten the polyline to a line: keep only the endpoints.
|
|
38
|
+
// C: ps[1]=ps[0]; ps[3]=ps[2]=ps[pn-1]; pn=4.
|
|
39
|
+
const p0 = ps[0];
|
|
40
|
+
const pLast = ps[ps.length - 1];
|
|
41
|
+
return [p0, p0, pLast, pLast];
|
|
42
|
+
}
|
|
43
|
+
return ps;
|
|
44
|
+
}
|