]>
Commit | Line | Data |
---|---|---|
92f5a8d4 TL |
1 | // |
2 | // Copyright 2005-2007 Adobe Systems Incorporated | |
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_CONCEPTS_IMAGE_HPP | |
9 | #define BOOST_GIL_CONCEPTS_IMAGE_HPP | |
10 | ||
11 | #include <boost/gil/concepts/basic.hpp> | |
12 | #include <boost/gil/concepts/concept_check.hpp> | |
13 | #include <boost/gil/concepts/fwd.hpp> | |
14 | #include <boost/gil/concepts/image_view.hpp> | |
15 | #include <boost/gil/concepts/point.hpp> | |
16 | #include <boost/gil/detail/mp11.hpp> | |
17 | ||
18 | #include <type_traits> | |
19 | ||
20 | #if defined(BOOST_CLANG) | |
21 | #pragma clang diagnostic push | |
f67539c2 | 22 | #pragma clang diagnostic ignored "-Wunknown-pragmas" |
92f5a8d4 TL |
23 | #pragma clang diagnostic ignored "-Wunused-local-typedefs" |
24 | #endif | |
25 | ||
26 | #if defined(BOOST_GCC) && (BOOST_GCC >= 40900) | |
27 | #pragma GCC diagnostic push | |
28 | #pragma GCC diagnostic ignored "-Wunused-local-typedefs" | |
29 | #endif | |
30 | ||
31 | namespace boost { namespace gil { | |
32 | ||
33 | /// \ingroup ImageConcept | |
34 | /// \brief N-dimensional container of values | |
35 | /// | |
36 | /// \code | |
37 | /// concept RandomAccessNDImageConcept<typename Image> : Regular<Image> | |
38 | /// { | |
39 | /// typename view_t; where MutableRandomAccessNDImageViewConcept<view_t>; | |
40 | /// typename const_view_t = view_t::const_t; | |
41 | /// typename point_t = view_t::point_t; | |
42 | /// typename value_type = view_t::value_type; | |
43 | /// typename allocator_type; | |
44 | /// | |
45 | /// Image::Image(point_t dims, std::size_t alignment=1); | |
46 | /// Image::Image(point_t dims, value_type fill_value, std::size_t alignment); | |
47 | /// | |
48 | /// void Image::recreate(point_t new_dims, std::size_t alignment=1); | |
49 | /// void Image::recreate(point_t new_dims, value_type fill_value, std::size_t alignment); | |
50 | /// | |
51 | /// const point_t& Image::dimensions() const; | |
52 | /// const const_view_t& const_view(const Image&); | |
53 | /// const view_t& view(Image&); | |
54 | /// }; | |
55 | /// \endcode | |
56 | template <typename Image> | |
57 | struct RandomAccessNDImageConcept | |
58 | { | |
59 | void constraints() | |
60 | { | |
61 | gil_function_requires<Regular<Image>>(); | |
62 | ||
63 | using view_t = typename Image::view_t; | |
64 | gil_function_requires<MutableRandomAccessNDImageViewConcept<view_t>>(); | |
65 | ||
66 | using const_view_t = typename Image::const_view_t; | |
67 | using pixel_t = typename Image::value_type; | |
68 | using point_t = typename Image::point_t; | |
69 | gil_function_requires<PointNDConcept<point_t>>(); | |
70 | ||
71 | const_view_t cv = const_view(image); | |
72 | ignore_unused_variable_warning(cv); | |
73 | view_t v = view(image); | |
74 | ignore_unused_variable_warning(v); | |
75 | ||
76 | pixel_t fill_value; | |
77 | point_t pt = image.dimensions(); | |
78 | Image image1(pt); | |
79 | Image image2(pt, 1); | |
80 | Image image3(pt, fill_value, 1); | |
81 | image.recreate(pt); | |
82 | image.recreate(pt, 1); | |
83 | image.recreate(pt, fill_value, 1); | |
84 | } | |
85 | Image image; | |
86 | }; | |
87 | ||
88 | ||
89 | /// \ingroup ImageConcept | |
90 | /// \brief 2-dimensional container of values | |
91 | /// | |
92 | /// \code | |
93 | /// concept RandomAccess2DImageConcept<RandomAccessNDImageConcept Image> | |
94 | /// { | |
95 | /// typename x_coord_t = const_view_t::x_coord_t; | |
96 | /// typename y_coord_t = const_view_t::y_coord_t; | |
97 | /// | |
98 | /// Image::Image(x_coord_t width, y_coord_t height, std::size_t alignment=1); | |
99 | /// Image::Image(x_coord_t width, y_coord_t height, value_type fill_value, std::size_t alignment); | |
100 | /// | |
101 | /// x_coord_t Image::width() const; | |
102 | /// y_coord_t Image::height() const; | |
103 | /// | |
104 | /// void Image::recreate(x_coord_t width, y_coord_t height, std::size_t alignment=1); | |
105 | /// void Image::recreate(x_coord_t width, y_coord_t height, value_type fill_value, std::size_t alignment); | |
106 | /// }; | |
107 | /// \endcode | |
108 | template <typename Image> | |
109 | struct RandomAccess2DImageConcept | |
110 | { | |
111 | void constraints() | |
112 | { | |
113 | gil_function_requires<RandomAccessNDImageConcept<Image>>(); | |
114 | using x_coord_t = typename Image::x_coord_t; | |
115 | using y_coord_t = typename Image::y_coord_t; | |
116 | using value_t = typename Image::value_type; | |
117 | ||
118 | gil_function_requires<MutableRandomAccess2DImageViewConcept<typename Image::view_t>>(); | |
119 | ||
120 | x_coord_t w=image.width(); | |
121 | y_coord_t h=image.height(); | |
122 | value_t fill_value; | |
123 | Image im1(w,h); | |
124 | Image im2(w,h,1); | |
125 | Image im3(w,h,fill_value,1); | |
126 | image.recreate(w,h); | |
127 | image.recreate(w,h,1); | |
128 | image.recreate(w,h,fill_value,1); | |
129 | } | |
130 | Image image; | |
131 | }; | |
132 | ||
133 | /// \ingroup ImageConcept | |
134 | /// \brief 2-dimensional image whose value type models PixelValueConcept | |
135 | /// | |
136 | /// \code | |
137 | /// concept ImageConcept<RandomAccess2DImageConcept Image> | |
138 | /// { | |
139 | /// where MutableImageViewConcept<view_t>; | |
140 | /// typename coord_t = view_t::coord_t; | |
141 | /// }; | |
142 | /// \endcode | |
143 | template <typename Image> | |
144 | struct ImageConcept | |
145 | { | |
146 | void constraints() | |
147 | { | |
148 | gil_function_requires<RandomAccess2DImageConcept<Image>>(); | |
149 | gil_function_requires<MutableImageViewConcept<typename Image::view_t>>(); | |
150 | using coord_t = typename Image::coord_t; | |
151 | static_assert(num_channels<Image>::value == mp11::mp_size<typename color_space_type<Image>::type>::value, ""); | |
152 | ||
153 | static_assert(std::is_same<coord_t, typename Image::x_coord_t>::value, ""); | |
154 | static_assert(std::is_same<coord_t, typename Image::y_coord_t>::value, ""); | |
155 | } | |
156 | Image image; | |
157 | }; | |
158 | ||
159 | }} // namespace boost::gil | |
160 | ||
161 | #if defined(BOOST_CLANG) | |
162 | #pragma clang diagnostic pop | |
163 | #endif | |
164 | ||
165 | #if defined(BOOST_GCC) && (BOOST_GCC >= 40900) | |
166 | #pragma GCC diagnostic pop | |
167 | #endif | |
168 | ||
169 | #endif |