[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55900] trunk/blender/source/blender/ editors: fix for various crashes from incorrect poll functions.

Campbell Barton ideasman42 at gmail.com
Mon Apr 8 12:03:51 CEST 2013


Revision: 55900
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55900
Author:   campbellbarton
Date:     2013-04-08 10:03:51 +0000 (Mon, 08 Apr 2013)
Log Message:
-----------
fix for various crashes from incorrect poll functions.
- bevel had incorrect cancel when initialization failed which could crash (own mistake).
- main particle poll function didnt check if the area/region were NULL.
- some uv operators needed space image but didnt check for it. also use uv_ prefix for most operator functions.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_screen.h
    trunk/blender/source/blender/editors/mesh/editmesh_bevel.c
    trunk/blender/source/blender/editors/mesh/editmesh_inset.c
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c

Modified: trunk/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_screen.h	2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/include/ED_screen.h	2013-04-08 10:03:51 UTC (rev 55900)
@@ -170,6 +170,7 @@
 int     ED_operator_editlattice(struct bContext *C);
 int     ED_operator_editmball(struct bContext *C);
 int     ED_operator_uvedit(struct bContext *C);
+int     ED_operator_uvedit_space_image(struct bContext *C);
 int     ED_operator_uvmap(struct bContext *C);
 int     ED_operator_posemode_exclusive(struct bContext *C);
 int     ED_operator_posemode_context(struct bContext *C);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_bevel.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_bevel.c	2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/mesh/editmesh_bevel.c	2013-04-08 10:03:51 UTC (rev 55900)
@@ -91,14 +91,14 @@
 	}
 }
 
-static int edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal)
+static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal)
 {
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 	BevelData *opdata;
 
 	if (em->bm->totvertsel == 0) {
-		return 0;
+		return false;
 	}
 
 	op->customdata = opdata = MEM_mallocN(sizeof(BevelData), "beveldata_mesh_operator");
@@ -122,10 +122,10 @@
 		v3d->twtype = 0;
 	}
 
-	return 1;
+	return true;
 }
 
-static int edbm_bevel_calc(wmOperator *op)
+static bool edbm_bevel_calc(wmOperator *op)
 {
 	BevelData *opdata = op->customdata;
 	BMEditMesh *em = opdata->em;
@@ -139,12 +139,9 @@
 		EDBM_redo_state_restore(opdata->mesh_backup, em, false);
 	}
 
-	if (!EDBM_op_init(em, &bmop, op,
-		              "bevel geom=%hev offset=%f segments=%i vertex_only=%b",
-		              BM_ELEM_SELECT, offset, segments, vertex_only))
-	{
-		return 0;
-	}
+	EDBM_op_init(em, &bmop, op,
+	             "bevel geom=%hev offset=%f segments=%i vertex_only=%b",
+	             BM_ELEM_SELECT, offset, segments, vertex_only);
 
 	BMO_op_exec(em->bm, &bmop);
 
@@ -157,13 +154,13 @@
 
 	/* no need to de-select existing geometry */
 	if (!EDBM_op_finish(em, &bmop, op, true))
-		return 0;
+		return false;
 
 	EDBM_mesh_normals_update(opdata->em);
 
 	EDBM_update_generic(opdata->em, true, true);
 
-	return 1;
+	return true;
 }
 
 static void edbm_bevel_exit(bContext *C, wmOperator *op)
@@ -207,7 +204,6 @@
 static int edbm_bevel_exec(bContext *C, wmOperator *op)
 {
 	if (!edbm_bevel_init(C, op, false)) {
-		edbm_bevel_exit(C, op);
 		return OPERATOR_CANCELLED;
 	}
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh_inset.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_inset.c	2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/mesh/editmesh_inset.c	2013-04-08 10:03:51 UTC (rev 55900)
@@ -107,14 +107,14 @@
 }
 
 
-static int edbm_inset_init(bContext *C, wmOperator *op, const bool is_modal)
+static bool edbm_inset_init(bContext *C, wmOperator *op, const bool is_modal)
 {
 	InsetData *opdata;
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 
 	if (em->bm->totvertsel == 0) {
-		return 0;
+		return false;
 	}
 
 	op->customdata = opdata = MEM_mallocN(sizeof(InsetData), "inset_operator_data");
@@ -141,7 +141,7 @@
 		v3d->twtype = 0;
 	}
 
-	return 1;
+	return true;
 }
 
 static void edbm_inset_exit(bContext *C, wmOperator *op)
@@ -183,7 +183,7 @@
 	return OPERATOR_CANCELLED;
 }
 
-static int edbm_inset_calc(wmOperator *op)
+static bool edbm_inset_calc(wmOperator *op)
 {
 	InsetData *opdata;
 	BMEditMesh *em;
@@ -233,11 +233,11 @@
 	}
 
 	if (!EDBM_op_finish(em, &bmop, op, true)) {
-		return 0;
+		return false;
 	}
 	else {
 		EDBM_update_generic(em, true, true);
-		return 1;
+		return true;
 	}
 }
 

Modified: trunk/blender/source/blender/editors/physics/particle_edit.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_edit.c	2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/physics/particle_edit.c	2013-04-08 10:03:51 UTC (rev 55900)
@@ -132,8 +132,12 @@
 
 int PE_poll_view3d(bContext *C)
 {
-	return PE_poll(C) && CTX_wm_area(C)->spacetype == SPACE_VIEW3D &&
-		CTX_wm_region(C)->regiontype == RGN_TYPE_WINDOW;
+	ScrArea *sa = CTX_wm_area(C);
+	ARegion *ar = CTX_wm_region(C);
+
+	return (PE_poll(C) &&
+	        (sa && sa->spacetype == SPACE_VIEW3D) &&
+	        (ar && ar->regiontype == RGN_TYPE_WINDOW));
 }
 
 void PE_free_ptcache_edit(PTCacheEdit *edit)

Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c	2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c	2013-04-08 10:03:51 UTC (rev 55900)
@@ -421,6 +421,13 @@
 	return ED_space_image_show_uvedit(sima, obedit);
 }
 
+int ED_operator_uvedit_space_image(bContext *C)
+{
+	SpaceImage *sima = CTX_wm_space_image(C);
+	Object *obedit = CTX_data_edit_object(C);
+	return sima && ED_space_image_show_uvedit(sima, obedit);
+}
+
 int ED_operator_uvmap(bContext *C)
 {
 	Object *obedit = CTX_data_edit_object(C);

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2013-04-08 10:03:51 UTC (rev 55900)
@@ -83,7 +83,7 @@
 
 #include "uvedit_intern.h"
 
-static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
+static void uv_select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
 
 /************************* state testing ************************/
 
@@ -742,7 +742,7 @@
 	}
 }
 
-static void find_nearest_uv_face(Scene *scene, Image *ima, BMEditMesh *em, const float co[2], NearestHit *hit)
+static void uv_find_nearest_face(Scene *scene, Image *ima, BMEditMesh *em, const float co[2], NearestHit *hit)
 {
 	MTexPoly *tf;
 	BMFace *efa;
@@ -776,7 +776,7 @@
 	}
 }
 
-static int nearest_uv_between(BMEditMesh *em, BMFace *efa, int UNUSED(nverts), int id,
+static int uv_nearest_between(BMEditMesh *em, BMFace *efa, int UNUSED(nverts), int id,
                               const float co[2], const float uv[2])
 {
 	BMLoop *l;
@@ -864,7 +864,7 @@
 
 			if (dist <= mindist) {
 				if (dist == mindist)
-					if (!nearest_uv_between(em, efa, efa->len, i, co, luv->uv)) {
+					if (!uv_nearest_between(em, efa, efa->len, i, co, luv->uv)) {
 						i++;
 						continue;
 					}
@@ -926,7 +926,7 @@
 
 /*********************** loop select ***********************/
 
-static void select_edgeloop_uv_vertex_loop_flag(UvMapVert *first)
+static void uv_select_edgeloop_vertex_loop_flag(UvMapVert *first)
 {
 	UvMapVert *iterv;
 	int count = 0;
@@ -942,7 +942,7 @@
 		first->flag = 1;
 }
 
-static UvMapVert *select_edgeloop_uv_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a)
+static UvMapVert *uv_select_edgeloop_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a)
 {
 	UvMapVert *iterv, *first;
 	BMLoop *l;
@@ -960,7 +960,7 @@
 	return NULL;
 }
 
-static int select_edgeloop_uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first2, int *totface)
+static int uv_select_edgeloop_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first2, int *totface)
 {
 	UvMapVert *iterv1, *iterv2;
 	BMFace *efa;
@@ -1012,8 +1012,8 @@
 	return 1;
 }
 
-static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit,
-                           float limit[2], const bool extend)
+static int uv_select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit,
+                              float limit[2], const bool extend)
 {
 	BMFace *efa;
 	BMIter iter, liter;
@@ -1032,20 +1032,20 @@
 	BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_FACE);
 
 	if (!extend) {
-		select_all_perform(scene, ima, em, SEL_DESELECT);
+		uv_select_all_perform(scene, ima, em, SEL_DESELECT);
 	}
 
 	BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, FALSE);
 
 	/* set flags for first face and verts */
 	nverts = hit->efa->len;
-	iterv1 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, hit->lindex);
-	iterv2 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts);
-	select_edgeloop_uv_vertex_loop_flag(iterv1);
-	select_edgeloop_uv_vertex_loop_flag(iterv2);
+	iterv1 = uv_select_edgeloop_vertex_map_get(vmap, hit->efa, hit->lindex);
+	iterv2 = uv_select_edgeloop_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts);
+	uv_select_edgeloop_vertex_loop_flag(iterv1);
+	uv_select_edgeloop_vertex_loop_flag(iterv2);
 
 	starttotf = 0;
-	select_edgeloop_uv_edge_tag_faces(em, iterv1, iterv2, &starttotf);
+	uv_select_edgeloop_edge_tag_faces(em, iterv1, iterv2, &starttotf);
 
 	/* sorry, first edge isn't even ok */
 	if (iterv1->flag == 0 && iterv2->flag == 0) looking = 0;
@@ -1064,20 +1064,20 @@
 				nverts = efa->len;
 				for (a = 0; a < nverts; a++) {
 					/* check face not hidden and not tagged */
-					iterv1 = select_edgeloop_uv_vertex_map_get(vmap, efa, a);
-					iterv2 = select_edgeloop_uv_vertex_map_get(vmap, efa, (a + 1) % nverts);
+					iterv1 = uv_select_edgeloop_vertex_map_get(vmap, efa, a);
+					iterv2 = uv_select_edgeloop_vertex_map_get(vmap, efa, (a + 1) % nverts);
 					
 					if (!iterv1 || !iterv2)
 						continue;
 
 					/* check if vertex is tagged and has right valence */
 					if (iterv1->flag || iterv2->flag) {
-						if (select_edgeloop_uv_edge_tag_faces(em, iterv1, iterv2, &starttotf)) {
+						if (uv_select_edgeloop_edge_tag_faces(em, iterv1, iterv2, &starttotf)) {
 							looking = 1;
 							BM_elem_flag_enable(efa, BM_ELEM_TAG);
 
-							select_edgeloop_uv_vertex_loop_flag(iterv1);
-							select_edgeloop_uv_vertex_loop_flag(iterv2);
+							uv_select_edgeloop_vertex_loop_flag(iterv1);
+							uv_select_edgeloop_vertex_loop_flag(iterv2);
 							break;
 						}
 					}
@@ -1088,8 +1088,8 @@
 
 	/* do the actual select/deselect */
 	nverts = hit->efa->len;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list