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:
authorTon Roosendaal <ton@blender.org>2006-02-18 17:35:43 +0300
committerTon Roosendaal <ton@blender.org>2006-02-18 17:35:43 +0300
commit1ea90994744cb95d83717bb7df972c693f9e9583 (patch)
treed803ddef0effd29024cfb71e8d81ee41f6b52a1d
parent7425a8fcaa3a777155d7b75d368db3b0ed1e58a4 (diff)
- Restored "dither" option for conversion from float -> byte images.
This now is a post-process option only (used to be in render). It is only handled within the Imbuf/ module, on conversions from float to byte rect, which atm mostly happens on saving images. - Small fix: when using Scene RenderLayer nodes, the speed vectors for these nodes were not created when that scene had "Do Composite" off.
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h3
-rw-r--r--source/blender/imbuf/intern/divers.c37
-rw-r--r--source/blender/render/intern/source/pipeline.c9
-rw-r--r--source/blender/src/writeimage.c3
4 files changed, 42 insertions, 10 deletions
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index fe82b852eaa..db178841979 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -96,7 +96,8 @@ typedef struct ImBuf{
unsigned int encodedbuffersize; /**< Size of encodedbuffer */
float *rect_float; /**< floating point Rect equivilant */
-
+ float dither; /**< random dither value, for conversion from float -> byte rect */
+
struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */
int refcounter; /**< Refcounter for multiple users */
} ImBuf;
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 71292e27611..2fc80f6ddcb 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -33,6 +33,7 @@
*/
#include "BLI_blenlib.h"
+#include "BLI_rand.h"
#include "imbuf.h"
#include "imbuf_patch.h"
@@ -172,6 +173,7 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
{
/* quick method to convert floatbuf to byte */
float *tof = ibuf->rect_float;
+ float dither= ibuf->dither;
int i;
unsigned char *to = (unsigned char *) ibuf->rect;
@@ -181,14 +183,33 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
to = (unsigned char *) ibuf->rect;
}
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- to[0] = FTOCHAR(tof[0]);
- to[1] = FTOCHAR(tof[1]);
- to[2] = FTOCHAR(tof[2]);
- to[3] = FTOCHAR(tof[3]);
- to += 4;
- tof += 4;
+ if(dither==0.0f) {
+ for (i = ibuf->x * ibuf->y; i > 0; i--) {
+ to[0] = FTOCHAR(tof[0]);
+ to[1] = FTOCHAR(tof[1]);
+ to[2] = FTOCHAR(tof[2]);
+ to[3] = FTOCHAR(tof[3]);
+ to += 4;
+ tof += 4;
+ }
+ }
+ else {
+ float dither_value, col;
+ dither= dither/255.0f;
+ for (i = ibuf->x * ibuf->y; i > 0; i--) {
+ dither_value = (BLI_frand()-0.5)*dither;
+ col= tof[0] + dither_value;
+ to[0] = FTOCHAR(col);
+ col= tof[1] + dither_value;
+ to[1] = FTOCHAR(col);
+ col= tof[2] + dither_value;
+ to[2] = FTOCHAR(col);
+ col= tof[3] + dither_value;
+ to[3] = FTOCHAR(col);
+
+ to += 4;
+ tof += 4;
+ }
}
}
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index c14ee2ece8e..552a241ea6f 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -936,6 +936,9 @@ static void do_render_scene_node(Render *re, Scene *sce, int cfra)
/* makes render result etc */
RE_InitState(resc, &sce->r, re->winx, re->winy, &re->disprect);
+ /* this to enable this scene to create speed vectors */
+ resc->r.scemode |= R_DOCOMP;
+
/* now use renderdata and camera to set viewplane */
if(sce->camera==NULL) return;
RE_SetCamera(resc, sce->camera);
@@ -1222,10 +1225,14 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh)
/* if not exists, BKE_write_ibuf makes one */
ibuf->rect= rres.rect32;
-
ibuf->rect_float= rres.rectf;
ibuf->zbuf_float= rres.rectz;
+
+ /* float factor for random dither, imbuf takes care of it */
+ ibuf->dither= scene->r.dither_intensity;
+
ok= BKE_write_ibuf(ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+
if(ok==0) {
printf("Render error: cannot save %s\n", name);
G.afbreek=1;
diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c
index 8bafd14d0e0..ae0717f6726 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -136,6 +136,9 @@ static void save_rendered_image_cb_real(char *name, int zbuf)
ibuf->zbuf_float= rres.rectz;
}
+ /* float factor for random dither, imbuf takes care of it */
+ ibuf->dither= G.scene->r.dither_intensity;
+
BKE_write_ibuf(ibuf, str, G.scene->r.imtype, G.scene->r.subimtype, G.scene->r.quality);
IMB_freeImBuf(ibuf); /* imbuf knows rects are not part of ibuf */