Merge mask fixes from tomato branch
authorSergey Sharybin <sergey.vfx@gmail.com>
Sat, 21 Jul 2012 09:01:39 +0000 (09:01 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sat, 21 Jul 2012 09:01:39 +0000 (09:01 +0000)
--
svn merge -r49075:49076 -r49086:49087  ^/branches/soc-2011-tomato

source/blender/blenkernel/intern/mask.c

index fa11721a9441f5aadaec49376a92caed81bb1205..f13c27cb4366c932192184ab86c5d48def67f7e7 100644 (file)
@@ -541,6 +541,8 @@ static void spline_feather_collapse_inner_loops(MaskSpline *spline, float (*feat
                int next = i + 1;
                float delta;
 
+               DO_MINMAX2(feather_points[i], min, max);
+
                if (next == tot_feather_point) {
                        if (spline->flag & MASK_SPLINE_CYCLIC)
                                next = 0;
@@ -555,16 +557,27 @@ static void spline_feather_collapse_inner_loops(MaskSpline *spline, float (*feat
                delta = fabsf(feather_points[i][1] - feather_points[next][1]);
                if (delta > max_delta_y)
                        max_delta_y = delta;
+       }
 
-               DO_MINMAX2(feather_points[i], min, max);
+       /* prevent divisionsby zero by ensuring bounding box is not collapsed */
+       if (max[0] - min[0] < FLT_EPSILON) {
+               max[0] += 0.01f;
+               min[0] -= 0.01f;
+       }
+
+       if (max[1] - min[1] < FLT_EPSILON) {
+               max[1] += 0.01f;
+               min[1] -= 0.01f;
        }
 
        /* use dynamically calculated buckets per side, so we likely wouldn't
         * run into a situation when segment doesn't fit two buckets which is
         * pain collecting candidates for intersection
         */
+
        max_delta_x /= max[0] - min[0];
        max_delta_y /= max[1] - min[1];
+
        max_delta = MAX2(max_delta_x, max_delta_y);
 
        buckets_per_side = MIN2(512, 0.9f / max_delta);