+ recentre SVG symbols before rendering

(todo: maybe better recentre SVGs at loading time)
This commit is contained in:
Artem Pavlenko 2010-09-25 12:12:59 +00:00
parent 3c8926a395
commit 77da818cd9
3 changed files with 18 additions and 11 deletions

View File

@ -81,6 +81,8 @@ void agg_renderer<T>::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<double> extent(x1,y1,x2,y2);
@ -108,7 +110,7 @@ void agg_renderer<T>::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<T>::process(markers_symbolizer const& sym,
ras_ptr->reset();
agg::conv_stroke<agg::path_storage> 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<T>::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<T>::process(markers_symbolizer const& sym,
ras_ptr->reset();
agg::conv_stroke<agg::conv_transform<agg::path_storage, agg::trans_affine> > 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);
}

View File

@ -85,7 +85,9 @@ void agg_renderer<T>::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<svg_path_storage> stl_storage((*marker)->source());
svg_path_adapter svg_path(stl_storage);
svg_renderer<svg_path_adapter,
@ -102,6 +104,7 @@ void agg_renderer<T>::process(point_symbolizer const& sym,
agg::trans_affine tr;
boost::array<double,6> 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);

View File

@ -99,6 +99,8 @@ void agg_renderer<T>::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<T>::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<double> dim = text_ren.prepare_glyphs(&text_placement.placements[0]);
text_ren.render(x,y);
@ -237,7 +239,7 @@ void agg_renderer<T>::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<double>(px,py,px+w,py+h), feature, t_, writer.second);