20 using namespace std::placeholders;
21 using std::placeholders::_1;
24 namespace ImageBufAlgo {
60 int64_t xchunk = 0, ychunk = 0;
71 xchunk = ychunk =
std::max(int64_t(1),
75 auto task = [&](int64_t xbegin, int64_t xend, int64_t ybegin,
119 ImageSpec* force_spec = NULL,
int prepflags = 0);
122 ImageSpec* force_spec,
int prepflags = 0)
124 return IBAprep(roi, dst, A, B, NULL, force_spec, prepflags);
130 return IBAprep(roi, dst, A, B, NULL, NULL, prepflags);
135 return IBAprep(roi, dst, A, NULL, NULL, NULL, prepflags);
140 return IBAprep(roi, dst,
nullptr,
nullptr,
nullptr,
nullptr, prepflags);
185 #define OIIO_DISPATCH_TYPES(ret,name,func,type,R,...) \
186 switch (type.basetype) { \
187 case TypeDesc::FLOAT : \
188 ret = func<float> (R, __VA_ARGS__); break; \
189 case TypeDesc::UINT8 : \
190 ret = func<unsigned char> (R, __VA_ARGS__); break; \
191 case TypeDesc::HALF : \
192 ret = func<half> (R, __VA_ARGS__); break; \
193 case TypeDesc::UINT16: \
194 ret = func<unsigned short> (R, __VA_ARGS__); break; \
195 case TypeDesc::INT8 : \
196 ret = func<char> (R, __VA_ARGS__); break; \
197 case TypeDesc::INT16 : \
198 ret = func<short> (R, __VA_ARGS__); break; \
199 case TypeDesc::UINT : \
200 ret = func<unsigned int> (R, __VA_ARGS__); break; \
201 case TypeDesc::INT : \
202 ret = func<int> (R, __VA_ARGS__); break; \
203 case TypeDesc::DOUBLE: \
204 ret = func<double> (R, __VA_ARGS__); break; \
206 (R).errorfmt("{}: Unsupported pixel data format '{}'", name, type); \
211 #define OIIO_DISPATCH_TYPES2_HELP(ret,name,func,Rtype,Atype,R,...) \
212 switch (Atype.basetype) { \
213 case TypeDesc::FLOAT : \
214 ret = func<Rtype,float> (R, __VA_ARGS__); break; \
215 case TypeDesc::UINT8 : \
216 ret = func<Rtype,unsigned char> (R, __VA_ARGS__); break; \
217 case TypeDesc::HALF : \
218 ret = func<Rtype,half> (R, __VA_ARGS__); break; \
219 case TypeDesc::UINT16: \
220 ret = func<Rtype,unsigned short> (R, __VA_ARGS__); break; \
221 case TypeDesc::INT8 : \
222 ret = func<Rtype,char> (R, __VA_ARGS__); break; \
223 case TypeDesc::INT16 : \
224 ret = func<Rtype,short> (R, __VA_ARGS__); break; \
225 case TypeDesc::UINT : \
226 ret = func<Rtype,unsigned int> (R, __VA_ARGS__); break; \
227 case TypeDesc::INT : \
228 ret = func<Rtype,int> (R, __VA_ARGS__); break; \
229 case TypeDesc::DOUBLE : \
230 ret = func<Rtype,double> (R, __VA_ARGS__); break; \
232 (R).errorfmt("{}: Unsupported pixel data format '{}'", name, Atype); \
237 #define OIIO_DISPATCH_TYPES2(ret,name,func,Rtype,Atype,R,...) \
238 switch (Rtype.basetype) { \
239 case TypeDesc::FLOAT : \
240 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,float,Atype,R,__VA_ARGS__); \
242 case TypeDesc::UINT8 : \
243 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,unsigned char,Atype,R,__VA_ARGS__); \
245 case TypeDesc::HALF : \
246 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,half,Atype,R,__VA_ARGS__); \
248 case TypeDesc::UINT16: \
249 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,unsigned short,Atype,R,__VA_ARGS__); \
251 case TypeDesc::INT8: \
252 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,char,Atype,R,__VA_ARGS__); \
254 case TypeDesc::INT16: \
255 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,short,Atype,R,__VA_ARGS__); \
257 case TypeDesc::UINT: \
258 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,unsigned int,Atype,R,__VA_ARGS__); \
260 case TypeDesc::INT: \
261 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,int,Atype,R,__VA_ARGS__); \
263 case TypeDesc::DOUBLE: \
264 OIIO_DISPATCH_TYPES2_HELP(ret,name,func,double,Atype,R,__VA_ARGS__);\
267 (R).errorfmt("{}: Unsupported pixel data format '{}'", name, Rtype); \
274 #define OIIO_DISPATCH_COMMON_TYPES(ret,name,func,type,R,...) \
275 switch (type.basetype) { \
276 case TypeDesc::FLOAT : \
277 ret = func<float> (R, __VA_ARGS__); break; \
278 case TypeDesc::UINT8 : \
279 ret = func<unsigned char> (R, __VA_ARGS__); break; \
280 case TypeDesc::HALF : \
281 ret = func<half> (R, __VA_ARGS__); break; \
282 case TypeDesc::UINT16: \
283 ret = func<unsigned short> (R, __VA_ARGS__); break; \
287 if ((R).initialized()) \
288 Rtmp.copy (R, TypeDesc::FLOAT); \
289 ret = func<float> (Rtmp, __VA_ARGS__); \
293 (R).errorfmt("{}", Rtmp.geterror()); \
298 #define OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,Rtype,Atype,R,A,...) \
299 switch (Atype.basetype) { \
300 case TypeDesc::FLOAT : \
301 ret = func<Rtype,float> (R, A, __VA_ARGS__); break; \
302 case TypeDesc::UINT8 : \
303 ret = func<Rtype,unsigned char> (R, A, __VA_ARGS__); break; \
304 case TypeDesc::HALF : \
305 ret = func<Rtype,half> (R, A, __VA_ARGS__); break; \
306 case TypeDesc::UINT16: \
307 ret = func<Rtype,unsigned short> (R, A, __VA_ARGS__); break; \
311 Atmp.copy (A, TypeDesc::FLOAT); \
312 ret = func<Rtype,float> (R, Atmp, __VA_ARGS__); \
319 #define OIIO_DISPATCH_COMMON_TYPES2(ret,name,func,Rtype,Atype,R,A,...) \
320 if (Rtype == Atype) { \
322 switch (Atype.basetype) { \
323 case TypeDesc::FLOAT : \
324 ret = func<float,float> (R, A, __VA_ARGS__); break; \
325 case TypeDesc::UINT8 : \
326 ret = func<uint8_t,uint8_t> (R, A, __VA_ARGS__); break; \
327 case TypeDesc::UINT16: \
328 ret = func<uint16_t,uint16_t> (R, A, __VA_ARGS__); break; \
329 case TypeDesc::HALF : \
330 ret = func<half,half> (R, A, __VA_ARGS__); break; \
331 case TypeDesc::INT8 : \
332 ret = func<char,char> (R, A, __VA_ARGS__); break; \
333 case TypeDesc::INT16 : \
334 ret = func<short,short> (R, A, __VA_ARGS__); break; \
335 case TypeDesc::UINT : \
336 ret = func<uint32_t,uint32_t> (R, A, __VA_ARGS__); break; \
337 case TypeDesc::INT : \
338 ret = func<int,int> (R, A, __VA_ARGS__); break; \
339 case TypeDesc::DOUBLE : \
340 ret = func<double,double> (R, A, __VA_ARGS__); break; \
342 (R).errorfmt("{}: Unsupported pixel data format '{}'", name, Atype); \
347 switch (Rtype.basetype) { \
348 case TypeDesc::FLOAT : \
349 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,float,Atype,R,A,__VA_ARGS__); \
351 case TypeDesc::UINT8 : \
352 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,uint8_t,Atype,R,A,__VA_ARGS__); \
354 case TypeDesc::HALF : \
355 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,half,Atype,R,A,__VA_ARGS__); \
357 case TypeDesc::UINT16: \
358 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,uint16_t,Atype,R,A,__VA_ARGS__); \
363 if ((R).initialized()) \
364 Rtmp.copy (R, TypeDesc::FLOAT); \
365 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,float,Atype,Rtmp,A,__VA_ARGS__); \
369 (R).errorfmt("{}", Rtmp.geterror()); \
378 #define OIIO_DISPATCH_COMMON_TYPES2_CONST(ret,name,func,Rtype,Atype,R,A,...) \
379 switch (Rtype.basetype) { \
380 case TypeDesc::FLOAT : \
381 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,float,Atype,R,A,__VA_ARGS__); \
383 case TypeDesc::UINT8 : \
384 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,unsigned char,Atype,R,A,__VA_ARGS__); \
386 case TypeDesc::HALF : \
387 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,half,Atype,R,A,__VA_ARGS__); \
389 case TypeDesc::UINT16: \
390 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,unsigned short,Atype,R,A,__VA_ARGS__); \
395 if ((R).initialized()) \
396 Rtmp.copy (R, TypeDesc::FLOAT); \
397 OIIO_DISPATCH_COMMON_TYPES2_HELP(ret,name,func,float,Atype,Rtmp,A,__VA_ARGS__); \
402 #define OIIO_DISPATCH_COMMON_TYPES3_HELP2(ret,name,func,Rtype,Atype,Btype,R,A,B,...) \
403 switch (Rtype.basetype) { \
404 case TypeDesc::FLOAT : \
405 ret = func<float,Atype,Btype> (R,A,B,__VA_ARGS__); break; \
406 case TypeDesc::UINT8 : \
407 ret = func<unsigned char,Atype,Btype> (R,A,B,__VA_ARGS__); break; \
408 case TypeDesc::HALF : \
409 ret = func<half,Atype,Btype> (R,A,B,__VA_ARGS__); break; \
410 case TypeDesc::UINT16: \
411 ret = func<unsigned short,Atype,Btype> (R,A,B,__VA_ARGS__); break; \
415 if ((R).initialized()) \
416 Rtmp.copy (R, TypeDesc::FLOAT); \
417 ret = func<float,Atype,Btype> (R,A,B,__VA_ARGS__); \
421 (R).errorfmt("{}", Rtmp.geterror()); \
426 #define OIIO_DISPATCH_COMMON_TYPES3_HELP(ret,name,func,Rtype,Atype,Btype,R,A,B,...) \
427 switch (Btype.basetype) { \
428 case TypeDesc::FLOAT : \
429 OIIO_DISPATCH_COMMON_TYPES3_HELP2(ret,name,func,Rtype,Atype,float,R,A,B,__VA_ARGS__); \
431 case TypeDesc::UINT8 : \
432 OIIO_DISPATCH_COMMON_TYPES3_HELP2(ret,name,func,Rtype,Atype,unsigned char,R,A,B,__VA_ARGS__); \
434 case TypeDesc::HALF : \
435 OIIO_DISPATCH_COMMON_TYPES3_HELP2(ret,name,func,Rtype,Atype,half,R,A,B,__VA_ARGS__); \
437 case TypeDesc::UINT16 : \
438 OIIO_DISPATCH_COMMON_TYPES3_HELP2(ret,name,func,Rtype,Atype,unsigned short,R,A,B,__VA_ARGS__); \
443 Btmp.copy (B, TypeDesc::FLOAT); \
444 OIIO_DISPATCH_COMMON_TYPES3_HELP2(ret,name,func,Rtype,Atype,float,R,A,Btmp,__VA_ARGS__); \
451 #define OIIO_DISPATCH_COMMON_TYPES3(ret,name,func,Rtype,Atype,Btype,R,A,B,...) \
452 if (Rtype == Atype && Rtype == Btype) { \
454 switch (Atype.basetype) { \
455 case TypeDesc::FLOAT : \
456 ret = func<float,float,float> (R, A, B, __VA_ARGS__); break;\
457 case TypeDesc::UINT8 : \
458 ret = func<uint8_t,uint8_t,uint8_t> (R, A, B, __VA_ARGS__); break; \
459 case TypeDesc::UINT16: \
460 ret = func<uint16_t,uint16_t,uint16_t> (R, A, B, __VA_ARGS__); break; \
461 case TypeDesc::HALF : \
462 ret = func<half,half,half> (R, A, B, __VA_ARGS__); break; \
463 case TypeDesc::INT8 : \
464 ret = func<char,char,char> (R, A, B, __VA_ARGS__); break; \
465 case TypeDesc::INT16 : \
466 ret = func<int16_t,int16_t,int16_t> (R, A, B, __VA_ARGS__); break; \
467 case TypeDesc::UINT : \
468 ret = func<uint32_t,uint32_t,uint32_t> (R, A, B, __VA_ARGS__); break; \
469 case TypeDesc::INT : \
470 ret = func<int,int,int> (R, A, B, __VA_ARGS__); break; \
471 case TypeDesc::DOUBLE : \
472 ret = func<double,double,double> (R, A, B, __VA_ARGS__); break; \
474 (R).errorfmt("{}: Unsupported pixel data format '{}'", name, Atype); \
478 switch (Atype.basetype) { \
479 case TypeDesc::FLOAT : \
480 OIIO_DISPATCH_COMMON_TYPES3_HELP(ret,name,func,Rtype,float,Btype,R,A,B,__VA_ARGS__); \
482 case TypeDesc::UINT8 : \
483 OIIO_DISPATCH_COMMON_TYPES3_HELP(ret,name,func,Rtype,unsigned char,Btype,R,A,B,__VA_ARGS__); \
485 case TypeDesc::HALF : \
486 OIIO_DISPATCH_COMMON_TYPES3_HELP(ret,name,func,Rtype,half,Btype,R,A,B,__VA_ARGS__); \
488 case TypeDesc::UINT16: \
489 OIIO_DISPATCH_COMMON_TYPES3_HELP(ret,name,func,Rtype,unsigned short,Btype,R,A,B,__VA_ARGS__); \
494 Atmp.copy (A, TypeDesc::FLOAT); \
495 OIIO_DISPATCH_COMMON_TYPES3_HELP(ret,name,func,Rtype,float,Btype,R,Atmp,B,__VA_ARGS__); \
505 #define IBA_FIX_PERCHAN_LEN(av,len,missing,zdef) \
506 if (av.size() < len) { \
508 float *vals = OIIO_ALLOCA(float, nc); \
509 for (int i = 0; i < nc; ++i) \
510 vals[i] = i < av.size() ? av[i] : (i ? vals[i-1] : zdef); \
511 av = cspan<float>(vals, nc); \
516 #define IBA_FIX_PERCHAN_LEN_DEF(av,len) \
517 IBA_FIX_PERCHAN_LEN (av, len, 0.0f, av.size() ? av.back() : 0.0f);
static BASETYPE basetype_merge(TypeDesc a, TypeDesc b)
typedef int(APIENTRYP RE_PFNGLXSWAPINTERVALSGIPROC)(int)
constexpr imagesize_t npixels() const noexcept
Total number of pixels in the region.
TypeDesc type_merge(TypeDesc a, TypeDesc b, TypeDesc c)
constexpr SplitDir splitdir() const noexcept
vfloat4 sqrt(const vfloat4 &a)
GLboolean GLboolean GLboolean GLboolean a
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
constexpr int maxthreads() const noexcept
constexpr int height() const noexcept
Width.
bool IBAprep(ROI &roi, ImageBuf *dst, int prepflags)
OIIO_UTIL_API void parallel_for_chunked_2D(int64_t xbegin, int64_t xend, int64_t xchunksize, int64_t ybegin, int64_t yend, int64_t ychunksize, std::function< void(int64_t xbeg, int64_t xend, int64_t ybeg, int64_t yend)> &&task, paropt opt=0)
GLboolean GLboolean GLboolean b
constexpr int width() const noexcept
Height.
constexpr int minitems() const noexcept
constexpr bool singlethread() const noexcept
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
#define OIIO_NAMESPACE_END
void parallel_image(Func f, ROI roi, int nthreads=0, SplitDir splitdir=Split_Y)
#define OIIO_NAMESPACE_BEGIN