| 7993 | } |
| 7994 | |
| 7995 | int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header, |
| 7996 | const char *filename, const char **err) { |
| 7997 | if (exr_image == NULL || filename == NULL || |
| 7998 | exr_header->compression_type < 0) { |
| 7999 | tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToFile", err); |
| 8000 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 8001 | } |
| 8002 | |
| 8003 | #if !TINYEXR_USE_PIZ |
| 8004 | if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { |
| 8005 | tinyexr::SetErrorMessage("PIZ compression is not supported in this build", |
| 8006 | err); |
| 8007 | return TINYEXR_ERROR_UNSUPPORTED_FEATURE; |
| 8008 | } |
| 8009 | #endif |
| 8010 | |
| 8011 | #if !TINYEXR_USE_ZFP |
| 8012 | if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { |
| 8013 | tinyexr::SetErrorMessage("ZFP compression is not supported in this build", |
| 8014 | err); |
| 8015 | return TINYEXR_ERROR_UNSUPPORTED_FEATURE; |
| 8016 | } |
| 8017 | #endif |
| 8018 | |
| 8019 | FILE *fp = NULL; |
| 8020 | #ifdef _WIN32 |
| 8021 | #if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang |
| 8022 | errno_t errcode = |
| 8023 | _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"wb"); |
| 8024 | if (errcode != 0) { |
| 8025 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 8026 | err); |
| 8027 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8028 | } |
| 8029 | #else |
| 8030 | // Unknown compiler or MinGW without MINGW_HAS_SECURE_API. |
| 8031 | fp = fopen(filename, "wb"); |
| 8032 | #endif |
| 8033 | #else |
| 8034 | fp = fopen(filename, "wb"); |
| 8035 | #endif |
| 8036 | if (!fp) { |
| 8037 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 8038 | err); |
| 8039 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8040 | } |
| 8041 | |
| 8042 | unsigned char *mem = NULL; |
| 8043 | size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err); |
| 8044 | if (mem_size == 0) { |
| 8045 | fclose(fp); |
| 8046 | return TINYEXR_ERROR_SERIALIZATION_FAILED; |
| 8047 | } |
| 8048 | |
| 8049 | size_t written_size = 0; |
| 8050 | if ((mem_size > 0) && mem) { |
| 8051 | written_size = fwrite(mem, 1, mem_size, fp); |
| 8052 | } |
no test coverage detected