| 8088 | } |
| 8089 | |
| 8090 | int SaveDeepEXR(const DeepImage *deepImage, const char *filename, |
| 8091 | const char **err) { |
| 8092 | if (deepImage == NULL || filename == NULL) { |
| 8093 | if (err) { |
| 8094 | (*err) = "Invalid argument."; |
| 8095 | } |
| 8096 | return -1; |
| 8097 | } |
| 8098 | |
| 8099 | FILE *fp = fopen(filename, "rb"); |
| 8100 | if (!fp) { |
| 8101 | if (err) { |
| 8102 | (*err) = "Cannot write file."; |
| 8103 | } |
| 8104 | return -1; |
| 8105 | } |
| 8106 | |
| 8107 | // Write header check. |
| 8108 | { |
| 8109 | const char header[] = {0x76, 0x2f, 0x31, 0x01}; |
| 8110 | size_t n = fwrite(header, 1, 4, fp); |
| 8111 | if (n != 4) { |
| 8112 | if (err) { |
| 8113 | (*err) = "Header write failed."; |
| 8114 | } |
| 8115 | fclose(fp); |
| 8116 | return -3; |
| 8117 | } |
| 8118 | } |
| 8119 | |
| 8120 | // Version, scanline. |
| 8121 | { |
| 8122 | // ver 2.0, scanline, deep bit on(0x800) |
| 8123 | const char data[] = {2, 8, 0, 0}; |
| 8124 | size_t n = fwrite(data, 1, 4, fp); |
| 8125 | if (n != 4) { |
| 8126 | if (err) { |
| 8127 | (*err) = "Flag write failed."; |
| 8128 | } |
| 8129 | fclose(fp); |
| 8130 | return -3; |
| 8131 | } |
| 8132 | } |
| 8133 | |
| 8134 | // Write attributes. |
| 8135 | { |
| 8136 | int data = 2; // ZIPS |
| 8137 | WriteAttribute(fp, "compression", "compression", |
| 8138 | reinterpret_cast<const unsigned char *>(&data), sizeof(int)); |
| 8139 | } |
| 8140 | |
| 8141 | { |
| 8142 | int data[4] = {0, 0, deepImage->width - 1, deepImage->height - 1}; |
| 8143 | WriteAttribute(fp, "dataWindow", "box2i", |
| 8144 | reinterpret_cast<const unsigned char *>(data), |
| 8145 | sizeof(int) * 4); |
| 8146 | WriteAttribute(fp, "displayWindow", "box2i", |
| 8147 | reinterpret_cast<const unsigned char *>(data), |
nothing calls this directly
no test coverage detected