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