ยปCore Development>Code coverage>Mac/Modules/qd/qdsupport.py

Python code coverage for Mac/Modules/qd/qdsupport.py

#countcontent
1n/a# This script generates a Python interface for an Apple Macintosh Manager.
2n/a# It uses the "bgen" package to generate C code.
3n/a# The function specifications are generated by scanning the mamager's header file,
4n/a# using the "scantools" package (customized for this particular manager).
5n/a
6n/aimport string
7n/a
8n/a# Declarations that change for each manager
9n/aMACHEADERFILE = 'QuickDraw.h' # The Apple header file
10n/aMODNAME = '_Qd' # The name of the module
11n/aOBJECTNAME = 'Graf' # The basic name of the objects used here
12n/a
13n/a# The following is *usually* unchanged but may still require tuning
14n/aMODPREFIX = 'Qd' # The prefix for module-wide routines
15n/aOBJECTTYPE = OBJECTNAME + 'Ptr' # The C type used to represent them
16n/aOBJECTPREFIX = MODPREFIX + 'Obj' # The prefix for object methods
17n/aINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
18n/aEXTRAFILE = string.lower(MODPREFIX) + 'edit.py' # A similar file but hand-made
19n/aOUTPUTFILE = MODNAME + "module.c" # The file generated by this program
20n/a
21n/afrom macsupport import *
22n/a
23n/a# Create the type objects
24n/a
25n/aclass TextThingieClass(FixedInputBufferType):
26n/a def getargsCheck(self, name):
27n/a Output("/* Fool compiler warnings */")
28n/a Output("%s__in_len__ = %s__in_len__;", name, name)
29n/a
30n/a def declareSize(self, name):
31n/a Output("int %s__in_len__;", name)
32n/a
33n/aTextThingie = TextThingieClass(None)
34n/a
35n/a# These are temporary!
36n/aRgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
37n/aOptRgnHandle = OpaqueByValueType("RgnHandle", "OptResObj")
38n/aPicHandle = OpaqueByValueType("PicHandle", "ResObj")
39n/aPolyHandle = OpaqueByValueType("PolyHandle", "ResObj")
40n/aPixMapHandle = OpaqueByValueType("PixMapHandle", "ResObj")
41n/aPixPatHandle = OpaqueByValueType("PixPatHandle", "ResObj")
42n/aPatHandle = OpaqueByValueType("PatHandle", "ResObj")
43n/aCursHandle = OpaqueByValueType("CursHandle", "ResObj")
44n/aCCrsrHandle = OpaqueByValueType("CCrsrHandle", "ResObj")
45n/aCIconHandle = OpaqueByValueType("CIconHandle", "ResObj")
46n/aCTabHandle = OpaqueByValueType("CTabHandle", "ResObj")
47n/aITabHandle = OpaqueByValueType("ITabHandle", "ResObj")
48n/aGDHandle = OpaqueByValueType("GDHandle", "ResObj")
49n/aCGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj")
50n/aGrafPtr = OpaqueByValueType("GrafPtr", "GrafObj")
51n/aBitMap_ptr = OpaqueByValueType("BitMapPtr", "BMObj")
52n/aconst_BitMap_ptr = OpaqueByValueType("const BitMap *", "BMObj")
53n/aBitMap = OpaqueType("BitMap", "BMObj_NewCopied", "BUG")
54n/aRGBColor = OpaqueType('RGBColor', 'QdRGB')
55n/aRGBColor_ptr = RGBColor
56n/aFontInfo = OpaqueType('FontInfo', 'QdFI')
57n/aComponent = OpaqueByValueType('Component', 'CmpObj')
58n/aComponentInstance = OpaqueByValueType('ComponentInstance', 'CmpInstObj')
59n/a
60n/aCursor = StructOutputBufferType('Cursor')
61n/aCursor_ptr = StructInputBufferType('Cursor')
62n/aPattern = StructOutputBufferType('Pattern')
63n/aPattern_ptr = StructInputBufferType('Pattern')
64n/aPenState = StructOutputBufferType('PenState')
65n/aPenState_ptr = StructInputBufferType('PenState')
66n/aTruncCode = Type("TruncCode", "h")
67n/a
68n/aincludestuff = includestuff + """
69n/a#include <Carbon/Carbon.h>
70n/a
71n/a#ifdef USE_TOOLBOX_OBJECT_GLUE
72n/aextern PyObject *_GrafObj_New(GrafPtr);
73n/aextern int _GrafObj_Convert(PyObject *, GrafPtr *);
74n/aextern PyObject *_BMObj_New(BitMapPtr);
75n/aextern int _BMObj_Convert(PyObject *, BitMapPtr *);
76n/aextern PyObject *_QdRGB_New(RGBColorPtr);
77n/aextern int _QdRGB_Convert(PyObject *, RGBColorPtr);
78n/a
79n/a#define GrafObj_New _GrafObj_New
80n/a#define GrafObj_Convert _GrafObj_Convert
81n/a#define BMObj_New _BMObj_New
82n/a#define BMObj_Convert _BMObj_Convert
83n/a#define QdRGB_New _QdRGB_New
84n/a#define QdRGB_Convert _QdRGB_Convert
85n/a#endif
86n/a
87n/astatic PyObject *BMObj_NewCopied(BitMapPtr);
88n/a
89n/a/*
90n/a** Parse/generate RGB records
91n/a*/
92n/aPyObject *QdRGB_New(RGBColorPtr itself)
93n/a{
94n/a
95n/a return Py_BuildValue("lll", (long)itself->red, (long)itself->green, (long)itself->blue);
96n/a}
97n/a
98n/aint QdRGB_Convert(PyObject *v, RGBColorPtr p_itself)
99n/a{
100n/a long red, green, blue;
101n/a
102n/a if( !PyArg_ParseTuple(v, "lll", &red, &green, &blue) )
103n/a return 0;
104n/a p_itself->red = (unsigned short)red;
105n/a p_itself->green = (unsigned short)green;
106n/a p_itself->blue = (unsigned short)blue;
107n/a return 1;
108n/a}
109n/a
110n/a/*
111n/a** Generate FontInfo records
112n/a*/
113n/astatic
114n/aPyObject *QdFI_New(FontInfo *itself)
115n/a{
116n/a
117n/a return Py_BuildValue("hhhh", itself->ascent, itself->descent,
118n/a itself->widMax, itself->leading);
119n/a}
120n/a"""
121n/a
122n/afinalstuff = finalstuff + """
123n/a/* Like BMObj_New, but the original bitmap data structure is copied (and
124n/a** released when the object is released)
125n/a*/
126n/aPyObject *BMObj_NewCopied(BitMapPtr itself)
127n/a{
128n/a BitMapObject *it;
129n/a BitMapPtr itself_copy;
130n/a
131n/a if ((itself_copy=(BitMapPtr)malloc(sizeof(BitMap))) == NULL)
132n/a return PyErr_NoMemory();
133n/a *itself_copy = *itself;
134n/a it = (BitMapObject *)BMObj_New(itself_copy);
135n/a it->referred_bitmap = itself_copy;
136n/a return (PyObject *)it;
137n/a}
138n/a
139n/a"""
140n/a
141n/avariablestuff = ""
142n/a
143n/ainitstuff = initstuff + """
144n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(BitMapPtr, BMObj_New);
145n/a PyMac_INIT_TOOLBOX_OBJECT_CONVERT(BitMapPtr, BMObj_Convert);
146n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(GrafPtr, GrafObj_New);
147n/a PyMac_INIT_TOOLBOX_OBJECT_CONVERT(GrafPtr, GrafObj_Convert);
148n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(RGBColorPtr, QdRGB_New);
149n/a PyMac_INIT_TOOLBOX_OBJECT_CONVERT(RGBColor, QdRGB_Convert);
150n/a"""
151n/a
152n/a## not yet...
153n/a##
154n/a##class Region_ObjectDefinition(GlobalObjectDefinition):
155n/a## def outputCheckNewArg(self):
156n/a## Output("if (itself == NULL) return PyMac_Error(resNotFound);")
157n/a## def outputFreeIt(self, itselfname):
158n/a## Output("DisposeRegion(%s);", itselfname)
159n/a##
160n/a##class Polygon_ObjectDefinition(GlobalObjectDefinition):
161n/a## def outputCheckNewArg(self):
162n/a## Output("if (itself == NULL) return PyMac_Error(resNotFound);")
163n/a## def outputFreeIt(self, itselfname):
164n/a## Output("KillPoly(%s);", itselfname)
165n/a
166n/aclass MyGRObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
167n/a getsetlist = [
168n/a ('visRgn',
169n/a """RgnHandle h=NewRgn(); /* XXXX wrong dispose routine */
170n/a return Py_BuildValue("O&", ResObj_New, (Handle)GetPortVisibleRegion(self->ob_itself, h));
171n/a """,
172n/a None,
173n/a "Convenience attribute: return a copy of the visible region"
174n/a ), (
175n/a 'clipRgn',
176n/a """RgnHandle h=NewRgn(); /* XXXX wrong dispose routine */
177n/a return Py_BuildValue("O&", ResObj_New, (Handle)GetPortClipRegion(self->ob_itself, h));
178n/a """,
179n/a None,
180n/a "Convenience attribute: return a copy of the clipping region"
181n/a )]
182n/a def outputCheckNewArg(self):
183n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
184n/a def outputCheckConvertArg(self):
185n/a Output("#if 1")
186n/a OutLbrace()
187n/a Output("WindowRef win;")
188n/a OutLbrace("if (WinObj_Convert(v, &win) && v)")
189n/a Output("*p_itself = (GrafPtr)GetWindowPort(win);")
190n/a Output("return 1;")
191n/a OutRbrace()
192n/a Output("PyErr_Clear();")
193n/a OutRbrace()
194n/a Output("#else")
195n/a OutLbrace("if (DlgObj_Check(v))")
196n/a Output("DialogRef dlg = (DialogRef)((GrafPortObject *)v)->ob_itself;")
197n/a Output("*p_itself = (GrafPtr)GetWindowPort(GetDialogWindow(dlg));")
198n/a Output("return 1;")
199n/a OutRbrace()
200n/a OutLbrace("if (WinObj_Check(v))")
201n/a Output("WindowRef win = (WindowRef)((GrafPortObject *)v)->ob_itself;")
202n/a Output("*p_itself = (GrafPtr)GetWindowPort(win);")
203n/a Output("return 1;")
204n/a OutRbrace()
205n/a Output("#endif")
206n/a
207n/aclass MyBMObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
208n/a getsetlist = [
209n/a (
210n/a 'baseAddr',
211n/a 'return PyInt_FromLong((long)self->ob_itself->baseAddr);',
212n/a None,
213n/a None
214n/a ), (
215n/a 'rowBytes',
216n/a 'return PyInt_FromLong((long)self->ob_itself->rowBytes);',
217n/a None,
218n/a None
219n/a ), (
220n/a 'bounds',
221n/a 'return Py_BuildValue("O&", PyMac_BuildRect, &self->ob_itself->bounds);',
222n/a None,
223n/a None
224n/a ), (
225n/a 'bitmap_data',
226n/a 'return PyString_FromStringAndSize((char *)self->ob_itself, sizeof(BitMap));',
227n/a None,
228n/a None
229n/a ), (
230n/a 'pixmap_data',
231n/a 'return PyString_FromStringAndSize((char *)self->ob_itself, sizeof(PixMap));',
232n/a None,
233n/a None
234n/a )]
235n/a def outputCheckNewArg(self):
236n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
237n/a def outputStructMembers(self):
238n/a # We need to more items: a pointer to privately allocated data
239n/a # and a python object we're referring to.
240n/a Output("%s ob_itself;", self.itselftype)
241n/a Output("PyObject *referred_object;")
242n/a Output("BitMap *referred_bitmap;")
243n/a def outputInitStructMembers(self):
244n/a Output("it->ob_itself = %sitself;", self.argref)
245n/a Output("it->referred_object = NULL;")
246n/a Output("it->referred_bitmap = NULL;")
247n/a def outputCleanupStructMembers(self):
248n/a Output("Py_XDECREF(self->referred_object);")
249n/a Output("if (self->referred_bitmap) free(self->referred_bitmap);")
250n/a
251n/a# Create the generator groups and link them
252n/amodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff, variablestuff)
253n/a##r_object = Region_ObjectDefinition('Region', 'QdRgn', 'RgnHandle')
254n/a##po_object = Polygon_ObjectDefinition('Polygon', 'QdPgn', 'PolyHandle')
255n/a##module.addobject(r_object)
256n/a##module.addobject(po_object)
257n/agr_object = MyGRObjectDefinition("GrafPort", "GrafObj", "GrafPtr")
258n/amodule.addobject(gr_object)
259n/abm_object = MyBMObjectDefinition("BitMap", "BMObj", "BitMapPtr")
260n/amodule.addobject(bm_object)
261n/a
262n/a
263n/a# Create the generator classes used to populate the lists
264n/aFunction = OSErrWeakLinkFunctionGenerator
265n/aMethod = OSErrWeakLinkMethodGenerator
266n/a
267n/a# Create and populate the lists
268n/afunctions = []
269n/agr_methods = []
270n/abm_methods = []
271n/a#methods = []
272n/aexecfile(INPUTFILE)
273n/aexecfile(EXTRAFILE)
274n/a
275n/a# add the populated lists to the generator groups
276n/a# (in a different wordl the scan program would generate this)
277n/afor f in functions: module.add(f)
278n/afor f in gr_methods: gr_object.add(f)
279n/afor f in bm_methods: bm_object.add(f)
280n/a
281n/a# Manual generator: get data out of a bitmap
282n/agetdata_body = """
283n/aint from, length;
284n/achar *cp;
285n/a
286n/aif ( !PyArg_ParseTuple(_args, "ii", &from, &length) )
287n/a return NULL;
288n/acp = _self->ob_itself->baseAddr+from;
289n/a_res = PyString_FromStringAndSize(cp, length);
290n/areturn _res;
291n/a"""
292n/af = ManualGenerator("getdata", getdata_body)
293n/af.docstring = lambda: """(int start, int size) -> string. Return bytes from the bitmap"""
294n/abm_object.add(f)
295n/a
296n/a# Manual generator: store data in a bitmap
297n/aputdata_body = """
298n/aint from, length;
299n/achar *cp, *icp;
300n/a
301n/aif ( !PyArg_ParseTuple(_args, "is#", &from, &icp, &length) )
302n/a return NULL;
303n/acp = _self->ob_itself->baseAddr+from;
304n/amemcpy(cp, icp, length);
305n/aPy_INCREF(Py_None);
306n/a_res = Py_None;
307n/areturn _res;
308n/a"""
309n/af = ManualGenerator("putdata", putdata_body)
310n/af.docstring = lambda: """(int start, string data). Store bytes into the bitmap"""
311n/abm_object.add(f)
312n/a
313n/a#
314n/a# We manually generate a routine to create a BitMap from python data.
315n/a#
316n/aBitMap_body = """
317n/aBitMap *ptr;
318n/aPyObject *source;
319n/aRect bounds;
320n/aint rowbytes;
321n/achar *data;
322n/a
323n/aif ( !PyArg_ParseTuple(_args, "O!iO&", &PyString_Type, &source, &rowbytes, PyMac_GetRect,
324n/a &bounds) )
325n/a return NULL;
326n/adata = PyString_AsString(source);
327n/aif ((ptr=(BitMap *)malloc(sizeof(BitMap))) == NULL )
328n/a return PyErr_NoMemory();
329n/aptr->baseAddr = (Ptr)data;
330n/aptr->rowBytes = rowbytes;
331n/aptr->bounds = bounds;
332n/aif ( (_res = BMObj_New(ptr)) == NULL ) {
333n/a free(ptr);
334n/a return NULL;
335n/a}
336n/a((BitMapObject *)_res)->referred_object = source;
337n/aPy_INCREF(source);
338n/a((BitMapObject *)_res)->referred_bitmap = ptr;
339n/areturn _res;
340n/a"""
341n/a
342n/af = ManualGenerator("BitMap", BitMap_body)
343n/af.docstring = lambda: """Take (string, int, Rect) argument and create BitMap"""
344n/amodule.add(f)
345n/a
346n/a#
347n/a# And again, for turning a correctly-formatted structure into the object
348n/a#
349n/aRawBitMap_body = """
350n/aBitMap *ptr;
351n/aPyObject *source;
352n/a
353n/aif ( !PyArg_ParseTuple(_args, "O!", &PyString_Type, &source) )
354n/a return NULL;
355n/aif ( PyString_Size(source) != sizeof(BitMap) && PyString_Size(source) != sizeof(PixMap) ) {
356n/a PyErr_Format(PyExc_TypeError,
357n/a "Argument size was %d, should be %d (sizeof BitMap) or %d (sizeof PixMap)",
358n/a PyString_Size(source), sizeof(BitMap), sizeof(PixMap));
359n/a return NULL;
360n/a}
361n/aptr = (BitMapPtr)PyString_AsString(source);
362n/aif ( (_res = BMObj_New(ptr)) == NULL ) {
363n/a return NULL;
364n/a}
365n/a((BitMapObject *)_res)->referred_object = source;
366n/aPy_INCREF(source);
367n/areturn _res;
368n/a"""
369n/a
370n/af = ManualGenerator("RawBitMap", RawBitMap_body)
371n/af.docstring = lambda: """Take string BitMap and turn into BitMap object"""
372n/amodule.add(f)
373n/a
374n/a# generate output (open the output file as late as possible)
375n/aSetOutputFileName(OUTPUTFILE)
376n/amodule.generate()
377n/aSetOutputFile() # Close it