From 77da818cd92f8b204a71c19eb0eb254bc26a43ce Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Sat, 25 Sep 2010 12:12:59 +0000 Subject: [PATCH] + recentre SVG symbols before rendering (todo: maybe better recentre SVGs at loading time) --- src/agg/process_markers_symbolizer.cpp | 18 ++++++++++-------- src/agg/process_point_symbolizer.cpp | 5 ++++- src/agg/process_shield_symbolizer.cpp | 6 ++++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp index af974175a..cee8f2819 100644 --- a/src/agg/process_markers_symbolizer.cpp +++ b/src/agg/process_markers_symbolizer.cpp @@ -81,6 +81,8 @@ void agg_renderer::process(markers_symbolizer const& sym, double y1 = bbox.miny(); double x2 = bbox.maxx(); double y2 = bbox.maxy(); + + agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2)); tr.transform(&x1,&y1); tr.transform(&x2,&y2); box2d extent(x1,y1,x2,y2); @@ -108,7 +110,7 @@ void agg_renderer::process(markers_symbolizer const& sym, while (placement.get_point(&x, &y, &angle)) { - agg::trans_affine matrix = tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y); + agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y); svg_renderer.render(*ras_ptr, sl, ren, matrix, renb.clip_box(), sym.get_opacity()); if (writer.first) //writer.first->add_box(label_ext, feature, t_, writer.second); @@ -199,7 +201,7 @@ void agg_renderer::process(markers_symbolizer const& sym, ras_ptr->reset(); agg::conv_stroke outline(marker); outline.generator().width(strk_width * scale_factor_); - ras_ptr->add_path(outline); + ras_ptr->add_path(outline); ren.color(agg::rgba8(s_r, s_g, s_b, int(s_a*stroke_.get_opacity()))); agg::render_scanlines(*ras_ptr, sl_line, ren); @@ -230,11 +232,11 @@ void agg_renderer::process(markers_symbolizer const& sym, // todo proper bbox - this is buggy agg::ellipse c(x_t, y_t, w, h); marker.concat_path(c); - agg::trans_affine matrix; - matrix *= agg::trans_affine_translation(-x_t,-y_t); - matrix *= agg::trans_affine_rotation(angle); - matrix *= agg::trans_affine_translation(x_t,y_t); - marker.transform(matrix); + agg::trans_affine matrix; + matrix *= agg::trans_affine_translation(-x_t,-y_t); + matrix *= agg::trans_affine_rotation(angle); + matrix *= agg::trans_affine_translation(x_t,y_t); + marker.transform(matrix); } else @@ -259,7 +261,7 @@ void agg_renderer::process(markers_symbolizer const& sym, ras_ptr->reset(); agg::conv_stroke > outline(trans); outline.generator().width(strk_width * scale_factor_); - ras_ptr->add_path(outline); + ras_ptr->add_path(outline); ren.color(agg::rgba8(s_r, s_g, s_b, int(s_a*stroke_.get_opacity()))); agg::render_scanlines(*ras_ptr, sl_line, ren); } diff --git a/src/agg/process_point_symbolizer.cpp b/src/agg/process_point_symbolizer.cpp index eaccafba3..449e63b46 100644 --- a/src/agg/process_point_symbolizer.cpp +++ b/src/agg/process_point_symbolizer.cpp @@ -85,7 +85,9 @@ void agg_renderer::process(point_symbolizer const& sym, double y1 = bbox.miny(); double x2 = bbox.maxx(); double y2 = bbox.maxy(); - + + agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2)); + vertex_stl_adapter stl_storage((*marker)->source()); svg_path_adapter svg_path(stl_storage); svg_renderer::process(point_symbolizer const& sym, agg::trans_affine tr; boost::array const& m = sym.get_transform(); tr.load_from(&m[0]); + tr *= recenter; tr *= agg::trans_affine_scaling(scale_factor_); tr *= agg::trans_affine_translation(x, y); diff --git a/src/agg/process_shield_symbolizer.cpp b/src/agg/process_shield_symbolizer.cpp index 566c83160..72d335313 100644 --- a/src/agg/process_shield_symbolizer.cpp +++ b/src/agg/process_shield_symbolizer.cpp @@ -99,6 +99,8 @@ void agg_renderer::process(shield_symbolizer const& sym, double y1 = bbox.miny(); double x2 = bbox.maxx(); double y2 = bbox.maxy(); + + agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2)); tr.transform(&x1,&y1); tr.transform(&x2,&y2); @@ -208,7 +210,7 @@ void agg_renderer::process(shield_symbolizer const& sym, if ( sym.get_allow_overlap() || detector_.has_placement(label_ext) ) { - agg::trans_affine matrix = tr * agg::trans_affine_translation(px, py); + agg::trans_affine matrix = recenter * tr * agg::trans_affine_translation(px, py); svg_renderer.render(*ras_ptr, sl, ren, matrix, renb.clip_box(), sym.get_opacity()); box2d dim = text_ren.prepare_glyphs(&text_placement.placements[0]); text_ren.render(x,y); @@ -237,7 +239,7 @@ void agg_renderer::process(shield_symbolizer const& sym, int px=int(x + 0.5); int py=int(y + 0.5); - agg::trans_affine matrix = tr * agg::trans_affine_translation(px, py); + agg::trans_affine matrix = recenter * tr * agg::trans_affine_translation(px, py); svg_renderer.render(*ras_ptr, sl, ren, matrix, renb.clip_box(), sym.get_opacity()); if (writer.first) writer.first->add_box(box2d(px,py,px+w,py+h), feature, t_, writer.second);