Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-01-31 08:40:24 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-02-02 17:05:28 +0400
commitb58beed604f69ff8136d55f91ad75003cc5f575f (patch)
treef7bff176aecedc317851337bf3488d6a0b019d65 /source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
parent41cc86a666d22501f25c58d81b1b94020b8c997f (diff)
Imported D222 Diff 2 (ID 781) by flokkievids (Folkert de Vries).
Diffstat (limited to 'source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp')
-rw-r--r--source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp69
1 files changed, 51 insertions, 18 deletions
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
index 8287e280186..a284ea2a0b5 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;
+ }
+ }
+ }
+ sv = self->sv_it->operator->();
return BPy_StrokeVertex_from_StrokeVertex(*sv);
}
@@ -174,8 +207,8 @@ PyTypeObject StrokeVertexIterator_Type = {
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- PyObject_SelfIter, /* tp_iter */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)StrokeVertexIterator_iter, /* tp_iter */
(iternextfunc)StrokeVertexIterator_iternext, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */