]> granicus.if.org Git - graphviz/commitdiff
tests: SvgAnalyzer: add handling of the 'viewBox' attribute
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 26 Jul 2022 18:51:08 +0000 (20:51 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 16 Aug 2022 10:21:45 +0000 (12:21 +0200)
tests/svg_analyzer.cpp
tests/svg_analyzer.h
tests/svg_analyzer_interface.h
tests/svg_element.cpp
tests/svg_element.h
tests/svgpp_context.cpp
tests/svgpp_context.h
tests/svgpp_document_traverser.cpp
tests/test_svg_analyzer.cpp

index 39ee82e15278579d13ac3a2f98c1d2b502970ab3..118f869af2277bfb61d42e8d3ef6f6a96144d214 100644 (file)
@@ -143,6 +143,10 @@ void SVGAnalyzer::set_width(double width) {
   current_element().attributes.width = width;
 }
 
+void SVGAnalyzer::set_viewBox(double x, double y, double width, double height) {
+  current_element().attributes.viewBox = {x, y, width, height};
+}
+
 void SVGAnalyzer::set_graphviz_version(std::string_view version) {
   m_svg.graphviz_version = version;
 }
index c2aa32c3ac6d9919448d0714dab203fbd9eaf2bc..541d600cd99e00001573c9897a7640666804463f 100644 (file)
@@ -30,6 +30,7 @@ public:
   void set_height(double height) override;
   void set_class(std::string_view) override;
   void set_text(std::string_view text) override;
+  void set_viewBox(double x, double y, double width, double height) override;
   void set_width(double width) override;
   std::size_t num_svgs() const { return m_num_svgs; };
   std::size_t num_groups() const { return m_num_groups; };
index 0b15f163e0e4945f5282407fec47d7e5fc7fad09..ac186e95331d889129a8f7c076cddb880654e584 100644 (file)
@@ -29,5 +29,6 @@ public:
   virtual void set_class(std::string_view) = 0;
   virtual void set_height(double height) = 0;
   virtual void set_text(std::string_view text) = 0;
+  virtual void set_viewBox(double x, double y, double width, double height) = 0;
   virtual void set_width(double width) = 0;
 };
index b8225ca81b98ab4d3bb829bc8dab7608a2041825..2e33b33a9687822dce94fa126ec8aa71917d65a0 100644 (file)
@@ -88,9 +88,14 @@ void SVG::SVGElement::to_string_impl(std::string &output,
     // ignore for now
     break;
   case SVG::SVGElementType::Svg:
-    attributes_str += fmt::format(R"(width="{}pt" height="{}pt")",
-                                  std::lround(px_to_pt(attributes.width)),
-                                  std::lround(px_to_pt(attributes.height)));
+    attributes_str +=
+        fmt::format(R"(width="{}pt" height="{}pt")"
+                    "\n"
+                    R"( viewBox="{:.2f} {:.2f} {:.2f} {:.2f}")",
+                    std::lround(px_to_pt(attributes.width)),
+                    std::lround(px_to_pt(attributes.height)),
+                    attributes.viewBox.x, attributes.viewBox.y,
+                    attributes.viewBox.width, attributes.viewBox.height);
     break;
   case SVG::SVGElementType::Text:
     // ignore for now
index b8979bcb7c09db57265cbcd6b133c74a9c3013c3..628bede7c490fbdfbe461f39728b987d5cff65e9 100644 (file)
@@ -7,6 +7,13 @@
 
 namespace SVG {
 
+struct SVGRect {
+  double x;
+  double y;
+  double width;
+  double height;
+};
+
 enum class SVGElementType {
   Circle,
   Ellipse,
@@ -26,6 +33,7 @@ std::string_view tag(SVG::SVGElementType type);
 struct SVGAttributes {
   std::string class_;
   double height;
+  SVGRect viewBox;
   double width;
 };
 
index f28421d75099cbd83210eab2f6b177ca4e3251b5..1a311a22074bb24e8299291788050476af2ac012 100644 (file)
@@ -175,6 +175,11 @@ void SvgppContext::set(svgpp::tag::attribute::class_,
   m_svgAnalyzer->set_class({v.begin(), v.end()});
 }
 
+void SvgppContext::set(svgpp::tag::attribute::viewBox, const double v1,
+                       const double v2, const double v3, const double v4) {
+  m_svgAnalyzer->set_viewBox(v1, v2, v3, v4);
+}
+
 void SvgppContext::set_impl(svgpp::tag::attribute::points &points,
                             const std::any &range) {
   (void)points;
index c66abb169f4f6e0497ba92f8b4d2af440c63fdcd..d52053720b7b4e41cef06d870206085b7c06ee09 100644 (file)
@@ -65,6 +65,8 @@ public:
   void set(svgpp::tag::attribute::height height, double v);
   void set(svgpp::tag::attribute::class_ a,
            boost::iterator_range<const char *> v);
+  void set(svgpp::tag::attribute::viewBox a, double v1, double v2, double v3,
+           double v4);
   void set_text(boost::iterator_range<const char *> v);
 
 private:
index 9dc865c1df371a2e93e35138a02e9f7451570fe9..824834bd26bb23dfd01c313ad86c662cf525f681 100644 (file)
@@ -26,9 +26,10 @@ void traverseDocumentWithSvgpp(SvgppContext &context, char *text) {
 
     using processed_attributes_t =
         boost::mpl::set<svgpp::traits::shapes_attributes_by_element,
-                        svgpp::tag::attribute::class_, //
-                        svgpp::tag::attribute::height, //
-                        svgpp::tag::attribute::width   //
+                        svgpp::tag::attribute::class_,  //
+                        svgpp::tag::attribute::height,  //
+                        svgpp::tag::attribute::viewBox, //
+                        svgpp::tag::attribute::width    //
                         >::type;
 
     svgpp::document_traversal<
index 48f60172f75af7201c420fff97c54d9e17339c82..ff49e0dca9948ab6f6e5aca15b1df8f9787e1580 100644 (file)
@@ -135,6 +135,7 @@ TEST_CASE(
     // yet compare with the original SVG
     CHECK(recreated_svg.find("<svg width=\"") != std::string::npos);
     CHECK(recreated_svg.find("\" height=\"") != std::string::npos);
+    CHECK(recreated_svg.find("\n viewBox=\"") != std::string::npos);
     CHECK(recreated_svg.find("</svg>") != std::string::npos);
     CHECK(recreated_svg.find("<g class=\"graph\">") != std::string::npos);
     CHECK(recreated_svg.find("<g class=\"node\">") != std::string::npos);