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
11182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODNAME = '_CG'                         # The name of the module
1279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
1379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The following is *usually* unchanged but may still require tuning
14182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODPREFIX = 'CG'                        # The prefix for module-wide routines
1579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
16182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOUTPUTFILE = 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
37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return Py_BuildValue("(ff)",
38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->x,
39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->y);
4079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum}
4179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
4279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint
4379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPoint_Convert(PyObject *v, CGPoint *p_itself)
4479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{
45182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if( !PyArg_Parse(v, "(ff)",
46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->x,
47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->y) )
48182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                return 0;
49182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return 1;
5079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum}
5179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
5279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGRect_New(CGRect *itself)
5379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{
5479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return Py_BuildValue("(ffff)",
56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->origin.x,
57182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->origin.y,
58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->size.width,
59182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->size.height);
6079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum}
6179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
6279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint
6379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGRect_Convert(PyObject *v, CGRect *p_itself)
6479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{
65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if( !PyArg_Parse(v, "(ffff)",
66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->origin.x,
67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->origin.y,
68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->size.width,
69182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->size.height) )
70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                return 0;
71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return 1;
7279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum}
7379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
7479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGAffineTransform_New(CGAffineTransform *itself)
7579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{
7679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
77182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return Py_BuildValue("(ffffff)",
78182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->a,
79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->b,
80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->c,
81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->d,
82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->tx,
83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        itself->ty);
8479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum}
8579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
8679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint
8779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGAffineTransform_Convert(PyObject *v, CGAffineTransform *p_itself)
8879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{
89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if( !PyArg_Parse(v, "(ffffff)",
90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->a,
91182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->b,
92182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->c,
93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->d,
94182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->tx,
95182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        &p_itself->ty) )
96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                return 0;
97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return 1;
9879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum}
9979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum"""
10079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
10179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumclass MyOpaqueByValueType(OpaqueByValueType):
102182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    """Sort of a mix between OpaqueByValueType and OpaqueType."""
103182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def mkvalueArgs(self, name):
104182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        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):
124182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputStructMembers(self):
125182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        ObjectDefinition.outputStructMembers(self)
126182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputCleanupStructMembers(self):
127182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        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))
172182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return NULL;
17379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum
17479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum_err = CreateCGContextForPort(port, &ctx);
17579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumif (_err != noErr)
176182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        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:
188182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    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()
193