diff --git a/include/mapnik/util/deepcopy.hpp b/include/mapnik/util/deepcopy.hpp new file mode 100644 index 000000000..c81814518 --- /dev/null +++ b/include/mapnik/util/deepcopy.hpp @@ -0,0 +1,37 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2011 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$ + +#ifndef MAPNIK_DEEPCOPY_HPP +#define MAPNIK_DEEPCOPY_HPP + +#include + +namespace mapnik { namespace util { + +// poor man deepcopy implementation +void deepcopy(Map const& map_in, Map & map_out); + +}} + +#endif // MAPNIK_DEEPSOPY_HPP diff --git a/src/build.py b/src/build.py index 927cda481..70abcbea3 100644 --- a/src/build.py +++ b/src/build.py @@ -106,6 +106,7 @@ source = Split( color.cpp box2d.cpp datasource_cache.cpp + deepcopy.cpp expression_string.cpp filter_factory.cpp feature_type_style.cpp diff --git a/src/deepcopy.cpp b/src/deepcopy.cpp new file mode 100644 index 000000000..0087e030d --- /dev/null +++ b/src/deepcopy.cpp @@ -0,0 +1,127 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2011 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$ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// boost +#include +#include + + +namespace mapnik { namespace util { + +// poor man's deepcopy implementation + +void deepcopy(Map const& map_in, Map & map_out) +{ +// * width_(rhs.width_), +// * height_(rhs.height_), +// * srs_(rhs.srs_), +// * buffer_size_(rhs.buffer_size_), +// * background_(rhs.background_), +// * background_image_(rhs.background_image_), +// * styles_(rhs.styles_), +// metawriters_(rhs.metawriters_), +// fontsets_(rhs.fontsets_), +// * layers_(rhs.layers_), +// aspectFixMode_(rhs.aspectFixMode_), +// current_extent_(rhs.current_extent_), +// * maximum_extent_(rhs.maximum_extent_), +// * base_path_(rhs.base_path_), +// extra_attr_(rhs.extra_attr_), +// extra_params_(rhs.extra_params_) + + // width, height + map_out.resize(map_in.width(), map_in.height()); + // srs + map_out.set_srs(map_in.srs()); + // buffer_size + map_out.set_buffer_size(map_in.buffer_size()); + // background + boost::optional background = map_in.background(); + if (background) + { + map_out.set_background(*background); + } + // background_image + boost::optional background_image = map_in.background_image(); + if (background_image) + { + map_out.set_background_image(*background_image); + } + // maximum extent + boost::optional > max_extent = map_in.maximum_extent(); + if (max_extent) + { + map_out.set_maximum_extent(*max_extent); + } + // base_path + map_out.set_base_path(map_in.base_path()); + + // fontsets + typedef std::map fontsets; + BOOST_FOREACH ( fontsets::value_type const& kv,map_in.fontsets()) + { + map_out.insert_fontset(kv.first,kv.second); + } + + BOOST_FOREACH ( layer const& lyr_in, map_in.layers()) + { + layer lyr_out(lyr_in); + datasource_ptr ds_in = lyr_in.datasource(); + if (ds_in) + { + parameters p(ds_in->params()); + + // TODO : re-use datasource extent if already set. + datasource_ptr ds_out = datasource_cache::create(p); + if (ds_out) + { + lyr_out.set_datasource(ds_out); + } + } + map_out.addLayer(lyr_out); + } + typedef std::map style_cont; + typedef style_cont::value_type value_type; + + style_cont const& styles = map_in.styles(); + BOOST_FOREACH ( value_type const& kv, styles ) + { + feature_type_style const& style_in = kv.second; + feature_type_style style_out(style_in,true); // deep copy + map_out.insert_style(kv.first, style_out); + } + +} + +}}