38 #include <ImfChannelList.h>
39 #include <ImfCompression.h>
40 #include <ImfCompressionAttribute.h>
42 #include <ImfInputFile.h>
43 #include <ImfOutputFile.h>
44 #include <ImfPixelType.h>
45 #include <ImfStandardAttributes.h>
46 #include <ImfStringAttribute.h>
47 #include <ImfVersion.h>
51 #include <ImfInputPart.h>
52 #include <ImfMultiPartInputFile.h>
53 #include <ImfMultiPartOutputFile.h>
54 #include <ImfMultiView.h>
55 #include <ImfOutputPart.h>
56 #include <ImfPartHelper.h>
57 #include <ImfPartType.h>
58 #include <ImfTiledOutputPart.h>
73 #if defined(WITH_OPENEXR) && defined(_WIN32) && defined(DEBUG) && _MSC_VER < 1900
74 _CRTIMP
void __cdecl _invalid_parameter_noinfo(
void)
96 using namespace Imath;
118 : IStream(
"<memory>"), _exrpos(0), _exrsize(exrsize)
125 if (n + _exrpos <= _exrsize) {
126 memcpy(
c, (
void *)(&_exrbuf[_exrpos]), n);
151 unsigned char *_exrbuf;
163 ifs.open(wfilename, std::ios_base::binary);
166 ifs.open(filename, std::ios_base::binary);
170 Iex::throwErrnoExc();
177 throw Iex::InputExc(
"Unexpected end of file.");
182 return check_error();
187 return std::streamoff(ifs.tellg());
206 Iex::throwErrnoExc();
226 void write(
const char c[],
int n)
override
228 ensure_size(offset + n);
229 memcpy(ibuf->encodedbuffer + offset,
c, n);
231 ibuf->encodedsize += n;
246 void ensure_size(Int64
size)
249 while (
size > ibuf->encodedbuffersize) {
251 throw Iex::ErrnoExc(
"Out of memory.");
269 ofs.open(wfilename, std::ios_base::binary);
272 ofs.open(filename, std::ios_base::binary);
276 Iex::throwErrnoExc();
280 void write(
const char c[],
int n)
override
289 return std::streamoff(ofs.tellp());
303 Iex::throwErrnoExc();
306 throw Iex::ErrnoExc(
"File output failed.");
340 return Imf::isImfMagic((
const char *)mem);
345 switch (compression) {
347 header->compression() = NO_COMPRESSION;
350 header->compression() = PXR24_COMPRESSION;
353 header->compression() = ZIP_COMPRESSION;
356 header->compression() = PIZ_COMPRESSION;
359 header->compression() = RLE_COMPRESSION;
362 header->compression() = ZIPS_COMPRESSION;
365 header->compression() = B44_COMPRESSION;
368 header->compression() = B44A_COMPRESSION;
370 #if OPENEXR_VERSION_MAJOR >= 2 && OPENEXR_VERSION_MINOR >= 2
372 header->compression() = DWAA_COMPRESSION;
375 header->compression() = DWAB_COMPRESSION;
379 header->compression() = ZIP_COMPRESSION;
396 if (ibuf->
ppm[0] > 0.0) {
398 addXDensity(*header, ibuf->
ppm[0] * 0.0254);
403 const char *propname,
408 header->insert(propname, StringAttribute(prop));
413 const int channels = ibuf->
channels;
414 const bool is_alpha = (channels >= 4) && (ibuf->
planes == 32);
416 const int width = ibuf->
x;
418 OStream *file_stream =
nullptr;
427 header.channels().insert(
"R", Channel(
HALF));
428 header.channels().insert(
"G", Channel(
HALF));
429 header.channels().insert(
"B", Channel(
HALF));
431 header.channels().insert(
"A", Channel(
HALF));
435 header.channels().insert(
"Z", Channel(Imf::FLOAT));
438 FrameBuffer frameBuffer;
447 OutputFile
file(*file_stream, header);
451 RGBAZ *to = &pixels[0];
452 int xstride =
sizeof(
RGBAZ);
453 int ystride = xstride *
width;
456 frameBuffer.insert(
"R", Slice(
HALF, (
char *)&to->
r, xstride, ystride));
457 frameBuffer.insert(
"G", Slice(
HALF, (
char *)&to->
g, xstride, ystride));
458 frameBuffer.insert(
"B", Slice(
HALF, (
char *)&to->
b, xstride, ystride));
460 frameBuffer.insert(
"A", Slice(
HALF, (
char *)&to->
a, xstride, ystride));
463 frameBuffer.insert(
"Z",
467 sizeof(
float) * -
width));
472 for (
int i = ibuf->
y - 1; i >= 0; i--) {
475 for (
int j = ibuf->
x; j > 0; j--) {
488 for (
int i = ibuf->
y - 1; i >= 0; i--) {
491 for (
int j = ibuf->
x; j > 0; j--) {
495 to->
a = channels >= 4 ? (
float)
from[3] / 255.0f : 1.0f;
504 file.setFrameBuffer(frameBuffer);
507 catch (
const std::exception &exc) {
509 printf(
"OpenEXR-save: ERROR: %s\n", exc.what());
520 const int channels = ibuf->
channels;
521 const bool is_alpha = (channels >= 4) && (ibuf->
planes == 32);
523 const int width = ibuf->
x;
525 OStream *file_stream =
nullptr;
534 header.channels().insert(
"R", Channel(Imf::FLOAT));
535 header.channels().insert(
"G", Channel(Imf::FLOAT));
536 header.channels().insert(
"B", Channel(Imf::FLOAT));
538 header.channels().insert(
"A", Channel(Imf::FLOAT));
541 header.channels().insert(
"Z", Channel(Imf::FLOAT));
544 FrameBuffer frameBuffer;
553 OutputFile
file(*file_stream, header);
555 int xstride =
sizeof(
float) * channels;
556 int ystride = -xstride *
width;
559 float *rect[4] = {
nullptr,
nullptr,
nullptr,
nullptr};
561 rect[1] = (channels >= 2) ? rect[0] + 1 : rect[0];
562 rect[2] = (channels >= 3) ? rect[0] + 2 : rect[0];
563 rect[3] = (channels >= 4) ?
567 frameBuffer.insert(
"R", Slice(Imf::FLOAT, (
char *)rect[0], xstride, ystride));
568 frameBuffer.insert(
"G", Slice(Imf::FLOAT, (
char *)rect[1], xstride, ystride));
569 frameBuffer.insert(
"B", Slice(Imf::FLOAT, (
char *)rect[2], xstride, ystride));
571 frameBuffer.insert(
"A", Slice(Imf::FLOAT, (
char *)rect[3], xstride, ystride));
574 frameBuffer.insert(
"Z",
578 sizeof(
float) * -
width));
581 file.setFrameBuffer(frameBuffer);
584 catch (
const std::exception &exc) {
585 printf(
"OpenEXR-save: ERROR: %s\n", exc.what());
656 struct MultiViewChannelName *
m;
689 data->multiView =
new StringVector();
699 if (
data ==
nullptr) {
720 for (StringVector::const_iterator i = views.begin();
count < views.size(); ++i) {
736 StringVector sv = multiView(
file.header(0));
737 for (
const std::string &view_name : sv) {
738 views.push_back(view_name);
744 for (
int p = 0; p <
file.parts(); p++) {
746 if (
file.header(p).hasView()) {
751 views.push_back(
view);
762 if (viewname ==
nullptr || viewname[0] ==
'\0') {
767 const char delims[] = {
'.',
'\0'};
787 const char *passname,
788 const char *viewname,
798 echan->
m =
new MultiViewChannelName();
800 if (layname && layname[0] !=
'\0') {
801 echan->
m->name = layname;
802 echan->
m->name.append(
".");
803 echan->
m->name.append(passname);
806 echan->
m->name.assign(passname);
809 echan->
m->internal_name = echan->
m->name;
811 echan->
m->view.assign(viewname ? viewname :
"");
817 if (layname && layname[0] !=
'\0') {
820 else if (!
data->multiView->empty()) {
821 std::string raw_name = insertViewName(echan->
m->name, *
data->multiView, echan->
view_id);
834 data->num_half_channels++;
843 const char *filename,
856 bool is_singlelayer, is_multilayer, is_multiview;
868 header.channels(), *
data->multiView, &is_singlelayer, &is_multilayer, &is_multiview);
871 header.insert(
"BlenderMultiChannel", StringAttribute(
"Blender V2.55.1 and newer"));
875 addMultiView(header, *
data->multiView);
882 data->ofile =
new OutputFile(*(
data->ofile_stream), header);
884 catch (
const std::exception &exc) {
885 std::cerr <<
"IMB_exr_begin_write: ERROR: " << exc.what() << std::endl;
888 delete data->ofile_stream;
890 data->ofile =
nullptr;
891 data->ofile_stream =
nullptr;
894 return (
data->ofile !=
nullptr);
900 void *handle,
const char *filename,
int mipmap,
int width,
int height,
int tilex,
int tiley)
904 std::vector<Header> headers;
911 data->mipmap = mipmap;
913 header.setTileDescription(TileDescription(tilex, tiley, (mipmap) ? MIPMAP_LEVELS : ONE_LEVEL));
914 header.compression() = RLE_COMPRESSION;
915 header.setType(TILEDIMAGE);
917 header.insert(
"BlenderMultiChannel", StringAttribute(
"Blender V2.43"));
919 int numparts =
data->multiView->size();
923 for (
int i = 0; i < numparts; i++) {
924 headers.push_back(header);
925 headers[headers.size() - 1].setView((*(
data->multiView))[i]);
926 headers[headers.size() - 1].setName((*(
data->multiView))[i]);
930 exr_printf(
"%s %-6s %-22s \"%s\"\n",
"p",
"view",
"name",
"internal_name");
931 exr_printf(
"---------------------------------------------------------------\n");
938 echan->
m->internal_name = echan->
m->name;
939 echan->
m->part_number = echan->
view_id;
941 headers[echan->
view_id].channels().insert(echan->
m->internal_name, Channel(Imf::FLOAT));
943 echan->
m->part_number,
944 echan->
m->view.c_str(),
945 echan->
m->name.c_str(),
946 echan->
m->internal_name.c_str());
953 data->mpofile =
new MultiPartOutputFile(*(
data->ofile_stream), &headers[0], headers.size());
955 catch (
const std::exception &) {
956 delete data->mpofile;
957 delete data->ofile_stream;
959 data->mpofile =
nullptr;
960 data->ofile_stream =
nullptr;
975 data->ifile =
new MultiPartInputFile(*(
data->ifile_stream));
977 catch (
const std::exception &) {
979 delete data->ifile_stream;
981 data->ifile =
nullptr;
982 data->ifile_stream =
nullptr;
986 Box2i dw =
data->ifile->header(0).dataWindow();
987 data->width = *
width = dw.max.x - dw.min.x + 1;
988 data->height = *
height = dw.max.y - dw.min.y + 1;
992 std::vector<MultiViewChannelName> channels;
993 GetChannelsInMultiPartFile(*
data->ifile, channels);
995 for (
const MultiViewChannelName &channel : channels) {
997 data,
nullptr, channel.name.c_str(), channel.view.c_str(), 0, 0,
nullptr,
false);
1000 echan->
m->name = channel.name;
1001 echan->
m->view = channel.view;
1002 echan->
m->part_number = channel.part_number;
1003 echan->
m->internal_name = channel.internal_name;
1015 void *handle,
const char *layname,
const char *passname,
int xstride,
int ystride,
float *rect)
1021 if (layname && layname[0] !=
'\0') {
1040 printf(
"IMB_exr_set_channel error %s\n",
name);
1045 const char *layname,
1046 const char *passname,
1047 const char *viewname)
1065 if (layname && layname[0] !=
'\0') {
1070 else if (!
data->multiView->empty()) {
1072 std::string raw_name = insertViewName(
name, *
data->multiView, view_id);
1100 FrameBuffer frameBuffer;
1103 if (
data->channels.first) {
1104 const size_t num_pixels = ((size_t)
data->width) *
data->height;
1105 half *rect_half =
nullptr, *current_rect_half =
nullptr;
1108 if (
data->num_half_channels != 0) {
1111 current_rect_half = rect_half;
1117 float *rect = echan->
rect;
1118 half *cur = current_rect_half;
1119 for (
size_t i = 0; i < num_pixels; i++, cur++) {
1122 half *rect_to_write = current_rect_half + (
data->height - 1L) *
data->width;
1126 current_rect_half += num_pixels;
1130 frameBuffer.insert(echan->
name,
1134 -echan->
ystride *
sizeof(
float)));
1138 data->ofile->setFrameBuffer(frameBuffer);
1140 data->ofile->writePixels(
data->height);
1142 catch (
const std::exception &exc) {
1143 std::cerr <<
"OpenEXR-writePixels: ERROR: " << exc.what() << std::endl;
1146 if (rect_half !=
nullptr) {
1151 printf(
"Error: attempt to save MultiLayer without layers.\n");
1158 void *handle,
int partx,
int party,
int level,
const char *viewname,
bool empty)
1162 FrameBuffer frameBuffer;
1163 std::string
view(viewname);
1166 exr_printf(
"\nIMB_exrtile_write_channels(view: %s)\n", viewname);
1167 exr_printf(
"%s %-6s %-22s \"%s\"\n",
"p",
"view",
"name",
"internal_name");
1168 exr_printf(
"---------------------------------------------------------------------\n");
1177 if (!
STREQ(viewname, echan->
m->view.c_str())) {
1182 echan->
m->part_number,
1183 echan->
m->view.c_str(),
1184 echan->
m->name.c_str(),
1185 echan->
m->internal_name.c_str());
1188 frameBuffer.insert(echan->
m->internal_name,
1191 echan->
xstride *
sizeof(
float),
1192 echan->
ystride *
sizeof(
float)));
1196 TiledOutputPart out(*
data->mpofile, view_id);
1197 out.setFrameBuffer(frameBuffer);
1201 out.writeTile(partx /
data->tilex, party /
data->tiley, level);
1203 catch (
const std::exception &exc) {
1204 std::cerr <<
"OpenEXR-writeTile: ERROR: " << exc.what() << std::endl;
1211 int numparts =
data->ifile->parts();
1214 const StringAttribute *ta =
data->ifile->header(0).findTypedAttribute<StringAttribute>(
1215 "BlenderMultiChannel");
1218 short flip = (ta &&
STRPREFIX(ta->value().c_str(),
"Blender V2.43"));
1221 "\nIMB_exr_read_channels\n%s %-6s %-22s "
1222 "\"%s\"\n---------------------------------------------------------------------\n",
1228 for (
int i = 0; i < numparts; i++) {
1230 InputPart in(*
data->ifile, i);
1231 Header header = in.header();
1232 Box2i dw = header.dataWindow();
1235 FrameBuffer frameBuffer;
1239 if (echan->
m->part_number != i) {
1244 echan->
m->part_number,
1245 echan->
m->view.c_str(),
1246 echan->
m->name.c_str(),
1247 echan->
m->internal_name.c_str());
1250 float *rect = echan->
rect;
1256 rect -= echan->
xstride * (dw.min.x - dw.min.y *
data->width);
1263 rect -= echan->
xstride * (dw.min.x + dw.min.y *
data->width);
1266 frameBuffer.insert(echan->
m->internal_name,
1267 Slice(Imf::FLOAT, (
char *)rect, xstride, ystride));
1270 printf(
"warning, channel with no rect set %s\n", echan->
m->internal_name.c_str());
1276 in.setFrameBuffer(frameBuffer);
1277 exr_printf(
"readPixels:readPixels[%d]: min.y: %d, max.y: %d\n", i, dw.min.y, dw.max.y);
1278 in.readPixels(dw.min.y, dw.max.y);
1280 catch (
const std::exception &exc) {
1281 std::cerr <<
"OpenEXR-readPixels: ERROR: " << exc.what() << std::endl;
1289 void *(*addview)(
void *base,
const char *
str),
1290 void *(*addlayer)(
void *base,
const char *
str),
1291 void (*addpass)(
void *base,
1296 const char *chan_id,
1304 if (
data->multiView->empty()) {
1309 for (
const std::string &view_name : *
data->multiView) {
1310 addview(base, view_name.c_str());
1315 printf(
"cannot convert multilayer, no layers in handle\n");
1319 for (lay = (
ExrLayer *)
data->layers.first; lay; lay = lay->next) {
1320 void *laybase = addlayer(base, lay->name);
1322 for (pass = (
ExrPass *)lay->passes.first; pass; pass = pass->
next) {
1330 pass->
rect =
nullptr;
1344 delete data->ifile_stream;
1346 delete data->mpofile;
1347 delete data->ofile_stream;
1348 delete data->multiView;
1350 data->ifile =
nullptr;
1351 data->ifile_stream =
nullptr;
1352 data->ofile =
nullptr;
1353 data->mpofile =
nullptr;
1354 data->ofile_stream =
nullptr;
1380 const char delims[] = {
'.',
'\0'};
1389 return (
int)(end - *token);
1394 const char *
name = echan->
m->name.c_str();
1395 const char *end =
name + strlen(
name);
1405 if (
ELEM(
name[0],
'R',
'G',
'B',
'A')) {
1406 strcpy(passname,
"Combined");
1408 else if (
name[0] ==
'Z') {
1409 strcpy(passname,
"Depth");
1412 strcpy(passname,
name);
1421 printf(
"multilayer read: bad channel name: %s\n",
name);
1439 if (
ELEM(token[1],
'X',
'Y',
'Z') ||
ELEM(token[1],
'R',
'G',
'B') ||
1440 ELEM(token[1],
'U',
'V',
'A')) {
1468 printf(
"multilayer read: unknown channel token: %s\n", tokenbuf);
1477 printf(
"multilayer read: bad channel name: %s\n",
name);
1498 if (lay ==
nullptr) {
1511 if (pass ==
nullptr) {
1514 if (
STREQ(passname,
"Combined")) {
1529 MultiPartInputFile &
file,
1540 data->ifile_stream = &file_stream;
1546 std::vector<MultiViewChannelName> channels;
1547 GetChannelsInMultiPartFile(*
data->ifile, channels);
1551 for (
const MultiViewChannelName &channel : channels) {
1553 data,
nullptr, channel.name.c_str(), channel.view.c_str(), 0, 0,
nullptr,
false);
1556 echan->
m->name = channel.name;
1557 echan->
m->view = channel.view;
1558 echan->
m->part_number = channel.part_number;
1559 echan->
m->internal_name = channel.internal_name;
1567 const char *
view = echan->
m->view.c_str();
1572 if (
view[0] !=
'\0') {
1575 BLI_strncpy(passname, tmp_pass,
sizeof(passname));
1593 printf(
"error, too many channels in one pass: %s\n", echan->
m->name.c_str());
1605 echan = pass->
chan[0];
1614 memset(lookup, 0,
sizeof(lookup));
1620 lookup[(
unsigned int)
'R'] = 0;
1621 lookup[(
unsigned int)
'G'] = 1;
1622 lookup[(
unsigned int)
'B'] = 2;
1623 lookup[(
unsigned int)
'A'] = 3;
1627 lookup[(
unsigned int)
'X'] = 0;
1628 lookup[(
unsigned int)
'Y'] = 1;
1629 lookup[(
unsigned int)
'Z'] = 2;
1630 lookup[(
unsigned int)
'W'] = 3;
1633 lookup[(
unsigned int)
'U'] = 0;
1634 lookup[(
unsigned int)
'V'] = 1;
1635 lookup[(
unsigned int)
'A'] = 2;
1638 echan = pass->
chan[
a];
1647 echan = pass->
chan[
a];
1670 va_start(args, fmt);
1671 std::vsprintf(
output, fmt, args);
1681 int numparts =
file.parts();
1682 if (numparts == 1 && hasMultiView(
file.header(0))) {
1683 const StringVector views = multiView(
file.header(0));
1684 printf(
"OpenEXR-load: MultiView file\n");
1685 printf(
"OpenEXR-load: Default view: %s\n", defaultViewName(views).c_str());
1686 for (
const std::string &
view : views) {
1687 printf(
"OpenEXR-load: Found view %s\n",
view.c_str());
1690 else if (numparts > 1) {
1691 printf(
"OpenEXR-load: MultiPart file\n");
1692 for (
int i = 0; i < numparts; i++) {
1693 if (
file.header(i).hasView()) {
1694 printf(
"OpenEXR-load: Part %d: view = \"%s\"\n", i,
file.header(i).view().c_str());
1699 for (
int j = 0; j < numparts; j++) {
1700 const ChannelList &channels =
file.header(j).channels();
1701 for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) {
1702 const Channel &channel = i.channel();
1703 printf(
"OpenEXR-load: Found channel %s of type %d\n", i.name(), channel.type);
1711 const ChannelList &channels =
file.header(0).channels();
1713 for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) {
1715 const char *
str = i.name();
1729 static const char *channel_names[] = {
1730 "R",
"Red",
"G",
"Green",
"B",
"Blue",
"AR",
"RA",
"AG",
"GA",
"AB",
"BA",
nullptr};
1733 int num_channels = 0;
1735 for (
int i = 0; channel_names[i]; i++) {
1736 if (header.channels().findChannel(channel_names[i])) {
1737 rgb_channels[num_channels++] = channel_names[i];
1738 if (num_channels == 3) {
1744 return num_channels;
1753 return header.channels().findChannel(
"Y") !=
nullptr;
1759 return header.channels().findChannel(
"BY") !=
nullptr &&
1760 header.channels().findChannel(
"RY") !=
nullptr;
1766 return !(header.channels().findChannel(
"Z") ==
nullptr);
1772 return !(header.channels().findChannel(
"A") ==
nullptr);
1777 const ChannelList &channels =
file.header(0).channels();
1778 for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) {
1779 const Channel &channel = i.channel();
1780 if (channel.type !=
HALF) {
1789 const ChannelList &channels =
file.header(0).channels();
1790 std::set<std::string> layerNames;
1794 channels.layers(layerNames);
1796 return (!layerNames.empty());
1800 StringVector &views,
1801 bool *r_singlelayer,
1805 std::set<std::string> layerNames;
1807 *r_singlelayer =
true;
1808 *r_multilayer = *r_multiview =
false;
1811 channels.layers(layerNames);
1813 if (!views.empty() && !views[0].empty()) {
1814 *r_multiview =
true;
1817 *r_singlelayer =
false;
1818 *r_multilayer = (layerNames.size() > 1);
1819 *r_multiview =
false;
1823 if (!layerNames.empty()) {
1831 for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); i++) {
1832 for (
const std::string &layer_name : layerNames) {
1835 std::string layerName = layer_name;
1836 size_t pos = layerName.rfind(
'.');
1838 if (
pos == std::string::npos) {
1839 *r_multilayer =
true;
1840 *r_singlelayer =
false;
1848 *r_singlelayer =
true;
1849 *r_multilayer =
false;
1857 for (
int p = 0; p <
file.parts(); p++) {
1858 if (hasMultiView(
file.header(p))) {
1868 return file.parts() > 1;
1902 struct ImBuf *ibuf =
nullptr;
1904 MultiPartInputFile *
file =
nullptr;
1916 file =
new MultiPartInputFile(*membuf);
1918 Box2i dw =
file->header(0).dataWindow();
1919 const int width = dw.max.x - dw.min.x + 1;
1920 const int height = dw.max.y - dw.min.y + 1;
1933 printf(
"Error: can't process EXR multilayer file\n");
1941 if (hasXDensity(
file->header(0))) {
1953 Header::ConstIterator iter;
1956 for (iter = header.begin(); iter != header.end(); iter++) {
1957 const StringAttribute *attr =
file->header(0).findTypedAttribute<StringAttribute>(
1978 const char *rgb_channels[3];
1981 FrameBuffer frameBuffer;
1983 int xstride =
sizeof(
float[4]);
1984 int ystride = -xstride *
width;
1994 if (num_rgb_channels > 0) {
1995 for (
int i = 0; i < num_rgb_channels; i++) {
1997 Slice(Imf::FLOAT, (
char *)(first + i), xstride, ystride));
2000 else if (has_luma) {
2002 Slice(Imf::FLOAT, (
char *)first, xstride, ystride));
2005 Slice(Imf::FLOAT, (
char *)(first + 1), xstride, ystride, 1, 1, 0.5f));
2008 Slice(Imf::FLOAT, (
char *)(first + 2), xstride, ystride, 1, 1, 0.5f));
2013 Slice(Imf::FLOAT, (
char *)(first + 3), xstride, ystride, 1, 1, 1.0f));
2022 "Z", Slice(Imf::FLOAT, (
char *)firstz,
sizeof(
float), -
width *
sizeof(
float)));
2025 InputPart in(*
file, 0);
2026 in.setFrameBuffer(frameBuffer);
2027 in.readPixels(dw.min.y, dw.max.y);
2037 if (flag & IM_rect) {
2043 for (
size_t a = 0;
a < (size_t)ibuf->
x * ibuf->
y;
a++) {
2054 else if (num_rgb_channels <= 1) {
2056 for (
size_t a = 0;
a < (size_t)ibuf->
x * ibuf->
y;
a++) {
2058 if (num_rgb_channels <= 1) {
2059 color[1] = color[0];
2061 if (num_rgb_channels <= 2) {
2062 color[2] = color[0];
2083 catch (
const std::exception &exc) {
2084 std::cerr << exc.what() << std::endl;
2099 setGlobalThreadCount(num_threads);
2107 setGlobalThreadCount(0);
typedef float(TangentPoint)[2]
void BKE_stamp_info_callback(void *data, struct StampData *stamp_data, StampCallback callback, bool noskip)
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
size_t BLI_file_size(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_kdtree_nd_() free(KDTree *tree)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_rfindstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float clamp_f(float value, float min, float max)
void ycc_to_rgb(float y, float cb, float cr, float *r_r, float *r_g, float *r_b, int colorspace)
float srgb_to_linearrgb(float c)
#define BLI_YCC_ITU_BT709
size_t BLI_str_partition_ex(const char *str, const char *end, const char delim[], const char **sep, const char **suf, const bool from_right) ATTR_NONNULL(1
int BLI_strcasecmp(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_strcaseeq(const char *a, const char *b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
size_t BLI_str_rpartition(const char *str, const char delim[], const char **sep, const char **suf) ATTR_NONNULL()
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
int BLI_system_thread_count(void)
typedef double(DMatrix)[4][4]
#define R_IMF_EXR_CODEC_PXR24
#define R_IMF_EXR_CODEC_NONE
#define R_IMF_EXR_CODEC_RLE
#define R_IMF_EXR_CODEC_ZIP
#define R_IMF_EXR_CODEC_DWAA
#define R_IMF_EXR_CODEC_ZIPS
#define R_IMF_EXR_CODEC_DWAB
#define R_IMF_EXR_CODEC_B44A
#define R_IMF_EXR_CODEC_B44
#define R_IMF_EXR_CODEC_PIZ
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
Header file for allocimbuf.c.
@ COLOR_ROLE_DEFAULT_FLOAT
struct ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_rect_from_float(struct ImBuf *ibuf)
void IMB_freeImBuf(struct ImBuf *ibuf)
bool addzbuffloatImBuf(struct ImBuf *ibuf)
bool imb_addrectfloatImBuf(struct ImBuf *ibuf)
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
bool imb_enlargeencodedbufferImBuf(ImBuf *ibuf)
bool imb_addencodedbufferImBuf(ImBuf *ibuf)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
bool read(char c[], int n) override
IFileStream(const char *filename)
void seekg(Int64 pos) override
void seekg(Int64 pos) override
IMemStream(unsigned char *exrbuf, size_t exrsize)
bool read(char c[], int n) override
void seekp(Int64 pos) override
OFileStream(const char *filename)
void write(const char c[], int n) override
void write(const char c[], int n) override
void seekp(Int64 pos) override
void colorspace_set_default_role(char *colorspace, int size, int role)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *passname)
static const char * exr_rgba_channelname(MultiPartInputFile &file, const char *chan)
static bool exr_has_multiview(MultiPartInputFile &file)
static void exr_printf(const char *__restrict fmt,...)
void IMB_exr_add_view(void *handle, const char *name)
static void openexr_header_compression(Header *header, int compression)
static int imb_exr_get_multiView_id(StringVector &views, const std::string &name)
bool IMB_exr_has_multilayer(void *handle)
static ExrLayer * imb_exr_get_layer(ListBase *lb, char *layname)
struct ImBuf * imb_load_openexr(const unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE])
void IMB_exr_close(void *handle)
void IMB_exr_clear_channels(void *handle)
static bool exr_is_half_float(MultiPartInputFile &file)
static bool imb_exr_is_multi(MultiPartInputFile &file)
static void openexr_header_metadata_callback(void *data, const char *propname, char *prop, int UNUSED(len))
static bool exr_has_luma(MultiPartInputFile &file)
static int exr_has_rgb(MultiPartInputFile &file, const char *rgb_channels[3])
void imb_initopenexr(void)
static struct ExrPass * imb_exr_get_pass(ListBase *lb, char *passname)
static int imb_exr_split_token(const char *str, const char *end, const char **token)
void IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley)
bool imb_is_a_openexr(const unsigned char *mem, const size_t size)
void * IMB_exr_get_handle_name(const char *name)
void IMB_exr_add_channel(void *handle, const char *layname, const char *passname, const char *viewname, int xstride, int ystride, float *rect, bool use_half_float)
void IMB_exr_write_channels(void *handle)
static bool exr_has_chroma(MultiPartInputFile &file)
int IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress, const StampData *stamp)
static bool imb_exr_is_multilayer_file(MultiPartInputFile &file)
void IMB_exr_read_channels(void *handle)
static half float_to_half_safe(const float value)
static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
void IMB_exrtile_write_channels(void *handle, int partx, int party, int level, const char *viewname, bool empty)
static void imb_exr_insert_view_name(char *name_full, const char *passname, const char *viewname)
static ListBase exrhandles
void IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect)
void * IMB_exr_get_handle(void)
static bool exr_has_multipart_file(MultiPartInputFile &file)
static void exr_print_filecontents(MultiPartInputFile &file)
static void imb_exr_type_by_channels(ChannelList &channels, StringVector &views, bool *r_singlelayer, bool *r_multilayer, bool *r_multiview)
static void imb_exr_get_views(MultiPartInputFile &file, StringVector &views)
int IMB_exr_begin_read(void *handle, const char *filename, int *width, int *height)
void IMB_exr_multilayer_convert(void *handle, void *base, void *(*addview)(void *base, const char *str), void *(*addlayer)(void *base, const char *str), void(*addpass)(void *base, void *lay, const char *str, float *rect, int totchan, const char *chan_id, const char *view))
static bool imb_save_openexr_half(ImBuf *ibuf, const char *name, const int flags)
float * IMB_exr_channel_rect(void *handle, const char *layname, const char *passname, const char *viewname)
static bool exr_has_zbuffer(MultiPartInputFile &file)
static bool imb_save_openexr_float(ImBuf *ibuf, const char *name, const int flags)
static ExrHandle * imb_exr_begin_read_mem(IStream &file_stream, MultiPartInputFile &file, int width, int height)
bool imb_save_openexr(struct ImBuf *ibuf, const char *name, int flags)
static bool exr_has_alpha(MultiPartInputFile &file)
void imb_exitopenexr(void)
char name[EXR_TOT_MAXNAME+1]
struct MultiViewChannelName * m
OFileStream * ofile_stream
MultiPartInputFile * ifile
MultiPartOutputFile * mpofile
char name[EXR_LAY_MAXNAME+1]
char chan_id[EXR_PASS_MAXCHAN]
char view[EXR_VIEW_MAXNAME]
char name[EXR_PASS_MAXNAME]
struct ExrChannel * chan[EXR_PASS_MAXCHAN]
char internal_name[EXR_PASS_MAXNAME]
struct IDProperty * metadata
ImbFormatOptions foptions
wchar_t * alloc_utf16_from_8(const char *in8, size_t add)