ยปCore Development>Code coverage>RISCOS/Modules/drawfmodule.c

Python code coverage for RISCOS/Modules/drawfmodule.c

#countcontent
1n/a/* drawf DrawFile functions */
2n/a
3n/a#include "oslib/os.h"
4n/a#include "oslib/osfile.h"
5n/a#include "oslib/drawfile.h"
6n/a#include "Python.h"
7n/a
8n/a#include <limits.h>
9n/a
10n/a#define PyDrawF_Check(op) ((op)->ob_type == &PyDrawFType)
11n/a#define HDRSIZE 40
12n/a#define GRPHDRSIZE 36
13n/a#define DRAWTYPE 0xaff
14n/a#define NEXT(d) ((drawfile_object*)((char*)(d)+(d)->size))
15n/a
16n/atypedef struct
17n/a{ PyObject_HEAD
18n/a drawfile_diagram *drawf;
19n/a int size; /*length in bytes*/
20n/a int nobjs; /* no of objects */
21n/a} PyDrawFObject;
22n/a
23n/atypedef struct dheader
24n/a{ char tag [4];
25n/a int major_version;
26n/a int minor_version;
27n/a char source [12];
28n/a os_box bbox;
29n/a} dheader;
30n/a
31n/astatic PyObject *DrawFError; /* Exception drawf.error */
32n/astatic os_error *e;
33n/astatic PyTypeObject PyDrawFType;
34n/a
35n/astatic dheader header=
36n/a{ {'D','r','a','w'},
37n/a 201,0,
38n/a {'P','y','t','h','o','n',' ',' ',' ',' ',' ',' '},
39n/a {INT_MAX,INT_MAX,INT_MIN,INT_MIN}
40n/a};
41n/a
42n/astatic PyObject *drawf_oserror(void)
43n/a{ PyErr_SetString(DrawFError,e->errmess);
44n/a return 0;
45n/a}
46n/a
47n/astatic PyObject *drawf_error(char *s)
48n/a{ PyErr_SetString(DrawFError,s);
49n/a return 0;
50n/a}
51n/a
52n/a/* DrawFile commands */
53n/a
54n/astatic void countobjs(PyDrawFObject *pd)
55n/a{ int k=0,q;
56n/a drawfile_diagram *dd=pd->drawf;
57n/a drawfile_object *d=dd->objects;
58n/a char *end=(char*)dd+pd->size;
59n/a pd->nobjs=-1;
60n/a while((char*)d<end)
61n/a { k++;
62n/a q=d->size;
63n/a if(q<=0||q&3) return ;
64n/a d=NEXT(d);
65n/a }
66n/a if ((char*)d==end) pd->nobjs=k;
67n/a}
68n/a
69n/astatic drawfile_object *findobj(PyDrawFObject *pd,Py_ssize_t n)
70n/a{ drawfile_diagram *dd=pd->drawf;
71n/a drawfile_object *d=dd->objects;
72n/a for(;n>0;n--) d=NEXT(d);
73n/a return d;
74n/a}
75n/a
76n/astatic PyDrawFObject* new(int size)
77n/a{ PyDrawFObject *b=PyObject_NEW(PyDrawFObject,&PyDrawFType);
78n/a if(!b) return NULL;
79n/a size+=HDRSIZE;
80n/a b->drawf=malloc(size);
81n/a if(!b->drawf)
82n/a { Py_DECREF(b);
83n/a return (PyDrawFObject*)PyErr_NoMemory();
84n/a }
85n/a b->size=size;
86n/a return b;
87n/a}
88n/a
89n/astatic void extend(os_box *b,os_box *c)
90n/a{ if(b->x0>c->x0) b->x0=c->x0;
91n/a if(b->y0>c->y0) b->y0=c->y0;
92n/a if(b->x1<c->x1) b->x1=c->x1;
93n/a if(b->y1<c->y1) b->y1=c->y1;
94n/a}
95n/a
96n/astatic PyObject *DrawF_New(PyObject *self,PyObject *args)
97n/a{ PyDrawFObject *b;
98n/a if(!PyArg_ParseTuple(args,"")) return NULL;
99n/a b=new(0);
100n/a if(!b) return NULL;
101n/a *((dheader*)b->drawf)=header;
102n/a b->nobjs=0;
103n/a return (PyObject *)b;
104n/a}
105n/a
106n/astatic PyObject *DrawF_Load(PyObject *self,PyObject *args)
107n/a{ int size;
108n/a char *fname;
109n/a PyDrawFObject *b;
110n/a fileswitch_object_type ot;
111n/a if(!PyArg_ParseTuple(args,"s",&fname)) return NULL;
112n/a e=xosfile_read_no_path(fname,&ot,0,0,&size,0);
113n/a if(e) return drawf_oserror();
114n/a size-=HDRSIZE;
115n/a if(ot!=osfile_IS_FILE||size<0||size&3) return drawf_error("Bad draw file");
116n/a b=new(size);
117n/a if(!b) return NULL;
118n/a e=xosfile_load_stamped_no_path(fname,(byte*)(b->drawf),0,0,0,0,0);
119n/a if(e)
120n/a { Py_DECREF(b);
121n/a return drawf_oserror();
122n/a }
123n/a countobjs(b);
124n/a if(b->nobjs>=0) return (PyObject *)b;
125n/a Py_DECREF(b);
126n/a return drawf_error("Corrupt draw file");
127n/a}
128n/a
129n/a
130n/astatic PyObject *DrawF_Save(PyDrawFObject *self,PyObject *arg)
131n/a{ char *fname;
132n/a if(!PyArg_ParseTuple(arg,"s",&fname)) return NULL;
133n/a e=xosfile_save_stamped(fname,DRAWTYPE,
134n/a (byte*)(self->drawf),(byte*)(self->drawf)+self->size);
135n/a if (e) return drawf_oserror();
136n/a Py_INCREF(Py_None);return Py_None;
137n/a}
138n/a
139n/astatic PyObject *DrawF_Render(PyDrawFObject *self,PyObject *arg)
140n/a{ int flags,trans,clip,flat;
141n/a if(!PyArg_ParseTuple(arg,"iiii",&flags,&trans,&clip,&flat)) return NULL;
142n/a e=xdrawfile_render((drawfile_render_flags)flags,self->drawf,self->size,
143n/a (os_trfm*)trans,(os_box*)clip,flat);
144n/a if(e) return drawf_oserror();
145n/a Py_INCREF(Py_None);return Py_None;
146n/a}
147n/a
148n/astatic PyObject *DrawF_Path(PyDrawFObject *self,PyObject *arg)
149n/a{ PyObject *pl;
150n/a PyObject *dp=0;
151n/a os_colour fill;
152n/a os_colour outline;
153n/a int width,start=0;
154n/a drawfile_path_style style;
155n/a int size=40;
156n/a int n,i,element_count;
157n/a drawfile_diagram *diag;
158n/a drawfile_object *dobj;
159n/a drawfile_path *dpath;
160n/a draw_path *thepath;
161n/a draw_line_style line_style;
162n/a draw_dash_pattern *dash_pattern=0;
163n/a os_box *box;
164n/a long *pe;
165n/a if(!PyArg_ParseTuple(arg,"O!(iiii)|O!i",&PyList_Type,&pl,(int*)&fill,
166n/a (int*)&outline,&width,(int*)&style,&PyTuple_Type,&dp,&start)) return NULL;
167n/a if(dp)
168n/a { element_count=PyTuple_Size(dp);
169n/a size+=4*element_count+8;
170n/a style.flags|=drawfile_PATH_DASHED;
171n/a }
172n/a else style.flags&=~drawfile_PATH_DASHED;
173n/a n=PyList_Size(pl);
174n/a size+=4*n+8;
175n/a for(i=0;i<n;i++) if(!PyInt_Check(PyList_GetItem(pl,i))) size+=4;
176n/a diag=realloc(self->drawf,self->size+size);
177n/a if(!diag) return PyErr_NoMemory();
178n/a self->drawf=diag;
179n/a dobj=(drawfile_object*)((char*)diag+self->size);
180n/a dobj->type=drawfile_TYPE_PATH;
181n/a dobj->size=size;
182n/a dpath=&dobj->data.path;
183n/a self->size+=size;
184n/a self->nobjs++;
185n/a box=&dpath->bbox;
186n/a dpath->fill=fill;dpath->outline=outline;
187n/a dpath->width=width;dpath->style=style;
188n/a pe=(long*)&(dpath->path);
189n/a if(dp)
190n/a { dash_pattern=&(((drawfile_path_with_pattern*)dpath)->pattern);
191n/a dash_pattern->start=start;
192n/a dash_pattern->element_count=element_count;
193n/a for(i=0;i<element_count;i++)
194n/a { dash_pattern->elements[i]=(int)PyInt_AsLong(PyTuple_GetItem(dp,i));
195n/a }
196n/a pe+=element_count+2;
197n/a }
198n/a thepath=(draw_path*)pe;
199n/a *pe++=draw_MOVE_TO;
200n/a for(i=0;i<n;i++)
201n/a { PyObject *p=PyList_GetItem(pl,i);
202n/a if(PyInt_Check(p))
203n/a *pe++=PyInt_AsLong(p);
204n/a else
205n/a {
206n/a *pe++=PyInt_AsLong(PyTuple_GetItem(p,0));
207n/a *pe++=PyInt_AsLong(PyTuple_GetItem(p,1));
208n/a }
209n/a }
210n/a *pe=draw_END_PATH;
211n/a line_style.join_style=style.flags&3;
212n/a line_style.end_cap_style=(style.flags&3)>>2;
213n/a line_style.start_cap_style=(style.flags&3)>>4;
214n/a line_style.reserved=0;
215n/a line_style.mitre_limit=10;
216n/a line_style.start_cap_width=style.cap_width;
217n/a line_style.end_cap_width=style.cap_width;
218n/a line_style.start_cap_length=style.cap_length;
219n/a line_style.end_cap_length=style.cap_length;
220n/a e=xdraw_process_path(thepath,0x70000000,0,0,width,&line_style,dash_pattern,
221n/a (draw_output_path)((char*)box+0x80000000),0);
222n/a if(e) return drawf_oserror();
223n/a
224n/a /* draw_process_path seems to have a bug:
225n/a If the bounding box size is zero, it returns 0x7FFFFFFF, ..., 0x80000000 instead of the
226n/a correct size. */
227n/a if (box->x0==0x7FFFFFFF)
228n/a {
229n/a /* path has zero extension, so forget it; it would be invisible anyway */
230n/a self->size-=size;
231n/a self->nobjs--;
232n/a diag=realloc(self->drawf,self->size);
233n/a if(!diag) return PyErr_NoMemory();
234n/a self->drawf=diag;
235n/a }
236n/a else
237n/a extend(&(diag->bbox),box);
238n/a Py_INCREF(Py_None);return Py_None;
239n/a}
240n/a
241n/astatic PyObject *DrawF_Text(PyDrawFObject *self,PyObject *arg)
242n/a{ os_colour fill,bg_hint;
243n/a drawfile_text_style style;
244n/a int xsize,ysize,x,y;
245n/a int size,len;
246n/a char *text;
247n/a drawfile_diagram *diag;
248n/a drawfile_object *dobj;
249n/a drawfile_text *dtext;
250n/a os_box *box;
251n/a if(!PyArg_ParseTuple(arg,"(ii)s(iiiii)",&x,&y,&text,
252n/a (int*)&fill,(int*)&bg_hint,(int*)&style,&xsize,&ysize)) return NULL;
253n/a len=strlen(text);
254n/a size=((len+4)&(~3))+52;
255n/a diag=realloc(self->drawf,self->size+size);
256n/a if(!diag) return PyErr_NoMemory();
257n/a self->drawf=diag;
258n/a dobj=(drawfile_object*)((char*)diag+self->size);
259n/a dobj->type=drawfile_TYPE_TEXT;
260n/a dobj->size=size;
261n/a dtext=&dobj->data.text;
262n/a self->size+=size;
263n/a self->nobjs++;
264n/a dtext->fill=fill;
265n/a dtext->bg_hint=bg_hint;
266n/a dtext->style=style;
267n/a dtext->xsize=xsize;
268n/a dtext->ysize=ysize;
269n/a dtext->base.x=x;
270n/a dtext->base.y=y;
271n/a memset(dtext->text,0,(len+4)&(~3));
272n/a sprintf(dtext->text,"%s",text);
273n/a box=&(dtext->bbox);
274n/a box->x0=x;box->y0=y;box->x1=x+len*xsize;box->y1=y+ysize;
275n/a extend(&(diag->bbox),box);
276n/a Py_INCREF(Py_None);return Py_None;
277n/a}
278n/a
279n/astatic PyObject *DrawF_TText(PyDrawFObject *self,PyObject *arg)
280n/a{ os_colour fill,bg_hint;
281n/a drawfile_text_style style;
282n/a int xsize,ysize,x,y;
283n/a int t1,t2,t3,t4,t5,t6;
284n/a int size,len;
285n/a char *text;
286n/a drawfile_diagram *diag;
287n/a drawfile_object *dobj;
288n/a drawfile_trfm_text *dtext;
289n/a os_box *box;
290n/a t1=1<<16;t2=0;
291n/a t3=0;t4=1<<16;
292n/a t5=t6=0;
293n/a if(!PyArg_ParseTuple(arg,"(ii)s(iiiii)|(iiiiii)",&x,&y,&text,
294n/a (int*)&fill,(int*)&bg_hint,(int*)&style,&xsize,&ysize,&t1,&t2,&t3,&t4,&t5,&t6)) return NULL;
295n/a len=strlen(text);
296n/a size=((len+4)&(~3))+52+28;
297n/a diag=realloc(self->drawf,self->size+size);
298n/a if(!diag) return PyErr_NoMemory();
299n/a self->drawf=diag;
300n/a dobj=(drawfile_object*)((char*)diag+self->size);
301n/a dobj->type=drawfile_TYPE_TRFM_TEXT;
302n/a dobj->size=size;
303n/a dtext=&dobj->data.trfm_text;
304n/a self->size+=size;
305n/a self->nobjs++;
306n/a dtext->trfm.entries[0][0]=t1;
307n/a dtext->trfm.entries[0][1]=t2;
308n/a dtext->trfm.entries[1][0]=t3;
309n/a dtext->trfm.entries[1][1]=t4;
310n/a dtext->trfm.entries[2][0]=t5;
311n/a dtext->trfm.entries[2][1]=t6;
312n/a dtext->flags=0;
313n/a dtext->fill=fill;
314n/a dtext->bg_hint=bg_hint;
315n/a dtext->style=style;
316n/a dtext->xsize=xsize;
317n/a dtext->ysize=ysize;
318n/a dtext->base.x=x;
319n/a dtext->base.y=y;
320n/a memset(dtext->text,0,(len+4)&(~3));
321n/a sprintf(dtext->text,"%s",text);
322n/a box=&(dtext->bbox);
323n/a box->x0=x;box->y0=y;box->x1=x+len*xsize;box->y1=y+ysize;
324n/a extend(&(diag->bbox),box);
325n/a Py_INCREF(Py_None);return Py_None;
326n/a}
327n/a
328n/astatic PyObject *DrawF_FontTable(PyDrawFObject *self,PyObject *arg)
329n/a{ int size=8,n=0;
330n/a PyObject *d,*key,*value;
331n/a drawfile_diagram *diag;
332n/a drawfile_object *dobj;
333n/a char *dtable;
334n/a if(!PyArg_ParseTuple(arg,"O!",&PyDict_Type,&d)) return NULL;
335n/a while(PyDict_Next(d,&n,&key,&value))
336n/a { int m=PyString_Size(value);
337n/a if(m<0||!PyInt_Check(key)) return NULL;
338n/a size+=m+2;
339n/a }
340n/a size=(size+3)&(~3);
341n/a diag=realloc(self->drawf,self->size+size);
342n/a if(!diag) return PyErr_NoMemory();
343n/a self->drawf=diag;
344n/a dobj=(drawfile_object*)((char*)diag+self->size);
345n/a dobj->type=drawfile_TYPE_FONT_TABLE;
346n/a dobj->size=size;
347n/a dtable=(char*)(&dobj->data.font_table);
348n/a self->size+=size;
349n/a self->nobjs++;
350n/a memset(dtable,0,size-8);
351n/a n=0;
352n/a while(PyDict_Next(d,&n,&key,&value))
353n/a { int m=PyString_Size(value);
354n/a *dtable=(char)PyInt_AsLong(key);
355n/a strcpy(dtable+1,PyString_AsString(value));
356n/a dtable+=m+2;
357n/a }
358n/a Py_INCREF(Py_None);return Py_None;
359n/a}
360n/a
361n/astatic PyObject *DrawF_Group(PyDrawFObject *self,PyObject *arg)
362n/a{ int size,n;
363n/a PyDrawFObject *g;
364n/a char *name="";
365n/a drawfile_diagram *diag;
366n/a drawfile_object *dobj;
367n/a drawfile_group *dgroup;
368n/a if(!PyArg_ParseTuple(arg,"O!|s",&PyDrawFType,(PyObject*)&g,&name))
369n/a return NULL;
370n/a size=g->size-4;
371n/a diag=realloc(self->drawf,self->size+size);
372n/a if(!diag) return PyErr_NoMemory();
373n/a self->drawf=diag;
374n/a self->nobjs++;
375n/a dobj=(drawfile_object*)((char*)diag+self->size);
376n/a self->size+=size;
377n/a dobj->type=drawfile_TYPE_GROUP;
378n/a dobj->size=g->size-4;
379n/a dgroup=&dobj->data.group;
380n/a dgroup->bbox=g->drawf->bbox;
381n/a memset(dgroup->name,' ',12);
382n/a n=strlen(name);
383n/a if(n>12) n=12;
384n/a memcpy(dgroup->name,name,n);
385n/a memcpy((char*)dgroup->objects,(char*)g->drawf+40,g->size-40);
386n/a extend(&(diag->bbox),&(dgroup->bbox));
387n/a Py_INCREF(Py_None);return Py_None;
388n/a}
389n/a
390n/astatic PyObject *DrawF_Find(PyDrawFObject *self,PyObject *arg)
391n/a{ int x,y,n=0;
392n/a int r=-1;
393n/a drawfile_object *d;
394n/a if(!PyArg_ParseTuple(arg,"ii|i",&x,&y,&n)) return NULL;
395n/a if(n<self->nobjs&&n>=0)
396n/a { d=findobj(self,n);
397n/a while(n<self->nobjs)
398n/a { if(x>=d->data.text.bbox.x0&&x<=d->data.text.bbox.x1&&
399n/a y>=d->data.text.bbox.y0&&y<=d->data.text.bbox.y1) { r=n;break;}
400n/a n++;
401n/a d=NEXT(d);
402n/a }
403n/a }
404n/a return PyInt_FromLong(r);
405n/a}
406n/a
407n/a
408n/astatic PyObject *DrawF_Box(PyDrawFObject *self,PyObject *arg)
409n/a{ int n=-1;
410n/a os_box *box;
411n/a if(!PyArg_ParseTuple(arg,"|i",&n)) return NULL;
412n/a if(n>=self->nobjs|n<0) box=&(self->drawf->bbox);
413n/a else box=&(findobj(self,n)->data.text.bbox);
414n/a return Py_BuildValue("iiii",box->x0,box->y0,box->x1,box->y1);
415n/a}
416n/a
417n/astatic void SetBlock(drawfile_object *d,int size,int type,int offset,int value)
418n/a{ char *end=(char*)d+size;
419n/a printf("s%d t%d o%d v%d\n",size,type,offset,value);
420n/a for(;(char*)d<end;d=NEXT(d))
421n/a if(d->type==type) ((int*)(d))[offset]=value;
422n/a else if(d->type==drawfile_TYPE_GROUP)
423n/a SetBlock((drawfile_object*)&d->data.group.objects,
424n/a d->size,type,offset,value);
425n/a printf("SetBlock Done\n");
426n/a}
427n/a
428n/astatic PyObject *SetWord(PyDrawFObject *self,PyObject *arg,int type,int offset)
429n/a{ int n=PyTuple_Size(arg);
430n/a int m,value,q;
431n/a PyObject *par;
432n/a drawfile_object *e,*d=self->drawf->objects;
433n/a if(n==0) return drawf_error("Value Required");
434n/a par=PyTuple_GetItem(arg,0);
435n/a if(!PyInt_Check(par))
436n/a { PyErr_SetString(PyExc_TypeError,"Int Required");
437n/a return 0;
438n/a }
439n/a value=(int)PyInt_AsLong(par);
440n/a if(n==1) SetBlock(d,self->size-HDRSIZE,type,offset,value);
441n/a else
442n/a { for(m=1;m<n;m++)
443n/a { par=PyTuple_GetItem(arg,m);
444n/a if(!PyInt_Check(par))
445n/a { PyErr_SetString(PyExc_TypeError,"Int Required");
446n/a return 0;
447n/a }
448n/a q=(int)PyInt_AsLong(par);
449n/a if(q<0||q>=self->nobjs)
450n/a { PyErr_SetString(PyExc_ValueError,"Object out of range");
451n/a return 0;
452n/a }
453n/a e=d;
454n/a for(;q>0;q--) e=NEXT(e);
455n/a if(e->type==type)
456n/a { ((int*)(e))[offset]=value;
457n/a }
458n/a else if(e->type==drawfile_TYPE_GROUP)
459n/a SetBlock((drawfile_object*)&e->data.group.objects,
460n/a e->size-GRPHDRSIZE,type,offset,value);
461n/a }
462n/a }
463n/a Py_INCREF(Py_None);return Py_None;
464n/a}
465n/a
466n/astatic PyObject *DrawF_PathFill(PyDrawFObject *self,PyObject *arg)
467n/a{ return SetWord(self,arg,drawfile_TYPE_PATH,6);
468n/a}
469n/a
470n/astatic PyObject *DrawF_PathColour(PyDrawFObject *self,PyObject *arg)
471n/a{ return SetWord(self,arg,drawfile_TYPE_PATH,7);
472n/a}
473n/a
474n/astatic PyObject *DrawF_TextColour(PyDrawFObject *self,PyObject *arg)
475n/a{ return SetWord(self,arg,drawfile_TYPE_TEXT,6);
476n/a}
477n/a
478n/astatic PyObject *DrawF_TextBackground(PyDrawFObject *self,PyObject *arg)
479n/a{ return SetWord(self,arg,drawfile_TYPE_TEXT,7);
480n/a}
481n/a
482n/astatic struct PyMethodDef PyDrawF_Methods[]=
483n/a{
484n/a { "render",(PyCFunction)DrawF_Render,1},
485n/a { "save",(PyCFunction)DrawF_Save,1},
486n/a { "path",(PyCFunction)DrawF_Path,1},
487n/a { "text",(PyCFunction)DrawF_Text,1},
488n/a { "ttext",(PyCFunction)DrawF_TText,1},
489n/a { "fonttable",(PyCFunction)DrawF_FontTable,1},
490n/a { "group",(PyCFunction)DrawF_Group,1},
491n/a { "find",(PyCFunction)DrawF_Find,1},
492n/a { "box",(PyCFunction)DrawF_Box,1},
493n/a { "pathfill",(PyCFunction)DrawF_PathFill,1},
494n/a { "pathcolour",(PyCFunction)DrawF_PathColour,1},
495n/a { "textcolour",(PyCFunction)DrawF_TextColour,1},
496n/a { "textbackground",(PyCFunction)DrawF_TextBackground,1},
497n/a { NULL,NULL} /* sentinel */
498n/a};
499n/a
500n/astatic int drawf_len(PyDrawFObject *b)
501n/a{ return b->nobjs;
502n/a}
503n/a
504n/astatic PyObject *drawf_concat(PyDrawFObject *b,PyDrawFObject *c)
505n/a{ int size=b->size+c->size-2*HDRSIZE;
506n/a PyDrawFObject *p=new(size);
507n/a drawfile_diagram *dd;
508n/a drawfile_object *d;
509n/a int n;
510n/a if(!p) return NULL;
511n/a dd=p->drawf;
512n/a d=(drawfile_object*)((char*)dd+b->size);
513n/a memcpy((char*)dd,(char*)(b->drawf),b->size);
514n/a memcpy(d,(char*)(c->drawf)+HDRSIZE,c->size-HDRSIZE);
515n/a p->nobjs=b->nobjs+c->nobjs;
516n/a for(n=c->nobjs;n>0;n--)
517n/a { extend(&(dd->bbox),&(d->data.path.bbox));
518n/a d=NEXT(d);
519n/a }
520n/a return (PyObject*)p;
521n/a}
522n/a
523n/astatic PyObject *drawf_repeat(PyDrawFObject *b,Py_ssize_t i)
524n/a{ PyErr_SetString(PyExc_IndexError,"drawf repetition not implemented");
525n/a return NULL;
526n/a}
527n/a
528n/astatic PyObject *drawf_item(PyDrawFObject *b,Py_ssize_t i)
529n/a{ PyDrawFObject *c;
530n/a Py_ssize_t size;
531n/a drawfile_diagram *dd;
532n/a drawfile_object *d;
533n/a if(i<0||i>=b->nobjs)
534n/a { PyErr_SetString(PyExc_IndexError,"drawf index out of range");
535n/a return NULL;
536n/a }
537n/a d=findobj(b,i);
538n/a size=(char*)findobj(b,i+1)-(char*)d;
539n/a c=new(size);
540n/a if(!c) return NULL;
541n/a dd=c->drawf;
542n/a *((dheader*)dd)=header;
543n/a memcpy(dd->objects,d,size);
544n/a c->nobjs=1;
545n/a extend(&(dd->bbox),&(d->data.path.bbox));
546n/a return (PyObject*)c;
547n/a}
548n/a
549n/astatic PyObject *drawf_slice(PyDrawFObject *b,Py_ssize_t i,Py_ssize_t j)
550n/a{ PyDrawFObject *c;
551n/a Py_ssize_t size,n;
552n/a drawfile_diagram *dd;
553n/a drawfile_object *d;
554n/a if(i<0||j>b->nobjs)
555n/a { PyErr_SetString(PyExc_IndexError,"drawf index out of range");
556n/a return NULL;
557n/a }
558n/a d=findobj(b,i);
559n/a size=(char*)findobj(b,j)-(char*)d;
560n/a c=new(size);
561n/a if(!c) return NULL;
562n/a dd=c->drawf;
563n/a *((dheader*)dd)=header;
564n/a memcpy(dd->objects,d,size);
565n/a c->nobjs=j-i;
566n/a for(n=j-i;n>0;n--)
567n/a { extend(&(dd->bbox),&(d->data.path.bbox));
568n/a d=NEXT(d);
569n/a }
570n/a return (PyObject*)c;
571n/a}
572n/a
573n/astatic int drawf_ass_item(PyDrawFObject *b,Py_ssize_t i,PyObject *v)
574n/a{ PyErr_SetString(PyExc_IndexError,"drawf ass not implemented");
575n/a return NULL;
576n/a}
577n/a/*{ if(i<0||4*i>=b->length)
578n/a { PyErr_SetString(PyExc_IndexError,"drawf index out of range");
579n/a return -1;
580n/a }
581n/a if(!PyInt_Check(v))
582n/a { PyErr_SetString(PyExc_TypeError,"drawf item must be integer");
583n/a return -1;
584n/a }
585n/a ((long*)(b->drawf))[i]=PyInt_AsLong(v);
586n/a return 0;
587n/a}
588n/a*/
589n/a
590n/astatic int drawf_ass_slice(PyDrawFObject *b,Py_ssize_t i,Py_ssize_t j,PyObject *v)
591n/a{ PyErr_SetString(PyExc_IndexError,"drawf ass_slice not implemented");
592n/a return NULL;
593n/a}
594n/a
595n/astatic PySequenceMethods drawf_as_sequence=
596n/a{ (inquiry)drawf_len,
597n/a (binaryfunc)drawf_concat,
598n/a (ssizeargfunc)drawf_repeat,
599n/a (ssizeargfunc)drawf_item,
600n/a (ssizessizeargfunc)drawf_slice,
601n/a (ssizeobjargproc)drawf_ass_item,
602n/a (ssizessizeobjargproc)drawf_ass_slice,
603n/a};
604n/a
605n/astatic PyObject *PyDrawF_GetAttr(PyDrawFObject *s,char *name)
606n/a{
607n/a if (!strcmp(name, "size")) return PyInt_FromLong((long)s->size);
608n/a if (!strcmp(name, "start")) return PyInt_FromLong((long)s->drawf);
609n/a if (!strcmp(name, "__members__"))
610n/a { PyObject *list = PyList_New(2);
611n/a if (list)
612n/a { PyList_SetItem(list, 0, PyString_FromString("size"));
613n/a PyList_SetItem(list, 1, PyString_FromString("start"));
614n/a if (PyErr_Occurred()) { Py_DECREF(list);list = NULL;}
615n/a }
616n/a return list;
617n/a }
618n/a return Py_FindMethod(PyDrawF_Methods, (PyObject*) s,name);
619n/a}
620n/a
621n/astatic void PyDrawF_Dealloc(PyDrawFObject *b)
622n/a{
623n/a if (b->drawf)
624n/a ;
625n/a else
626n/a PyMem_DEL(b->drawf);
627n/a PyMem_DEL(b);
628n/a}
629n/a
630n/astatic PyTypeObject PyDrawFType=
631n/a{ PyObject_HEAD_INIT(&PyType_Type)
632n/a 0, /*ob_size*/
633n/a "drawf", /*tp_name*/
634n/a sizeof(PyDrawFObject), /*tp_size*/
635n/a 0, /*tp_itemsize*/
636n/a /* methods */
637n/a (destructor)PyDrawF_Dealloc, /*tp_dealloc*/
638n/a 0, /*tp_print*/
639n/a (getattrfunc)PyDrawF_GetAttr, /*tp_getattr*/
640n/a 0, /*tp_setattr*/
641n/a 0, /*tp_compare*/
642n/a 0, /*tp_repr*/
643n/a 0, /*tp_as_number*/
644n/a &drawf_as_sequence, /*tp_as_sequence*/
645n/a 0, /*tp_as_mapping*/
646n/a 0, /*tp_hash*/
647n/a};
648n/a
649n/a
650n/a
651n/astatic PyMethodDef DrawFMethods[]=
652n/a{
653n/a { "load",DrawF_Load,1},
654n/a { "new",DrawF_New,1},
655n/a { NULL,NULL} /* Sentinel */
656n/a};
657n/a
658n/avoid initdrawf()
659n/a{ PyObject *m, *d;
660n/a m = Py_InitModule("drawf", DrawFMethods);
661n/a d = PyModule_GetDict(m);
662n/a DrawFError=PyString_FromString("drawf.error");
663n/a PyDict_SetItemString(d,"error",DrawFError);
664n/a}