Fixes for GPencil Copy and Paste
authorJoshua Leung <aligorith@gmail.com>
Mon, 9 May 2016 07:41:48 +0000 (19:41 +1200)
committerJoshua Leung <aligorith@gmail.com>
Mon, 9 May 2016 07:42:34 +0000 (19:42 +1200)
* Fix "Attempt to free NULL pointer" when copying strokes for the first time

* Fix poll callback on "paste" operator, so that it is possible to paste
  strokes when there are no editable strokes visible.

source/blender/editors/gpencil/gpencil_edit.c

index 8e0a83d4f29c7f1596f03b147d9022e17a6ea116..bd1697b9a54672a22b11bc992bd4904ca6e648a5 100644 (file)
@@ -296,12 +296,13 @@ void ED_gpencil_strokes_copybuf_free(void)
        for (gps = gp_strokes_copypastebuf.first; gps; gps = gpsn) {
                gpsn = gps->next;
                
-               MEM_freeN(gps->points);
-               MEM_freeN(gps->triangles);
+               if (gps->points)    MEM_freeN(gps->points);
+               if (gps->triangles) MEM_freeN(gps->triangles);
+               
                BLI_freelinkN(&gp_strokes_copypastebuf, gps);
        }
        
-       BLI_listbase_clear(&gp_strokes_copypastebuf);
+       gp_strokes_copypastebuf.first = gp_strokes_copypastebuf.last = NULL;
 }
 
 /* --------------------- */
@@ -386,6 +387,14 @@ void GPENCIL_OT_copy(wmOperatorType *ot)
 /* --------------------- */
 /* Paste selected strokes */
 
+static int gp_strokes_paste_poll(bContext *C)
+{
+       /* 1) Must have GP layer to paste to...
+        * 2) Copy buffer must at least have something (though it may be the wrong sort...)
+        */
+       return (CTX_data_active_gpencil_layer(C) != NULL) && (!BLI_listbase_is_empty(&gp_strokes_copypastebuf));
+}
+
 static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
 {
        Scene *scene = CTX_data_scene(C);
@@ -490,7 +499,7 @@ void GPENCIL_OT_paste(wmOperatorType *ot)
        
        /* callbacks */
        ot->exec = gp_strokes_paste_exec;
-       ot->poll = gp_stroke_edit_poll;
+       ot->poll = gp_strokes_paste_poll;
        
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;