| 9679 | } |
| 9680 | |
| 9681 | int SaveEXRMultipartImageToFile(const EXRImage* exr_images, |
| 9682 | const EXRHeader** exr_headers, |
| 9683 | unsigned int num_parts, |
| 9684 | const char* filename, |
| 9685 | const char** err) { |
| 9686 | if (exr_images == NULL || exr_headers == NULL || num_parts == 0) { |
| 9687 | tinyexr::SetErrorMessage("Invalid argument for SaveEXRMultipartImageToFile", |
| 9688 | err); |
| 9689 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 9690 | } |
| 9691 | |
| 9692 | FILE *fp = NULL; |
| 9693 | #ifdef _WIN32 |
| 9694 | #if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) // MSVC, MinGW GCC, or Clang. |
| 9695 | errno_t errcode = |
| 9696 | _wfopen_s(&fp, tinyexr::UTF8ToWchar(filename).c_str(), L"wb"); |
| 9697 | if (errcode != 0) { |
| 9698 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 9699 | err); |
| 9700 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 9701 | } |
| 9702 | #else |
| 9703 | // Unknown compiler or MinGW without MINGW_HAS_SECURE_API. |
| 9704 | fp = fopen(filename, "wb"); |
| 9705 | #endif |
| 9706 | #else |
| 9707 | fp = fopen(filename, "wb"); |
| 9708 | #endif |
| 9709 | if (!fp) { |
| 9710 | tinyexr::SetErrorMessage("Cannot write a file: " + std::string(filename), |
| 9711 | err); |
| 9712 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 9713 | } |
| 9714 | |
| 9715 | unsigned char *mem = NULL; |
| 9716 | size_t mem_size = SaveEXRMultipartImageToMemory(exr_images, exr_headers, num_parts, &mem, err); |
| 9717 | if (mem_size == 0) { |
| 9718 | fclose(fp); |
| 9719 | return TINYEXR_ERROR_SERIALIZATION_FAILED; |
| 9720 | } |
| 9721 | |
| 9722 | size_t written_size = 0; |
| 9723 | if ((mem_size > 0) && mem) { |
| 9724 | written_size = fwrite(mem, 1, mem_size, fp); |
| 9725 | } |
| 9726 | free(mem); |
| 9727 | |
| 9728 | fclose(fp); |
| 9729 | |
| 9730 | if (written_size != mem_size) { |
| 9731 | tinyexr::SetErrorMessage("Cannot write a file", err); |
| 9732 | return TINYEXR_ERROR_CANT_WRITE_FILE; |
| 9733 | } |
| 9734 | |
| 9735 | return TINYEXR_SUCCESS; |
| 9736 | } |
| 9737 | |
| 9738 | int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { |
nothing calls this directly
no test coverage detected