Cairo: set version of SVG to 1.2

This commit is contained in:
Jiri Drbalek 2019-02-08 12:32:01 +00:00
parent 23492d6742
commit c2b1103cb6
3 changed files with 46 additions and 1 deletions

View file

@ -82,6 +82,7 @@ void save_to_cairo_file(mapnik::Map const& map,
else if (type == "svg") else if (type == "svg")
{ {
surface = cairo_surface_ptr(cairo_svg_surface_create(filename.c_str(),width,height),cairo_surface_closer()); surface = cairo_surface_ptr(cairo_svg_surface_create(filename.c_str(),width,height),cairo_surface_closer());
cairo_svg_surface_restrict_to_version(surface.get(), CAIRO_SVG_VERSION_1_2);
} }
#endif #endif
#ifdef CAIRO_HAS_PS_SURFACE #ifdef CAIRO_HAS_PS_SURFACE

View file

@ -0,0 +1,34 @@
#include "catch.hpp"
#include <mapnik/cairo_io.hpp>
#include <mapnik/util/fs.hpp>
#pragma GCC diagnostic push
#include <mapnik/warning_ignore.hpp>
#include <boost/filesystem/convenience.hpp>
#pragma GCC diagnostic pop
#include <fstream>
#if defined(HAVE_CAIRO)
TEST_CASE("cairo_io") {
SECTION("save_to_cairo_file - SVG") {
std::string directory_name("/tmp/mapnik-tests/");
boost::filesystem::create_directories(directory_name);
REQUIRE(mapnik::util::exists(directory_name));
std::string output_file(directory_name + "test_save_to_cairo_file.svg");
mapnik::Map map(256, 256);
mapnik::save_to_cairo_file(map, output_file);
std::ifstream stream(output_file, std::ios_base::in | std::ios_base::binary);
std::string actual_output(std::istreambuf_iterator<char>(stream.rdbuf()), std::istreambuf_iterator<char>());
// Check the Cairo SVG surface is using SVG 1.2
CHECK(actual_output.find("version=\"1.2\"") != std::string::npos);
}
}
#endif

View file

@ -180,7 +180,17 @@ struct cairo_vector_renderer : vector_renderer_base
}; };
#ifdef CAIRO_HAS_SVG_SURFACE #ifdef CAIRO_HAS_SVG_SURFACE
struct cairo_svg_renderer : cairo_vector_renderer<cairo_svg_surface_create_for_stream> inline cairo_surface_t *create_svg_1_2(cairo_write_func_t write_func,
void *closure,
double width,
double height)
{
cairo_surface_t * surface = cairo_svg_surface_create_for_stream(write_func, closure, width, height);
cairo_svg_surface_restrict_to_version(surface, CAIRO_SVG_VERSION_1_2);
return surface;
}
struct cairo_svg_renderer : cairo_vector_renderer<create_svg_1_2>
{ {
static constexpr const char * name = "cairo-svg"; static constexpr const char * name = "cairo-svg";
static constexpr const char * ext = ".svg"; static constexpr const char * ext = ".svg";