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