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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-08-31 03:08:38 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-08-31 03:08:38 +0400
commitc58a0c5eb814db1be08c0e8a4353ad5606a23d30 (patch)
tree8771cf76565345b4e56ab473be58ccd7e447a0a1 /source/blender/render/intern
parent5ac81bfe9c523c2ea0dcbc55bc8454c2e12239e0 (diff)
catch exception and report an error when failing to write exr files - was crashing with debug builds.
Diffstat (limited to 'source/blender/render/intern')
-rw-r--r--source/blender/render/intern/source/pipeline.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 0d5f8c77f6b..77b637b5129 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -824,11 +824,12 @@ 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, const char *filename, int compress)
+int RE_WriteRenderResult(ReportList *reports, RenderResult *rr, const char *filename, int compress)
{
RenderLayer *rl;
RenderPass *rpass;
void *exrhandle= IMB_exr_get_handle();
+ int success;
BLI_make_existing_file(filename);
@@ -864,11 +865,20 @@ void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress)
}
}
}
-
- IMB_exr_begin_write(exrhandle, filename, rr->rectx, rr->recty, compress);
-
- IMB_exr_write_channels(exrhandle);
+
+ /* when the filename has no permissions, this can fail */
+ if(IMB_exr_begin_write(exrhandle, filename, rr->rectx, rr->recty, compress)) {
+ IMB_exr_write_channels(exrhandle);
+ success= TRUE;
+ }
+ else {
+ /* TODO, get the error from openexr's exception */
+ BKE_report(reports, RPT_ERROR, "Error Writing Render Result, see console");
+ success= FALSE;
+ }
IMB_exr_close(exrhandle);
+
+ return success;
}
/* callbacks for RE_MultilayerConvert */
@@ -992,9 +1002,10 @@ static int read_render_result_from_file(const char *filename, RenderResult *rr)
}
/* only for temp buffer files, makes exact copy of render result */
-static void read_render_result(Render *re, int sample)
+static int read_render_result(Render *re, int sample)
{
char str[FILE_MAX];
+ int success;
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
@@ -1004,10 +1015,18 @@ static void read_render_result(Render *re, int sample)
render_unique_exr_name(re, str, sample);
printf("read exr tmp file: %s\n", str);
- if(!read_render_result_from_file(str, re->result))
+ if(read_render_result_from_file(str, re->result)) {
+ success= TRUE;
+ }
+ else {
printf("cannot read: %s\n", str);
+ success= FALSE;
+
+ }
BLI_rw_mutex_unlock(&re->resultmutex);
+
+ return success;
}
/* *************************************************** */
@@ -2981,7 +3000,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, c
if(re->r.imtype==R_MULTILAYER) {
if(re->result) {
- RE_WriteRenderResult(re->result, name, scene->r.quality);
+ RE_WriteRenderResult(re->reports, re->result, name, scene->r.quality);
printf("Saved: %s", name);
}
}
@@ -3198,7 +3217,7 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
/* note; repeated win/disprect calc... solve that nicer, also in compo */
/* only the temp file! */
-void RE_ReadRenderResult(Scene *scene, Scene *scenode)
+int RE_ReadRenderResult(Scene *scene, Scene *scenode)
{
Render *re;
int winx, winy;
@@ -3232,7 +3251,7 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode)
RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect);
re->scene= scene;
- read_render_result(re, 0);
+ return read_render_result(re, 0);
}
void RE_set_max_threads(int threads)