diff --git a/src/cairo/cairo_renderer.cpp b/src/cairo/cairo_renderer.cpp index 162fd6096..e3a8f34e9 100644 --- a/src/cairo/cairo_renderer.cpp +++ b/src/cairo/cairo_renderer.cpp @@ -149,6 +149,7 @@ void cairo_renderer::setup(Map const& map) { cairo_save_restore guard(context_); context_.set_color(*bg); + context_.set_operator(composite_mode_e::src); context_.paint(); } boost::optional const& image_filename = map.background_image(); diff --git a/test/unit/map/background.cpp b/test/unit/map/background.cpp new file mode 100644 index 000000000..18c1b4bf6 --- /dev/null +++ b/test/unit/map/background.cpp @@ -0,0 +1,66 @@ + +#include "catch.hpp" + +#include +#include + +#if defined(HAVE_CAIRO) +#include +#include +#endif + +TEST_CASE("map") { + +SECTION("set background - agg") { + + mapnik::Map map(256, 256); + mapnik::image_rgba8 image(map.width(), map.height()); + const mapnik::color c1(255, 0, 0); + mapnik::fill(image, c1); + + CHECK(image(0, 0) == c1.rgba()); + + // Fully transparent black should replace red color + const mapnik::color c2(0, 0, 0, 0); + map.set_background(c2); + mapnik::agg_renderer ren(map, image); + ren.apply(); + + CHECK(image(0, 0) == c2.rgba()); +} + +#if defined(HAVE_CAIRO) +SECTION("set background - cairo") { + + mapnik::Map map(256, 256); + mapnik::cairo_surface_ptr image_surface( + cairo_image_surface_create(CAIRO_FORMAT_ARGB32, map.width(), map.height()), + mapnik::cairo_surface_closer()); + mapnik::cairo_ptr image_context(mapnik::create_context(image_surface)); + + cairo_set_source_rgba(image_context.get(), 1.0, 0.0, 0.0, 1.0); + cairo_paint(image_context.get()); + + { + mapnik::image_rgba8 image(map.width(), map.height()); + mapnik::cairo_image_to_rgba8(image, image_surface); + const mapnik::color c1(255, 0, 0); + CHECK(image(0, 0) == c1.rgba()); + } + + // Fully transparent black should replace red color + const mapnik::color c2(0, 0, 0, 0); + map.set_background(c2); + mapnik::cairo_renderer ren(map, image_context, 1.0); + ren.apply(); + + { + mapnik::image_rgba8 image(map.width(), map.height()); + mapnik::cairo_image_to_rgba8(image, image_surface); + CHECK(image(0, 0) == c2.rgba()); + } +} +#endif + +} +