|
13 | 13 | #include "SSE.h" |
14 | 14 |
|
15 | 15 |
|
| 16 | +// powf() throws a domain error if the base is negative and the exponent non-integer. |
| 17 | +// This is a safer call to powf() that avoids a negative base. |
| 18 | +#define POW_NON_NEG(B, E) \ |
| 19 | + std::pow((B) < 0.0f ? 0.0f : (B), (E)) |
| 20 | + |
16 | 21 | namespace OCIO_NAMESPACE |
17 | 22 | { |
18 | 23 |
|
@@ -540,10 +545,10 @@ void GammaMoncurveOpCPUFwd::apply(const void * inImg, void * outImg, long numPix |
540 | 545 | { |
541 | 546 | const float pixel[4] = { in[0], in[1], in[2], in[3] }; |
542 | 547 |
|
543 | | - const float data[4] = { std::pow(pixel[0] * red[0] + red[1], red[2]), |
544 | | - std::pow(pixel[1] * grn[0] + grn[1], grn[2]), |
545 | | - std::pow(pixel[2] * blu[0] + blu[1], blu[2]), |
546 | | - std::pow(pixel[3] * alp[0] + alp[1], alp[2]) }; |
| 548 | + const float data[4] = { POW_NON_NEG(pixel[0] * red[0] + red[1], red[2]), |
| 549 | + POW_NON_NEG(pixel[1] * grn[0] + grn[1], grn[2]), |
| 550 | + POW_NON_NEG(pixel[2] * blu[0] + blu[1], blu[2]), |
| 551 | + POW_NON_NEG(pixel[3] * alp[0] + alp[1], alp[2]) }; |
547 | 552 |
|
548 | 553 | out[0] = pixel[0]<=red[3] ? pixel[0] * red[4] : data[0]; |
549 | 554 | out[1] = pixel[1]<=grn[3] ? pixel[1] * grn[4] : data[1]; |
@@ -629,10 +634,10 @@ void GammaMoncurveOpCPURev::apply(const void * inImg, void * outImg, long numPix |
629 | 634 | { |
630 | 635 | const float pixel[4] = { in[0], in[1], in[2], in[3] }; |
631 | 636 |
|
632 | | - const float data[4] = { std::pow(pixel[0], red[0]) * red[1] - red[2], |
633 | | - std::pow(pixel[1], grn[0]) * grn[1] - grn[2], |
634 | | - std::pow(pixel[2], blu[0]) * blu[1] - blu[2], |
635 | | - std::pow(pixel[3], alp[0]) * alp[1] - alp[2] }; |
| 637 | + const float data[4] = { POW_NON_NEG(pixel[0], red[0]) * red[1] - red[2], |
| 638 | + POW_NON_NEG(pixel[1], grn[0]) * grn[1] - grn[2], |
| 639 | + POW_NON_NEG(pixel[2], blu[0]) * blu[1] - blu[2], |
| 640 | + POW_NON_NEG(pixel[3], alp[0]) * alp[1] - alp[2] }; |
636 | 641 |
|
637 | 642 | out[0] = pixel[0]<=red[3] ? pixel[0] * red[4] : data[0]; |
638 | 643 | out[1] = pixel[1]<=grn[3] ? pixel[1] * grn[4] : data[1]; |
|
0 commit comments