mirror of
https://github.com/janeczku/calibre-web
synced 2024-11-24 18:47:23 +00:00
1400 lines
56 KiB
Python
1400 lines
56 KiB
Python
|
""":mod:`wand.api` --- Low-level interfaces
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
.. versionchanged:: 0.1.10
|
||
|
Changed to throw :exc:`~exceptions.ImportError` instead of
|
||
|
:exc:`~exceptions.AttributeError` when the shared library fails to load.
|
||
|
|
||
|
"""
|
||
|
import ctypes
|
||
|
import ctypes.util
|
||
|
import itertools
|
||
|
import os
|
||
|
import os.path
|
||
|
import platform
|
||
|
import sys
|
||
|
import traceback
|
||
|
if platform.system() == "Windows":
|
||
|
try:
|
||
|
import winreg
|
||
|
except ImportError:
|
||
|
import _winreg as winreg
|
||
|
|
||
|
__all__ = ('MagickPixelPacket', 'PointInfo', 'AffineMatrix', 'c_magick_char_p',
|
||
|
'library', 'libc', 'libmagick', 'load_library')
|
||
|
|
||
|
|
||
|
class c_magick_char_p(ctypes.c_char_p):
|
||
|
"""This subclass prevents the automatic conversion behavior of
|
||
|
:class:`ctypes.c_char_p`, allowing memory to be properly freed in the
|
||
|
destructor. It must only be used for non-const character pointers
|
||
|
returned by ImageMagick functions.
|
||
|
|
||
|
"""
|
||
|
|
||
|
def __del__(self):
|
||
|
"""Relinquishes memory allocated by ImageMagick.
|
||
|
We don't need to worry about checking for ``NULL`` because
|
||
|
:c:func:`MagickRelinquishMemory` does that for us.
|
||
|
Note alslo that :class:`ctypes.c_char_p` has no
|
||
|
:meth:`~object.__del__` method, so we don't need to
|
||
|
(and indeed can't) call the superclass destructor.
|
||
|
|
||
|
"""
|
||
|
library.MagickRelinquishMemory(self)
|
||
|
|
||
|
|
||
|
def library_paths():
|
||
|
"""Iterates for library paths to try loading. The result paths are not
|
||
|
guaranteed that they exist.
|
||
|
|
||
|
:returns: a pair of libwand and libmagick paths. they can be the same.
|
||
|
path can be ``None`` as well
|
||
|
:rtype: :class:`tuple`
|
||
|
|
||
|
"""
|
||
|
libwand = None
|
||
|
libmagick = None
|
||
|
versions = '', '-6', '-Q16', '-Q8', '-6.Q16'
|
||
|
options = '', 'HDRI', 'HDRI-2'
|
||
|
system = platform.system()
|
||
|
magick_home = os.environ.get('MAGICK_HOME')
|
||
|
|
||
|
if system == 'Windows':
|
||
|
# ImageMagick installers normally install coder and filter DLLs in
|
||
|
# subfolders, we need to add those folders to PATH, otherwise loading
|
||
|
# the DLL later will fail.
|
||
|
try:
|
||
|
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,
|
||
|
r"SOFTWARE\ImageMagick\Current") as reg_key:
|
||
|
libPath = winreg.QueryValueEx(reg_key, "LibPath")
|
||
|
coderPath = winreg.QueryValueEx(reg_key, "CoderModulesPath")
|
||
|
filterPath = winreg.QueryValueEx(reg_key, "FilterModulesPath")
|
||
|
magick_home = libPath[0]
|
||
|
os.environ['PATH'] += (';' + libPath[0] + ";" +
|
||
|
coderPath[0] + ";" + filterPath[0])
|
||
|
except OSError:
|
||
|
# otherwise use MAGICK_HOME, and we assume the coder and
|
||
|
# filter DLLs are in the same directory
|
||
|
pass
|
||
|
|
||
|
magick_path = lambda dir: os.path.join(magick_home, *dir)
|
||
|
combinations = itertools.product(versions, options)
|
||
|
for suffix in (version + option for version, option in combinations):
|
||
|
# On Windows, the API is split between two libs. On other platforms,
|
||
|
# it's all contained in one.
|
||
|
if magick_home:
|
||
|
if system == 'Windows':
|
||
|
libwand = 'CORE_RL_wand_{0}.dll'.format(suffix),
|
||
|
libmagick = 'CORE_RL_magick_{0}.dll'.format(suffix),
|
||
|
yield magick_path(libwand), magick_path(libmagick)
|
||
|
libwand = 'libMagickWand{0}.dll'.format(suffix),
|
||
|
libmagick = 'libMagickCore{0}.dll'.format(suffix),
|
||
|
yield magick_path(libwand), magick_path(libmagick)
|
||
|
elif system == 'Darwin':
|
||
|
libwand = 'lib', 'libMagickWand{0}.dylib'.format(suffix),
|
||
|
yield magick_path(libwand), magick_path(libwand)
|
||
|
else:
|
||
|
libwand = 'lib', 'libMagickWand{0}.so'.format(suffix),
|
||
|
yield magick_path(libwand), magick_path(libwand)
|
||
|
if system == 'Windows':
|
||
|
libwand = ctypes.util.find_library('CORE_RL_wand_' + suffix)
|
||
|
libmagick = ctypes.util.find_library('CORE_RL_magick_' + suffix)
|
||
|
yield libwand, libmagick
|
||
|
libwand = ctypes.util.find_library('libMagickWand' + suffix)
|
||
|
libmagick = ctypes.util.find_library('libMagickCore' + suffix)
|
||
|
yield libwand, libmagick
|
||
|
else:
|
||
|
libwand = ctypes.util.find_library('MagickWand' + suffix)
|
||
|
yield libwand, libwand
|
||
|
|
||
|
|
||
|
def load_library():
|
||
|
"""Loads the MagickWand library.
|
||
|
|
||
|
:returns: the MagickWand library and the ImageMagick library
|
||
|
:rtype: :class:`ctypes.CDLL`
|
||
|
|
||
|
"""
|
||
|
tried_paths = []
|
||
|
for libwand_path, libmagick_path in library_paths():
|
||
|
if libwand_path is None or libmagick_path is None:
|
||
|
continue
|
||
|
try:
|
||
|
tried_paths.append(libwand_path)
|
||
|
libwand = ctypes.CDLL(libwand_path)
|
||
|
if libwand_path == libmagick_path:
|
||
|
libmagick = libwand
|
||
|
else:
|
||
|
tried_paths.append(libmagick_path)
|
||
|
libmagick = ctypes.CDLL(libmagick_path)
|
||
|
except (IOError, OSError):
|
||
|
continue
|
||
|
return libwand, libmagick
|
||
|
raise IOError('cannot find library; tried paths: ' + repr(tried_paths))
|
||
|
|
||
|
|
||
|
if not hasattr(ctypes, 'c_ssize_t'):
|
||
|
if ctypes.sizeof(ctypes.c_uint) == ctypes.sizeof(ctypes.c_void_p):
|
||
|
ctypes.c_ssize_t = ctypes.c_int
|
||
|
elif ctypes.sizeof(ctypes.c_ulong) == ctypes.sizeof(ctypes.c_void_p):
|
||
|
ctypes.c_ssize_t = ctypes.c_long
|
||
|
elif ctypes.sizeof(ctypes.c_ulonglong) == ctypes.sizeof(ctypes.c_void_p):
|
||
|
ctypes.c_ssize_t = ctypes.c_longlong
|
||
|
|
||
|
|
||
|
class MagickPixelPacket(ctypes.Structure):
|
||
|
|
||
|
_fields_ = [('storage_class', ctypes.c_int),
|
||
|
('colorspace', ctypes.c_int),
|
||
|
('matte', ctypes.c_int),
|
||
|
('fuzz', ctypes.c_double),
|
||
|
('depth', ctypes.c_size_t),
|
||
|
('red', ctypes.c_double),
|
||
|
('green', ctypes.c_double),
|
||
|
('blue', ctypes.c_double),
|
||
|
('opacity', ctypes.c_double),
|
||
|
('index', ctypes.c_double)]
|
||
|
|
||
|
|
||
|
class PointInfo(ctypes.Structure):
|
||
|
|
||
|
_fields_ = [('x', ctypes.c_double),
|
||
|
('y', ctypes.c_double)]
|
||
|
|
||
|
|
||
|
class AffineMatrix(ctypes.Structure):
|
||
|
_fields_ = [('sx', ctypes.c_double),
|
||
|
('rx', ctypes.c_double),
|
||
|
('ry', ctypes.c_double),
|
||
|
('sy', ctypes.c_double),
|
||
|
('tx', ctypes.c_double),
|
||
|
('ty', ctypes.c_double)]
|
||
|
|
||
|
|
||
|
# Preserve the module itself even if it fails to import
|
||
|
sys.modules['wand._api'] = sys.modules['wand.api']
|
||
|
|
||
|
try:
|
||
|
libraries = load_library()
|
||
|
except (OSError, IOError):
|
||
|
msg = 'http://docs.wand-py.org/en/latest/guide/install.html'
|
||
|
if sys.platform.startswith('freebsd'):
|
||
|
msg = 'pkg_add -r'
|
||
|
elif sys.platform == 'win32':
|
||
|
msg += '#install-imagemagick-on-windows'
|
||
|
elif sys.platform == 'darwin':
|
||
|
mac_pkgmgrs = {'brew': 'brew install freetype imagemagick',
|
||
|
'port': 'port install imagemagick'}
|
||
|
for pkgmgr in mac_pkgmgrs:
|
||
|
with os.popen('which ' + pkgmgr) as f:
|
||
|
if f.read().strip():
|
||
|
msg = mac_pkgmgrs[pkgmgr]
|
||
|
break
|
||
|
else:
|
||
|
msg += '#install-imagemagick-on-mac'
|
||
|
else:
|
||
|
distname, _, __ = platform.linux_distribution()
|
||
|
distname = (distname or '').lower()
|
||
|
if distname in ('debian', 'ubuntu'):
|
||
|
msg = 'apt-get install libmagickwand-dev'
|
||
|
elif distname in ('fedora', 'centos', 'redhat'):
|
||
|
msg = 'yum install ImageMagick-devel'
|
||
|
raise ImportError('MagickWand shared library not found.\n'
|
||
|
'You probably had not installed ImageMagick library.\n'
|
||
|
'Try to install:\n ' + msg)
|
||
|
|
||
|
#: (:class:`ctypes.CDLL`) The MagickWand library.
|
||
|
library = libraries[0]
|
||
|
|
||
|
#: (:class:`ctypes.CDLL`) The ImageMagick library. It is the same with
|
||
|
#: :data:`library` on platforms other than Windows.
|
||
|
#:
|
||
|
#: .. versionadded:: 0.1.10
|
||
|
libmagick = libraries[1]
|
||
|
|
||
|
try:
|
||
|
library.MagickWandGenesis.argtypes = []
|
||
|
library.MagickWandTerminus.argtypes = []
|
||
|
|
||
|
library.NewMagickWand.argtypes = []
|
||
|
library.NewMagickWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickNewImage.argtypes = [ctypes.c_void_p, ctypes.c_int,
|
||
|
ctypes.c_int, ctypes.c_void_p]
|
||
|
|
||
|
library.ClearMagickWand.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.DestroyMagickWand.argtypes = [ctypes.c_void_p]
|
||
|
library.DestroyMagickWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.CloneMagickWand.argtypes = [ctypes.c_void_p]
|
||
|
library.CloneMagickWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.IsMagickWand.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetException.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_int)]
|
||
|
library.MagickGetException.restype = c_magick_char_p
|
||
|
|
||
|
library.MagickClearException.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetFilename.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
||
|
|
||
|
library.MagickReadImageBlob.argtypes = [ctypes.c_void_p, ctypes.c_void_p,
|
||
|
ctypes.c_size_t]
|
||
|
|
||
|
library.MagickReadImage.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
||
|
|
||
|
library.MagickReadImageFile.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetImageFormat.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageFormat.restype = c_magick_char_p
|
||
|
|
||
|
library.MagickSetImageFormat.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
||
|
|
||
|
libmagick.MagickToMime.argtypes = [ctypes.c_char_p]
|
||
|
libmagick.MagickToMime.restype = c_magick_char_p
|
||
|
|
||
|
library.MagickGetImageSignature.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageSignature.restype = c_magick_char_p
|
||
|
|
||
|
library.MagickGetImageProperty.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickGetImageProperty.restype = c_magick_char_p
|
||
|
|
||
|
library.MagickGetImageProperties.argtypes = [
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.c_char_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)
|
||
|
]
|
||
|
library.MagickGetImageProperties.restype = ctypes.POINTER(ctypes.c_char_p)
|
||
|
|
||
|
library.MagickSetImageProperty.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p,
|
||
|
ctypes.c_char_p]
|
||
|
|
||
|
library.MagickDeleteImageProperty.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickGetImageBackgroundColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetImageBackgroundColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetImageMatte.argtypes = [ctypes.c_void_p, ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageMatteColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetImageMatteColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetImageAlphaChannel.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageAlphaChannel.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickSetImageAlphaChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageBlob.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)]
|
||
|
library.MagickGetImageBlob.restype = ctypes.POINTER(ctypes.c_ubyte)
|
||
|
|
||
|
library.MagickGetImagesBlob.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)]
|
||
|
library.MagickGetImagesBlob.restype = ctypes.POINTER(ctypes.c_ubyte)
|
||
|
|
||
|
library.MagickWriteImage.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
||
|
|
||
|
library.MagickWriteImageFile.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
||
|
|
||
|
library.MagickWriteImages.argtypes = [ctypes.c_void_p, ctypes.c_char_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickWriteImagesFile.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetImageResolution.argtypes = [
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_double),
|
||
|
ctypes.POINTER(ctypes.c_double)
|
||
|
]
|
||
|
|
||
|
library.MagickSetImageResolution.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickSetResolution.argtypes = [ctypes.c_void_p, ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickGetImageWidth.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageWidth.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickGetImageHeight.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageHeight.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickGetImageOrientation.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageOrientation.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetImageOrientation.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageUnits.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetImageUnits.argtypes = [ctypes.c_void_p, ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageVirtualPixelMethod.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetImageVirtualPixelMethod.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageColorspace.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageColorspace.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetImageColorspace.argtypes = [ctypes.c_void_p, ctypes.c_int]
|
||
|
library.MagickTransformImageColorspace.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageCompression.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageCompression.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetImageCompression.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickGetImageDepth.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageDepth.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickSetImageDepth.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetImageChannelDepth.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
library.MagickGetImageChannelDepth.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickSeparateImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickCropImage.argtypes = [ctypes.c_void_p, ctypes.c_size_t,
|
||
|
ctypes.c_size_t, ctypes.c_ssize_t,
|
||
|
ctypes.c_ssize_t]
|
||
|
|
||
|
library.MagickFlipImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickFlopImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickFrameImage.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_void_p, # matte_color
|
||
|
ctypes.c_size_t, # width
|
||
|
ctypes.c_size_t, # height
|
||
|
ctypes.c_ssize_t, # inner_bevel
|
||
|
ctypes.c_ssize_t] # outer_bevel
|
||
|
|
||
|
library.MagickFunctionImage.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # MagickFunction
|
||
|
ctypes.c_size_t, # number_arguments
|
||
|
ctypes.POINTER(ctypes.c_double), # arguments
|
||
|
]
|
||
|
|
||
|
library.MagickFunctionImageChannel.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # channel
|
||
|
ctypes.c_int, # MagickFunction
|
||
|
ctypes.c_size_t, # number_arguments
|
||
|
ctypes.POINTER(ctypes.c_double), # arguments
|
||
|
]
|
||
|
|
||
|
library.MagickFxImage.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p] # expression
|
||
|
library.MagickFxImage.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickFxImageChannel.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # channel
|
||
|
ctypes.c_char_p] # expression
|
||
|
library.MagickFxImageChannel.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickResetImagePage.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
||
|
|
||
|
library.MagickSampleImage.argtypes = [ctypes.c_void_p, ctypes.c_size_t,
|
||
|
ctypes.c_size_t]
|
||
|
|
||
|
library.MagickResizeImage.argtypes = [ctypes.c_void_p, ctypes.c_size_t,
|
||
|
ctypes.c_size_t, ctypes.c_int,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickTransformImage.argtypes = [ctypes.c_void_p, ctypes.c_char_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickTransformImage.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickTransparentPaintImage.argtypes = [
|
||
|
ctypes.c_void_p, ctypes.c_void_p, ctypes.c_double, ctypes.c_double,
|
||
|
ctypes.c_int
|
||
|
]
|
||
|
|
||
|
library.MagickLiquidRescaleImage.argtypes = [
|
||
|
ctypes.c_void_p, ctypes.c_size_t, ctypes.c_size_t,
|
||
|
ctypes.c_double, ctypes.c_double
|
||
|
]
|
||
|
|
||
|
library.MagickRotateImage.argtypes = [ctypes.c_void_p, ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickBorderImage.argtypes = [ctypes.c_void_p, ctypes.c_void_p,
|
||
|
ctypes.c_size_t, ctypes.c_size_t]
|
||
|
|
||
|
library.MagickResetIterator.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetLastIterator.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetIteratorIndex.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetIteratorIndex.restype = ctypes.c_ssize_t
|
||
|
|
||
|
library.MagickCoalesceImages.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickCoalesceImages.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickIdentifyImage.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickIdentifyImage.restype = ctypes.c_char_p
|
||
|
|
||
|
library.MagickRelinquishMemory.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickRelinquishMemory.restype = ctypes.c_void_p
|
||
|
|
||
|
library.NewPixelIterator.argtypes = [ctypes.c_void_p]
|
||
|
library.NewPixelIterator.restype = ctypes.c_void_p
|
||
|
|
||
|
library.DestroyPixelIterator.argtypes = [ctypes.c_void_p]
|
||
|
library.DestroyPixelIterator.restype = ctypes.c_void_p
|
||
|
|
||
|
library.ClonePixelIterator.argtypes = [ctypes.c_void_p]
|
||
|
library.ClonePixelIterator.restype = ctypes.c_void_p
|
||
|
|
||
|
library.IsPixelIterator.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.PixelGetIteratorException.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_int)]
|
||
|
library.PixelGetIteratorException.restype = c_magick_char_p
|
||
|
|
||
|
library.PixelClearIteratorException.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.PixelSetFirstIteratorRow.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.PixelSetIteratorRow.argtypes = [ctypes.c_void_p, ctypes.c_ssize_t]
|
||
|
|
||
|
library.PixelGetNextIteratorRow.argtypes = [
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)
|
||
|
]
|
||
|
library.PixelGetNextIteratorRow.restype = ctypes.POINTER(ctypes.c_void_p)
|
||
|
|
||
|
library.NewPixelWand.argtypes = []
|
||
|
library.NewPixelWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.DestroyPixelWand.argtypes = [ctypes.c_void_p]
|
||
|
library.DestroyPixelWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.IsPixelWand.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.PixelGetException.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_int)]
|
||
|
library.PixelGetException.restype = c_magick_char_p
|
||
|
|
||
|
library.PixelClearException.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.IsPixelWandSimilar.argtypes = [ctypes.c_void_p, ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.PixelGetMagickColor.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
||
|
|
||
|
library.PixelSetMagickColor.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
||
|
|
||
|
library.PixelSetColor.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
|
||
|
|
||
|
library.PixelGetColorAsString.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetColorAsString.restype = c_magick_char_p
|
||
|
|
||
|
library.PixelGetColorAsNormalizedString.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetColorAsNormalizedString.restype = c_magick_char_p
|
||
|
|
||
|
library.PixelGetRed.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetRed.restype = ctypes.c_double
|
||
|
|
||
|
library.PixelGetGreen.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetGreen.restype = ctypes.c_double
|
||
|
|
||
|
library.PixelGetBlue.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetBlue.restype = ctypes.c_double
|
||
|
|
||
|
library.PixelGetAlpha.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetAlpha.restype = ctypes.c_double
|
||
|
|
||
|
library.PixelGetRedQuantum.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetRedQuantum.restype = ctypes.c_size_t
|
||
|
|
||
|
library.PixelGetGreenQuantum.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetGreenQuantum.restype = ctypes.c_size_t
|
||
|
|
||
|
library.PixelGetBlueQuantum.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetBlueQuantum.restype = ctypes.c_size_t
|
||
|
|
||
|
library.PixelGetAlphaQuantum.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetAlphaQuantum.restype = ctypes.c_size_t
|
||
|
|
||
|
library.PixelGetColorCount.argtypes = [ctypes.c_void_p]
|
||
|
library.PixelGetColorCount.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickGetQuantumRange.argtypes = [ctypes.POINTER(ctypes.c_size_t)]
|
||
|
|
||
|
library.MagickSetIteratorIndex.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_ssize_t]
|
||
|
|
||
|
library.MagickGetImageType.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetImageType.argtypes = [ctypes.c_void_p, ctypes.c_int]
|
||
|
|
||
|
library.MagickEvaluateImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickLevelImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickLevelImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickEvaluateImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickContrastStretchImage.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # black
|
||
|
ctypes.c_double] # white
|
||
|
|
||
|
library.MagickContrastStretchImageChannel.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # channel
|
||
|
ctypes.c_double, # black
|
||
|
ctypes.c_double, # white
|
||
|
]
|
||
|
|
||
|
library.MagickGammaImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickGammaImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickLinearStretchImage.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # black
|
||
|
ctypes.c_double] # white
|
||
|
|
||
|
library.MagickCompositeImage.argtypes = [ctypes.c_void_p, ctypes.c_void_p,
|
||
|
ctypes.c_int, ctypes.c_ssize_t,
|
||
|
ctypes.c_ssize_t]
|
||
|
|
||
|
library.MagickCompositeImageChannel.argtypes = [
|
||
|
ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p,
|
||
|
ctypes.c_int, ctypes.c_ssize_t, ctypes.c_ssize_t
|
||
|
]
|
||
|
|
||
|
library.MagickGetImageCompressionQuality.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageCompressionQuality.restype = ctypes.c_ssize_t
|
||
|
|
||
|
library.MagickSetImageCompressionQuality.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_ssize_t]
|
||
|
|
||
|
library.MagickStripImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickTrimImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickGaussianBlurImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickUnsharpMaskImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickGetNumberImages.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetNumberImages.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickGetIteratorIndex.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetIteratorIndex.restype = ctypes.c_size_t
|
||
|
|
||
|
library.MagickSetIteratorIndex.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_ssize_t]
|
||
|
|
||
|
library.MagickSetFirstIterator.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickSetLastIterator.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickAddImage.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
|
||
|
|
||
|
library.MagickRemoveImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
libmagick.GetNextImageInList.argtypes = [ctypes.c_void_p]
|
||
|
libmagick.GetNextImageInList.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickGetImageDelay.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetImageDelay.restype = ctypes.c_ssize_t
|
||
|
|
||
|
library.MagickSetImageDelay.argtypes = [ctypes.c_void_p, ctypes.c_ssize_t]
|
||
|
|
||
|
library.NewMagickWandFromImage.argtypes = [ctypes.c_void_p]
|
||
|
library.NewMagickWandFromImage.restype = ctypes.c_void_p
|
||
|
|
||
|
library.GetImageFromMagickWand.argtypes = [ctypes.c_void_p]
|
||
|
library.GetImageFromMagickWand.restype = ctypes.c_void_p
|
||
|
|
||
|
libmagick.CloneImages.argtypes = [ctypes.c_void_p, ctypes.c_char_p,
|
||
|
ctypes.c_void_p]
|
||
|
libmagick.CloneImages.restype = ctypes.c_void_p
|
||
|
|
||
|
libmagick.AcquireExceptionInfo.argtypes = []
|
||
|
libmagick.AcquireExceptionInfo.restype = ctypes.c_void_p
|
||
|
|
||
|
libmagick.DestroyExceptionInfo.argtypes = [ctypes.c_void_p]
|
||
|
libmagick.DestroyExceptionInfo.restype = ctypes.c_void_p
|
||
|
|
||
|
libmagick.DestroyImage.argtypes = [ctypes.c_void_p]
|
||
|
libmagick.DestroyImage.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickGetSize.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_uint),
|
||
|
ctypes.POINTER(ctypes.c_uint)]
|
||
|
library.MagickGetSize.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetSize.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_uint,
|
||
|
ctypes.c_uint]
|
||
|
library.MagickSetSize.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetDepth.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_uint]
|
||
|
library.MagickSetDepth.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetFormat.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickSetFormat.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickGetFont.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetFont.restype = ctypes.c_char_p
|
||
|
|
||
|
library.MagickSetFont.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickSetFont.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickGetPointsize.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetPointsize.restype = ctypes.c_double
|
||
|
|
||
|
library.MagickSetPointsize.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
library.MagickSetPointsize.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickGetGravity.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetGravity.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetGravity.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
library.MagickSetGravity.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetLastIterator.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickGetBackgroundColor.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetBackgroundColor.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickSetBackgroundColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
library.MagickSetBackgroundColor.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickGetOption.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickGetOption.restype = ctypes.c_char_p
|
||
|
|
||
|
library.MagickSetOption.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickSetOption.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickDeleteOption.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickDeleteOption.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickGetAntialias.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickGetAntialias.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickSetAntialias.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
library.MagickSetAntialias.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickGetImageHistogram.argtypes = [
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)
|
||
|
]
|
||
|
library.MagickGetImageHistogram.restype = ctypes.POINTER(ctypes.c_void_p)
|
||
|
|
||
|
# These functions are const so it's okay for them to be c_char_p
|
||
|
libmagick.GetMagickVersion.argtypes = [ctypes.POINTER(ctypes.c_size_t)]
|
||
|
libmagick.GetMagickVersion.restype = ctypes.c_char_p
|
||
|
|
||
|
libmagick.GetMagickReleaseDate.argtypes = []
|
||
|
libmagick.GetMagickReleaseDate.restype = ctypes.c_char_p
|
||
|
|
||
|
libmagick.GetMagickQuantumDepth.argtypes = [
|
||
|
ctypes.POINTER(ctypes.c_size_t)
|
||
|
]
|
||
|
libmagick.GetMagickQuantumDepth.restype = ctypes.c_char_p
|
||
|
|
||
|
library.NewDrawingWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.CloneDrawingWand.argtypes = [ctypes.c_void_p]
|
||
|
library.CloneDrawingWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.DestroyDrawingWand.argtypes = [ctypes.c_void_p]
|
||
|
library.DestroyDrawingWand.restype = ctypes.c_void_p
|
||
|
|
||
|
library.IsDrawingWand.argtypes = [ctypes.c_void_p]
|
||
|
library.IsDrawingWand.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetException.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_int)]
|
||
|
library.DrawGetException.restype = ctypes.c_char_p
|
||
|
|
||
|
library.DrawClearException.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawClearException.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawAffine.argtypes = [
|
||
|
ctypes.c_void_p, # Drawing wand
|
||
|
ctypes.POINTER(AffineMatrix), # AffineMatrix
|
||
|
]
|
||
|
|
||
|
library.DrawComment.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p, # comment
|
||
|
]
|
||
|
|
||
|
library.DrawComposite.argtypes = [
|
||
|
ctypes.c_void_p, # DrawingWand wand
|
||
|
ctypes.c_int, # CompositeOperator
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
ctypes.c_double, # width
|
||
|
ctypes.c_double, # height
|
||
|
ctypes.c_void_p, # MagickWand wand
|
||
|
]
|
||
|
library.DrawComposite.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawSetBorderColor.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_void_p] # PixelWand color
|
||
|
|
||
|
library.DrawSetClipPath.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p] # clip_mask
|
||
|
library.DrawSetClipPath.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawSetClipRule.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_uint] # FillRule
|
||
|
|
||
|
library.DrawSetClipUnits.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_uint] # ClipPathUnits
|
||
|
|
||
|
library.DrawSetFont.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
|
||
|
library.DrawSetFontFamily.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p] # font_family
|
||
|
library.DrawSetFontFamily.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawSetFontResolution.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
library.DrawSetFontResolution.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawSetFontSize.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawSetFontStretch.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_int] # font_stretch
|
||
|
|
||
|
library.DrawSetFontStyle.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_int] # style
|
||
|
|
||
|
library.DrawSetFontWeight.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_size_t] # font_weight
|
||
|
|
||
|
library.DrawSetFillColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.DrawSetFillOpacity.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawSetFillPatternURL.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p] # fill_url
|
||
|
library.DrawSetFillPatternURL.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawSetFillRule.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_uint]
|
||
|
|
||
|
library.DrawSetOpacity.argtypes = [ctypes.c_void_p, ctypes.c_double]
|
||
|
|
||
|
library.DrawSetStrokeAntialias.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # stroke_antialias
|
||
|
]
|
||
|
|
||
|
library.DrawSetStrokeColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.DrawSetStrokeDashArray.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_size_t, # number_elements
|
||
|
ctypes.POINTER(ctypes.c_double),
|
||
|
]
|
||
|
|
||
|
library.DrawSetStrokeDashOffset.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # dash_offset
|
||
|
]
|
||
|
|
||
|
library.DrawSetStrokeLineCap.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # linecap
|
||
|
]
|
||
|
|
||
|
library.DrawSetStrokeLineJoin.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_int] # linejoin
|
||
|
|
||
|
library.DrawSetStrokeMiterLimit.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_size_t] # miterlimit
|
||
|
|
||
|
library.DrawSetStrokeOpacity.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double] # stroke_opacity
|
||
|
|
||
|
library.DrawSetStrokePatternURL.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p] # fill_url
|
||
|
library.DrawSetStrokePatternURL.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawSetStrokeWidth.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawSetTextAlignment.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.DrawSetTextAntialias.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.DrawSetTextDecoration.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
try:
|
||
|
library.DrawSetTextDirection.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
except AttributeError:
|
||
|
library.DrawSetTextDirection = None
|
||
|
|
||
|
library.DrawSetTextEncoding.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
|
||
|
try:
|
||
|
library.DrawSetTextInterlineSpacing.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
except AttributeError:
|
||
|
library.DrawSetTextInterlineSpacing = None
|
||
|
|
||
|
library.DrawSetTextInterwordSpacing.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawSetTextKerning.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawSetTextUnderColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.DrawSetVectorGraphics.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
|
||
|
library.DrawSetVectorGraphics.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawResetVectorGraphics.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.DrawSetViewbox.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_ssize_t, # x1
|
||
|
ctypes.c_ssize_t, # y1
|
||
|
ctypes.c_ssize_t, # x2
|
||
|
ctypes.c_ssize_t] # y2
|
||
|
|
||
|
library.DrawGetBorderColor.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_void_p] # PixelWand color
|
||
|
|
||
|
library.DrawGetClipPath.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetClipPath.restype = c_magick_char_p
|
||
|
|
||
|
library.DrawGetClipRule.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetClipRule.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawGetClipUnits.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetClipUnits.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawGetFillColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.DrawGetFillOpacity.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFillOpacity.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetFillRule.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFillRule.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawGetOpacity.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetOpacity.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetStrokeAntialias.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeAntialias.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetStrokeColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.DrawGetStrokeDashArray.argtypes = [
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t),
|
||
|
]
|
||
|
library.DrawGetStrokeDashArray.restype = ctypes.POINTER(ctypes.c_double)
|
||
|
|
||
|
library.DrawGetStrokeDashOffset.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeDashOffset.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetStrokeLineCap.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeLineCap.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetStrokeLineJoin.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeLineJoin.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetStrokeMiterLimit.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeMiterLimit.restype = ctypes.c_size_t
|
||
|
|
||
|
library.DrawGetStrokeOpacity.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeOpacity.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetStrokeWidth.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetStrokeWidth.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetFont.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFont.restype = c_magick_char_p
|
||
|
|
||
|
library.DrawGetFontFamily.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFontFamily.restype = c_magick_char_p
|
||
|
|
||
|
library.DrawGetFontResolution.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.POINTER(ctypes.c_double), # x
|
||
|
ctypes.POINTER(ctypes.c_double), # y
|
||
|
]
|
||
|
library.DrawGetFontResolution.restype = ctypes.c_uint
|
||
|
|
||
|
library.DrawGetFontSize.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFontSize.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetFontStyle.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFontStyle.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetFontWeight.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFontWeight.restype = ctypes.c_size_t
|
||
|
|
||
|
library.DrawGetFontStretch.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetFontStretch.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetTextAlignment.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextAlignment.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetTextAntialias.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextAntialias.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawGetTextDecoration.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextDecoration.restype = ctypes.c_int
|
||
|
|
||
|
try:
|
||
|
library.DrawGetTextDirection.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextDirection.restype = ctypes.c_int
|
||
|
except AttributeError:
|
||
|
library.DrawGetTextDirection = None
|
||
|
|
||
|
library.DrawGetTextEncoding.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextEncoding.restype = c_magick_char_p
|
||
|
|
||
|
try:
|
||
|
library.DrawGetTextInterlineSpacing.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextInterlineSpacing.restype = ctypes.c_double
|
||
|
except AttributeError:
|
||
|
library.DrawGetTextInterlineSpacing = None
|
||
|
|
||
|
library.DrawGetTextInterwordSpacing.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextInterwordSpacing.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetTextKerning.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetTextKerning.restype = ctypes.c_double
|
||
|
|
||
|
library.DrawGetTextUnderColor.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
|
||
|
library.DrawGetVectorGraphics.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetVectorGraphics.restype = c_magick_char_p
|
||
|
|
||
|
library.DrawSetGravity.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.DrawGetGravity.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawGetGravity.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickAnnotateImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickAnnotateImage.restype = ctypes.c_int
|
||
|
|
||
|
library.MagickDistortImage.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_int, # method
|
||
|
ctypes.c_size_t, # number_arguments
|
||
|
ctypes.POINTER(ctypes.c_double), # arguments
|
||
|
ctypes.c_int, # bestfit
|
||
|
]
|
||
|
library.MagickDistortImage.restype = ctypes.c_int
|
||
|
|
||
|
library.ClearDrawingWand.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickDrawImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p]
|
||
|
library.MagickDrawImage.restype = ctypes.c_int
|
||
|
|
||
|
library.DrawAnnotation.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.POINTER(ctypes.c_ubyte)]
|
||
|
|
||
|
library.DrawArc.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # sx
|
||
|
ctypes.c_double, # sy
|
||
|
ctypes.c_double, # ex
|
||
|
ctypes.c_double, # ey
|
||
|
ctypes.c_double, # sd
|
||
|
ctypes.c_double] # ed
|
||
|
|
||
|
library.DrawBezier.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_ulong,
|
||
|
ctypes.POINTER(PointInfo)]
|
||
|
|
||
|
library.DrawCircle.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # ox
|
||
|
ctypes.c_double, # oy
|
||
|
ctypes.c_double, # px
|
||
|
ctypes.c_double] # py
|
||
|
|
||
|
library.DrawColor.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
ctypes.c_uint] # PaintMethod
|
||
|
|
||
|
library.DrawEllipse.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # ox
|
||
|
ctypes.c_double, # oy
|
||
|
ctypes.c_double, # rx
|
||
|
ctypes.c_double, # ry
|
||
|
ctypes.c_double, # start
|
||
|
ctypes.c_double] # end
|
||
|
|
||
|
library.DrawLine.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawMatte.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
ctypes.c_uint] # PaintMethod
|
||
|
|
||
|
library.DrawPathClose.argtypes = [ctypes.c_void_p] # wand
|
||
|
|
||
|
library.DrawPathCurveToAbsolute.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x1
|
||
|
ctypes.c_double, # y1
|
||
|
ctypes.c_double, # x2
|
||
|
ctypes.c_double, # y2
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathCurveToRelative.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x1
|
||
|
ctypes.c_double, # y1
|
||
|
ctypes.c_double, # x2
|
||
|
ctypes.c_double, # y2
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathCurveToQuadraticBezierAbsolute.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x1
|
||
|
ctypes.c_double, # y1
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
]
|
||
|
|
||
|
library.DrawPathCurveToQuadraticBezierRelative.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x1
|
||
|
ctypes.c_double, # y1
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
]
|
||
|
|
||
|
library.DrawPathCurveToQuadraticBezierSmoothAbsolute.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
]
|
||
|
|
||
|
library.DrawPathCurveToQuadraticBezierSmoothRelative.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
]
|
||
|
|
||
|
library.DrawPathCurveToSmoothAbsolute.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x2
|
||
|
ctypes.c_double, # y2
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathCurveToSmoothRelative.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x2
|
||
|
ctypes.c_double, # y2
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathEllipticArcAbsolute.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # rx
|
||
|
ctypes.c_double, # ry
|
||
|
ctypes.c_double, # rotation
|
||
|
ctypes.c_uint, # arc_flag
|
||
|
ctypes.c_uint, # sweep_flag
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
]
|
||
|
|
||
|
library.DrawPathEllipticArcRelative.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # rx
|
||
|
ctypes.c_double, # ry
|
||
|
ctypes.c_double, # rotation
|
||
|
ctypes.c_uint, # arc_flag
|
||
|
ctypes.c_uint, # sweep_flag
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
]
|
||
|
|
||
|
library.DrawPathFinish.argtypes = [ctypes.c_void_p] # wand
|
||
|
|
||
|
library.DrawPathLineToAbsolute.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathLineToRelative.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathLineToHorizontalAbsolute.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
]
|
||
|
|
||
|
library.DrawPathLineToHorizontalRelative.argtypes = [
|
||
|
ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
]
|
||
|
|
||
|
library.DrawPathLineToVerticalAbsolute.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathLineToVerticalRelative.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathMoveToAbsolute.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathMoveToRelative.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPathStart.argtypes = [ctypes.c_void_p] # wand
|
||
|
|
||
|
library.DrawPoint.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawPolygon.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_ulong,
|
||
|
ctypes.POINTER(PointInfo)]
|
||
|
|
||
|
library.DrawPolyline.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_ulong,
|
||
|
ctypes.POINTER(PointInfo)]
|
||
|
|
||
|
library.DrawRotate.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double] # degree
|
||
|
|
||
|
library.DrawRectangle.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.DrawRoundRectangle.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x1
|
||
|
ctypes.c_double, # y1
|
||
|
ctypes.c_double, # x2
|
||
|
ctypes.c_double, # y2
|
||
|
ctypes.c_double, # rx
|
||
|
ctypes.c_double] # ry
|
||
|
|
||
|
library.DrawScale.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
library.DrawSkewX.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double] # degree
|
||
|
|
||
|
library.DrawSkewY.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double] # degree
|
||
|
|
||
|
library.DrawTranslate.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double] # y
|
||
|
|
||
|
# -- Drawing stack management --
|
||
|
library.PushDrawingWand.argtypes = [ctypes.c_void_p]
|
||
|
library.PushDrawingWand.restype = ctypes.c_uint
|
||
|
library.DrawPushClipPath.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p] # clip_mask_id
|
||
|
library.DrawPushDefs.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawPushPattern.argtypes = [ctypes.c_void_p, # wand
|
||
|
ctypes.c_char_p, # clip_mask_id
|
||
|
ctypes.c_double, # x
|
||
|
ctypes.c_double, # y
|
||
|
ctypes.c_double, # width
|
||
|
ctypes.c_double] # height
|
||
|
library.DrawPushClipPath.restype = ctypes.c_uint
|
||
|
library.PopDrawingWand.argtypes = [ctypes.c_void_p]
|
||
|
library.PopDrawingWand.restype = ctypes.c_uint
|
||
|
library.DrawPopClipPath.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawPopDefs.argtypes = [ctypes.c_void_p]
|
||
|
library.DrawPopPattern.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickNegateImage.argtypes = [ctypes.c_void_p, ctypes.c_int]
|
||
|
|
||
|
library.MagickNegateImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickNormalizeImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickNormalizeImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
|
||
|
library.MagickEqualizeImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickQueryConfigureOption.argtypes = [ctypes.c_char_p]
|
||
|
library.MagickQueryConfigureOption.restype = c_magick_char_p
|
||
|
|
||
|
library.MagickQueryConfigureOptions.argtypes = [
|
||
|
ctypes.c_char_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t),
|
||
|
]
|
||
|
library.MagickQueryConfigureOptions.restype = \
|
||
|
ctypes.POINTER(c_magick_char_p)
|
||
|
|
||
|
library.MagickQueryFontMetrics.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickQueryFontMetrics.restype = ctypes.POINTER(ctypes.c_double)
|
||
|
|
||
|
library.MagickQueryFonts.argtypes = [ctypes.c_char_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)]
|
||
|
library.MagickQueryFonts.restype = ctypes.POINTER(c_magick_char_p)
|
||
|
|
||
|
library.MagickQueryFormats.argtypes = [ctypes.c_char_p,
|
||
|
ctypes.POINTER(ctypes.c_size_t)]
|
||
|
library.MagickQueryFormats.restype = ctypes.POINTER(c_magick_char_p)
|
||
|
|
||
|
library.MagickQueryMultilineFontMetrics.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_void_p,
|
||
|
ctypes.c_char_p]
|
||
|
library.MagickQueryMultilineFontMetrics.restype = ctypes.POINTER(
|
||
|
ctypes.c_double
|
||
|
)
|
||
|
|
||
|
library.MagickThresholdImage.argtypes = [ctypes.c_void_p, ctypes.c_double]
|
||
|
|
||
|
library.MagickThresholdImageChannel.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickModulateImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double,
|
||
|
ctypes.c_double]
|
||
|
|
||
|
library.MagickAppendImages.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int]
|
||
|
library.MagickAppendImages.restype = ctypes.c_void_p
|
||
|
|
||
|
library.MagickTransposeImage.argtypes = [ctypes.c_void_p]
|
||
|
library.MagickTransverseImage.argtypes = [ctypes.c_void_p]
|
||
|
|
||
|
library.MagickQuantizeImage.argtypes = [ctypes.c_void_p,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_int,
|
||
|
ctypes.c_bool,
|
||
|
ctypes.c_bool]
|
||
|
|
||
|
except AttributeError:
|
||
|
raise ImportError('MagickWand shared library not found or incompatible\n'
|
||
|
'Original exception was raised in:\n' +
|
||
|
traceback.format_exc())
|
||
|
|
||
|
try:
|
||
|
library.MagickAutoOrientImage.argtypes = [ctypes.c_void_p]
|
||
|
except AttributeError:
|
||
|
# MagickAutoOrientImage was added in 6.8.9+, we have a fallback function
|
||
|
# so we pass silently if we cant import it
|
||
|
pass
|
||
|
|
||
|
|
||
|
#: (:class:`ctypes.CDLL`) The C standard library.
|
||
|
libc = None
|
||
|
|
||
|
if platform.system() == 'Windows':
|
||
|
msvcrt = ctypes.util.find_msvcrt()
|
||
|
# workaround -- the newest visual studio DLL is named differently:
|
||
|
if not msvcrt and "1900" in platform.python_compiler():
|
||
|
msvcrt = "vcruntime140.dll"
|
||
|
if msvcrt:
|
||
|
libc = ctypes.CDLL(msvcrt)
|
||
|
else:
|
||
|
if platform.system() == 'Darwin':
|
||
|
libc = ctypes.cdll.LoadLibrary('libc.dylib')
|
||
|
elif platform.system() == 'FreeBSD':
|
||
|
libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c'))
|
||
|
else:
|
||
|
libc = ctypes.cdll.LoadLibrary('libc.so.6')
|
||
|
libc.fdopen.argtypes = [ctypes.c_int, ctypes.c_char_p]
|
||
|
libc.fdopen.restype = ctypes.c_void_p
|
||
|
libc.fflush.argtypes = [ctypes.c_void_p]
|