diff options
Diffstat (limited to 'python/imagescanner.c')
-rw-r--r-- | python/imagescanner.c | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/python/imagescanner.c b/python/imagescanner.c new file mode 100644 index 0000000..54966b7 --- /dev/null +++ b/python/imagescanner.c @@ -0,0 +1,195 @@ +/*------------------------------------------------------------------------ + * 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 imagescanner_doc[] = + PyDoc_STR("scan images for barcodes.\n" + "\n" + "attaches symbols to image for each decoded result."); + +static zbarImageScanner *imagescanner_new(PyTypeObject *type, PyObject *args, + PyObject *kwds) +{ + static char *kwlist[] = { NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) + return (NULL); + + zbarImageScanner *self = (zbarImageScanner *)type->tp_alloc(type, 0); + if (!self) + return (NULL); + + self->zscn = zbar_image_scanner_create(); + if (!self->zscn) { + Py_DECREF(self); + return (NULL); + } + + return (self); +} + +static void imagescanner_dealloc(zbarImageScanner *self) +{ + zbar_image_scanner_destroy(self->zscn); + ((PyObject *)self)->ob_type->tp_free((PyObject *)self); +} + +static zbarSymbolSet *imagescanner_get_results(zbarImageScanner *self, + void *closure) +{ + const zbar_symbol_set_t *zsyms = zbar_image_scanner_get_results(self->zscn); + return (zbarSymbolSet_FromSymbolSet(zsyms)); +} + +static PyGetSetDef imagescanner_getset[] = { + { "results", (getter)imagescanner_get_results, NULL, NULL, NULL }, + { NULL } /* Sentinel */ +}; + +static PyObject *imagescanner_set_config(zbarImageScanner *self, PyObject *args, + PyObject *kwds) +{ + zbar_symbol_type_t sym = ZBAR_NONE; + zbar_config_t cfg = ZBAR_CFG_ENABLE; + int val = 1; + static char *kwlist[] = { "symbology", "config", "value", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iii", kwlist, &sym, &cfg, + &val)) + return (NULL); + + if (zbar_image_scanner_set_config(self->zscn, sym, cfg, val)) { + PyErr_SetString(PyExc_ValueError, "invalid configuration setting"); + return (NULL); + } + Py_RETURN_NONE; +} + +static PyObject *imagescanner_parse_config(zbarImageScanner *self, + PyObject *args, PyObject *kwds) +{ + const char *cfg = NULL; + static char *kwlist[] = { "config", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &cfg)) + return (NULL); + + if (zbar_image_scanner_parse_config(self->zscn, cfg)) { + PyErr_Format(PyExc_ValueError, "invalid configuration setting: %s", + cfg); + return (NULL); + } + Py_RETURN_NONE; +} + +static PyObject *imagescanner_enable_cache(zbarImageScanner *self, + PyObject *args, PyObject *kwds) +{ + unsigned char enable = 1; + static char *kwlist[] = { "enable", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&", kwlist, object_to_bool, + &enable)) + return (NULL); + + zbar_image_scanner_enable_cache(self->zscn, enable); + Py_RETURN_NONE; +} + +static PyObject *imagescanner_recycle(zbarImageScanner *self, PyObject *args, + PyObject *kwds) +{ + zbarImage *img = NULL; + static char *kwlist[] = { "image", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &zbarImage_Type, + &img)) + return (NULL); + + zbar_image_scanner_recycle_image(self->zscn, img->zimg); + Py_RETURN_NONE; +} + +static PyObject *imagescanner_scan(zbarImageScanner *self, PyObject *args, + PyObject *kwds) +{ + zbarImage *img = NULL; + static char *kwlist[] = { "image", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &zbarImage_Type, + &img)) + return (NULL); + + if (zbarImage_validate(img)) + return (NULL); + + int n = zbar_scan_image(self->zscn, img->zimg); + if (n < 0) { + PyErr_Format(PyExc_ValueError, "unsupported image format"); + return (NULL); + } +#if PY_MAJOR_VERSION >= 3 + return (PyLong_FromLong(n)); +#else + return (PyInt_FromLong(n)); +#endif +} + +static PyMethodDef imagescanner_methods[] = { + { + "set_config", + (PyCFunction)imagescanner_set_config, + METH_VARARGS | METH_KEYWORDS, + }, + { + "parse_config", + (PyCFunction)imagescanner_parse_config, + METH_VARARGS | METH_KEYWORDS, + }, + { + "enable_cache", + (PyCFunction)imagescanner_enable_cache, + METH_VARARGS | METH_KEYWORDS, + }, + { + "recycle", + (PyCFunction)imagescanner_recycle, + METH_VARARGS | METH_KEYWORDS, + }, + { + "scan", + (PyCFunction)imagescanner_scan, + METH_VARARGS | METH_KEYWORDS, + }, + { + NULL, + }, +}; + +PyTypeObject zbarImageScanner_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "zbar.ImageScanner", + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + + .tp_doc = imagescanner_doc, + .tp_basicsize = sizeof(zbarImageScanner), + .tp_new = (newfunc)imagescanner_new, + .tp_dealloc = (destructor)imagescanner_dealloc, + .tp_getset = imagescanner_getset, + .tp_methods = imagescanner_methods, +}; |