PCQRSCANER/venv/Lib/site-packages/pyzbar/wrapper.py
2019-12-22 21:51:47 +01:00

266 lines
6.7 KiB
Python

"""Low-level wrapper around zbar's interface
"""
from ctypes import (
c_ubyte, c_char_p, c_int, c_uint, c_ulong, c_void_p, Structure,
CFUNCTYPE, POINTER
)
from enum import IntEnum, unique
from . import zbar_library
__all__ = [
'EXTERNAL_DEPENDENCIES', 'LIBZBAR', 'ZBarConfig', 'ZBarSymbol',
'zbar_image_create', 'zbar_image_destroy', 'zbar_image_first_symbol',
'zbar_image_scanner_create', 'zbar_image_scanner_destroy',
'zbar_image_scanner_set_config', 'zbar_image_set_data',
'zbar_image_set_format', 'zbar_image_set_size', 'zbar_scan_image',
'zbar_symbol_get_data', 'zbar_symbol_get_loc_size',
'zbar_symbol_get_loc_x', 'zbar_symbol_get_loc_y', 'zbar_symbol_next'
]
# Globals populated in load_libzbar
LIBZBAR = None
"""ctypes.CDLL
"""
EXTERNAL_DEPENDENCIES = []
"""List of instances of ctypes.CDLL. Helpful when freezing.
"""
# Types
c_ubyte_p = POINTER(c_ubyte)
c_uint_p = POINTER(c_uint)
c_ulong_p = POINTER(c_ulong)
"""unsigned char* type
"""
# Defines and enums
@unique
class ZBarSymbol(IntEnum):
NONE = 0 # /**< no symbol decoded */
PARTIAL = 1 # /**< intermediate status */
EAN2 = 2 # /**< GS1 2-digit add-on */
EAN5 = 5 # /**< GS1 5-digit add-on */
EAN8 = 8 # /**< EAN-8 */
UPCE = 9 # /**< UPC-E */
ISBN10 = 10 # /**< ISBN-10 (from EAN-13). @since 0.4 */
UPCA = 12 # /**< UPC-A */
EAN13 = 13 # /**< EAN-13 */
ISBN13 = 14 # /**< ISBN-13 (from EAN-13). @since 0.4 */
COMPOSITE = 15 # /**< EAN/UPC composite */
I25 = 25 # /**< Interleaved 2 of 5. @since 0.4 */
DATABAR = 34 # /**< GS1 DataBar (RSS). @since 0.11 */
DATABAR_EXP = 35 # /**< GS1 DataBar Expanded. @since 0.11 */
CODABAR = 38 # /**< Codabar. @since 0.11 */
CODE39 = 39 # /**< Code 39. @since 0.4 */
PDF417 = 57 # /**< PDF417. @since 0.6 */
QRCODE = 64 # /**< QR Code. @since 0.10 */
CODE93 = 93 # /**< Code 93. @since 0.11 */
CODE128 = 128 # /**< Code 128 */
@unique
class ZBarConfig(IntEnum):
CFG_ENABLE = 0 # /**< enable symbology/feature */
CFG_ADD_CHECK = 1 # /**< enable check digit when optional */
CFG_EMIT_CHECK = 2 # /**< return check digit when present */
CFG_ASCII = 3 # /**< enable full ASCII character set */
CFG_NUM = 4 # /**< number of boolean decoder configs */
CFG_MIN_LEN = 0x20 # /**< minimum data length for valid decode */
CFG_MAX_LEN = 0x21 # /**< maximum data length for valid decode */
CFG_UNCERTAINTY = 0x40 # /**< required video consistency frames */
CFG_POSITION = 0x80 # /**< enable scanner to collect position data */
CFG_X_DENSITY = 0x100 # /**< image scanner vertical scan density */
CFG_Y_DENSITY = 0x101 # /**< image scanner horizontal scan density */
# Structs
class zbar_image_scanner(Structure):
"""Opaque C++ class with private implementation
"""
pass
class zbar_image(Structure):
"""Opaque C++ class with private implementation
"""
pass
class zbar_symbol(Structure):
"""Opaque C++ class with private implementation
The first item in the structure is an integeger value in the ZBarSymbol
enumeration.
"""
_fields_ = [
('type', c_int),
]
def load_libzbar():
"""Loads the zbar shared library and its dependencies.
Populates the globals LIBZBAR and EXTERNAL_DEPENDENCIES.
"""
global LIBZBAR
global EXTERNAL_DEPENDENCIES
if not LIBZBAR:
libzbar, dependencies = zbar_library.load()
LIBZBAR = libzbar
EXTERNAL_DEPENDENCIES = [LIBZBAR] + dependencies
return LIBZBAR
# Function signatures
def zbar_function(fname, restype, *args):
"""Returns a foreign function exported by `zbar`.
Args:
fname (:obj:`str`): Name of the exported function as string.
restype (:obj:): Return type - one of the `ctypes` primitive C data
types.
*args: Arguments - a sequence of `ctypes` primitive C data types.
Returns:
cddl.CFunctionType: A wrapper around the function.
"""
prototype = CFUNCTYPE(restype, *args)
return prototype((fname, load_libzbar()))
zbar_version = zbar_function(
'zbar_version',
c_int,
c_uint_p, # major,
c_uint_p, # minor
)
zbar_set_verbosity = zbar_function(
'zbar_set_verbosity',
None,
c_int
)
zbar_image_scanner_create = zbar_function(
'zbar_image_scanner_create',
POINTER(zbar_image_scanner)
)
zbar_image_scanner_destroy = zbar_function(
'zbar_image_scanner_destroy',
None,
POINTER(zbar_image_scanner)
)
zbar_parse_config = zbar_function(
'zbar_parse_config',
c_int,
c_char_p, # config_string,
POINTER(c_int), # symbology - values in ZBarSymbol
POINTER(c_int), # config - values in ZBarConfig
POINTER(c_int), # value
)
zbar_image_scanner_set_config = zbar_function(
'zbar_image_scanner_set_config',
c_int,
POINTER(zbar_image_scanner), # scanner
c_int, # symbology - values in ZBarSymbol
c_int, # config - values in ZBarConfig
c_int # value
)
zbar_image_create = zbar_function(
'zbar_image_create',
POINTER(zbar_image)
)
zbar_image_destroy = zbar_function(
'zbar_image_destroy',
None,
POINTER(zbar_image)
)
zbar_image_set_format = zbar_function(
'zbar_image_set_format',
None,
POINTER(zbar_image),
c_uint
)
zbar_image_set_size = zbar_function(
'zbar_image_set_size',
None,
POINTER(zbar_image),
c_uint, # width
c_uint # height
)
zbar_image_set_data = zbar_function(
'zbar_image_set_data',
None,
POINTER(zbar_image),
c_void_p, # data
c_ulong, # raw_image_data_length
c_void_p # A function pointer(!)
)
zbar_scan_image = zbar_function(
'zbar_scan_image',
c_int,
POINTER(zbar_image_scanner),
POINTER(zbar_image)
)
zbar_image_first_symbol = zbar_function(
'zbar_image_first_symbol',
POINTER(zbar_symbol),
POINTER(zbar_image)
)
zbar_symbol_get_data_length = zbar_function(
'zbar_symbol_get_data_length',
c_uint,
POINTER(zbar_symbol)
)
zbar_symbol_get_data = zbar_function(
'zbar_symbol_get_data',
c_char_p,
POINTER(zbar_symbol)
)
zbar_symbol_get_loc_size = zbar_function(
'zbar_symbol_get_loc_size',
c_uint,
POINTER(zbar_symbol)
)
zbar_symbol_get_loc_x = zbar_function(
'zbar_symbol_get_loc_x',
c_int,
POINTER(zbar_symbol),
c_uint
)
zbar_symbol_get_loc_y = zbar_function(
'zbar_symbol_get_loc_y',
c_int,
POINTER(zbar_symbol),
c_uint
)
zbar_symbol_next = zbar_function(
'zbar_symbol_next',
POINTER(zbar_symbol),
POINTER(zbar_symbol)
)