@@ -2434,19 +2434,27 @@ namespace ojph {
24342434 return ;
24352435 }
24362436
2437- si16 convert_si32_to_si16 (const si32 si32_value, bool convert_nan_to_zero = false )
2437+ si16 convert_si32_to_si16 (const si32 si32_value, bool convert_special_numbers_to_finite_numbers = false )
24382438 {
24392439 if (si32_value > INT16_MAX)
24402440 return INT16_MAX;
24412441 else if (si32_value < INT16_MIN)
24422442 return INT16_MIN;
2443- else if (true == convert_nan_to_zero )
2443+ else if (true == convert_special_numbers_to_finite_numbers )
24442444 {
24452445 const si16 si16_value = (si16)si32_value;
2446- Imath:: half half_value;
2446+ half half_value;
24472447 half_value.setBits (si16_value);
2448+ if (half_value.isFinite ())
2449+ return si16_value;
2450+
2451+ // handle non-real number to real-number mapping
24482452 if (half_value.isNan ())
2449- half_value = 0.0 ;
2453+ half_value = 0 .0f ;
2454+ else if (half_value.isInfinity () && !half_value.isNegative ())
2455+ half_value = HALF_MAX;
2456+ else if (half_value.isInfinity () && half_value.isNegative ())
2457+ half_value = -1 .0f * HALF_MAX;
24502458
24512459 return half_value.bits ();
24522460 }
@@ -2457,7 +2465,7 @@ namespace ojph {
24572465 ui32 exr_out::write (const line_buf* line, ui32 comp_num)
24582466 {
24592467 const int y = codestream_is_planar == false ? 0 : cur_line;
2460- const bool convert_nan_to_zero = codestream_is_reversible ? false : true ;
2468+ const bool convert_special_numbers_to_finite_numbers = codestream_is_reversible ? false : true ;
24612469 if (true == this ->is_use_Rgba_interface )
24622470 {
24632471 // if interleaved - set framebuffer for first component of the line
@@ -2471,25 +2479,25 @@ namespace ojph {
24712479 case 0 :
24722480 for (ui32 i = 0 ; i < width; i++)
24732481 {
2474- pixels[y][i].r .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero ));
2482+ pixels[y][i].r .setBits (convert_si32_to_si16 (line->i32 [i], convert_special_numbers_to_finite_numbers ));
24752483 }
24762484 break ;
24772485 case 1 :
24782486 for (ui32 i = 0 ; i < width; i++)
24792487 {
2480- pixels[y][i].g .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero ));
2488+ pixels[y][i].g .setBits (convert_si32_to_si16 (line->i32 [i], convert_special_numbers_to_finite_numbers ));
24812489 }
24822490 break ;
24832491 case 2 :
24842492 for (ui32 i = 0 ; i < width; i++)
24852493 {
2486- pixels[y][i].b .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero ));
2494+ pixels[y][i].b .setBits (convert_si32_to_si16 (line->i32 [i], convert_special_numbers_to_finite_numbers ));
24872495 }
24882496 break ;
24892497 case 3 :
24902498 for (ui32 i = 0 ; i < width; i++)
24912499 {
2492- pixels[y][i].a .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero ));
2500+ pixels[y][i].a .setBits (convert_si32_to_si16 (line->i32 [i], convert_special_numbers_to_finite_numbers ));
24932501 }
24942502 break ;
24952503 default :
0 commit comments