| 6188 | } |
| 6189 | |
| 6190 | int LoadEXRWithLayer(float **out_rgba, int *width, int *height, |
| 6191 | const char *filename, const char *layername, |
| 6192 | const char **err) { |
| 6193 | if (out_rgba == NULL) { |
| 6194 | tinyexr::SetErrorMessage("Invalid argument for LoadEXR()", err); |
| 6195 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 6196 | } |
| 6197 | |
| 6198 | EXRVersion exr_version; |
| 6199 | EXRImage exr_image; |
| 6200 | EXRHeader exr_header; |
| 6201 | InitEXRHeader(&exr_header); |
| 6202 | InitEXRImage(&exr_image); |
| 6203 | |
| 6204 | { |
| 6205 | int ret = ParseEXRVersionFromFile(&exr_version, filename); |
| 6206 | if (ret != TINYEXR_SUCCESS) { |
| 6207 | std::stringstream ss; |
| 6208 | ss << "Failed to open EXR file or read version info from EXR file. code(" |
| 6209 | << ret << ")"; |
| 6210 | tinyexr::SetErrorMessage(ss.str(), err); |
| 6211 | return ret; |
| 6212 | } |
| 6213 | |
| 6214 | if (exr_version.multipart || exr_version.non_image) { |
| 6215 | tinyexr::SetErrorMessage( |
| 6216 | "Loading multipart or DeepImage is not supported in LoadEXR() API", |
| 6217 | err); |
| 6218 | return TINYEXR_ERROR_INVALID_DATA; // @fixme. |
| 6219 | } |
| 6220 | } |
| 6221 | |
| 6222 | { |
| 6223 | int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err); |
| 6224 | if (ret != TINYEXR_SUCCESS) { |
| 6225 | FreeEXRHeader(&exr_header); |
| 6226 | return ret; |
| 6227 | } |
| 6228 | } |
| 6229 | |
| 6230 | // Read HALF channel as FLOAT. |
| 6231 | for (int i = 0; i < exr_header.num_channels; i++) { |
| 6232 | if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { |
| 6233 | exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; |
| 6234 | } |
| 6235 | } |
| 6236 | |
| 6237 | // TODO: Probably limit loading to layers (channels) selected by layer index |
| 6238 | { |
| 6239 | int ret = LoadEXRImageFromFile(&exr_image, &exr_header, filename, err); |
| 6240 | if (ret != TINYEXR_SUCCESS) { |
| 6241 | FreeEXRHeader(&exr_header); |
| 6242 | return ret; |
| 6243 | } |
| 6244 | } |
| 6245 | |
| 6246 | // RGBA |
| 6247 | int idxR = -1; |
no test coverage detected