67 std::unique_ptr<Imf::TiledInputFile> fileTiled;
68 std::unique_ptr<Imf::InputFile> file;
71 Imf::FrameBuffer frameBuffer;
72 uint32_t xstride, ystride;
83 std::unique_ptr<Imf::TiledInputFile> temp(
new Imf::TiledInputFile(filename));
84 fileTiled = std::move(temp);
88 std::unique_ptr<Imf::InputFile> temp(
new Imf::InputFile(filename));
89 file = std::move(temp);
92 catch(
const std::exception &e)
97 const Imf::Header &header = isTiled ? fileTiled->header() : file->header();
100 bool hasR =
false, hasG =
false, hasB =
false;
101 for(Imf::ChannelList::ConstIterator
i = header.channels().begin();
i != header.channels().end(); ++
i)
103 std::string
name(
i.name());
104 if(
name ==
"R") hasR =
true;
105 if(
name ==
"G") hasG =
true;
106 if(
name ==
"B") hasB =
true;
108 if(!(hasR && hasG && hasB))
110 fprintf(stderr,
"[exr_read] Warning, only files with RGB(A) channels are supported.\n");
122 if(exif && exif->value().size > 6)
127 dw = header.displayWindow();
128 img->
width = dw.max.x - dw.min.x + 1;
129 img->
height = dw.max.y - dw.min.y + 1;
134 img->
dsc.
bpp = 4 *
sizeof(float);
137 img->
flags &= ~DT_IMAGE_RAW;
138 img->
flags &= ~DT_IMAGE_S_RAW;
139 img->
flags &= ~DT_IMAGE_LDR;
148 fprintf(stderr,
"[exr_read] could not alloc full buffer for image `%s'\n", img->
filename);
154 memset(buf, 0,
sizeof(
float) * 4 * img->
width * img->
height);
157 xstride =
sizeof(float) * 4;
158 ystride =
sizeof(float) * img->
width * 4;
159 frameBuffer.insert(
"R", Imf::Slice(Imf::FLOAT, (
char *)(buf + 0), xstride, ystride, 1, 1, 0.0));
160 frameBuffer.insert(
"G", Imf::Slice(Imf::FLOAT, (
char *)(buf + 1), xstride, ystride, 1, 1, 0.0));
161 frameBuffer.insert(
"B", Imf::Slice(Imf::FLOAT, (
char *)(buf + 2), xstride, ystride, 1, 1, 0.0));
162 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);
179 catch(
const std::exception &e)
181 fprintf(stderr,
"[exr_read] error reading pixels from `%s': %s\n", filename, e.what());
187 Imf::Chromaticities chromaticities;
188 float whiteLuminance = 1.0;
190 if(Imf::hasChromaticities(header))
192 chromaticities = Imf::chromaticities(header);
195 cmsCIExyY red_xy = { chromaticities.red[0], chromaticities.red[1], 1.0 };
197 cmsxyY2XYZ(&srcRed, &red_xy);
199 cmsCIExyY green_xy = { chromaticities.green[0], chromaticities.green[1], 1.0 };
201 cmsxyY2XYZ(&srcGreen, &green_xy);
203 cmsCIExyY blue_xy = { chromaticities.blue[0], chromaticities.blue[1], 1.0 };
205 cmsxyY2XYZ(&srcBlue, &blue_xy);
207 const cmsCIExyY srcWhite_xy = { chromaticities.white[0], chromaticities.white[1], 1.0 };
209 cmsxyY2XYZ(&srcWhite, &srcWhite_xy);
212 const cmsCIExyY d65_xy = {0.3127f, 0.3290f, 1.0};
214 cmsxyY2XYZ(&
d65, &d65_xy);
217 cmsAdaptToIlluminant(&dstRed, &srcWhite, &
d65, &srcRed);
220 cmsAdaptToIlluminant(&dstGreen, &srcWhite, &
d65, &srcGreen);
223 cmsAdaptToIlluminant(&dstBlue, &srcWhite, &
d65, &srcBlue);
225 cmsXYZ2xyY(&red_xy, &dstRed);
226 chromaticities.red[0] = (float)red_xy.x;
227 chromaticities.red[1] = (float)red_xy.y;
229 cmsXYZ2xyY(&green_xy, &dstGreen);
230 chromaticities.green[0] = (float)green_xy.x;
231 chromaticities.green[1] = (float)green_xy.y;
233 cmsXYZ2xyY(&blue_xy, &dstBlue);
234 chromaticities.blue[0] = (float)blue_xy.x;
235 chromaticities.blue[1] = (float)blue_xy.y;
237 chromaticities.white[0] = 0.3127f;
238 chromaticities.white[1] = 0.3290f;
241 if(Imf::hasWhiteLuminance(header))
242 whiteLuminance = Imf::whiteLuminance(header);
251 Imath::M44f
m = Imf::XYZtoRGB(chromaticities, whiteLuminance);
253 for(
int i = 0;
i < 3;
i++)
254 for(
int j = 0; j < 3; j++)