]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add filled drawing methods and polygon methods.
authorGuido van Rossum <guido@python.org>
Tue, 16 Apr 1991 08:43:03 +0000 (08:43 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 16 Apr 1991 08:43:03 +0000 (08:43 +0000)
Sort some method lists.
Increase max #menus, and give more reasonable error message
if exceeded.
Remove window setfont method.

Modules/stdwinmodule.c

index 0a572e457e07bd2d9cc468070b0390cc9862b3f8..2050b5f072834e8dff45e2057e289d3d62ec89ba 100644 (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},