]> granicus.if.org Git - graphviz/commitdiff
tests: SVGAnalyzer: add support for adding outline overlap bounding boxes to the...
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Sat, 27 Aug 2022 11:13:59 +0000 (13:13 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Mon, 12 Sep 2022 07:46:17 +0000 (09:46 +0200)
This will be used in upcoming commits to highlight Graphviz component
overlaps.

Towards https://gitlab.com/graphviz/graphviz/-/issues/372.

tests/graphviz_edge.cpp
tests/graphviz_edge.h
tests/graphviz_graph.cpp
tests/graphviz_graph.h
tests/svg_analyzer.cpp
tests/svg_analyzer.h
tests/svg_element.cpp
tests/svg_element.h

index 40ffd8e9e399ab568eac04acde07749a65d4cd02..4af31b65834c9d974b1303a7830c54f40a55ed5c 100644 (file)
@@ -1,6 +1,7 @@
 #include <string>
 
 #include "graphviz_edge.h"
+#include "graphviz_node.h"
 #include "svg_element.h"
 
 GraphvizEdge::GraphvizEdge(SVG::SVGElement &svg_g_element)
@@ -10,6 +11,11 @@ void GraphvizEdge::add_bbox() { m_svg_g_element.add_bbox(); }
 
 void GraphvizEdge::add_outline_bbox() { m_svg_g_element.add_outline_bbox(); }
 
+void GraphvizEdge::add_outline_overlap_bbox(const GraphvizNode &node,
+                                            const double tolerance) {
+  m_svg_g_element.add_outline_overlap_bbox(node.svg_g_element(), tolerance);
+}
+
 std::string_view GraphvizEdge::edgeop() const { return m_edgeop; }
 
 std::string GraphvizEdge::fillcolor() const {
index aec812438006d32b51fcfe5516fe841ba44e2c79..7e4e23d1560eabe5c47147fcf4d66811e266ce98 100644 (file)
@@ -3,6 +3,7 @@
 #include <string>
 #include <string_view>
 
+#include "graphviz_node.h"
 #include "svg_element.h"
 
 /**
@@ -22,6 +23,11 @@ public:
   /// `rect` represents the outline bounding box of the edge. The outline
   /// bounding box is the bounding box with penwidth taken into account.
   void add_outline_bbox();
+  /// Add an SVG `rect` element representing the overlap between the outline
+  /// bounding box of the edge and the specified node, to the corresponding `g`
+  /// element. The outline bounding box is the bounding box with penwidth taken
+  /// into account.
+  void add_outline_overlap_bbox(const GraphvizNode &node, double tolerance = 0);
   /// Return the bounding box of the edge
   SVG::SVGRect bbox() const;
   /// Return the center of the edge's bounding box
index 9b68e1bed9bdad7f1033779ba3aa3ba3c086639d..1cfb1b29acc12f5e066621d412b45b3477716e81 100644 (file)
@@ -56,6 +56,15 @@ void GraphvizGraph::add_bboxes() {
   }
 }
 
+void GraphvizGraph::add_node_edge_outline_bbox_overlaps(
+    const double tolerance) {
+  for (auto &node : m_nodes) {
+    for (auto &edge : m_edges) {
+      edge.add_outline_overlap_bbox(node, tolerance);
+    }
+  }
+}
+
 void GraphvizGraph::add_outline_bboxes() {
   for (auto &node : m_nodes) {
     node.add_outline_bbox();
index d5d77151156321fb575d03e06c07027186d2d374..8bb73e07e44a58bf4fa712aa44a03ea772597b3b 100644 (file)
@@ -24,6 +24,10 @@ public:
   void add_edge(SVG::SVGElement &svg_g_element);
   /// Add a Graphviz node to the graph
   void add_node(SVG::SVGElement &svg_g_element);
+  /// Add SVG `rect` elements representing the overlap between the outline
+  /// bounding box of nodes and edges. The outline bounding box is the bounding
+  /// box with penwidth taken into account.
+  void add_node_edge_outline_bbox_overlaps(double tolerance = 0);
   /// Add SVG `rect` elements representing the outline bounding boxes of nodes
   /// and edges to the corresponding `g` elements. The outline bounding box is
   /// the bounding box with penwidth taken into account.
index ab31825841e0744853137d77de6adbcfebf39e9d..42bd4e6e958d3ade32580d1364da55c34e445a12 100644 (file)
@@ -289,6 +289,12 @@ void SVGAnalyzer::add_bboxes() {
   }
 }
 
+void SVGAnalyzer::add_node_edge_outline_bbox_overlaps(double tolerance) {
+  for (auto &graph : m_graphs) {
+    graph.add_node_edge_outline_bbox_overlaps(tolerance);
+  }
+}
+
 void SVGAnalyzer::add_outline_bboxes() {
   for (auto &graph : m_graphs) {
     graph.add_outline_bboxes();
index 72c745734b18f63ce8efc31eca96675b0b0c46f8..dab591a416f3b7def8d2a46bfcb8735d0b7f0039 100644 (file)
@@ -61,6 +61,9 @@ public:
   /// Add SVG `rect` elements representing the bounding boxes of nodes and edges
   /// to the corresponding `g` elements
   void add_bboxes();
+  /// Add SVG rects showing the overlap between the outline bounding boxes of
+  /// each node and edge (with penwidth taken into account)
+  void add_node_edge_outline_bbox_overlaps(double tolerance = 0);
   /// Add SVG `rect` elements representing the outline bounding boxes of nodes
   /// and edges to the corresponding `g` elements. The outline bounding box is
   /// the bounding box with penwidth taken into account.
index eb7d3d31ff859e337b9c67e780f88cfadb2be9ef..ab1018b7bae46b58f366ba03d3552a5ff94785a5 100644 (file)
@@ -131,6 +131,20 @@ void SVG::SVGElement::add_outline_bbox() {
   add_rect(bbox, "blue");
 }
 
+void SVG::SVGElement::add_outline_overlap_bbox(SVG::SVGElement other,
+                                               const double tolerance) {
+  const auto bbox = outline_bbox();
+  const auto other_bbox = other.outline_bbox();
+  const auto overlap_bbox = bbox.intersection(other_bbox);
+  if (overlap_bbox.width <= 0 || overlap_bbox.height <= 0) {
+    return;
+  }
+  const auto within_tolerance =
+      overlap_bbox.width <= tolerance && overlap_bbox.height <= tolerance;
+  const auto color = within_tolerance ? "yellow" : "red";
+  add_rect(overlap_bbox, color);
+}
+
 SVG::SVGRect SVG::SVGElement::bbox(bool throw_if_bbox_not_defined) {
   if (!m_bbox.has_value()) {
     // negative width and height bbox that will be immediately replaced by the
index 1640995a8db06592d950a947e21e086516ebfc1f..a2371064fcefca6c0866a2d353f756670ab8ffb8 100644 (file)
@@ -105,6 +105,10 @@ public:
   /// edge to the element. The outline bounding box is the bounding box with
   /// stroke width taken into account.
   void add_outline_bbox();
+  /// Add an SVG `rect` element representing the overlap between the outline
+  /// bounding box of the element and another element. The outline bounding box
+  /// is the bounding box with penwidth taken into account.
+  void add_outline_overlap_bbox(SVG::SVGElement other, double tolerance = 0);
   /// Add an SVG `rect` element as a child to the element
   void add_rect(SVG::SVGRect rect, std::string color);
   /// \brief Return the value of an attribute retrieved from the element and its