diff options
-rw-r--r-- | release/plugins/sequence/blur.c | 75 | ||||
-rw-r--r-- | release/plugins/sequence/color-correction-hsv.c | 24 | ||||
-rw-r--r-- | release/plugins/sequence/color-correction-yuv.c | 33 | ||||
-rw-r--r-- | release/plugins/sequence/scatter.c | 83 |
4 files changed, 152 insertions, 63 deletions
diff --git a/release/plugins/sequence/blur.c b/release/plugins/sequence/blur.c index 9687d04e066..8a415187f91 100644 --- a/release/plugins/sequence/blur.c +++ b/release/plugins/sequence/blur.c @@ -138,8 +138,13 @@ void blurbuf(struct ImBuf *ibuf, int nr, Cast *cast) if(cast->gamma != 1.0) gamwarp(tbuf, 1.0 / cast->gamma); /* Very bad code warning! This fails badly with float-buffers!!! */ - freeN(ibuf->rect); - ibuf->rect= tbuf->rect; + if (ibuf->rect_float) { + freeN(ibuf->rect_float); + ibuf->rect_float= tbuf->rect_float; + } else { + freeN(ibuf->rect); + ibuf->rect= tbuf->rect; + } freeN(tbuf); } @@ -153,6 +158,7 @@ void doblur(struct ImBuf *mbuf, float fac, Cast *cast) float ifac, pfac; int n, b1, b2; char *irect, *prect, *mrect; + float *irectf, *prectf, *mrectf; /* wich buffers ? */ @@ -178,30 +184,55 @@ void doblur(struct ImBuf *mbuf, float fac, Cast *cast) blurbuf(ibuf, n, cast); blurbuf(ibuf, n, cast); - fac= 255.0*(fac-pfac)/(ifac-pfac); - b1= fac; + fac = (fac-pfac)/(ifac-pfac); + b1= 255.0*fac; if(b1>255) b1= 255; b2= 255-b1; if(b1==255) { - memcpy(mbuf->rect, ibuf->rect, 4*ibuf->x*ibuf->y); + if (mbuf->rect_float) + memcpy(mbuf->rect_float, ibuf->rect_float, 4*ibuf->x*ibuf->y * sizeof(float)); + else + memcpy(mbuf->rect_float, ibuf->rect_float, 4*ibuf->x*ibuf->y); } else if(b1==0) { - memcpy(mbuf->rect, pbuf->rect, 4*pbuf->x*pbuf->y); + if (mbuf->rect_float) + memcpy(mbuf->rect_float, pbuf->rect_float, 4*pbuf->x*pbuf->y * sizeof(float)); + else + memcpy(mbuf->rect, pbuf->rect, 4*pbuf->x*pbuf->y); } else { /* interpolate */ n= ibuf->x*ibuf->y; - irect= (char *)ibuf->rect; - prect= (char *)pbuf->rect; - mrect= (char *)mbuf->rect; - while(n--) { - mrect[0]= (irect[0]*b1+ prect[0]*b2)>>8; - mrect[1]= (irect[1]*b1+ prect[1]*b2)>>8; - mrect[2]= (irect[2]*b1+ prect[2]*b2)>>8; - mrect[3]= (irect[3]*b1+ prect[3]*b2)>>8; - mrect+= 4; - irect+= 4; - prect+= 4; + if (mbuf->rect_float) { + irectf= ibuf->rect_float; + prectf= pbuf->rect_float; + mrectf= mbuf->rect_float; + while(n--) { + mrectf[0]= (irectf[0]*fac+ prectf[0]*(1-fac))/2; + mrectf[1]= (irectf[1]*fac+ prectf[1]*(1-fac))/2; + mrectf[2]= (irectf[2]*fac+ prectf[2]*(1-fac))/2; + mrectf[3]= (irectf[3]*fac+ prectf[3]*(1-fac))/2; + mrectf[0]= 1; + mrectf[1]= 1; + mrectf[2]= 1; + mrectf[3]= 1; + mrectf+= 4; + irectf+= 4; + prectf+= 4; + } + } else { + irect= (char *)ibuf->rect; + prect= (char *)pbuf->rect; + mrect= (char *)mbuf->rect; + while(n--) { + mrect[0]= (irect[0]*b1+ prect[0]*b2)>>8; + mrect[1]= (irect[1]*b1+ prect[1]*b2)>>8; + mrect[2]= (irect[2]*b1+ prect[2]*b2)>>8; + mrect[3]= (irect[3]*b1+ prect[3]*b2)>>8; + mrect+= 4; + irect+= 4; + prect+= 4; + } } } freeImBuf(ibuf); @@ -221,7 +252,8 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int x, int y, ImBuf * bfacf1 = (facf1 * 6.0) + 1.0; } - memcpy(out->rect, ibuf1->rect, 4*out->x*out->y); + if (out->rect_float) memcpy(out->rect_float, ibuf1->rect_float, 4*out->x*out->y * sizeof(float)); + else memcpy(out->rect, ibuf1->rect, 4*out->x*out->y); /* it blurs interlaced, only tested with even fields */ de_interlace(out); @@ -231,11 +263,14 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int x, int y, ImBuf * doblur(out, bfacf0, cast); /*fieldA*/ - out->rect += out->x * out->y; + if (out->rect_float) out->rect_float += out->x * out->y; + else out->rect += out->x * out->y; doblur(out, bfacf1, cast); /*fieldB*/ - out->rect -= out->x * out->y; + if (out->rect_float) out->rect_float -= out->x * out->y; + else out->rect -= out->x * out->y; + out->flags |= IB_fields; interlace(out); diff --git a/release/plugins/sequence/color-correction-hsv.c b/release/plugins/sequence/color-correction-hsv.c index 2e57c6f0f48..ec8478706f1 100644 --- a/release/plugins/sequence/color-correction-hsv.c +++ b/release/plugins/sequence/color-correction-hsv.c @@ -182,10 +182,12 @@ static void rgb_to_hsv (double r, double g, double b, void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, int height, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *out, ImBuf *use) { - char *dest, *src1, *src2; + char *dest, *src1; int x, y, c; double gamma_table[256]; double uv_table[256]; + float *destf = out->rect_float; + float *src1f = ibuf1->rect_float; if (!ibuf1) return; @@ -224,7 +226,9 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, double h,s,v,r,g,b; double fac; - rgb_to_hsv((double) src1[0]/255.0, + if (ibuf1->rect_float) rgb_to_hsv(src1f[0], src1f[1], + src1f[2],&h,&s,&v); + else rgb_to_hsv((double) src1[0]/255.0, (double) src1[1]/255.0, (double) src1[2]/255.0, &h, &s, &v); @@ -238,10 +242,18 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, } hsv_to_rgb(h,s,v, &r, &g, &b); - *dest++ = r*255.0; - *dest++ = g*255.0; - *dest++ = b*255.0; - dest++; + if (out->rect_float) { + destf[0] = r; + destf[1] = g; + destf[2] = b; + destf = destf + 4; + src1f +=4; + } else { + dest[0] = r*255.0; + dest[1] = g*255.0; + dest[2] = b*255.0; + dest += 4; + } src1 += 4; } diff --git a/release/plugins/sequence/color-correction-yuv.c b/release/plugins/sequence/color-correction-yuv.c index c68d78c9fc0..54290ba37a2 100644 --- a/release/plugins/sequence/color-correction-yuv.c +++ b/release/plugins/sequence/color-correction-yuv.c @@ -119,6 +119,8 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, float yuv[3]; float gamma_table[256]; float uv_table[256]; + float *destf = out->rect_float; + float *src1f = ibuf1->rect_float; if (!ibuf1) return; @@ -155,9 +157,15 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { float fac; - rgb[0]= (float)src1[0]/255.0; - rgb[1]= (float)src1[1]/255.0; - rgb[2]= (float)src1[2]/255.0; + if (out->rect_float) { + rgb[0]= (float)src1f[0]/255.0; + rgb[1]= (float)src1f[1]/255.0; + rgb[2]= (float)src1f[2]/255.0; + } else { + rgb[0]= (float)src1[0]/255.0; + rgb[1]= (float)src1[1]/255.0; + rgb[2]= (float)src1[2]/255.0; + } rgb_to_yuv(rgb, yuv); yuv[0] = gamma_table[(int) (yuv[0] * 255.0)] / 255.0; @@ -179,12 +187,19 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, } yuv_to_rgb(yuv, rgb); - *dest++ = rgb[0]*255.0; - *dest++ = rgb[1]*255.0; - *dest++ = rgb[2]*255.0; - dest++; - - src1 += 4; + if (out->rect_float) { + *destf++ = rgb[0]; + *destf++ = rgb[1]; + *destf++ = rgb[2]; + destf++; + src1f += 4; + } else { + *dest++ = rgb[0]*255.0; + *dest++ = rgb[1]*255.0; + *dest++ = rgb[2]*255.0; + dest++; + src1 += 4; + } } } diff --git a/release/plugins/sequence/scatter.c b/release/plugins/sequence/scatter.c index b61b53c1a85..ea230256389 100644 --- a/release/plugins/sequence/scatter.c +++ b/release/plugins/sequence/scatter.c @@ -99,20 +99,17 @@ void plugin_getinfo(PluginInfo *info) /* ************************************************************ Scatter - with usage of ImBuf rect operation. - ************************************************************ */ -static void ibufrectop(ImBuf *dbuf, ImBuf *sbuf, +static void rectcpy(ImBuf *dbuf, ImBuf *sbuf, int destx, int desty, - int srcx, int srcy, int width, int height, - void (*operation)(), - int value) + int srcx, int srcy, int width, int height) { uint *drect,*srect; + float *dfrect, *sfrect; + int tmp; if (dbuf == 0) return; - if (operation == 0) return; if (destx < 0){ srcx -= destx ; @@ -140,41 +137,71 @@ static void ibufrectop(ImBuf *dbuf, ImBuf *sbuf, if (sbuf){ if (width > sbuf->x - srcx) width = sbuf->x - srcx; if (height > sbuf->y - srcy) height = sbuf->y - srcy; + srect = sbuf->rect; + sfrect = sbuf->rect_float; } if (width <= 0) return; if (height <= 0) return; drect = dbuf->rect; - if (sbuf) srect = sbuf->rect; + dfrect = dbuf->rect_float; + + tmp = desty * dbuf->x + destx; + + if (dbuf->rect_float) dfrect += tmp; + else drect += tmp; - drect += desty * dbuf->x; - drect += destx; destx = dbuf->x; if (sbuf) { - srect += srcy * sbuf->x; - srect += srcx; + tmp = srcy * sbuf->x + srcx; + if (dbuf->rect_float) sfrect += tmp; + else srect += tmp; srcx = sbuf->x; } else{ - srect = drect; + if (dbuf->rect_float) sfrect = dfrect; + else srect = drect; srcx = destx; } for (;height > 0; height--){ - operation(drect, srect, width, value); - drect += destx; - srect += srcx; + if (dbuf->rect_float) { + memcpy(dfrect,sfrect, srcx * sizeof(float)); + dfrect += destx; + sfrect += srcx; + } else { + memcpy(drect,srect, srcx * sizeof(int)); + drect += destx; + srect += srcx; + } } } -static void rectcpy(uint *drect, uint *srect, int x) { - memcpy(drect,srect, x * sizeof(int)); -} - -static void rectfill(uint *drect, uint *srect, int x, int value) +static void fill_out(ImBuf *out, float r, float g, float b, float a) { - for (;x > 0; x--) *drect++ = value; + int tot,x; + float *rectf = out->rect_float; + unsigned char *rect = (unsigned char *)out->rect; + + tot = out->x * out->y; + if (out->rect_float) { + for (x = 0;x < tot; x++) { + rectf[0] = r; + rectf[1] = g; + rectf[2] = b; + rectf[3] = a; + rectf = rectf + 4; + } + } else { + for (x=0;x < tot;x++) { + rect[0] = (int)(r * 255); + rect[1] = (int)(g * 255); + rect[2] = (int)(b * 255); + rect[3] = (int)(a * 255); + rect += 4; + } + } } @@ -184,7 +211,7 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int sx, int sy, ImBuf int x, y, lr; /* fill imbuf 'out' with black */ - ibufrectop(out, ibuf1,0,0,0,0,32767,32767,rectfill, 0); + fill_out(out, 0,0,0,0); switch (cast->type) { case 0: @@ -223,12 +250,12 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int sx, int sy, ImBuf break; } - ibufrectop(out, ibuf1, 0, y, x, y, 32767, 1, rectcpy, 0); + rectcpy(out, ibuf1, 0, y, x, y, 32767, 1); if (cast->wrap) { - ibufrectop(out, ibuf1, 0, y, x + sx, y, 32767, 1, rectcpy, 0); - ibufrectop(out, ibuf1, 0, y, x + sx + sx, y, 32767, 1, rectcpy, 0); - ibufrectop(out, ibuf1, 0, y, x - sx, y, 32767, 1, rectcpy, 0); - ibufrectop(out, ibuf1, 0, y, x - sx - sx, y, 32767, 1, rectcpy, 0); + rectcpy(out, ibuf1, 0, y, x + sx, y, 32767, 1); + rectcpy(out, ibuf1, 0, y, x + sx + sx, y, 32767, 1); + rectcpy(out, ibuf1, 0, y, x - sx, y, 32767, 1); + rectcpy(out, ibuf1, 0, y, x - sx - sx, y, 32767, 1); } } } |