diff options
Diffstat (limited to 'source/blender/imbuf/intern/divers.c')
-rw-r--r-- | source/blender/imbuf/intern/divers.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c index 2fc80f6ddcb..c0018d0b336 100644 --- a/source/blender/imbuf/intern/divers.c +++ b/source/blender/imbuf/intern/divers.c @@ -141,25 +141,32 @@ void IMB_interlace(struct ImBuf *ibuf) void IMB_gamwarp(struct ImBuf *ibuf, double gamma) { uchar gam[256]; - int i, do_float=0; - uchar *rect = (uchar *) ibuf->rect; - float *rectf = ibuf->rect_float; + int i; + uchar *rect; + float *rectf; if (ibuf == 0) return; - if (ibuf->rect == 0) return; - if (ibuf->rect != NULL) do_float = 1; if (gamma == 1.0) return; + rect = (uchar *) ibuf->rect; + rectf = ibuf->rect_float; + gamma = 1.0 / gamma; - for (i = 255 ; i >= 0 ; i--) gam[i] = (255.0 * pow(i / 255.0 , - gamma)) + 0.5; - rect = (uchar *) ibuf->rect; - for (i = ibuf->x * ibuf->y ; i>0 ; i--, rect+=4){ - rect[0] = gam[rect[0]]; - rect[1] = gam[rect[1]]; - rect[2] = gam[rect[2]]; - if (do_float) { + if (rect) { + for (i = 255 ; i >= 0 ; i--) + gam[i] = (255.0 * pow(i / 255.0 , + gamma)) + 0.5; + + for (i = ibuf->x * ibuf->y ; i>0 ; i--, rect+=4){ + rect[0] = gam[rect[0]]; + rect[1] = gam[rect[1]]; + rect[2] = gam[rect[2]]; + } + } + + if (rectf) { + for (i = ibuf->x * ibuf->y ; i>0 ; i--, rectf+=4){ rectf[0] = pow(rectf[0] / 255.0, gamma); rectf[1] = pow(rectf[1] / 255.0, gamma); rectf[2] = pow(rectf[2] / 255.0, gamma); |