| 8165 | } |
| 8166 | |
| 8167 | int SaveEXRMultipartImageToFile(const EXRImage* exr_images, |
| 8168 | const EXRHeader** exr_headers, |
| 8169 | unsigned int num_parts, |
| 8170 | const char* filename, |
| 8171 | const char** err) { |
| 8172 | if (exr_images == NULL || exr_headers == NULL || num_parts == 0) { |
| 8173 | tinyexr::SetErrorMessage("Invalid argument for SaveEXRMultipartImageToFile", |
| 8174 | err); |
| 8175 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 8176 | } |
| 8177 | |
| 8178 | FILE *fp = NULL; |
| 8179 | #ifdef _WIN32 |
| 8180 | #if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang. |
| 8181 | errno_t errcode = |
| 8182 | _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"wb"); |
| 8183 | if (errcode != 0) { |
| 8184 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 8185 | err); |
| 8186 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8187 | } |
| 8188 | #else |
| 8189 | // Unknown compiler or MinGW without MINGW_HAS_SECURE_API. |
| 8190 | fp = fopen(filename, "wb"); |
| 8191 | #endif |
| 8192 | #else |
| 8193 | fp = fopen(filename, "wb"); |
| 8194 | #endif |
| 8195 | if (!fp) { |
| 8196 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 8197 | err); |
| 8198 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8199 | } |
| 8200 | |
| 8201 | unsigned char *mem = NULL; |
| 8202 | size_t mem_size = SaveEXRMultipartImageToMemory(exr_images, exr_headers, num_parts, &mem, err); |
| 8203 | if (mem_size == 0) { |
| 8204 | fclose(fp); |
| 8205 | return TINYEXR_ERROR_SERIALIZATION_FAILED; |
| 8206 | } |
| 8207 | |
| 8208 | size_t written_size = 0; |
| 8209 | if ((mem_size > 0) && mem) { |
| 8210 | written_size = fwrite(mem, 1, mem_size, fp); |
| 8211 | } |
| 8212 | free(mem); |
| 8213 | |
| 8214 | fclose(fp); |
| 8215 | |
| 8216 | if (written_size != mem_size) { |
| 8217 | tinyexr::SetErrorMessage("Cannot write a file", err); |
| 8218 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 8219 | } |
| 8220 | |
| 8221 | return TINYEXR_SUCCESS; |
| 8222 | } |
| 8223 | |
| 8224 | int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { |
nothing calls this directly
no test coverage detected