OpenImageIO
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
imagebufalgo_util.h
1 /*
2  Copyright 2013 Larry Gritz and the other authors and contributors.
3  All Rights Reserved.
4 
5  Redistribution and use in source and binary forms, with or without
6  modification, are permitted provided that the following conditions are
7  met:
8  * Redistributions of source code must retain the above copyright
9  notice, this list of conditions and the following disclaimer.
10  * Redistributions in binary form must reproduce the above copyright
11  notice, this list of conditions and the following disclaimer in the
12  documentation and/or other materials provided with the distribution.
13  * Neither the name of the software's owners nor the names of its
14  contributors may be used to endorse or promote products derived from
15  this software without specific prior written permission.
16  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28  (This is the Modified BSD License)
29 */
30 
31 
32 #ifndef OPENIMAGEIO_IMAGEBUFALGO_UTIL_H
33 #define OPENIMAGEIO_IMAGEBUFALGO_UTIL_H
34 
35 #include "imagebufalgo.h"
36 
37 
38 OIIO_NAMESPACE_ENTER
39 {
40 
41 
42 
43 
44 namespace ImageBufAlgo {
45 
65 template <class Func>
66 void
67 parallel_image (Func f, ROI roi, int nthreads=0)
68 {
69  // Special case: threads <= 0 means to use the "threads" attribute
70  if (nthreads <= 0)
71  OIIO::getattribute ("threads", nthreads);
72 
73  if (nthreads <= 1 || roi.npixels() < 1000) {
74  // Just one thread, or a small image region: use this thread only
75  f (roi);
76  } else {
77  // Spawn threads by dividing the region into y bands.
78  boost::thread_group threads;
79  int blocksize = std::max (1, (roi.height() + nthreads - 1) / nthreads);
80  int roi_ybegin = roi.ybegin;
81  int roi_yend = roi.yend;
82  for (int i = 0; i < nthreads; i++) {
83  roi.ybegin = roi_ybegin + i * blocksize;
84  roi.yend = std::min (roi.ybegin + blocksize, roi_yend);
85  if (roi.ybegin >= roi.yend)
86  break; // no more work to dole out
87  threads.add_thread (new boost::thread (f, roi));
88  }
89  threads.join_all ();
90  }
91 }
92 
93 
94 
103 void OIIO_API IBAprep (ROI &roi, ImageBuf *dst,
104  const ImageBuf *A=NULL, const ImageBuf *B=NULL);
105 
106 
107 
108 // Macro to call a type-specialzed version func<type>(R,...)
109 #define OIIO_DISPATCH_TYPES(name,func,type,R,...) \
110  switch (type.basetype) { \
111  case TypeDesc::FLOAT : \
112  return func<float> (R, __VA_ARGS__); break; \
113  case TypeDesc::UINT8 : \
114  return func<unsigned char> (R, __VA_ARGS__); break; \
115  case TypeDesc::HALF : \
116  return func<half> (R, __VA_ARGS__); break; \
117  case TypeDesc::UINT16: \
118  return func<unsigned short> (R, __VA_ARGS__); break; \
119  case TypeDesc::INT8 : \
120  return func<char> (R, __VA_ARGS__); break; \
121  case TypeDesc::INT16 : \
122  return func<short> (R, __VA_ARGS__); break; \
123  case TypeDesc::UINT : \
124  return func<unsigned int> (R, __VA_ARGS__); break; \
125  case TypeDesc::INT : \
126  return func<int> (R, __VA_ARGS__); break; \
127  case TypeDesc::DOUBLE: \
128  return func<double> (R, __VA_ARGS__); break; \
129  default: \
130  (R).error ("%s: Unsupported pixel data format '%s'", name, type); \
131  return false; \
132  }
133 
134 // Helper, do not call from the outside world.
135 #define OIIO_DISPATCH_TYPES2_HELP(name,func,Atype,Btype,R,...) \
136  switch (Btype.basetype) { \
137  case TypeDesc::FLOAT : \
138  return func<Atype,float> (R, __VA_ARGS__); break; \
139  case TypeDesc::UINT8 : \
140  return func<Atype,unsigned char> (R, __VA_ARGS__); break; \
141  case TypeDesc::HALF : \
142  return func<Atype,half> (R, __VA_ARGS__); break; \
143  case TypeDesc::UINT16: \
144  return func<Atype,unsigned short> (R, __VA_ARGS__); break; \
145  case TypeDesc::INT8 : \
146  return func<Atype,char> (R, __VA_ARGS__); break; \
147  case TypeDesc::INT16 : \
148  return func<Atype,short> (R, __VA_ARGS__); break; \
149  case TypeDesc::UINT : \
150  return func<Atype,unsigned int> (R, __VA_ARGS__); break; \
151  case TypeDesc::INT : \
152  return func<Atype,int> (R, __VA_ARGS__); break; \
153  case TypeDesc::DOUBLE : \
154  return func<Atype,double> (R, __VA_ARGS__); break; \
155  default: \
156  (R).error ("%s: Unsupported pixel data format '%s'", name, Btype); \
157  return false; \
158  }
159 
160 // Macro to call a type-specialzed version func<Atype,Btype>(R,...).
161 #define OIIO_DISPATCH_TYPES2(name,func,Atype,Btype,R,...) \
162  switch (Atype.basetype) { \
163  case TypeDesc::FLOAT : \
164  OIIO_DISPATCH_TYPES2_HELP(name,func,float,Btype,R,__VA_ARGS__); \
165  case TypeDesc::UINT8 : \
166  OIIO_DISPATCH_TYPES2_HELP(name,func,unsigned char,Btype,R,__VA_ARGS__); \
167  case TypeDesc::HALF : \
168  OIIO_DISPATCH_TYPES2_HELP(name,func,half,Btype,R,__VA_ARGS__); \
169  case TypeDesc::UINT16: \
170  OIIO_DISPATCH_TYPES2_HELP(name,func,unsigned short,Btype,R,__VA_ARGS__); \
171  case TypeDesc::INT8: \
172  OIIO_DISPATCH_TYPES2_HELP(name,func,char,Btype,R,__VA_ARGS__); \
173  case TypeDesc::INT16: \
174  OIIO_DISPATCH_TYPES2_HELP(name,func,short,Btype,R,__VA_ARGS__); \
175  case TypeDesc::UINT: \
176  OIIO_DISPATCH_TYPES2_HELP(name,func,unsigned int,Btype,R,__VA_ARGS__); \
177  case TypeDesc::INT: \
178  OIIO_DISPATCH_TYPES2_HELP(name,func,int,Btype,R,__VA_ARGS__); \
179  case TypeDesc::DOUBLE: \
180  OIIO_DISPATCH_TYPES2_HELP(name,func,double,Btype,R,__VA_ARGS__);\
181  default: \
182  (R).error ("%s: Unsupported pixel data format '%s'", name, Atype); \
183  return false; \
184  }
185 
186 
187 // Macro to call a type-specialzed version func<type>(R,...) for
188 // the most common types, fail for anything else.
189 #define OIIO_DISPATCH_COMMON_TYPES(name,func,type,R,...) \
190  switch (type.basetype) { \
191  case TypeDesc::FLOAT : \
192  return func<float> (R, __VA_ARGS__); break; \
193  case TypeDesc::UINT8 : \
194  return func<unsigned char> (R, __VA_ARGS__); break; \
195  case TypeDesc::HALF : \
196  return func<half> (R, __VA_ARGS__); break; \
197  case TypeDesc::UINT16: \
198  return func<unsigned short> (R, __VA_ARGS__); break; \
199  default: \
200  (R).error ("%s: Unsupported pixel data format '%s'", name, type); \
201  return false; \
202  }
203 
204 // Helper, do not call from the outside world.
205 #define OIIO_DISPATCH_COMMON_TYPES2_HELP(name,func,Atype,Btype,R,...) \
206  switch (Btype.basetype) { \
207  case TypeDesc::FLOAT : \
208  return func<Atype,float> (R, __VA_ARGS__); break; \
209  case TypeDesc::UINT8 : \
210  return func<Atype,unsigned char> (R, __VA_ARGS__); break; \
211  case TypeDesc::HALF : \
212  return func<Atype,half> (R, __VA_ARGS__); break; \
213  case TypeDesc::UINT16: \
214  return func<Atype,unsigned short> (R, __VA_ARGS__); break; \
215  default: \
216  (R).error ("%s: Unsupported pixel data format '%s'", name, Btype); \
217  return false; \
218  }
219 
220 // Macro to call a type-specialzed version func<Atype,Btype>(R,...) for
221 // the most common types, fail for anything else.
222 #define OIIO_DISPATCH_COMMON_TYPES2(name,func,Atype,Btype,R,...) \
223  switch (Atype.basetype) { \
224  case TypeDesc::FLOAT : \
225  OIIO_DISPATCH_COMMON_TYPES2_HELP(name,func,float,Btype,R,__VA_ARGS__); \
226  case TypeDesc::UINT8 : \
227  OIIO_DISPATCH_COMMON_TYPES2_HELP(name,func,unsigned char,Btype,R,__VA_ARGS__); \
228  case TypeDesc::HALF : \
229  OIIO_DISPATCH_COMMON_TYPES2_HELP(name,func,half,Btype,R,__VA_ARGS__); \
230  case TypeDesc::UINT16: \
231  OIIO_DISPATCH_COMMON_TYPES2_HELP(name,func,unsigned short,Btype,R,__VA_ARGS__); \
232  default: \
233  (R).error ("%s: Unsupported pixel data format '%s'", name, Atype); \
234  return false; \
235  }
236 
237 
238 // Helper, do not call from the outside world.
239 #define OIIO_DISPATCH_COMMON_TYPES3_HELP2(name,func,Rtype,Atype,Btype,R,...) \
240  switch (Rtype.basetype) { \
241  case TypeDesc::FLOAT : \
242  return func<float,Atype,Btype> (R, __VA_ARGS__); break; \
243  case TypeDesc::UINT8 : \
244  return func<unsigned char,Atype,Btype> (R, __VA_ARGS__); break; \
245  case TypeDesc::HALF : \
246  return func<half,Atype,Btype> (R, __VA_ARGS__); break; \
247  case TypeDesc::UINT16: \
248  return func<unsigned short,Atype,Btype> (R, __VA_ARGS__); break; \
249  default: \
250  (R).error ("%s: Unsupported pixel data format '%s'", name, Rtype); \
251  return false; \
252  }
253 
254 // Helper, do not call from the outside world.
255 #define OIIO_DISPATCH_COMMON_TYPES3_HELP(name,func,Rtype,Atype,Btype,R,...) \
256  switch (Btype.basetype) { \
257  case TypeDesc::FLOAT : \
258  OIIO_DISPATCH_COMMON_TYPES3_HELP2(name,func,Rtype,Atype,float,R,__VA_ARGS__); \
259  case TypeDesc::UINT8 : \
260  OIIO_DISPATCH_COMMON_TYPES3_HELP2(name,func,Rtype,Atype,unsigned char,R,__VA_ARGS__); \
261  case TypeDesc::HALF : \
262  OIIO_DISPATCH_COMMON_TYPES3_HELP2(name,func,Rtype,Atype,half,R,__VA_ARGS__); \
263  case TypeDesc::UINT16 : \
264  OIIO_DISPATCH_COMMON_TYPES3_HELP2(name,func,Rtype,Atype,unsigned short,R,__VA_ARGS__); \
265  default: \
266  (R).error ("%s: Unsupported pixel data format '%s'", name, Btype); \
267  return false; \
268  }
269 
270 // Macro to call a type-specialzed version func<Rtype,Atype,Btype>(R,...)
271 // for the most common types, fail for anything else.
272 #define OIIO_DISPATCH_COMMON_TYPES3(name,func,Rtype,Atype,Btype,R,...) \
273  switch (Atype.basetype) { \
274  case TypeDesc::FLOAT : \
275  OIIO_DISPATCH_COMMON_TYPES3_HELP(name,func,Rtype,float,Btype,R,__VA_ARGS__); \
276  case TypeDesc::UINT8 : \
277  OIIO_DISPATCH_COMMON_TYPES3_HELP(name,func,Rtype,unsigned char,Btype,R,__VA_ARGS__); \
278  case TypeDesc::HALF : \
279  OIIO_DISPATCH_COMMON_TYPES3_HELP(name,func,Rtype,half,Btype,R,__VA_ARGS__); \
280  case TypeDesc::UINT16: \
281  OIIO_DISPATCH_COMMON_TYPES3_HELP(name,func,Rtype,unsigned short,Btype,R,__VA_ARGS__); \
282  default: \
283  (R).error ("%s: Unsupported pixel data format '%s'", name, Atype); \
284  return false; \
285  }
286 
287 
288 
289 } // end namespace ImageBufAlgo
290 
291 
292 }
293 OIIO_NAMESPACE_EXIT
294 
295 #endif // OPENIMAGEIO_IMAGEBUFALGO_UTIL_H