2 // Copyright 2012 Christian Henning
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
8 #ifndef BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
9 #define BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
11 #include <boost/gil/extension/io/png/tags.hpp>
13 #include <boost/assert.hpp>
17 namespace boost { namespace gil { namespace detail {
19 struct png_ptr_wrapper
31 /// Wrapper for libpng's png_struct and png_info object. Implements value semantics.
33 struct png_struct_info_wrapper
37 using png_ptr_t = std::shared_ptr<png_ptr_wrapper>;
42 /// Default Constructor
44 png_struct_info_wrapper( bool read = true )
45 : _png_ptr( new png_ptr_wrapper()
46 , ( ( read ) ? png_ptr_read_deleter : png_ptr_write_deleter )
50 png_ptr_wrapper* get() { return _png_ptr.get(); }
51 png_ptr_wrapper const* get() const { return _png_ptr.get(); }
53 png_struct* get_struct() { return get()->_struct; }
54 png_struct const* get_struct() const { return get()->_struct; }
56 png_info* get_info() { return get()->_info; }
57 png_info const* get_info() const { return get()->_info; }
61 static void png_ptr_read_deleter( png_ptr_wrapper* png_ptr )
65 if( png_ptr->_struct && png_ptr->_info )
67 png_destroy_read_struct( &png_ptr->_struct
78 static void png_ptr_write_deleter( png_ptr_wrapper* png_ptr )
82 if( png_ptr->_struct && png_ptr->_info )
84 png_destroy_write_struct( &png_ptr->_struct
100 } // namespace detail