svg.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // Boost.Geometry
  2. // Unit Test
  3. // Copyright (c) 2016-2017 Oracle and/or its affiliates.
  4. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  5. // Use, modification and distribution is subject to the Boost Software License,
  6. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #ifdef TEST_WITH_SVG
  9. #include <fstream>
  10. #endif
  11. #include <sstream>
  12. #include <string>
  13. #include <boost/variant.hpp>
  14. #include <geometry_test_common.hpp>
  15. #include <boost/geometry/algorithms/area.hpp>
  16. #include <boost/geometry/algorithms/correct.hpp>
  17. #include <boost/geometry/geometries/geometries.hpp>
  18. #include <boost/geometry/geometries/point_xy.hpp>
  19. #include <boost/geometry/io/svg/svg_mapper.hpp>
  20. #include <boost/geometry/io/svg/write.hpp>
  21. #include <boost/geometry/strategies/strategies.hpp>
  22. template <typename R, typename T>
  23. inline void push_back_square(R & rng, T const& mi, T const& ma)
  24. {
  25. typedef typename bg::point_type<R>::type P;
  26. rng.push_back(P(mi, mi));
  27. rng.push_back(P(mi, ma));
  28. rng.push_back(P(ma, ma));
  29. rng.push_back(P(ma, mi));
  30. rng.push_back(P(mi, mi));
  31. }
  32. template <typename P>
  33. void test_all()
  34. {
  35. typedef bg::model::box<P> box;
  36. typedef bg::model::segment<P> segment;
  37. typedef bg::model::linestring<P> linestring;
  38. typedef bg::model::ring<P> ring;
  39. typedef bg::model::polygon<P> polygon;
  40. typedef bg::model::multi_point<P> multi_point;
  41. typedef bg::model::multi_linestring<linestring> multi_linestring;
  42. typedef bg::model::multi_polygon<polygon> multi_polygon;
  43. P pt(0, 0);
  44. box b(P(10, 10), P(20, 20));
  45. segment s(P(30, 30), P(40, 40));
  46. linestring ls;
  47. push_back_square(ls, 50, 60);
  48. ring r;
  49. push_back_square(r, 70, 80);
  50. polygon po;
  51. push_back_square(po.outer(), 90, 120);
  52. po.inners().resize(1);
  53. push_back_square(po.inners()[0], 100, 110);
  54. bg::correct(po);
  55. multi_point m_pt;
  56. m_pt.push_back(pt);
  57. multi_linestring m_ls;
  58. m_ls.push_back(ls);
  59. multi_polygon m_po;
  60. m_po.push_back(po);
  61. boost::variant<P, linestring, polygon> var;
  62. linestring lsv;
  63. push_back_square(lsv, 130, 140);
  64. var = lsv;
  65. std::string style = "fill-opacity:0.5;fill:rgb(200,0,0);stroke:rgb(200,0,0);stroke-width:3";
  66. std::string m_style = "fill-opacity:0.5;fill:rgb(0,200,0);stroke:rgb(0,200,0);stroke-width:1";
  67. {
  68. #ifdef TEST_WITH_SVG
  69. std::ofstream os("test1.svg", std::ios::trunc);
  70. #else
  71. std::stringstream os;
  72. #endif
  73. os << "<?xml version=\"1.0\" standalone=\"no\"?>"
  74. << "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">"
  75. << "<svg height=\"200\" width=\"200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">";
  76. os << bg::svg(pt, style);
  77. os << bg::svg(b, style);
  78. os << bg::svg(s, style);
  79. os << bg::svg(ls, style);
  80. os << bg::svg(r, style);
  81. os << bg::svg(po, style);
  82. os << bg::svg(m_pt, m_style);
  83. os << bg::svg(m_ls, m_style);
  84. os << bg::svg(m_po, m_style);
  85. os << bg::svg(var, style);
  86. os << "</svg>";
  87. }
  88. {
  89. #ifdef TEST_WITH_SVG
  90. std::ofstream os("test2.svg", std::ios::trunc);
  91. #else
  92. std::stringstream os;
  93. #endif
  94. bg::svg_mapper<P> mapper(os, 500, 500);
  95. mapper.add(pt);
  96. mapper.add(b);
  97. mapper.add(s);
  98. mapper.add(ls);
  99. mapper.add(r);
  100. mapper.add(po);
  101. mapper.add(m_pt);
  102. mapper.add(m_ls);
  103. mapper.add(m_po);
  104. mapper.add(var);
  105. mapper.map(pt, style);
  106. mapper.map(b, style);
  107. mapper.map(s, style);
  108. mapper.map(ls, style);
  109. mapper.map(r, style);
  110. mapper.map(po, style);
  111. mapper.map(m_pt, m_style);
  112. mapper.map(m_ls, m_style);
  113. mapper.map(m_po, m_style);
  114. mapper.map(var, m_style);
  115. }
  116. }
  117. int test_main(int, char* [])
  118. {
  119. test_all< boost::geometry::model::d2::point_xy<double> >();
  120. test_all< boost::geometry::model::d2::point_xy<int> >();
  121. #if defined(HAVE_TTMATH)
  122. test_all< boost::geometry::model::d2::point_xy<ttmath_big> >();
  123. #endif
  124. return 0;
  125. }