diff --git a/include/mapnik/cairo_renderer.hpp b/include/mapnik/cairo_renderer.hpp index 5fe02fd10..b9fd544fc 100644 --- a/include/mapnik/cairo_renderer.hpp +++ b/include/mapnik/cairo_renderer.hpp @@ -58,9 +58,23 @@ class marker; class MAPNIK_DECL cairo_renderer_base : private mapnik::noncopyable { protected: - cairo_renderer_base(Map const& m, cairo_ptr const& cairo, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); - cairo_renderer_base(Map const& m, request const& req, cairo_ptr const& cairo, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); - cairo_renderer_base(Map const& m, cairo_ptr const& cairo, boost::shared_ptr detector, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + cairo_renderer_base(Map const& m, + cairo_ptr const& cairo, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer_base(Map const& m, + request const& req, + cairo_ptr const& cairo, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer_base(Map const& m, + cairo_ptr const& cairo, + boost::shared_ptr detector, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); public: ~cairo_renderer_base(); void start_map_processing(Map const& map); @@ -115,10 +129,13 @@ public: return DEFAULT; } - void render_marker(pixel_position const& pos, marker const& marker, const agg::trans_affine & mtx, double opacity=1.0, bool recenter=true); + void render_marker(pixel_position const& pos, + marker const& marker, + agg::trans_affine const& mtx, + double opacity=1.0, + bool recenter=true); void render_box(box2d const& b); protected: - Map const& m_; cairo_context context_; unsigned width_; @@ -139,9 +156,23 @@ class MAPNIK_DECL cairo_renderer : public feature_style_processor detector, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0); + cairo_renderer(Map const& m, + T const& obj, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer(Map const& m, + request const& req, + T const& obj, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); + cairo_renderer(Map const& m, + T const& obj, + boost::shared_ptr detector, + double scale_factor=1.0, + unsigned offset_x=0, + unsigned offset_y=0); void end_map_processing(Map const& map); }; } diff --git a/include/mapnik/svg/svg_converter.hpp b/include/mapnik/svg/svg_converter.hpp index d0e7dfcb5..2ccf9da56 100644 --- a/include/mapnik/svg/svg_converter.hpp +++ b/include/mapnik/svg/svg_converter.hpp @@ -264,6 +264,7 @@ public: { cur_attr().fill_opacity = op; } + void stroke_opacity(double op) { cur_attr().stroke_opacity = op; @@ -271,8 +272,7 @@ public: void opacity(double op) { - cur_attr().stroke_opacity = op; - cur_attr().fill_opacity = op; + cur_attr().opacity = op; } void line_join(agg::line_join_e join) diff --git a/include/mapnik/svg/svg_path_attributes.hpp b/include/mapnik/svg/svg_path_attributes.hpp index db14ccc28..3a09e8e6b 100644 --- a/include/mapnik/svg/svg_path_attributes.hpp +++ b/include/mapnik/svg/svg_path_attributes.hpp @@ -38,6 +38,7 @@ namespace svg { struct path_attributes { unsigned index; + double opacity; agg::rgba8 fill_color; double fill_opacity; agg::rgba8 stroke_color; @@ -58,6 +59,7 @@ struct path_attributes // Empty constructor path_attributes() : index(0), + opacity(1.0), fill_color(agg::rgba(0,0,0)), fill_opacity(1.0), stroke_color(agg::rgba(0,0,0)), @@ -80,6 +82,7 @@ struct path_attributes // Copy constructor path_attributes(const path_attributes& attr) : index(attr.index), + opacity(attr.opacity), fill_color(attr.fill_color), fill_opacity(attr.fill_opacity), stroke_color(attr.stroke_color), @@ -101,6 +104,7 @@ struct path_attributes // Copy constructor with new index value path_attributes(path_attributes const& attr, unsigned idx) : index(idx), + opacity(attr.opacity), fill_color(attr.fill_color), fill_opacity(attr.fill_opacity), stroke_color(attr.stroke_color), diff --git a/include/mapnik/svg/svg_renderer_agg.hpp b/include/mapnik/svg/svg_renderer_agg.hpp index 5d0032e9b..778e726ca 100644 --- a/include/mapnik/svg/svg_renderer_agg.hpp +++ b/include/mapnik/svg/svg_renderer_agg.hpp @@ -290,13 +290,13 @@ public: if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT) { - render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.fill_opacity * opacity, symbol_bbox, path_bbox); + render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.fill_opacity * attr.opacity * opacity, symbol_bbox, path_bbox); } else { ras.filling_rule(attr.even_odd_flag ? fill_even_odd : fill_non_zero); color = attr.fill_color; - color.opacity(color.opacity() * attr.fill_opacity * opacity); + color.opacity(color.opacity() * attr.fill_opacity * attr.opacity * opacity); ScanlineRenderer ren_s(ren); color.premultiply(); ren_s.color(color); @@ -326,13 +326,13 @@ public: if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT) { - render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.stroke_opacity * opacity, symbol_bbox, path_bbox); + render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.stroke_opacity * attr.opacity * opacity, symbol_bbox, path_bbox); } else { ras.filling_rule(fill_non_zero); color = attr.stroke_color; - color.opacity(color.opacity() * attr.stroke_opacity * opacity); + color.opacity(color.opacity() * attr.stroke_opacity * attr.opacity * opacity); ScanlineRenderer ren_s(ren); color.premultiply(); ren_s.color(color); diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index f3cec1438..88a83928c 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -613,7 +613,11 @@ void render_vector_marker(cairo_context & context, pixel_position const& pos, ma } -void cairo_renderer_base::render_marker(pixel_position const& pos, marker const& marker, const agg::trans_affine & tr, double opacity, bool recenter) +void cairo_renderer_base::render_marker(pixel_position const& pos, + marker const& marker, + agg::trans_affine const& tr, + double opacity, + bool recenter) { cairo_save_restore guard(context_); diff --git a/src/svg/svg_parser.cpp b/src/svg/svg_parser.cpp index ed6b23979..eae0d54a1 100644 --- a/src/svg/svg_parser.cpp +++ b/src/svg/svg_parser.cpp @@ -411,8 +411,7 @@ void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value ) else if(xmlStrEqual(name, BAD_CAST "opacity")) { double opacity = parse_double((const char*)value); - path_.stroke_opacity(opacity); - path_.fill_opacity(opacity); + path_.opacity(opacity); } else if (xmlStrEqual(name, BAD_CAST "visibility")) { diff --git a/tests/data/svg/rect2.svg b/tests/data/svg/rect2.svg new file mode 100644 index 000000000..37907075f --- /dev/null +++ b/tests/data/svg/rect2.svg @@ -0,0 +1,39 @@ + + + + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json new file mode 100644 index 000000000..c9c95ba75 --- /dev/null +++ b/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json @@ -0,0 +1,37 @@ +{ + "keys": [ + "", + "4", + "3", + "2", + "1" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " !!! ", + " !!! ", + " !!! ", + " ", + " ", + " ### ", + " ### ", + " ### ", + " ", + " ", + " $$$ ", + " $$$ ", + " $$$ ", + " ", + " ", + " %%% ", + " %%% ", + " %%% ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png new file mode 100644 index 000000000..11c31d9e0 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png differ diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png new file mode 100644 index 000000000..b480bab64 Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png new file mode 100644 index 000000000..4d5ac73ae Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png differ diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png new file mode 100644 index 000000000..148dfc66f Binary files /dev/null and b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png differ diff --git a/tests/visual_tests/styles/marker-svg-opacity.xml b/tests/visual_tests/styles/marker-svg-opacity.xml new file mode 100644 index 000000000..43a00467b --- /dev/null +++ b/tests/visual_tests/styles/marker-svg-opacity.xml @@ -0,0 +1,58 @@ + + + + + + ellipse + + csv + +x,y,id +1,1,1 +2,2,2 +3,3,3 +4,4,4 + + + + + + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ No newline at end of file