[Bf-blender-cvs] [5fdbb79] master: Freestyle: Fix for StrokeVertexIterator.__next__() ignoring the first and only element.

Tamito Kajiyama noreply at git.blender.org
Fri Oct 10 11:58:09 CEST 2014


Commit: 5fdbb793ff40a8c67200f147104fee6d3867afe1
Author: Tamito Kajiyama
Date:   Fri Oct 10 18:45:47 2014 +0900
Branches: master
https://developer.blender.org/rB5fdbb793ff40a8c67200f147104fee6d3867afe1

Freestyle: Fix for StrokeVertexIterator.__next__() ignoring the first and only element.

A StrokeVertexIterator ignores the first element when it is the only element.
Such an iterator can be created by the .incremented() method from an iterator
over two stroke vertices.

This problem is a regression from 2.71.  The present fix is appropriate to backport
if Blender 2.72a is planned.

Problem report by Kazuhiro Murakawa through personal communications, thanks!

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

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

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

diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
index c972db1..7419f0e 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
@@ -120,14 +120,20 @@ static PyObject *Interface0DIterator_iternext(BPy_Interface0DIterator *self)
 		self->if0D_it->decrement();
 	}
 	else {
-		if (self->if0D_it->atLast() || self->if0D_it->isEnd()) {
+		if (self->if0D_it->isEnd()) {
 			PyErr_SetNone(PyExc_StopIteration);
 			return NULL;
 		}
-		if (self->at_start)
+		else if (self->at_start) {
 			self->at_start = false;
-		else
+		}
+		else if (self->if0D_it->atLast()) {
+			PyErr_SetNone(PyExc_StopIteration);
+			return NULL;
+		}
+		else {
 			self->if0D_it->increment();
+		}
 	}
 	Interface0D *if0D = self->if0D_it->operator->();
 	return Any_BPy_Interface0D_from_Interface0D(*if0D);
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
index 18d1b37..275bfe9 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
@@ -115,19 +115,25 @@ static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self)
 		self->sv_it->decrement();
 	}
 	else {
-		/* if sv_it.isEnd() is true, the iterator can't be incremented. if sv_it.isLast() is true,
-		 * the iterator is currently pointing to the final valid argument. Incrementing it further would
-		 * give a python object that can't be dereferenced. */
-		if (self->sv_it->atLast() || self->sv_it->isEnd()) {
+		/* If sv_it.isEnd() is true, the iterator can't be incremented. */
+		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)
+		/* If at the start of the iterator, only return the object
+		* and don't increment, to keep for-loops in sync */
+		else if (self->at_start) {
 			self->at_start = false;
-		else
+		}
+		/* If sv_it.atLast() is true, the iterator is currently pointing to the final valid element.
+		 * Incrementing it further would lead to a state that the iterator can't be dereferenced. */
+		else if (self->sv_it->atLast()) {
+			PyErr_SetNone(PyExc_StopIteration);
+			return NULL;
+		}
+		else {
 			self->sv_it->increment();
+		}
 	}
 	StrokeVertex *sv = self->sv_it->operator->();
 	return BPy_StrokeVertex_from_StrokeVertex(*sv);




More information about the Bf-blender-cvs mailing list