diff options
author | Ton Roosendaal <ton@blender.org> | 2006-01-09 03:40:35 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-01-09 03:40:35 +0300 |
commit | 014aa7261e29810b35b3d65c759f9d255bf8a277 (patch) | |
tree | 360325f8db9431bdd187c0f0e7f7c40dcaa3a073 /source/blender | |
parent | 104ab9b103ab30ca87ccb9e739a58863fc29d3bf (diff) |
Orange branch: OpenEXR finally in Blender!
Credits go to Gernot Ziegler, who originally coded EXR support, and to
Austin Benesh for bringing it further. Kent Mein provided a lot of code
for integrating float buffers in Blender imbuf and ImBuf API cleanup,
and provided Make and Scons and static linking.
At this moment; the EXR libraries are a *dependency*, so you cannot get
the Orange branch compiled without having OpenEXR installed. Get the
(precompiled or sources) stuff from www.openexr.com. Current default is
that the headers and lib resides in /user/local/
Several changes/additions/fixes were added:
- EXR code only supported 'half' format (16 bits per channel). I've added
float writing, but for reading it I need tomorrow. :)
- Quite some clumsy copying of data happened in EXR code.
- cleaned up the api calls already a bit, preparing for more advanced
support
- Zbuffers were saved 16 bits, now 32 bits
- automatic adding of .exr extensions went wrong
Imbuf:
- added proper imbuf->flags and imbuf->mall support for float buffers, it
was created for *each* imbuf. :)
- found bugs for float buffers in scaling and flipping. Code there will
need more checks still
- imbuf also needs to be verified to behave properly when no 32 bits
rect exists (for saving for example)
TODO:
- support internal float images for textures, backbuf, AO probes, and
display in Image window
Hope this commit won't screwup syncing with bf-blender... :/
Diffstat (limited to 'source/blender')
53 files changed, 1751 insertions, 658 deletions
diff --git a/source/blender/SConscript b/source/blender/SConscript index c40b8422a33..1c21399b838 100644 --- a/source/blender/SConscript +++ b/source/blender/SConscript @@ -17,6 +17,9 @@ SConscript(['avi/SConscript', 'src/SConscript', 'yafray/SConscript']) +if user_options_dict['USE_OPENEXR'] == 1: + SConscript (['imbuf/intern/openexr/SConscript']) + if user_options_dict['USE_INTERNATIONAL'] == 1: SConscript (['ftfont/SConscript']) diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 6ecd3626993..bef63bfa261 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -124,7 +124,7 @@ typedef struct Global { struct VFont *selfont; struct ListBase ttfdata; - /* libtiff flag */ + /* libtiff flag used to determine if shared library loaded for libtiff*/ int have_libtiff; /* this variable is written to / read from FileGlobal->fileflags */ diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile index 9207023f9a5..1bdeda1841f 100644 --- a/source/blender/blenkernel/intern/Makefile +++ b/source/blender/blenkernel/intern/Makefile @@ -83,3 +83,7 @@ ifeq ($(WITH_FREETYPE2), true) 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 fa4136d63fa..26711495252 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -341,8 +341,15 @@ void addImageExtension(char *string) extension= ".bmp"; } else if(G.have_libtiff && (G.scene->r.imtype==R_TIFF)) { - extension= ".tif"; + if(!BLI_testextensie(string, ".tif")) + extension= ".tif"; } +#ifdef WITH_OPENEXR + else if(G.scene->r.imtype==R_OPENEXR) { + if(!BLI_testextensie(string, ".exr")) + extension= ".exr"; + } +#endif strcat(string, extension); } @@ -449,13 +456,13 @@ static void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */ tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0); ibuf->x *= 2; - /* These rectop calls are broken!!! I added a trailing 0 arg... */ - IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0); + + IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); + IMB_rectcpy(tbuf2, ibuf, 0, 0, tbuf2->x, 0, ibuf->x, ibuf->y); ibuf->x /= 2; - IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, tbuf1, 0, 0, 0, 0, tbuf1->x, tbuf1->y); + IMB_rectcpy(ibuf, tbuf2, 0, tbuf2->y, 0, 0, tbuf2->x, tbuf2->y); IMB_freeImBuf(tbuf1); IMB_freeImBuf(tbuf2); @@ -477,13 +484,13 @@ static void de_interlace_st(struct ImBuf *ibuf) /* standard fields */ tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0); ibuf->x *= 2; - /* These are brolenm as well... */ - IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0); + + IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); + IMB_rectcpy(tbuf2, ibuf, 0, 0, tbuf2->x, 0, ibuf->x, ibuf->y); ibuf->x /= 2; - IMB_rectop(ibuf, tbuf2, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(ibuf, tbuf1, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, tbuf2, 0, 0, 0, 0, tbuf2->x, tbuf2->y); + IMB_rectcpy(ibuf, tbuf1, 0, tbuf2->y, 0, 0, tbuf1->x, tbuf1->y); IMB_freeImBuf(tbuf1); IMB_freeImBuf(tbuf2); @@ -559,7 +566,7 @@ void ima_ibuf_is_nul(Tex *tex, Image *ima) } IMB_applycmap(ima->ibuf); - IMB_convert_rgba_to_abgr(ima->ibuf->x*ima->ibuf->y, ima->ibuf->rect); + IMB_convert_rgba_to_abgr(ima->ibuf); } diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c index 77c35cc46ab..35f5c7b0d17 100644 --- a/source/blender/blenkernel/intern/writeavi.c +++ b/source/blender/blenkernel/intern/writeavi.c @@ -35,10 +35,6 @@ #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" @@ -122,7 +118,8 @@ void start_avi(void) void append_avi(int frame) { - unsigned int *rt1, *rt2, *temp; + unsigned int *rt1, *rt2; + struct ImBuf *temp; int y; if (avi == NULL) { @@ -130,20 +127,20 @@ void append_avi(int frame) return; } - /* note that libavi free's the buffer... stupid interface - zr */ - temp = MEM_mallocN(R.rectx*R.recty*4, "append_avi buf"); + /* note that libavi free's the buffer... stupid interface - zr */ + temp = IMB_allocImBuf(R.rectx,R.recty*4,32, IB_rect, 0); - rt1= temp; + rt1= temp->rect; rt2= R.rectot + (R.recty-1)*R.rectx; for (y=0; y < R.recty; y++, rt1+= R.rectx, rt2-= R.rectx) { memcpy (rt1, rt2, R.rectx*4); } - IMB_convert_rgba_to_abgr(R.rectx*R.recty, temp); + IMB_convert_rgba_to_abgr(temp); - AVI_write_frame (avi, (frame-sframe), AVI_FORMAT_RGB32, - temp, R.rectx*R.recty*4); + AVI_write_frame (avi, (frame-sframe), AVI_FORMAT_RGB32, temp->rect, R.rectx*R.recty*4); printf ("added frame %3d (frame %3d in avi): ", frame, frame-sframe); + IMB_freeImBuf(temp); } void end_avi(void) diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c index 45ff6e83f1b..3e679cfc232 100644 --- a/source/blender/blenlib/intern/util.c +++ b/source/blender/blenlib/intern/util.c @@ -139,6 +139,7 @@ int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen) else if (BLI_strncasecmp(string + len - 4, ".rgb", 4) == 0) len -= 4; else if (BLI_strncasecmp(string + len - 4, ".psx", 4) == 0) len -= 4; else if (BLI_strncasecmp(string + len - 4, ".ble", 4) == 0) len -= 4; + else if (BLI_strncasecmp(string + len - 4, ".exr", 4) == 0) len -= 4; } } diff --git a/source/blender/blenpluginapi/iff.h b/source/blender/blenpluginapi/iff.h index 4fa3e0214fa..456291e664b 100644 --- a/source/blender/blenpluginapi/iff.h +++ b/source/blender/blenpluginapi/iff.h @@ -44,10 +44,16 @@ #define IB_zbuf (1 << 13) #define IB_rgba (1 << 14) -#define AMI (1 << 31) -#define Anim (1 << 29) -#define TGA (1 << 28) -#define JPG (1 << 27) +#define AMI (1 << 31) +#define PNG (1 << 30) +#define Anim (1 << 29) +#define TGA (1 << 28) +#define JPG (1 << 27) +#define BMP (1 << 26) +#ifdef WITH_QUICKTIME +#define QUICKTIME (1 << 25) +#endif +#define RADHDR (1<<24) #define RAWTGA (TGA | 1) @@ -90,6 +96,7 @@ #define IS_amiga(x) (x->ftype & AMI) #define IS_ham(x) ((x->ftype & AM_ham) == AM_ham) #define IS_hbrite(x) ((x->ftype & AM_hbrite) == AM_hbrite) + #define IS_lace(x) ((x->ftype & AM_lace) == AM_lace) #define IS_hires(x) ((x->ftype & AM_hires) == AM_hires) #define IS_hblace(x) ((x->ftype & AM_hblace) == AM_hblace) @@ -98,9 +105,14 @@ #define IS_anim(x) (x->ftype & Anim) #define IS_hamx(x) (x->ftype == AN_hamx) - #define IS_tga(x) (x->ftype & TGA) +#define IS_png(x) (x->ftype & PNG) +#define IS_bmp(x) (x->ftype & BMP) +#define IS_radhdr(x) (x->ftype & RADHDR) #define IS_tim(x) (x->ftype & TIM) +#define IS_tiff(x) (x->ftype & TIFF) +#define IS_openexr(x) (x->ftype & OPENEXR) + #define IMAGIC 0732 #define IS_iris(x) (x->ftype == IMAGIC) @@ -136,6 +148,7 @@ typedef struct ImBuf{ unsigned char *encodedbuffer; unsigned int encodedsize; unsigned int encodedbuffersize; + float *rect_float; } ImBuf; extern struct ImBuf *allocImBuf(short,short,uchar,uint,uchar); diff --git a/source/blender/blenpluginapi/intern/pluginapi.c b/source/blender/blenpluginapi/intern/pluginapi.c index aefd8d3f458..bb64e9caa8f 100644 --- a/source/blender/blenpluginapi/intern/pluginapi.c +++ b/source/blender/blenpluginapi/intern/pluginapi.c @@ -41,10 +41,6 @@ * - util.h : Useful defines, memory management. */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifdef WIN32 #include "blenpluginapi\util.h" #else @@ -250,20 +246,6 @@ void de_interlace(struct ImBuf *ib) IMB_de_interlace(ib); } -void rectop(struct ImBuf *dbuf, - struct ImBuf *sbuf, - int destx, - int desty, - int srcx, - int srcy, - int width, - int height, - void (*operation)(unsigned int *, unsigned int*, int, int), - int value) -{ - IMB_rectop(dbuf, sbuf, destx, desty, srcx, srcy, width, height, operation, value); -} - /* -------------------------------------------------------------------------- */ /* stuff from plugin.h */ /* -------------------------------------------------------------------------- */ @@ -354,6 +336,5 @@ int pluginapi_force_ref(void) (int) turbulence1 + (int) de_interlace + (int) interlace + - (int) gamwarp + - (int) rectop; + (int) gamwarp; } diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index b631ac79a06..aa69e680c35 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -196,31 +196,8 @@ void IMB_freecmapImBuf(struct ImBuf * ibuf); * * @attention Defined in rectop.c */ -void IMB_rectop(struct ImBuf *dbuf, - struct ImBuf *sbuf, - int destx, - int desty, - int srcx, - int srcy, - int width, - int height, - void (*operation)(unsigned int *, unsigned int*, int, int), - int value); - -/** - * - * @attention Defined in rectop.c - */ -void IMB_rectoptot(struct ImBuf *dbuf, - struct ImBuf *sbuf, - void (*operation)(unsigned int *, unsigned int*, int, int), - int value); - -/** - * - * @attention Defined in rectop.c - */ -void IMB_rectcpy(unsigned int *drect, unsigned int *srect, int x, int dummy); +void IMB_rectcpy(struct ImBuf *drect, struct ImBuf *srect, int destx, + int desty, int srcx, int srcy, int width, int height); /** * Return the length (in frames) of the given @a anim. @@ -360,7 +337,7 @@ void IMB_gamwarp(struct ImBuf *ibuf, double gamma); * * @attention Defined in imageprocess.c */ -void IMB_convert_rgba_to_abgr(int size, unsigned int *rect); +void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf); /** * Change the ordering of the colour bytes pointed to by rect from @@ -495,7 +472,7 @@ void IMB_freezbufImBuf(struct ImBuf * ibuf); * * @attention Defined in rectop.c */ -void IMB_rectfill(unsigned int *drect, unsigned int *srect, int x, int value); +void IMB_rectfill(struct ImBuf *drect, float col[4]); #ifdef WITH_QUICKTIME @@ -513,12 +490,6 @@ void quicktime_exit(void); #endif //WITH_QUICKTIME -/* radhdr: Temporary routine to save directly from render floatbuffer. - Defined in radiance_hdr.c - Called by schrijfplaatje() in toets.c */ -short imb_savehdr_fromfloat(float *fbuf, char *name, int width, int height); - - /* intern/dynlibtiff.c */ void libtiff_exit(void); diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index 56a28850e71..4f648031fc6 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -93,6 +93,7 @@ typedef struct ImBuf{ unsigned char *encodedbuffer; /**< Compressed image only used with png currently */ unsigned int encodedsize; /**< Size of data written to encodedbuffer */ unsigned int encodedbuffersize; /**< Size of encodedbuffer */ + float *rect_float; /**< floating point Rect equivilant */ } ImBuf; /* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */ @@ -131,6 +132,8 @@ typedef enum { #define IB_zbuf (1 << 13) #define IB_mem (1 << 14) +#define IB_rectfloat (1 << 15) + /**@}*/ /** \name imbuf_formats Image file formats @@ -141,17 +144,20 @@ typedef enum { * * The bit flag is stored in the ImBuf.ftype variable. */ -#define AMI (1 << 31) -#define PNG (1 << 30) +#define AMI (1 << 31) +#define PNG (1 << 30) #define Anim (1 << 29) -#define TGA (1 << 28) -#define JPG (1 << 27) -#define BMP (1 << 26) +#define TGA (1 << 28) +#define JPG (1 << 27) +#define BMP (1 << 26) + #ifdef WITH_QUICKTIME -#define QUICKTIME (1 << 25) +#define QUICKTIME (1 << 25) #endif -#define RADHDR (1<<24) -#define TIF (1<<23) + +#define RADHDR (1 << 24) +#define TIF (1 << 23) +#define OPENEXR (1 << 22) #define RAWTGA (TGA | 1) @@ -188,6 +194,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 IS_tiff(x) (x->ftype & TIF) #define IS_radhdr(x) (x->ftype & RADHDR) diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript index c4146b6450a..c73c0593a86 100644 --- a/source/blender/imbuf/SConscript +++ b/source/blender/imbuf/SConscript @@ -5,6 +5,9 @@ Import ('library_env') imbuf_env = library_env.Copy () +#if user_options_dict['USE_OPENEXR'] == 1: +# SConscript (['intern/openexr/SConscript']) + source_files = ['intern/allocimbuf.c', 'intern/amiga.c', 'intern/anim.c', diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h index c01c9d60dd7..7ff44ef29f9 100644 --- a/source/blender/imbuf/intern/IMB_allocimbuf.h +++ b/source/blender/imbuf/intern/IMB_allocimbuf.h @@ -43,12 +43,14 @@ struct ImBuf; short imb_addrectImBuf(struct ImBuf * ibuf); +short imb_addrectfloatImBuf(struct ImBuf * ibuf); short imb_addplanesImBuf(struct ImBuf *ibuf); short imb_addencodedbufferImBuf(struct ImBuf *ibuf); short imb_enlargeencodedbufferImBuf(struct ImBuf *ibuf); void imb_freerectImBuf(struct ImBuf *ibuf); +void imb_freerectfloatImBuf(struct ImBuf *ibuf); void imb_freeplanesImBuf(struct ImBuf *ibuf); short imb_addcmapImBuf(struct ImBuf *ibuf); diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile index 859f7c4cd34..839bb4df4c3 100644 --- a/source/blender/imbuf/intern/Makefile +++ b/source/blender/imbuf/intern/Makefile @@ -33,13 +33,25 @@ LIBNAME = imbuf DIR = $(OCGDIR)/blender/imbuf +SOURCEDIR = source/blender/imbuf/intern +include nan_subdirs.mk include nan_compile.mk +include nan_definitions.mk + +ifeq ($(WITH_OPENEXR), true) + DIRS = openexr +endif + ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows")) CFLAGS += -funsigned-char endif +ifeq ($(WITH_OPENEXR), true) + CFLAGS += -DWITH_OPENEXR +endif + CFLAGS += $(LEVEL_1_C_WARNINGS) CPPFLAGS += -I$(NAN_JPEG)/include diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c index 3178e15ffee..8344e9753a2 100644 --- a/source/blender/imbuf/intern/allocimbuf.c +++ b/source/blender/imbuf/intern/allocimbuf.c @@ -53,30 +53,48 @@ static unsigned int dfltcmap[16] = { void imb_freeplanesImBuf(struct ImBuf * ibuf) { - if (ibuf==0) return; + if (ibuf==NULL) return; if (ibuf->planes){ - if (ibuf->mall & IB_planes) free(ibuf->planes); + if (ibuf->mall & IB_planes) MEM_freeN(ibuf->planes); } ibuf->planes = 0; ibuf->mall &= ~IB_planes; } +void imb_freerectfloatImBuf(struct ImBuf * ibuf) +{ + if (ibuf==NULL) return; + + if (ibuf->rect_float) { + if (ibuf->mall & IB_rectfloat) { + MEM_freeN(ibuf->rect_float); + ibuf->rect_float=NULL; + } + } + + ibuf->rect_float= NULL; + ibuf->mall &= ~IB_rectfloat; +} void imb_freerectImBuf(struct ImBuf * ibuf) { - if (ibuf==0) return; - if (ibuf->rect){ - if (ibuf->mall & IB_rect) free(ibuf->rect); + if (ibuf==NULL) return; + + if (ibuf->rect) { + if (ibuf->mall & IB_rect) { + MEM_freeN(ibuf->rect); + } } - ibuf->rect=0; + + ibuf->rect= NULL; ibuf->mall &= ~IB_rect; } static void freeencodedbufferImBuf(struct ImBuf * ibuf) { - if (ibuf==0) return; + if (ibuf==NULL) return; if (ibuf->encodedbuffer){ - if (ibuf->mall & IB_mem) free(ibuf->encodedbuffer); + if (ibuf->mall & IB_mem) MEM_freeN(ibuf->encodedbuffer); } ibuf->encodedbuffer = 0; ibuf->encodedbuffersize = 0; @@ -86,34 +104,34 @@ static void freeencodedbufferImBuf(struct ImBuf * ibuf) void IMB_freezbufImBuf(struct ImBuf * ibuf) { - if (ibuf==0) return; + if (ibuf==NULL) return; if (ibuf->zbuf){ - if (ibuf->mall & IB_zbuf) free(ibuf->zbuf); + if (ibuf->mall & IB_zbuf) MEM_freeN(ibuf->zbuf); } - ibuf->zbuf=0; + ibuf->zbuf= NULL; ibuf->mall &= ~IB_zbuf; } void IMB_freecmapImBuf(struct ImBuf * ibuf) { - if (ibuf == 0) return; + if (ibuf==NULL) return; if (ibuf->cmap){ - if (ibuf->mall & IB_cmap) free(ibuf->cmap); + if (ibuf->mall & IB_cmap) MEM_freeN(ibuf->cmap); } ibuf->cmap = 0; ibuf->mall &= ~IB_cmap; } - void IMB_freeImBuf(struct ImBuf * ibuf) { if (ibuf){ imb_freeplanesImBuf(ibuf); imb_freerectImBuf(ibuf); + imb_freerectfloatImBuf(ibuf); IMB_freezbufImBuf(ibuf); IMB_freecmapImBuf(ibuf); freeencodedbufferImBuf(ibuf); - free(ibuf); + MEM_freeN(ibuf); } } @@ -121,7 +139,8 @@ short addzbufImBuf(struct ImBuf * ibuf) { int size; - if (ibuf==0) return(FALSE); + if (ibuf==NULL) return(FALSE); + IMB_freezbufImBuf(ibuf); size = ibuf->x * ibuf->y * sizeof(unsigned int); @@ -136,7 +155,7 @@ short addzbufImBuf(struct ImBuf * ibuf) short imb_addencodedbufferImBuf(struct ImBuf * ibuf) { - if (ibuf==0) return(FALSE); + if (ibuf==NULL) return(FALSE); freeencodedbufferImBuf(ibuf); @@ -159,7 +178,7 @@ short imb_enlargeencodedbufferImBuf(struct ImBuf * ibuf) unsigned int newsize, encodedsize; void *newbuffer; - if (ibuf==0) return(FALSE); + if (ibuf==NULL) return(FALSE); if (ibuf->encodedbuffersize < ibuf->encodedsize) { printf("imb_enlargeencodedbufferImBuf: error in parameters\n"); @@ -190,15 +209,36 @@ short imb_enlargeencodedbufferImBuf(struct ImBuf * ibuf) return (TRUE); } +short imb_addrectfloatImBuf(struct ImBuf * ibuf) +{ + int size; + + if (ibuf==NULL) return(FALSE); + + imb_freerectfloatImBuf(ibuf); + + size = ibuf->x * ibuf->y; + size = size * 4 * sizeof(float); + + if ( (ibuf->rect_float = MEM_mallocN(size, "imb_addrectImBuf")) ){ + ibuf->mall |= IB_rectfloat; + return (TRUE); + } + + return (FALSE); +} +/* question; why also add zbuf? */ short imb_addrectImBuf(struct ImBuf * ibuf) { int size; - if (ibuf==0) return(FALSE); + if (ibuf==NULL) return(FALSE); imb_freerectImBuf(ibuf); - size = ibuf->x * ibuf->y * sizeof(unsigned int); + size = ibuf->x * ibuf->y; + size = size * sizeof(unsigned int); + if ( (ibuf->rect = MEM_mallocN(size, "imb_addrectImBuf")) ){ ibuf->mall |= IB_rect; if (ibuf->depth > 32) return (addzbufImBuf(ibuf)); @@ -213,7 +253,7 @@ short imb_addcmapImBuf(struct ImBuf *ibuf) { int min; - if (ibuf==0) return(FALSE); + if (ibuf==NULL) return(FALSE); IMB_freecmapImBuf(ibuf); imb_checkncols(ibuf); @@ -238,7 +278,7 @@ short imb_addplanesImBuf(struct ImBuf *ibuf) unsigned int **planes; unsigned int *point2; - if (ibuf==0) return(FALSE); + if (ibuf==NULL) return(FALSE); imb_freeplanesImBuf(ibuf); skipx = ((ibuf->x+31) >> 5); @@ -264,7 +304,7 @@ short imb_addplanesImBuf(struct ImBuf *ibuf) } -struct ImBuf *IMB_allocImBuf(short x,short y,uchar d,unsigned int flags,uchar bitmap) +struct ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap) { struct ImBuf *ibuf; @@ -272,29 +312,36 @@ struct ImBuf *IMB_allocImBuf(short x,short y,uchar d,unsigned int flags,uchar bi if (bitmap) flags |= IB_planes; if (ibuf){ - ibuf->x=x; - ibuf->y=y; - ibuf->depth=d; - ibuf->ftype=TGA; + ibuf->x= x; + ibuf->y= y; + ibuf->depth= d; + ibuf->ftype= TGA; if (flags & IB_rect){ if (imb_addrectImBuf(ibuf)==FALSE){ IMB_freeImBuf(ibuf); - return (0); + return NULL; + } + } + + if (flags & IB_rectfloat){ + if (imb_addrectfloatImBuf(ibuf)==FALSE){ + IMB_freeImBuf(ibuf); + return NULL; } } if (flags & IB_zbuf){ if (addzbufImBuf(ibuf)==FALSE){ IMB_freeImBuf(ibuf); - return (0); + return NULL; } } if (flags & IB_planes){ if (imb_addplanesImBuf(ibuf)==FALSE){ IMB_freeImBuf(ibuf); - return (0); + return NULL; } } } @@ -307,9 +354,10 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1) int flags = 0; int x, y; - if (ibuf1 == 0) return (0); + if (ibuf1 == NULL) return NULL; if (ibuf1->rect) flags |= IB_rect; + if (ibuf1->rect_float) flags |= IB_rectfloat; if (ibuf1->planes) flags |= IB_planes; x = ibuf1->x; @@ -317,31 +365,38 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1) if (ibuf1->flags & IB_fields) y *= 2; ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags, 0); - if (ibuf2 == 0) return (0); + if (ibuf2 == NULL) return NULL; - if (flags & IB_rect) memcpy(ibuf2->rect,ibuf1->rect,x * y * sizeof(int)); - if (flags & IB_planes) memcpy(*(ibuf2->planes),*(ibuf1->planes),ibuf1->depth * ibuf1->skipx * y * sizeof(int)); + if (flags & IB_rect) + memcpy(ibuf2->rect, ibuf1->rect, x * y * sizeof(int)); + + if (flags & IB_rectfloat) + memcpy(ibuf2->rect_float, ibuf1->rect_float, x * y * sizeof(float)); + + if (flags & IB_planes) + memcpy(*(ibuf2->planes),*(ibuf1->planes),ibuf1->depth * ibuf1->skipx * y * sizeof(int)); if (ibuf1->encodedbuffer) { ibuf2->encodedbuffersize = ibuf1->encodedbuffersize; if (imb_addencodedbufferImBuf(ibuf2) == FALSE) { IMB_freeImBuf(ibuf2); - return(0); + return NULL; } memcpy(ibuf2->encodedbuffer, ibuf1->encodedbuffer, ibuf1->encodedsize); } - + /* silly trick to copy the entire contents of ibuf1 struct over to ibuf */ tbuf = *ibuf1; - // pointers goedzetten + // fix pointers tbuf.rect = ibuf2->rect; + tbuf.rect_float = ibuf2->rect_float; tbuf.planes = ibuf2->planes; tbuf.cmap = ibuf2->cmap; tbuf.encodedbuffer = ibuf2->encodedbuffer; - // malloc flag goed zetten + // set malloc flag tbuf.mall = ibuf2->mall; *ibuf2 = tbuf; diff --git a/source/blender/imbuf/intern/amiga.c b/source/blender/imbuf/intern/amiga.c index 20655b3a211..d0b794c23ec 100644 --- a/source/blender/imbuf/intern/amiga.c +++ b/source/blender/imbuf/intern/amiga.c @@ -531,7 +531,7 @@ struct ImBuf *imb_loadamiga(int *iffmem,int flags) if (ibuf) { if (ibuf->rect) - if (G.order == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + if (G.order == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); } return (ibuf); diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c index 284339ece48..51fadc5c06a 100644 --- a/source/blender/imbuf/intern/anim.c +++ b/source/blender/imbuf/intern/anim.c @@ -572,7 +572,7 @@ struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) { ibuf = movie_fetchibuf(anim, position); if (ibuf) { anim->curposition = position; - IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); } break; case ANIM_AVI: diff --git a/source/blender/imbuf/intern/anim5.c b/source/blender/imbuf/intern/anim5.c index 9f87ba09f5f..89ddf177efe 100644 --- a/source/blender/imbuf/intern/anim5.c +++ b/source/blender/imbuf/intern/anim5.c @@ -161,7 +161,7 @@ static void planes_to_rect(struct ImBuf * ibuf, int flags) { if (ibuf->cmap){ if ((flags & IB_cmap) == 0) { IMB_applycmap(ibuf); - IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); } } else if (ibuf->depth == 18){ int i,col; diff --git a/source/blender/imbuf/intern/bitplanes.c b/source/blender/imbuf/intern/bitplanes.c index 6bc2155c949..b80e829da08 100644 --- a/source/blender/imbuf/intern/bitplanes.c +++ b/source/blender/imbuf/intern/bitplanes.c @@ -178,6 +178,8 @@ void imb_bptolong(struct ImBuf *ibuf) { int nobp,i,x; unsigned int *rect,offset; + float black[4] = {0.0,0.0,0.0,1.0}; + float clear[4] = {0.0,0.0,0.0,0.0}; /* first clear all ints */ @@ -187,8 +189,8 @@ void imb_bptolong(struct ImBuf *ibuf) nobp=ibuf->depth; if (nobp != 32){ - if (nobp == 24) IMB_rectoptot(ibuf, 0, IMB_rectfill, 0xff000000); /* set alpha */ - else IMB_rectoptot(ibuf, 0, IMB_rectfill, 0); + if (nobp == 24) IMB_rectfill(ibuf, black); /* set alpha */ + else IMB_rectfill(ibuf, clear); } rect= ibuf->rect; diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c index 8c579156691..a56f16f71db 100644 --- a/source/blender/imbuf/intern/divers.c +++ b/source/blender/imbuf/intern/divers.c @@ -95,12 +95,12 @@ void IMB_de_interlace(struct ImBuf *ibuf) tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0); ibuf->x *= 2; - IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); + IMB_rectcpy(tbuf2, ibuf, 0, 0, tbuf2->x, 0, ibuf->x, ibuf->y); ibuf->x /= 2; - IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, tbuf1, 0, 0, 0, 0, tbuf1->x, tbuf1->y); + IMB_rectcpy(ibuf, tbuf2, 0, tbuf2->y, 0, 0, tbuf2->x, tbuf2->y); IMB_freeImBuf(tbuf1); IMB_freeImBuf(tbuf2); @@ -122,16 +122,12 @@ void IMB_interlace(struct ImBuf *ibuf) tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0); tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0); - IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, - 0); - IMB_rectop(tbuf2, ibuf, 0, 0, 0, tbuf2->y, 32767, 32767, - IMB_rectcpy,0); + IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); + IMB_rectcpy(tbuf2, ibuf, 0, 0, 0, tbuf2->y, ibuf->x, ibuf->y); ibuf->x *= 2; - IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, - 0); - IMB_rectop(ibuf, tbuf2, tbuf2->x, 0, 0, 0, 32767, 32767, - IMB_rectcpy,0); + IMB_rectcpy(ibuf, tbuf1, 0, 0, 0, 0, tbuf1->x, tbuf1->y); + IMB_rectcpy(ibuf, tbuf2, tbuf2->x, 0, 0, 0, tbuf2->x, tbuf2->y); ibuf->x /= 2; IMB_freeImBuf(tbuf1); @@ -143,11 +139,13 @@ void IMB_interlace(struct ImBuf *ibuf) void IMB_gamwarp(struct ImBuf *ibuf, double gamma) { uchar gam[256]; - int i; - uchar *rect; + int i, do_float=0; + uchar *rect = (uchar *) ibuf->rect; + float *rectf = ibuf->rect_float; if (ibuf == 0) return; if (ibuf->rect == 0) return; + if (ibuf->rect != NULL) do_float = 1; if (gamma == 1.0) return; gamma = 1.0 / gamma; @@ -159,5 +157,10 @@ void IMB_gamwarp(struct ImBuf *ibuf, double gamma) rect[0] = gam[rect[0]]; rect[1] = gam[rect[1]]; rect[2] = gam[rect[2]]; + if (do_float) { + rectf[0] = pow(rectf[0] / 255.0, gamma); + rectf[1] = pow(rectf[1] / 255.0, gamma); + rectf[2] = pow(rectf[2] / 255.0, gamma); + } } } diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index 8aea42c7008..e51f85ab2d6 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -65,6 +65,26 @@ static void filtrow(unsigned char *point, int x) } } +static void filtrowf(float *point, int x) +{ + float c1,c2,c3,error; + + if (x>1){ + c1 = c2 = *point; + error = 2; + for(x--;x>0;x--){ + c3 = point[4]; + c1 += (c2 * 2) + c3 + error; + *point = c1 / 4.0; + point += 4; + c1=c2; + c2=c3; + } + *point = (c1 + (c2 * 2) + c2 + error) / 4.0; + } +} + + static void filtcolum(unsigned char *point, int y, int skip) { @@ -89,13 +109,38 @@ static void filtcolum(unsigned char *point, int y, int skip) } } +static void filtcolumf(float *point, int y, int skip) +{ + float c1,c2,c3,error, *point2; + + if (y>1){ + c1 = c2 = *point; + point2 = point; + error = 2; + for(y--;y>0;y--){ + point2 += skip; + c3 = *point2; + c1 += (c2 * 2) + c3 +error; + *point = c1 / 4; + point=point2; + c1=c2; + c2=c3; + } + *point = (c1 + (c2 * 2) + c2 + error) / 4; + } +} void IMB_filtery(struct ImBuf *ibuf) { unsigned char *point; - int x, y, skip; + float *pointf; + int x, y, skip, do_float = 0; point = (unsigned char *)ibuf->rect; + pointf = ibuf->rect_float; + + if (ibuf->rect_float != NULL) do_float = 1; + x = ibuf->x; y = ibuf->y; skip = x<<2; @@ -109,6 +154,16 @@ void IMB_filtery(struct ImBuf *ibuf) point++; filtcolum(point,y,skip); point++; + if (do_float) { + if (ibuf->depth > 24) filtcolumf(pointf,y,skip); + pointf++; + filtcolumf(pointf,y,skip); + pointf++; + filtcolumf(pointf,y,skip); + pointf++; + filtcolumf(pointf,y,skip); + point++; + } } } @@ -116,9 +171,14 @@ void IMB_filtery(struct ImBuf *ibuf) void imb_filterx(struct ImBuf *ibuf) { unsigned char *point; - int x, y, skip; + float *pointf; + int x, y, skip, do_float =0; point = (unsigned char *)ibuf->rect; + pointf = ibuf->rect_float; + + if (ibuf->rect_float != NULL) do_float = 1; + x = ibuf->x; y = ibuf->y; skip = (x<<2) - 3; @@ -132,6 +192,16 @@ void imb_filterx(struct ImBuf *ibuf) point++; filtrow(point,x); point+=skip; + if (do_float) { + if (ibuf->depth > 24) filtrowf(pointf,x); + pointf++; + filtrowf(pointf,x); + pointf++; + filtrowf(pointf,x); + pointf++; + filtrowf(pointf,x); + pointf+=skip; + } } } diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c index dcdd0692fc4..f98244c5a0f 100644 --- a/source/blender/imbuf/intern/imageprocess.c +++ b/source/blender/imbuf/intern/imageprocess.c @@ -40,13 +40,19 @@ * $Id$ */ +#include "IMB_imbuf_types.h" #include "IMB_imbuf.h" /* Only this one is used liberally here, and in imbuf */ -void IMB_convert_rgba_to_abgr(int size, unsigned int *rect) +void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf) { - char *cp= (char *)rect, rt; + int size, do_float=0; + unsigned char rt, *cp = (unsigned char *)ibuf->rect; + float rtf, *cpf = ibuf->rect_float; + if (ibuf->rect_float) do_float = 1; + size = ibuf->x * ibuf->y; + while(size-- > 0) { rt= cp[0]; cp[0]= cp[3]; @@ -55,5 +61,15 @@ void IMB_convert_rgba_to_abgr(int size, unsigned int *rect) cp[1]= cp[2]; cp[2]= rt; cp+= 4; + if (do_float) { + rtf= cpf[0]; + cpf[0]= cpf[3]; + cpf[3]= rtf; + rtf= cpf[1]; + cpf[1]= cpf[2]; + cpf[2]= rtf; + cpf+= 4; + } } } + diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c index 20aa9d75fd2..5c0a3f94a0e 100644 --- a/source/blender/imbuf/intern/iris.c +++ b/source/blender/imbuf/intern/iris.c @@ -398,7 +398,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) if (ibuf) { if (ibuf->rect) - IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); } return(ibuf); @@ -639,13 +639,13 @@ short imb_saveiris(struct ImBuf * ibuf, char *name, int flags) zsize = (ibuf->depth + 7) >> 3; if (flags & IB_zbuf && ibuf->zbuf != 0) zsize = 8; - IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); test_endian_zbuf(ibuf); ret = output_iris(ibuf->rect, ibuf->x, ibuf->y, zsize, name, ibuf->zbuf); /* restore! Quite clumsy, 2 times a switch... maybe better a malloc ? */ - IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); test_endian_zbuf(ibuf); return(ret); diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c index 34796bac9d5..afd1038a80f 100644 --- a/source/blender/imbuf/intern/jpeg.c +++ b/source/blender/imbuf/intern/jpeg.c @@ -553,15 +553,12 @@ static int save_jstjpeg(char * name, struct ImBuf * ibuf) ibuf->x *= 2; ibuf->y /= 2; - /* extra argument assumed to be 0 (nzc) */ - IMB_rectop(tbuf, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(tbuf, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); sprintf(fieldname, "%s.jf0", name); returnval = save_vidjpeg(fieldname, tbuf) ; if (returnval == 1) { - /* extra argument assumed to be 0 (nzc) */ - IMB_rectop(tbuf, ibuf, 0, 0, tbuf->x, 0, 32767, 32767, - IMB_rectcpy, 0); + IMB_rectcpy(tbuf, ibuf, 0, 0, tbuf->x, 0, ibuf->x, ibuf->y); sprintf(fieldname, "%s.jf1", name); returnval = save_vidjpeg(fieldname, tbuf); } diff --git a/source/blender/imbuf/intern/openexr/Makefile b/source/blender/imbuf/intern/openexr/Makefile new file mode 100644 index 00000000000..48abc4c4331 --- /dev/null +++ b/source/blender/imbuf/intern/openexr/Makefile @@ -0,0 +1,51 @@ +# +# $Id$ +# +# ***** 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): Gernot Ziegler <gz@lysator.liu.se> +# +# ***** END GPL/BL DUAL LICENSE BLOCK ***** +# +# + +LIBNAME = openexr +DIR = $(OCGDIR)/blender/imbuf/openexr + +include nan_compile.mk + +ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows")) + CFLAGS += -funsigned-char +endif + +CFLAGS += $(LEVEL_1_C_WARNINGS) + +CPPFLAGS += -I../../../makesdna +CPPFLAGS += -I../../../blenkernel +CPPFLAGS += -I../../../blenlib +CPPFLAGS += -I../../../imbuf +CPPFLAGS += -I../../../imbuf/intern +CPPFLAGS += $(NAN_OPENEXR_INC) +CPPFLAGS += -I. diff --git a/source/blender/imbuf/intern/openexr/SConscript b/source/blender/imbuf/intern/openexr/SConscript new file mode 100644 index 00000000000..ee834669b04 --- /dev/null +++ b/source/blender/imbuf/intern/openexr/SConscript @@ -0,0 +1,22 @@ +#!/usr/bin/python +Import ('extra_includes') +Import ('user_options_dict') +Import ('library_env') + +openexr_env = library_env.Copy () + +source_files = ['openexr_api.cpp' + ] + +include_paths = ['.', + '../blenkernel', + '../imbuf', + '../imbuf/intern', + '../blenlib', + '../makesdna'] + +openexr_env.Append(CPPPATH = extra_includes) +openexr_env.Append(CPPPATH = include_paths) +openexr_env.Prepend (CPPPATH = user_options_dict['OPENEXR_INCLUDE']) +#ftf_env.Append(CPPDEFINES = 'FTGL_STATIC_LIBRARY') +openexr_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/blender_openexr', source=source_files) diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp new file mode 100644 index 00000000000..86beab537ef --- /dev/null +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -0,0 +1,441 @@ +/** +* + * ***** BEGIN GPLLICENSE 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. + * + * 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): Austin Benesh, Ton Roosendaal (float, half, speedup, cleanup...). + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string> + + +#include <openexr_api.h> + +extern "C" +{ +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#include "IMB_allocimbuf.h" +#include "BKE_global.h" +#include "DNA_scene_types.h" +} + +#include <iostream> + +#include <OpenEXR/half.h> +#include <OpenEXR/ImfVersion.h> +#include <OpenEXR/ImathBox.h> +#include <OpenEXR/ImfArray.h> +#include <OpenEXR/ImfIO.h> +#include <OpenEXR/ImfChannelList.h> +#include <OpenEXR/ImfPixelType.h> +#include <OpenEXR/ImfInputFile.h> +#include <OpenEXR/ImfOutputFile.h> +#include <OpenEXR/ImfCompression.h> +#include <OpenEXR/ImfCompressionAttribute.h> + +using namespace Imf; +using namespace Imath; + +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" +{ + +int imb_is_a_openexr(unsigned char *mem) +{ + return Imf::isImfMagic ((const char *)mem); +} + +static void openexr_header_compression(Header *header, int compression) +{ + switch(compression) + { + case 0: + header->compression() = NO_COMPRESSION; + break; + case 1: + header->compression() = PXR24_COMPRESSION; + break; + case 2: + header->compression() = ZIP_COMPRESSION; + break; + case 3: + header->compression() = PIZ_COMPRESSION; + break; + case 4: + header->compression() = RLE_COMPRESSION; + break; + default: + header->compression() = NO_COMPRESSION; + break; + } +} + +short imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags) +{ + + int width = ibuf->x; + int height = ibuf->y; + + if (flags & IB_mem) + { + printf("OpenEXR-save: Create EXR in memory CURRENTLY NOT SUPPORTED !\n"); + imb_addencodedbufferImBuf(ibuf); + ibuf->encodedsize = 0; + return(0); + } + + int write_zbuf = (flags & IB_zbuf) && ibuf->zbuf != NULL; // summarize + + try + { + Header header (width, height); + + openexr_header_compression(&header, G.scene->r.quality); + + 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) // z we do as uint always + header.channels().insert ("Z", Channel (UINT)); + + FrameBuffer frameBuffer; + OutputFile *file = new OutputFile(name, header); + + /* we store first everything in half array */ + RGBAZ *pixels = new RGBAZ[height * width]; + RGBAZ *to = pixels; + int xstride= sizeof (RGBAZ); + int ystride= xstride*width; + + /* indicate used buffers */ + frameBuffer.insert ("R", Slice (HALF, (char *) &pixels[0].r, xstride, ystride)); + frameBuffer.insert ("G", Slice (HALF, (char *) &pixels[0].g, xstride, ystride)); + frameBuffer.insert ("B", Slice (HALF, (char *) &pixels[0].b, xstride, ystride)); + frameBuffer.insert ("A", Slice (HALF, (char *) &pixels[0].a, xstride, ystride)); + + if (write_zbuf) + frameBuffer.insert ("Z", Slice (UINT, (char *) ibuf->zbuf + 4*(height-1)*width, + sizeof(int), sizeof(int) * -width)); + if(ibuf->rect_float) { + float *from; + + for (int i = ibuf->y-1; i >= 0; i--) + { + from= ibuf->rect_float + 4*i*width; + + for (int j = ibuf->x; j > 0; j--) + { + to->r = from[0]; + to->g = from[1]; + to->b = from[2]; + to->a = from[3]; + to++; from += 4; + } + } + } + else { + unsigned char *from; + + for (int i = ibuf->y-1; i >= 0; i--) + { + from= (unsigned char *)(ibuf->rect + i*width); + + for (int j = ibuf->x; j > 0; j--) + { + 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; + } + } + } + +// 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); +} + +short imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags) +{ + + int width = ibuf->x; + int height = ibuf->y; + + if (flags & IB_mem) + { + printf("OpenEXR-save: Create EXR in memory CURRENTLY NOT SUPPORTED !\n"); + imb_addencodedbufferImBuf(ibuf); + ibuf->encodedsize = 0; + return(0); + } + + if (ibuf->rect_float==NULL) + return(0); + + int write_zbuf = (flags & IB_zbuf) && ibuf->zbuf != NULL; // summarize + + try + { + Header header (width, height); + + openexr_header_compression(&header, G.scene->r.quality); + + header.channels().insert ("R", Channel (FLOAT)); + header.channels().insert ("G", Channel (FLOAT)); + header.channels().insert ("B", Channel (FLOAT)); + header.channels().insert ("A", Channel (FLOAT)); + if (write_zbuf) + header.channels().insert ("Z", Channel (UINT)); + + FrameBuffer frameBuffer; + OutputFile *file = new OutputFile(name, header); + float *first= ibuf->rect_float + 4*(height-1)*width; + int xstride = sizeof(float) * 4; + int ystride = - xstride*width; + + frameBuffer.insert ("R", Slice (FLOAT, (char *) first, xstride, ystride)); + frameBuffer.insert ("G", Slice (FLOAT, (char *) (first+1), xstride, ystride)); + frameBuffer.insert ("B", Slice (FLOAT, (char *) (first+2), xstride, ystride)); + frameBuffer.insert ("A", Slice (FLOAT, (char *) (first+3), xstride, ystride)); + + if (write_zbuf) + frameBuffer.insert ("Z", Slice (UINT, (char *) ibuf->zbuf + 4*(height-1)*width, + sizeof(int), sizeof(int) * -width)); + + 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; + InputFile *file = NULL; + +// printf("OpenEXR-load: testing input, size is %d\n", size); + if (imb_is_a_openexr(mem) == 0) return(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 float ibuf\n"); + + int bytesperpixel = 4; // since OpenEXR fills in unknown channels + ibuf = IMB_allocImBuf(width, height, 8 * bytesperpixel, 0, 0); + + if (ibuf) + { + ibuf->ftype = OPENEXR; + + imb_addrectImBuf(ibuf); + imb_addrectfloatImBuf(ibuf); + + if (!(flags & IB_test)) + { + unsigned char *to = (unsigned char *) ibuf->rect; + float *tof = ibuf->rect_float; + RGBAZ *from = pixels; + RGBAZ prescale; + + for (int i = ibuf->x * ibuf->y; i > 0; i--) + { + to[0] = (unsigned char)(from->r > 1.0 ? 1.0 : (float)from->r) * 255; + to[1] = (unsigned char)(from->g > 1.0 ? 1.0 : (float)from->g) * 255; + to[2] = (unsigned char)(from->b > 1.0 ? 1.0 : (float)from->b) * 255; + to[3] = (unsigned char)(from->a > 1.0 ? 1.0 : (float)from->a) * 255; + to += 4; + + tof[0] = from->r; + tof[1] = from->g; + tof[2] = from->b; + tof[3] = from->a; + + from++; + } + } + + IMB_flipy(ibuf); + + } + else + printf("Couldn't allocate memory for OpenEXR 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/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h new file mode 100644 index 00000000000..882b9d98a06 --- /dev/null +++ b/source/blender/imbuf/intern/openexr/openexr_api.h @@ -0,0 +1,63 @@ +/** + * $Id$ + * + * ***** 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): Austin Benesh. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef _OPENEXR_API_H +#define _OPENEXR_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define OPENEXR_FLOATRGB 0x1 +#define OPENEXR_ZBUF 0x2 + +#include <stdio.h> + + /** + * Test presence of OpenEXR file. + * @param mem pointer to loaded OpenEXR bitstream + */ + +int imb_is_a_openexr(unsigned char *mem); + +short imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags); +short imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags); + +struct ImBuf *imb_load_openexr(unsigned char *mem, int size, int flags); + +#ifdef __cplusplus +} +#endif + + + +#endif /* __OPENEXR_API_H */ diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c index fe18d4e3574..a90d7d651f8 100644 --- a/source/blender/imbuf/intern/radiance_hdr.c +++ b/source/blender/imbuf/intern/radiance_hdr.c @@ -29,13 +29,12 @@ * ***** END GPL LICENSE BLOCK ***** */ - -/* - ------------------------------------------------------------------------------------------------- +/* ---------------------------------------------------------------------- Radiance High Dynamic Range image file IO - For description and code for reading/writing of radiance hdr files by Greg Ward, refer to: + For description and code for reading/writing of radiance hdr files + by Greg Ward, refer to: http://radsite.lbl.gov/radiance/refer/Notes/picture_format.html - ------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------- */ #ifdef WIN32 @@ -68,9 +67,7 @@ typedef float fCOLOR[3]; #define copy_rgbe(c1, c2) (c2[RED]=c1[RED], c2[GRN]=c1[GRN], c2[BLU]=c1[BLU], c2[EXP]=c1[EXP]) #define copy_fcol(f1, f2) (f2[RED]=f1[RED], f2[GRN]=f1[GRN], f2[BLU]=f1[BLU]) -/*-------------------------------------------------------------------------------------------------*/ /* read routines */ - static unsigned char* oldreadcolrs(RGBE *scan, unsigned char *mem, int xmax) { int i, rshift = 0, len = xmax; @@ -127,7 +124,6 @@ static unsigned char* freadcolrs(RGBE *scan, unsigned char* mem, int xmax) return mem; } -/*-------------------------------------------------------------------------------------------------*/ /* helper functions */ /* rgbe -> float color */ @@ -161,7 +157,6 @@ static void FLOAT2RGBE(fCOLOR fcol, RGBE rgbe) } } -/*-------------------------------------------------------------------------------------------------*/ /* ImBuf read */ int imb_is_a_hdr(void *buf) @@ -174,16 +169,17 @@ int imb_is_a_hdr(void *buf) struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) { + struct ImBuf* ibuf; + RGBE* sline; + fCOLOR fcol; + float* rect_float; int found=0; - char oriY[80], oriX[80]; int width=0, height=0; - RGBE* sline; int x, y; - char* ptr; - fCOLOR fcol; int ir, ig, ib; + unsigned char* ptr; unsigned char* rect; - struct ImBuf* ibuf; + char oriY[80], oriX[80]; if (imb_is_a_hdr((void*)mem)) { @@ -198,11 +194,11 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) sscanf((char*)&mem[x+1], "%s %d %s %d", (char*)&oriY, &height, (char*)&oriX, &width); /* find end of this line, data right behind it */ - ptr = strchr((char*)&mem[x+1], '\n'); + ptr = (unsigned char *)strchr((char*)&mem[x+1], '\n'); ptr++; if (flags & IB_test) ibuf = IMB_allocImBuf(width, height, 24, 0, 0); - else ibuf = IMB_allocImBuf(width, height, 24, 1, 0); + else ibuf = IMB_allocImBuf(width, height, 24, IB_rect|IB_rectfloat, 0); if (ibuf==NULL) return NULL; ibuf->ftype = RADHDR; @@ -213,6 +209,8 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) /* read in and decode the actual data */ sline = (RGBE*)MEM_mallocN(sizeof(RGBE)*width, "radhdr_read_tmpscan"); rect = (unsigned char*)ibuf->rect; + rect_float = (float *)ibuf->rect_float; + for (y=0;y<height;y++) { ptr = freadcolrs(sline, ptr, width); if (ptr==NULL) { @@ -223,10 +221,13 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) for (x=0;x<width;x++) { /* convert to ldr */ RGBE2FLOAT(sline[x], fcol); - /*--------------------------------------------------------------------------------------*/ - /* THIS PART NEEDS TO BE ADAPTED TO WRITE TO IMBUF FLOATBUFFER ONCE THAT IS IMPLEMENTED - * temporarily now loads as regular image using simple tone mapping - * (of course this should NOT be done when loading to floatbuffer!) */ + *rect_float++ = fcol[RED]; + *rect_float++ = fcol[GRN]; + *rect_float++ = fcol[BLU]; + *rect_float++ = 255; + + /* Also old oldstyle for the rest of blender which is not using floats yet */ +/* very weird mapping! (ton) */ fcol[RED] = 1.f-exp(fcol[RED]*-1.414213562f); fcol[GRN] = 1.f-exp(fcol[GRN]*-1.414213562f); fcol[BLU] = 1.f-exp(fcol[BLU]*-1.414213562f); @@ -237,7 +238,6 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) *rect++ = (unsigned char)((ig<0) ? 0 : ((ig>255) ? 255 : ig)); *rect++ = (unsigned char)((ib<0) ? 0 : ((ib>255) ? 255 : ib)); *rect++ = 255; - /*--------------------------------------------------------------------------------------*/ } } MEM_freeN(sline); @@ -251,36 +251,39 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) return NULL; } -/*-------------------------------------------------------------------------------------------------*/ /* ImBuf write */ - - -static int fwritecolrs(FILE* file, int width, RGBE* rgbe_scan, unsigned char* ibufscan, float* fpscan) +static int fwritecolrs(FILE* file, int width, unsigned char* ibufscan, float* fpscan) { - int i, j, beg, c2, cnt=0; + int x, i, j, beg, c2, cnt=0; fCOLOR fcol; - RGBE rgbe; + RGBE rgbe, *rgbe_scan; if ((ibufscan==NULL) && (fpscan==NULL)) return 0; + rgbe_scan = (RGBE*)MEM_mallocN(sizeof(RGBE)*width, "radhdr_write_tmpscan"); + /* convert scanline */ - for (i=0, j=0;i<width;i++, j+=4) { - if (ibufscan) { - fcol[RED] = (float)ibufscan[j] / 255.f; - fcol[GRN] = (float)ibufscan[j+1] / 255.f; - fcol[BLU] = (float)ibufscan[j+2] /255.f; - } - else { - fcol[RED] = fpscan[j]; - fcol[GRN] = fpscan[j+1]; - fcol[BLU] = fpscan[j+2]; - } - FLOAT2RGBE(fcol, rgbe); - copy_rgbe(rgbe, rgbe_scan[i]); + j= 0; + for (i=0;i<width;i++) { + if (fpscan) { + fcol[RED] = fpscan[j]; + fcol[GRN] = fpscan[j+1]; + fcol[BLU] = fpscan[j+2]; + } else { + fcol[RED] = (float)ibufscan[j] / 255.f; + fcol[GRN] = (float)ibufscan[j+1] / 255.f; + fcol[BLU] = (float)ibufscan[j+2] /255.f; + } + FLOAT2RGBE(fcol, rgbe); + copy_rgbe(rgbe, rgbe_scan[i]); + j+=4; } - if ((width < MINELEN) | (width > MAXELEN)) /* OOBs, write out flat */ - return (fwrite((char *)rgbe_scan, sizeof(RGBE), width, file) - width); + if ((width < MINELEN) | (width > MAXELEN)) { /* OOBs, write out flat */ + x=fwrite((char *)rgbe_scan, sizeof(RGBE), width, file) - width; + MEM_freeN(rgbe_scan); + return x; + } /* put magic header */ putc(2, file); putc(2, file); @@ -315,6 +318,7 @@ static int fwritecolrs(FILE* file, int width, RGBE* rgbe_scan, unsigned char* ib else cnt = 0; } } + MEM_freeN(rgbe_scan); return(ferror(file) ? -1 : 0); } @@ -336,57 +340,21 @@ static void writeHeader(FILE *file, int width, int height) short imb_savehdr(struct ImBuf *ibuf, char *name, int flags) { int y, width=ibuf->x, height=ibuf->y; - RGBE* sline; - FILE* file = fopen(name, "wb"); - if (file==NULL) return 0; - writeHeader(file, width, height); - - sline = (RGBE*)MEM_mallocN(sizeof(RGBE)*width, "radhdr_write_tmpscan"); - - for (y=height-1;y>=0;y--) { - if (fwritecolrs(file, width, sline, (unsigned char*)&ibuf->rect[y*width], NULL) < 0) - { // error - fclose(file); - MEM_freeN(sline); - printf("HDR write error\n"); - return 0; - } - } - - fclose(file); - MEM_freeN(sline); - return 1; -} - -/* Temporary routine to save directly from render floatbuffer. - Called by schrijfplaatje() in toets.c */ -short imb_savehdr_fromfloat(float *fbuf, char *name, int width, int height) -{ - int y; - RGBE* sline; - - FILE* file = fopen(name, "wb"); if (file==NULL) return 0; writeHeader(file, width, height); - sline = (RGBE*)MEM_mallocN(sizeof(RGBE)*width, "radhdr_write_tmpscan"); - for (y=height-1;y>=0;y--) { - if (fwritecolrs(file, width, sline, NULL, &fbuf[y*width*4]) < 0) - { // error + if (fwritecolrs(file, width,(unsigned char *)&ibuf->rect[y*width*4], &ibuf->rect_float[y*width*4]) < 0) { fclose(file); - MEM_freeN(sline); printf("HDR write error\n"); return 0; } } fclose(file); - MEM_freeN(sline); return 1; } -/*-------------------------------------------------------------------------------------------------*/ diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c index 779401c3183..117dd54cfdd 100644 --- a/source/blender/imbuf/intern/readimage.c +++ b/source/blender/imbuf/intern/readimage.c @@ -54,6 +54,10 @@ #include "IMB_radiance_hdr.h" #include "BKE_global.h" +#ifdef WITH_OPENEXR +#include "openexr/openexr_api.h" +#endif + #ifdef WITH_QUICKTIME #if defined(_WIN32) || defined (__APPLE__) #include "quicktime_import.h" @@ -138,6 +142,9 @@ ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) { ibuf = imb_loadhdr((uchar*)mem, size, flags); if (ibuf) return (ibuf); + ibuf = imb_load_openexr((uchar *)mem, size, flags); + if (ibuf) return (ibuf); + #ifdef WITH_QUICKTIME #if defined(_WIN32) || defined (__APPLE__) if(G.have_quicktime) { diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c index 22f2698a8c5..4ddd7ca4814 100644 --- a/source/blender/imbuf/intern/rectop.c +++ b/source/blender/imbuf/intern/rectop.c @@ -41,33 +41,17 @@ #include "IMB_allocimbuf.h" -void IMB_rectcpy(unsigned int *drect, unsigned int *srect, int x, int dummy) +void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx, + int desty, int srcx, int srcy, int width, int height) { - memcpy(drect,srect, x * sizeof(int)); -} - - -void IMB_rectfill(unsigned int *drect, unsigned int *srect, int x, int value) -{ - for (;x > 0; x--) *drect++ = value; -} - -void IMB_rectop(struct ImBuf *dbuf, - struct ImBuf *sbuf, - int destx, - int desty, - int srcx, - int srcy, - int width, - int height, - void (*operation)(unsigned int *, unsigned int*, int, int), - int value) -{ - unsigned int *drect,*srect; - int tmp; + unsigned int *drect, *srect; + float *drectf = NULL; + float *srectf = NULL; + int tmp, do_float = 0; - if (dbuf == 0) return; - if (operation == 0) return; + if (dbuf == NULL) return; + + if (sbuf->rect_float) do_float = 1; if (destx < 0){ srcx -= destx ; @@ -96,6 +80,7 @@ void IMB_rectop(struct ImBuf *dbuf, if (height > tmp) height = tmp; drect = dbuf->rect + desty * dbuf->x + destx; + if (do_float) drectf = dbuf->rect_float + desty * dbuf->x + destx; destx = dbuf->x; if (sbuf){ @@ -110,25 +95,53 @@ void IMB_rectop(struct ImBuf *dbuf, srect = sbuf->rect; srect += srcy * sbuf->x; srect += srcx; + if (do_float) { + srectf = sbuf->rect_float; + srectf += srcy * sbuf->x; + srectf += srcx; + } srcx = sbuf->x; } else{ if (width <= 0) return; if (height <= 0) return; srect = drect; + srectf = drectf; srcx = destx; } for (;height > 0; height--){ - operation(drect,srect,width, value); - drect += destx; - srect += srcx; + + memcpy(drect,srect, width * sizeof(int)); + if (do_float) memcpy(drectf,srectf, width * sizeof(float) * 4); } } - -void IMB_rectoptot(struct ImBuf *dbuf, struct ImBuf *sbuf, - void (*operation)(unsigned int *, unsigned int*, int, int), int value) +void IMB_rectfill(struct ImBuf *drect, float col[4]) { - IMB_rectop(dbuf,sbuf,0,0,0,0,32767,32767,operation, value); + int num; + unsigned int *rrect = drect->rect; + unsigned char *spot; + + num = drect->x * drect->y; + for (;num > 0; num--) { + spot = (unsigned char *)rrect; + spot[0] = (int)(col[0]*255); + spot[1] = (int)(col[1]*255); + spot[2] = (int)(col[2]*255); + spot[3] = (int)(col[3]*255); + *rrect++; + } + if(drect->rect_float) { + float *rrectf = drect->rect_float; + + num = drect->x * drect->y; + for (;num > 0; num--) { + *rrectf++ = col[0]; + *rrectf++ = col[1]; + *rrectf++ = col[2]; + *rrectf++ = col[3]; + } + } } + diff --git a/source/blender/imbuf/intern/rotate.c b/source/blender/imbuf/intern/rotate.c index f8d01789cdc..13edfbf0a33 100644 --- a/source/blender/imbuf/intern/rotate.c +++ b/source/blender/imbuf/intern/rotate.c @@ -43,26 +43,46 @@ void IMB_flipy(struct ImBuf * ibuf) { - short x,y,backx; - unsigned int *top,*bottom,temp; + short x, y; + unsigned int *top, *bottom, do_float=0, *line; + float *topf=NULL, *bottomf=NULL, *linef=NULL; - if (ibuf == 0) return; - if (ibuf->rect == 0) return; + if (ibuf == NULL) return; + if (ibuf->rect == NULL) return; + + if (ibuf->rect_float) do_float =1; x = ibuf->x; y = ibuf->y; - backx = x<<1; top = ibuf->rect; bottom = top + ((y-1) * x); + line= MEM_mallocN(x*sizeof(int), "linebuf"); + + if (do_float) { + topf= ibuf->rect_float; + bottomf = topf + 4*((y-1) * x); + linef= MEM_mallocN(4*x*sizeof(float), "linebuff"); + } y >>= 1; - for(;y>0;y--){ - for(x = ibuf->x; x > 0; x--){ - temp = *top; - *(top++) = *bottom; - *(bottom++) = temp; + for(;y>0;y--) { + + memcpy(line, top, x*sizeof(int)); + memcpy(top, bottom, x*sizeof(int)); + memcpy(bottom, line, x*sizeof(int)); + bottom -= x; + top+= x; + + if(do_float) { + memcpy(linef, topf, 4*x*sizeof(float)); + memcpy(topf, bottomf, 4*x*sizeof(float)); + memcpy(bottomf, linef, 4*x*sizeof(float)); + bottomf -= 4*x; + topf+= 4*x; } - bottom -= backx; } + + MEM_freeN(line); + if(linef) MEM_freeN(linef); } diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index 7749dadb2ca..539ea0377b3 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -52,20 +52,27 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1) struct ImBuf *ibuf2; uchar *p1,*_p1,*dest; short a,r,g,b,x,y; + float af,rf,gf,bf, *p1f, *_p1f, *destf; + int do_float = 0; - if (ibuf1==0) return (0); - if (ibuf1->rect == 0) return (0); + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float = 1; if (ibuf1->x <= 1) return(IMB_dupImBuf(ibuf1)); - ibuf2 = IMB_allocImBuf((ibuf1->x)/2 , ibuf1->y , ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2 = IMB_allocImBuf((ibuf1->x)/2, ibuf1->y, ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); _p1 = (uchar *) ibuf1->rect; dest=(uchar *) ibuf2->rect; + + _p1f = ibuf1->rect_float; + destf= ibuf2->rect_float; for(y=ibuf2->y;y>0;y--){ p1 = _p1; + p1f = _p1f; for(x = ibuf2->x ; x>0 ; x--){ a = *(p1++) ; b = *(p1++) ; @@ -79,8 +86,23 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1) *(dest++) = b >> 1; *(dest++) = g >> 1; *(dest++) = r >> 1; + if (do_float) { + af = *(p1f++); + bf = *(p1f++); + gf = *(p1f++); + rf = *(p1f++); + af += *(p1f++); + bf += *(p1f++); + gf += *(p1f++); + rf += *(p1f++); + *(destf++) = 0.5f*af; + *(destf++) = 0.5f*bf; + *(destf++) = 0.5f*gf; + *(destf++) = 0.5f*rf; + } } _p1 += (ibuf1->x << 2); + if (do_float) _p1f += (ibuf1->x << 2); } return (ibuf2); } @@ -89,21 +111,30 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1) struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; - int *p1,*dest, i, col; + int *p1,*dest, i, col, do_float=0; + float *p1f, *destf, colf; - if (ibuf1==0) return (0); - if (ibuf1->rect == 0) return (0); + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float = 1; - ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); p1 = (int *) ibuf1->rect; dest=(int *) ibuf2->rect; + p1f = ibuf1->rect_float; + destf = ibuf2->rect_float; for(i = ibuf1->y * ibuf1->x ; i>0 ; i--) { col = *p1++; *dest++ = col; *dest++ = col; + if (do_float) { + colf = *p1f++; + *destf++ = col; + *destf++ = col; + } } return (ibuf2); @@ -113,8 +144,8 @@ struct ImBuf *IMB_double_x(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; - if (ibuf1==0) return (0); - if (ibuf1->rect == 0) return (0); + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); ibuf2 = IMB_double_fast_x(ibuf1); @@ -128,20 +159,30 @@ struct ImBuf *IMB_half_y(struct ImBuf *ibuf1) struct ImBuf *ibuf2; uchar *p1,*p2,*_p1,*dest; short a,r,g,b,x,y; + int do_float = 0; + float af,rf,gf,bf,*p1f,*p2f,*_p1f,*destf; - if (ibuf1==0) return (0); - if (ibuf1->rect == 0) return (0); + p1f = NULL; p2f = NULL; + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float = 1; if (ibuf1->y <= 1) return(IMB_dupImBuf(ibuf1)); - ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); _p1 = (uchar *) ibuf1->rect; dest=(uchar *) ibuf2->rect; + _p1f = ibuf1->rect_float; + destf= ibuf2->rect_float; for(y=ibuf2->y ; y>0 ; y--){ p1 = _p1; p2 = _p1 + (ibuf1->x << 2); + if (do_float) { + p1f = _p1f; + p2f = _p1f + (ibuf1->x << 2); + } for(x = ibuf2->x ; x>0 ; x--){ a = *(p1++) ; b = *(p1++) ; @@ -155,8 +196,23 @@ struct ImBuf *IMB_half_y(struct ImBuf *ibuf1) *(dest++) = b >> 1; *(dest++) = g >> 1; *(dest++) = r >> 1; + if (do_float) { + af = *(p1f++) ; + bf = *(p1f++) ; + gf = *(p1f++) ; + rf = *(p1f++); + af += *(p2f++) ; + bf += *(p2f++) ; + gf += *(p2f++) ; + rf += *(p2f++); + *(destf++) = 0.5f*af; + *(destf++) = 0.5f*bf; + *(destf++) = 0.5f*gf; + *(destf++) = 0.5f*rf; + } } _p1 += (ibuf1->x << 3); + if (do_float) _p1f += (ibuf1->x << 3); } return (ibuf2); } @@ -166,21 +222,31 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; int *p1, *dest1, *dest2; + float *p1f, *dest1f, *dest2f; short x,y; + int do_float =0; - if (ibuf1==0) return (0); - if (ibuf1->rect == 0) return (0); + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float =1; - ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); p1 = (int *) ibuf1->rect; dest1=(int *) ibuf2->rect; + p1f = ibuf1->rect_float; + dest1f= ibuf2->rect_float; for(y = ibuf1->y ; y>0 ; y--){ dest2 = dest1 + ibuf2->x; for(x = ibuf2->x ; x>0 ; x--) *dest1++ = *dest2++ = *p1++; dest1 = dest2; + if (do_float) { + dest2f = dest1f + ibuf2->x; + for(x = ibuf2->x ; x>0 ; x--) *dest1f++ = *dest2f++ = *p1f++; + dest1f = dest2f; + } } return (ibuf2); @@ -190,8 +256,8 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; - if (ibuf1==0) return (0); - if (ibuf1->rect == 0) return (0); + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); ibuf2 = IMB_double_fast_y(ibuf1); @@ -203,23 +269,29 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1) struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; - uchar *p1,*p2,*dest; + uchar *p1, *p2, *dest; + float *p1f, *destf, *p2f = NULL; int x,y; + int do_float =0; - if (ibuf1 == 0) return (0); - if (ibuf1->rect == 0) return (0); + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float = 1; if (ibuf1->x <= 1) return(IMB_half_y(ibuf1)); if (ibuf1->y <= 1) return(IMB_half_x(ibuf1)); - ibuf2=IMB_allocImBuf((ibuf1->x)/2,(ibuf1->y)/2,ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); + p1f = ibuf1->rect_float; + destf=ibuf2->rect_float; p1 = (uchar *) ibuf1->rect; dest=(uchar *) ibuf2->rect; for(y=ibuf2->y;y>0;y--){ p2 = p1 + (ibuf1->x << 2); + if (do_float) p2f = p1f + (ibuf1->x << 2); for(x=ibuf2->x;x>0;x--){ dest[0] = (p1[0] + p2[0] + p1[4] + p2[4]) >> 2; dest[1] = (p1[1] + p2[1] + p1[5] + p2[5]) >> 2; @@ -228,10 +300,21 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1) p1 += 8; p2 += 8; dest += 4; + if (do_float){ + destf[0] = 0.25f*(p1f[0] + p2f[0] + p1f[4] + p2f[4]); + destf[1] = 0.25f*(p1f[1] + p2f[1] + p1f[5] + p2f[5]); + destf[2] = 0.25f*(p1f[2] + p2f[2] + p1f[6] + p2f[6]); + destf[3] = 0.25f*(p1f[3] + p2f[3] + p1f[7] + p2f[7]); + p1f += 8; + p2f += 8; + destf += 4; + } } p1=p2; + if (do_float) p1f=p2f; if(ibuf1->x & 1) { p1+=4; + if (do_float) p1f+=4; } } return (ibuf2); @@ -243,34 +326,59 @@ struct ImBuf *IMB_onethird(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; uchar *p1,*p2,*p3,*dest; + float *p1f, *p2f, *p3f, *destf; + int do_float=0; short a,r,g,b,x,y,i; + float af,rf,gf,bf; - if (ibuf1 == 0) return (0); - if (ibuf1->rect == 0) return (0); + p2f = NULL; p3f = NULL; + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float = 1; - ibuf2=IMB_allocImBuf((ibuf1->x)/3,(ibuf1->y)/3,ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2=IMB_allocImBuf((ibuf1->x)/3, (ibuf1->y)/3, ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); + p1f = ibuf1->rect_float; + destf = ibuf2->rect_float; p1 = (uchar *) ibuf1->rect; dest=(uchar *) ibuf2->rect; for(y=ibuf2->y;y>0;y--){ p2 = p1 + (ibuf1->x << 2); p3 = p2 + (ibuf1->x << 2); + if (do_float) { + p2f = p1f + (ibuf1->x <<2); + p3f = p2f + (ibuf1->x <<2); + } for(x=ibuf2->x;x>0;x--){ a=r=g=b=0; + af=rf=gf=bf=0; for (i=3;i>0;i--){ a += *(p1++) + *(p2++) + *(p3++); b += *(p1++) + *(p2++) + *(p3++); g += *(p1++) + *(p2++) + *(p3++); r += *(p1++) + *(p2++) + *(p3++); + if (do_float) { + af += *(p1f++) + *(p2f++) + *(p3f++); + bf += *(p1f++) + *(p2f++) + *(p3f++); + gf += *(p1f++) + *(p2f++) + *(p3f++); + rf += *(p1f++) + *(p2f++) + *(p3f++); + } } *(dest++) = a/9; *(dest++) = b/9; *(dest++) = g/9; *(dest++) = r/9; + if (do_float) { + *(destf++) = af/9.0f; + *(destf++) = bf/9.0f; + *(destf++) = gf/9.0f; + *(destf++) = rf/9.0f; + } } p1=p3; + if (do_float) p1f = p3f; } return (ibuf2); } @@ -280,33 +388,55 @@ struct ImBuf *IMB_halflace(struct ImBuf *ibuf1) { struct ImBuf *ibuf2; uchar *p1,*p2,*dest; + float *p1f,*p2f,*destf; short a,r,g,b,x,y,i; + float af,rf,gf,bf; + int do_float = 0; - if (ibuf1 == 0) return (0); - if (ibuf1->rect == 0) return (0); + p2f = NULL; + if (ibuf1==NULL) return (0); + if (ibuf1->rect==NULL) return (0); + if (ibuf1->rect_float) do_float = 1; - ibuf2=IMB_allocImBuf((ibuf1->x)/4,(ibuf1->y)/2,ibuf1->depth,1,0); - if (ibuf2==0) return (0); + ibuf2=IMB_allocImBuf((ibuf1->x)/4, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags, 0); + if (ibuf2==NULL) return (0); + p1f = ibuf1->rect_float; + destf= ibuf2->rect_float; p1 = (uchar *) ibuf1->rect; dest=(uchar *) ibuf2->rect; for(y= ibuf2->y / 2 ; y>0;y--){ p2 = p1 + (ibuf1->x << 3); + if (do_float) p2f = p1f + (ibuf1->x << 3); for(x = 2 * ibuf2->x;x>0;x--){ a=r=g=b=0; + af=rf=gf=bf=0; for (i=4;i>0;i--){ a += *(p1++) + *(p2++); b += *(p1++) + *(p2++); g += *(p1++) + *(p2++); r += *(p1++) + *(p2++); + if (do_float) { + af += *(p1f++) + *(p2f++); + bf += *(p1f++) + *(p2f++); + gf += *(p1f++) + *(p2f++); + rf += *(p1f++) + *(p2f++); + } } *(dest++) = a >> 3; *(dest++) = b >> 3; *(dest++) = g >> 3; *(dest++) = r >> 3; + if (do_float) { + *(destf++) = 0.125f*af; + *(destf++) = 0.125f*bf; + *(destf++) = 0.125f*gf; + *(destf++) = 0.125f*rf; + } } p1 = p2; + if (do_float) p1f = p2f; } return (ibuf2); } @@ -315,14 +445,23 @@ struct ImBuf *IMB_halflace(struct ImBuf *ibuf1) static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx) { uchar *rect,*_newrect,*newrect; - float sample, add, val, nval; - int x, y, i; + float *rectf,*_newrectf,*newrectf; + float sample, add, val, nval, valf, nvalf; + int x, y, i, do_float=0; - if (ibuf == 0) return(0); - if (ibuf->rect == 0) return(ibuf); + rectf = NULL; _newrectf= NULL; newrectf = NULL; + nval = 0; nvalf = 0; + + if (ibuf==NULL) return(0); + if (ibuf->rect==NULL) return(ibuf); + if (ibuf->rect_float) { + do_float = 1; + _newrectf = MEM_mallocN(newx * ibuf->y * sizeof(float) * 4, "scaledownxf"); + if (_newrectf==NULL) return(ibuf); + } - _newrect = (uchar *) malloc(newx * ibuf->y * sizeof(int)); - if (_newrect == 0) return(ibuf); + _newrect = MEM_mallocN(newx * ibuf->y * sizeof(int), "scaledownx"); + if (_newrect==NULL) return(ibuf); add = (ibuf->x - 0.001) / newx; @@ -331,22 +470,39 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx) rect = (uchar *) ibuf->rect; rect += i; newrect = _newrect + i; + if (do_float) { + rectf = ibuf->rect_float; + rectf += i; + newrectf = _newrectf + i; + } for (y = ibuf->y; y>0 ; y--){ - val = sample = 0.0; + val = sample = valf = 0.0; for (x = newx ; x>0 ; x--){ nval = - val * sample; + if (do_float) nvalf = - valf * sample; sample += add; while (sample >= 1.0){ sample -= 1.0; nval += *rect; rect += 4; + if (do_float) { + nvalf += *rectf; + rectf += 4; + } } val = *rect; rect += 4; nval += sample * val; + if (do_float) { + valf = *rectf; + rectf += 4; + nvalf += sample * valf; + *newrectf = (nvalf/add) + 0.5; + newrectf += 4; + } sample -= 1.0; *newrect = (nval/add) + 0.5; newrect += 4; @@ -357,6 +513,13 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx) imb_freerectImBuf(ibuf); ibuf->mall |= IB_rect; ibuf->rect = (unsigned int *) _newrect; + + if (do_float) { + imb_freerectfloatImBuf(ibuf); + ibuf->mall |= IB_rectfloat; + ibuf->rect_float = _newrectf; + } + ibuf->x = newx; return(ibuf); } @@ -364,15 +527,25 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx) static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy) { - uchar *rect,*_newrect,*newrect; - float sample,add,val,nval; - int x,y,i,skipx; + uchar *rect, *_newrect, *newrect; + float *rectf, *_newrectf, *newrectf; + float sample, add, val, nval, valf, nvalf; + int x, y, i, skipx, do_float = 0; - if (ibuf == 0) return(0); - if (ibuf->rect == 0) return(ibuf); + rectf= NULL; _newrectf = NULL; newrectf = NULL; + nval = 0; nvalf = 0; - _newrect = (uchar *) malloc(newy * ibuf->x * sizeof(int)); - if (_newrect == 0) return(ibuf); + if (ibuf==NULL) return(0); + if (ibuf->rect==NULL) return(ibuf); + + if (ibuf->rect_float) { + do_float = 1; + _newrectf = MEM_mallocN(newy * ibuf->x * sizeof(float) * 4, "scaldownyf"); + if (_newrectf==NULL) return(ibuf); + } + + _newrect = MEM_mallocN(newy * ibuf->x * sizeof(int), "scaledowny"); + if (_newrect==NULL) return(ibuf); add = (ibuf->y - 0.001) / newy; skipx = 4 * ibuf->x; @@ -382,23 +555,39 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy) for (x = skipx - 4; x>=0 ; x-= 4){ rect = ((uchar *) ibuf->rect) + i + x; newrect = _newrect + i + x; + if (do_float) { + rectf = ((float *) ibuf->rect_float) + i + x; + newrectf = _newrectf + i + x; + } val = sample = 0.0; for (y = newy ; y>0 ; y--){ nval = - val * sample; + if (do_float) nvalf = - val * sample; sample += add; while (sample >= 1.0){ sample -= 1.0; nval += *rect; rect += skipx; + if (do_float) { + nvalf += *rectf; + rectf += skipx; + } } val = *rect; rect += skipx; nval += sample * val; - sample -= 1.0; *newrect = (nval/add) + 0.5; newrect += skipx; + if (do_float) { + valf = *rectf; + rectf += skipx; + nvalf += sample * valf; + *newrectf = (nvalf/add) + 0.5; + newrectf += skipx; + } + sample -= 1.0; } } } @@ -406,6 +595,13 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy) imb_freerectImBuf(ibuf); ibuf->mall |= IB_rect; ibuf->rect = (unsigned int *) _newrect; + + if (do_float) { + imb_freerectfloatImBuf(ibuf); + ibuf->mall |= IB_rectfloat; + ibuf->rect_float = (float *) _newrectf; + } + ibuf->y = newy; return(ibuf); } @@ -414,23 +610,39 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy) static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) { uchar *rect,*_newrect,*newrect; + float *rectf,*_newrectf,*newrectf; float sample,add; float val_a,nval_a,diff_a; float val_b,nval_b,diff_b; float val_g,nval_g,diff_g; float val_r,nval_r,diff_r; - int x,y; - - if (ibuf == 0) return(0); - if (ibuf->rect == 0) return(ibuf); + float val_af,nval_af,diff_af; + float val_bf,nval_bf,diff_bf; + float val_gf,nval_gf,diff_gf; + float val_rf,nval_rf,diff_rf; + int x,y, do_float = 0; + + val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0; + val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0; + if (ibuf==NULL) return(0); + if (ibuf->rect==NULL) return(ibuf); + + _newrect = MEM_mallocN(newx * ibuf->y * sizeof(int), "scaleupx"); + if (_newrect==NULL) return(ibuf); + + if (ibuf->rect_float) { + do_float = 1; + _newrectf = MEM_mallocN(newx * ibuf->y * sizeof(float) * 4, "scaleupxf"); + if (_newrectf==NULL) return(ibuf); + } - _newrect = (uchar *) malloc(newx * ibuf->y * sizeof(int)); - if (_newrect == 0) return(ibuf); add = (ibuf->x - 1.001) / (newx - 1.0); rect = (uchar *) ibuf->rect; + rectf = (float *) ibuf->rect_float; newrect = _newrect; + newrectf = _newrectf = NULL; for (y = ibuf->y; y>0 ; y--){ @@ -456,9 +668,34 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) val_r += 0.5; rect += 8; + + if (do_float) { + val_af = rectf[0] ; + nval_af = rectf[4]; + diff_af = nval_af - val_af; + val_af += 0.5; + + val_bf = rectf[1] ; + nval_bf = rectf[5]; + diff_bf = nval_bf - val_bf; + val_bf += 0.5; + + val_gf = rectf[2] ; + nval_gf = rectf[6]; + diff_gf = nval_gf - val_gf; + val_gf += 0.5; + + val_rf = rectf[3] ; + nval_rf = rectf[7]; + diff_rf = nval_rf - val_rf; + val_rf += 0.5; + + rectf += 8; + } for (x = newx ; x>0 ; x--){ if (sample >= 1.0){ sample -= 1.0; + val_a = nval_a ; nval_a = rect[0] ; diff_a = nval_a - val_a ; @@ -479,12 +716,42 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) diff_r = nval_r - val_r ; val_r += 0.5; rect += 4; + + if (do_float) { + val_af = nval_af ; + nval_af = rectf[0] ; + diff_af = nval_af - val_af ; + val_af += 0.5; + + val_bf = nval_bf ; + nval_bf = rectf[1] ; + diff_bf = nval_bf - val_bf ; + val_bf += 0.5; + + val_gf = nval_gf ; + nval_gf = rectf[2] ; + diff_gf = nval_gf - val_gf ; + val_gf += 0.5; + + val_rf = nval_rf ; + nval_rf = rectf[3] ; + diff_rf = nval_rf - val_rf; + val_rf += 0.5; + rectf += 4; + } } newrect[0] = val_a + sample * diff_a; newrect[1] = val_b + sample * diff_b; newrect[2] = val_g + sample * diff_g; newrect[3] = val_r + sample * diff_r; newrect += 4; + if (do_float) { + newrectf[0] = val_af + sample * diff_af; + newrectf[1] = val_bf + sample * diff_bf; + newrectf[2] = val_gf + sample * diff_gf; + newrectf[3] = val_rf + sample * diff_rf; + newrectf += 4; + } sample += add; } } @@ -492,6 +759,13 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) imb_freerectImBuf(ibuf); ibuf->mall |= IB_rect; ibuf->rect = (unsigned int *) _newrect; + + if (do_float) { + imb_freerectfloatImBuf(ibuf); + ibuf->mall |= IB_rectfloat; + ibuf->rect_float = (float *) _newrectf; + } + ibuf->x = newx; return(ibuf); } @@ -500,24 +774,44 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy) { uchar *rect,*_newrect,*newrect; - float sample,add,val,nval,diff; - int x,y,i,skipx; + float *rectf = NULL, *newrectf = NULL, *_newrectf = NULL; + float sample,add,val,nval,diff, valf=0.0f, nvalf=0.0f, difff=0.0f; + int x,y,i,skipx, do_float = 0; - if (ibuf == 0) return(0); - if (ibuf->rect == 0) return(ibuf); + if (ibuf==NULL) return(0); + if (ibuf->rect==NULL) return(ibuf); - _newrect = (uchar *)malloc(newy * ibuf->x * sizeof(int)); - if (_newrect == 0) return(ibuf); + _newrect = MEM_mallocN(newy * ibuf->x * sizeof(int), "scaleupy"); + if (_newrect==NULL) return(ibuf); + if (ibuf->rect_float) { + do_float = 1; + _newrectf = MEM_mallocN(newy * ibuf->y * sizeof(float) * 4, "scaleupyf"); + if (_newrectf==NULL) return(ibuf); + } + add = (ibuf->y - 1.001) / (newy - 1.0); skipx = 4 * ibuf->x; /* all four components, rgba/abgr */ for(i=3 ; i>=0 ; i--){ for (x = skipx - 4; x >= 0 ; x -= 4){ + rect = (uchar *) ibuf->rect; rect += i + x; newrect = _newrect + i + x; + + if (do_float) { + rectf = ibuf->rect_float; + rectf += i * x; + newrectf = _newrectf + i + x; + valf = *rectf; + rectf += skipx; + nvalf = *rectf; + rectf += skipx; + difff = nvalf - valf; + valf += 0.5; + } sample = 0; val = *rect ; @@ -535,9 +829,22 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy) rect += skipx; diff = nval - val; val += 0.5; + + if (do_float) { + valf = nvalf; + nvalf = *rectf; + rectf += skipx; + difff = nvalf - valf; + valf += 0.5; + } } *newrect = val + sample * diff; newrect += skipx; + + if (do_float) { + *newrectf = valf + sample * difff; + newrectf += skipx; + } sample += add; } } @@ -546,20 +853,28 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy) imb_freerectImBuf(ibuf); ibuf->mall |= IB_rect; ibuf->rect = (unsigned int *) _newrect; + + if(do_float) { + imb_freerectfloatImBuf(ibuf); + ibuf->mall |= IB_rectfloat; + ibuf->rect_float = _newrectf; + } + ibuf->y = newy; return(ibuf); } +/* no float buf needed here! */ static void scalefast_Z_ImBuf(ImBuf *ibuf, short newx, short newy) { - unsigned int *rect,*_newrect,*newrect; - int x,y; - int ofsx,ofsy,stepx,stepy; + unsigned int *rect, *_newrect, *newrect; + int x, y; + int ofsx, ofsy, stepx, stepy; if (ibuf->zbuf) { - _newrect = malloc(newx * newy * sizeof(int)); - if (_newrect == 0) return; - + _newrect = MEM_mallocN(newx * newy * sizeof(int), "z rect"); + if (_newrect==NULL) return; + stepx = (65536.0 * (ibuf->x - 1.0) / (newx - 1.0)) + 0.5; stepy = (65536.0 * (ibuf->y - 1.0) / (newy - 1.0)) + 0.5; ofsy = 32768; @@ -585,8 +900,8 @@ static void scalefast_Z_ImBuf(ImBuf *ibuf, short newx, short newy) struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy) { - if (ibuf == 0) return (0); - if (ibuf->rect == 0) return (ibuf); + if (ibuf==NULL) return (0); + if (ibuf->rect==NULL) return (ibuf); // scaleup / scaledown functions below change ibuf->x and ibuf->y // so we first scale the Z-buffer (if any) @@ -604,18 +919,28 @@ struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy) struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy) { unsigned int *rect,*_newrect,*newrect; - int x,y; + float *rectf,*_newrectf,*newrectf; + int x,y, do_float=0; int ofsx,ofsy,stepx,stepy; - if (ibuf == 0) return(0); - if (ibuf->rect == 0) return(ibuf); + rectf = NULL; _newrectf = NULL; newrectf = NULL; - if (newx == ibuf->x && newy == ibuf->y) return(ibuf); + if (ibuf==NULL) return(0); + if (ibuf->rect==NULL) return(ibuf); + if (ibuf->rect_float) do_float = 1; - _newrect = malloc(newx * newy * sizeof(int)); - if (_newrect == 0) return(ibuf); + if (newx == ibuf->x && newy == ibuf->y) return(ibuf); + _newrect = MEM_mallocN(newx * newy * sizeof(int), "scalefastimbuf"); + if (_newrect==NULL) return(ibuf); newrect = _newrect; + + if (do_float) { + _newrectf = MEM_mallocN(newx * newy * sizeof(float) * 4, "scalefastimbuf f"); + if (_newrectf==NULL) return(ibuf); + newrectf = _newrectf; + } + stepx = (65536.0 * (ibuf->x - 1.0) / (newx - 1.0)) + 0.5; stepy = (65536.0 * (ibuf->y - 1.0) / (newy - 1.0)) + 0.5; ofsy = 32768; @@ -623,10 +948,16 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy) for (y = newy; y > 0 ; y--){ rect = ibuf->rect; rect += (ofsy >> 16) * ibuf->x; + if (do_float) { + rectf = ibuf->rect_float; + rectf += (ofsy >> 16) * ibuf->x; + } ofsy += stepy; ofsx = 32768; + for (x = newx ; x>0 ; x--){ *newrect++ = rect[ofsx >> 16]; + if (do_float) *newrectf++ = rectf[ofsx >> 16]; ofsx += stepx; } } @@ -635,6 +966,12 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy) ibuf->mall |= IB_rect; ibuf->rect = _newrect; + if (do_float) { + imb_freerectfloatImBuf(ibuf); + ibuf->mall |= IB_rectfloat; + ibuf->rect_float = _newrectf; + } + scalefast_Z_ImBuf(ibuf, newx, newy); ibuf->x = newx; @@ -646,33 +983,34 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy) static struct ImBuf *generic_fieldscale(struct ImBuf *ibuf, short newx, short newy, struct ImBuf *(*scalefunc)(ImBuf *, short, short) ) { struct ImBuf *sbuf1, *sbuf2; -/* extern void rectcpy(); */ - sbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, ibuf->depth, IB_rect, 0); - sbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, ibuf->depth, IB_rect, 0); + sbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, ibuf->depth, ibuf->flags, 0); + sbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, ibuf->depth, ibuf->flags, 0); ibuf->x *= 2; + /* more args needed, 0 assumed... (nzc) */ -/* rectop(sbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, rectcpy); */ -/* rectop(sbuf2, ibuf, 0, 0, sbuf2->x, 0, 32767, 32767, rectcpy); */ - IMB_rectop(sbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(sbuf2, ibuf, 0, 0, sbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(sbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); + IMB_rectcpy(sbuf2, ibuf, 0, 0, sbuf2->x, 0, ibuf->x, ibuf->y); imb_freerectImBuf(ibuf); + imb_freerectfloatImBuf(ibuf); + ibuf->x = newx; ibuf->y = newy; - imb_addrectImBuf(ibuf); + imb_addrectImBuf(ibuf); + if(ibuf->flags & IB_rectfloat) + imb_addrectfloatImBuf(ibuf); + scalefunc(sbuf1, newx, newy / 2); scalefunc(sbuf2, newx, newy / 2); ibuf->x *= 2; /* more args needed, 0 assumed... (nzc) */ -/* rectop(ibuf, sbuf1, 0, 0, 0, 0, 32767, 32767, rectcpy); */ -/* rectop(ibuf, sbuf2, sbuf2->x, 0, 0, 0, 32767, 32767, rectcpy); */ - IMB_rectop(ibuf, sbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); - IMB_rectop(ibuf, sbuf2, sbuf2->x, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, sbuf1, 0, 0, 0, 0, sbuf1->x, sbuf1->y); + IMB_rectcpy(ibuf, sbuf2, sbuf2->x, 0, 0, 0, sbuf2->x, sbuf2->y); ibuf->x /= 2; @@ -683,9 +1021,7 @@ static struct ImBuf *generic_fieldscale(struct ImBuf *ibuf, short newx, short ne } -struct ImBuf *IMB_scalefastfieldImBuf(struct ImBuf *ibuf, - short newx, - short newy) +struct ImBuf *IMB_scalefastfieldImBuf(struct ImBuf *ibuf, short newx, short newy) { return(generic_fieldscale(ibuf, newx, newy, IMB_scalefastImBuf)); } @@ -694,3 +1030,4 @@ struct ImBuf *IMB_scalefieldImBuf(struct ImBuf *ibuf, short newx, short newy) { return(generic_fieldscale(ibuf, newx, newy, IMB_scaleImBuf)); } + diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c index 5c064098671..331c1031599 100644 --- a/source/blender/imbuf/intern/targa.c +++ b/source/blender/imbuf/intern/targa.c @@ -518,8 +518,8 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int flags) if (checktarga(&tga,mem) == 0) return(0); - if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize,0,0); - else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7,1,0); + if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0, 0); + else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect, 0); if (ibuf == 0) return(0); ibuf->ftype = TGA; @@ -629,7 +629,7 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int flags) if (ibuf) { if (ibuf->rect && (flags & IB_cmap)==0) - IMB_convert_rgba_to_abgr((ibuf->x+ibuf->skipx)*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); } return(ibuf); diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 616531b3a77..6fc5fb99f8b 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -399,7 +399,7 @@ struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) /* close the client layer interface to the in-memory file */ libtiff_TIFFClose(image); - if (G.order == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + if (G.order == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); /* return successfully */ return (ibuf); diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index 4cdfa852df1..8110a115471 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -50,6 +50,10 @@ #include "IMB_anim.h" +#ifdef WITH_OPENEXR +#include "openexr/openexr_api.h" +#endif + #ifdef WITH_QUICKTIME #include "quicktime_import.h" #endif @@ -97,7 +101,9 @@ static int IMB_ispic_name(char *name) } if (imb_is_a_png(buf)) return(PNG); if (imb_is_a_targa(buf)) return(TGA); - +#ifdef WITH_OPENEXR + if (imb_is_a_openexr((uchar *)buf)) return(OPENEXR); +#endif if (imb_is_a_tiff(buf)) return(TIF); /* radhdr: check if hdr format */ diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c index 340f8ace415..b752dbf9dd0 100644 --- a/source/blender/imbuf/intern/writeimage.c +++ b/source/blender/imbuf/intern/writeimage.c @@ -57,12 +57,15 @@ #include "IMB_bmp.h" #include "IMB_tiff.h" #include "IMB_radiance_hdr.h" +#ifdef WITH_OPENEXR +#include "openexr/openexr_api.h" +#endif #include "IMB_iff.h" #include "IMB_bitplanes.h" #include "IMB_divers.h" -short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags) +short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags) { short ok=TRUE,delpl=FALSE; int file = -1; @@ -72,28 +75,33 @@ short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags) /* Put formats that take a filename here */ if (IS_jpg(ibuf)) { - return imb_savejpeg(ibuf, naam, flags); + return imb_savejpeg(ibuf, name, flags); } if (IS_radhdr(ibuf)) { - return imb_savehdr(ibuf, naam, flags); + return imb_savehdr(ibuf, name, flags); } if (IS_png(ibuf)) { - return imb_savepng(ibuf,naam,flags); + return imb_savepng(ibuf, name, flags); } if (IS_bmp(ibuf)) { - return imb_savebmp(ibuf,naam,flags); + return imb_savebmp(ibuf, name, flags); } if (IS_tga(ibuf)) { - return imb_savetarga(ibuf,naam,flags); + return imb_savetarga(ibuf, name, flags); } if (IS_iris(ibuf)) { - return imb_saveiris(ibuf,naam,flags); + return imb_saveiris(ibuf, name, flags); } if (G.have_libtiff && IS_tiff(ibuf)) { - return imb_savetiff(ibuf,naam,flags); + return imb_savetiff(ibuf, name, flags); + } +#ifdef WITH_OPENEXR + if (IS_openexr(ibuf)) { + return imb_save_openexr_half(ibuf, name, flags); } +#endif - file = open(naam, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); + file = open(name, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); if (file < 0) return (FALSE); if (flags & IB_rect){ @@ -103,7 +111,6 @@ short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags) } /* Put formats that take a filehandle here */ - ok = imb_start_iff(ibuf,file); if (IS_amiga(ibuf)){ IMB_flipy(ibuf); diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index 6e6815dd41f..86f57d4455e 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -141,26 +141,26 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_VIEWBUTS 1100 #define B_LOADBGPIC 1001 -#define B_BLENDBGPIC 1002 -#define B_BGPICBROWSE 1003 +#define B_BLENDBGPIC 1002 +#define B_BGPICBROWSE 1003 #define B_BGPICTEX 1004 -#define B_BGPICCLEAR 1005 -#define B_BGPICTEXCLEAR 1006 +#define B_BGPICCLEAR 1005 +#define B_BGPICTEXCLEAR 1006 #define B_OBJECTPANELROT 1007 -#define B_OBJECTPANELMEDIAN 1008 +#define B_OBJECTPANELMEDIAN 1008 #define B_ARMATUREPANEL1 1009 #define B_ARMATUREPANEL2 1010 -#define B_OBJECTPANELPARENT 1011 +#define B_OBJECTPANELPARENT 1011 #define B_OBJECTPANEL 1012 #define B_ARMATUREPANEL3 1013 /* *********************** */ #define B_LAMPBUTS 1200 -#define B_LAMPREDRAW 1101 +#define B_LAMPREDRAW 1101 #define B_COLLAMP 1102 -#define B_TEXCLEARLAMP 1103 +#define B_TEXCLEARLAMP 1103 #define B_SBUFF 1104 #define B_SHADBUF 1105 #define B_SHADRAY 1106 @@ -289,7 +289,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_PR_PAL169 1612 #define B_PR_D2MAC 1613 #define B_PR_MPEG 1614 -#define B_REDRAWDISP 1615 +#define B_REDRAWDISP 1615 #define B_SETBROWSE 1616 #define B_CLEARSET 1617 #define B_PR_PRESET 1618 @@ -297,32 +297,33 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_PR_NTSC 1620 #define B_IS_FTYPE 1622 -#define B_IS_BACKBUF 1623 +#define B_IS_BACKBUF 1623 #define B_PR_PC 1624 -#define B_PR_PANO360 1627 -#define B_PR_HALFFIELDS 1628 -#define B_NEWRENDERPIPE 1629 -#define B_R_SCALE 1630 -#define B_G_SCALE 1631 -#define B_B_SCALE 1632 -#define B_USE_R_SCALE 1633 -#define B_USE_G_SCALE 1634 -#define B_USE_B_SCALE 1635 -#define B_EDGECOLSLI 1636 -#define B_GAMMASLI 1637 - -#define B_FILETYPEMENU 1638 -#define B_SELECTCODEC 1639 +#define B_PR_PANO360 1627 +#define B_PR_HALFFIELDS 1628 +#define B_NEWRENDERPIPE 1629 +#define B_R_SCALE 1630 +#define B_G_SCALE 1631 +#define B_B_SCALE 1632 +#define B_USE_R_SCALE 1633 +#define B_USE_G_SCALE 1634 +#define B_USE_B_SCALE 1635 +#define B_EDGECOLSLI 1636 +#define B_GAMMASLI 1637 + +#define B_FILETYPEMENU 1638 +#define B_SELECTCODEC 1639 #define B_RTCHANGED 1640 -#define B_SWITCHRENDER 1641 +#define B_SWITCHRENDER 1641 #define B_FBUF_REDO 1642 #define B_SET_EDGE 1643 #define B_SET_ZBLUR 1644 +#define B_SET_OPENEXR 1645 /* *********************** */ -#define B_ARMATUREBUTS 1800 +#define B_ARMATUREBUTS 1800 #define B_POSE 1701 /* *********************** */ @@ -342,7 +343,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_SETSOLID 2013 #define B_AUTOTEX 2014 #define B_DOCENTRE 2015 -#define B_DOCENTRENEW 2016 +#define B_DOCENTRENEW 2016 #define B_DOCENTRECURSOR 2017 /* 20 values! */ @@ -367,43 +368,43 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_SPLIT 2056 #define B_REMDOUB 2057 #define B_SUBDIV 2058 -#define B_FRACSUBDIV 2059 +#define B_FRACSUBDIV 2059 #define B_XSORT 2060 #define B_HASH 2061 #define B_DELSTICKY 2062 -#define B_DELVERTCOL 2063 -#define B_MAKE_TFACES 2064 +#define B_DELVERTCOL 2063 +#define B_MAKE_TFACES 2064 #define B_TOSPHERE 2065 -#define B_DEL_TFACES 2066 +#define B_DEL_TFACES 2066 #define B_NEWVGROUP 2067 #define B_DELVGROUP 2068 -#define B_ASSIGNVGROUP 2069 -#define B_REMOVEVGROUP 2070 +#define B_ASSIGNVGROUP 2069 +#define B_REMOVEVGROUP 2070 #define B_SELVGROUP 2071 -#define B_DESELVGROUP 2072 -#define B_DECIM_FACES 2073 -#define B_DECIM_CANCEL 2074 -#define B_DECIM_APPLY 2075 -#define B_AUTOVGROUP 2076 -#define B_SLOWERDRAW 2077 -#define B_FASTERDRAW 2078 -#define B_VERTEXNOISE 2079 -#define B_VERTEXSMOOTH 2080 -#define B_MAKESTICKY 2082 -#define B_MAKEVERTCOL 2083 -#define B_CHROMADEPTH 2084 +#define B_DESELVGROUP 2072 +#define B_DECIM_FACES 2073 +#define B_DECIM_CANCEL 2074 +#define B_DECIM_APPLY 2075 +#define B_AUTOVGROUP 2076 +#define B_SLOWERDRAW 2077 +#define B_FASTERDRAW 2078 +#define B_VERTEXNOISE 2079 +#define B_VERTEXSMOOTH 2080 +#define B_MAKESTICKY 2082 +#define B_MAKEVERTCOL 2083 +#define B_CHROMADEPTH 2084 #define B_DRAWEDGES 2087 -#define B_DRAWCREASES 2088 -#define B_LINKEDVGROUP 2089 +#define B_DRAWCREASES 2088 +#define B_LINKEDVGROUP 2089 /* *********************** */ #define B_CURVEBUTS 2200 -#define B_CONVERTPOLY 2101 -#define B_CONVERTBEZ 2102 -#define B_CONVERTBSPL 2103 -#define B_CONVERTCARD 2104 -#define B_CONVERTNURB 2105 +#define B_CONVERTPOLY 2101 +#define B_CONVERTBEZ 2102 +#define B_CONVERTBSPL 2103 +#define B_CONVERTCARD 2104 +#define B_CONVERTNURB 2105 #define B_UNIFU 2106 #define B_ENDPU 2107 #define B_BEZU 2108 @@ -416,12 +417,12 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_SETW3 2115 #define B_SETORDER 2116 #define B_MAKEDISP 2117 -#define B_SUBDIVCURVE 2118 +#define B_SUBDIVCURVE 2118 #define B_SPINNURB 2119 #define B_CU3D 2120 #define B_SETRESOLU 2121 #define B_SETW4 2122 -#define B_SUBSURFTYPE 2123 +#define B_SUBSURFTYPE 2123 /* *********************** */ #define B_FONTBUTS 2300 @@ -430,16 +431,16 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_TOUPPER 2202 #define B_SETFONT 2203 #define B_LOADFONT 2204 -#define B_TEXTONCURVE 2205 +#define B_TEXTONCURVE 2205 #define B_PACKFONT 2206 -#define B_LOAD3DTEXT 2207 +#define B_LOAD3DTEXT 2207 #define B_LOREM 2208 #define B_FASTFONT 2209 #define B_INSTB 2210 #define B_DELTB 2211 -#define B_STYLETOSELB 2212 -#define B_STYLETOSELU 2213 -#define B_STYLETOSELI 2214 +#define B_STYLETOSELB 2212 +#define B_STYLETOSELU 2213 +#define B_STYLETOSELI 2214 #define B_SETCHAR 2215 #define B_SETUPCHAR 2216 @@ -459,106 +460,106 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la /* *********************** */ #define B_MBALLBUTS 2600 -#define B_RECALCMBALL 2501 +#define B_RECALCMBALL 2501 /* *********************** */ #define B_LATTBUTS 2700 #define B_RESIZELAT 2601 #define B_DRAWLAT 2602 -#define B_LATTCHANGED 2603 -#define B_REGULARLAT 2604 +#define B_LATTCHANGED 2603 +#define B_REGULARLAT 2604 /* *********************** */ #define B_GAMEBUTS 2800 #define B_ADD_PROP 2701 -#define B_CHANGE_PROP 2702 +#define B_CHANGE_PROP 2702 #define B_ADD_SENS 2703 -#define B_CHANGE_SENS 2704 +#define B_CHANGE_SENS 2704 #define B_DEL_SENS 2705 #define B_ADD_CONT 2706 -#define B_CHANGE_CONT 2707 +#define B_CHANGE_CONT 2707 #define B_DEL_CONT 2708 #define B_ADD_ACT 2709 -#define B_CHANGE_ACT 2710 +#define B_CHANGE_ACT 2710 #define B_DEL_ACT 2711 #define B_SOUNDACT_BROWSE 2712 -#define B_SETSECTOR 2713 -#define B_SETPROP 2714 -#define B_SETACTOR 2715 +#define B_SETSECTOR 2713 +#define B_SETPROP 2714 +#define B_SETACTOR 2715 #define B_SETMAINACTOR 2716 -#define B_SETDYNA 2717 +#define B_SETDYNA 2717 /* *********************** */ -#define B_FPAINTBUTS 2900 +#define B_FPAINTBUTS 2900 #define B_VPCOLSLI 2801 #define B_VPGAMMA 2802 -#define B_COPY_TF_MODE 2804 -#define B_COPY_TF_UV 2805 -#define B_COPY_TF_COL 2806 -#define B_REDR_3D_IMA 2807 +#define B_COPY_TF_MODE 2804 +#define B_COPY_TF_UV 2805 +#define B_COPY_TF_COL 2806 +#define B_REDR_3D_IMA 2807 #define B_SET_VCOL 2808 -#define B_COPY_TF_TEX 2814 -#define B_TFACE_HALO 2815 -#define B_TFACE_BILLB 2816 +#define B_COPY_TF_TEX 2814 +#define B_TFACE_HALO 2815 +#define B_TFACE_BILLB 2816 #define B_SHOWTEX 2832 -#define B_ASSIGNMESH 2833 +#define B_ASSIGNMESH 2833 -#define B_WEIGHT0_0 2840 -#define B_WEIGHT1_4 2841 -#define B_WEIGHT1_2 2842 -#define B_WEIGHT3_4 2843 -#define B_WEIGHT1_0 2844 +#define B_WEIGHT0_0 2840 +#define B_WEIGHT1_4 2841 +#define B_WEIGHT1_2 2842 +#define B_WEIGHT3_4 2843 +#define B_WEIGHT1_0 2844 -#define B_OPA1_8 2845 -#define B_OPA1_4 2846 -#define B_OPA1_2 2847 -#define B_OPA3_4 2848 -#define B_OPA1_0 2849 +#define B_OPA1_8 2845 +#define B_OPA1_4 2846 +#define B_OPA1_2 2847 +#define B_OPA3_4 2848 +#define B_OPA1_0 2849 -#define B_CLR_WPAINT 2850 +#define B_CLR_WPAINT 2850 /* *********************** */ #define B_RADIOBUTS 3000 #define B_RAD_GO 2901 #define B_RAD_INIT 2902 -#define B_RAD_LIMITS 2903 +#define B_RAD_LIMITS 2903 #define B_RAD_FAC 2904 -#define B_RAD_NODELIM 2905 -#define B_RAD_NODEFILT 2906 -#define B_RAD_FACEFILT 2907 +#define B_RAD_NODELIM 2905 +#define B_RAD_NODEFILT 2906 +#define B_RAD_FACEFILT 2907 #define B_RAD_ADD 2908 -#define B_RAD_DELETE 2909 -#define B_RAD_COLLECT 2910 -#define B_RAD_SHOOTP 2911 -#define B_RAD_SHOOTE 2912 -#define B_RAD_REPLACE 2913 +#define B_RAD_DELETE 2909 +#define B_RAD_COLLECT 2910 +#define B_RAD_SHOOTP 2911 +#define B_RAD_SHOOTE 2912 +#define B_RAD_REPLACE 2913 #define B_RAD_DRAW 2914 #define B_RAD_FREE 2915 -#define B_RAD_ADDMESH 2916 +#define B_RAD_ADDMESH 2916 /* *********************** */ -#define B_SCRIPTBUTS 3100 +#define B_SCRIPTBUTS 3100 -#define B_SCRIPT_ADD 3001 -#define B_SCRIPT_DEL 3002 -#define B_SCRIPT_TYPE 3003 +#define B_SCRIPT_ADD 3001 +#define B_SCRIPT_DEL 3002 +#define B_SCRIPT_TYPE 3003 /* Scene script buttons */ -#define B_SSCRIPT_ADD 3004 -#define B_SSCRIPT_DEL 3005 -#define B_SSCRIPT_TYPE 3006 +#define B_SSCRIPT_ADD 3004 +#define B_SSCRIPT_DEL 3005 +#define B_SSCRIPT_TYPE 3006 /* *********************** */ #define B_SOUNDBUTS 3200 @@ -629,37 +630,32 @@ enum { B_UVAUTO_LSCM }; -#define B_EFFECTSBUTS 3500 +#define B_EFFECTSBUTS 3500 -#define B_AUTOTIMEOFS 3403 +#define B_AUTOTIMEOFS 3403 #define B_FRAMEMAP 3404 #define B_NEWEFFECT 3405 -#define B_PREVEFFECT 3406 -#define B_NEXTEFFECT 3407 -#define B_CHANGEEFFECT 3408 -#define B_CALCEFFECT 3409 +#define B_PREVEFFECT 3406 +#define B_NEXTEFFECT 3407 +#define B_CHANGEEFFECT 3408 +#define B_CALCEFFECT 3409 #define B_DELEFFECT 3410 #define B_RECALCAL 3411 -#define B_RECALC_DEFL 3412 -#define B_EFFECT_DEP 3413 +#define B_RECALC_DEFL 3412 +#define B_EFFECT_DEP 3413 #define B_FIELD_DEP 3414 -#define B_FIELD_CHANGE 3415 -#define B_PAF_SET_VG 3416 -#define B_PAF_SET_VG1 3417 +#define B_FIELD_CHANGE 3415 +#define B_PAF_SET_VG 3416 +#define B_PAF_SET_VG1 3417 #define B_MODIFIER_BUTS 3600 #define B_MODIFIER_RECALC 3501 #define B_MODIFIER_REDRAW 3502 - -/* *********************** */ - /* *********************** */ /* BUTTON BUT: > 4000 */ /* BUTTON 4001-4032: layers */ - - #endif diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 968aa6abe56..e2067f7dfdd 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -405,6 +405,7 @@ typedef struct Scene { #define R_BMP 20 #define R_RADHDR 21 #define R_TIFF 22 +#define R_OPENEXR 23 /* **************** SCENE ********************* */ #define RAD_PHASE_PATCHES 1 diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index c728c51038d..7c962ff1328 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -37,10 +37,6 @@ #include <math.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - /* external modules: */ #include "MEM_guardedalloc.h" #include "BLI_arithb.h" @@ -168,18 +164,18 @@ static void envmap_split_ima(EnvMap *env) ima->ok= 1; env->cube[part]= ima; } - IMB_rectop(env->cube[0]->ibuf, env->ima->ibuf, - 0, 0, 0, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(env->cube[1]->ibuf, env->ima->ibuf, - 0, 0, dx, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(env->cube[2]->ibuf, env->ima->ibuf, - 0, 0, 2*dx, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(env->cube[3]->ibuf, env->ima->ibuf, - 0, 0, 0, dx, dx, dx, IMB_rectcpy, 0); - IMB_rectop(env->cube[4]->ibuf, env->ima->ibuf, - 0, 0, dx, dx, dx, dx, IMB_rectcpy, 0); - IMB_rectop(env->cube[5]->ibuf, env->ima->ibuf, - 0, 0, 2*dx, dx, dx, dx, IMB_rectcpy, 0); + IMB_rectcpy(env->cube[0]->ibuf, env->ima->ibuf, + 0, 0, 0, 0, dx, dx); + IMB_rectcpy(env->cube[1]->ibuf, env->ima->ibuf, + 0, 0, dx, 0, dx, dx); + IMB_rectcpy(env->cube[2]->ibuf, env->ima->ibuf, + 0, 0, 2*dx, 0, dx, dx); + IMB_rectcpy(env->cube[3]->ibuf, env->ima->ibuf, + 0, 0, 0, dx, dx, dx); + IMB_rectcpy(env->cube[4]->ibuf, env->ima->ibuf, + 0, 0, dx, dx, dx, dx); + IMB_rectcpy(env->cube[5]->ibuf, env->ima->ibuf, + 0, 0, 2*dx, dx, dx, dx); env->ok= 2; } } @@ -414,9 +410,12 @@ static void render_envmap(EnvMap *env) MTC_Mat4Invert(oldviewinv, R.viewmat); /* do first, envmap_renderdata copies entire R struct */ - if(R.rectz) MEM_freeN(R.rectz); R.rectz= NULL; - if(R.rectot) MEM_freeN(R.rectot); R.rectot= NULL; - if(R.rectftot) MEM_freeN(R.rectftot); R.rectftot= NULL; + if(R.rectz) MEM_freeN(R.rectz); + if(R.rectot) MEM_freeN(R.rectot); + if(R.rectftot) MEM_freeN(R.rectftot); + R.rectftot= NULL; + R.rectz= NULL; + R.rectot= NULL; /* setup necessary globals */ envmap_renderdata(env); @@ -478,9 +477,12 @@ static void render_envmap(EnvMap *env) } - if(R.rectz) MEM_freeN(R.rectz); R.rectz= NULL; - if(R.rectot) MEM_freeN(R.rectot); R.rectot= NULL; - if(R.rectftot) MEM_freeN(R.rectftot); R.rectftot= NULL; + if(R.rectz) MEM_freeN(R.rectz); + if(R.rectot) MEM_freeN(R.rectot); + if(R.rectftot) MEM_freeN(R.rectftot); + R.rectz= NULL; + R.rectot= NULL; + R.rectftot= NULL; if(RE_local_test_break()) RE_free_envmapdata(env); else { diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index ba9216fa80e..c0c175709e1 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -38,10 +38,6 @@ #include <string.h> #include <stdio.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "blendef.h" #include "MEM_guardedalloc.h" @@ -897,6 +893,7 @@ static void yafrayRender(void) /* float rgba buf */ if (R.rectftot) MEM_freeN(R.rectftot); if (R.r.mode & R_FBUF) R.rectftot= MEM_callocN(4*sizeof(float)*R.rectx*R.recty, "rectftot"); + else R.rectftot = NULL; // switch must be done before prepareScene() if (!R.r.YFexportxml) @@ -1054,6 +1051,7 @@ static void mainRenderLoop(void) /* here the PART and FIELD loops */ if(R.rectftot) MEM_freeN(R.rectftot); if(R.r.mode & R_FBUF) R.rectftot= MEM_callocN(4*sizeof(float)*R.rectx*R.recty, "rectftot"); + else R.rectftot = NULL; if(R.r.mode & R_MBLUR) { RE_local_printrenderinfo(0.0, R.osa - blur); diff --git a/source/blender/src/Makefile b/source/blender/src/Makefile index f0728897d47..f89f8965fd5 100644 --- a/source/blender/src/Makefile +++ b/source/blender/src/Makefile @@ -112,6 +112,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 7f565a9317c..55450005793 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -979,14 +979,19 @@ static char *imagetype_pup(void) "HamX", R_HAMX, "Iris", R_IRIS, "Iris + Zbuffer", R_IRIZ, - "Radiance HDR", R_RADHDR, + "Radiance HDR", R_RADHDR #ifdef __sgi - "Movie", R_MOVIE, + ,"Movie", R_MOVIE #endif - "Ftype", R_FTYPE ); } +#ifdef WITH_OPENEXR + strcpy(formatstring, "|%s %%x%d"); + sprintf(appendstring, formatstring, "OpenEXR", R_OPENEXR); + strcat(string, appendstring); +#endif + if (G.have_libtiff) { strcpy(formatstring, "|%s %%x%d"); sprintf(appendstring, formatstring, "TIFF", R_TIFF); @@ -1252,7 +1257,14 @@ static void render_panel_format(void) #endif uiDefBut(block, BUT,B_SELECTCODEC, "Set codec", 892,yofs,112,20, 0, 0, 0, 0, 0, "Set codec settings for AVI"); } +#ifdef WITH_OPENEXR + } else if (G.scene->r.imtype == R_OPENEXR ) { + if (G.scene->r.quality > 5) G.scene->r.quality = 0; + uiDefButS(block, MENU,B_SET_OPENEXR, "Codec %t|None %x0|Pxr24 (lossy) %x1|ZIP (lossless) %x2|PIZ (lossless) %x3|RLE (lossless) %x4", 892,yofs,112,20, &G.scene->r.quality, 0, 0, 0, 0, "Set codec settings for OpenEXR"); +#endif } else { + if(G.scene->r.quality < 5) G.scene->r.quality = 90; // temp + uiDefButS(block, NUM,B_DIFF, "Quality:", 892,yofs,112,20, &G.scene->r.quality, 10.0, 100.0, 0, 0, "Quality setting for JPEG images, AVI Jpeg and SGI movies"); } uiDefButS(block, NUM,B_FRAMEMAP,"Frs/sec:", 1006,yofs,113,20, &G.scene->r.frs_sec, 1.0, 120.0, 100.0, 0, "Frames per second"); diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c index 787b6a6471a..11179467a2f 100644 --- a/source/blender/src/editface.c +++ b/source/blender/src/editface.c @@ -34,10 +34,6 @@ #include <math.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" @@ -1023,7 +1019,8 @@ void face_borderselect() Mesh *me; TFace *tface; rcti rect; - unsigned int *rectm, *rt; + struct ImBuf *ibuf; + unsigned int *rt; int a, sx, sy, index, val; char *selar; @@ -1046,9 +1043,10 @@ void face_borderselect() sy= (rect.ymax-rect.ymin+1); if(sx*sy<=0) return; - rt=rectm= MEM_mallocN(sizeof(int)*sx*sy, "selrect"); - glReadPixels(rect.xmin+curarea->winrct.xmin, rect.ymin+curarea->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE, rectm); - if(G.order==B_ENDIAN) IMB_convert_rgba_to_abgr(sx*sy, rectm); + ibuf = IMB_allocImBuf(sx,sy,32,0,0); + rt = ibuf->rect; + glReadPixels(rect.xmin+curarea->winrct.xmin, rect.ymin+curarea->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); + if(G.order==B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); a= sx*sy; while(a--) { @@ -1070,7 +1068,7 @@ void face_borderselect() } } - MEM_freeN(rectm); + IMB_freeImBuf(ibuf); MEM_freeN(selar); BIF_undo_push("Border Select UV face"); diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index 8cefaf4221b..4fc0eb7f293 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -40,10 +40,6 @@ editmesh_mods.c, UI level access, no geometry changes #include <string.h> #include <math.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "MTC_matrixops.h" @@ -92,6 +88,7 @@ editmesh_mods.c, UI level access, no geometry changes #include "BSE_edit.h" #include "BSE_view.h" +#include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "mydevice.h" @@ -155,11 +152,12 @@ static unsigned int sample_backbuf(int x, int y) } /* reads full rect, converts indices */ -static unsigned int *read_backbuf(short xmin, short ymin, short xmax, short ymax) +struct ImBuf *read_backbuf(short xmin, short ymin, short xmax, short ymax) { - unsigned int *dr, *buf; + unsigned int *dr, *rd; + struct ImBuf *ibuf, *ibuf1; int a; - short xminc, yminc, xmaxc, ymaxc; + short xminc, yminc, xmaxc, ymaxc, xs, ys; /* clip */ if(xmin<0) xminc= 0; else xminc= xmin; @@ -170,55 +168,49 @@ static unsigned int *read_backbuf(short xmin, short ymin, short xmax, short ymax if(ymax>=curarea->winy) ymaxc= curarea->winy-1; else ymaxc= ymax; if(yminc > ymaxc) return NULL; - buf= MEM_mallocN( (xmaxc-xminc+1)*(ymaxc-yminc+1)*sizeof(int), "sample rect"); + ibuf= IMB_allocImBuf((xmaxc-xminc+1),(ymaxc-yminc+1),32,IB_rect,0); check_backbuf(); // actually not needed for apple #ifdef __APPLE__ glReadBuffer(GL_AUX0); #endif - glReadPixels(curarea->winrct.xmin+xminc, curarea->winrct.ymin+yminc, (xmaxc-xminc+1), (ymaxc-yminc+1), GL_RGBA, GL_UNSIGNED_BYTE, buf); + glReadPixels(curarea->winrct.xmin+xminc, curarea->winrct.ymin+yminc, (xmaxc-xminc+1), (ymaxc-yminc+1), GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); glReadBuffer(GL_BACK); - if(G.order==B_ENDIAN) IMB_convert_rgba_to_abgr((xmaxc-xminc+1)*(ymaxc-yminc+1), buf); + if(G.order==B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); a= (xmaxc-xminc+1)*(ymaxc-yminc+1); - dr= buf; + dr= ibuf->rect; while(a--) { if(*dr) *dr= framebuffer_to_index(*dr); dr++; } /* put clipped result back, if needed */ - if(xminc==xmin && xmaxc==xmax && yminc==ymin && ymaxc==ymax) return buf; - else { - unsigned int *buf1= MEM_callocN( (xmax-xmin+1)*(ymax-ymin+1)*sizeof(int), "sample rect2"); - unsigned int *rd; - short xs, ys; - - rd= buf; - dr= buf1; + if(xminc==xmin && xmaxc==xmax && yminc==ymin && ymaxc==ymax) return ibuf; + ibuf1= IMB_allocImBuf( (xmax-xmin+1),(ymax-ymin+1),32,IB_rect,0); + rd= ibuf->rect; + dr= ibuf1->rect; - for(ys= ymin; ys<=ymax; ys++) { - for(xs= xmin; xs<=xmax; xs++, dr++) { - if( xs>=xminc && xs<=xmaxc && ys>=yminc && ys<=ymaxc) { - *dr= *rd; - rd++; - } + for(ys= ymin; ys<=ymax; ys++) { + for(xs= xmin; xs<=xmax; xs++, dr++) { + if( xs>=xminc && xs<=xmaxc && ys>=yminc && ys<=ymaxc) { + *dr= *rd; + rd++; } } - MEM_freeN(buf); - return buf1; } - - return buf; + IMB_freeImBuf(ibuf); + return ibuf1; } /* smart function to sample a rect spiralling outside, nice for backbuf selection */ static unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, short *dist) { - unsigned int *buf, *bufmin, *bufmax; + struct ImBuf *buf; + unsigned int *bufmin, *bufmax, *tbuf; int minx, miny; int a, b, rc, nr, amount, dirvec[4][2]; short distance=0; @@ -229,8 +221,7 @@ static unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int mi minx = mval[0]-(amount+1); miny = mval[1]-(amount+1); buf = read_backbuf(minx, miny, minx+size-1, miny+size-1); - if (!buf) - return 0; + if (!buf) return 0; rc= 0; @@ -239,23 +230,24 @@ static unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int mi dirvec[2][0]= -1; dirvec[2][1]= 0; dirvec[3][0]= 0; dirvec[3][1]= size; - bufmin= buf; - bufmax= buf+ size*size; - buf+= amount*size+ amount; + bufmin = buf->rect; + tbuf = buf->rect; + bufmax = buf->rect + size*size; + tbuf+= amount*size+ amount; for(nr=1; nr<=size; nr++) { for(a=0; a<2; a++) { for(b=0; b<nr; b++, distance++) { - if (*buf && *buf>=min && *buf<max) { + if (*tbuf && *tbuf>=min && *tbuf<max) { *dist= (short) sqrt( (float)distance ); // XXX, this distance is wrong - zr - index = *buf - min+1; // messy yah, but indices start at 1 + index = *tbuf - min+1; // messy yah, but indices start at 1 goto exit; } - buf+= (dirvec[rc][0]+dirvec[rc][1]); + tbuf+= (dirvec[rc][0]+dirvec[rc][1]); - if(buf<bufmin || buf>=bufmax) { + if(tbuf<bufmin || tbuf>=bufmax) { goto exit; } } @@ -265,7 +257,7 @@ static unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int mi } exit: - MEM_freeN(bufmin); + IMB_freeImBuf(buf); return index; } @@ -322,14 +314,17 @@ static void draw_triangulated(short mcords[][2], short tot) /* returns if all is OK */ int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax) { - unsigned int *buf, *dr; + struct ImBuf *buf; + unsigned int *dr; int a; if(G.obedit==NULL || G.vd->drawtype<OB_SOLID || (G.vd->flag & V3D_ZBUF_SELECT)==0) return 0; if(em_vertoffs==0) return 0; - dr= buf= read_backbuf(xmin, ymin, xmax, ymax); + buf= read_backbuf(xmin, ymin, xmax, ymax); if(buf==NULL) return 0; + + dr = buf->rect; /* build selection lookup */ selbuf= MEM_callocN(em_vertoffs+1, "selbuf"); @@ -340,7 +335,7 @@ int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax) selbuf[*dr]= 1; dr++; } - MEM_freeN(buf); + IMB_freeImBuf(buf); return 1; } @@ -366,7 +361,8 @@ void EM_free_backbuf(void) */ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax) { - unsigned int *buf, *bufmask, *dr, *drm; + unsigned int *dr, *drm; + struct ImBuf *buf, *bufmask; int a; /* method in use for face selecting too */ @@ -378,9 +374,11 @@ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short if(em_vertoffs==0) return 0; - dr= buf= read_backbuf(xmin, ymin, xmax, ymax); + buf= read_backbuf(xmin, ymin, xmax, ymax); if(buf==NULL) return 0; + dr = buf->rect; + /* draw the mask */ #ifdef __APPLE__ glDrawBuffer(GL_AUX0); @@ -403,7 +401,8 @@ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short glDrawBuffer(GL_BACK); /* grab mask */ - drm= bufmask= read_backbuf(xmin, ymin, xmax, ymax); + bufmask= read_backbuf(xmin, ymin, xmax, ymax); + drm = bufmask->rect; if(bufmask==NULL) return 0; // only when mem alloc fails, go crash somewhere else! /* build selection lookup */ @@ -414,8 +413,8 @@ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short if(*dr>0 && *dr<=em_vertoffs && *drm==0) selbuf[*dr]= 1; dr++; drm++; } - MEM_freeN(buf); - MEM_freeN(bufmask); + IMB_freeImBuf(buf); + IMB_freeImBuf(bufmask); return 1; } @@ -423,7 +422,8 @@ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short /* circle shaped sample area */ int EM_init_backbuf_circle(short xs, short ys, short rads) { - unsigned int *buf, *dr; + struct ImBuf *buf; + unsigned int *dr; short xmin, ymin, xmax, ymax, xc, yc; int radsq; @@ -437,8 +437,10 @@ int EM_init_backbuf_circle(short xs, short ys, short rads) xmin= xs-rads; xmax= xs+rads; ymin= ys-rads; ymax= ys+rads; - dr= buf= read_backbuf(xmin, ymin, xmax, ymax); + buf= read_backbuf(xmin, ymin, xmax, ymax); if(buf==NULL) return 0; + + dr = buf->rect; /* build selection lookup */ selbuf= MEM_callocN(em_vertoffs+1, "selbuf"); @@ -451,7 +453,7 @@ int EM_init_backbuf_circle(short xs, short ys, short rads) } } - MEM_freeN(buf); + IMB_freeImBuf(buf); return 1; } diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c index ae986cc7789..07d85d48160 100644 --- a/source/blender/src/filesel.c +++ b/source/blender/src/filesel.c @@ -502,10 +502,13 @@ void test_flags_file(SpaceFile *sfile) (BLI_testextensie(file->relname, ".tif") || BLI_testextensie(file->relname, ".tiff"))) { file->flags |= IMAGEFILE; + } else if (BLI_testextensie(file->relname, ".exr")) { + file->flags |= IMAGEFILE; } else if (G.have_quicktime){ if( BLI_testextensie(file->relname, ".jpg") || BLI_testextensie(file->relname, ".jpeg") || BLI_testextensie(file->relname, ".hdr") + || BLI_testextensie(file->relname, ".exr") || BLI_testextensie(file->relname, ".tga") || BLI_testextensie(file->relname, ".rgb") || BLI_testextensie(file->relname, ".bmp") @@ -532,7 +535,8 @@ void test_flags_file(SpaceFile *sfile) } } else { // no quicktime if(BLI_testextensie(file->relname, ".jpg") - || BLI_testextensie(file->relname, ".hdr") + || BLI_testextensie(file->relname, ".hdr") + || BLI_testextensie(file->relname, ".exr") || BLI_testextensie(file->relname, ".tga") || BLI_testextensie(file->relname, ".rgb") || BLI_testextensie(file->relname, ".bmp") diff --git a/source/blender/src/imasel.c b/source/blender/src/imasel.c index c39fe83954e..6c232ea6464 100644 --- a/source/blender/src/imasel.c +++ b/source/blender/src/imasel.c @@ -34,10 +34,6 @@ #include <stdlib.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifndef WIN32 #include <unistd.h> #else @@ -538,7 +534,7 @@ void get_next_image(SpaceImaSel *simasel) /* the whole cmap system is wacko */ if (G.order==B_ENDIAN) - IMB_convert_rgba_to_abgr(ima->dw*ima->dh, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); ibuf->mincol = 0; ibuf->maxcol = 256; @@ -555,7 +551,7 @@ void get_next_image(SpaceImaSel *simasel) longtochar(ima->pict_rect, ibuf->rect, size); IMB_applycmap(ibuf); - IMB_convert_rgba_to_abgr(size, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); if (ima->pict) IMB_freeImBuf(ima->pict); ima->pict = ibuf; @@ -797,7 +793,7 @@ void get_pib_file(SpaceImaSel *simasel) ima->pict->cmap = simasel->cmap->cmap; ima->pict->maxcol = 256; IMB_applycmap(ima->pict); - IMB_convert_rgba_to_abgr(size, ima->pict->rect); + IMB_convert_rgba_to_abgr(ima->pict); } ima->selected = 0; ima->selectable = 0; diff --git a/source/blender/src/interface_icons.c b/source/blender/src/interface_icons.c index d245e0e1427..dc487ae72fe 100644 --- a/source/blender/src/interface_icons.c +++ b/source/blender/src/interface_icons.c @@ -733,8 +733,11 @@ void BIF_icon_draw(float x, float y, int icon_id) ui_rasterpos_safe(x, y, di->aspect); + if(di->w<1 || di->h<1) { + printf("what the heck!\n"); + } /* di->rect contains image in 'rendersize', we only scale if needed */ - if(di->rw!=di->w && di->rh!=di->h) { + else if(di->rw!=di->w && di->rh!=di->h) { ImBuf *ima; /* first allocate imbuf for scaling and copy preview into it */ ima = IMB_allocImBuf(di->rw, di->rh, 32, IB_rect, 0); diff --git a/source/blender/src/screendump.c b/source/blender/src/screendump.c index ebc5bad88c6..cd51f1fdb0f 100644 --- a/source/blender/src/screendump.c +++ b/source/blender/src/screendump.c @@ -87,6 +87,9 @@ void write_screendump(char *name) else if(G.scene->r.imtype==R_PNG) ibuf->ftype= PNG; else if((G.have_libtiff) && (G.scene->r.imtype==R_TIFF)) ibuf->ftype= TIF; +#ifdef WITH_OPENEXR + else if(G.scene->r.imtype==R_OPENEXR) ibuf->ftype= OPENEXR; +#endif else if(G.scene->r.imtype==R_HAMX) ibuf->ftype= AN_hamx; else if(ELEM5(G.scene->r.imtype, R_MOVIE, R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90)) { ibuf->ftype= JPG|G.scene->r.quality; diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c index 17b6e4d90b0..3191ec1095b 100644 --- a/source/blender/src/sequence.c +++ b/source/blender/src/sequence.c @@ -34,10 +34,6 @@ #include <math.h> #include <stdlib.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "PIL_dynlib.h" @@ -1655,19 +1651,19 @@ void do_effect(int cfra, Sequence *seq, StripElem *se) if(cp) strncpy(cp, seq->name+2, 22); if (seq->plugin->version<=2) { - if(se1->ibuf) IMB_convert_rgba_to_abgr(se1->ibuf->x*se1->ibuf->y, se1->ibuf->rect); - if(se2->ibuf) IMB_convert_rgba_to_abgr(se2->ibuf->x*se2->ibuf->y, se2->ibuf->rect); - if(se3->ibuf) IMB_convert_rgba_to_abgr(se3->ibuf->x*se3->ibuf->y, se3->ibuf->rect); + if(se1->ibuf) IMB_convert_rgba_to_abgr(se1->ibuf); + if(se2->ibuf) IMB_convert_rgba_to_abgr(se2->ibuf); + if(se3->ibuf) IMB_convert_rgba_to_abgr(se3->ibuf); } ((SeqDoit)seq->plugin->doit)(seq->plugin->data, fac, facf, x, y, se1->ibuf, se2->ibuf, se->ibuf, se3->ibuf); if (seq->plugin->version<=2) { - if(se1->ibuf) IMB_convert_rgba_to_abgr(se1->ibuf->x*se1->ibuf->y, se1->ibuf->rect); - if(se2->ibuf) IMB_convert_rgba_to_abgr(se2->ibuf->x*se2->ibuf->y, se2->ibuf->rect); - if(se3->ibuf) IMB_convert_rgba_to_abgr(se3->ibuf->x*se3->ibuf->y, se3->ibuf->rect); - IMB_convert_rgba_to_abgr(se->ibuf->x*se->ibuf->y, se->ibuf->rect); + if(se1->ibuf) IMB_convert_rgba_to_abgr(se1->ibuf); + if(se2->ibuf) IMB_convert_rgba_to_abgr(se2->ibuf); + if(se3->ibuf) IMB_convert_rgba_to_abgr(se3->ibuf); + IMB_convert_rgba_to_abgr(se->ibuf); } if((G.f & G_PLAYANIM)==0) waitcursor(0); diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c index acceccafe60..8fc3f740a0b 100644 --- a/source/blender/src/toets.c +++ b/source/blender/src/toets.c @@ -147,13 +147,6 @@ void schrijfplaatje(char *name) unsigned int *temprect=0; char str[FILE_MAXDIR+FILE_MAXFILE]; - /* radhdr: temporary call for direct float buffer save for HDR format */ - if ((R.r.imtype==R_RADHDR) && (R.rectftot)) - { - imb_savehdr_fromfloat(R.rectftot, name, R.rectx, R.recty); - return; - } - /* has RGBA been set? If so: use alpha channel for color zero */ IMB_alpha_to_col0(FALSE); @@ -188,7 +181,7 @@ void schrijfplaatje(char *name) if(ibuf) { ibuf->rect= (unsigned int *) R.rectot; -// ibuf->rect_float = R.rectftot; + ibuf->rect_float = R.rectftot; if(R.r.planes == 8) IMB_cspace(ibuf, rgb_to_bw); @@ -205,8 +198,6 @@ void schrijfplaatje(char *name) } } else if(R.r.imtype==R_RADHDR) { - /* radhdr: save hdr from rgba buffer, not really recommended, probably mistake, so warn user */ - error("Will save, but you might want to enable the floatbuffer to save a real HDRI..."); ibuf->ftype= RADHDR; } else if(R.r.imtype==R_PNG) { @@ -218,6 +209,11 @@ void schrijfplaatje(char *name) else if((G.have_libtiff) && (R.r.imtype==R_TIFF)) { ibuf->ftype= TIF; } +#ifdef WITH_OPENEXR + else if(R.r.imtype==R_OPENEXR) { + ibuf->ftype= OPENEXR; + } +#endif else if((R.r.imtype==R_TARGA) || (R.r.imtype==R_PNG)) { ibuf->ftype= TGA; } @@ -500,6 +496,10 @@ int save_image_filesel_str(char *str) if (G.have_libtiff) { strcpy(str, "Save TIFF"); return 1; } +#ifdef WITH_OPENEXR + case R_OPENEXR: + strcpy(str, "Save OpenEXR"); return 1; +#endif case R_TARGA: strcpy(str, "Save Targa"); return 1; case R_RAWTGA: diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c index ad62f6c0dc0..836c98bdb22 100644 --- a/source/blender/src/vpaint.c +++ b/source/blender/src/vpaint.c @@ -33,10 +33,6 @@ #include <math.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifdef WIN32 #include <io.h> #else @@ -46,6 +42,7 @@ #include "MEM_guardedalloc.h" #include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" #include "BLI_blenlib.h" #include "BLI_arithb.h" @@ -599,7 +596,8 @@ static void vpaint_blend( unsigned int *col, unsigned int *colorig, unsigned int static int sample_backbuf_area(int x, int y, float size) { - unsigned int rect[129*129], *rt; + unsigned int *rt; + struct ImBuf *ibuf; int x1, y1, x2, y2, a, tot=0, index; if(totvpaintundo>=MAXINDEX) return 0; @@ -617,12 +615,15 @@ static int sample_backbuf_area(int x, int y, float size) #ifdef __APPLE__ glReadBuffer(GL_AUX0); #endif - glReadPixels(x1+curarea->winrct.xmin, y1+curarea->winrct.ymin, x2-x1+1, y2-y1+1, GL_RGBA, GL_UNSIGNED_BYTE, rect); + ibuf = IMB_allocImBuf(size,size,32,IB_rect,0); + glReadPixels(x1+curarea->winrct.xmin, y1+curarea->winrct.ymin, x2-x1+1, y2-y1+1, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); glReadBuffer(GL_BACK); - if(G.order==B_ENDIAN) IMB_convert_rgba_to_abgr( (int)(4*size*size), rect); + if(G.order==B_ENDIAN) { + IMB_convert_rgba_to_abgr(ibuf); + } - rt= rect; + rt= ibuf->rect; size= (y2-y1)*(x2-x1); if(size<=0) return 0; @@ -642,6 +643,8 @@ static int sample_backbuf_area(int x, int y, float size) for(a=1; a<=totvpaintundo; a++) { if(indexar[a]) indexar[tot++]= a; } + + IMB_freeImBuf(ibuf); return tot; } diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c index f386ea3ecf0..4497ed51e81 100644 --- a/source/blender/src/writeimage.c +++ b/source/blender/src/writeimage.c @@ -63,6 +63,11 @@ int BIF_write_ibuf(ImBuf *ibuf, char *name) else if ((G.have_libtiff) && (G.scene->r.imtype==R_TIFF)) { ibuf->ftype= TIF; } +#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; @@ -105,18 +110,12 @@ void BIF_save_envmap(EnvMap *env, char *str) dx= env->cube[0]->ibuf->x; ibuf= IMB_allocImBuf(3*dx, 2*dx, 24, IB_rect, 0); - IMB_rectop(ibuf, env->cube[0]->ibuf, - 0, 0, 0, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(ibuf, env->cube[1]->ibuf, - dx, 0, 0, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(ibuf, env->cube[2]->ibuf, - 2*dx, 0, 0, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(ibuf, env->cube[3]->ibuf, - 0, dx, 0, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(ibuf, env->cube[4]->ibuf, - dx, dx, 0, 0, dx, dx, IMB_rectcpy, 0); - IMB_rectop(ibuf, env->cube[5]->ibuf, - 2*dx, dx, 0, 0, dx, dx, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, env->cube[0]->ibuf, 0, 0, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[1]->ibuf, dx, 0, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[2]->ibuf, 2*dx, 0, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[3]->ibuf, 0, dx, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[4]->ibuf, dx, dx, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[5]->ibuf, 2*dx, dx, 0, 0, dx, dx); BIF_write_ibuf(ibuf, str); IMB_freeImBuf(ibuf); diff --git a/source/blender/src/writemovie.c b/source/blender/src/writemovie.c index f27f7ffd7e3..2c80200f904 100644 --- a/source/blender/src/writemovie.c +++ b/source/blender/src/writemovie.c @@ -30,10 +30,6 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifdef __sgi #include <unistd.h> @@ -364,6 +360,7 @@ void append_movie(int cfra) char name[FILE_MAXDIR+FILE_MAXFILE]; const char *string; int fd; + float col[4] = {0.0,0.0,0.0,0.0}; set_sfra_efra(); make_movie_name(name); @@ -377,28 +374,28 @@ void append_movie(int cfra) if (ibuf->x != mv_outx || ibuf->y != mv_outy) { tbuf = IMB_allocImBuf(mv_outx, mv_outy, 32, IB_rect, 0); - IMB_rectoptot(tbuf, 0, IMB_rectfill, 0x00); + IMB_rectfill(tbuf,col); ofsx = (tbuf->x - ibuf->x) / 2; ofsy = (tbuf->y - ibuf->y) / 2; if (numfields == 2) ofsy &= ~1; - IMB_rectop(tbuf, ibuf, ofsx, ofsy, 0, 0, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(tbuf, ibuf, ofsx, ofsy, 0, 0, ibuf->x, ibuf->y); IMB_freeImBuf(ibuf); strcpy(tbuf->name, ibuf->name); ibuf = tbuf; } - IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect); + IMB_convert_rgba_to_abgr(ibuf); if (numfields == 2) { if (ntsc) { - IMB_rectop(ibuf, ibuf, 0, 0, 0, 1, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, ibuf, 0, 0, 0, 1, ibuf->x, ibuf->y); IMB_flipy(ibuf); IMB_de_interlace(ibuf); - if (ntsc) IMB_rectop(ibuf, ibuf, 0, 0, 0, 1, 32767, 32767, IMB_rectcpy, 0); + if (ntsc) IMB_rectcpy(ibuf, ibuf, 0, 0, 0, 1, ibuf->x, ibuf->y); } else { IMB_flipy(ibuf); - IMB_rectop(ibuf, ibuf, 0, 0, 0, 1, 32767, 32767, IMB_rectcpy, 0); + IMB_rectcpy(ibuf, ibuf, 0, 0, 0, 1, ibuf->x, ibuf->y); IMB_de_interlace(ibuf); } } |