1 # This script generates a Python interface for an Apple Macintosh Manager. 2 # It uses the "bgen" package to generate C code. 3 # The function specifications are generated by scanning the mamager's header file, 4 # using the "scantools" package (customized for this particular manager). 5 6 #error missing SetActionFilter 7 8 import string 9 10 # Declarations that change for each manager 11 MODNAME = '_CG' # The name of the module 12 13 # The following is *usually* unchanged but may still require tuning 14 MODPREFIX = 'CG' # The prefix for module-wide routines 15 INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner 16 OUTPUTFILE = MODNAME + "module.c" # The file generated by this program 17 18 from macsupport import * 19 20 CGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj") 21 RgnHandle = OpaqueByValueType("RgnHandle", "ResObj") 22 23 # Create the type objects 24 25 includestuff = includestuff + """ 26 #include <ApplicationServices/ApplicationServices.h> 27 28 extern int GrafObj_Convert(PyObject *, GrafPtr *); 29 30 /* 31 ** Manual converters 32 */ 33 34 PyObject *CGPoint_New(CGPoint *itself) 35 { 36 37 return Py_BuildValue("(ff)", 38 itself->x, 39 itself->y); 40 } 41 42 int 43 CGPoint_Convert(PyObject *v, CGPoint *p_itself) 44 { 45 if( !PyArg_Parse(v, "(ff)", 46 &p_itself->x, 47 &p_itself->y) ) 48 return 0; 49 return 1; 50 } 51 52 PyObject *CGRect_New(CGRect *itself) 53 { 54 55 return Py_BuildValue("(ffff)", 56 itself->origin.x, 57 itself->origin.y, 58 itself->size.width, 59 itself->size.height); 60 } 61 62 int 63 CGRect_Convert(PyObject *v, CGRect *p_itself) 64 { 65 if( !PyArg_Parse(v, "(ffff)", 66 &p_itself->origin.x, 67 &p_itself->origin.y, 68 &p_itself->size.width, 69 &p_itself->size.height) ) 70 return 0; 71 return 1; 72 } 73 74 PyObject *CGAffineTransform_New(CGAffineTransform *itself) 75 { 76 77 return Py_BuildValue("(ffffff)", 78 itself->a, 79 itself->b, 80 itself->c, 81 itself->d, 82 itself->tx, 83 itself->ty); 84 } 85 86 int 87 CGAffineTransform_Convert(PyObject *v, CGAffineTransform *p_itself) 88 { 89 if( !PyArg_Parse(v, "(ffffff)", 90 &p_itself->a, 91 &p_itself->b, 92 &p_itself->c, 93 &p_itself->d, 94 &p_itself->tx, 95 &p_itself->ty) ) 96 return 0; 97 return 1; 98 } 99 """ 100 101 class MyOpaqueByValueType(OpaqueByValueType): 102 """Sort of a mix between OpaqueByValueType and OpaqueType.""" 103 def mkvalueArgs(self, name): 104 return "%s, &%s" % (self.new, name) 105 106 CGPoint = MyOpaqueByValueType('CGPoint', 'CGPoint') 107 CGRect = MyOpaqueByValueType('CGRect', 'CGRect') 108 CGAffineTransform = MyOpaqueByValueType('CGAffineTransform', 'CGAffineTransform') 109 110 char_ptr = Type("char *", "s") 111 112 CGTextEncoding = int 113 CGLineCap = int 114 CGLineJoin = int 115 CGTextDrawingMode = int 116 CGPathDrawingMode = int 117 CGInterpolationQuality = int 118 119 # The real objects 120 CGContextRef = OpaqueByValueType("CGContextRef", "CGContextRefObj") 121 122 123 class MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition): 124 def outputStructMembers(self): 125 ObjectDefinition.outputStructMembers(self) 126 def outputCleanupStructMembers(self): 127 Output("CGContextRelease(self->ob_itself);") 128 129 130 # Create the generator groups and link them 131 module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) 132 133 CGContextRef_object = MyObjectDefinition('CGContextRef', 'CGContextRefObj', 'CGContextRef') 134 135 136 # ADD object here 137 138 module.addobject(CGContextRef_object) 139 140 141 142 Function = FunctionGenerator 143 Method = MethodGenerator 144 145 CGContextRef_methods = [] 146 147 # ADD _methods initializer here 148 execfile(INPUTFILE) 149 150 # manual method, lives in Quickdraw.h 151 f = Method(void, 'SyncCGContextOriginWithPort', 152 (CGContextRef, 'ctx', InMode), 153 (CGrafPtr, 'port', InMode), 154 ) 155 CGContextRef_methods.append(f) 156 157 # manual method, lives in Quickdraw.h 158 f = Method(void, 'ClipCGContextToRegion', 159 (CGContextRef, 'ctx', InMode), 160 (Rect, 'portRect', InMode), 161 (RgnHandle, 'region', InMode), 162 ) 163 CGContextRef_methods.append(f) 164 165 166 CreateCGContextForPort_body = """\ 167 GrafPtr port; 168 CGContextRef ctx; 169 OSStatus _err; 170 171 if (!PyArg_ParseTuple(_args, "O&", GrafObj_Convert, &port)) 172 return NULL; 173 174 _err = CreateCGContextForPort(port, &ctx); 175 if (_err != noErr) 176 if (_err != noErr) return PyMac_Error(_err); 177 _res = Py_BuildValue("O&", CGContextRefObj_New, ctx); 178 return _res; 179 """ 180 181 f = ManualGenerator("CreateCGContextForPort", CreateCGContextForPort_body); 182 f.docstring = lambda: "(CGrafPtr) -> CGContextRef" 183 module.add(f) 184 185 186 # ADD add forloop here 187 for f in CGContextRef_methods: 188 CGContextRef_object.add(f) 189 190 # generate output (open the output file as late as possible) 191 SetOutputFileName(OUTPUTFILE) 192 module.generate() 193