[Bf-blender-cvs] [864a53e2769] master: Fix gradient tool crash with recent changes
Campbell Barton
noreply at git.blender.org
Sun Oct 1 16:24:04 CEST 2017
Commit: 864a53e276967359714723d6c3b700ae4dfb7f8c
Author: Campbell Barton
Date: Mon Oct 2 01:34:51 2017 +1100
Branches: master
https://developer.blender.org/rB864a53e276967359714723d6c3b700ae4dfb7f8c
Fix gradient tool crash with recent changes
Having gesture automatic free memory isn't practical if this
has it's own allocations.
Add option not to free userdata.
===================================================================
M source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
M source/blender/windowmanager/WM_types.h
M source/blender/windowmanager/intern/wm_gesture.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
index 4e807ccb4ef..9483a12aa6a 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
@@ -671,15 +671,14 @@ static void gradientVertInit__mapFunc(
static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
- int ret = WM_gesture_straightline_modal(C, op, event);
wmGesture *gesture = op->customdata;
DMGradient_vertStoreBase *vert_cache = gesture->userdata;
- bool do_gesture_free = false;
+ int ret = WM_gesture_straightline_modal(C, op, event);
if (ret & OPERATOR_RUNNING_MODAL) {
if (event->type == LEFTMOUSE && event->val == KM_RELEASE) { /* XXX, hardcoded */
/* generally crap! redo! */
- do_gesture_free = true;
+ WM_gesture_straightline_cancel(C, op);
ret &= ~OPERATOR_RUNNING_MODAL;
ret |= OPERATOR_FINISHED;
}
@@ -693,16 +692,14 @@ static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEven
BKE_defvert_array_copy(me->dvert, vert_cache->wpp.wpaint_prev, me->totvert);
wpaint_prev_destroy(&vert_cache->wpp);
}
+ MEM_freeN(vert_cache);
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
}
else if (ret & OPERATOR_FINISHED) {
wpaint_prev_destroy(&vert_cache->wpp);
- }
-
- if (do_gesture_free) {
- WM_gesture_straightline_cancel(C, op);
+ MEM_freeN(vert_cache);
}
return ret;
@@ -733,6 +730,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
sizeof(DMGradient_vertStoreBase) +
(sizeof(DMGradient_vertStore) * me->totvert),
__func__);
+ gesture->userdata_free = false;
data.is_init = true;
wpaint_prev_create(&((DMGradient_vertStoreBase *)gesture->userdata)->wpp, me->dvert, me->totvert);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 97f9257b4cb..f6049f10378 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -423,6 +423,7 @@ typedef struct wmGesture {
/* free pointer to use for operator allocs (if set, its freed on exit)*/
void *userdata;
+ bool userdata_free;
} wmGesture;
/* ************** wmEvent ************************ */
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index e04571fe572..cc48b162352 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -71,6 +71,7 @@ wmGesture *WM_gesture_new(bContext *C, const wmEvent *event, int type)
gesture->type = type;
gesture->event_type = event->type;
gesture->swinid = ar->swinid; /* means only in area-region context! */
+ gesture->userdata_free = true; /* Free if userdata is set. */
wm_subwindow_origin_get(window, gesture->swinid, &sx, &sy);
@@ -114,7 +115,7 @@ void WM_gesture_end(bContext *C, wmGesture *gesture)
win->tweak = NULL;
BLI_remlink(&win->gesture, gesture);
MEM_freeN(gesture->customdata);
- if (gesture->userdata) {
+ if (gesture->userdata && gesture->userdata_free) {
MEM_freeN(gesture->userdata);
}
MEM_freeN(gesture);
More information about the Bf-blender-cvs
mailing list