32 #ifndef OPENIMAGEIO_IMAGEBUFALGO_UTIL_H
33 #define OPENIMAGEIO_IMAGEBUFALGO_UTIL_H
35 #include "imagebufalgo.h"
44 namespace ImageBufAlgo {
67 parallel_image (Func f,
ROI roi,
int nthreads=0)
73 if (nthreads <= 1 || roi.
npixels() < 1000) {
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)
87 threads.add_thread (
new boost::thread (f, roi));
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; \
130 (R).error ("%s: Unsupported pixel data format '%s'", name, type); \
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; \
156 (R).error ("%s: Unsupported pixel data format '%s'", name, Btype); \
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__);\
182 (R).error ("%s: Unsupported pixel data format '%s'", name, Atype); \
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; \
200 (R).error ("%s: Unsupported pixel data format '%s'", name, type); \
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; \
216 (R).error ("%s: Unsupported pixel data format '%s'", name, Btype); \
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__); \
233 (R).error ("%s: Unsupported pixel data format '%s'", name, Atype); \
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; \
250 (R).error ("%s: Unsupported pixel data format '%s'", name, Rtype); \
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__); \
266 (R).error ("%s: Unsupported pixel data format '%s'", name, Btype); \
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__); \
283 (R).error ("%s: Unsupported pixel data format '%s'", name, Atype); \
295 #endif // OPENIMAGEIO_IMAGEBUFALGO_UTIL_H