@@ -2391,7 +2391,9 @@ namespace ojph {
23912391 return ;
23922392 }
23932393
2394- void exr_out::configure (ui32 width, ui32 height, ui32 num_components, bool *has_nlt, ui32 *bitdepths, bool * is_signed, bool codestream_is_planar)
2394+ void exr_out::configure (ui32 width, ui32 height, ui32 num_components,
2395+ bool *has_nlt, ui32 *bitdepths, bool * is_signed,
2396+ bool codestream_is_planar, bool codestream_is_reversible)
23952397 {
23962398 this ->num_components = num_components;
23972399 this ->width = width;
@@ -2427,23 +2429,35 @@ namespace ojph {
24272429 }
24282430
24292431 this ->codestream_is_planar = codestream_is_planar;
2432+ this ->codestream_is_reversible = codestream_is_reversible;
24302433
24312434 return ;
24322435 }
24332436
2434- si16 convert_si32_to_si16 (const si32 si32_value)
2437+ si16 convert_si32_to_si16 (const si32 si32_value, bool convert_nan_to_zero = false )
24352438 {
24362439 if (si32_value > INT16_MAX)
24372440 return INT16_MAX;
24382441 else if (si32_value < INT16_MIN)
24392442 return INT16_MIN;
2443+ else if (true == convert_nan_to_zero)
2444+ {
2445+ const si16 si16_value = (si16)si32_value;
2446+ Imath::half half_value;
2447+ half_value.setBits (si16_value);
2448+ if (half_value.isNan ())
2449+ half_value = 0.0 ;
2450+
2451+ return half_value.bits ();
2452+ }
24402453 else
24412454 return (si16)si32_value;
24422455 }
24432456
24442457 ui32 exr_out::write (const line_buf* line, ui32 comp_num)
24452458 {
24462459 const int y = codestream_is_planar == false ? 0 : cur_line;
2460+ const bool convert_nan_to_zero = codestream_is_reversible ? false : true ;
24472461 if (true == this ->is_use_Rgba_interface )
24482462 {
24492463 // if interleaved - set framebuffer for first component of the line
@@ -2457,37 +2471,25 @@ namespace ojph {
24572471 case 0 :
24582472 for (ui32 i = 0 ; i < width; i++)
24592473 {
2460- // pixels[y][i].r.setBits((si16)line->i32[i]);
2461- const si32 si32_value = line->i32 [i];
2462- const si16 si16_value = si32_value > INT16_MAX ? INT16_MAX : (si32_value < INT16_MIN ? INT16_MIN : (si16)si32_value);
2463- pixels[y][i].r .setBits (si16_value);
2474+ pixels[y][i].r .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero));
24642475 }
24652476 break ;
24662477 case 1 :
24672478 for (ui32 i = 0 ; i < width; i++)
24682479 {
2469- // pixels[y][i].g.setBits((si16)line->i32[i]);
2470- const si32 si32_value = line->i32 [i];
2471- const si16 si16_value = si32_value > INT16_MAX ? INT16_MAX : (si32_value < INT16_MIN ? INT16_MIN : (si16)si32_value);
2472- pixels[y][i].g .setBits (si16_value);
2480+ pixels[y][i].g .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero));
24732481 }
24742482 break ;
24752483 case 2 :
24762484 for (ui32 i = 0 ; i < width; i++)
24772485 {
2478- // pixels[y][i].b.setBits((si16)line->i32[i]);
2479- const si32 si32_value = line->i32 [i];
2480- const si16 si16_value = si32_value > INT16_MAX ? INT16_MAX : (si32_value < INT16_MIN ? INT16_MIN : (si16)si32_value);
2481- pixels[y][i].b .setBits (si16_value);
2486+ pixels[y][i].b .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero));
24822487 }
24832488 break ;
24842489 case 3 :
24852490 for (ui32 i = 0 ; i < width; i++)
24862491 {
2487- // pixels[y][i].a.setBits((si16)line->i32[i]);
2488- const si32 si32_value = line->i32 [i];
2489- const si16 si16_value = si32_value > INT16_MAX ? INT16_MAX : (si32_value < INT16_MIN ? INT16_MIN : (si16)si32_value);
2490- pixels[y][i].a .setBits (si16_value);
2492+ pixels[y][i].a .setBits (convert_si32_to_si16 (line->i32 [i], convert_nan_to_zero));
24912493 }
24922494 break ;
24932495 default :
0 commit comments