diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-01-31 08:40:24 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-02-02 17:05:28 +0400 |
commit | b58beed604f69ff8136d55f91ad75003cc5f575f (patch) | |
tree | f7bff176aecedc317851337bf3488d6a0b019d65 /source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp | |
parent | 41cc86a666d22501f25c58d81b1b94020b8c997f (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.cpp | 69 |
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 */ |