69 std::unique_ptr<Imf::TiledInputFile> fileTiled;
70 std::unique_ptr<Imf::InputFile> file;
73 Imf::FrameBuffer frameBuffer;
74 uint32_t xstride, ystride;
85 std::unique_ptr<Imf::TiledInputFile> temp(
new Imf::TiledInputFile(filename));
86 fileTiled = std::move(temp);
90 std::unique_ptr<Imf::InputFile> temp(
new Imf::InputFile(filename));
91 file = std::move(temp);
94 catch(
const std::exception &e)
99 const Imf::Header &header = isTiled ? fileTiled->header() : file->header();
102 bool hasR =
false, hasG =
false, hasB =
false;
103 for(Imf::ChannelList::ConstIterator
i = header.channels().begin();
i != header.channels().end(); ++
i)
105 std::string
name(
i.name());
106 if(
name ==
"R") hasR =
true;
107 if(
name ==
"G") hasG =
true;
108 if(
name ==
"B") hasB =
true;
110 if(!(hasR && hasG && hasB))
112 fprintf(stderr,
"[exr_read] Warning, only files with RGB(A) channels are supported.\n");
124 if(exif && exif->value().size > 6)
129 dw = header.displayWindow();
130 img->
width = dw.max.x - dw.min.x + 1;
131 img->
height = dw.max.y - dw.min.y + 1;
136 img->
dsc.
bpp = 4 *
sizeof(float);
139 img->
flags &= ~DT_IMAGE_RAW;
140 img->
flags &= ~DT_IMAGE_S_RAW;
141 img->
flags &= ~DT_IMAGE_LDR;
150 fprintf(stderr,
"[exr_read] could not alloc full buffer for image `%s'\n", img->
filename);
156 memset(buf, 0,
sizeof(
float) * 4 * img->
width * img->
height);
159 xstride =
sizeof(float) * 4;
160 ystride =
sizeof(float) * img->
width * 4;
161 frameBuffer.insert(
"R", Imf::Slice(Imf::FLOAT, (
char *)(buf + 0), xstride, ystride, 1, 1, 0.0));
162 frameBuffer.insert(
"G", Imf::Slice(Imf::FLOAT, (
char *)(buf + 1), xstride, ystride, 1, 1, 0.0));
163 frameBuffer.insert(
"B", Imf::Slice(Imf::FLOAT, (
char *)(buf + 2), xstride, ystride, 1, 1, 0.0));
164 frameBuffer.insert(
"A", Imf::Slice(Imf::FLOAT, (
char *)(buf + 3), xstride, ystride, 1, 1, 0.0));
168 fileTiled->setFrameBuffer(frameBuffer);
169 fileTiled->readTiles(0, fileTiled->numXTiles() - 1, 0, fileTiled->numYTiles() - 1);
174 dw = header.dataWindow();
175 file->setFrameBuffer(frameBuffer);
176 file->readPixels(dw.min.y, dw.max.y);
181 Imf::Chromaticities chromaticities;
182 float whiteLuminance = 1.0;
184 if(Imf::hasChromaticities(header))
186 chromaticities = Imf::chromaticities(header);
189 cmsCIExyY red_xy = { chromaticities.red[0], chromaticities.red[1], 1.0 };
191 cmsxyY2XYZ(&srcRed, &red_xy);
193 cmsCIExyY green_xy = { chromaticities.green[0], chromaticities.green[1], 1.0 };
195 cmsxyY2XYZ(&srcGreen, &green_xy);
197 cmsCIExyY blue_xy = { chromaticities.blue[0], chromaticities.blue[1], 1.0 };
199 cmsxyY2XYZ(&srcBlue, &blue_xy);
201 const cmsCIExyY srcWhite_xy = { chromaticities.white[0], chromaticities.white[1], 1.0 };
203 cmsxyY2XYZ(&srcWhite, &srcWhite_xy);
206 const cmsCIExyY d65_xy = {0.3127f, 0.3290f, 1.0};
208 cmsxyY2XYZ(&
d65, &d65_xy);
211 cmsAdaptToIlluminant(&dstRed, &srcWhite, &
d65, &srcRed);
214 cmsAdaptToIlluminant(&dstGreen, &srcWhite, &
d65, &srcGreen);
217 cmsAdaptToIlluminant(&dstBlue, &srcWhite, &
d65, &srcBlue);
219 cmsXYZ2xyY(&red_xy, &dstRed);
220 chromaticities.red[0] = (float)red_xy.x;
221 chromaticities.red[1] = (float)red_xy.y;
223 cmsXYZ2xyY(&green_xy, &dstGreen);
224 chromaticities.green[0] = (float)green_xy.x;
225 chromaticities.green[1] = (float)green_xy.y;
227 cmsXYZ2xyY(&blue_xy, &dstBlue);
228 chromaticities.blue[0] = (float)blue_xy.x;
229 chromaticities.blue[1] = (float)blue_xy.y;
231 chromaticities.white[0] = 0.3127f;
232 chromaticities.white[1] = 0.3290f;
235 if(Imf::hasWhiteLuminance(header))
236 whiteLuminance = Imf::whiteLuminance(header);
245 Imath::M44f
m = Imf::XYZtoRGB(chromaticities, whiteLuminance);
247 for(
int i = 0;
i < 3;
i++)
248 for(
int j = 0; j < 3; j++)