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