text_symbolizer - ``geometry-transform`` support

This commit is contained in:
artemp 2014-08-06 14:54:38 +01:00
parent 9835057b0f
commit 0490b7887c
9 changed files with 69 additions and 41 deletions

View file

@ -56,7 +56,7 @@ struct placement_finder_adapter
};
using conv_types = boost::mpl::vector<clip_line_tag , transform_tag, simplify_tag, smooth_tag>;
using conv_types = boost::mpl::vector<clip_line_tag , transform_tag, affine_transform_tag, simplify_tag, smooth_tag>;
using vertex_converter_type = vertex_converter<box2d<double>, placement_finder_adapter<placement_finder> , symbolizer_base,
CoordTransform, proj_transform, agg::trans_affine,
conv_types, feature_impl>;
@ -122,7 +122,8 @@ public:
CoordTransform const& t,
FaceManagerT & font_manager,
DetectorT & detector,
box2d<double> const& query_extent);
box2d<double> const& query_extent,
agg::trans_affine const&);
template <typename FaceManagerT, typename DetectorT>
text_symbolizer_helper(shield_symbolizer const& sym,
@ -135,7 +136,8 @@ public:
CoordTransform const& t,
FaceManagerT & font_manager,
DetectorT & detector,
box2d<double> const& query_extent);
box2d<double> const& query_extent,
agg::trans_affine const&);
// Return all placements.
placements_list const& get();
@ -144,6 +146,7 @@ protected:
bool next_line_placement(bool clipped);
placement_finder finder_;
placement_finder_adapter<placement_finder> adapter_;
vertex_converter_type converter_;
//ShieldSymbolizer only
@ -151,4 +154,5 @@ protected:
};
} //namespace
#endif // SYMBOLIZER_HELPERS_HPP

View file

@ -34,16 +34,19 @@ namespace mapnik {
template <typename T0, typename T1>
void agg_renderer<T0,T1>::process(shield_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
box2d<double> clip_box = clipping_extent(common_);
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
text_symbolizer_helper helper(
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box);
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box, tr);
halo_rasterizer_enum halo_rasterizer = get<halo_rasterizer_enum>(sym, keys::halo_rasterizer, feature, common_.vars_, HALO_RASTERIZER_FULL);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);

View file

@ -33,17 +33,20 @@ namespace mapnik {
template <typename T0, typename T1>
void agg_renderer<T0,T1>::process(text_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
box2d<double> clip_box = clipping_extent(common_);
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
text_symbolizer_helper helper(
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box);
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box, tr);
halo_rasterizer_enum halo_rasterizer = get<halo_rasterizer_enum>(sym, keys::halo_rasterizer,feature, common_.vars_, HALO_RASTERIZER_FULL);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);
@ -55,13 +58,16 @@ void agg_renderer<T0,T1>::process(text_symbolizer const& sym,
common_.scale_factor_,
common_.font_manager_.get_stroker());
agg::trans_affine halo_transform;
auto transform = get_optional<transform_type>(sym, keys::halo_transform);
if (transform)
{
evaluate_transform(halo_transform, feature, common_.vars_, *transform);
ren.set_halo_transform(halo_transform);
{ // halo transform
agg::trans_affine halo_transform;
auto transform = get_optional<transform_type>(sym, keys::halo_transform);
if (transform)
{
evaluate_transform(halo_transform, feature, common_.vars_, *transform);
ren.set_halo_transform(halo_transform);
}
}
placements_list const& placements = helper.get();
for (glyph_positions_ptr glyphs : placements)
{

View file

@ -573,12 +573,15 @@ void cairo_renderer_base::process(shield_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
text_symbolizer_helper helper(
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
common_.query_extent_);
common_.query_extent_, tr);
cairo_save_restore guard(context_);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);
@ -969,12 +972,15 @@ void cairo_renderer_base::process(text_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
text_symbolizer_helper helper(
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
common_.query_extent_);
common_.query_extent_, tr);
cairo_save_restore guard(context_);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);

View file

@ -1,4 +1,3 @@
/*****************************************************************************
*
* This file is part of Mapnik (c++ mapping toolkit)
@ -43,12 +42,16 @@ void grid_renderer<T>::process(shield_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
text_symbolizer_helper helper(
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
common_.query_extent_);
common_.query_extent_, tr);
bool placement_found = false;
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);
@ -60,12 +63,12 @@ void grid_renderer<T>::process(shield_symbolizer const& sym,
placements_list const& placements = helper.get();
value_integer feature_id = feature.id();
for (glyph_positions_ptr glyphs : placements)
{
if (glyphs->marker())
{
render_marker(feature,
render_marker(feature,
pixmap_.get_resolution(),
glyphs->marker_pos(),
*(glyphs->marker()->marker),

View file

@ -36,12 +36,15 @@ void grid_renderer<T>::process(text_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
text_symbolizer_helper helper(
sym, feature, common_.vars_, prj_trans,
common_.width_, common_.height_,
common_.scale_factor_ * (1.0/pixmap_.get_resolution()),
common_.t_, common_.font_manager_, *common_.detector_,
common_.query_extent_);
common_.query_extent_, tr);
bool placement_found = false;
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);
@ -55,7 +58,7 @@ void grid_renderer<T>::process(text_symbolizer const& sym,
for (glyph_positions_ptr glyphs : placements)
{
ren.render(*glyphs, feature_id);
ren.render(*glyphs, feature_id);
placement_found = true;
}
if (placement_found)

View file

@ -104,7 +104,7 @@ void render_thunk_extractor::operator()(text_symbolizer const& sym) const
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box);
clip_box, agg::trans_affine());
extract_text_thunk(helper, sym);
}
@ -117,7 +117,7 @@ void render_thunk_extractor::operator()(shield_symbolizer const& sym) const
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box);
clip_box, agg::trans_affine());
extract_text_thunk(helper, sym);
}

View file

@ -178,11 +178,12 @@ text_symbolizer_helper::text_symbolizer_helper(
proj_transform const& prj_trans,
unsigned width, unsigned height, double scale_factor,
CoordTransform const& t, FaceManagerT & font_manager,
DetectorT &detector, box2d<double> const& query_extent)
DetectorT &detector, box2d<double> const& query_extent,
agg::trans_affine const& affine_trans)
: base_symbolizer_helper(sym, feature, vars, prj_trans, width, height, scale_factor, t, query_extent),
finder_(feature, vars, detector, dims_, *placement_, font_manager, scale_factor),
adapter_(finder_,false),
converter_(query_extent_, adapter_, sym_, t, prj_trans, agg::trans_affine(), feature, vars, scale_factor)
converter_(query_extent_, adapter_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
{
// setup vertex converter
@ -270,13 +271,13 @@ text_symbolizer_helper::text_symbolizer_helper(
proj_transform const& prj_trans,
unsigned width, unsigned height, double scale_factor,
CoordTransform const& t, FaceManagerT & font_manager,
DetectorT & detector, box2d<double> const& query_extent)
DetectorT & detector, box2d<double> const& query_extent, agg::trans_affine const& affine_trans)
: base_symbolizer_helper(sym, feature, vars, prj_trans, width, height, scale_factor, t, query_extent),
finder_(feature, vars, detector, dims_, *placement_, font_manager, scale_factor),
adapter_(finder_,true),
converter_(query_extent_, adapter_, sym_, t, prj_trans, agg::trans_affine(), feature, vars, scale_factor)
converter_(query_extent_, adapter_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
{
// setup vertex converter
// setup vertex converter
bool clip = mapnik::get<bool>(sym_, keys::clip, feature_, vars_, false);
double simplify_tolerance = mapnik::get<double>(sym_, keys::simplify_tolerance, feature_, vars_, 0.0);
double smooth = mapnik::get<double>(sym_, keys::smooth, feature_, vars_, 0.0);
@ -342,7 +343,8 @@ template text_symbolizer_helper::text_symbolizer_helper(
CoordTransform const& t,
face_manager<freetype_engine> &font_manager,
label_collision_detector4 &detector,
box2d<double> const& query_extent);
box2d<double> const& query_extent,
agg::trans_affine const&);
template text_symbolizer_helper::text_symbolizer_helper(
shield_symbolizer const& sym,
@ -355,5 +357,6 @@ template text_symbolizer_helper::text_symbolizer_helper(
CoordTransform const& t,
face_manager<freetype_engine> &font_manager,
label_collision_detector4 &detector,
box2d<double> const& query_extent);
box2d<double> const& query_extent,
agg::trans_affine const&);
} //namespace

View file

@ -2,7 +2,7 @@
<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,100,100)">
<Style name="road">
<Rule>
<LineSymbolizer stroke="rgb(255,255,255)" stroke-opacity="0.7"/>
<LineSymbolizer stroke="rgb(255,255,255)" stroke-opacity="0.7" smooth="4"/>
</Rule>
<Rule>
<TextSymbolizer placement="line" label-position-tolerance="50" spacing="20" minimum-distance="5" face-name="DejaVu Sans Book" size="20" halo-radius="1" halo-fill="rgb(255,255,0)">[NAME]</TextSymbolizer>