Bugfix #22040
[blender.git] / source / blender / imbuf / intern / scaling.c
index 73dcc0c8ea9d528254de1c050aa1de56e9fdbb9a..1f50deaee2a417f1eb141e051da50b17e7496f0a 100644 (file)
@@ -286,26 +286,16 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1)
        return (ibuf2);
 }
 
-
-struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
+/* result in ibuf2, scaling should be done correctly */
+void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1)
 {
-       struct ImBuf *ibuf2;
        uchar *p1, *p2 = NULL, *dest;
        float *p1f, *destf, *p2f = NULL;
        int x,y;
        int do_rect, do_float;
 
-       if (ibuf1==NULL) return (0);
-       if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
-
        do_rect= (ibuf1->rect != NULL);
-
-       if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
-       if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
        
-       ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags);
-       if (ibuf2==NULL) return (0);
-
        p1f = ibuf1->rect_float;
        destf=ibuf2->rect_float;
        p1 = (uchar *) ibuf1->rect;
@@ -343,9 +333,26 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
                        if (do_float) p1f+=4;
                }
        }
-       return (ibuf2);
+       
 }
 
+struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
+{
+       struct ImBuf *ibuf2;
+
+       if (ibuf1==NULL) return (0);
+       if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+       
+       if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
+       if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
+       
+       ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags);
+       if (ibuf2==NULL) return (0);
+       
+       imb_onehalf_no_alloc(ibuf2, ibuf1);
+       
+       return (ibuf2);
+}
 
 /* q_scale_linear_interpolation helper functions */