[Bf-blender-cvs] [b58beed] master: Imported D222 Diff 2 (ID 781) by flokkievids (Folkert de Vries).

Tamito Kajiyama noreply at git.blender.org
Sun Feb 2 14:07:19 CET 2014


Commit: b58beed604f69ff8136d55f91ad75003cc5f575f
Author: Tamito Kajiyama
Date:   Fri Jan 31 13:40:24 2014 +0900
https://developer.blender.org/rBb58beed604f69ff8136d55f91ad75003cc5f575f

Imported D222 Diff 2 (ID 781) by flokkievids (Folkert de Vries).

===================================================================

M	source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
M	source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
M	source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
M	source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
M	source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
M	source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h
M	source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp
M	source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h

===================================================================

diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
index 2927297..8ff744c 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
@@ -74,10 +74,14 @@ static int AdjacencyIterator_init(BPy_AdjacencyIterator *self, PyObject *args, P
 	PyObject *obj1 = 0, *obj2 = 0, *obj3 = 0;
 
 	if (PyArg_ParseTupleAndKeywords(args, kwds, "|O!", (char **)kwlist_1, &AdjacencyIterator_Type, &obj1)) {
-		if (!obj1)
+        if (!obj1) {
 			self->a_it = new AdjacencyIterator();
-		else 
+            self->at_start = true;
+        }
+        else {
 			self->a_it = new AdjacencyIterator(*(((BPy_AdjacencyIterator *)obj1)->a_it));
+            self->at_start = ((BPy_AdjacencyIterator *)obj1)->at_start;
+        }
 	}
 	else if (PyErr_Clear(), (obj2 = obj3 = 0),
 	         PyArg_ParseTupleAndKeywords(args, kwds, "O!|O!O!", (char **)kwlist_2,
@@ -86,6 +90,7 @@ static int AdjacencyIterator_init(BPy_AdjacencyIterator *self, PyObject *args, P
 		bool restrictToSelection = (!obj2) ? true : bool_from_PyBool(obj2);
 		bool restrictToUnvisited = (!obj3) ? true : bool_from_PyBool(obj3);
 		self->a_it = new AdjacencyIterator(((BPy_ViewVertex *)obj1)->vv, restrictToSelection, restrictToUnvisited);
+        self->at_start = ((BPy_AdjacencyIterator *)obj1)->at_start;
 	}
 	else {
 		PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
@@ -95,15 +100,31 @@ static int AdjacencyIterator_init(BPy_AdjacencyIterator *self, PyObject *args, P
 	return 0;
 }
 
+static PyObject *AdjacencyIterator_iter(BPy_AdjacencyIterator *self)
+{
+    Py_INCREF(self);
+    self->at_start = true;
+    return (PyObject *) self;
+}
+
 static PyObject *AdjacencyIterator_iternext(BPy_AdjacencyIterator *self)
 {
 	if (self->a_it->isEnd()) {
 		PyErr_SetNone(PyExc_StopIteration);
 		return NULL;
 	}
-	ViewEdge *ve = self->a_it->operator*();
-	self->a_it->increment();
-	return BPy_ViewEdge_from_ViewEdge(*ve);
+
+    if (self->at_start)
+        self->at_start = false;
+    else {
+        self->a_it->increment();
+        if (self->a_it->isEnd()){
+            PyErr_SetNone(PyExc_StopIteration);
+            return NULL;
+        }
+    }
+    ViewEdge *ve = self->a_it->operator->();
+    return BPy_ViewEdge_from_ViewEdge(*ve);
 }
 
 /*----------------------AdjacencyIterator get/setters ----------------------------*/
@@ -175,7 +196,7 @@ PyTypeObject AdjacencyIterator_Type = {
 	0,                              /* tp_clear */
 	0,                              /* tp_richcompare */
 	0,                              /* tp_weaklistoffset */
-	PyObject_SelfIter,              /* tp_iter */
+    (getiterfunc)AdjacencyIterator_iter, /* tp_iter */
 	(iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */
 	0,                              /* tp_methods */
 	0,                              /* tp_members */
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
index 3fd1441..d675cdb 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
@@ -45,6 +45,7 @@ extern PyTypeObject AdjacencyIterator_Type;
 typedef struct {
 	BPy_Iterator py_it;
 	AdjacencyIterator *a_it;
+    bool at_start;
 } BPy_AdjacencyIterator;
 
 ///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
index 3a24626..e6a0180 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
@@ -76,41 +76,66 @@ static int Interface0DIterator_init(BPy_Interface0DIterator *self, PyObject *arg
 
 	if (PyArg_ParseTupleAndKeywords(args, kwds, "O&", (char **)kwlist_1, convert_nested_it, &nested_it)) {
 		self->if0D_it = new Interface0DIterator(nested_it->copy());
+        self->at_start = true;
+        self->reversed = false;
 	}
 	else if (PyErr_Clear(),
 	         PyArg_ParseTupleAndKeywords(args, kwds, "O!", (char **)kwlist_2, &Interface0DIterator_Type, &brother))
 	{
 		self->if0D_it = new Interface0DIterator(*(((BPy_Interface0DIterator *)brother)->if0D_it));
+        self->at_start = ((BPy_Interface0DIterator *)brother)->at_start;
+        self->reversed = ((BPy_Interface0DIterator *)brother)->reversed;
 	}
 	else {
 		PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
 		return -1;
 	}
 	self->py_it.it = self->if0D_it;
-	self->reversed = 0;
 	return 0;
 }
 
-static PyObject *Interface0DIterator_iternext(BPy_Interface0DIterator *self)
+static PyObject *Interface0DIterator_iter(BPy_Interface0DIterator *self)
 {
-	Interface0D *if0D;
+    Py_INCREF(self);
+    self->at_start = true;
+    return (PyObject *) self;
+}
 
+static PyObject *Interface0DIterator_iternext(BPy_Interface0DIterator *self)
+{
 	if (self->reversed) {
 		if (self->if0D_it->isBegin()) {
 			PyErr_SetNone(PyExc_StopIteration);
 			return NULL;
 		}
-		self->if0D_it->decrement();
-		if0D = self->if0D_it->operator->();
+
+        if (self->at_start)
+            self->at_start = false;
+        else {
+            self->if0D_it->decrement();
+            if (self->if0D_it->isBegin()) {
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+        }
+
 	}
 	else {
 		if (self->if0D_it->isEnd()) {
 			PyErr_SetNone(PyExc_StopIteration);
 			return NULL;
 		}
-		if0D = self->if0D_it->operator->();
-		self->if0D_it->increment();
-	}
+        if (self->at_start)
+            self->at_start = false;
+        else {
+            self->if0D_it->increment();
+            if (self->if0D_it->isEnd()) {
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+        }
+    }
+    Interface0D *if0D = self->if0D_it->operator->();
 	return Any_BPy_Interface0D_from_Interface0D(*if0D);
 }
 
@@ -186,7 +211,7 @@ PyTypeObject Interface0DIterator_Type = {
 	0,                              /* tp_clear */
 	0,                              /* tp_richcompare */
 	0,                              /* tp_weaklistoffset */
-	PyObject_SelfIter,              /* tp_iter */
+    (getiterfunc)Interface0DIterator_iter, /* tp_iter */
 	(iternextfunc)Interface0DIterator_iternext, /* tp_iternext */
 	0,                              /* tp_methods */
 	0,                              /* tp_members */
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
index 359e009..afc21c6 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
@@ -45,7 +45,8 @@ extern PyTypeObject Interface0DIterator_Type;
 typedef struct {
 	BPy_Iterator py_it;
 	Interface0DIterator *if0D_it;
-	int reversed;
+    bool reversed;
+    bool at_start;
 } BPy_Interface0DIterator;
 
 ///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
index 8287e28..a284ea2 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
@@ -68,35 +68,68 @@ static int StrokeVertexIterator_init(BPy_StrokeVertexIterator *self, PyObject *a
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!", (char **)kwlist, &StrokeVertexIterator_Type, &brother))
 		return -1;
-	if (!brother)
+    if (!brother) {
 		self->sv_it = new StrokeInternal::StrokeVertexIterator();
-	else
+        self->reversed = false;
+        self->at_start = true;
+    }
+    else {
 		self->sv_it = new StrokeInternal::StrokeVertexIterator(*(((BPy_StrokeVertexIterator *)brother)->sv_it));
+        self->reversed = ((BPy_StrokeVertexIterator *)brother)->reversed;
+        self->at_start = ((BPy_StrokeVertexIterator *)brother)->at_start;
+    }
 	self->py_it.it = self->sv_it;
-	self->reversed = 0;
 	return 0;
 }
 
+static PyObject *StrokeVertexIterator_iter(BPy_StrokeVertexIterator *self)
+{
+    Py_INCREF(self);
+    self->at_start = true;
+    return (PyObject *) self;
+}
+
 static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self)
 {
 	StrokeVertex *sv;
 
 	if (self->reversed) {
-		if (self->sv_it->isBegin()) {
-			PyErr_SetNone(PyExc_StopIteration);
-			return NULL;
-		}
-		self->sv_it->decrement();
-		sv = self->sv_it->operator->();
+        if (self->sv_it->isBegin()) {
+            PyErr_SetNone(PyExc_StopIteration);
+            return NULL;
+        }
+
+        if (self->at_start)
+            self->at_start = false;      
+        else {
+            self->sv_it->increment();
+            if (self->sv_it->isBegin()){
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+        }
 	}
+
 	else {
-		if (self->sv_it->isEnd()) {
-			PyErr_SetNone(PyExc_StopIteration);
-			return NULL;
-		}
-		sv = self->sv_it->operator->();
-		self->sv_it->increment();
-	}
+        if (self->sv_it->isEnd()) {
+            PyErr_SetNone(PyExc_StopIteration);
+            return NULL;
+        }
+        /* if at the start of the iterator, only return the object
+         * and don't increment, to keep for-loops in sync */
+        if (self->at_start)
+            self->at_start = false;
+        /* after incrementing, check if the iterator is at its end
+         * exit the loop if it is. not doing so will result in a crash */
+        else {
+            self->sv_it->increment();
+            if (self->sv_it->isEnd()){
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+    

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list