| 8043 | } |
| 8044 | |
| 8045 | int LoadEXRFromMemory(float **out_rgba, int *width, int *height, |
| 8046 | const unsigned char *memory, size_t size, |
| 8047 | const char **err) { |
| 8048 | if (out_rgba == NULL || memory == NULL) { |
| 8049 | tinyexr::SetErrorMessage("Invalid argument for LoadEXRFromMemory", err); |
| 8050 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 8051 | } |
| 8052 | |
| 8053 | EXRVersion exr_version; |
| 8054 | EXRImage exr_image; |
| 8055 | EXRHeader exr_header; |
| 8056 | |
| 8057 | InitEXRHeader(&exr_header); |
| 8058 | |
| 8059 | int ret = ParseEXRVersionFromMemory(&exr_version, memory, size); |
| 8060 | if (ret != TINYEXR_SUCCESS) { |
| 8061 | std::stringstream ss; |
| 8062 | ss << "Failed to parse EXR version. code(" << ret << ")"; |
| 8063 | tinyexr::SetErrorMessage(ss.str(), err); |
| 8064 | return ret; |
| 8065 | } |
| 8066 | |
| 8067 | ret = ParseEXRHeaderFromMemory(&exr_header, &exr_version, memory, size, err); |
| 8068 | if (ret != TINYEXR_SUCCESS) { |
| 8069 | FreeEXRHeader(&exr_header); |
| 8070 | return ret; |
| 8071 | } |
| 8072 | |
| 8073 | // Read HALF channel as FLOAT. |
| 8074 | for (int i = 0; i < exr_header.num_channels; i++) { |
| 8075 | if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { |
| 8076 | exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; |
| 8077 | } |
| 8078 | } |
| 8079 | |
| 8080 | InitEXRImage(&exr_image); |
| 8081 | ret = LoadEXRImageFromMemory(&exr_image, &exr_header, memory, size, err); |
| 8082 | if (ret != TINYEXR_SUCCESS) { |
| 8083 | FreeEXRHeader(&exr_header); |
| 8084 | FreeEXRImage(&exr_image); |
| 8085 | return ret; |
| 8086 | } |
| 8087 | |
| 8088 | // RGBA |
| 8089 | int idxR = -1; |
| 8090 | int idxG = -1; |
| 8091 | int idxB = -1; |
| 8092 | int idxA = -1; |
| 8093 | for (int c = 0; c < exr_header.num_channels; c++) { |
| 8094 | if (strcmp(exr_header.channels[c].name, "R") == 0) { |
| 8095 | idxR = c; |
| 8096 | } else if (strcmp(exr_header.channels[c].name, "G") == 0) { |
| 8097 | idxG = c; |
| 8098 | } else if (strcmp(exr_header.channels[c].name, "B") == 0) { |
| 8099 | idxB = c; |
| 8100 | } else if (strcmp(exr_header.channels[c].name, "A") == 0) { |
| 8101 | idxA = c; |
| 8102 | } |
nothing calls this directly
no test coverage detected