@ -60,6 +60,10 @@
# endif // PY_MAJOR >=3
# ifndef PyType_CheckExact
# define PyType_CheckExact(obj) (Py_TYPE(op) == &PyType_Type)
# endif // !PyType_CheckExact
static inline bool getUnicodeString ( PyObject * obj , std : : string & str )
{
bool res = false ;
@ -91,6 +95,26 @@ static inline bool getUnicodeString(PyObject * obj, std::string &str)
return res ;
}
static inline
std : : string getPyObjectNameAttr ( PyObject * obj )
{
std : : string obj_name ;
PyObject * cls_name_obj = PyObject_GetAttrString ( obj , " __name__ " ) ;
if ( cls_name_obj & & ! getUnicodeString ( cls_name_obj , obj_name ) ) {
obj_name . clear ( ) ;
}
# ifndef Py_LIMITED_API
if ( PyType_CheckExact ( obj ) & & obj_name . empty ( ) )
{
obj_name = reinterpret_cast < PyTypeObject * > ( obj ) - > tp_name ;
}
# endif
if ( obj_name . empty ( ) ) {
obj_name = " <UNAVAILABLE> " ;
}
return obj_name ;
}
//==================================================================================================
# define CV_PY_FN_WITH_KW_(fn, flags) (PyCFunction)(void*)(PyCFunctionWithKeywords)(fn), (flags) | METH_VARARGS | METH_KEYWORDS
@ -172,107 +196,106 @@ PyObject* pyopencv_from(const TYPE& src)
# endif
# define CVPY_TYPE_DECLARE(WNAME, NAME, STORAGE, SNAM E) \
struct pyopencv_ # # NAME # # _t \
# define CVPY_TYPE_DECLARE(EXPORT_NAME, CLASS_ID, STORAGE, SNAME, SCOP E) \
struct pyopencv_ # # CLASS_ID # # _t \
{ \
PyObject_HEAD \
STORAGE v ; \
} ; \
static PyTypeObject pyopencv_ # # NAME # # _TypeXXX = \
static PyTypeObject pyopencv_ # # CLASS_ID # # _TypeXXX = \
{ \
CVPY_TYPE_HEAD \
MODULESTR " . " # W NAME, \
sizeof ( pyopencv_ # # NAME # # _t ) , \
MODULESTR SCOPE " . " # EXPORT_ NAME, \
sizeof ( pyopencv_ # # CLASS_ID # # _t ) , \
} ; \
static PyTypeObject * pyopencv_ # # NAME # # _TypePtr = & pyopencv_ # # NAME # # _TypeXXX ; \
static bool pyopencv_ # # NAME # # _getp ( PyObject * self , STORAGE * & dst ) \
static PyTypeObject * pyopencv_ # # CLASS_ID # # _TypePtr = & pyopencv_ # # CLASS_ID # # _TypeXXX ; \
static bool pyopencv_ # # CLASS_ID # # _getp ( PyObject * self , STORAGE * & dst ) \
{ \
if ( PyObject_TypeCheck ( self , pyopencv_ # # NAME # # _TypePtr ) ) \
if ( PyObject_TypeCheck ( self , pyopencv_ # # CLASS_ID # # _TypePtr ) ) \
{ \
dst = & ( ( ( pyopencv_ # # NAME # # _t * ) self ) - > v ) ; \
dst = & ( ( ( pyopencv_ # # CLASS_ID # # _t * ) self ) - > v ) ; \
return true ; \
} \
return false ; \
} \
static PyObject * pyopencv_ # # NAME # # _Instance ( const STORAGE & r ) \
static PyObject * pyopencv_ # # CLASS_ID # # _Instance ( const STORAGE & r ) \
{ \
pyopencv_ # # NAME # # _t * m = PyObject_NEW ( pyopencv_ # # NAME # # _t , pyopencv_ # # NAME # # _TypePtr ) ; \
pyopencv_ # # CLASS_ID # # _t * m = PyObject_NEW ( pyopencv_ # # CLASS_ID # # _t , pyopencv_ # # CLASS_ID # # _TypePtr ) ; \
new ( & ( m - > v ) ) STORAGE ( r ) ; \
return ( PyObject * ) m ; \
} \
static void pyopencv_ # # NAME # # _dealloc ( PyObject * self ) \
static void pyopencv_ # # CLASS_ID # # _dealloc ( PyObject * self ) \
{ \
( ( pyopencv_ # # NAME # # _t * ) self ) - > v . STORAGE : : ~ SNAME ( ) ; \
( ( pyopencv_ # # CLASS_ID # # _t * ) self ) - > v . STORAGE : : ~ SNAME ( ) ; \
PyObject_Del ( self ) ; \
} \
static PyObject * pyopencv_ # # NAME # # _repr ( PyObject * self ) \
static PyObject * pyopencv_ # # CLASS_ID # # _repr ( PyObject * self ) \
{ \
char str [ 1000 ] ; \
sprintf ( str , " < " # W NAME" %p> " , self ) ; \
sprintf ( str , " < " MODULESTR SCOPE " . " # EXPORT_ NAME" %p> " , self ) ; \
return PyString_FromString ( str ) ; \
}
# define CVPY_TYPE_INIT_STATIC(WNAME, NAME, ERROR_HANDLER, BASE, CONSTRUCTOR ) \
# define CVPY_TYPE_INIT_STATIC(EXPORT_NAME, CLASS_ID, ERROR_HANDLER, BASE, CONSTRUCTOR, SCOPE ) \
{ \
pyopencv_ # # NAME # # _TypePtr - > tp_base = pyopencv_ # # BASE # # _TypePtr ; \
pyopencv_ # # NAME # # _TypePtr - > tp_dealloc = pyopencv_ # # NAME # # _dealloc ; \
pyopencv_ # # NAME # # _TypePtr - > tp_repr = pyopencv_ # # NAME # # _repr ; \
pyopencv_ # # NAME # # _TypePtr - > tp_getset = pyopencv_ # # NAME # # _getseters ; \
pyopencv_ # # NAME # # _TypePtr - > tp_init = ( initproc ) CONSTRUCTOR ; \
pyopencv_ # # NAME # # _TypePtr - > tp_methods = pyopencv_ # # NAME # # _methods ; \
pyopencv_ # # NAME # # _TypePtr - > tp_alloc = PyType_GenericAlloc ; \
pyopencv_ # # NAME # # _TypePtr - > tp_new = PyType_GenericNew ; \
pyopencv_ # # NAME # # _TypePtr - > tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE ; \
if ( PyType_Ready ( pyopencv_ # # NAME # # _TypePtr ) ! = 0 ) \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_base = pyopencv_ # # BASE # # _TypePtr ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_dealloc = pyopencv_ # # CLASS_ID # # _dealloc ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_repr = pyopencv_ # # CLASS_ID # # _repr ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_getset = pyopencv_ # # CLASS_ID # # _getseters ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_init = ( initproc ) CONSTRUCTOR ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_methods = pyopencv_ # # CLASS_ID # # _methods ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_alloc = PyType_GenericAlloc ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_new = PyType_GenericNew ; \
pyopencv_ # # CLASS_ID # # _TypePtr - > tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE ; \
if ( PyType_Ready ( pyopencv_ # # CLASS_ID # # _TypePtr ) ! = 0 ) \
{ \
ERROR_HANDLER ; \
} \
CVPY_TYPE_INCREF ( pyopencv_ # # NAME # # _TypePtr ) ; \
if ( PyModule_AddObject ( m , # W NAME, ( PyObject * ) pyopencv_ # # NAME # # _TypePtr ) < 0 ) \
CVPY_TYPE_INCREF ( pyopencv_ # # CLASS_ID # # _TypePtr ) ; \
if ( ! registerNewType ( m , # EXPORT_ NAME, ( PyObject * ) pyopencv_ # # CLASS_ID # # _TypePtr , SCOPE ) ) \
{ \
printf ( " Failed to register a new type: " # WNAME " , base ( " # BASE " ) \n " ) ; \
Py_DECREF ( pyopencv_ # # NAME # # _TypePtr ) ; \
printf ( " Failed to register a new type: " # EXPORT_NAME " , base ( " # BASE " ) in " SCOPE " \n " ) ; \
ERROR_HANDLER ; \
} \
}
//==================================================================================================
# define CVPY_TYPE_DECLARE_DYNAMIC(WNAME, NAME, STORAGE, SNAM E) \
struct pyopencv_ # # NAME # # _t \
# define CVPY_TYPE_DECLARE_DYNAMIC(EXPORT_NAME, CLASS_ID, STORAGE, SNAME, SCOP E) \
struct pyopencv_ # # CLASS_ID # # _t \
{ \
PyObject_HEAD \
STORAGE v ; \
} ; \
static PyObject * pyopencv_ # # NAME # # _TypePtr = 0 ; \
static bool pyopencv_ # # NAME # # _getp ( PyObject * self , STORAGE * & dst ) \
static PyObject * pyopencv_ # # CLASS_ID # # _TypePtr = 0 ; \
static bool pyopencv_ # # CLASS_ID # # _getp ( PyObject * self , STORAGE * & dst ) \
{ \
if ( PyObject_TypeCheck ( self , ( PyTypeObject * ) pyopencv_ # # NAME # # _TypePtr ) ) \
if ( PyObject_TypeCheck ( self , ( PyTypeObject * ) pyopencv_ # # CLASS_ID # # _TypePtr ) ) \
{ \
dst = & ( ( ( pyopencv_ # # NAME # # _t * ) self ) - > v ) ; \
dst = & ( ( ( pyopencv_ # # CLASS_ID # # _t * ) self ) - > v ) ; \
return true ; \
} \
return false ; \
} \
static PyObject * pyopencv_ # # NAME # # _Instance ( const STORAGE & r ) \
static PyObject * pyopencv_ # # CLASS_ID # # _Instance ( const STORAGE & r ) \
{ \
pyopencv_ # # NAME # # _t * m = PyObject_New ( pyopencv_ # # NAME # # _t , ( PyTypeObject * ) pyopencv_ # # NAME # # _TypePtr ) ; \
pyopencv_ # # CLASS_ID # # _t * m = PyObject_New ( pyopencv_ # # CLASS_ID # # _t , ( PyTypeObject * ) pyopencv_ # # CLASS_ID # # _TypePtr ) ; \
new ( & ( m - > v ) ) STORAGE ( r ) ; \
return ( PyObject * ) m ; \
} \
static void pyopencv_ # # NAME # # _dealloc ( PyObject * self ) \
static void pyopencv_ # # CLASS_ID # # _dealloc ( PyObject * self ) \
{ \
( ( pyopencv_ # # NAME # # _t * ) self ) - > v . STORAGE : : ~ SNAME ( ) ; \
( ( pyopencv_ # # CLASS_ID # # _t * ) self ) - > v . STORAGE : : ~ SNAME ( ) ; \
PyObject_Del ( self ) ; \
} \
static PyObject * pyopencv_ # # NAME # # _repr ( PyObject * self ) \
static PyObject * pyopencv_ # # CLASS_ID # # _repr ( PyObject * self ) \
{ \
char str [ 1000 ] ; \
sprintf ( str , " < " # W NAME" %p> " , self ) ; \
sprintf ( str , " < " MODULESTR SCOPE " . " # EXPORT_ NAME" %p> " , self ) ; \
return PyString_FromString ( str ) ; \
} \
static PyType_Slot pyopencv_ # # NAME # # _Slots [ ] = \
static PyType_Slot pyopencv_ # # CLASS_ID # # _Slots [ ] = \
{ \
{ Py_tp_dealloc , 0 } , \
{ Py_tp_repr , 0 } , \
@ -283,37 +306,36 @@ PyObject* pyopencv_from(const TYPE& src)
{ Py_tp_new , 0 } , \
{ 0 , 0 } \
} ; \
static PyType_Spec pyopencv_ # # NAME # # _Spec = \
static PyType_Spec pyopencv_ # # CLASS_ID # # _Spec = \
{ \
MODULESTR " . " # W NAME, \
sizeof ( pyopencv_ # # NAME # # _t ) , \
MODULESTR SCOPE " . " # EXPORT_ NAME, \
sizeof ( pyopencv_ # # CLASS_ID # # _t ) , \
0 , \
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE , \
pyopencv_ # # NAME # # _Slots \
pyopencv_ # # CLASS_ID # # _Slots \
} ;
# define CVPY_TYPE_INIT_DYNAMIC(WNAME, NAME, ERROR_HANDLER, BASE, CONSTRUCTOR ) \
# define CVPY_TYPE_INIT_DYNAMIC(EXPORT_NAME, CLASS_ID, ERROR_HANDLER, BASE, CONSTRUCTOR, SCOPE ) \
{ \
pyopencv_ # # NAME # # _Slots [ 0 ] . pfunc /*tp_dealloc*/ = ( void * ) pyopencv_ # # NAME # # _dealloc ; \
pyopencv_ # # NAME # # _Slots [ 1 ] . pfunc /*tp_repr*/ = ( void * ) pyopencv_ # # NAME # # _repr ; \
pyopencv_ # # NAME # # _Slots [ 2 ] . pfunc /*tp_getset*/ = ( void * ) pyopencv_ # # NAME # # _getseters ; \
pyopencv_ # # NAME # # _Slots [ 3 ] . pfunc /*tp_init*/ = ( void * ) CONSTRUCTOR ; \
pyopencv_ # # NAME # # _Slots [ 4 ] . pfunc /*tp_methods*/ = pyopencv_ # # NAME # # _methods ; \
pyopencv_ # # NAME # # _Slots [ 5 ] . pfunc /*tp_alloc*/ = ( void * ) PyType_GenericAlloc ; \
pyopencv_ # # NAME # # _Slots [ 6 ] . pfunc /*tp_new*/ = ( void * ) PyType_GenericNew ; \
pyopencv_ # # CLASS_ID # # _Slots [ 0 ] . pfunc /*tp_dealloc*/ = ( void * ) pyopencv_ # # CLASS_ID # # _dealloc ; \
pyopencv_ # # CLASS_ID # # _Slots [ 1 ] . pfunc /*tp_repr*/ = ( void * ) pyopencv_ # # CLASS_ID # # _repr ; \
pyopencv_ # # CLASS_ID # # _Slots [ 2 ] . pfunc /*tp_getset*/ = ( void * ) pyopencv_ # # CLASS_ID # # _getseters ; \
pyopencv_ # # CLASS_ID # # _Slots [ 3 ] . pfunc /*tp_init*/ = ( void * ) CONSTRUCTOR ; \
pyopencv_ # # CLASS_ID # # _Slots [ 4 ] . pfunc /*tp_methods*/ = pyopencv_ # # CLASS_ID # # _methods ; \
pyopencv_ # # CLASS_ID # # _Slots [ 5 ] . pfunc /*tp_alloc*/ = ( void * ) PyType_GenericAlloc ; \
pyopencv_ # # CLASS_ID # # _Slots [ 6 ] . pfunc /*tp_new*/ = ( void * ) PyType_GenericNew ; \
PyObject * bases = 0 ; \
if ( pyopencv_ # # BASE # # _TypePtr ) \
bases = PyTuple_Pack ( 1 , pyopencv_ # # BASE # # _TypePtr ) ; \
pyopencv_ # # NAME # # _TypePtr = PyType_FromSpecWithBases ( & pyopencv_ # # NAME # # _Spec , bases ) ; \
if ( ! pyopencv_ # # NAME # # _TypePtr ) \
pyopencv_ # # CLASS_ID # # _TypePtr = PyType_FromSpecWithBases ( & pyopencv_ # # CLASS_ID # # _Spec , bases ) ; \
if ( ! pyopencv_ # # CLASS_ID # # _TypePtr ) \
{ \
printf ( " Failed to create type from spec: " # WNAME " , base ( " # BASE " ) \n " ) ; \
printf ( " Failed to create type from spec: " # CLASS_ID " , base ( " # BASE " ) \n " ) ; \
ERROR_HANDLER ; \
} \
if ( PyModule_AddObject ( m , # W NAME, ( PyObject * ) pyopencv_ # # NAME # # _TypePtr ) < 0 ) \
if ( ! registerNewType ( m , # EXPORT_ NAME, ( PyObject * ) pyopencv_ # # CLASS_ID # # _TypePtr , SCOPE ) ) \
{ \
printf ( " Failed to register a new type: " # WNAME " , base ( " # BASE " ) \n " ) ; \
Py_DECREF ( pyopencv_ # # NAME # # _TypePtr ) ; \
printf ( " Failed to register a new type: " # EXPORT_NAME " , base ( " # BASE " ) in " SCOPE " \n " ) ; \
ERROR_HANDLER ; \
} \
}