Fix #29827: 2.61 Scale and translate bugs
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 10 Jan 2012 14:54:51 +0000 (14:54 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 10 Jan 2012 14:54:51 +0000 (14:54 +0000)
Scale lead to crash because of incorrect check for buffer size.
Translate bug was caused by ignoring buffer offset.

source/blender/nodes/composite/node_composite_util.c
source/blender/nodes/composite/node_composite_util.h
source/blender/nodes/composite/nodes/node_composite_blur.c

index c99cae7ed7bad0fc0ef06fa575280c6b8ee3e1b6..45f490729e8354d7050070ebf251954a2d315606 100644 (file)
@@ -402,7 +402,7 @@ CompBuf *typecheck_compbuf(CompBuf *inbuf, int type)
        return inbuf;
 }
 
-static float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad)
+float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad)
 {
        if(cbuf) {
                if(cbuf->rect_procedural) {
index bb606f4202e3ff474fdb8540190aa6328aa8fdd2..024879338496b2aaa8591b3f667a3bc040edfb64 100644 (file)
@@ -133,6 +133,8 @@ void typecheck_compbuf_color(float *out, float *in, int outtype, int intype);
 
 /* **************************************************** */
 
+float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad);
+
 /* Pixel-to-Pixel operation, 1 Image in, 1 out */
 void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, float *src_col,
                                                                          void (*func)(bNode *, float *, float *), 
index 76827f719f520f3a948ce39782d8e879f6a67c5e..fad80723ca326e8e955abc1254705053d4cdd229 100644 (file)
@@ -455,14 +455,19 @@ static void blur_with_reference(bNode *node, CompBuf *new, CompBuf *img, CompBuf
        int x, y, pix= img->type;
        int i, j;
        float *src, *dest, *refd, *blurd;
+       float defcol[4] = {1.0f, 1.0f, 1.0f, 1.0f};     /* default color for compbuf_get_pixel */
+       float proccol[4];       /* local color if compbuf is procedural */
+       int refradx, refrady;
 
-       if(ref->x!=img->x && ref->y!=img->y)
+       if(ref->x!=img->x || ref->y!=img->y)
                return;
        
        ref_use= typecheck_compbuf(ref, CB_VAL);
        
        /* trick is; we blur the reference image... but only works with clipped values*/
        blurbuf= alloc_compbuf(imgx, imgy, CB_VAL, 1);
+       blurbuf->xof= ref_use->xof;
+       blurbuf->yof= ref_use->yof;
        blurd= blurbuf->rect;
        refd= ref_use->rect;
        for(x= imgx*imgy; x>0; x--, refd++, blurd++) {
@@ -492,15 +497,15 @@ static void blur_with_reference(bNode *node, CompBuf *new, CompBuf *img, CompBuf
        for(i= 0; i<x; i++)
                maintabs[i]= make_gausstab(nbd->filtertype, i+1);
        
-       refd= blurbuf->rect;
        dest= new->rect;
        radxf= (float)radx;
        radyf= (float)rady;
        
        for (y = 0; y < imgy; y++) {
-               for (x = 0; x < imgx ; x++, dest+=pix, refd++) {
-                       int refradx= (int)(refd[0]*radxf);
-                       int refrady= (int)(refd[0]*radyf);
+               for (x = 0; x < imgx ; x++, dest+=pix) {
+                       refd= compbuf_get_pixel(blurbuf, defcol, proccol, x-blurbuf->xrad, y-blurbuf->yrad, blurbuf->xrad, blurbuf->yrad);
+                       refradx= (int)(refd[0]*radxf);
+                       refrady= (int)(refd[0]*radyf);
                        
                        if(refradx>radx) refradx= radx;
                        else if(refradx<1) refradx= 1;