File indexing completed on 2025-12-16 09:51:46
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
0009 #define BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
0010
0011 #include <boost/gil/extension/io/png/tags.hpp>
0012
0013 #include <boost/assert.hpp>
0014
0015 #include <memory>
0016
0017 namespace boost { namespace gil { namespace detail {
0018
0019 struct png_ptr_wrapper
0020 {
0021 png_ptr_wrapper()
0022 : _struct( nullptr )
0023 , _info ( nullptr )
0024 {}
0025
0026 png_structp _struct;
0027 png_infop _info;
0028 };
0029
0030
0031
0032
0033 struct png_struct_info_wrapper
0034 {
0035 protected:
0036
0037 using png_ptr_t = std::shared_ptr<png_ptr_wrapper>;
0038
0039 protected:
0040
0041
0042
0043
0044 png_struct_info_wrapper( bool read = true )
0045 : _png_ptr( new png_ptr_wrapper()
0046 , ( ( read ) ? png_ptr_read_deleter : png_ptr_write_deleter )
0047 )
0048 {}
0049
0050 png_ptr_wrapper* get() { return _png_ptr.get(); }
0051 png_ptr_wrapper const* get() const { return _png_ptr.get(); }
0052
0053 png_struct* get_struct() { return get()->_struct; }
0054 png_struct const* get_struct() const { return get()->_struct; }
0055
0056 png_info* get_info() { return get()->_info; }
0057 png_info const* get_info() const { return get()->_info; }
0058
0059 private:
0060
0061 static void png_ptr_read_deleter( png_ptr_wrapper* png_ptr )
0062 {
0063 if( png_ptr )
0064 {
0065 if( png_ptr->_struct && png_ptr->_info )
0066 {
0067 png_destroy_read_struct( &png_ptr->_struct
0068 , &png_ptr->_info
0069 , nullptr
0070 );
0071 }
0072
0073 delete png_ptr;
0074 png_ptr = nullptr;
0075 }
0076 }
0077
0078 static void png_ptr_write_deleter( png_ptr_wrapper* png_ptr )
0079 {
0080 if( png_ptr )
0081 {
0082 if( png_ptr->_struct && png_ptr->_info )
0083 {
0084 png_destroy_write_struct( &png_ptr->_struct
0085 , &png_ptr->_info
0086 );
0087 }
0088
0089 delete png_ptr;
0090 png_ptr = nullptr;
0091 }
0092 }
0093
0094
0095 private:
0096
0097 png_ptr_t _png_ptr;
0098 };
0099
0100 }
0101 }
0102 }
0103
0104 #endif