From efa1b95cb87a41458a7df223fc22f020b8ca0b51 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 16 Nov 2011 09:56:35 -0800 Subject: [PATCH] add support for rendering svg icons with point placement in markers symbolizer (originally markers just supported special line placement) - closes #953 - refs #952 --- src/agg/process_markers_symbolizer.cpp | 59 ++++++++++++++++++-------- src/cairo_renderer.cpp | 1 + 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp index 0765bcf6f..dd4e89194 100644 --- a/src/agg/process_markers_symbolizer.cpp +++ b/src/agg/process_markers_symbolizer.cpp @@ -86,6 +86,8 @@ void agg_renderer::process(markers_symbolizer const& sym, double y1 = bbox.miny(); double x2 = bbox.maxx(); double y2 = bbox.maxy(); + int w = (*mark)->width(); + int h = (*mark)->height(); agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2)); tr.transform(&x1,&y1); @@ -102,26 +104,47 @@ void agg_renderer::process(markers_symbolizer const& sym, for (unsigned i=0; ihas_placement(extent)) + { + + render_marker(floor(x - 0.5 * w),floor(y - 0.5 * h) ,**mark,tr, sym.get_opacity()); + + // TODO - impl this for markers? + //if (!sym.get_ignore_placement()) + // detector_->insert(label_ext); + metawriter_with_properties writer = sym.get_metawriter(); + if (writer.first) writer.first->add_box(extent, feature, t_, writer.second); + } + } + else + { + path_type path(t_,geom,prj_trans); + markers_placement placement(path, extent, *detector_, + sym.get_spacing() * scale_factor_, + sym.get_max_error(), + sym.get_allow_overlap()); + double x, y, angle; - path_type path(t_,geom,prj_trans); - markers_placement placement(path, extent, *detector_, - sym.get_spacing() * scale_factor_, - sym.get_max_error(), - sym.get_allow_overlap()); - double x, y, angle; - - while (placement.get_point(&x, &y, &angle)) - { - agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y); - svg_renderer.render(*ras_ptr, sl, renb, matrix, sym.get_opacity(),bbox); - if (writer.first) - //writer.first->add_box(label_ext, feature, t_, writer.second); - std::clog << "### Warning metawriter not yet supported for LINE placement\n"; + while (placement.get_point(&x, &y, &angle)) + { + agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y); + svg_renderer.render(*ras_ptr, sl, renb, matrix, sym.get_opacity(),bbox); + if (writer.first) + //writer.first->add_box(label_ext, feature, t_, writer.second); + std::clog << "### Warning metawriter not yet supported for LINE placement\n"; + } } } } diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index 668c8ebbd..f47d78e7e 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -1419,6 +1419,7 @@ void cairo_renderer_base::process(raster_symbolizer const& sym, } } +// TODO - this is woefully behind the AGG version. void cairo_renderer_base::process(markers_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans)