| 9596 | } |
| 9597 | |
| 9598 | int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header, |
| 9599 | const char *filename, const char **err) { |
| 9600 | if (exr_image == NULL || filename == NULL || |
| 9601 | exr_header->compression_type < 0) { |
| 9602 | tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToFile", err); |
| 9603 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 9604 | } |
| 9605 | |
| 9606 | #if !TINYEXR_USE_PIZ |
| 9607 | if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { |
| 9608 | tinyexr::SetErrorMessage("PIZ compression is not supported in this build", |
| 9609 | err); |
| 9610 | return TINYEXR_ERROR_UNSUPPORTED_FEATURE; |
| 9611 | } |
| 9612 | #endif |
| 9613 | |
| 9614 | #if !TINYEXR_USE_ZFP |
| 9615 | if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { |
| 9616 | tinyexr::SetErrorMessage("ZFP compression is not supported in this build", |
| 9617 | err); |
| 9618 | return TINYEXR_ERROR_UNSUPPORTED_FEATURE; |
| 9619 | } |
| 9620 | #endif |
| 9621 | |
| 9622 | FILE *fp = NULL; |
| 9623 | #ifdef _WIN32 |
| 9624 | #if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang |
| 9625 | errno_t errcode = |
| 9626 | _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"wb"); |
| 9627 | if (errcode != 0) { |
| 9628 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 9629 | err); |
| 9630 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 9631 | } |
| 9632 | #else |
| 9633 | // Unknown compiler or MinGW without MINGW_HAS_SECURE_API. |
| 9634 | fp = fopen(filename, "wb"); |
| 9635 | #endif |
| 9636 | #else |
| 9637 | fp = fopen(filename, "wb"); |
| 9638 | #endif |
| 9639 | if (!fp) { |
| 9640 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 9641 | err); |
| 9642 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 9643 | } |
| 9644 | |
| 9645 | unsigned char *mem = NULL; |
| 9646 | size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err); |
| 9647 | if (mem_size == 0) { |
| 9648 | fclose(fp); |
| 9649 | return TINYEXR_ERROR_SERIALIZATION_FAILED; |
| 9650 | } |
| 9651 | |
| 9652 | size_t written_size = 0; |
| 9653 | if ((mem_size > 0) && mem) { |
| 9654 | written_size = fwrite(mem, 1, mem_size, fp); |
| 9655 | } |
no test coverage detected