| 8077 | } |
| 8078 | |
| 8079 | int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header, |
| 8080 | const char *filename, const char **err) { |
| 8081 | if (exr_image == NULL || filename == NULL || |
| 8082 | exr_header->compression_type < 0) { |
| 8083 | tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToFile", err); |
| 8084 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 8085 | } |
| 8086 | |
| 8087 | #if !TINYEXR_USE_PIZ |
| 8088 | if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { |
| 8089 | tinyexr::SetErrorMessage("PIZ compression is not supported in this build", |
| 8090 | err); |
| 8091 | return TINYEXR_ERROR_UNSUPPORTED_FEATURE; |
| 8092 | } |
| 8093 | #endif |
| 8094 | |
| 8095 | #if !TINYEXR_USE_ZFP |
| 8096 | if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { |
| 8097 | tinyexr::SetErrorMessage("ZFP compression is not supported in this build", |
| 8098 | err); |
| 8099 | return TINYEXR_ERROR_UNSUPPORTED_FEATURE; |
| 8100 | } |
| 8101 | #endif |
| 8102 | |
| 8103 | FILE *fp = NULL; |
| 8104 | #ifdef _WIN32 |
| 8105 | #if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang |
| 8106 | errno_t errcode = |
| 8107 | _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"wb"); |
| 8108 | if (errcode != 0) { |
| 8109 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 8110 | err); |
| 8111 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8112 | } |
| 8113 | #else |
| 8114 | // Unknown compiler or MinGW without MINGW_HAS_SECURE_API. |
| 8115 | fp = fopen(filename, "wb"); |
| 8116 | #endif |
| 8117 | #else |
| 8118 | fp = fopen(filename, "wb"); |
| 8119 | #endif |
| 8120 | if (!fp) { |
| 8121 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 8122 | err); |
| 8123 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8124 | } |
| 8125 | |
| 8126 | unsigned char *mem = NULL; |
| 8127 | size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err); |
| 8128 | if (mem_size == 0) { |
| 8129 | fclose(fp); |
| 8130 | return TINYEXR_ERROR_SERIALIZATION_FAILED; |
| 8131 | } |
| 8132 | |
| 8133 | size_t written_size = 0; |
| 8134 | if ((mem_size > 0) && mem) { |
| 8135 | written_size = fwrite(mem, 1, mem_size, fp); |
| 8136 | } |
no test coverage detected