Added generation of SVG root element with width and height attributes. Also added test for testing the output generated by svg_renderer (combined_test.cpp).

This commit is contained in:
Carlos López 2010-07-20 06:41:16 +00:00
parent 1b535430cb
commit bb44d76ee1
3 changed files with 101 additions and 9 deletions

View file

@ -94,13 +94,19 @@ namespace mapnik
return output_stream_;
}
// constant variable that stores the xml declaration.
// XML declaration.
static const std::string XML_DECLARATION;
// constant variable that stores the dtd urls.
// DTD urls.
static const std::string SVG_DTD;
// SVG version to which the generated document will be compliant.
static const double SVG_VERSION;
// SVG XML namespace url.
static const std::string SVG_NAMESPACE_URL;
private:
T& output_stream_;
const int width_;
const int height_;
};
}

View file

@ -32,9 +32,11 @@
// boost.spirit
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/karma_string.hpp>
#include <boost/spirit/repository/include/karma_confix.hpp>
namespace karma = boost::spirit::karma;
namespace repository = boost::spirit::repository;
namespace ascii = karma::ascii;
namespace mapnik
{
@ -48,10 +50,21 @@ namespace mapnik
template <typename T>
const std::string svg_renderer<T>::SVG_DTD = "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">";
/*
* I'm not sure if these values should be stored or directly put inside
* a generator expression.
*/
template <typename T>
const double svg_renderer<T>::SVG_VERSION = 1.1;
template <typename T>
const std::string svg_renderer<T>::SVG_NAMESPACE_URL = "http://www.w3.org/2000/svg";
template <typename T>
svg_renderer<T>::svg_renderer(Map const& m, T & output_stream) :
feature_style_processor<svg_renderer>(m),
output_stream_(output_stream)
output_stream_(output_stream),
width_(m.width()),
height_(m.height())
{
// nothing yet.
}
@ -59,8 +72,6 @@ namespace mapnik
template <typename T>
svg_renderer<T>::~svg_renderer() {}
// only empty methods for now.
template <typename T>
void svg_renderer<T>::start_map_processing(Map const& map)
{
@ -68,17 +79,44 @@ namespace mapnik
std::clog << "start map processing" << std::endl;
#endif
output_stream_ << karma::format(karma::lit(XML_DECLARATION) << karma::eol << karma::lit(SVG_DTD), "");
using repository::confix;
using karma::format;
using karma::lit;
using karma::eol;
using karma::int_;
using karma::double_;
using ascii::string;
using ascii::space;
// should I move these lines to the constructor?
// generate XML header.
output_stream_ << format(lit(XML_DECLARATION) << eol << lit(SVG_DTD) << eol);
// generate SVG root element opening tag.
output_stream_
<< format(
confix("<svg width=\"", "\"")[int_ << string],
width_, "px")
<< format(
confix(" height=\"", "\"")[int_ << string],
height_, "px")
<< format(
confix(" version=\"", "\"")[double_],
SVG_VERSION)
<< format(
confix(" xmlns=\"", "\">")[string],
SVG_NAMESPACE_URL);
}
template <typename T>
void svg_renderer<T>::end_map_processing(Map const& map)
{
// nothing yet.
#ifdef MAPNIK_DEBUG
std::clog << "end map processing" << std::endl;
#endif
// generate SVG root element closing tag.
}
template <typename T>

View file

@ -0,0 +1,48 @@
#define BOOST_TEST_MODULE combined_tests
// boost.test
#include <boost/test/included/unit_test.hpp>
// mapnik
#include <mapnik/map.hpp>
#include <mapnik/svg_renderer.hpp>
// std
#include <string>
#include <sstream>
/**
* This test case tests all the generators inside svg_renderer,
* verifying the correctness of the whole SVG document.
*
* The test sets the svg_renderer object with a simple Map that
* has only its dimensions specified and calls the apply()
* method to produce the output.
*
* The output stream is a stringstream (the output is generated
* into a stringstream).
*/
BOOST_AUTO_TEST_CASE(combined_test_case)
{
using namespace mapnik;
typedef svg_renderer<std::stringstream> svg_ren;
Map map(800, 600);
std::stringstream output_stream;
svg_ren renderer(map, output_stream);
renderer.apply();
std::string expected_output =
svg_ren::XML_DECLARATION
+ "\n"
+ svg_ren::SVG_DTD
+ "\n"
+ "<svg width=\"800px\" height=\"600px\" version=\"1.1\" xmlns=\""
+ svg_ren::SVG_NAMESPACE_URL
+ "\">";
std::string actual_output = renderer.get_output_stream().str();
BOOST_CHECK_EQUAL(actual_output, expected_output);
}