1. fixed shape datasource bug - attributes were ignored for point/pointz/pointm types

2. use boost::thread for mutex/lock 
3  use boost::noncopyable
4  build agg as a shared lib for now
5. corrected panning code in map.cpp
6. improved coord_transform
This commit is contained in:
Artem Pavlenko 2005-12-23 12:31:54 +00:00
parent 81ace03173
commit 955ff4c4f5
21 changed files with 204 additions and 337 deletions

View file

@ -81,13 +81,10 @@ if not conf.CheckLibWithHeader('tiff','tiff.h','C'):
env = conf.Finish() env = conf.Finish()
Export('env') Export('env')
#build boost libs (filesystem, regex, python)
env.SConscript('boost/SConscript')
#build agg lib #build agg lib
env.SConscript('agg/SConscript') env.SConscript('agg/SConscript')
#build boost libs (filesystem, regex, python etc)
env.SConscript('boost/SConscript')
#main lib #main lib
SConscript('src/SConscript') SConscript('src/SConscript')

View file

@ -25,4 +25,5 @@ agg_root = env['AGG_ROOT']
agg_headers = agg_root + '/include' agg_headers = agg_root + '/include'
agg_src_dir = agg_root + '/src/' agg_src_dir = agg_root + '/src/'
agg_src = glob.glob(agg_src_dir + '*.cpp') agg_src = glob.glob(agg_src_dir + '*.cpp')
agg_lib = env.StaticLibrary('libagg',agg_src,LIBS=[],CPPPATH=agg_headers) agg_lib = env.SharedLibrary('libagg',agg_src,LIBS=[],CPPPATH=agg_headers)
env.Install(prefix+'/lib',agg_lib)

View file

@ -44,3 +44,8 @@ boost_serialization_src = glob.glob(serialization_src_dir+ '*.cpp')
lib_boost_serialization = env.SharedLibrary('libboost-serialization',boost_serialization_src,LIBS=[],CPPPATH=boost_root) lib_boost_serialization = env.SharedLibrary('libboost-serialization',boost_serialization_src,LIBS=[],CPPPATH=boost_root)
env.Install(prefix+'/lib',lib_boost_serialization) env.Install(prefix+'/lib',lib_boost_serialization)
#boost thread
thread_src_dir = boost_root + '/libs/thread/src/'
boost_thread_src = glob.glob(thread_src_dir+ '*.cpp')
lib_boost_thread = env.SharedLibrary('libboost-thread',boost_thread_src,LIBS=[],CPPPATH=boost_root)
env.Install(prefix+'/lib',lib_boost_thread)

View file

@ -26,6 +26,7 @@
#include "utils.hpp" #include "utils.hpp"
#include "connection.hpp" #include "connection.hpp"
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>
using namespace mapnik; using namespace mapnik;
using std::string; using std::string;
@ -68,7 +69,7 @@ public:
bool registerPool(const ConnectionCreator<Connection>& creator,int initialSize,int maxSize) bool registerPool(const ConnectionCreator<Connection>& creator,int initialSize,int maxSize)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
if (pools_.find(creator.id())==pools_.end()) if (pools_.find(creator.id())==pools_.end())
{ {
return pools_.insert(std::make_pair(creator.id(), return pools_.insert(std::make_pair(creator.id(),
@ -80,7 +81,7 @@ public:
} }
const boost::shared_ptr<PoolType>& getPool(const std::string& key) const boost::shared_ptr<PoolType>& getPool(const std::string& key)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
ContType::const_iterator itr=pools_.find(key); ContType::const_iterator itr=pools_.find(key);
if (itr!=pools_.end()) if (itr!=pools_.end())
{ {
@ -92,7 +93,7 @@ public:
const HolderType& get(const std::string& key) const HolderType& get(const std::string& key)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
ContType::const_iterator itr=pools_.find(key); ContType::const_iterator itr=pools_.find(key);
if (itr!=pools_.end()) if (itr!=pools_.end())
{ {

View file

@ -151,10 +151,9 @@ feature_ptr shape_featureset<filterT>::next()
++count_; ++count_;
break; break;
} }
default:
return feature_ptr();
}
}
}
if (attr_ids_.size()) if (attr_ids_.size())
{ {
shape_.dbf().move_to(shape_.id_); shape_.dbf().move_to(shape_.id_);
@ -167,12 +166,11 @@ feature_ptr shape_featureset<filterT>::next()
} }
catch (...) catch (...)
{ {
//TODO std::cerr << "error processing attributes " << std::endl;
} }
++pos; ++pos;
} }
} }
}
return feature; return feature;
} }
else else

View file

@ -154,6 +154,7 @@ feature_ptr shape_index_featureset<filterT>::next()
break; break;
} }
} }
}
if (attr_ids_.size()) if (attr_ids_.size())
{ {
feature->reserve_props(attr_ids_.size()); feature->reserve_props(attr_ids_.size());
@ -172,7 +173,6 @@ feature_ptr shape_index_featureset<filterT>::next()
++pos; ++pos;
} }
} }
}
return feature; return feature;
} }
else else

View file

@ -35,14 +35,13 @@ namespace mapnik
int height; int height;
double scale_; double scale_;
Envelope<double> extent; Envelope<double> extent;
coord2d center_;
public: public:
CoordTransform(int width,int height,const Envelope<double>& extent) CoordTransform(int width,int height,const Envelope<double>& extent)
:width(width),height(height),extent(extent),center_(extent.center()) :width(width),height(height),extent(extent)
{ {
double sx=((double)width)/extent.width(); double sx=((double)width)/extent.width();
double sy=((double)height)/extent.height(); double sy=((double)height)/extent.height();
scale_=std::min(sx,sy); scale_=sx;//std::min(sx,sy);
} }
inline double scale() const inline double scale() const
@ -50,50 +49,63 @@ namespace mapnik
return scale_; return scale_;
} }
double forward_x(double x) const inline void forward_x(double* x) const
{ {
return (x-center_.x)*scale_+0.5*width; *x = (*x - extent.minx() ) * scale_;
} }
double forward_y(double y) const inline void forward_y(double* y) const
{ {
return -(y-center_.y)*scale_+0.5*height; *y = (extent.maxy() - *y) * scale_;
}
inline void backward_x(double* x) const
{
*x = extent.minx() + *x/scale_;
}
inline void backward_y(double* y) const
{
*y = extent.maxy() - *y/scale_;
} }
inline coord2d& forward(coord2d& c) const inline coord2d& forward(coord2d& c) const
{ {
c.x=(c.x-center_.x)*scale_+0.5*width; forward_x(&c.x);
c.y=-(c.y-center_.y)*scale_+0.5*height; forward_y(&c.y);
return c; return c;
} }
inline coord2d& backward(coord2d& c) const inline coord2d& backward(coord2d& c) const
{ {
c.x=(c.x-0.5*width)/scale_+center_.x; backward_x(&c.x);
c.y=-(c.y-0.5*height)/scale_+center_.y; backward_y(&c.y);
return c; return c;
} }
inline Envelope<double> forward(const Envelope<double>& e) const inline Envelope<double> forward(const Envelope<double>& e) const
{ {
double x0 = e.minx();
double x0=(e.minx()-center_.x)*scale_+0.5*width; double y0 = e.miny();
double x1=(e.maxx()-center_.x)*scale_+0.5*width; double x1 = e.maxx();
double y1 = e.maxy();
double y0=-(e.miny()-center_.y)*scale_+0.5*height; forward_x(&x0);
double y1=-(e.maxy()-center_.y)*scale_+0.5*height; forward_y(&y0);
forward_x(&x1);
forward_y(&y1);
return Envelope<double>(x0,y0,x1,y1); return Envelope<double>(x0,y0,x1,y1);
} }
inline Envelope<double> backward(const Envelope<double>& e) const inline Envelope<double> backward(const Envelope<double>& e) const
{ {
double x0 = e.minx();
double x0=(e.minx()-0.5*width)/scale_+center_.x; double y0 = e.miny();
double x1=(e.maxx()-0.5*width)/scale_+center_.x; double x1 = e.maxx();
double y1 = e.maxy();
double y0=-(e.miny()-0.5*height)/scale_+center_.y; backward_x(&x0);
double y1=-(e.maxy()-0.5*height)/scale_+center_.y; backward_y(&y0);
backward_x(&x1);
backward_y(&y1);
return Envelope<double>(x0,y0,x1,y1); return Envelope<double>(x0,y0,x1,y1);
} }
@ -102,8 +114,7 @@ namespace mapnik
{ {
for (unsigned i=0;i<coords.size();++i) for (unsigned i=0;i<coords.size();++i)
{ {
coords[i].x=(coords[i].x-center_.x)*scale_+0.5*width; forward(coords[i]);
coords[i].y=-(coords[i].y-center_.y)*scale_+0.5*height;
} }
return coords; return coords;
} }
@ -112,8 +123,7 @@ namespace mapnik
{ {
for (unsigned i=0;i<coords.size();++i) for (unsigned i=0;i<coords.size();++i)
{ {
coords[i].x=(coords[i].x-0.5*width)/scale_+center_.x; backward(coords[i]);
coords[i].y=-(coords[i].y-0.5*height)/scale_+center_.y;
} }
return coords; return coords;
} }

View file

@ -29,7 +29,6 @@
#include "query.hpp" #include "query.hpp"
#include "feature_layer_desc.hpp" #include "feature_layer_desc.hpp"
//#include "ptr.hpp"
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
namespace mapnik namespace mapnik

View file

@ -25,6 +25,7 @@
#include "feature.hpp" #include "feature.hpp"
#include <vector> #include <vector>
namespace mapnik namespace mapnik
{ {
typedef rule<Feature,filter> rule_type; typedef rule<Feature,filter> rule_type;
@ -50,6 +51,7 @@ namespace mapnik
{ {
rules_.push_back(rule); rules_.push_back(rule);
} }
rules const& get_rules() const rules const& get_rules() const
{ {
return rules_; return rules_;

View file

@ -23,10 +23,12 @@
#include "symbolizer.hpp" #include "symbolizer.hpp"
#include "image_data.hpp" #include "image_data.hpp"
#include <boost/utility.hpp>
namespace mapnik namespace mapnik
{ {
struct image_symbolizer : public symbolizer struct image_symbolizer : public symbolizer,
private boost::noncopyable
{ {
private: private:
ImageData32 symbol_; ImageData32 symbol_;
@ -40,8 +42,6 @@ namespace mapnik
try try
{ {
std::auto_ptr<ImageReader> reader(get_image_reader(type,file)); std::auto_ptr<ImageReader> reader(get_image_reader(type,file));
std::cout<<"image width="<<reader->width()<<std::endl;
std::cout<<"image height="<<reader->height()<<std::endl;
reader->read(0,0,symbol_); reader->read(0,0,symbol_);
} }
catch (...) catch (...)
@ -56,22 +56,16 @@ namespace mapnik
{ {
int w=symbol_.width(); int w=symbol_.width();
int h=symbol_.height(); int h=symbol_.height();
double x,y;
geometry_type::path_iterator<SHIFT0> itr=geom.begin<SHIFT0>(); unsigned size = geom.num_points();
while (itr!=geom.end<SHIFT0>()) for (unsigned pos = 0; pos < size ;++pos)
{ {
int x=itr->x; geom.vertex(&x,&y);
int y=itr->y; int px=int(x - 0.5 * w);
int px=int(x-0.5*w); int py=int(y - 0.5 * h);
int py=int(y-0.5*h);
image.set_rectangle(px,py,symbol_); image.set_rectangle(px,py,symbol_);
++itr;
} }
} }
private:
image_symbolizer(const image_symbolizer&);
image_symbolizer& operator=(const image_symbolizer&);
}; };
} }

View file

@ -45,12 +45,13 @@
#include "symbolizer.hpp" #include "symbolizer.hpp"
#include "stroke.hpp" #include "stroke.hpp"
//#include "line_aa.hpp"
//#include "scanline_aa.hpp" #include <boost/utility.hpp>
namespace mapnik namespace mapnik
{ {
struct line_symbolizer : public symbolizer struct line_symbolizer : public symbolizer,
private boost::noncopyable
{ {
private: private:
stroke stroke_; stroke stroke_;
@ -77,27 +78,6 @@ namespace mapnik
double g=col.green()/255.0; double g=col.green()/255.0;
double b=col.blue()/255.0; double b=col.blue()/255.0;
if (0) //stroke_.width() == 1.0)
{
typedef agg::renderer_outline_aa<ren_base> renderer_oaa;
typedef agg::rasterizer_outline_aa<renderer_oaa> rasterizer_outline_aa;
agg::line_profile_aa prof;
prof.width(stroke_.get_width());
renderer_oaa ren_oaa(renb, prof);
rasterizer_outline_aa ras_oaa(ren_oaa);
ren_oaa.color(agg::rgba(r, g, b, stroke_.get_opacity()));
ras_oaa.add_path(geom);
//LineRasterizerAA<Image32> rasterizer(image);
//rasterizer.render<SHIFT0>(geom,stroke_.get_color());
}
else
{
//typedef agg::renderer_base<agg::pixfmt_rgba32> ren_base;
typedef agg::renderer_scanline_aa_solid<ren_base> renderer; typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
renderer ren(renb); renderer ren(renb);
@ -108,7 +88,7 @@ namespace mapnik
if (stroke_.has_dash()) if (stroke_.has_dash())
{ {
agg::conv_dash<geometry<vertex2d,vertex_vector> > dash(geom); agg::conv_dash<geometry<vertex2d> > dash(geom);
dash_array const& d = stroke_.get_dash_array(); dash_array const& d = stroke_.get_dash_array();
dash_array::const_iterator itr = d.begin(); dash_array::const_iterator itr = d.begin();
dash_array::const_iterator end = d.end(); dash_array::const_iterator end = d.end();
@ -117,7 +97,7 @@ namespace mapnik
dash.add_dash(itr->first, itr->second); dash.add_dash(itr->first, itr->second);
++itr; ++itr;
} }
agg::conv_stroke<agg::conv_dash<geometry<vertex2d,vertex_vector> > > stroke(dash); agg::conv_stroke<agg::conv_dash<geometry<vertex2d> > > stroke(dash);
line_join_e join=stroke_.get_line_join(); line_join_e join=stroke_.get_line_join();
if ( join == MITER_JOIN) if ( join == MITER_JOIN)
@ -147,7 +127,7 @@ namespace mapnik
} }
else else
{ {
agg::conv_stroke<geometry<vertex2d,vertex_vector> > stroke(geom); agg::conv_stroke<geometry<vertex2d> > stroke(geom);
line_join_e join=stroke_.get_line_join(); line_join_e join=stroke_.get_line_join();
if ( join == MITER_JOIN) if ( join == MITER_JOIN)
@ -176,11 +156,6 @@ namespace mapnik
agg::render_scanlines(ras, sl, ren); agg::render_scanlines(ras, sl, ren);
} }
} }
}
private:
line_symbolizer(const line_symbolizer&);
line_symbolizer& operator=(const line_symbolizer&);
}; };
} }

View file

@ -25,6 +25,7 @@
#include "expression.hpp" #include "expression.hpp"
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <iostream>
namespace mapnik namespace mapnik
{ {

View file

@ -28,21 +28,6 @@
namespace mapnik { namespace mapnik {
class style_cache : public singleton <style_cache,CreateStatic>
{
friend class CreateStatic<style_cache>;
private:
static std::map<std::string,Style > styles_;
style_cache();
~style_cache();
style_cache(const style_cache&);
style_cache& operator=(const style_cache&);
public:
static bool insert(const std::string& name,const Style& style);
static void remove(const std::string& name);
static const Style& find(const std::string& name);
};
class named_style_cache : public singleton <named_style_cache,CreateStatic> class named_style_cache : public singleton <named_style_cache,CreateStatic>
{ {
friend class CreateStatic<named_style_cache>; friend class CreateStatic<named_style_cache>;

View file

@ -29,10 +29,11 @@
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>
#include <boost/thread/mutex.hpp>
namespace mapnik namespace mapnik
{ {
class Mutex; using boost::mutex;
class Lock;
template <typename T> template <typename T>
class CreateUsingNew class CreateUsingNew
@ -90,7 +91,7 @@ namespace mapnik
throw std::runtime_error("dead reference!"); throw std::runtime_error("dead reference!");
} }
protected: protected:
static Mutex mutex_; static mutex mutex_;
singleton() {} singleton() {}
virtual ~singleton() virtual ~singleton()
{ {
@ -102,7 +103,7 @@ namespace mapnik
{ {
if (!pInstance_) if (!pInstance_)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
if (!pInstance_) if (!pInstance_)
{ {
if (destroyed_) if (destroyed_)
@ -120,7 +121,7 @@ namespace mapnik
}; };
template <typename T, template <typename T,
template <typename T> class CreatePolicy> Mutex singleton<T,CreatePolicy>::mutex_; template <typename T> class CreatePolicy> mutex singleton<T,CreatePolicy>::mutex_;
template <typename T, template <typename T,
template <typename T> class CreatePolicy> T* singleton<T,CreatePolicy>::pInstance_=0; template <typename T> class CreatePolicy> T* singleton<T,CreatePolicy>::pInstance_=0;
template <typename T, template <typename T,
@ -163,59 +164,6 @@ namespace mapnik
} }
}; };
class Mutex
{
private:
pthread_mutex_t mutex_;
public:
Mutex()
{
pthread_mutex_init(&mutex_,0);
}
void lock()
{
pthread_mutex_lock(&mutex_);
}
void unlock()
{
pthread_mutex_unlock(&mutex_);
}
bool trylock()
{
return (pthread_mutex_trylock(&mutex_)==0);
}
~Mutex()
{
pthread_mutex_destroy(&mutex_);
}
};
class Lock
{
private:
Mutex* mutex_;
public:
explicit Lock(Mutex* mutex)
:mutex_(mutex)
{
if (mutex_) mutex_->lock();
}
~Lock()
{
if (mutex_)
mutex_->unlock();
}
private:
Lock();
Lock(const Lock&);
Lock& operator=(const Lock&);
void* operator new(std::size_t);
void* operator new[](std::size_t);
void operator delete(void*);
void operator delete[](void*);
Lock* operator&();
};
struct timer struct timer
{ {
@ -269,8 +217,6 @@ namespace mapnik
throw BadConversion("fromString("+s+")"); throw BadConversion("fromString("+s+")");
} }
inline bool space (char c) inline bool space (char c)
{ {
return isspace(c); return isspace(c);

View file

@ -127,9 +127,9 @@ namespace mapnik
if (pos >= pos_) return; if (pos >= pos_) return;
unsigned block = pos >> block_shift; unsigned block = pos >> block_shift;
value_type* vertex = vertexs_[block] + (( pos & block_mask) << 1); value_type* vertex = vertexs_[block] + (( pos & block_mask) << 1);
*vertex=t.forward_x(*vertex); t.forward_x(vertex);
++vertex; ++vertex;
*vertex=t.forward_y(*vertex); t.forward_y(vertex);
} }
private: private:

View file

@ -30,7 +30,7 @@ freetype2_root = env['FREETYPE2_ROOT']
headers =[ '#include',boost_root,freetype2_root,agg_headers] headers =[ '#include',boost_root,freetype2_root,agg_headers]
libraries=['rt','z','png','ltdl','jpeg','tiff','agg','boost-filesystem','boost-regex','boost-serialization'] libraries=['rt','z','png','ltdl','jpeg','tiff','agg','boost-filesystem','boost-regex','boost-serialization','boost-thread']
libpaths = [prefix+'/lib','#agg'] libpaths = [prefix+'/lib','#agg']
linkflags = '-Wl,-rpath-link,. -Wl,-soname,libmapnik.so' linkflags = '-Wl,-rpath-link,. -Wl,-soname,libmapnik.so'
@ -43,15 +43,12 @@ source = Split(
image_reader.cpp image_reader.cpp
image_util.cpp image_util.cpp
layer.cpp layer.cpp
line_aa.cpp
map.cpp map.cpp
memory.cpp memory.cpp
params.cpp params.cpp
plugin.cpp plugin.cpp
png_reader.cpp png_reader.cpp
render.cpp render.cpp
scanline_aa.cpp
scanline.cpp
style_cache.cpp style_cache.cpp
style.cpp style.cpp
text.cpp text.cpp

View file

@ -22,6 +22,8 @@
#include <algorithm> #include <algorithm>
#include <stdexcept> #include <stdexcept>
#include <boost/thread/mutex.hpp>
#include <boost/filesystem/operations.hpp> #include <boost/filesystem/operations.hpp>
namespace mapnik namespace mapnik
@ -88,7 +90,8 @@ namespace mapnik
void datasource_cache::register_datasources(const std::string& str) void datasource_cache::register_datasources(const std::string& str)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache,
mapnik::CreateStatic>::mutex_);
filesystem::path path(str); filesystem::path path(str);
filesystem::directory_iterator end_itr; filesystem::directory_iterator end_itr;
if (exists(path)) if (exists(path))

View file

@ -140,6 +140,7 @@ namespace mapnik
double h = factor * currentExtent_.height(); double h = factor * currentExtent_.height();
currentExtent_ = Envelope<double>(center.x - 0.5 * w, center.y - 0.5 * h, currentExtent_ = Envelope<double>(center.x - 0.5 * w, center.y - 0.5 * h,
center.x + 0.5 * w, center.y + 0.5 * h); center.x + 0.5 * w, center.y + 0.5 * h);
fixAspectRatio();
} }
void Map::zoomToBox(const Envelope<double> &box) void Map::zoomToBox(const Envelope<double> &box)
@ -170,10 +171,14 @@ namespace mapnik
void Map::pan(int x,int y) void Map::pan(int x,int y)
{ {
CoordTransform t(width_,height_,currentExtent_); int dx = x - int(0.5 * width_);
coord2d pt(x,y); int dy = int(0.5 * height_) - y;
t.backward(pt); double s = width_/currentExtent_.width();
currentExtent_.re_center(pt.x,pt.y); double minx = currentExtent_.minx() + dx/s;
double maxx = currentExtent_.maxx() + dx/s;
double miny = currentExtent_.miny() + dy/s;
double maxy = currentExtent_.maxy() + dy/s;
currentExtent_.init(minx,miny,maxx,maxy);
} }
void Map::pan_and_zoom(int x,int y,double factor) void Map::pan_and_zoom(int x,int y,double factor)

View file

@ -50,7 +50,6 @@ namespace mapnik
std::set<std::string> names; std::set<std::string> names;
attribute_collector<Feature> collector(names); attribute_collector<Feature> collector(names);
property_index<Feature> indexer(names); property_index<Feature> indexer(names);
query q(bbox,width,height); query q(bbox,width,height);
double scale = 1.0/t.scale(); double scale = 1.0/t.scale();
std::vector<rule_type*> if_rules; std::vector<rule_type*> if_rules;
@ -138,28 +137,6 @@ namespace mapnik
} }
} }
} }
//if (l.isSelectable() && l.selection().size()) //TODO !!!
//{
//volatile style_cache* styles=style_cache::instance();
// const Style& style=style_cache::instance()->find(l.selection_style());
// std::vector<ref_ptr<Feature> >& selection=l.selection();
// Style::Iterator pos = style.begin();
// if (pos!=style.end()) {
// std::vector<ref_ptr<Feature> >::iterator itr=selection.begin();
//
// while (itr!=selection.end())
// {
// geometry_ptr& geom=(*itr)->get_geometry();
// geom->transform(t);
// (*pos)->render(*geom,image);
// ++itr;
// }
// }
// l.clear_selection();
//}
} }
} }
} }
@ -187,11 +164,11 @@ namespace mapnik
} }
template <typename Image> template <typename Image>
void Renderer<Image>::render(const Map& map,Image& image) void Renderer<Image>::render(Map const& map,Image& image)
{ {
timer clock; timer clock;
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
const Envelope<double>& extent=map.getCurrentExtent(); Envelope<double> const& extent=map.getCurrentExtent();
std::cout<<"BBOX:"<<extent<<std::endl; std::cout<<"BBOX:"<<extent<<std::endl;
double scale=map.scale(); double scale=map.scale();
std::cout<<" scale="<<scale<<std::endl; std::cout<<" scale="<<scale<<std::endl;
@ -204,10 +181,10 @@ namespace mapnik
for (size_t n=0;n<map.layerCount();++n) for (size_t n=0;n<map.layerCount();++n)
{ {
const Layer& l=map.getLayer(n); Layer const& l=map.getLayer(n);
if (l.isVisible(scale)) // TODO: extent check if (l.isVisible(scale)) // TODO: extent check
{ {
const datasource_p& ds=l.datasource(); datasource_p const& ds=l.datasource();
if (!ds) continue; if (!ds) continue;
if (ds->type() == datasource::Vector) if (ds->type() == datasource::Vector)
{ {

View file

@ -20,39 +20,10 @@
#include "style_cache.hpp" #include "style_cache.hpp"
#include "line_symbolizer.hpp" #include "line_symbolizer.hpp"
#include <boost/thread/mutex.hpp>
namespace mapnik namespace mapnik
{ {
style_cache::style_cache() {}
style_cache::~style_cache() {}
std::map<std::string,Style> style_cache::styles_;
bool style_cache::insert(const std::string& name,const Style& style)
{
Lock lock(&mutex_);
return styles_.insert(make_pair(name,style)).second;
}
void style_cache::remove(const std::string& name)
{
Lock lock(&mutex_);
styles_.erase(name);
}
const Style& style_cache::find(const std::string& name)
{
Lock lock(&mutex_);
std::map<std::string,Style>::iterator itr=styles_.find(name);
if (itr!=styles_.end())
{
return itr->second;
}
static const Style default_style(boost::shared_ptr<symbolizer>(new line_symbolizer(Color(255,0,0))));
return default_style;
}
////////////////////////////////////////////////////////////////////////////
named_style_cache::named_style_cache() {} named_style_cache::named_style_cache() {}
named_style_cache::~named_style_cache() {} named_style_cache::~named_style_cache() {}
@ -60,19 +31,19 @@ namespace mapnik
bool named_style_cache::insert(const std::string& name,const feature_type_style& style) bool named_style_cache::insert(const std::string& name,const feature_type_style& style)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
return styles_.insert(make_pair(name,style)).second; return styles_.insert(make_pair(name,style)).second;
} }
void named_style_cache::remove(const std::string& name) void named_style_cache::remove(const std::string& name)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
styles_.erase(name); styles_.erase(name);
} }
feature_type_style named_style_cache::find(const std::string& name) feature_type_style named_style_cache::find(const std::string& name)
{ {
Lock lock(&mutex_); mutex::scoped_lock lock(mutex_);
std::map<std::string,feature_type_style>::iterator itr=styles_.find(name); std::map<std::string,feature_type_style>::iterator itr=styles_.find(name);
if (itr!=styles_.end()) if (itr!=styles_.end())
{ {