From b12927ecb87b68387b7126283abf5bee7845cde4 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 21 Dec 2006 10:41:43 +0000 Subject: MultiLayer images: added support for choosing compression type. Without setting anything, it uses ZIP now as default, which gives the best lossless compression and works nice fast. --- source/blender/imbuf/intern/openexr/openexr_api.cpp | 6 +++--- source/blender/imbuf/intern/openexr/openexr_multi.h | 4 ++-- source/blender/render/extern/include/RE_pipeline.h | 2 +- source/blender/render/intern/source/pipeline.c | 6 +++--- source/blender/src/buttons_scene.c | 17 +++++++++-------- source/blender/src/editsima.c | 2 +- source/blender/src/writeimage.c | 2 +- 7 files changed, 20 insertions(+), 19 deletions(-) (limited to 'source') diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index 833008c3d7e..c035862c23f 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -173,7 +173,7 @@ static void openexr_header_compression(Header *header, int compression) header->compression() = RLE_COMPRESSION; break; default: - header->compression() = NO_COMPRESSION; + header->compression() = ZIP_COMPRESSION; break; } } @@ -430,7 +430,7 @@ void IMB_exr_add_channel(void *handle, const char *layname, const char *passname BLI_addtail(&data->channels, echan); } -void IMB_exr_begin_write(void *handle, char *filename, int width, int height) +void IMB_exr_begin_write(void *handle, char *filename, int width, int height, int compress) { ExrHandle *data= (ExrHandle *)handle; Header header (width, height); @@ -442,7 +442,7 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height) for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) header.channels().insert (echan->name, Channel (FLOAT)); - header.compression() = RLE_COMPRESSION; + openexr_header_compression(&header, compress); header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43")); diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h index feceb227e4b..b9aa81e81da 100644 --- a/source/blender/imbuf/intern/openexr/openexr_multi.h +++ b/source/blender/imbuf/intern/openexr/openexr_multi.h @@ -45,7 +45,7 @@ void * IMB_exr_get_handle (void); void IMB_exr_add_channel (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect); int IMB_exr_begin_read (void *handle, char *filename, int *width, int *height); -void IMB_exr_begin_write (void *handle, char *filename, int width, int height); +void IMB_exr_begin_write (void *handle, char *filename, int width, int height, int compress); void IMB_exrtile_begin_write (void *handle, char *filename, int width, int height, int tilex, int tiley); void IMB_exr_set_channel (void *handle, char *layname, char *passname, int xstride, int ystride, float *rect); @@ -69,7 +69,7 @@ void * IMB_exr_get_handle (void) {return NULL;} void IMB_exr_add_channel (void *handle, const char *layname, const char *channame, int xstride, int ystride, float *rect) {} int IMB_exr_begin_read (void *handle, char *filename, int *width, int *height) {return 0;} -void IMB_exr_begin_write (void *handle, char *filename, int width, int height) {} +void IMB_exr_begin_write (void *handle, char *filename, int width, int height, int compress) {} void IMB_exrtile_begin_write (void *handle, char *filename, int width, int height, int tilex, int tiley) {} void IMB_exr_set_channel (void *handle, char *layname, char *channame, int xstride, int ystride, float *rect) {} diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 72f266630c4..bd210501330 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -180,7 +180,7 @@ void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame); void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra); void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); -void RE_WriteRenderResult(RenderResult *rr, char *filename); +void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress); struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty); /* ancient stars function... go away! */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index e62d66a354d..0638423e7e7 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -694,7 +694,7 @@ static char *make_pass_name(RenderPass *rpass, int chan) /* filename already made absolute */ /* called from within UI, saves both rendered result as a file-read result */ -void RE_WriteRenderResult(RenderResult *rr, char *filename) +void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress) { RenderLayer *rl; RenderPass *rpass; @@ -733,7 +733,7 @@ void RE_WriteRenderResult(RenderResult *rr, char *filename) } } - IMB_exr_begin_write(exrhandle, filename, rr->rectx, rr->recty); + IMB_exr_begin_write(exrhandle, filename, rr->rectx, rr->recty, compress); IMB_exr_write_channels(exrhandle); IMB_exr_close(exrhandle); @@ -2175,7 +2175,7 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh) if(re->r.imtype==R_MULTILAYER) { if(re->result) { - RE_WriteRenderResult(re->result, name); + RE_WriteRenderResult(re->result, name, scene->r.quality); printf("Saved: %s", name); } } diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index e96bf44cd94..9a4d3514e9d 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -1540,15 +1540,16 @@ static void render_panel_format(void) } #ifdef WITH_OPENEXR } - else if (G.scene->r.imtype == R_OPENEXR ) { - if (G.scene->r.quality > 5) G.scene->r.quality = 0; - - uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_NOP,"Half", 892,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Use 16 bits float 'Half' type"); - uiDefButBitS(block, TOG, R_OPENEXR_ZBUF, B_NOP,"Zbuf", 952,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Save the zbuffer as 32 bits unsigned int"); - uiBlockEndAlign(block); - uiDefButBitS(block, TOG, R_PREVIEW_JPG, B_NOP,"Preview",1027,yofs+44,90,20, &G.scene->r.subimtype, 0, 0, 0, 0, "When animation render, save JPG preview images in same directory"); + else if (ELEM(G.scene->r.imtype, R_OPENEXR, R_MULTILAYER)) { + if (G.scene->r.quality > 5) G.scene->r.quality = 2; + if(G.scene->r.imtype==R_OPENEXR) { + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_NOP,"Half", 892,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Use 16 bits float 'Half' type"); + uiDefButBitS(block, TOG, R_OPENEXR_ZBUF, B_NOP,"Zbuf", 952,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Save the zbuffer as 32 bits unsigned int"); + uiBlockEndAlign(block); + uiDefButBitS(block, TOG, R_PREVIEW_JPG, B_NOP,"Preview",1027,yofs+44,90,20, &G.scene->r.subimtype, 0, 0, 0, 0, "When animation render, save JPG preview images in same directory"); + } uiDefButS(block, MENU,B_NOP, "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"); diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c index 21a74dc95d3..cb25f615414 100644 --- a/source/blender/src/editsima.c +++ b/source/blender/src/editsima.c @@ -1656,7 +1656,7 @@ static void save_image_doit(char *name) if(G.sima->imtypenr==R_MULTILAYER) { RenderResult *rr= BKE_image_get_renderresult(ima); if(rr) { - RE_WriteRenderResult(rr, str); + RE_WriteRenderResult(rr, str, G.scene->r.quality); BLI_strncpy(ima->name, name, sizeof(ima->name)); BLI_strncpy(ibuf->name, str, sizeof(ibuf->name)); diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c index 530d0535baa..3ef29169b54 100644 --- a/source/blender/src/writeimage.c +++ b/source/blender/src/writeimage.c @@ -113,7 +113,7 @@ static void save_rendered_image_cb_real(char *name, int confirm) if(G.scene->r.imtype==R_MULTILAYER) { RenderResult *rr= RE_GetResult(RE_GetRender(G.scene->id.name)); if(rr) - RE_WriteRenderResult(rr, str); + RE_WriteRenderResult(rr, str, G.scene->r.quality); } else { RenderResult rres; -- cgit v1.2.3