diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 00:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 00:06:44 +0000 |
commit | 44cf8ec67278bd1ab6c7f83a9993f7a5686a9541 (patch) | |
tree | 5eec4b0d1a3f163d279c3c27c03324ba49fa235a /python/scanner.c | |
parent | Initial commit. (diff) | |
download | zbar-44cf8ec67278bd1ab6c7f83a9993f7a5686a9541.tar.xz zbar-44cf8ec67278bd1ab6c7f83a9993f7a5686a9541.zip |
Adding upstream version 0.23.93.upstream/0.23.93upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'python/scanner.c')
-rw-r--r-- | python/scanner.c | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/python/scanner.c b/python/scanner.c new file mode 100644 index 0000000..e5ad8bf --- /dev/null +++ b/python/scanner.c @@ -0,0 +1,193 @@ +/*------------------------------------------------------------------------ + * Copyright 2009 (c) Jeff Brown <spadix@users.sourceforge.net> + * + * This file is part of the ZBar Bar Code Reader. + * + * The ZBar Bar Code Reader is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * The ZBar Bar Code Reader is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with the ZBar Bar Code Reader; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * http://sourceforge.net/projects/zbar + *------------------------------------------------------------------------*/ + +#include "zbarmodule.h" + +static char scanner_doc[] = PyDoc_STR( + "low level intensity sample stream scanner. identifies \"bar\" edges" + "and measures width between them.\n" + "\n" + "FIXME."); + +static zbarScanner *scanner_new(PyTypeObject *type, PyObject *args, + PyObject *kwds) +{ + zbarDecoder *decoder = NULL; + static char *kwlist[] = { "decoder", NULL }; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!", kwlist, &decoder, + zbarDecoder_Type)) + return (NULL); + + zbarScanner *self = (zbarScanner *)type->tp_alloc(type, 0); + if (!self) + return (NULL); + + zbar_decoder_t *zdcode = NULL; + if (decoder) { + Py_INCREF(decoder); + self->decoder = decoder; + zdcode = decoder->zdcode; + } + self->zscn = zbar_scanner_create(zdcode); + if (!self->zscn) { + Py_DECREF(self); + return (NULL); + } + + return (self); +} + +static int scanner_traverse(zbarScanner *self, visitproc visit, void *arg) +{ + Py_VISIT(self->decoder); + return (0); +} + +static int scanner_clear(zbarScanner *self) +{ + Py_CLEAR(self->decoder); + return (0); +} + +static void scanner_dealloc(zbarScanner *self) +{ + scanner_clear(self); + zbar_scanner_destroy(self->zscn); + ((PyObject *)self)->ob_type->tp_free((PyObject *)self); +} + +static PyObject *scanner_get_width(zbarScanner *self, void *closure) +{ + unsigned int width = zbar_scanner_get_width(self->zscn); +#if PY_MAJOR_VERSION >= 3 + return (PyLong_FromLong(width)); +#else + return (PyInt_FromLong(width)); +#endif +} + +static zbarEnumItem *scanner_get_color(zbarScanner *self, void *closure) +{ + zbar_color_t zcol = zbar_scanner_get_color(self->zscn); + assert(zcol == ZBAR_BAR || zcol == ZBAR_SPACE); + struct module_state *st = GETMODSTATE(); + zbarEnumItem *color = st->color_enum[zcol]; + Py_INCREF((PyObject *)color); + return (color); +} + +static PyGetSetDef scanner_getset[] = { + { + "color", + (getter)scanner_get_color, + }, + { + "width", + (getter)scanner_get_width, + }, + { + NULL, + }, +}; + +static PyObject *scanner_reset(zbarScanner *self, PyObject *args, + PyObject *kwds) +{ + static char *kwlist[] = { NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) + return (NULL); + + zbar_scanner_reset(self->zscn); + Py_RETURN_NONE; +} + +static PyObject *scanner_new_scan(zbarScanner *self, PyObject *args, + PyObject *kwds) +{ + static char *kwlist[] = { NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) + return (NULL); + + zbar_scanner_new_scan(self->zscn); + Py_RETURN_NONE; +} + +static zbarEnumItem *scanner_scan_y(zbarScanner *self, PyObject *args, + PyObject *kwds) +{ + /* FIXME should accept sequence of values */ + int y = 0; + static char *kwlist[] = { "y", NULL }; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &y)) + return (NULL); + + zbar_symbol_type_t sym = zbar_scan_y(self->zscn, y); + if (PyErr_Occurred()) + /* propagate errors during callback */ + return (NULL); + if (sym == ZBAR_NONE) { + /* hardcode most common case */ + struct module_state *st = GETMODSTATE(); + Py_INCREF((PyObject *)st->symbol_NONE); + return (st->symbol_NONE); + } + return (zbarSymbol_LookupEnum(sym)); +} + +static PyMethodDef scanner_methods[] = { + { + "reset", + (PyCFunction)scanner_reset, + METH_VARARGS | METH_KEYWORDS, + }, + { + "new_scan", + (PyCFunction)scanner_new_scan, + METH_VARARGS | METH_KEYWORDS, + }, + { + "scan_y", + (PyCFunction)scanner_scan_y, + METH_VARARGS | METH_KEYWORDS, + }, + { + NULL, + }, +}; + +PyTypeObject zbarScanner_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "zbar.Scanner", + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + + .tp_doc = scanner_doc, + .tp_basicsize = sizeof(zbarScanner), + .tp_new = (newfunc)scanner_new, + .tp_traverse = (traverseproc)scanner_traverse, + .tp_clear = (inquiry)scanner_clear, + .tp_dealloc = (destructor)scanner_dealloc, + .tp_getset = scanner_getset, + .tp_methods = scanner_methods, +}; |