--- ray/src/rt/rview.c 1990/01/08 13:38:12 1.9 +++ ray/src/rt/rview.c 1991/05/03 16:12:34 1.14 @@ -45,7 +45,7 @@ char *amblist[128]; /* ambient include/exclude list int ambincl = -1; /* include == 1, exclude == 0 */ int greyscale = 0; /* map colors to brightness? */ -char *devname = "X"; /* output device name */ +char *devname = dev_default; /* output device name */ struct driver *dev = NULL; /* driver functions */ @@ -55,6 +55,10 @@ PNODE ptrunk; /* the base of our image */ RECT pframe; /* current frame boundaries */ int pdepth; /* image depth in current frame */ +static char *reserve_mem = NULL; /* pre-allocated reserve memory */ + +#define RESERVE_AMT 8192 /* amount of memory to reserve */ + #define CTRL(c) ('c'-'@') @@ -112,15 +116,15 @@ rview() /* do a view */ char buf[32]; devopen(devname); /* open device */ - newimage(); /* set up image */ + newimage(); /* start image (calls fillreserves) */ for ( ; ; ) { /* quit in command() */ - while (hresolu <= 1<comout)(buf); rsample(); @@ -129,14 +133,33 @@ rview() /* do a view */ (*dev->comout)(buf); refine(&ptrunk, 0, 0, hresolu, vresolu, pdepth+1); } - if (dev->inpready) + if (errno == ENOMEM) /* ran out of memory */ + freereserves(); + else if (dev->inpready) /* noticed some input */ command(": "); - else + else /* finished this depth */ pdepth++; } } +fillreserves() /* fill memory reserves */ +{ + if (reserve_mem != NULL) + return; + reserve_mem = malloc(RESERVE_AMT); +} + + +freereserves() /* free memory reserves */ +{ + if (reserve_mem == NULL) + return; + free(reserve_mem); + reserve_mem = NULL; +} + + command(prompt) /* get/execute command */ char *prompt; { @@ -145,8 +168,7 @@ char *prompt; char inpbuf[256]; char *args; again: - (*dev->comout)(prompt); /* get command + arguments */ - (*dev->comin)(inpbuf); + (*dev->comin)(inpbuf, prompt); /* get command + arguments */ for (args = inpbuf; *args && *args != ' '; args++) ; if (*args) *args++ = '\0'; @@ -269,9 +291,11 @@ rsample() /* sample the image */ xsiz = (((pframe.r-pframe.l)<kid == NULL) { /* subdivide */ if ((p->kid = newptree()) == NULL) - error(SYSTEM, "out of memory in refine"); + return(growth); /* * The following paint order can leave a black pixel * when redraw() is called in (*dev->paintr)().