[Bf-blender-cvs] [891a944dfd6] greasepencil-object: Fix: Crash when erasing annotation strokes

Joshua Leung noreply at git.blender.org
Tue Jul 3 17:48:41 CEST 2018


Commit: 891a944dfd6ec02b42853ed1560930698abbc6c6
Author: Joshua Leung
Date:   Wed Jul 4 03:43:02 2018 +1200
Branches: greasepencil-object
https://developer.blender.org/rB891a944dfd6ec02b42853ed1560930698abbc6c6

Fix: Crash when erasing annotation strokes

The code was assuming that dvert data always exists on strokes
(it shouldn't, if we're doing everything correctly!), which
caused crashes when erasing annotation strokes (which definitely
don't have this data).

TODO:
Check that the rest of the code doesn't make similar assumptions!

===================================================================

M	source/blender/editors/gpencil/gpencil_edit.c

===================================================================

diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 6ebfdd087fe..ba4b93d8ad3 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -1748,19 +1748,25 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
 
 			/* Compute new buffer size (+ 1 needed as the endpoint index is "inclusive") */
 			new_stroke->totpoints = island->end_idx - island->start_idx + 1;
-			new_stroke->points    = MEM_callocN(sizeof(bGPDspoint) * new_stroke->totpoints, "gp delete stroke fragment");
-			new_stroke->dvert     = MEM_callocN(sizeof(MDeformVert) * new_stroke->totpoints, "gp delete stroke fragment weight");
 
-			/* Copy over the relevant points */
+			/* Copy over the relevant point data */
+			new_stroke->points    = MEM_callocN(sizeof(bGPDspoint) * new_stroke->totpoints, "gp delete stroke fragment");
 			memcpy(new_stroke->points, gps->points + island->start_idx, sizeof(bGPDspoint) * new_stroke->totpoints);
-			memcpy(new_stroke->dvert, gps->dvert + island->start_idx, sizeof(MDeformVert) * new_stroke->totpoints);
-			/* Copy weights */
-			int e = island->start_idx;
-			for (int i = 0; i < new_stroke->totpoints; i++) {
-				MDeformVert *dvert_dst = &gps->dvert[e];
-				MDeformVert *dvert_src = &new_stroke->dvert[i];
-				dvert_dst->dw = MEM_dupallocN(dvert_src->dw);
-				e++;
+			
+			/* Copy over vertex weight data (if available) */
+			if (new_stroke->dvert != NULL) {
+				/* Copy over the relevant vertex-weight points */
+				new_stroke->dvert     = MEM_callocN(sizeof(MDeformVert) * new_stroke->totpoints, "gp delete stroke fragment weight");
+				memcpy(new_stroke->dvert, gps->dvert + island->start_idx, sizeof(MDeformVert) * new_stroke->totpoints);
+				
+				/* Copy weights */
+				int e = island->start_idx;
+				for (int i = 0; i < new_stroke->totpoints; i++) {
+					MDeformVert *dvert_dst = &gps->dvert[e];
+					MDeformVert *dvert_src = &new_stroke->dvert[i];
+					dvert_dst->dw = MEM_dupallocN(dvert_src->dw);
+					e++;
+				}
 			}
 
 			/* Each island corresponds to a new stroke. We must adjust the



More information about the Bf-blender-cvs mailing list