diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-07-15 03:23:24 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-07-15 03:23:24 +0400 |
commit | 1cee8ea8ed5064b5ec32e00eef2654fd76b7a3f5 (patch) | |
tree | 1483c2c6524e261e9653eb10c3dd3b28c55c4be8 /source/blender/blenkernel/intern/mask_rasterize.c | |
parent | 41fe8b9ea94fa6877d35a51567cd83b255431306 (diff) |
unfilled-cyclic curves now works as expected, also fix for own crash on 32bit systems.
Diffstat (limited to 'source/blender/blenkernel/intern/mask_rasterize.c')
-rw-r--r-- | source/blender/blenkernel/intern/mask_rasterize.c | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c index 815f3ab34e3..4093757fffd 100644 --- a/source/blender/blenkernel/intern/mask_rasterize.c +++ b/source/blender/blenkernel/intern/mask_rasterize.c @@ -96,6 +96,12 @@ typedef struct MaskRasterLayer { } MaskRasterLayer; +typedef struct MaskRasterSplineInfo { + unsigned int vertex_offset; + unsigned int vertex_total; + unsigned int is_cyclic; +} MaskRasterSplineInfo; + /** * opaque local struct for mask pixel lookup, each MaskLayer needs one of these */ @@ -107,7 +113,6 @@ struct MaskRasterHandle { rctf bounds; }; - /* --------------------------------------------------------------------- */ /* alloc / free functions */ /* --------------------------------------------------------------------- */ @@ -446,7 +451,7 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas const unsigned int tot_splines = BLI_countlist(&masklay->splines); /* we need to store vertex ranges for open splines for filling */ - unsigned int (*open_spline_ranges)[2] = MEM_callocN(sizeof(open_spline_ranges) * tot_splines, __func__); + MaskRasterSplineInfo *open_spline_ranges = MEM_callocN(sizeof(*open_spline_ranges) * tot_splines, __func__); unsigned int open_spline_index = 0; MaskSpline *spline; @@ -467,6 +472,7 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas BLI_scanfill_begin(&sf_ctx); for (spline = masklay->splines.first; spline; spline = spline->next) { + const unsigned int is_cyclic = (spline->flag & MASK_SPLINE_CYCLIC) != 0; const unsigned int is_fill = (spline->flag & MASK_SPLINE_NOFILL) == 0; float (*diff_points)[2]; @@ -605,8 +611,9 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas float co_feather[3]; co_feather[2] = 1.0f; - open_spline_ranges[open_spline_index ][0] = sf_vert_tot; - open_spline_ranges[open_spline_index ][1] = tot_diff_point; + open_spline_ranges[open_spline_index].vertex_offset = sf_vert_tot; + open_spline_ranges[open_spline_index].vertex_total = tot_diff_point; + open_spline_ranges[open_spline_index].is_cyclic = is_cyclic; open_spline_index++; @@ -639,7 +646,10 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas tot_feather_quads += 2; } - tot_feather_quads -= 2; + + if (!is_cyclic) { + tot_feather_quads -= 2; + } MEM_freeN(diff_feather_points); @@ -723,8 +733,8 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas /* feather only splines */ while (open_spline_index > 0) { - unsigned int start_vidx = open_spline_ranges[--open_spline_index][0]; - unsigned int tot_diff_point_sub1 = open_spline_ranges[ open_spline_index][1] - 1; + unsigned int start_vidx = open_spline_ranges[--open_spline_index].vertex_offset; + unsigned int tot_diff_point_sub1 = open_spline_ranges[ open_spline_index].vertex_total - 1; unsigned int k, j; j = start_vidx; @@ -734,17 +744,33 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas BLI_assert(j == start_vidx + (k * 3)); - *(face++) = j + 0; - *(face++) = j + 1; - *(face++) = j + 4; /* next span */ - *(face++) = j + 3; /* next span */ + *(face++) = j + 3; /* next span */ /* z 1 */ + *(face++) = j + 0; /* z 1 */ + *(face++) = j + 1; /* z 0 */ + *(face++) = j + 4; /* next span */ /* z 0 */ + + face_index++; + + *(face++) = j + 0; /* z 1 */ + *(face++) = j + 3; /* next span */ /* z 1 */ + *(face++) = j + 5; /* next span */ /* z 0 */ + *(face++) = j + 2; /* z 0 */ + + face_index++; + } + + if (open_spline_ranges[open_spline_index].is_cyclic) { + *(face++) = start_vidx + 3; /* next span */ /* z 1 */ + *(face++) = j + 0; /* z 1 */ + *(face++) = j + 1; /* z 0 */ + *(face++) = start_vidx + 4; /* next span */ /* z 0 */ face_index++; - *(face++) = j + 0; - *(face++) = j + 3; /* next span */ - *(face++) = j + 5; /* next span */ - *(face++) = j + 2; + *(face++) = j + 0; /* z 1 */ + *(face++) = start_vidx + 3; /* next span */ /* z 1 */ + *(face++) = start_vidx + 5; /* next span */ /* z 0 */ + *(face++) = j + 2; /* z 0 */ face_index++; } |