565 have_empty_constructor =
False
569 have_empty_constructor =
True
570 if s
not in prototype_list:
571 prototype_list.append(s)
572 docstring_list.append(v.docstring)
578 if have_empty_constructor
and len(self.
variants) == 2:
579 idx = self.
variants[1].py_arglist != []
583 prototype_list = [s[:p1+1] +
"[" + s[p1+1:p2] +
"]" + s[p2:]]
588 for prototype, body
in zip(prototype_list, docstring_list):
589 full_docstring += Template(
"$prototype\n$docstring\n\n\n\n").substitute(
593 for line
in body.split(
'\n')]
598 full_docstring = full_docstring.strip().replace(
"\\",
"\\\\").replace(
'\n',
'\\n').replace(
"\"",
"\\\"")
600 full_docstring = full_docstring.encode(
'ascii', errors=
'xmlcharrefreplace').decode()
602 flags = [
"METH_VARARGS",
"METH_KEYWORDS"]
604 flags.append(
"METH_CLASS")
606 return Template(
' {"$py_funcname", (PyCFunction)$wrap_funcname, $flags, "$py_docstring"},\n'
608 flags =
" | ".join(flags), py_docstring = full_docstring)
611 all_classes = codegen.classes
613 code =
"%s\n{\n" % (proto,)
614 code +=
" using namespace %s;\n\n" % self.
namespace.replace(
'.',
'::')
624 amp =
"&" if selfinfo.issimple
else ""
627 elif selfinfo.isalgorithm:
628 code += gen_template_check_self_algo.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp)
630 get =
"" if selfinfo.issimple
else ".get()"
631 code += gen_template_check_self.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp, get=get)
632 fullname = selfinfo.wname +
"." + fullname
634 all_code_variants = []
650 if a.tp
in ignored_arg_types:
652 if not defval
and a.tp.endswith(
"*"):
655 if not code_args.endswith(
"("):
658 all_cargs.append([[
None,
""],
""])
668 tp1 = tp.replace(
"*",
"_ptr")
669 if tp1.endswith(
"*"):
670 print(
"Error: type with star: a.tp=%s, tp=%s, tp1=%s" % (a.tp, tp, tp1))
673 amapping = simple_argtype_mapping.get(tp, (tp,
"O", defval0))
676 if amapping[1] ==
"O":
677 code_decl +=
" PyObject* pyobj_%s = nullptr;\n" % (a.name,)
678 parse_name =
"pyobj_" + a.name
680 code_cvt_list.append(
"convert_to_char(pyobj_%s, &%s, %s)"% (a.name, a.name, a.crepr()))
682 code_cvt_list.append(
"pyopencv_to(pyobj_%s, %s, %s)" % (a.name, a.name, a.crepr()))
684 all_cargs.append([amapping, parse_name])
691 if "Mat" in defval
and "UMat" not in defval:
692 defval = defval.replace(
"Mat",
"UMat")
694 if defval == tp +
"()" and amapping[1] ==
"O":
696 if a.outputarg
and not a.inputarg:
699 code_decl +=
" %s %s=%s;\n" % (amapping[0], a.name, defval)
701 code_decl +=
" %s %s;\n" % (amapping[0], a.name)
703 if not code_args.endswith(
"("):
705 code_args += amp + a.name
710 if selfinfo.issimple:
711 templ_prelude = gen_template_simple_call_constructor_prelude
712 templ = gen_template_simple_call_constructor
714 templ_prelude = gen_template_call_constructor_prelude
715 templ = gen_template_call_constructor
717 code_prelude = templ_prelude.substitute(name=selfinfo.name, cname=selfinfo.cname)
718 code_fcall = templ.substitute(name=selfinfo.name, cname=selfinfo.cname, args=code_args)
723 code_decl +=
" " + v.rettype +
" retval;\n"
724 code_fcall +=
"retval = "
726 code_fcall +=
"_self_->" + self.
cname
728 code_fcall += self.
cname
729 code_fcall += code_args
732 code_cvt_list = [
""] + code_cvt_list
740 tp1 = tp.replace(
"*",
"_ptr")
741 amapping = simple_argtype_mapping.get(tp, (tp,
"O",
"0"))
742 all_cargs.append(amapping)
744 if v.args
and v.py_arglist:
746 fmtspec =
"".join([all_cargs[argno][0][1]
for aname, argno
in v.py_arglist])
747 if v.py_noptargs > 0:
748 fmtspec = fmtspec[:-v.py_noptargs] +
"|" + fmtspec[-v.py_noptargs:]
749 fmtspec +=
":" + fullname
755 code_parse = gen_template_parse_args.substitute(
756 kw_list =
", ".join([
'"' + aname +
'"' for aname, argno
in v.py_arglist]),
758 parse_arglist =
", ".join([
"&" + all_cargs[argno][1]
for aname, argno
in v.py_arglist]),
759 code_cvt =
" &&\n ".join(code_cvt_list))
761 code_parse =
"if(PyObject_Size(args) == 0 && (kw == nullptr || PyObject_Size(kw) == 0))"
763 if len(v.py_outlist) == 0:
764 code_ret =
"Py_RETURN_NONE"
765 elif len(v.py_outlist) == 1:
767 code_ret =
"return 0"
769 aname, argno = v.py_outlist[0]
770 code_ret =
"return pyopencv_from(%s)" % (aname,)
773 fmtspec =
"N"*len(v.py_outlist)
774 backcvt_arg_list = []
775 for aname, argno
in v.py_outlist:
776 amapping = all_cargs[argno][0]
777 backcvt_arg_list.append(
"%s(%s)" % (amapping[2], aname))
778 code_ret =
"return Py_BuildValue(\"(%s)\", %s)" % \
779 (fmtspec,
", ".join([
"pyopencv_from(" + aname +
")" for aname, argno
in v.py_outlist]))
781 all_code_variants.append(gen_template_func_body.substitute(code_decl=code_decl,
782 code_parse=code_parse, code_prelude=code_prelude, code_fcall=code_fcall, code_ret=code_ret))
784 if len(all_code_variants)==1:
786 code += all_code_variants[0]
789 code +=
" PyErr_Clear();\n\n".join([
" {\n" + v +
" }\n" for v
in all_code_variants])
794 code +=
"\n return %s;\n}\n\n" % def_ret
805 py_name =
'cv.' + classinfo.wname
807 py_name =
'.'.join([self.
namespace, classinfo.sname +
'_' + self.
variants[0].wname])
809 cname = classinfo.cname +
'::' + cname
810 py_name =
'cv.' + classinfo.wname +
'.' + self.
variants[0].wname
814 py_signatures = codegen.py_signatures.setdefault(cname, [])
816 s = dict(name=py_name, arg=v.py_arg_str, ret=v.py_return_str)
817 for old
in py_signatures:
821 py_signatures.append(s)