# wrap VipsObject
from __future__ import division
import gc
import logging
import pyvips
from pyvips import ffi, vips_lib, gobject_lib, Error, _to_bytes, _to_string
logger = logging.getLogger(__name__)
[docs]class VipsObject(pyvips.GObject):
"""Manage a VipsObject."""
__slots__ = ('vobject', 'gobject')
_pspec_cache = {}
def __init__(self, pointer):
# logger.debug('VipsObject.__init__: pointer = %s', pointer)
super(VipsObject, self).__init__(pointer)
self.vobject = ffi.cast('VipsObject*', pointer)
self.gobject = ffi.cast('GObject*', pointer)
[docs] @staticmethod
def print_all(msg):
"""Print all objects.
Print a table of all active libvips objects. Handy for debugging.
"""
gc.collect()
logger.debug(msg)
vips_lib.vips_object_print_all()
logger.debug()
def _get_pspec(self, name):
# logger.debug('VipsObject.get_typeof: self = %s, name = %s',
# str(self), name)
# this is pretty slow, and used a lot, so we cache results
# this cache makes the libvips test suite about 10% faster
class_pointer = self.gobject.g_type_instance.g_class
cache = VipsObject._pspec_cache
if class_pointer not in cache:
cache[class_pointer] = {}
if name not in cache[class_pointer]:
pspec = ffi.new('GParamSpec **')
argument_class = ffi.new('VipsArgumentClass **')
argument_instance = ffi.new('VipsArgumentInstance **')
result = vips_lib.vips_object_get_argument(self.vobject,
_to_bytes(name),
pspec, argument_class,
argument_instance)
if result != 0:
return None
cache[class_pointer][name] = pspec[0]
return cache[class_pointer][name]
[docs] def get_typeof(self, name):
"""Get the GType of a GObject property.
This function returns 0 if the property does not exist.
"""
# logger.debug('VipsObject.get_typeof: self = %s, name = %s',
# str(self), name)
pspec = self._get_pspec(name)
if pspec is None:
# need to clear any error, this is horrible
Error('')
return 0
return pspec.value_type
[docs] def get_blurb(self, name):
"""Get the blurb for a GObject property."""
c_str = gobject_lib.g_param_spec_get_blurb(self._get_pspec(name))
return _to_string(c_str)
[docs] def get(self, name):
"""Get a GObject property.
The value of the property is converted to a Python value.
"""
logger.debug('VipsObject.get: name = %s', name)
pspec = self._get_pspec(name)
if pspec is None:
raise Error('Property not found.')
gtype = pspec.value_type
gv = pyvips.GValue()
gv.set_type(gtype)
go = ffi.cast('GObject *', self.pointer)
gobject_lib.g_object_get_property(go, _to_bytes(name), gv.pointer)
return gv.get()
[docs] def set(self, name, value):
"""Set a GObject property.
The value is converted to the property type, if possible.
"""
logger.debug('VipsObject.set: name = %s, value = %s', name, value)
gtype = self.get_typeof(name)
gv = pyvips.GValue()
gv.set_type(gtype)
gv.set(value)
go = ffi.cast('GObject *', self.pointer)
gobject_lib.g_object_set_property(go, _to_bytes(name), gv.pointer)
[docs] def set_string(self, string_options):
"""Set a series of properties using a string.
For example::
'fred=12, tile'
'[fred=12]'
"""
cstr = _to_bytes(string_options)
result = vips_lib.vips_object_set_from_string(self.vobject, cstr)
return result == 0
[docs] def get_description(self):
"""Get the description of a GObject."""
return _to_string(vips_lib.vips_object_get_description(self.vobject))
__all__ = ['VipsObject']