base.hpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. Copyright 2012 Christian Henning
  3. Use, modification and distribution are subject to the Boost Software License,
  4. Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt).
  6. */
  7. #ifndef BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
  8. #define BOOST_GIL_EXTENSION_IO_PNG_DETAIL_BASE_HPP
  9. ////////////////////////////////////////////////////////////////////////////////////////
  10. /// \file
  11. /// \brief
  12. /// \author Christian Henning \n
  13. ///
  14. /// \date 2012 \n
  15. ///
  16. ////////////////////////////////////////////////////////////////////////////////////////
  17. #include <boost/gil/extension/io/png/tags.hpp>
  18. #include <memory>
  19. namespace boost { namespace gil { namespace detail {
  20. struct png_ptr_wrapper
  21. {
  22. png_ptr_wrapper()
  23. : _struct( NULL )
  24. , _info ( NULL )
  25. {}
  26. png_structp _struct;
  27. png_infop _info;
  28. };
  29. ///
  30. /// Wrapper for libpng's png_struct and png_info object. Implements value semantics.
  31. ///
  32. struct png_struct_info_wrapper
  33. {
  34. protected:
  35. using png_ptr_t = std::shared_ptr<png_ptr_wrapper>;
  36. protected:
  37. ///
  38. /// Default Constructor
  39. ///
  40. png_struct_info_wrapper( bool read = true )
  41. : _png_ptr( new png_ptr_wrapper()
  42. , ( ( read ) ? png_ptr_read_deleter : png_ptr_write_deleter )
  43. )
  44. {}
  45. png_ptr_wrapper* get() { return _png_ptr.get(); }
  46. const png_ptr_wrapper* get() const { return _png_ptr.get(); }
  47. png_structp get_struct() { return get()->_struct; }
  48. const png_structp get_struct() const { return get()->_struct; }
  49. png_infop get_info() { return get()->_info; }
  50. const png_infop get_info() const { return get()->_info; }
  51. private:
  52. static void png_ptr_read_deleter( png_ptr_wrapper* png_ptr )
  53. {
  54. if( png_ptr )
  55. {
  56. assert( png_ptr->_struct && png_ptr->_info );
  57. png_destroy_read_struct( &png_ptr->_struct
  58. , &png_ptr->_info
  59. , NULL
  60. );
  61. delete png_ptr;
  62. png_ptr = NULL;
  63. }
  64. }
  65. static void png_ptr_write_deleter( png_ptr_wrapper* png_ptr )
  66. {
  67. if( png_ptr )
  68. {
  69. assert( png_ptr->_struct && png_ptr->_info );
  70. png_destroy_write_struct( &png_ptr->_struct
  71. , &png_ptr->_info
  72. );
  73. delete png_ptr;
  74. png_ptr = NULL;
  75. }
  76. }
  77. private:
  78. png_ptr_t _png_ptr;
  79. };
  80. } // namespace detail
  81. } // namespace gil
  82. } // namespace boost
  83. #endif