@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,131 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Multi-format public render entry point.
|
|
5
|
+
*
|
|
6
|
+
* Wraps the low-level `gvc/device.ts:render` with context lifecycle
|
|
7
|
+
* management (layout → render → freeLayout) and structured-error handling,
|
|
8
|
+
* mirroring `src/index.ts:renderSvg` exactly.
|
|
9
|
+
*
|
|
10
|
+
* @see lib/gvc/gvc.c:gvRender
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { Graph } from '../model/graph.js';
|
|
14
|
+
import { createDefaultContext } from '../gvc/default-context.js';
|
|
15
|
+
import { render as deviceRender } from '../gvc/device.js';
|
|
16
|
+
import { RenderError } from '../errors.js';
|
|
17
|
+
import type { GvError } from '../errors.js';
|
|
18
|
+
import type { EngineName } from '../gvc/context.js';
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Public types
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Supported output formats. Closed string union matching the built-in
|
|
26
|
+
* renderers registered by `createDefaultContext`.
|
|
27
|
+
*/
|
|
28
|
+
export type OutputFormat =
|
|
29
|
+
| 'svg'
|
|
30
|
+
| 'dot'
|
|
31
|
+
| 'xdot'
|
|
32
|
+
| 'json'
|
|
33
|
+
| 'plain'
|
|
34
|
+
| 'plain-ext'
|
|
35
|
+
| 'imap'
|
|
36
|
+
| 'cmapx';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Options for {@link render}.
|
|
40
|
+
*/
|
|
41
|
+
export interface RenderOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Layout engine to use. Defaults to `'dot'`.
|
|
44
|
+
*
|
|
45
|
+
* yAxis is intentionally absent: coordinate orientation is a `getLayout`
|
|
46
|
+
* concern (ADR-5). The raw format strings produced here carry native
|
|
47
|
+
* y-up coordinates; callers that need y-down must flip in post-processing.
|
|
48
|
+
*/
|
|
49
|
+
engine?: EngineName;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Inline external images as `data:` URIs (AD-1, additive). Defaults to
|
|
53
|
+
* `false` — unset reproduces the pre-AD-1 raw `xlink:href="src"`
|
|
54
|
+
* passthrough byte-for-byte. When `true`, the SVG emitter consults the
|
|
55
|
+
* process-global resolver registered via `setImageResolver` (from
|
|
56
|
+
* `graphviz-ts`) for each `image=`/HTML `<IMG>` source; a hit is inlined
|
|
57
|
+
* as `data:<mime>;base64,<...>`, a miss (or no resolver registered) falls
|
|
58
|
+
* back to the raw src passthrough. Has no effect on non-SVG formats.
|
|
59
|
+
*/
|
|
60
|
+
inlineImages?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Private helpers (mirrors index.ts)
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Duck-type a thrown value as a {@link GvError}: object with string `type`
|
|
69
|
+
* and string `code`. Re-implemented here (not imported) so this module has
|
|
70
|
+
* no circular dependency on `src/index.ts`.
|
|
71
|
+
*/
|
|
72
|
+
function isGvErrorLike(err: unknown): err is GvError {
|
|
73
|
+
return (
|
|
74
|
+
typeof err === 'object' &&
|
|
75
|
+
err !== null &&
|
|
76
|
+
typeof (err as { type?: unknown }).type === 'string' &&
|
|
77
|
+
typeof (err as { code?: unknown }).code === 'string'
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* v8 ignore next -- defensive normalizer; unreachable via public API */
|
|
82
|
+
function messageOf(err: unknown): string {
|
|
83
|
+
return err instanceof Error ? err.message : String(err);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Public API
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Render a (parsed or built) graph to the requested format string.
|
|
92
|
+
*
|
|
93
|
+
* Lifecycle: createDefaultContext → layout → deviceRender → freeLayout.
|
|
94
|
+
* Error handling mirrors `renderSvg`: GvError-like throws re-surface
|
|
95
|
+
* unchanged; unknown throws become `RenderError('RENDER_ERROR')`.
|
|
96
|
+
*
|
|
97
|
+
* @remarks
|
|
98
|
+
* Security: for the markup formats (`svg`, `cmapx`, `imap`), treat the output
|
|
99
|
+
* as attacker-controlled when the source graph came from untrusted DOT.
|
|
100
|
+
* Attribute values are XML-escaped, but URL schemes and resource origins
|
|
101
|
+
* (`href`/`URL`/`image`/`stylesheet`) are passed through unfiltered, matching
|
|
102
|
+
* native Graphviz. Apply a Content-Security-Policy or sanitize before embedding
|
|
103
|
+
* — see the README "Security" section.
|
|
104
|
+
*
|
|
105
|
+
* @param g - graph produced by `parse(...)` or the builder API
|
|
106
|
+
* @param format - target output format
|
|
107
|
+
* @param opts - optional engine override (default: `'dot'`)
|
|
108
|
+
* @returns rendered string in the requested format
|
|
109
|
+
* @throws RenderError on layout or render failure
|
|
110
|
+
*
|
|
111
|
+
* @see lib/gvc/gvc.c:gvRender
|
|
112
|
+
*/
|
|
113
|
+
export function render(
|
|
114
|
+
g: Graph,
|
|
115
|
+
format: OutputFormat,
|
|
116
|
+
opts?: RenderOptions,
|
|
117
|
+
): string {
|
|
118
|
+
const engine: EngineName = opts?.engine ?? 'dot';
|
|
119
|
+
const inlineImages = opts?.inlineImages ?? false;
|
|
120
|
+
const ctx = createDefaultContext();
|
|
121
|
+
try {
|
|
122
|
+
ctx.layout(g, engine);
|
|
123
|
+
const result = deviceRender(ctx, g, format, inlineImages);
|
|
124
|
+
ctx.freeLayout(g, engine);
|
|
125
|
+
return result;
|
|
126
|
+
} catch (err: unknown) {
|
|
127
|
+
/* v8 ignore next -- current engines don't throw a GvError-like value here */
|
|
128
|
+
if (isGvErrorLike(err)) throw err;
|
|
129
|
+
throw new RenderError(messageOf(err), 'RENDER_ERROR');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SVG emission for typed arrowhead draw-ops (ADR-1). Each {@link ArrowDrawOp}
|
|
5
|
+
* becomes the matching SVG primitive with the edge pen color: filled polygons
|
|
6
|
+
* and ellipses use the pen color for both fill and stroke; open shapes,
|
|
7
|
+
* polylines, and Bézier arms use `fill="none"`. Geometry is transformed from
|
|
8
|
+
* layout space to device space via `transformPoint`, matching the existing
|
|
9
|
+
* arrow-polygon emitter.
|
|
10
|
+
*
|
|
11
|
+
* @see plugin/core/gvrender_core_svg.c:svg_polygon / svg_ellipse / svg_polyline
|
|
12
|
+
* @see lib/common/arrows.c:arrow_gen (emit sequence)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { Point } from '../model/geom.js';
|
|
16
|
+
import type { RenderJob } from '../gvc/job.js';
|
|
17
|
+
import type { ArrowDrawOp } from '../common/arrows-types.js';
|
|
18
|
+
import { transformPoint } from '../gvc/device.js';
|
|
19
|
+
import { emitPoints, emitBezierPath, emitPenWidth } from './svg-helpers.js';
|
|
20
|
+
|
|
21
|
+
const PENWIDTH_NORMAL = 1.0;
|
|
22
|
+
const PENWIDTH_THRESHOLD = 0.005;
|
|
23
|
+
|
|
24
|
+
/** Emit ` stroke-width` only when the pen width differs from the SVG default. */
|
|
25
|
+
function emitArrowPenWidth(job: RenderJob, pw: number): void {
|
|
26
|
+
if (Math.abs(pw - PENWIDTH_NORMAL) >= PENWIDTH_THRESHOLD) emitPenWidth(job, pw);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Emit ` <attr>="<opacity>"` when the pen color carries partial alpha. */
|
|
30
|
+
function emitArrowOpacity(job: RenderJob, attr: string, opacity: string | null): void {
|
|
31
|
+
if (opacity !== null) job.write(' ' + attr + '="' + opacity + '"');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** `<polygon>` with Adobe first-point repetition (matches svg_polygon). */
|
|
35
|
+
function emitPolygonOp(points: Point[], filled: boolean, penColor: string, job: RenderJob, pw: number, opacity: string | null): void {
|
|
36
|
+
const pts = points.map((p) => transformPoint(p, job));
|
|
37
|
+
job.write('<polygon fill="' + (filled ? penColor : 'none') + '"');
|
|
38
|
+
if (filled) emitArrowOpacity(job, 'fill-opacity', opacity);
|
|
39
|
+
job.write(' stroke="' + penColor + '"');
|
|
40
|
+
emitArrowPenWidth(job, pw);
|
|
41
|
+
emitArrowOpacity(job, 'stroke-opacity', opacity);
|
|
42
|
+
job.write(' points="');
|
|
43
|
+
emitPoints(job, pts);
|
|
44
|
+
if (pts.length > 0) {
|
|
45
|
+
const p0 = pts[0]!;
|
|
46
|
+
job.write(' ');
|
|
47
|
+
job.printDouble(p0.x);
|
|
48
|
+
job.write(',');
|
|
49
|
+
job.printDouble(p0.y);
|
|
50
|
+
}
|
|
51
|
+
job.write('"/>\n');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Ellipse op shape (dot/odot). */
|
|
55
|
+
interface EllipseOp { center: Point; rx: number; ry: number; filled: boolean }
|
|
56
|
+
|
|
57
|
+
/** `<ellipse>` (dot/odot). rx/ry are emitted in layout units (device scale 1). */
|
|
58
|
+
function emitEllipseOp(op: EllipseOp, penColor: string, job: RenderJob, pw: number, opacity: string | null): void {
|
|
59
|
+
const c = transformPoint(op.center, job);
|
|
60
|
+
job.write('<ellipse fill="' + (op.filled ? penColor : 'none') + '"');
|
|
61
|
+
if (op.filled) emitArrowOpacity(job, 'fill-opacity', opacity);
|
|
62
|
+
job.write(' stroke="' + penColor + '"');
|
|
63
|
+
emitArrowPenWidth(job, pw);
|
|
64
|
+
emitArrowOpacity(job, 'stroke-opacity', opacity);
|
|
65
|
+
job.write(' cx="');
|
|
66
|
+
job.printDouble(c.x);
|
|
67
|
+
job.write('" cy="');
|
|
68
|
+
job.printDouble(c.y);
|
|
69
|
+
job.write('" rx="');
|
|
70
|
+
job.printDouble(op.rx);
|
|
71
|
+
job.write('" ry="');
|
|
72
|
+
job.printDouble(op.ry);
|
|
73
|
+
job.write('"/>\n');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** `<polyline>` (tee/box/gap/curve shaft) — never filled. */
|
|
77
|
+
function emitPolylineOp(points: Point[], penColor: string, job: RenderJob, pw: number, opacity: string | null): void {
|
|
78
|
+
const pts = points.map((p) => transformPoint(p, job));
|
|
79
|
+
job.write('<polyline fill="none" stroke="' + penColor + '"');
|
|
80
|
+
emitArrowPenWidth(job, pw);
|
|
81
|
+
emitArrowOpacity(job, 'stroke-opacity', opacity);
|
|
82
|
+
job.write(' points="');
|
|
83
|
+
emitPoints(job, pts);
|
|
84
|
+
job.write('"/>\n');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** `<path>` cubic Bézier (curve/icurve arms) — never filled. */
|
|
88
|
+
function emitBezierOp(points: Point[], penColor: string, job: RenderJob, pw: number, opacity: string | null): void {
|
|
89
|
+
const pts = points.map((p) => transformPoint(p, job));
|
|
90
|
+
job.write('<path fill="none" stroke="' + penColor + '"');
|
|
91
|
+
emitArrowPenWidth(job, pw);
|
|
92
|
+
emitArrowOpacity(job, 'stroke-opacity', opacity);
|
|
93
|
+
job.write(' d="');
|
|
94
|
+
emitBezierPath(job, pts);
|
|
95
|
+
job.write('"/>\n');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Emit one edge end's arrowhead draw-ops, in order, with the given pen color.
|
|
100
|
+
* `opacity` is the stringified alpha (`colorOpacity`) or null when the pen color
|
|
101
|
+
* is opaque; it drives the SVG fill/stroke-opacity attributes (e.g. an edge
|
|
102
|
+
* color="#rrggbbaa"). @see lib/common/arrows.c:arrow_gen
|
|
103
|
+
*/
|
|
104
|
+
export function emitArrowOps(ops: ArrowDrawOp[], penColor: string, job: RenderJob, pw: number, opacity: string | null = null): void {
|
|
105
|
+
for (const op of ops) {
|
|
106
|
+
switch (op.kind) {
|
|
107
|
+
case 'polygon': emitPolygonOp(op.points, op.filled, penColor, job, pw, opacity); break;
|
|
108
|
+
case 'ellipse': emitEllipseOp(op, penColor, job, pw, opacity); break;
|
|
109
|
+
case 'polyline': emitPolylineOp(op.points, penColor, job, pw, opacity); break;
|
|
110
|
+
case 'bezier': emitBezierOp(op.points, penColor, job, pw, opacity); break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SVG cluster group helpers.
|
|
5
|
+
* @see plugin/core/gvrender_core_svg.c:svg_begin_cluster / svg_end_cluster
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Graph } from '../model/graph.js';
|
|
9
|
+
import type { RenderJob } from '../gvc/job.js';
|
|
10
|
+
import { escapeXmlTitle } from './svg-helpers.js';
|
|
11
|
+
import { svgClusterId, svgClusterClass } from './svg-id.js';
|
|
12
|
+
|
|
13
|
+
export function svgBeginCluster(sg: Graph, job: RenderJob): void {
|
|
14
|
+
// Id from getObjId (DOT `id` attr / gid prefix / clust<seq>); layer prefix
|
|
15
|
+
// only (no per-object suffix for graph/cluster ids). DOT `class` is appended.
|
|
16
|
+
// @see lib/common/emit.c:getObjId; plugin/core/gvrender_core_svg.c:svg_print_id_class
|
|
17
|
+
job.write('<g id="' + escapeXmlTitle(job.idLayerPrefix() + svgClusterId(sg, job))
|
|
18
|
+
+ '" ' + svgClusterClass(sg) + '>\n');
|
|
19
|
+
job.write('<title>' + escapeXmlTitle(sg.name) + '</title>\n');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function svgEndCluster(job: RenderJob): void {
|
|
23
|
+
job.write('</g>\n');
|
|
24
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
//
|
|
3
|
+
// Rounded orthogonal edge corners — faithful port of the corner half of
|
|
4
|
+
// lib/common/emit.c's splines=ortho + radius/style=rounded path (emit.c
|
|
5
|
+
// 2130-2249). Given an edge's spline control points (graphviz-internal y-up),
|
|
6
|
+
// finds each orthogonal corner and computes its truncation points (inset by
|
|
7
|
+
// `radius` along each incident segment) and arc-wedge parameters.
|
|
8
|
+
//
|
|
9
|
+
// The emit half (segment + arc polylines) is added in T3. Coordinates are the
|
|
10
|
+
// internal y-up frame the spline is stored in; the SVG renderer negates y.
|
|
11
|
+
|
|
12
|
+
import type { Point } from '../model/geom.js';
|
|
13
|
+
import { ellipticWedge } from '../common/ellipse-wedge.js';
|
|
14
|
+
|
|
15
|
+
/** Per-corner geometry, mirroring emit.c:corner_info_t. */
|
|
16
|
+
export interface CornerInfo {
|
|
17
|
+
/** Index of the corner point in the spline list. */
|
|
18
|
+
idx: number;
|
|
19
|
+
/** Truncation point toward the previous segment (curr − dir1·radius). */
|
|
20
|
+
truncPrev: Point;
|
|
21
|
+
/** Truncation point toward the next segment (curr + dir2·radius). */
|
|
22
|
+
truncNext: Point;
|
|
23
|
+
/** Center of the arc wedge. */
|
|
24
|
+
wedgeCenter: Point;
|
|
25
|
+
/** Arc start/end angles. */
|
|
26
|
+
angle1: number;
|
|
27
|
+
angle2: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** @see lib/common/emit.c:find_prev_distinct (TOLERANCE 0.01) */
|
|
31
|
+
function findPrevDistinct(pts: Point[], i: number): number {
|
|
32
|
+
const TOL = 0.01;
|
|
33
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
34
|
+
if (Math.hypot(pts[j].x - pts[i].x, pts[j].y - pts[i].y) > TOL) return j;
|
|
35
|
+
}
|
|
36
|
+
return -1;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** @see lib/common/emit.c:find_next_distinct (TOLERANCE 0.01) */
|
|
40
|
+
function findNextDistinct(pts: Point[], i: number, n: number): number {
|
|
41
|
+
const TOL = 0.01;
|
|
42
|
+
for (let j = i + 1; j < n; j++) {
|
|
43
|
+
if (Math.hypot(pts[j].x - pts[i].x, pts[j].y - pts[i].y) > TOL) return j;
|
|
44
|
+
}
|
|
45
|
+
return -1;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Wedge center + arc angles for an orthogonal corner (8 orientation cases).
|
|
49
|
+
* @see lib/common/emit.c:calculate_wedge_parameters */
|
|
50
|
+
function calculateWedgeParameters(
|
|
51
|
+
ci: CornerInfo, curr: Point, dx1: number, dy1: number, dx2: number, dy2: number,
|
|
52
|
+
radius: number, seg1Horiz: boolean, seg2Vert: boolean,
|
|
53
|
+
): void {
|
|
54
|
+
if (seg1Horiz && seg2Vert) {
|
|
55
|
+
if (dx1 > 0 && dy2 < 0) { // right then down
|
|
56
|
+
ci.wedgeCenter = { x: curr.x - radius, y: curr.y - radius };
|
|
57
|
+
ci.angle1 = 0; ci.angle2 = Math.PI / 2;
|
|
58
|
+
} else if (dx1 > 0 && dy2 > 0) { // right then up
|
|
59
|
+
ci.wedgeCenter = { x: curr.x - radius, y: curr.y + radius };
|
|
60
|
+
ci.angle1 = -Math.PI / 2; ci.angle2 = 0;
|
|
61
|
+
} else if (dx1 < 0 && dy2 < 0) { // left then down
|
|
62
|
+
ci.wedgeCenter = { x: curr.x + radius, y: curr.y - radius };
|
|
63
|
+
ci.angle1 = Math.PI / 2; ci.angle2 = Math.PI;
|
|
64
|
+
} else { // left then up
|
|
65
|
+
ci.wedgeCenter = { x: curr.x + radius, y: curr.y + radius };
|
|
66
|
+
ci.angle1 = Math.PI; ci.angle2 = (3 * Math.PI) / 2;
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
if (dy1 < 0 && dx2 > 0) { // down then right
|
|
70
|
+
ci.wedgeCenter = { x: curr.x + radius, y: curr.y + radius };
|
|
71
|
+
ci.angle1 = Math.PI; ci.angle2 = (3 * Math.PI) / 2;
|
|
72
|
+
} else if (dy1 < 0 && dx2 < 0) { // down then left
|
|
73
|
+
ci.wedgeCenter = { x: curr.x - radius, y: curr.y + radius };
|
|
74
|
+
ci.angle1 = (3 * Math.PI) / 2; ci.angle2 = 2 * Math.PI;
|
|
75
|
+
} else if (dy1 > 0 && dx2 > 0) { // up then right
|
|
76
|
+
ci.wedgeCenter = { x: curr.x + radius, y: curr.y - radius };
|
|
77
|
+
ci.angle1 = Math.PI / 2; ci.angle2 = Math.PI;
|
|
78
|
+
} else { // up then left
|
|
79
|
+
ci.wedgeCenter = { x: curr.x - radius, y: curr.y - radius };
|
|
80
|
+
ci.angle1 = 0; ci.angle2 = Math.PI / 2;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Process a detected orthogonal corner, appending it unless it duplicates one
|
|
86
|
+
* already found (DUP_TOL 0.01). @see lib/common/emit.c:process_corner */
|
|
87
|
+
function processCorner(
|
|
88
|
+
corners: CornerInfo[], pts: Point[], i: number, curr: Point,
|
|
89
|
+
dx1: number, dy1: number, dx2: number, dy2: number, radius: number,
|
|
90
|
+
seg1Horiz: boolean, seg2Vert: boolean,
|
|
91
|
+
): void {
|
|
92
|
+
const DUP_TOL = 0.01;
|
|
93
|
+
for (const ci of corners) {
|
|
94
|
+
const existing = pts[ci.idx];
|
|
95
|
+
if (Math.hypot(curr.x - existing.x, curr.y - existing.y) < DUP_TOL) return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const ci: CornerInfo = {
|
|
99
|
+
idx: i, truncPrev: { x: 0, y: 0 }, truncNext: { x: 0, y: 0 },
|
|
100
|
+
wedgeCenter: { x: 0, y: 0 }, angle1: 0, angle2: 0,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// Normalize direction vectors.
|
|
104
|
+
const len1 = Math.hypot(dx1, dy1);
|
|
105
|
+
const len2 = Math.hypot(dx2, dy2);
|
|
106
|
+
const ndx1 = dx1 / len1, ndy1 = dy1 / len1;
|
|
107
|
+
const ndx2 = dx2 / len2, ndy2 = dy2 / len2;
|
|
108
|
+
|
|
109
|
+
// Truncation points (move radius distance away from the corner).
|
|
110
|
+
ci.truncPrev = { x: curr.x - ndx1 * radius, y: curr.y - ndy1 * radius };
|
|
111
|
+
ci.truncNext = { x: curr.x + ndx2 * radius, y: curr.y + ndy2 * radius };
|
|
112
|
+
|
|
113
|
+
calculateWedgeParameters(ci, curr, dx1, dy1, dx2, dy2, radius, seg1Horiz, seg2Vert);
|
|
114
|
+
corners.push(ci);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Find every orthogonal corner in the spline point list and compute its
|
|
119
|
+
* truncation + wedge parameters. A corner is a horizontal→vertical or
|
|
120
|
+
* vertical→horizontal bend (TOL 0.1). @see lib/common/emit.c:find_ortho_corners
|
|
121
|
+
*/
|
|
122
|
+
export function findOrthoCorners(pts: Point[], radius: number): CornerInfo[] {
|
|
123
|
+
const TOL = 0.1;
|
|
124
|
+
const n = pts.length;
|
|
125
|
+
const corners: CornerInfo[] = [];
|
|
126
|
+
|
|
127
|
+
for (let i = 0; i < n; i++) {
|
|
128
|
+
const prevIdx = findPrevDistinct(pts, i);
|
|
129
|
+
const nextIdx = findNextDistinct(pts, i, n);
|
|
130
|
+
if (prevIdx === -1 || nextIdx === -1) continue;
|
|
131
|
+
|
|
132
|
+
const prev = pts[prevIdx], curr = pts[i], next = pts[nextIdx];
|
|
133
|
+
const dx1 = curr.x - prev.x, dy1 = curr.y - prev.y;
|
|
134
|
+
const dx2 = next.x - curr.x, dy2 = next.y - curr.y;
|
|
135
|
+
|
|
136
|
+
const seg1Horiz = Math.abs(dy1) < TOL && Math.abs(dx1) > TOL;
|
|
137
|
+
const seg1Vert = Math.abs(dx1) < TOL && Math.abs(dy1) > TOL;
|
|
138
|
+
const seg2Horiz = Math.abs(dy2) < TOL && Math.abs(dx2) > TOL;
|
|
139
|
+
const seg2Vert = Math.abs(dx2) < TOL && Math.abs(dy2) > TOL;
|
|
140
|
+
|
|
141
|
+
const isCorner = (seg1Horiz && seg2Vert) || (seg1Vert && seg2Horiz);
|
|
142
|
+
if (isCorner) {
|
|
143
|
+
processCorner(corners, pts, i, curr, dx1, dy1, dx2, dy2, radius, seg1Horiz, seg2Vert);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Sort by corner index (emit.c sorts the list before segment rendering).
|
|
148
|
+
corners.sort((a, b) => a.idx - b.idx);
|
|
149
|
+
return corners;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** True when `p` is within CORNER_TOL of any corner point. */
|
|
153
|
+
function atAnyCorner(p: Point, pts: Point[], corners: CornerInfo[], tol: number): boolean {
|
|
154
|
+
for (const c of corners) {
|
|
155
|
+
const cp = pts[c.idx];
|
|
156
|
+
if (Math.hypot(p.x - cp.x, p.y - cp.y) < tol) return true;
|
|
157
|
+
}
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Straight polyline segments between truncated corners.
|
|
162
|
+
* @see lib/common/emit.c:2593-2654 (segment loop) */
|
|
163
|
+
function segmentPolylines(pts: Point[], corners: CornerInfo[]): Point[][] {
|
|
164
|
+
const CORNER_TOL = 0.01;
|
|
165
|
+
const n = pts.length;
|
|
166
|
+
const out: Point[][] = [];
|
|
167
|
+
|
|
168
|
+
let segStartIdx = 0;
|
|
169
|
+
let segStartPt = pts[0];
|
|
170
|
+
|
|
171
|
+
for (let c = 0; c <= corners.length; c++) {
|
|
172
|
+
let segEndIdx: number;
|
|
173
|
+
let segEndPt: Point;
|
|
174
|
+
if (c < corners.length) {
|
|
175
|
+
segEndIdx = corners[c].idx;
|
|
176
|
+
segEndPt = corners[c].truncPrev;
|
|
177
|
+
} else {
|
|
178
|
+
segEndIdx = n - 1;
|
|
179
|
+
segEndPt = pts[n - 1];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const seg: Point[] = [segStartPt];
|
|
183
|
+
for (let pt = segStartIdx + 1; pt < segEndIdx; pt++) {
|
|
184
|
+
if (!atAnyCorner(pts[pt], pts, corners, CORNER_TOL)) seg.push(pts[pt]);
|
|
185
|
+
}
|
|
186
|
+
seg.push(segEndPt);
|
|
187
|
+
out.push(seg);
|
|
188
|
+
|
|
189
|
+
if (c < corners.length) {
|
|
190
|
+
// Skip all duplicates of this corner, then resume at its trunc_next.
|
|
191
|
+
let nextIdx = corners[c].idx + 1;
|
|
192
|
+
while (nextIdx < n && atAnyCorner(pts[nextIdx], pts, corners, CORNER_TOL)) nextIdx++;
|
|
193
|
+
segStartIdx = nextIdx;
|
|
194
|
+
segStartPt = corners[c].truncNext;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return out;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Arc polyline per corner: the wedge slice [3 .. pn-4].
|
|
201
|
+
* @see lib/common/emit.c:draw_ortho_corner_markers / render_corner_arc */
|
|
202
|
+
function cornerArcPolylines(corners: CornerInfo[], radius: number): Point[][] {
|
|
203
|
+
const out: Point[][] = [];
|
|
204
|
+
for (const ci of corners) {
|
|
205
|
+
const wedge = ellipticWedge(ci.wedgeCenter, radius, radius, ci.angle1, ci.angle2);
|
|
206
|
+
if (wedge.length > 4) {
|
|
207
|
+
const arcStart = 3; // skip center, first arc point, AND duplicate
|
|
208
|
+
const arcEnd = wedge.length - 4; // skip duplicate endpoint, last arc point, AND center
|
|
209
|
+
const count = arcEnd >= arcStart ? arcEnd - arcStart + 1 : 0;
|
|
210
|
+
if (count >= 2) out.push(wedge.slice(arcStart, arcEnd + 1));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The full list of `<polyline>` point-arrays native emits for an ortho edge with
|
|
218
|
+
* rounded corners: straight segments between truncated corners first, then one
|
|
219
|
+
* arc polyline per corner — matching emit.c's order (segment loop, then
|
|
220
|
+
* draw_ortho_corner_markers). Returns `[]` when no orthogonal corner is found,
|
|
221
|
+
* so the caller falls back to the bezier `<path>`.
|
|
222
|
+
* @see lib/common/emit.c:2583-2662
|
|
223
|
+
*/
|
|
224
|
+
export function orthoRoundedPolylines(pts: Point[], radius: number): Point[][] {
|
|
225
|
+
const corners = findOrthoCorners(pts, radius);
|
|
226
|
+
if (corners.length === 0) return [];
|
|
227
|
+
return [...segmentPolylines(pts, corners), ...cornerArcPolylines(corners, radius)];
|
|
228
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Split-along-length multi-color edges: a `color="c1;f1:c2;f2"` (semicolon)
|
|
5
|
+
* spec draws each routed spline split along its ARC LENGTH, one sub-curve per
|
|
6
|
+
* color segment. This is C's `multicolor()` path, reached when the color has
|
|
7
|
+
* both ';' and ':' (numsemi && numc); the plain ':' syntax is the parallel
|
|
8
|
+
* branch (svg-parallel-edge.ts).
|
|
9
|
+
*
|
|
10
|
+
* Arrow rule (note: inverse of the parallel branch): tail arrow = FIRST color,
|
|
11
|
+
* head arrow = endcolor (LAST drawn color).
|
|
12
|
+
*
|
|
13
|
+
* @see lib/common/emit.c:1975 multicolor
|
|
14
|
+
* @see lib/common/emit.c:1921 splitBSpline
|
|
15
|
+
* @see lib/common/emit.c:1908 approxLen
|
|
16
|
+
* @see lib/common/utils.c:175 Bezier (de Casteljau split)
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { Edge } from '../model/edge.js';
|
|
20
|
+
import type { RenderJob } from '../gvc/job.js';
|
|
21
|
+
import type { Point, Bezier } from '../model/geom.js';
|
|
22
|
+
import { parseSegs } from '../common/multicolor.js';
|
|
23
|
+
import { transformPoint } from '../gvc/device.js';
|
|
24
|
+
import { emitBezierPath, emitDash, emitPenWidth } from './svg-helpers.js';
|
|
25
|
+
import { resolveRenderColor, colorPaint } from './color-resolve.js';
|
|
26
|
+
|
|
27
|
+
const DEFAULT_COLOR = 'black';
|
|
28
|
+
const PENWIDTH_NORMAL = 1.0;
|
|
29
|
+
const PENWIDTH_THRESHOLD = 0.005;
|
|
30
|
+
/** AEQ0 tolerance for fraction comparisons. */
|
|
31
|
+
const EPS = 1e-5;
|
|
32
|
+
|
|
33
|
+
function dist(a: Point, b: Point): number {
|
|
34
|
+
return Math.hypot(a.x - b.x, a.y - b.y);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Chord length of one cubic (control points at off..off+3). @see emit.c:1908 */
|
|
38
|
+
function approxLen(list: Point[], off: number): number {
|
|
39
|
+
return dist(list[off]!, list[off + 1]!) +
|
|
40
|
+
dist(list[off + 1]!, list[off + 2]!) +
|
|
41
|
+
dist(list[off + 2]!, list[off + 3]!);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* de Casteljau split of a single cubic (control points v[0..3]) at parameter t,
|
|
46
|
+
* returning the left and right 4-point sub-curves. Ports C's Bezier().
|
|
47
|
+
*/
|
|
48
|
+
function splitCubic(v: Point[], t: number): { left: Point[]; right: Point[] } {
|
|
49
|
+
const u = 1 - t;
|
|
50
|
+
const row = [v[0]!, v[1]!, v[2]!, v[3]!];
|
|
51
|
+
const left: Point[] = [row[0]!];
|
|
52
|
+
const right: Point[] = new Array<Point>(4);
|
|
53
|
+
right[3] = row[3]!;
|
|
54
|
+
for (let i = 1; i <= 3; i++) {
|
|
55
|
+
for (let j = 0; j <= 3 - i; j++) {
|
|
56
|
+
row[j] = { x: u * row[j]!.x + t * row[j + 1]!.x, y: u * row[j]!.y + t * row[j + 1]!.y };
|
|
57
|
+
}
|
|
58
|
+
left.push(row[0]!);
|
|
59
|
+
right[3 - i] = row[3 - i]!;
|
|
60
|
+
}
|
|
61
|
+
return { left, right };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Split a B-spline (control points, length 3*cnt+1) at arc-length fraction t.
|
|
66
|
+
* @see lib/common/emit.c:1921 splitBSpline
|
|
67
|
+
*/
|
|
68
|
+
function splitBSpline(list: Point[], t: number): { left: Point[]; right: Point[] } {
|
|
69
|
+
const cnt = (list.length - 1) / 3;
|
|
70
|
+
if (cnt === 1) return splitCubic(list, t);
|
|
71
|
+
const lens: number[] = [];
|
|
72
|
+
let sum = 0;
|
|
73
|
+
for (let i = 0; i < cnt; i++) { lens.push(approxLen(list, 3 * i)); sum += lens[i]!; }
|
|
74
|
+
const target = t * sum;
|
|
75
|
+
sum = 0;
|
|
76
|
+
let i = 0;
|
|
77
|
+
for (; i < cnt; i++) { sum += lens[i]!; if (sum >= target) break; }
|
|
78
|
+
const last = lens[i]!;
|
|
79
|
+
const r = (target - (sum - last)) / last;
|
|
80
|
+
const seg = splitCubic(list.slice(3 * i, 3 * i + 4), r);
|
|
81
|
+
return {
|
|
82
|
+
left: list.slice(0, 3 * i).concat(seg.left),
|
|
83
|
+
right: seg.right.concat(list.slice(3 * i + 4)),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Emit one sub-curve as an SVG path in the given color (style from obj). */
|
|
88
|
+
function emitCurve(list: Point[], color: string, job: RenderJob): void {
|
|
89
|
+
const obj = job.obj;
|
|
90
|
+
const pts = list.map((p) => transformPoint(p, job));
|
|
91
|
+
// Resolve the segment color through the SVG known-color gate (C's
|
|
92
|
+
// gvrender_set_pencolor per multicolor segment) before it reaches stroke=".
|
|
93
|
+
job.write('<path fill="none" stroke="' + colorPaint(resolveRenderColor(color)) + '"');
|
|
94
|
+
if (obj !== null && Math.abs(obj.penWidth - PENWIDTH_NORMAL) >= PENWIDTH_THRESHOLD) {
|
|
95
|
+
emitPenWidth(job, obj.penWidth);
|
|
96
|
+
}
|
|
97
|
+
if (obj !== null) emitDash(job, obj.pen);
|
|
98
|
+
job.write(' d="');
|
|
99
|
+
emitBezierPath(job, pts);
|
|
100
|
+
job.write('"/>\n');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
interface ColorSeg { color: string | null; t: number; }
|
|
104
|
+
|
|
105
|
+
/** One color segment of a split spline: the sub-curve control points + its color. */
|
|
106
|
+
export interface ColoredSubCurve { color: string; points: Point[]; }
|
|
107
|
+
|
|
108
|
+
/** Running state for one spline's length-split walk. */
|
|
109
|
+
interface SplitState { left: number; first: boolean; bzR: Point[]; done: boolean; endColor: string; }
|
|
110
|
+
|
|
111
|
+
/** Apply one color segment: split off its length share, append the sub-curve. */
|
|
112
|
+
function stepSegment(list: Point[], s: ColorSeg, st: SplitState, out: ColoredSubCurve[]): void {
|
|
113
|
+
if (Math.abs(s.t) < EPS) return;
|
|
114
|
+
const color = s.color ?? DEFAULT_COLOR;
|
|
115
|
+
st.left -= s.t;
|
|
116
|
+
st.endColor = color;
|
|
117
|
+
if (st.first) {
|
|
118
|
+
st.first = false;
|
|
119
|
+
const sp = splitBSpline(list, s.t);
|
|
120
|
+
out.push({ color, points: sp.left });
|
|
121
|
+
st.bzR = sp.right;
|
|
122
|
+
if (Math.abs(st.left) < EPS) st.done = true;
|
|
123
|
+
} else if (Math.abs(st.left) < EPS) {
|
|
124
|
+
out.push({ color, points: st.bzR });
|
|
125
|
+
st.done = true;
|
|
126
|
+
} else {
|
|
127
|
+
const sp = splitBSpline(st.bzR, s.t / (st.left + s.t));
|
|
128
|
+
out.push({ color, points: sp.left });
|
|
129
|
+
st.bzR = sp.right;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Split one routed spline along its arc length into colored sub-curves per the
|
|
135
|
+
* color segments (C's multicolor() walk), returning the sub-curves and the end
|
|
136
|
+
* color. Pure geometry — no emission — so both the SVG and xdot renderers can
|
|
137
|
+
* share it. @see lib/common/emit.c:1975 multicolor
|
|
138
|
+
*/
|
|
139
|
+
export function splitSplineByColor(
|
|
140
|
+
list: Point[],
|
|
141
|
+
segs: ColorSeg[],
|
|
142
|
+
): { curves: ColoredSubCurve[]; endColor: string } {
|
|
143
|
+
const st: SplitState = { left: 1, first: true, bzR: list, done: false, endColor: DEFAULT_COLOR };
|
|
144
|
+
const curves: ColoredSubCurve[] = [];
|
|
145
|
+
for (const s of segs) {
|
|
146
|
+
stepSegment(list, s, st, curves);
|
|
147
|
+
if (st.done) break;
|
|
148
|
+
}
|
|
149
|
+
return { curves, endColor: st.endColor };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Draw one spline split along its length per the color segments; return endcolor. */
|
|
153
|
+
function drawSplitSpline(list: Point[], segs: ColorSeg[], job: RenderJob): string {
|
|
154
|
+
const { curves, endColor } = splitSplineByColor(list, segs);
|
|
155
|
+
for (const c of curves) emitCurve(c.points, c.color, job);
|
|
156
|
+
return endColor;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Emit a split-along-length multi-color edge. Returns the first and end colors
|
|
161
|
+
* for arrow drawing (tail = first, head = end).
|
|
162
|
+
* @see lib/common/emit.c:1975 multicolor
|
|
163
|
+
*/
|
|
164
|
+
export function emitSplitEdgePaths(
|
|
165
|
+
e: Edge,
|
|
166
|
+
job: RenderJob,
|
|
167
|
+
colorList: string,
|
|
168
|
+
): { firstColor: string; endColor: string } {
|
|
169
|
+
const segs = parseSegs(colorList).segs;
|
|
170
|
+
const firstColor = segs[0]?.color ?? DEFAULT_COLOR;
|
|
171
|
+
const spl = e.info.spl;
|
|
172
|
+
let endColor = firstColor;
|
|
173
|
+
if (spl === undefined) return { firstColor, endColor };
|
|
174
|
+
for (let si = 0; si < spl.size; si++) {
|
|
175
|
+
const bz = spl.list[si] as Bezier | undefined;
|
|
176
|
+
if (bz === undefined || bz.size < 4) continue;
|
|
177
|
+
endColor = drawSplitSpline(bz.list, segs, job);
|
|
178
|
+
}
|
|
179
|
+
return { firstColor, endColor };
|
|
180
|
+
}
|