| 7713 | } |
| 7714 | |
| 7715 | int LoadEXRWithLayer(float **out_rgba, int *width, int *height, |
| 7716 | const char *filename, const char *layername, |
| 7717 | const char **err) { |
| 7718 | if (out_rgba == NULL) { |
| 7719 | tinyexr::SetErrorMessage("Invalid argument for LoadEXR()", err); |
| 7720 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 7721 | } |
| 7722 | |
| 7723 | EXRVersion exr_version; |
| 7724 | EXRImage exr_image; |
| 7725 | EXRHeader exr_header; |
| 7726 | InitEXRHeader(&exr_header); |
| 7727 | InitEXRImage(&exr_image); |
| 7728 | |
| 7729 | { |
| 7730 | int ret = ParseEXRVersionFromFile(&exr_version, filename); |
| 7731 | if (ret != TINYEXR_SUCCESS) { |
| 7732 | std::stringstream ss; |
| 7733 | ss << "Failed to open EXR file or read version info from EXR file. code(" |
| 7734 | << ret << ")"; |
| 7735 | tinyexr::SetErrorMessage(ss.str(), err); |
| 7736 | return ret; |
| 7737 | } |
| 7738 | |
| 7739 | if (exr_version.multipart || exr_version.non_image) { |
| 7740 | tinyexr::SetErrorMessage( |
| 7741 | "Loading multipart or DeepImage is not supported in LoadEXR() API", |
| 7742 | err); |
| 7743 | return TINYEXR_ERROR_INVALID_DATA; // @fixme. |
| 7744 | } |
| 7745 | } |
| 7746 | |
| 7747 | { |
| 7748 | int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err); |
| 7749 | if (ret != TINYEXR_SUCCESS) { |
| 7750 | FreeEXRHeader(&exr_header); |
| 7751 | return ret; |
| 7752 | } |
| 7753 | } |
| 7754 | |
| 7755 | // Read HALF channel as FLOAT. |
| 7756 | for (int i = 0; i < exr_header.num_channels; i++) { |
| 7757 | if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { |
| 7758 | exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; |
| 7759 | } |
| 7760 | } |
| 7761 | |
| 7762 | // TODO: Probably limit loading to layers (channels) selected by layer index |
| 7763 | { |
| 7764 | int ret = LoadEXRImageFromFile(&exr_image, &exr_header, filename, err); |
| 7765 | if (ret != TINYEXR_SUCCESS) { |
| 7766 | FreeEXRHeader(&exr_header); |
| 7767 | return ret; |
| 7768 | } |
| 7769 | } |
| 7770 | |
| 7771 | // RGBA |
| 7772 | int idxR = -1; |
no test coverage detected