parse comp-op property as enumeration_wrapper or expression_str
This commit is contained in:
parent
0702679bb0
commit
aa9966ed88
3 changed files with 75 additions and 29 deletions
|
@ -51,6 +51,8 @@
|
||||||
// boost
|
// boost
|
||||||
#include <boost/variant/variant_fwd.hpp>
|
#include <boost/variant/variant_fwd.hpp>
|
||||||
#include <boost/concept_check.hpp>
|
#include <boost/concept_check.hpp>
|
||||||
|
// agg
|
||||||
|
#include "agg_pixfmt_rgba.h"
|
||||||
|
|
||||||
namespace agg { struct trans_affine; }
|
namespace agg { struct trans_affine; }
|
||||||
|
|
||||||
|
@ -186,6 +188,19 @@ struct expression_result<T,false>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct expression_result<agg::comp_op_e,true>
|
||||||
|
{
|
||||||
|
typedef agg::comp_op_e result_type;
|
||||||
|
static result_type convert(value_type const& val)
|
||||||
|
{
|
||||||
|
auto result = comp_op_from_string(val.to_string());
|
||||||
|
if (result) return static_cast<result_type>(*result);
|
||||||
|
return agg::comp_op_src_over;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// enum
|
// enum
|
||||||
template <typename T, bool is_enum = true>
|
template <typename T, bool is_enum = true>
|
||||||
struct enumeration_result
|
struct enumeration_result
|
||||||
|
|
|
@ -81,7 +81,8 @@ void agg_renderer<T0,T1>::process(polygon_symbolizer const& sym,
|
||||||
typedef agg::renderer_base<pixfmt_comp_type> renderer_base;
|
typedef agg::renderer_base<pixfmt_comp_type> renderer_base;
|
||||||
typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_type;
|
typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_type;
|
||||||
pixfmt_comp_type pixf(buf);
|
pixfmt_comp_type pixf(buf);
|
||||||
pixf.comp_op(get<agg::comp_op_e>(sym, keys::comp_op, feature, common_.vars_, agg::comp_op_src_over));
|
auto comp_op = get<agg::comp_op_e>(sym, keys::comp_op, feature, common_.vars_, agg::comp_op_src_over);
|
||||||
|
pixf.comp_op(comp_op);
|
||||||
renderer_base renb(pixf);
|
renderer_base renb(pixf);
|
||||||
renderer_type ren(renb);
|
renderer_type ren(renb);
|
||||||
ren.color(agg::rgba8_pre(r, g, b, int(a * opacity)));
|
ren.color(agg::rgba8_pre(r, g, b, int(a * opacity)));
|
||||||
|
|
|
@ -846,10 +846,13 @@ void map_parser::parse_symbolizers(rule & rule, xml_node const & node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper method
|
namespace detail {
|
||||||
|
// helpers
|
||||||
template <typename Symbolizer, typename T>
|
template <typename Symbolizer, typename T>
|
||||||
void set_symbolizer_property(Symbolizer & sym, keys key, xml_node const & node)
|
struct set_symbolizer_property_impl
|
||||||
{
|
{
|
||||||
|
static void apply(Symbolizer & sym, keys key, xml_node const & node)
|
||||||
|
{
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
std::string const& name = std::get<0>(get_meta(key));
|
std::string const& name = std::get<0>(get_meta(key));
|
||||||
try
|
try
|
||||||
|
@ -863,11 +866,19 @@ void set_symbolizer_property(Symbolizer & sym, keys key, xml_node const & node)
|
||||||
optional<expression_ptr> val = node.get_opt_attr<expression_ptr>(name);
|
optional<expression_ptr> val = node.get_opt_attr<expression_ptr>(name);
|
||||||
if (val) put(sym, key, *val);
|
if (val) put(sym, key, *val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void map_parser::parse_symbolizer_base(symbolizer_base &sym, xml_node const &pt)
|
template <typename Symbolizer>
|
||||||
|
struct set_symbolizer_property_impl<Symbolizer, composite_mode_e>
|
||||||
{
|
{
|
||||||
optional<std::string> comp_op_name = pt.get_opt_attr<std::string>("comp-op");
|
static void apply(Symbolizer & sym, keys key, xml_node const & node)
|
||||||
|
{
|
||||||
|
typedef composite_mode_e value_type;
|
||||||
|
std::string const& name = std::get<0>(get_meta(key));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
optional<std::string> comp_op_name = node.get_opt_attr<std::string>("comp-op");
|
||||||
if (comp_op_name)
|
if (comp_op_name)
|
||||||
{
|
{
|
||||||
optional<composite_mode_e> comp_op = comp_op_from_string(*comp_op_name);
|
optional<composite_mode_e> comp_op = comp_op_from_string(*comp_op_name);
|
||||||
|
@ -877,10 +888,29 @@ void map_parser::parse_symbolizer_base(symbolizer_base &sym, xml_node const &pt)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw config_error("failed to parse comp-op: '" + *comp_op_name + "'");
|
optional<expression_ptr> val = node.get_opt_attr<expression_ptr>(name);
|
||||||
|
if (val) put(sym, key, *val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch (config_error const& ex)
|
||||||
|
{
|
||||||
|
MAPNIK_LOG_ERROR(composite_mode_e) << ex.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template <typename Symbolizer, typename T>
|
||||||
|
void set_symbolizer_property(Symbolizer & sym, keys key, xml_node const & node)
|
||||||
|
{
|
||||||
|
detail::set_symbolizer_property_impl<Symbolizer,T>::apply(sym,key,node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void map_parser::parse_symbolizer_base(symbolizer_base &sym, xml_node const &pt)
|
||||||
|
{
|
||||||
|
|
||||||
|
set_symbolizer_property<symbolizer_base,composite_mode_e>(sym, keys::comp_op, pt);
|
||||||
optional<std::string> geometry_transform_wkt = pt.get_opt_attr<std::string>("geometry-transform");
|
optional<std::string> geometry_transform_wkt = pt.get_opt_attr<std::string>("geometry-transform");
|
||||||
if (geometry_transform_wkt)
|
if (geometry_transform_wkt)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue