mirror of
https://github.com/mapnik/mapnik.git
synced 2025-12-08 20:13:09 +00:00
+ recentre SVG symbols before rendering
(todo: maybe better recentre SVGs at loading time)
This commit is contained in:
parent
3c8926a395
commit
77da818cd9
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user