cgsupport.py revision da6081fccb71541004e3f36f57a9c0971a969e3b
179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# This script generates a Python interface for an Apple Macintosh Manager. 279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# It uses the "bgen" package to generate C code. 379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The function specifications are generated by scanning the mamager's header file, 479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# using the "scantools" package (customized for this particular manager). 579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum#error missing SetActionFilter 779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumimport string 979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 1079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# Declarations that change for each manager 1179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumMODNAME = '_CG' # The name of the module 1279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 1379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The following is *usually* unchanged but may still require tuning 1479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumMODPREFIX = 'CG' # The prefix for module-wide routines 1579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner 1679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumOUTPUTFILE = MODNAME + "module.c" # The file generated by this program 1779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 1879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumfrom macsupport import * 1979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2038b504e9e3ef3049815779e8c18b62f690ec4ed2Just van RossumCGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj") 21dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van RossumRgnHandle = OpaqueByValueType("RgnHandle", "ResObj") 2279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# Create the type objects 2479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumincludestuff = includestuff + """ 264f6c05857fba17d3c2f65bd2438a8d1cebdae43aJust van Rossum#include <ApplicationServices/ApplicationServices.h> 2779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumextern int GrafObj_Convert(PyObject *, GrafPtr *); 2979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 3079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum/* 3179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum** Manual converters 3279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum*/ 3379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 3479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGPoint_New(CGPoint *itself) 3579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 3679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 3779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return Py_BuildValue("(ff)", 3879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->x, 3979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->y); 4079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 4179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 4279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint 4379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPoint_Convert(PyObject *v, CGPoint *p_itself) 4479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 4579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum if( !PyArg_Parse(v, "(ff)", 4679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->x, 4779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->y) ) 4879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return 0; 4979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return 1; 5079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 5179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 5279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGRect_New(CGRect *itself) 5379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 5479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 5579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return Py_BuildValue("(ffff)", 5679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->origin.x, 5779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->origin.y, 5879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->size.width, 5979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->size.height); 6079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 6179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 6279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint 6379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGRect_Convert(PyObject *v, CGRect *p_itself) 6479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 6579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum if( !PyArg_Parse(v, "(ffff)", 6679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->origin.x, 6779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->origin.y, 6879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->size.width, 6979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->size.height) ) 7079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return 0; 7179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return 1; 7279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 7379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 7479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGAffineTransform_New(CGAffineTransform *itself) 7579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 7679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 7779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return Py_BuildValue("(ffffff)", 7879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->a, 7979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->b, 8079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->c, 8179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->d, 8279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->tx, 8379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum itself->ty); 8479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 8579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 8679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint 8779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGAffineTransform_Convert(PyObject *v, CGAffineTransform *p_itself) 8879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 8979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum if( !PyArg_Parse(v, "(ffffff)", 9079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->a, 9179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->b, 9279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->c, 9379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->d, 9479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->tx, 9579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum &p_itself->ty) ) 9679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return 0; 9779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return 1; 9879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 9979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum""" 10079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 10179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumclass MyOpaqueByValueType(OpaqueByValueType): 10279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum """Sort of a mix between OpaqueByValueType and OpaqueType.""" 10379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum def mkvalueArgs(self, name): 10479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return "%s, &%s" % (self.new, name) 10579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 10679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPoint = MyOpaqueByValueType('CGPoint', 'CGPoint') 10779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGRect = MyOpaqueByValueType('CGRect', 'CGRect') 10879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGAffineTransform = MyOpaqueByValueType('CGAffineTransform', 'CGAffineTransform') 10979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 11079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumchar_ptr = Type("char *", "s") 11179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 11279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGTextEncoding = int 11379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGLineCap = int 11479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGLineJoin = int 11579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGTextDrawingMode = int 11679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPathDrawingMode = int 117da6081fccb71541004e3f36f57a9c0971a969e3bJack JansenCGInterpolationQuality = int 11879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 11979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The real objects 12079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef = OpaqueByValueType("CGContextRef", "CGContextRefObj") 12179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 12279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 12396cebde909bbb8034af576d8f31f465bbad90374Jack Jansenclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition): 12479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum def outputStructMembers(self): 12579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum ObjectDefinition.outputStructMembers(self) 12679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum def outputCleanupStructMembers(self): 12779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum Output("CGContextRelease(self->ob_itself);") 12879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 12979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# Create the generator groups and link them 13179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) 13279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef_object = MyObjectDefinition('CGContextRef', 'CGContextRefObj', 'CGContextRef') 13479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# ADD object here 13779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule.addobject(CGContextRef_object) 13979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumFunction = FunctionGenerator 14379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumMethod = MethodGenerator 14479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef_methods = [] 14679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# ADD _methods initializer here 14879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumexecfile(INPUTFILE) 14979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 15038b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum# manual method, lives in Quickdraw.h 15138b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossumf = Method(void, 'SyncCGContextOriginWithPort', 15238b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum (CGContextRef, 'ctx', InMode), 15338b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum (CGrafPtr, 'port', InMode), 15438b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum) 15538b504e9e3ef3049815779e8c18b62f690ec4ed2Just van RossumCGContextRef_methods.append(f) 15638b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum 157dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum# manual method, lives in Quickdraw.h 158dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossumf = Method(void, 'ClipCGContextToRegion', 159dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum (CGContextRef, 'ctx', InMode), 160dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum (Rect, 'portRect', InMode), 161dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum (RgnHandle, 'region', InMode), 162dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum) 163dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van RossumCGContextRef_methods.append(f) 164dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum 165dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum 16679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCreateCGContextForPort_body = """\ 16779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumGrafPtr port; 16879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef ctx; 16979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumOSStatus _err; 17079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 17179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumif (!PyArg_ParseTuple(_args, "O&", GrafObj_Convert, &port)) 17279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum return NULL; 17379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 17479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum_err = CreateCGContextForPort(port, &ctx); 17579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumif (_err != noErr) 17679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum if (_err != noErr) return PyMac_Error(_err); 17779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum_res = Py_BuildValue("O&", CGContextRefObj_New, ctx); 17879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumreturn _res; 17979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum""" 18079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 18179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumf = ManualGenerator("CreateCGContextForPort", CreateCGContextForPort_body); 18279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumf.docstring = lambda: "(CGrafPtr) -> CGContextRef" 18379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule.add(f) 18479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 18579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 18679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# ADD add forloop here 18779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumfor f in CGContextRef_methods: 18879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum CGContextRef_object.add(f) 18979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 19079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# generate output (open the output file as late as possible) 19179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumSetOutputFileName(OUTPUTFILE) 19279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule.generate() 19379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 194