root@bu-cs.UUCP (Barry Shein) (08/23/85)
Ok, maybe I'm dense, but I had quite a bit (no pun intended) of trouble getting a plain old bitmap out to the screen. Of course, once I got it right it was 'obvious'. I thought I'd be a nice guy and share my minimal program from which any other attempt should be easy (I am not completely altruistic, I will be watching net.sources closely for all the nice public domain software that now starts to flow :-) This probably could be brought down a layer lower (ie. eliminate the tam calls winit(), wcreate() and wexit()) but I don't think that's necessary and likely in a real application you would be using that library anyhow. I guess the first thing I would add is a call to iswind() to insure we are on a bitmapped window at all. Note that I was able to panic my 7300 with absurd arguments to these routines, watch out for impossible srcwidth/width combinations. Someone at ATTIS development eagerly took the source to a program of mine which caused a panic so I suspect this problem will be fixed. One good point: tho the machine panic'd many times while I played it always came back up without a peep 3 minutes later, it seems very stable about these things! -Barry Shein, Boston University -----fold and cut---- #include <stdio.h> #include <sys/window.h> /* * An absolutely minimal program to fill your AT&T/UNIX/PC/7300 * screen with a bunch of vertical lines via use of direct * raster/bitmap operations. It took me quite a few tries to get * this right, maybe I can save you some trouble. * * cc this.c -ltam -ltermlib -o whatever * * Barry Shein, Boston University */ #define XMAX uw.uw_width /* in pixels */ #define YMAX uw.uw_height /* in pixels */ #define BPERBY 8 /* bits per byte */ #define XMAXB ((XMAX+(BPERBY-1))/BPERBY) /* in bytes */ #define YMAXB YMAX /* same as pixels */ #define U unsigned short /* type for args */ #define MAXROW 25 /* in 'chars' */ #define MAXCOL 80 /* in 'chars' */ main(argc,argv) int argc ; char **argv ; { register char *bmap,*cp ; /* will hold bitmap */ short int wd ; /* window fd */ register int i ; struct uwdata uw ; /* for ioctl */ winit() ; /* required ! */ /* * create a new window the size of the whole screen * with no border (see sys/window.h for other flags */ if((wd = wcreate(0,0,MAXROW,MAXCOL,NBORDER)) < 0) { perror("wcreate") ; wexit(1) ; } /* * get info about the window we just built, esp * height and width in pixels (XMAX,YMAX) */ if(ioctl(wd,WIOCGETD,&uw) < 0) { perror("WIOCGETD") ; wexit(1) ; } /* * allocate the bitmap for the entire window */ if((bmap = (char *)malloc(XMAXB*YMAXB)) == NULL) { perror("malloc") ; wexit(1) ; } /* * fill the bitmap up with stripes (07's) */ for(i=0,cp=bmap ; i < (XMAXB*YMAXB) ; i++,cp++) *cp = 07 ; /* * Ok, now dump it to the screen. */ if(wrastop(wd, (U *)bmap, /* the bitmap */ XMAXB, /* each row in bytes */ (U *)0,0, /* null: use screen for output */ 0,0, /* start at 0,0 in source */ 0,0, /* start at 0,0 in dst (screen) */ XMAX,YMAX, /* entire screen */ SRCSRC,DSTSRC, /* just replace dest with src */ (U *)0) /* no pattern being used */ < 0) { perror("wrastop") ; wexit(1) ; } wexit(0) ; }