Source code for libraw.bindings

""":mod:`libraw.bindings` --- Low-level LibRaw bindings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The :class:`libraw.bindings` module handles linking against the LibRaw binary.
"""

from ctypes import *  # noqa
from ctypes import util

from libraw import errors
from libraw.callbacks import data_callback
from libraw.callbacks import memory_callback
from libraw.callbacks import progress_callback
from libraw.errors import c_error
from libraw import structs_16
from libraw import structs_17
from libraw import structs_18


[docs]class LibRaw(CDLL): """ A :class:`ctypes.CDLL` that links against `libraw.so` (or the equivalent on your platform). Raises: ImportError: If LibRaw cannot be found on your system, or linking fails. """ def __init__(self): # pragma: no cover libraw = util.find_library('raw') try: if libraw is not None: super(LibRaw, self).__init__(libraw) else: raise ImportError except (ImportError, AttributeError, OSError, IOError): raise ImportError('Cannot find LibRaw on your system!') try: structs = { 16: structs_16, 17: structs_17, 18: structs_18, }[self.version_number[1]] except KeyError: raise ImportError( 'Unsupported Libraw version: %s.%s.%s.' % self.version_number ) libraw_data_t = structs.libraw_data_t libraw_decoder_info_t = structs.libraw_decoder_info_t libraw_processed_image_t = structs.libraw_processed_image_t # Define arg types self.libraw_init.argtypes = [c_int] # enum LibRaw_progress self.libraw_strprogress.argtypes = [c_int] self.libraw_unpack_function_name.argtypes = [POINTER(libraw_data_t)] self.libraw_subtract_black.argtypes = [POINTER(libraw_data_t)] self.libraw_open_file.argtypes = [POINTER(libraw_data_t), c_char_p] self.libraw_open_file_ex.argtypes = [ POINTER(libraw_data_t), c_char_p, c_int64 ] self.libraw_open_buffer.argtypes = [ POINTER(libraw_data_t), c_void_p, c_int64 ] self.libraw_unpack.argtypes = [POINTER(libraw_data_t)] self.libraw_unpack_thumb.argtypes = [POINTER(libraw_data_t)] self.libraw_recycle_datastream.argtypes = [POINTER(libraw_data_t)] self.libraw_recycle.argtypes = [POINTER(libraw_data_t)] self.libraw_close.argtypes = [POINTER(libraw_data_t)] self.libraw_set_memerror_handler.argtypes = [ POINTER(libraw_data_t), memory_callback, c_void_p, ] self.libraw_set_dataerror_handler.argtypes = [ POINTER(libraw_data_t), data_callback, c_void_p, ] self.libraw_set_progress_handler.argtypes = [ POINTER(libraw_data_t), progress_callback, c_void_p, ] self.libraw_adjust_sizes_info_only.argtypes = [ POINTER(libraw_data_t) ] self.libraw_dcraw_ppm_tiff_writer.argtypes = [ POINTER(libraw_data_t), c_char_p ] self.libraw_dcraw_thumb_writer.argtypes = [ POINTER(libraw_data_t), c_char_p ] self.libraw_dcraw_process.argtypes = [POINTER(libraw_data_t)] self.libraw_dcraw_make_mem_image.argtypes = [ POINTER(libraw_data_t), POINTER(c_int) ] self.libraw_dcraw_make_mem_thumb.argtypes = [ POINTER(libraw_data_t), POINTER(c_int) ] self.libraw_dcraw_clear_mem.argtypes = [ POINTER(libraw_processed_image_t) ] self.libraw_raw2image.argtypes = [POINTER(libraw_data_t)] self.libraw_free_image.argtypes = [POINTER(libraw_data_t)] self.libraw_get_decoder_info.argtypes = [ POINTER(libraw_data_t), POINTER(libraw_decoder_info_t) ] self.libraw_COLOR.argtypes = [ POINTER(libraw_data_t), c_int, c_int ] # Define return types self.libraw_init.restype = POINTER(libraw_data_t) self.libraw_version.restype = c_char_p self.libraw_strprogress.restype = c_char_p self.libraw_versionNumber.restype = c_int self.libraw_cameraCount.restype = c_int self.libraw_cameraList.restype = POINTER( c_char_p * self.libraw_cameraCount() ) self.libraw_unpack_function_name.restype = c_char_p self.libraw_subtract_black.restype = POINTER(libraw_data_t) self.libraw_open_file.restype = c_error self.libraw_open_file_ex.restype = c_error self.libraw_open_buffer.restype = c_error self.libraw_unpack.restype = c_error self.libraw_unpack_thumb.restype = c_error self.libraw_adjust_sizes_info_only.restype = c_error self.libraw_dcraw_ppm_tiff_writer.restype = c_error self.libraw_dcraw_thumb_writer.restype = c_error self.libraw_dcraw_process.restype = c_error self.libraw_dcraw_make_mem_image.restype = POINTER( libraw_processed_image_t) self.libraw_dcraw_make_mem_thumb.restype = POINTER( libraw_processed_image_t) self.libraw_raw2image.restype = c_error self.libraw_get_decoder_info.restype = c_error self.libraw_COLOR.restype = c_int # Some special Windows-only garbage: try: self.libraw_open_wfile.argtypes = [ POINTER(libraw_data_t), c_wchar_p ] self.libraw_open_wfile_ex.argtypes = [ POINTER(libraw_data_t), c_wchar_p, c_int64 ] self.libraw_open_wfile.restype = c_error self.libraw_open_wfile_ex.restype = c_error except AttributeError: pass @property def version_number(self): """ A numeric representation of the version of LibRaw which we have linked against in ``(Major, Minor, Patch)`` form. eg. :: (0, 16, 1) Returns: 3 tuple: The version number """ v = self.libraw_versionNumber() return ((v >> 16) & 0x0000ff, (v >> 8) & 0x0000ff, v & 0x0000ff) @property def version(self): """ A string representation of the version of LibRaw which we have linked against. eg. :: "0.16.1-Release" Returns: str: The version """ return self.libraw_version().decode('utf-8') def __getitem__(self, name): func = super(LibRaw, self).__getitem__(name) func.errcheck = errors.check_call return func