Add filled drawing methods and polygon methods.

Sort some method lists.
Increase max #menus, and give more reasonable error message
if exceeded.
Remove window setfont method.
This commit is contained in:
Guido van Rossum 1991-04-16 08:43:03 +00:00
parent a5900aa549
commit 27201069c0
1 changed files with 118 additions and 26 deletions

View File

@ -314,6 +314,18 @@ drawing_circle(dp, args)
INCREF(None);
return None;
}
static object *
drawing_fillcircle(dp, args)
drawingobject *dp;
object *args;
{
int a[3];
if (!getpointintarg(args, a))
return NULL;
wfillcircle(a[0], a[1], a[2]);
INCREF(None);
return None;
}
static object *
drawing_elarc(dp, args)
@ -328,6 +340,19 @@ drawing_elarc(dp, args)
return None;
}
static object *
drawing_fillelarc(dp, args)
drawingobject *dp;
object *args;
{
int a[6];
if (!get3pointarg(args, a))
return NULL;
wfillelarc(a[0], a[1], a[2], a[3], a[4], a[5]);
INCREF(None);
return None;
}
static object *
drawing_box(dp, args)
drawingobject *dp;
@ -360,6 +385,83 @@ drawing_invert(dp, args)
return drawing_generic(dp, args, winvert);
}
static POINT *
getpointsarray(v, psize)
object *v;
int *psize;
{
int n = -1;
object * (*getitem) PROTO((object *, int));
int i;
POINT *points;
if (v == NULL)
;
else if (is_listobject(v)) {
n = getlistsize(v);
getitem = getlistitem;
}
else if (is_tupleobject(v)) {
n = gettuplesize(v);
getitem = gettupleitem;
}
if (n <= 0) {
(void) err_badarg();
return NULL;
}
points = NEW(POINT, n);
if (points == NULL) {
(void) err_nomem();
return NULL;
}
for (i = 0; i < n; i++) {
object *w = (*getitem)(v, i);
int a[2];
if (!getpointarg(w, a)) {
DEL(points);
return NULL;
}
points[i].h = a[0];
points[i].v = a[1];
}
*psize = n;
return points;
}
static object *
drawing_poly(dp, args)
drawingobject *dp;
object *args;
{
int n;
POINT *points = getpointsarray(args, &n);
if (points == NULL)
return NULL;
wdrawpoly(n, points);
DEL(points);
INCREF(None);
return None;
}
static object *
drawing_fillpoly(dp, args)
drawingobject *dp;
object *args;
{
int n;
POINT *points = getpointsarray(args, &n);
if (points == NULL)
return NULL;
wfillpoly(n, points);
DEL(points);
INCREF(None);
return None;
}
static object *
drawing_cliprect(dp, args)
drawingobject *dp;
@ -563,10 +665,14 @@ static struct methodlist drawing_methods[] = {
{"cliprect", drawing_cliprect},
{"elarc", drawing_elarc},
{"erase", drawing_erase},
{"fillelarc", drawing_fillelarc},
{"fillcircle", drawing_fillcircle},
{"fillpoly", drawing_fillpoly},
{"invert", drawing_invert},
{"line", drawing_line},
{"noclip", drawing_noclip},
{"paint", drawing_paint},
{"poly", drawing_poly},
{"shade", drawing_shade},
{"text", drawing_text},
{"xorline", drawing_xorline},
@ -889,7 +995,7 @@ static typeobject Texttype = {
/* Menu objects */
#define IDOFFSET 10 /* Menu IDs we use start here */
#define MAXNMENU 20 /* Max #menus we allow */
#define MAXNMENU 200 /* Max #menus we allow */
static menuobject *menulist[MAXNMENU];
static menuobject *
@ -903,8 +1009,10 @@ newmenuobject(title)
if (menulist[id] == NULL)
break;
}
if (id >= MAXNMENU)
return (menuobject *) err_nomem();
if (id >= MAXNMENU) {
err_setstr(MemoryError, "creating too many menus");
return NULL;
}
menu = wmenucreate(id + IDOFFSET, getstringvalue(title));
if (menu == NULL)
return (menuobject *) err_nomem();
@ -1324,23 +1432,6 @@ window_setwincursor(self, args)
return None;
}
static object *
window_setfont(self, args)
windowobject *self;
object *args;
{
object *v;
TEXTATTR saveattr, winattr;
wgettextattr(&saveattr);
wgetwintextattr(self->w_win, &winattr);
wsettextattr(&winattr);
v = drawing_setfont((drawingobject *)NULL, args);
wgettextattr(&winattr);
wsetwintextattr(self->w_win, &winattr);
wsettextattr(&saveattr);
return v;
}
static struct methodlist window_methods[] = {
{"begindrawing",window_begindrawing},
{"change", window_change},
@ -1350,13 +1441,12 @@ static struct methodlist window_methods[] = {
{"getwinsize", window_getwinsize},
{"menucreate", window_menucreate},
{"scroll", window_scroll},
{"setwincursor",window_setwincursor},
{"setdocsize", window_setdocsize},
{"setfont", window_setfont},
{"setorigin", window_setorigin},
{"setselection",window_setselection},
{"settimer", window_settimer},
{"settitle", window_settitle},
{"setwincursor",window_setwincursor},
{"show", window_show},
{"textcreate", window_textcreate},
{NULL, NULL} /* sentinel */
@ -1425,8 +1515,10 @@ stdwin_open(sw, args)
if (windowlist[tag] == NULL)
break;
}
if (tag >= MAXNWIN)
return err_nomem();
if (tag >= MAXNWIN) {
err_setstr(MemoryError, "creating too many windows");
return NULL;
}
wp = NEWOBJ(windowobject, &Windowtype);
if (wp == NULL)
return NULL;
@ -1828,14 +1920,14 @@ static struct methodlist stdwin_methods[] = {
{"askfile", stdwin_askfile},
{"askstr", stdwin_askstr},
{"askync", stdwin_askync},
{"fetchcolor", stdwin_fetchcolor},
{"fleep", stdwin_fleep},
{"getselection", stdwin_getselection},
{"getcutbuffer", stdwin_getcutbuffer},
{"getdefscrollbars", stdwin_getdefscrollbars},
{"getdefwinpos", stdwin_getdefwinpos},
{"getdefwinsize", stdwin_getdefwinsize},
{"getevent", stdwin_getevent},
{"fetchcolor", stdwin_fetchcolor},
{"getselection", stdwin_getselection},
{"menucreate", stdwin_menucreate},
{"message", stdwin_message},
{"open", stdwin_open},