base.hpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //
  2. // Copyright 2012 Christian Henning
  3. //
  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
  7. //
  8. #ifndef BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
  9. #define BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
  10. #include <boost/gil/extension/io/png/tags.hpp>
  11. #include <boost/assert.hpp>
  12. #include <memory>
  13. namespace boost { namespace gil { namespace detail {
  14. struct png_ptr_wrapper
  15. {
  16. png_ptr_wrapper()
  17. : _struct( nullptr )
  18. , _info ( nullptr )
  19. {}
  20. png_structp _struct;
  21. png_infop _info;
  22. };
  23. ///
  24. /// Wrapper for libpng's png_struct and png_info object. Implements value semantics.
  25. ///
  26. struct png_struct_info_wrapper
  27. {
  28. protected:
  29. using png_ptr_t = std::shared_ptr<png_ptr_wrapper>;
  30. protected:
  31. ///
  32. /// Default Constructor
  33. ///
  34. png_struct_info_wrapper( bool read = true )
  35. : _png_ptr( new png_ptr_wrapper()
  36. , ( ( read ) ? png_ptr_read_deleter : png_ptr_write_deleter )
  37. )
  38. {}
  39. png_ptr_wrapper* get() { return _png_ptr.get(); }
  40. png_ptr_wrapper const* get() const { return _png_ptr.get(); }
  41. png_struct* get_struct() { return get()->_struct; }
  42. png_struct const* get_struct() const { return get()->_struct; }
  43. png_info* get_info() { return get()->_info; }
  44. png_info const* get_info() const { return get()->_info; }
  45. private:
  46. static void png_ptr_read_deleter( png_ptr_wrapper* png_ptr )
  47. {
  48. if( png_ptr )
  49. {
  50. if( png_ptr->_struct && png_ptr->_info )
  51. {
  52. png_destroy_read_struct( &png_ptr->_struct
  53. , &png_ptr->_info
  54. , nullptr
  55. );
  56. }
  57. delete png_ptr;
  58. png_ptr = nullptr;
  59. }
  60. }
  61. static void png_ptr_write_deleter( png_ptr_wrapper* png_ptr )
  62. {
  63. if( png_ptr )
  64. {
  65. if( png_ptr->_struct && png_ptr->_info )
  66. {
  67. png_destroy_write_struct( &png_ptr->_struct
  68. , &png_ptr->_info
  69. );
  70. }
  71. delete png_ptr;
  72. png_ptr = nullptr;
  73. }
  74. }
  75. private:
  76. png_ptr_t _png_ptr;
  77. };
  78. } // namespace detail
  79. } // namespace gil
  80. } // namespace boost
  81. #endif