Add shield symbolizer support in group symbolizer processing.

Update some test cases to use ShieldSymbolizer instead of point and text.
This commit is contained in:
Jordan Hollinger 2014-02-25 08:53:35 -05:00
parent 07dc6e37a2
commit 08ea56996a
7 changed files with 63 additions and 20 deletions

View file

@ -86,11 +86,12 @@ struct text_render_thunk
// ensure the lifetime is the same.
placements_list placements_;
std::shared_ptr<std::vector<glyph_info> > glyphs_;
double opacity_;
composite_mode_e comp_op_;
halo_rasterizer_enum halo_rasterizer_;
text_render_thunk(placements_list const &placements,
composite_mode_e comp_op,
double opacity, composite_mode_e comp_op,
halo_rasterizer_enum halo_rasterizer);
};
@ -123,13 +124,17 @@ struct render_thunk_extractor : public boost::static_visitor<>
void operator()(text_symbolizer const &sym) const;
void operator()(shield_symbolizer const &sym) const;
template <typename T>
void operator()(T const &) const
{
// TODO: warning if unimplemented?
}
protected:
private:
void extract_text_thunk(text_symbolizer_helper &helper, text_symbolizer const &sym) const;
box2d<double> &box_;
render_thunk_list &thunks_;
mapnik::feature_impl &feature_;

View file

@ -74,7 +74,15 @@ struct thunk_renderer : public boost::static_visitor<>
render_offset_placements(
thunk.placements_,
offset_,
[&] (glyph_positions_ptr glyphs) {
[&] (glyph_positions_ptr glyphs)
{
if (glyphs->marker())
{
ren_.render_marker(glyphs->marker_pos(),
*(glyphs->marker()->marker),
glyphs->marker()->transform,
thunk.opacity_, thunk.comp_op_);
}
ren.render(*glyphs);
});
}

View file

@ -1048,7 +1048,15 @@ struct thunk_renderer : public boost::static_visitor<>
render_offset_placements(
thunk.placements_,
offset_,
[&] (glyph_positions_ptr glyphs) {
[&] (glyph_positions_ptr glyphs)
{
if (glyphs->marker())
{
ren_.render_marker(glyphs->marker_pos(),
*(glyphs->marker()->marker),
glyphs->marker()->transform,
thunk.opacity_, thunk.comp_op_);
}
context_.add_text(glyphs, face_manager_, common_.font_manager_, common_.scale_factor_);
});
}

View file

@ -83,7 +83,16 @@ struct thunk_renderer : public boost::static_visitor<>
render_offset_placements(
thunk.placements_,
offset_,
[&] (glyph_positions_ptr glyphs) {
[&] (glyph_positions_ptr glyphs)
{
if (glyphs->marker())
{
ren_.render_marker(feature_, pixmap_.get_resolution(),
glyphs->marker_pos(),
*(glyphs->marker()->marker),
glyphs->marker()->transform,
thunk.opacity_, thunk.comp_op_);
}
ren.render(*glyphs, feature_id);
});
}

View file

@ -33,10 +33,10 @@ point_render_thunk::point_render_thunk(pixel_position const &pos, marker const &
text_render_thunk::text_render_thunk(placements_list const &placements,
composite_mode_e comp_op,
double opacity, composite_mode_e comp_op,
halo_rasterizer_enum halo_rasterizer)
: placements_(), glyphs_(std::make_shared<std::vector<glyph_info> >()),
comp_op_(comp_op), halo_rasterizer_(halo_rasterizer)
opacity_(opacity), comp_op_(comp_op), halo_rasterizer_(halo_rasterizer)
{
std::vector<glyph_info> &glyph_vec = *glyphs_;
@ -105,11 +105,30 @@ void render_thunk_extractor::operator()(text_symbolizer const &sym) const
common_.t_, common_.font_manager_, *common_.detector_,
clip_box);
extract_text_thunk(helper, sym);
}
void render_thunk_extractor::operator()(shield_symbolizer const &sym) const
{
box2d<double> clip_box = clipping_extent_;
text_symbolizer_helper helper(
sym, feature_, prj_trans_,
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
clip_box);
extract_text_thunk(helper, sym);
}
void render_thunk_extractor::extract_text_thunk(text_symbolizer_helper &helper, text_symbolizer const &sym) const
{
double opacity = get<double>(sym, keys::opacity, feature_, 1.0);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature_, src_over);
halo_rasterizer_enum halo_rasterizer = get<halo_rasterizer_enum>(sym, keys::halo_rasterizer, HALO_RASTERIZER_FULL);
placements_list const& placements = helper.get();
text_render_thunk thunk(placements, comp_op, halo_rasterizer);
text_render_thunk thunk(placements, opacity, comp_op, halo_rasterizer);
thunks_.push_back(std::make_shared<render_thunk>(thunk));
update_box();

View file

@ -20,9 +20,8 @@ wkt,name1,ref1,name2,ref2
<GroupSymbolizer start-column="1" num-columns="2" placement="line" avoid-edges="false" minimum-distance="50" spacing="100" repeat-key="[name%]+'-'+[ref%]">
<PairLayout item-margin="1"/>
<GroupRule>
<PointSymbolizer file="../../data/svg/rect.svg"/>
<ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="16" placement="point" dy="0" fill="#ffffff">[ref%]</ShieldSymbolizer>
<TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="10">[name%]</TextSymbolizer>
<TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="0" fill="#ffffff">[ref%]</TextSymbolizer>
</GroupRule>
</GroupSymbolizer>
</Rule>
@ -45,9 +44,8 @@ wkt,name1,ref1,name2,ref2
<GroupSymbolizer start-column="1" num-columns="2" placement="line" avoid-edges="false" minimum-distance="40" spacing="80" repeat-key="[name%]+'-'+[ref%]">
<PairLayout item-margin="1"/>
<GroupRule>
<PointSymbolizer file="../../data/svg/rect.svg"/>
<ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="16" placement="point" dy="0" fill="#ffffff">[ref%]</ShieldSymbolizer>
<TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="10">[name%]</TextSymbolizer>
<TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="0" fill="#ffffff">[ref%]</TextSymbolizer>
</GroupRule>
</GroupSymbolizer>
</Rule>
@ -70,9 +68,8 @@ wkt,name1,ref1,name2,ref2
<GroupSymbolizer start-column="1" num-columns="2" placement="line" avoid-edges="false" minimum-distance="30" spacing="60" repeat-key="[name%]+'-'+[ref%]">
<PairLayout item-margin="1"/>
<GroupRule>
<PointSymbolizer file="../../data/svg/rect.svg"/>
<ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="16" placement="point" dy="0" fill="#ffffff">[ref%]</ShieldSymbolizer>
<TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="10">[name%]</TextSymbolizer>
<TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="0" fill="#ffffff">[ref%]</TextSymbolizer>
</GroupRule>
</GroupSymbolizer>
<DebugSymbolizer/>

View file

@ -25,8 +25,7 @@ wkt,key1,key2
<GroupSymbolizer start-column="1" num-columns="1" placement="point" avoid-edges="false" minimum-distance="1" spacing="1" repeat-key="[key%]">
<PairLayout item-margin="1"/>
<GroupRule>
<PointSymbolizer file="../../data/svg/rect.svg"/>
<TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#ff0000">[key%]</TextSymbolizer>
<ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#ff0000">[key%]</ShieldSymbolizer>
</GroupRule>
</GroupSymbolizer>
</Rule>
@ -51,8 +50,7 @@ wkt,name1,ref1,name2,ref2
<GroupSymbolizer start-column="1" num-columns="1" placement="line" avoid-edges="false" minimum-distance="20" spacing="1" repeat-key="bar">
<PairLayout item-margin="1"/>
<GroupRule>
<PointSymbolizer file="../../data/svg/rect.svg"/>
<TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#ffffff">bar</TextSymbolizer>
<ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#ffffff">bar</ShieldSymbolizer>
</GroupRule>
</GroupSymbolizer>
</Rule>
@ -77,8 +75,7 @@ wkt,name1,ref1,name2,ref2
<GroupSymbolizer start-column="1" num-columns="1" placement="line" avoid-edges="false" minimum-distance="20" spacing="1" repeat-key="foo">
<PairLayout item-margin="1"/>
<GroupRule>
<PointSymbolizer file="../../data/svg/rect.svg"/>
<TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#000000">foo</TextSymbolizer>
<ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#000000">foo</ShieldSymbolizer>
</GroupRule>
</GroupSymbolizer>
</Rule>