mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.4 KiB
180 lines
5.4 KiB
#! /usr/bin/env python |
|
""" |
|
This script extracts macros functions from the OpenCV headers and attempts to generate |
|
standard C function prototypes. Type information is missing in the macros, so SWIG |
|
cannot generate C code for them unless we provide this. |
|
""" |
|
|
|
import sys, re |
|
|
|
ARG_MAP = { |
|
"mat":"CvMat*", |
|
"type":"int", |
|
"flags":"int", |
|
"img":"CvArr *", |
|
"image":"IplImage *", |
|
"mat1":"CvMat*", |
|
"mat2":"CvMat*", |
|
"seq":"CvSeq*", |
|
"elem_ptr":"void *", |
|
"elem":"CvPoint", |
|
"elem_type":"ignore", |
|
"elemtype":"ignore", |
|
"elem_size":"int", |
|
"edge":"CvGraphEdge *", |
|
"vertex":"CvGraphVtx *", |
|
"contour":"CvSeq *", |
|
"vtx":"CvGraphVtx *", |
|
"reader":"CvSeqReader", |
|
"writer":"CvSeqWriter", |
|
"hist":"CvHistogram *", |
|
"ptr":"void *", |
|
"arr":"CvArr *", |
|
"header":"CvMat *", |
|
"src":"CvArr *", |
|
"src1":"CvArr *", |
|
"src2":"CvArr *", |
|
"src3":"CvArr *", |
|
"dst":"CvArr *", |
|
"pt1":"CvPoint", |
|
"pt2":"CvPoint", |
|
"_pt":"CvPoint", |
|
"index":"int", |
|
"idx":"int", |
|
"set":"CvSet *", |
|
"n":"int", |
|
"a":"int", |
|
"b":"int", |
|
"t":"int", |
|
"value":"double", |
|
"row":"int", |
|
"col":"int", |
|
"cn":"int", |
|
"new_cn":"int", |
|
"pix_size":"int", |
|
"depth":"int", |
|
"node":"CvSparseNode *", |
|
"storage":"CvMemStorage *", |
|
"new_dims": "int", |
|
"new_sizes": "int *", |
|
"A":"CvArr *", |
|
"B":"CvArr *", |
|
"C":"CvArr *", |
|
"real_scalar":"double", |
|
"graph":"CvGraph *", |
|
"r":"double", |
|
"g":"double", |
|
# "b":"double", |
|
"line_iterator":"CvLineIterator", |
|
"deltas":"double *", |
|
"step":"int", |
|
"haar":"void *", |
|
# "contour":"const void*", # handled as a special case in cvshadow |
|
"range":"CvSize", |
|
"nch":"int", |
|
"method":"int", |
|
"factor":"double" |
|
} |
|
RET_MAP = { |
|
"cvContourPerimeter":"double", |
|
"CV_RGB":"CvScalar", |
|
"CV_NEXT_GRAPH_EDGE":"CvGraphEdge *", |
|
"CV_IMIN":"int", |
|
"CV_IMAX":"int", |
|
"CV_IABS":"int", |
|
"CV_MAT_CN":"int", |
|
"CV_MAT_DEPTH":"int", |
|
"CV_NEXT_LINE_POINT":"void", |
|
} |
|
|
|
# special cases |
|
MACROS = { |
|
#"CV_MAKETYPE":"", # SWIG 1.3.29 doesn't like this one for some indeterminant reason |
|
"CV_TURN_ON_IPL_COMPATIBILITY":"", |
|
"CV_MAT_ELEM_PTR_FAST":"void * CV_MAT_ELEM_PTR_FAST(CvMat mat,int row,int col,int pix_size);", |
|
"CV_MAT_ELEM_PTR":"void * CV_MAT_ELEM_PTR(CvMat mat,int row,int col);", |
|
"CV_NODE_VAL":"void * CV_NODE_VAL(CvSparseMat* mat,CvSparseNode * node);", |
|
"CV_NODE_IDX":"int * CV_NODE_IDX(CvSparseMat* mat,CvSparseNode * node);", |
|
"CV_READ_CHAIN_POINT":"void CV_READ_CHAIN_POINT(CvPoint _pt, CvChainPtReader reader);", |
|
"CV_SUBDIV2D_NEXT_EDGE":"CvQuadEdge2D* CV_SUBDIV2D_NEXT_EDGE(CvSubdiv2DEdge edge);", |
|
"cvFree":"void cvFree(void ** ptr);", |
|
|
|
|
|
} |
|
|
|
print """ |
|
/*////////////////////////////////////////////////////////////////////////////////////////////////// |
|
// This file is automatically generated from the extract_macros.py script found in the 'utils' |
|
// subdirectory of the OpenCV distribution. If the generated function prototypes are missing or |
|
// incorrect, it is likely that a name->type mapping will have to be added to the script |
|
/////////////////////////////////////////////////////////////////////////////////////////////////M*/ |
|
""" |
|
|
|
print "// This file was generated from the following header files: " |
|
print "// %s" % "\n// ".join(sys.argv[1:]) |
|
|
|
|
|
def determine_return_type(name, arguments): |
|
if RET_MAP.has_key( name ): |
|
return RET_MAP[name] |
|
if name.find("_IS_")>=0 or \ |
|
name.find("_HAS_")>=0 or \ |
|
name.find("_KIND")>=0 or \ |
|
name.find("_ARE_")>=0 or \ |
|
name.find("_SIZE")>=0 or \ |
|
name.find("Idx")>=0 or \ |
|
name.find("Count")>=0 or \ |
|
(name.find("TYPE")>=0 and not name.find("TYPES")>=0): |
|
return "int" |
|
if re.match( r"CV_(?:8|16|32|64)(?:U|S|F)C", name ): |
|
return "int" |
|
if len(arguments) is 1 and arguments[0].startswith("double"): |
|
return "double" |
|
if name.find("_PTR")>=0: |
|
return "void *" |
|
if name.endswith("POINT"): |
|
return "CvPoint" |
|
return "void" |
|
|
|
for m in MACROS: |
|
print MACROS[m] |
|
|
|
for fn in sys.argv[1:]: |
|
f = open( fn, "r" ) |
|
in_define = False |
|
fstr="" |
|
macro_name="" |
|
for l in f.xreadlines(): |
|
m = re.match( r"^#define\s+((?:CV_|IPL_|cv)\w+)\s*\(([_, a-zA-Z0-9]*)\)\s*(.*)", l ) |
|
|
|
if m and not m.group(1).endswith("FIELDS") and not MACROS.has_key(m.group(1)): |
|
macro_name = m.group(1) |
|
args = m.group(2).strip().split(",") |
|
|
|
# assign return type |
|
ret=determine_return_type( macro_name, args ) |
|
|
|
# assign type to each argument |
|
no_args = len(args) is 0 |
|
typed_args = [] |
|
ignore = False |
|
for arg in args: |
|
arg = arg.strip() |
|
if len(arg) is 0: |
|
no_args = True |
|
break |
|
if ARG_MAP.has_key( arg ): |
|
if ARG_MAP[arg] is "ignore": |
|
ignore=True |
|
break |
|
typed_args.append( "%s %s"%( ARG_MAP[arg], arg ) ) |
|
else: |
|
sys.stderr.write( "\"%s\":\"?\", in macro '%s'\n" % (arg, macro_name) ) |
|
typed_args = [] |
|
break |
|
if not ignore and (no_args or len(typed_args)>0): |
|
decl = "%s %s(%s);" % (ret, macro_name, ",".join( typed_args) ) |
|
MACROS[ macro_name ] = decl |
|
print decl |
|
|
|
f.close()
|
|
|