From 3ce31633796cd1139cff96eaa4697d6d6f8ba10e Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 9 May 2016 19:41:48 +1200 Subject: [PATCH] Fixes for GPencil Copy and Paste * 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 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 8e0a83d4f29..bd1697b9a54 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -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;