From 182628e3abcc149cb5ae494904ce5c96e12b6b19 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Sun, 20 Jun 2010 04:01:59 +0000 Subject: [PATCH] + add filter_factor on mapnik::query and allow setting of factor for image scaling modes which demand high quality resampling - bilinear requires 2x, others in future like lanzcos may require 3-4x - addresses #563 --- include/mapnik/feature_style_processor.hpp | 34 +++++++++++++++++++++- include/mapnik/query.hpp | 18 ++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/include/mapnik/feature_style_processor.hpp b/include/mapnik/feature_style_processor.hpp index 553a263c4..7b9e03c82 100644 --- a/include/mapnik/feature_style_processor.hpp +++ b/include/mapnik/feature_style_processor.hpp @@ -180,7 +180,11 @@ private: { active_rules=true; // collect unique attribute names - collector(*ruleIter); + // TODO - in the future rasters should be able to be filtered... + if (ds->type() == datasource::Vector) + { + collector(*ruleIter); + } if (ruleIter->has_else_filter()) { else_rules.push_back(const_cast(&(*ruleIter))); @@ -189,6 +193,34 @@ private: { if_rules.push_back(const_cast(&(*ruleIter))); } + if (ds->type() == datasource::Raster) + { + if (ds->params().get("filter_factor",0.0) == 0.0) + { + const rule_type::symbolizers& symbols = ruleIter->get_symbolizers(); + rule_type::symbolizers::const_iterator symIter = symbols.begin(); + rule_type::symbolizers::const_iterator symEnd = symbols.end(); + for (;symIter != symEnd;++symIter) + { + try + { + raster_symbolizer sym = boost::get(*symIter); + std::string scaling = sym.get_scaling(); + if (scaling == "bilinear" || scaling == "bilinear8" ) + { + // todo - allow setting custom value in symbolizer property? + q.filter_factor(2.0); + } + } + catch (const boost::bad_get &v) + { + // case where useless symbolizer is attached to raster layer + //throw config_error("Invalid Symbolizer type supplied, only RasterSymbolizer is supported"); + } + } + } + + } } } std::set::const_iterator namesIter=names.begin(); diff --git a/include/mapnik/query.hpp b/include/mapnik/query.hpp index 45872ac3c..3a0777ead 100644 --- a/include/mapnik/query.hpp +++ b/include/mapnik/query.hpp @@ -46,19 +46,22 @@ private: box2d bbox_; resolution_type resolution_; double scale_denominator_; + double filter_factor_; std::set names_; public: query(box2d const& bbox, resolution_type const& resolution, double scale_denominator = 1.0) : bbox_(bbox), resolution_(resolution), - scale_denominator_(scale_denominator) + scale_denominator_(scale_denominator), + filter_factor_(1.0) {} query(query const& other) : bbox_(other.bbox_), resolution_(other.resolution_), scale_denominator_(other.scale_denominator_), + filter_factor_(other.filter_factor_), names_(other.names_) {} @@ -68,6 +71,7 @@ public: bbox_=other.bbox_; resolution_=other.resolution_; scale_denominator_=other.scale_denominator_; + filter_factor_=other.filter_factor_; names_=other.names_; return *this; } @@ -86,7 +90,17 @@ public: { return bbox_; } - + + double get_filter_factor() const + { + return filter_factor_; + } + + void filter_factor(double factor) + { + filter_factor_ = factor; + } + void add_property_name(std::string const& name) { names_.insert(name);