GP: Fix memory leaks when use cutter with weights
authorAntonioya <blendergit@gmail.com>
Mon, 21 Jan 2019 16:38:47 +0000 (17:38 +0100)
committerAntonioya <blendergit@gmail.com>
Mon, 21 Jan 2019 16:39:00 +0000 (17:39 +0100)
There were some issues when copy the weights and  other memory leaks.

Also some code cleanup.

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

index e81aac3..05bd5dd 100644 (file)
@@ -1843,7 +1843,6 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
        bool in_island  = false;
        int num_islands = 0;
 
-
        /* First Pass: Identify start/end of islands */
        bGPDspoint *pt = gps->points;
        for (int i = 0; i < gps->totpoints; i++, pt++) {
@@ -1902,13 +1901,14 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
                                /* 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);
+                                       MDeformVert *dvert_src = &gps->dvert[e];
+                                       MDeformVert *dvert_dst = &new_stroke->dvert[i];
+                                       if (dvert_src->dw) {
+                                               dvert_dst->dw = MEM_dupallocN(dvert_src->dw);
+                                       }
                                        e++;
                                }
                        }
-
                        /* Each island corresponds to a new stroke. We must adjust the
                         * timings of these new strokes:
                         *
@@ -1954,17 +1954,8 @@ void gp_stroke_delete_tagged_points(bGPDframe *gpf, bGPDstroke *gps, bGPDstroke
        MEM_freeN(islands);
 
        /* Delete the old stroke */
-       if (gps->points) {
-               MEM_freeN(gps->points);
-       }
-       if (gps->dvert) {
-               BKE_gpencil_free_stroke_weights(gps);
-               MEM_freeN(gps->dvert);
-       }
-       if (gps->triangles) {
-               MEM_freeN(gps->triangles);
-       }
-       BLI_freelinkN(&gpf->strokes, gps);
+       BLI_remlink(&gpf->strokes, gps);
+       BKE_gpencil_free_stroke(gps);
 }
 
 /* Split selected strokes into segments, splitting on selected points */
index 226a2bc..7765768 100644 (file)
@@ -2057,6 +2057,11 @@ static bool gpencil_check_collision(
 static void gp_copy_points(
        bGPDstroke *gps, bGPDspoint *pt, bGPDspoint *pt_final, int i, int i2)
 {
+       /* don't copy same point */
+       if (i == i2) {
+               return;
+       }
+
        copy_v3_v3(&pt_final->x, &pt->x);
        pt_final->pressure = pt->pressure;
        pt_final->strength = pt->strength;
@@ -2068,9 +2073,16 @@ static void gp_copy_points(
        if (gps->dvert != NULL) {
                MDeformVert *dvert = &gps->dvert[i];
                MDeformVert *dvert_final = &gps->dvert[i2];
+               MEM_SAFE_FREE(dvert_final->dw);
 
                dvert_final->totweight = dvert->totweight;
-               dvert_final->dw = dvert->dw;
+               if (dvert->dw == NULL) {
+                       dvert_final->dw = NULL;
+                       dvert_final->totweight = 0;
+               }
+               else {
+                       dvert_final->dw = MEM_dupallocN(dvert->dw);
+               }
        }
 
 }