diff --git a/include/mapnik/raster_symbolizer.hpp b/include/mapnik/raster_symbolizer.hpp index 454c0f663b..657c3fbd2b 100644 --- a/include/mapnik/raster_symbolizer.hpp +++ b/include/mapnik/raster_symbolizer.hpp @@ -30,6 +30,7 @@ // boost #include +#include namespace mapnik { diff --git a/src/agg/process_raster_symbolizer.cpp b/src/agg/process_raster_symbolizer.cpp index d0a7018239..b8287208e9 100644 --- a/src/agg/process_raster_symbolizer.cpp +++ b/src/agg/process_raster_symbolizer.cpp @@ -98,9 +98,20 @@ void agg_renderer::process(raster_symbolizer const& sym, filter_radius); } } + // handle whether to premultiply the source + // data before compositing + // first, default to what the data reports + bool premultiply_source = !source->premultiplied_alpha_; + // the, allow the user to override + boost::optional is_premultiplied = sym.premultiplied(); + if (is_premultiplied) + { + if (*is_premultiplied) premultiply_source = false; + else premultiply_source = true; + } composite(current_buffer_->data(), target.data_, sym.comp_op(), sym.get_opacity(), - start_x, start_y, !source->premultiplied_alpha_); + start_x, start_y, premultiply_source); } } } diff --git a/src/raster_symbolizer.cpp b/src/raster_symbolizer.cpp index b70657ea4b..cfdf4c6327 100644 --- a/src/raster_symbolizer.cpp +++ b/src/raster_symbolizer.cpp @@ -55,7 +55,8 @@ raster_symbolizer::raster_symbolizer(raster_symbolizer const& rhs) opacity_(rhs.opacity_), colorizer_(rhs.colorizer_), filter_factor_(rhs.filter_factor_), - mesh_size_(rhs.mesh_size_) {} + mesh_size_(rhs.mesh_size_), + premultiplied_(rhs.premultiplied_) {} std::string const& raster_symbolizer::get_mode() const { diff --git a/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml b/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml index 358a2260bb..6dae4a4efa 100644 --- a/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml +++ b/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml @@ -4,7 +4,7 @@ - +