diff --git a/include/mapnik/svg/marker_cache.hpp b/include/mapnik/svg/marker_cache.hpp index ba762e6d5..3158e6d2a 100644 --- a/include/mapnik/svg/marker_cache.hpp +++ b/include/mapnik/svg/marker_cache.hpp @@ -28,7 +28,7 @@ // mapnik #include #include -#include +#include // boost #include @@ -40,18 +40,18 @@ namespace mapnik { -typedef boost::shared_ptr path_ptr; +typedef boost::shared_ptr path_ptr; -struct MAPNIK_DECL image_cache : - public singleton , +struct MAPNIK_DECL marker_cache : + public singleton , private boost::noncopyable { - friend class CreateStatic; + friend class CreateStatic; static boost::mutex mutex_; - static boost::unordered_map cache_; - static bool insert(std::string const& key, image_ptr); - static boost::optional find(std::string const& key, bool update_cache = false); + static boost::unordered_map cache_; + static bool insert(std::string const& key, path_ptr); + static boost::optional find(std::string const& key, bool update_cache = false); }; } diff --git a/src/SConscript b/src/SConscript index a3d0b3adb..d33577bc3 100644 --- a/src/SConscript +++ b/src/SConscript @@ -126,6 +126,7 @@ if True : svg_path_parser.cpp svg_points_parser.cpp svg_transform_parser.cpp + marker_cache.cpp """ ) diff --git a/src/agg_renderer.cpp b/src/agg_renderer.cpp index b8b14f46a..4791cca30 100644 --- a/src/agg_renderer.cpp +++ b/src/agg_renderer.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include diff --git a/src/marker_cache.cpp b/src/marker_cache.cpp new file mode 100644 index 000000000..41f07001b --- /dev/null +++ b/src/marker_cache.cpp @@ -0,0 +1,93 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2010 Artem Pavlenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + *****************************************************************************/ + +//$Id$ + +// mapnik +#include +#include + +// boost +#include +#include +#include + +namespace mapnik +{ + +boost::unordered_map marker_cache::cache_; + +bool marker_cache::insert (std::string const& uri, path_ptr path) +{ +#ifdef MAPNIK_THREADSAFE + mutex::scoped_lock lock(mutex_); +#endif + return cache_.insert(std::make_pair(uri,path)).second; +} + +boost::optional marker_cache::find(std::string const& uri, bool update_cache) +{ +#ifdef MAPNIK_THREADSAFE + mutex::scoped_lock lock(mutex_); +#endif + typedef boost::unordered_map::const_iterator iterator_type; + boost::optional result; + iterator_type itr = cache_.find(uri); + if (itr != cache_.end()) + { + result.reset(itr->second); + return result; + } + + // we can't find marker in cache, lets try to load it from filesystem + boost::filesystem::path path(uri); + if (exists(path)) + { + try + { + mapnik::path_ptr marker(new agg::svg::path_renderer); + agg::svg::parser p(*marker); + marker->arrange_orientations(); + p.parse(uri.c_str()); + //marker->bounding_rect(&lox, &loy, &hix, &hiy); + if (update_cache) + { + cache_.insert(std::make_pair(uri,marker)); + } + } + catch (...) + { + std::cerr << "Exception caught while loading SVG: " << uri << std::endl; + } + } + else + { + std::cerr << "### WARNING SVG does not exist: " << uri << std::endl; + } + return result; +} + +#ifdef MAPNIK_THREADSAFE + boost::mutex marker_cache::mutex_; +#endif + +}