Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Mein <mein@cs.umn.edu>2005-03-11 23:16:14 +0300
committerKent Mein <mein@cs.umn.edu>2005-03-11 23:16:14 +0300
commita1919e6db4e20f1ab16646d3cbb273f569af23e1 (patch)
tree60642648c9d0b35a1c8f81bf96bdb7c60acba2d7
parentc6d51245604b8c1bb329f5362ad528cc6f31c085 (diff)
Gernot Ziegler's patch to add OpenEXR support to blender.
To enable it you will need to download OpenEXR and install it. For the Makefiles you will need to set WITH_OPENEXR=true and set NAN_OPENEXR to point to where OpenEXR is installed. For scons you'll need to remove config.opts to get the new options so you can enable OpenEXR, I was not able to get blender to link with scons so the scons stuff may need to be tweaked a little but I think it should work. For other platform managers The OpenEXR stuff is similar to QUICKTIME you need to define WITH_OPENEXR and setup the library stuff and as you'll notice in this commit there are two extra files. Kent
-rw-r--r--SConstruct33
-rw-r--r--source/Makefile6
-rw-r--r--source/blender/blenkernel/intern/Makefile4
-rw-r--r--source/blender/blenkernel/intern/image.c5
-rw-r--r--source/blender/imbuf/IMB_imbuf.h2
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h5
-rw-r--r--source/blender/imbuf/SConscript4
-rw-r--r--source/blender/imbuf/intern/IMB_openexr.h46
-rw-r--r--source/blender/imbuf/intern/Makefile7
-rw-r--r--source/blender/imbuf/intern/cmap.c4
-rw-r--r--source/blender/imbuf/intern/openexr.cpp392
-rw-r--r--source/blender/imbuf/intern/readimage.c10
-rw-r--r--source/blender/imbuf/intern/writeimage.c8
-rw-r--r--source/blender/makesdna/DNA_scene_types.h2
-rw-r--r--source/blender/src/Makefile4
-rw-r--r--source/blender/src/buttons_scene.c13
-rw-r--r--source/blender/src/toets.c18
-rwxr-xr-xsource/blender/src/transform_generics.c3
-rw-r--r--source/blender/src/writeimage.c9
-rw-r--r--source/gameengine/GamePlayer/common/SConscript3
-rw-r--r--source/nan_definitions.mk30
-rw-r--r--tools/scons/bs/bs_libs.py3
22 files changed, 592 insertions, 19 deletions
diff --git a/SConstruct b/SConstruct
index ce3e77bccb2..0cbecdfa937 100644
--- a/SConstruct
+++ b/SConstruct
@@ -82,6 +82,10 @@ if sys.platform == 'linux2' or sys.platform == 'linux-i386':
png_lib = ['png']
png_libpath = ['/usr/lib']
png_include = ['/usr/include']
+ # OpenEXR library information
+ openexr_lib = ['Iex', 'Half', 'IlmImf', 'Imath']
+ openexr_libpath = ['/usr/lib']
+ openexr_include = ['/usr/include/OpenEXR']
# jpeg library information
jpeg_lib = ['jpeg']
jpeg_libpath = ['/usr/lib']
@@ -128,6 +132,9 @@ if sys.platform == 'linux2' or sys.platform == 'linux-i386':
openal_lib = ['openal']
openal_libpath = ['/usr/lib']
openal_include = ['/usr/include']
+ use_openexr = 'false'
+ if use_openexr == 'true':
+ defines += ['WITH_OPENEXR']
elif sys.platform == 'darwin':
use_international = 'true'
@@ -240,6 +247,8 @@ elif sys.platform == 'darwin':
openal_lib = ['libopenal']
openal_libpath = [darwin_precomp + 'openal/lib']
openal_include = [darwin_precomp + 'openal/include']
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif sys.platform == 'cygwin':
use_international = 'false'
@@ -320,6 +329,8 @@ elif sys.platform == 'cygwin':
openal_lib = []
openal_libpath = []
openal_include = []
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif sys.platform == 'win32':
use_international = 'true'
@@ -421,6 +432,8 @@ elif sys.platform == 'win32':
openal_lib = ['openal_static']
openal_libpath = ['#../lib/windows/openal/lib']
openal_include = ['#../lib/windows/openal/include']
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif string.find (sys.platform, 'sunos') != -1:
use_international = 'true'
@@ -499,6 +512,8 @@ elif string.find (sys.platform, 'sunos') != -1:
openal_lib = []
openal_libpath = []
openal_include = []
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif string.find (sys.platform, 'irix') != -1:
use_international = 'false'
@@ -584,10 +599,14 @@ elif string.find (sys.platform, 'irix') != -1:
openal_lib = []
openal_libpath = []
openal_include = []
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif string.find (sys.platform, 'hp-ux') != -1:
window_system = 'X11'
defines = []
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif sys.platform=='openbsd3':
print "Building for OpenBSD 3.x"
@@ -667,6 +686,8 @@ elif sys.platform=='openbsd3':
openal_lib = ['openal']
openal_libpath = ['/usr/lib']
openal_include = ['/usr/include']
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
elif sys.platform=='freebsd4' or sys.platform=='freebsd5':
print "Building for FreeBSD"
@@ -746,6 +767,8 @@ elif sys.platform=='freebsd4' or sys.platform=='freebsd5':
openal_lib = ['openal']
openal_libpath = ['/usr/lib']
openal_include = ['/usr/include']
+ if use_openexr == 'false':
+ defines += ['WITH_OPENEXR']
else:
print "Unknown platform %s"%sys.platform
@@ -820,6 +843,10 @@ else:
config.write ("PNG_INCLUDE = %r\n"%(png_include))
config.write ("PNG_LIBPATH = %r\n"%(png_libpath))
config.write ("PNG_LIBRARY = %r\n"%(png_lib))
+ config.write ("USE_OPENEXR = %r\n"%(use_openexr))
+ config.write ("OPENEXR_INCLUDE = %r\n"%(openexr_include))
+ config.write ("OPENEXR_LIBPATH = %r\n"%(openexr_libpath))
+ config.write ("if USE_OPENEXR == 'true':\n\tOPENEXR_LIBRARY = %r\n"%(openexr_lib))
config.write ("JPEG_INCLUDE = %r\n"%(jpeg_include))
config.write ("JPEG_LIBPATH = %r\n"%(jpeg_libpath))
config.write ("JPEG_LIBRARY = %r\n"%(jpeg_lib))
@@ -900,6 +927,9 @@ user_options.AddOptions (
(BoolOption ('USE_QUICKTIME',
'Set to 1 to add support for QuickTime.',
'false')),
+ (BoolOption ('USE_OPENEXR',
+ 'Set to 1 to add support for OpenEXR.',
+ 'false')),
('HOST_CC', 'C compiler for the host platfor. This is the same as target platform when not cross compiling.'),
('HOST_CXX', 'C++ compiler for the host platform. This is the same as target platform when not cross compiling.'),
('TARGET_CC', 'C compiler for the target platform.'),
@@ -923,6 +953,9 @@ user_options.AddOptions (
('PNG_INCLUDE', 'Include directory for png header files.'),
('PNG_LIBPATH', 'Library path where the png library is located.'),
('PNG_LIBRARY', 'png library name.'),
+ ('OPENEXR_INCLUDE', 'Include directory for OpenEXR header files.'),
+ ('OPENEXR_LIBPATH', 'Library path where the OpenEXR library is located.'),
+ ('OPENEXR_LIBRARY', 'openexr library names.'),
('JPEG_INCLUDE', 'Include directory for jpeg header files.'),
('JPEG_LIBPATH', 'Library path where the jpeg library is located.'),
('JPEG_LIBRARY', 'jpeg library name.'),
diff --git a/source/Makefile b/source/Makefile
index 60c8ede03c1..ed466332ec9 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -148,6 +148,12 @@ endif
COMLIB += $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
COMLIB += $(NAN_BMFONT)/lib/$(DEBUG_DIR)libbmfont.a
COMLIB += $(NAN_PNG)/lib/libpng.a
+ ifeq ($(WITH_OPENEXR), true)
+ COMLIB += $(NAN_OPENEXR)/lib/libIlmImf.a
+ COMLIB += $(NAN_OPENEXR)/lib/libHalf.a
+ COMLIB += $(NAN_OPENEXR)/lib/libIex.a
+ COMLIB += $(NAN_OPENEXR)/lib/libImath.a
+ endif
COMLIB += $(OCGDIR)/blender/yafray/$(DEBUG_DIR)libyafrayexport.a
COMLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
ifeq ($(WITH_QUICKTIME), true)
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
index 4468fa01f12..0b8c0a03217 100644
--- a/source/blender/blenkernel/intern/Makefile
+++ b/source/blender/blenkernel/intern/Makefile
@@ -77,3 +77,7 @@ ifeq ($(WITH_FREETYPE2), true)
CPPFLAGS += -I$(NAN_FREETYPE)/include
CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
endif
+
+ifeq ($(WITH_OPENEXR), true)
+ CPPFLAGS += -DWITH_OPENEXR
+endif
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index d8c455c9c48..e4752220737 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -193,6 +193,11 @@ void makepicstring(char *string, int frame)
else if(G.scene->r.imtype==R_PNG) {
extension= ".png";
}
+#ifdef WITH_OPENEXR
+ else if(G.scene->r.imtype==R_OPENEXR) {
+ extension= ".exr";
+ }
+#endif
else if(G.scene->r.imtype==R_TARGA) {
extension= ".tga";
}
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 7f7b2b08a56..80eec374627 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -140,7 +140,7 @@ short IMB_converttocmap(struct ImBuf *ibuf);
*
* @attention Defined in cmap.c
*/
-int IMB_alpha_to_col0(int new);
+int IMB_alpha_to_col0(int value);
/**
*
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 8abb00d722d..e0a1d42aa1a 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -75,6 +75,7 @@ typedef struct ImBuf{
int ftype; /**< File type */
unsigned int *cmap; /**< Color map data. */
unsigned int *rect; /**< databuffer */
+ float *rect_float; /**< databuffer in Float format, unclampled !! */
unsigned int **planes; /**< bitplanes */
int flags; /**< Controls which components should exist. */
int mall; /**< what is malloced internal, and can be freed */
@@ -151,6 +152,9 @@ typedef enum {
#ifdef WITH_IMAGEMAGICK
#define IMAGEMAGICK (1 << 23)
#endif
+#ifdef WITH_OPENEXR
+#define OPENEXR (1 << 22)
+#endif
#define RAWTGA (TGA | 1)
@@ -187,6 +191,7 @@ typedef enum {
#define IS_hamx(x) (x->ftype == AN_hamx)
#define IS_tga(x) (x->ftype & TGA)
#define IS_png(x) (x->ftype & PNG)
+#define IS_openexr(x) (x->ftype & OPENEXR)
#define IS_bmp(x) (x->ftype & BMP)
#define IMAGIC 0732
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index 11d7cfb2b30..199e872e49b 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -33,6 +33,9 @@ source_files = ['intern/allocimbuf.c',
'intern/util.c',
'intern/writeimage.c']
+if user_options_dict['USE_OPENEXR'] == 1:
+ source_files.append('intern/openexr.cpp')
+
imbuf_env.Append (CPPPATH = ['.',
'../makesdna',
'#/intern/guardedalloc',
@@ -43,6 +46,7 @@ imbuf_env.Append (CPPPATH = ['.',
imbuf_env.Append (CPPPATH = user_options_dict['JPEG_INCLUDE'])
imbuf_env.Append (CPPPATH = user_options_dict['PNG_INCLUDE'])
+imbuf_env.Append (CPPPATH = user_options_dict['OPENEXR_INCLUDE'])
imbuf_env.Append (CPPPATH = user_options_dict['Z_INCLUDE'])
imbuf_env.Append (CPPPATH = extra_includes)
imbuf_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/blender_imbuf', source=source_files)
diff --git a/source/blender/imbuf/intern/IMB_openexr.h b/source/blender/imbuf/intern/IMB_openexr.h
new file mode 100644
index 00000000000..edf8b144bde
--- /dev/null
+++ b/source/blender/imbuf/intern/IMB_openexr.h
@@ -0,0 +1,46 @@
+/*
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+/**
+ * \file IMB_openexr.h
+ * \ingroup imbuf
+ * \brief Function declarations for openexr.cc
+ */
+
+#ifndef IMB_OPENEXR_H
+#define IMB_OPENEXR_H
+
+struct ImBuf;
+
+int imb_is_a_openexr(void *buf);
+
+struct ImBuf *imb_load_openexr(unsigned char *mem, int size, int flags);
+short imb_save_openexr(struct ImBuf * ibuf, char *name, int flags);
+#endif
diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile
index 0cb0316524d..15062044716 100644
--- a/source/blender/imbuf/intern/Makefile
+++ b/source/blender/imbuf/intern/Makefile
@@ -60,6 +60,11 @@ CPPFLAGS += -I../../makesdna
CPPFLAGS += -I..
ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
+ CPPFLAGS += -DWITH_QUICKTIME
+endif
+
+ifeq ($(WITH_OPENEXR), true)
+ CPPFLAGS += -DWITH_OPENEXR
+ CPPFLAGS += -I$(NAN_OPENEXR)/include/OpenEXR
endif
diff --git a/source/blender/imbuf/intern/cmap.c b/source/blender/imbuf/intern/cmap.c
index f5302b311d8..c955fbf7e60 100644
--- a/source/blender/imbuf/intern/cmap.c
+++ b/source/blender/imbuf/intern/cmap.c
@@ -64,12 +64,12 @@ void IMB_freeImBufdata(void)
}
-int IMB_alpha_to_col0(int new)
+int IMB_alpha_to_col0(int value)
{
int old;
old = alpha_col0;
- alpha_col0 = new;
+ alpha_col0 = value;
return (old);
}
diff --git a/source/blender/imbuf/intern/openexr.cpp b/source/blender/imbuf/intern/openexr.cpp
new file mode 100644
index 00000000000..96c897715d8
--- /dev/null
+++ b/source/blender/imbuf/intern/openexr.cpp
@@ -0,0 +1,392 @@
+/**
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Copyright by Gernot Ziegler <gz@lysator.liu.se>.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ *
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string>
+
+#include <iostream>
+
+#include <half.h>
+#include <ImfVersion.h>
+#include <ImathBox.h>
+#include <ImfArray.h>
+#include <ImfIO.h>
+#include <ImfChannelList.h>
+#include <ImfPixelType.h>
+#include <ImfInputFile.h>
+#include <ImfOutputFile.h>
+
+using namespace Imf;
+using namespace Imath;
+
+extern "C"
+{
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+#include "BLI_blenlib.h"
+
+#include "imbuf.h"
+#include "imbuf_patch.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+#include "IMB_allocimbuf.h"
+#include "IMB_cmap.h"
+}
+
+
+int imb_is_a_openexr(void *mem)
+{
+ return Imf::isImfMagic ((const char *)mem);
+}
+
+
+class Mem_IStream: public IStream
+{
+ public:
+
+ Mem_IStream (unsigned char *exrbuf, int exrsize):
+ IStream("dummy"), _exrpos (0), _exrsize(exrsize) { _exrbuf = exrbuf; }
+
+ virtual bool read (char c[], int n);
+ virtual Int64 tellg ();
+ virtual void seekg (Int64 pos);
+ virtual void clear ();
+//virtual ~Mem_IStream() {}; // unused
+
+ private:
+
+ Int64 _exrpos;
+ Int64 _exrsize;
+ unsigned char *_exrbuf;
+};
+
+bool Mem_IStream::read (char c[], int n)
+{
+ if (n + _exrpos <= _exrsize)
+ {
+ memcpy(c, (void *)(&_exrbuf[_exrpos]), n);
+ _exrpos += n;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+Int64 Mem_IStream::tellg ()
+{
+ return _exrpos;
+}
+
+
+void Mem_IStream::seekg (Int64 pos)
+{
+ _exrpos = pos;
+}
+
+
+void Mem_IStream::clear ()
+{
+}
+
+
+struct _RGBAZ
+{
+ half r;
+ half g;
+ half b;
+ half a;
+ half z;
+};
+
+typedef struct _RGBAZ RGBAZ;
+
+extern "C"
+{
+ short imb_save_openexr(struct ImBuf *ibuf, char *name, int flags)
+ {
+ int width = ibuf->x;
+ int height = ibuf->y;
+ int i;
+
+ // summarize
+ int write_zbuf = (flags & IB_zbuf) && ibuf->zbuf != 0;
+
+ printf("OpenEXR-save: Saving %s image of %d x %d\n",
+ write_zbuf ? "RGBAZ" : "RGBA", width, height);
+
+ try
+ {
+ Header header (width, height);
+ header.channels().insert ("R", Channel (HALF));
+ header.channels().insert ("G", Channel (HALF));
+ header.channels().insert ("B", Channel (HALF));
+ header.channels().insert ("A", Channel (HALF));
+ if (write_zbuf)
+ header.channels().insert ("Z", Channel (HALF));
+
+ FrameBuffer frameBuffer;
+ OutputFile *file;
+
+ if (flags & IB_mem)
+ {
+ printf("OpenEXR-save: Create EXR in memory CURRENTLY NOT SUPPORTED !\n");
+ imb_addencodedbufferImBuf(ibuf);
+ ibuf->encodedsize = 0;
+ return(0);
+ }
+ else
+ {
+ printf("OpenEXR-save: Creating output file %s\n", name);
+ file = new OutputFile(name, header);
+ }
+
+ RGBAZ *pixels = new RGBAZ[height * width];
+
+ int bytesperpixel = (ibuf->depth + 7) >> 3;
+ if ((bytesperpixel > 4) || (bytesperpixel == 2))
+ {
+ printf("OpenEXR-save: unsupported bytes per pixel: %d\n", bytesperpixel);
+ return (0);
+ }
+
+ frameBuffer.insert ("R",
+ Slice (HALF,
+ (char *) &pixels[0].r,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ frameBuffer.insert ("G",
+ Slice (HALF,
+ (char *) &pixels[0].g,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ frameBuffer.insert ("B",
+ Slice (HALF,
+ (char *) &pixels[0].b,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ frameBuffer.insert ("A",
+ Slice (HALF,
+ (char *) &pixels[0].a,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ if (write_zbuf)
+ frameBuffer.insert ("Z",
+ Slice (HALF,
+ (char *) &pixels[0].z,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ if (!ibuf->rect_float)
+ {
+ printf("OpenEXR-save: Converting Blender 8/8/8/8 pixels to OpenEXR format\n");
+
+ RGBAZ *to = pixels;
+ unsigned char *from = (unsigned char *) ibuf->rect;
+
+ for (i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ to->r = (float)(from[0])/255.0;
+ to->g = (float)(from[1])/255.0;
+ to->b = (float)(from[2])/255.0;
+ to->a = (float)(from[3])/255.0;
+ to++; from += 4;
+ }
+ }
+ else
+ {
+ printf("OpenEXR-save: Converting Blender FLOAT pixels to OpenEXR format\n");
+
+ RGBAZ *to = pixels;
+ float *from = ibuf->rect_float;
+
+ for (i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ to->r = from[0];
+ to->g = from[1];
+ to->b = from[2];
+ to->a = from[3];
+ to++; from += 4;
+ }
+ }
+
+ if (write_zbuf)
+ {
+ RGBAZ *to = pixels;
+ int *fromz = ibuf->zbuf;
+
+ for (int i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ to->z = (0.5+((float)(*fromz/65536)/65536.0));
+ to++; fromz ++;
+ }
+ }
+
+ printf("OpenEXR-save: Writing OpenEXR file of height %d.\n", height);
+
+ file->setFrameBuffer (frameBuffer);
+ file->writePixels (height);
+ delete file;
+ }
+ catch (const std::exception &exc)
+ {
+ printf("OpenEXR-save: ERROR: %s\n", exc.what());
+ if (ibuf) IMB_freeImBuf(ibuf);
+
+ return (0);
+ }
+
+ return (1);
+ printf("OpenEXR-save: Done.\n");
+ }
+
+ struct ImBuf *imb_load_openexr(unsigned char *mem, int size, int flags)
+ {
+ struct ImBuf *ibuf = 0;
+
+ printf("OpenEXR-load: testing input, size is %d\n", size);
+ if (imb_is_a_openexr(mem) == 0) return(0);
+
+ InputFile *file = NULL;
+
+ try
+ {
+ printf("OpenEXR-load: Creating InputFile from mem source\n");
+ Mem_IStream membuf(mem, size);
+ file = new InputFile(membuf);
+
+ Box2i dw = file->header().dataWindow();
+ int width = dw.max.x - dw.min.x + 1;
+ int height = dw.max.y - dw.min.y + 1;
+
+ printf("OpenEXR-load: image data window %d %d %d %d\n",
+ dw.min.x, dw.min.y, dw.max.x, dw.max.y);
+
+ const ChannelList &channels = file->header().channels();
+
+ for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i)
+ {
+ const Channel &channel = i.channel();
+ printf("OpenEXR-load: Found channel %s of type %d\n", i.name(), channel.type);
+ if (channel.type != 1)
+ {
+ printf("OpenEXR-load: Can only process HALF input !!\n");
+ return(NULL);
+ }
+ }
+
+ RGBAZ *pixels = new RGBAZ[height * width];
+
+ FrameBuffer frameBuffer;
+
+ frameBuffer.insert ("R",
+ Slice (HALF,
+ (char *) &pixels[0].r,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ frameBuffer.insert ("G",
+ Slice (HALF,
+ (char *) &pixels[0].g,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ frameBuffer.insert ("B",
+ Slice (HALF,
+ (char *) &pixels[0].b,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+ frameBuffer.insert ("A",
+ Slice (HALF,
+ (char *) &pixels[0].a,
+ sizeof (pixels[0]) * 1,
+ sizeof (pixels[0]) * width));
+
+// FIXME ? Would be able to read Z data or other channels here !
+
+ printf("OpenEXR-load: Reading pixel data\n");
+ file->setFrameBuffer (frameBuffer);
+ file->readPixels (dw.min.y, dw.max.y);
+
+ printf("OpenEXR-load: Converting to Blender ibuf\n");
+
+ int bytesperpixel = 4; // since OpenEXR fills in unknown channels
+ ibuf = IMB_allocImBuf(width, height, 8 * bytesperpixel, 0, 0);
+
+ if (ibuf)
+ {
+ ibuf->ftype = PNG;
+ imb_addrectImBuf(ibuf);
+
+ if (!(flags & IB_test))
+ {
+ unsigned char *to = (unsigned char *) ibuf->rect;
+ RGBAZ *from = pixels;
+ RGBAZ prescale;
+
+ for (int i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ to[0] = (unsigned char)(((float)from->r > 1.0) ? 1.0 : (float)from->r) * 255;
+ to[1] = (unsigned char)(((float)from->g > 1.0) ? 1.0 : (float)from->g) * 255;
+ to[2] = (unsigned char)(((float)from->b > 1.0) ? 1.0 : (float)from->b) * 255;
+ to[3] = (unsigned char)(((float)from->a > 1.0) ? 1.0 : (float)from->a) * 255;
+ to += 4; from++;
+ }
+ }
+
+ }
+ else
+ printf("Couldn't allocate memory for PNG image\n");
+
+ printf("OpenEXR-load: Done\n");
+
+ return(ibuf);
+ }
+ catch (const std::exception &exc)
+ {
+ std::cerr << exc.what() << std::endl;
+ if (ibuf) IMB_freeImBuf(ibuf);
+
+ return (0);
+ }
+
+ }
+
+} // export "C"
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index 0f817e22dd1..9d40ef602f8 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -47,6 +47,11 @@
#include "IMB_jpeg.h"
#include "IMB_bmp.h"
#include "BKE_global.h"
+
+#ifdef WITH_OPENEXR
+#include "IMB_openexr.h"
+#endif
+
#ifdef WITH_QUICKTIME
#if defined(_WIN32) || defined (__APPLE__)
#include "quicktime_import.h"
@@ -137,6 +142,11 @@ ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) {
ibuf = imb_loadtarga((uchar *)mem, flags);
if (ibuf) return(ibuf);
+#ifdef WITH_OPENEXR
+ ibuf = imb_load_openexr((uchar *)mem, size, flags);
+ if (ibuf) return(ibuf);
+#endif
+
#ifdef WITH_QUICKTIME
#if defined(_WIN32) || defined (__APPLE__)
if(G.have_quicktime) {
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index 150ab8aac26..925eaca3e87 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -50,6 +50,9 @@
#include "IMB_amiga.h"
#include "IMB_png.h"
#include "IMB_bmp.h"
+#ifdef WITH_OPENEXR
+#include "IMB_openexr.h"
+#endif
#include "IMB_iff.h"
#include "IMB_bitplanes.h"
@@ -70,6 +73,11 @@ short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags)
if (IS_png(ibuf)) {
return imb_savepng(ibuf,naam,flags);
}
+#ifdef WITH_OPENEXR
+ if (IS_openexr(ibuf)) {
+ return imb_save_openexr(ibuf,naam,flags);
+ }
+#endif
if (IS_bmp(ibuf)) {
return imb_savebmp(ibuf,naam,flags);
}
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 04aa96c9d1f..aae1465df0d 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -340,7 +340,7 @@ typedef struct Scene {
#define R_AVICODEC 18
#define R_QUICKTIME 19
#define R_BMP 20
-
+#define R_OPENEXR 21
/* **************** RENDER ********************* */
/* mode flag is same as for renderdata */
diff --git a/source/blender/src/Makefile b/source/blender/src/Makefile
index 210ed7d7320..7755c8cf707 100644
--- a/source/blender/src/Makefile
+++ b/source/blender/src/Makefile
@@ -111,6 +111,10 @@ ifeq ($(WITH_QUICKTIME),true)
CPPFLAGS += -DWITH_QUICKTIME
endif
+ifeq ($(WITH_OPENEXR),true)
+ CPPFLAGS += -DWITH_OPENEXR
+endif
+
ifeq ($(INTERNATIONAL), true)
CPPFLAGS += -DINTERNATIONAL
endif
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index 522fa23b7a7..8702f320c6c 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -35,10 +35,6 @@
#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifdef WIN32
#include "BLI_winstuff.h"
#endif
@@ -958,6 +954,9 @@ static char *imagetype_pup(void)
#endif
strcat(formatstring, "|%s %%x%d"); // add space for PNG
+#ifdef WITH_OPENEXR
+ strcat(formatstring, "|%s %%x%d"); // add space for OpenEXR
+#endif
strcat(formatstring, "|%s %%x%d"); // add space for BMP
#ifdef _WIN32
@@ -982,6 +981,9 @@ static char *imagetype_pup(void)
"Targa", R_TARGA,
"Targa Raw", R_RAWTGA,
"PNG", R_PNG,
+#ifdef WITH_OPENEXR
+ "OpenEXR", R_OPENEXR,
+#endif
"BMP", R_BMP,
"Jpeg", R_JPEG90,
"HamX", R_HAMX,
@@ -1000,6 +1002,9 @@ static char *imagetype_pup(void)
"Targa", R_TARGA,
"Targa Raw", R_RAWTGA,
"PNG", R_PNG,
+#ifdef WITH_OPENEXR
+ "OpenEXR", R_OPENEXR,
+#endif
"BMP", R_BMP,
"Jpeg", R_JPEG90,
"HamX", R_HAMX,
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index 9118a35e53b..752f4359365 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -38,10 +38,6 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifdef WIN32
#include "BLI_winstuff.h"
#endif
@@ -177,6 +173,7 @@ void schrijfplaatje(char *name)
if(ibuf) {
ibuf->rect= (unsigned int *) R.rectot;
+ ibuf->rect_float = R.rectftot;
if(R.r.planes == 8) IMB_cspace(ibuf, rgb_to_bw);
@@ -195,6 +192,17 @@ void schrijfplaatje(char *name)
else if(R.r.imtype==R_PNG) {
ibuf->ftype= PNG;
}
+#ifdef WITH_OPENEXR
+ else if(R.r.imtype==R_OPENEXR) {
+ ibuf->ftype= OPENEXR;
+ if (ibuf->zbuf == 0) {
+ if (R.rectz) {
+ ibuf->zbuf = (int *)R.rectz;
+ }
+ else printf("Write OPENEXR: no zbuf !\n");
+ }
+ }
+#endif
else if(R.r.imtype==R_BMP) {
ibuf->ftype= BMP;
}
@@ -474,6 +482,8 @@ int save_image_filesel_str(char *str)
switch(G.scene->r.imtype) {
case R_PNG:
strcpy(str, "Save PNG"); return 1;
+ case R_OPENEXR:
+ strcpy(str, "Save OPENEXR"); return 1;
case R_BMP:
strcpy(str, "Save BMP"); return 1;
case R_TARGA:
diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c
index 005ae9fda15..d6c211d122d 100755
--- a/source/blender/src/transform_generics.c
+++ b/source/blender/src/transform_generics.c
@@ -684,4 +684,5 @@ void calculatePropRatio(TransInfo *t)
TransInfo * BIF_GetTransInfo() {
return &Trans;
-} \ No newline at end of file
+}
+
diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c
index 75b215f70bd..d16247a70b2 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -44,10 +44,6 @@
#include "render.h" // RE_make_existing_file, R. stuff
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
int BIF_write_ibuf(ImBuf *ibuf, char *name)
{
int ok;
@@ -61,6 +57,11 @@ int BIF_write_ibuf(ImBuf *ibuf, char *name)
else if ((G.scene->r.imtype==R_BMP)) {
ibuf->ftype= BMP;
}
+#ifdef WITH_OPENEXR
+ else if ((G.scene->r.imtype==R_OPENEXR)) {
+ ibuf->ftype= OPENEXR;
+ }
+#endif
else if ((G.scene->r.imtype==R_TARGA) || (G.scene->r.imtype==R_PNG)) {
// fall back to Targa if PNG writing is not supported
ibuf->ftype= TGA;
diff --git a/source/gameengine/GamePlayer/common/SConscript b/source/gameengine/GamePlayer/common/SConscript
index b074c3659ee..ad557eae2f4 100644
--- a/source/gameengine/GamePlayer/common/SConscript
+++ b/source/gameengine/GamePlayer/common/SConscript
@@ -65,9 +65,10 @@ gp_common_env.Append( CPPPATH = ['.',
gp_common_env.Append (CPPPATH = user_options_dict['PYTHON_INCLUDE'])
gp_common_env.Append (CPPPATH = user_options_dict['SOLID_INCLUDE'])
gp_common_env.Append (CPPPATH = user_options_dict['PNG_INCLUDE'])
+gp_common_env.Append (CPPPATH = user_options_dict['OPENEXR_INCLUDE'])
gp_common_env.Append (CPPPATH = user_options_dict['Z_INCLUDE'])
if sys.platform=='win32':
gp_common_env.Append (CXXFLAGS = ['/GR'])
-gp_common_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/GPC_common', source=source_files) \ No newline at end of file
+gp_common_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/GPC_common', source=source_files)
diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk
index 3b89a425b07..1ed4fe2ebae 100644
--- a/source/nan_definitions.mk
+++ b/source/nan_definitions.mk
@@ -102,6 +102,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
@@ -153,6 +156,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= /sw
export NAN_PNG ?= /sw
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
@@ -197,6 +203,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= /usr/local
export NAN_PNG ?= /usr/local
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
@@ -240,6 +249,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
@@ -281,6 +293,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= /usr
export NAN_PNG ?= /usr
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr
@@ -323,6 +338,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
@@ -364,6 +382,9 @@ endif
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= /usr/local
export NAN_PNG ?= /usr/local
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?=
export NAN_MESA ?= /usr/src/Mesa-3.1
@@ -403,6 +424,9 @@ endif
ifeq ($(FREE_WINDOWS), true)
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
export NAN_FREETYPE ?= $(LCGDIR)/gcc/freetype
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/gcc/ode
ifeq ($(NAN_SDL),)
export NAN_SDL ?= $(LCGDIR)/gcc/sdl
@@ -411,6 +435,9 @@ endif
else
export NAN_PYTHON_BINARY ?= python
export NAN_FREETYPE ?= $(LCGDIR)/freetype
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
ifeq ($(NAN_SDL),)
export NAN_SDL ?= $(LCGDIR)/sdl
@@ -458,6 +485,9 @@ endif
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
export NAN_SDL ?= $(LCGDIR)/sdl
+# Commented out by default
+# export WITH_OPENEXR ?= true
+ export NAN_OPENEXR ?= $(LCGDIR)/OpenEXR
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
diff --git a/tools/scons/bs/bs_libs.py b/tools/scons/bs/bs_libs.py
index 3783b926dfb..f2a8ec9fa2e 100644
--- a/tools/scons/bs/bs_libs.py
+++ b/tools/scons/bs/bs_libs.py
@@ -123,6 +123,9 @@ def system_libs(env):
env.Append (LIBPATH=bs_globals.user_options_dict['SDL_LIBPATH'])
env.Append (LIBS=bs_globals.user_options_dict['PNG_LIBRARY'])
env.Append (LIBPATH=bs_globals.user_options_dict['PNG_LIBPATH'])
+ if bs_globals.user_options_dict['USE_OPENEXR'] == 1:
+ env.Append (LIBS=bs_globals.user_options_dict['OPENEXR_LIBRARY'])
+ env.Append (LIBPATH=bs_globals.user_options_dict['OPENEXR_LIBPATH'])
env.Append (LIBS=bs_globals.user_options_dict['JPEG_LIBRARY'])
env.Append (LIBPATH=bs_globals.user_options_dict['JPEG_LIBPATH'])
env.Append (LIBS=bs_globals.user_options_dict['GETTEXT_LIBRARY'])