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