Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / gil / extension / io / png / detail / base.hpp
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
11 #include <boost/gil/extension/io/png/tags.hpp>
12
13 #include <boost/assert.hpp>
14
15 #include <memory>
16
17 namespace boost { namespace gil { namespace detail {
18
19 struct png_ptr_wrapper
20 {
21     png_ptr_wrapper()
22     : _struct( nullptr )
23     , _info  ( nullptr )
24     {}
25
26     png_structp _struct;
27     png_infop   _info;
28 };
29
30 ///
31 /// Wrapper for libpng's png_struct and png_info object. Implements value semantics.
32 ///
33 struct png_struct_info_wrapper
34 {
35 protected:
36
37     using png_ptr_t = std::shared_ptr<png_ptr_wrapper>;
38
39 protected:
40
41     ///
42     /// Default Constructor
43     ///
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 )
47               )
48     {}
49
50     png_ptr_wrapper*       get()       { return _png_ptr.get(); }
51     png_ptr_wrapper const* get() const { return _png_ptr.get(); }
52
53     png_struct*       get_struct()       { return get()->_struct; }
54     png_struct const* get_struct() const { return get()->_struct; }
55
56     png_info*       get_info()       { return get()->_info; }
57     png_info const* get_info() const { return get()->_info; }
58
59 private:
60
61     static void png_ptr_read_deleter( png_ptr_wrapper* png_ptr )
62     {
63         if( png_ptr )
64         {
65             if( png_ptr->_struct && png_ptr->_info )
66             {
67                 png_destroy_read_struct( &png_ptr->_struct
68                                        , &png_ptr->_info
69                                        , nullptr
70                                        );
71             }
72
73             delete png_ptr;
74             png_ptr = nullptr;
75         }
76     }
77
78     static void png_ptr_write_deleter( png_ptr_wrapper* png_ptr )
79     {
80         if( png_ptr )
81         {
82             if( png_ptr->_struct && png_ptr->_info )
83             {
84                 png_destroy_write_struct( &png_ptr->_struct
85                                         , &png_ptr->_info
86                                         );
87             }
88
89             delete png_ptr;
90             png_ptr = nullptr;
91         }
92     }
93
94
95 private:
96
97     png_ptr_t _png_ptr;
98 };
99
100 } // namespace detail
101 } // namespace gil
102 } // namespace boost
103
104 #endif