diff --git a/bindings/python/mapnik_image.cpp b/bindings/python/mapnik_image.cpp index 5d674be72..4f1b61bc1 100644 --- a/bindings/python/mapnik_image.cpp +++ b/bindings/python/mapnik_image.cpp @@ -37,6 +37,7 @@ // mapnik #include #include +#include #include #include #include @@ -48,6 +49,8 @@ #include #endif +using mapnik::image; +using mapnik::image_data_any; using mapnik::image_32; using mapnik::image_reader; using mapnik::get_image_reader; @@ -222,6 +225,21 @@ std::shared_ptr from_cairo(PycairoSurface* py_surface) } #endif +// ============ image any +std::shared_ptr read_from_file_impl(std::string const& filename) +{ + std::shared_ptr img(new image); + std::unique_ptr reader(get_image_reader(filename)); + if (reader) + { + unsigned w = reader->width(); + unsigned h = reader->height(); + img->set_data(reader->read(0, 0, w, h)); + } + return img; +} +// ========================= + void export_image() { using namespace boost::python; @@ -265,7 +283,15 @@ void export_image() .value("divide", mapnik::divide) ; - class_ >("Image","This class represents a 32 bit RGBA image.",init()) + class_, boost::noncopyable > ("ImageAny", "This class represents an any Image object", no_init) + .def("width",&image::width) + .def("height",&image::height) + .def("open", &read_from_file_impl) + .staticmethod("open") + .def("save",&image::save_to_file) + ; + + class_, boost::noncopyable >("Image","This class represents a 32 bit RGBA image.",init()) .def("width",&image_32::width) .def("height",&image_32::height) .def("view",&image_32::get_view) diff --git a/include/mapnik/image.hpp b/include/mapnik/image.hpp new file mode 100644 index 000000000..d35b2cebc --- /dev/null +++ b/include/mapnik/image.hpp @@ -0,0 +1,49 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2014 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 + * + *****************************************************************************/ + +#ifndef MAPNIK_IMAGE_HPP +#define MAPNIK_IMAGE_HPP + +#include +#include + +namespace mapnik { + +class image +{ +public: + image() = default; + inline std::size_t width() const { return data_.width(); } + inline std::size_t height() const { return data_.height(); } + void set_data(image_data_any && data); + inline image_data_any const& data() const { return data_;} + static image read_from_file(std::string const& filename); + void save_to_file(std::string const& filename, std::string const& format); +private: + image(image && other) = default; + image(image_data_any && data) noexcept; + image_data_any data_; +}; + +} + +#endif // MAPNIK_IMAGE_HPP diff --git a/src/build.py b/src/build.py index 0f32bce0b..489ed0232 100644 --- a/src/build.py +++ b/src/build.py @@ -152,6 +152,7 @@ source = Split( miniz_png.cpp color.cpp conversions.cpp + image.cpp image_compositing.cpp image_scaling.cpp box2d.cpp diff --git a/src/image.cpp b/src/image.cpp new file mode 100644 index 000000000..3746e19cc --- /dev/null +++ b/src/image.cpp @@ -0,0 +1,80 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2014 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 + * + *****************************************************************************/ + +#include +#include +#include + +namespace mapnik { + +image::image(image_data_any && data) noexcept + : data_(std::move(data)) {} + +void image::set_data(image_data_any && data) +{ + data_ = std::move(data); +} + +image image::read_from_file(std::string const& filename) +{ + std::unique_ptr reader(get_image_reader(filename)); + if (reader) + { + unsigned w = reader->width(); + unsigned h = reader->height(); + image_data_any data = reader->read(0, 0, w, h); + return image(std::move(data)); + } + else + { + return image(); + } +} + +namespace detail { + +struct save_to_file_visitor : mapnik::util::static_visitor<> +{ + save_to_file_visitor(std::string const& filename, std::string const& format) + : filename_(filename), + format_(format) {} + + void operator() (image_data_rgba8 const& data) const + { + save_to_file(data,filename_, format_); + } + + template + void operator() (T const& data) const {} + + std::string const& filename_; + std::string const& format_; +}; + +} + +void image::save_to_file(std::string const& filename, std::string const& format) +{ + util::apply_visitor(detail::save_to_file_visitor(filename, format), data_); +} + +}