jonnyg@ROVER.UMD.EDU (Jon Greenblatt) (04/09/88)
I had a hack attack tonight and thought this program would be usefull. This program, xpbm.c, takes a file in pbm (Portable bitmap format) and displays it on a X11 console. This is an example of a minimum X window application but it works well. To compile: cc -O xpbm.c -o xpbm -lX I felt there was now good way to directly display pbm files on X11 when the file is too big for the X Window bitmap program. Well here it is: --------------------------------Snip here------------------------------------- /* * xpbm.c: Reads a Portable bitmap file and displays it on an X11 console. * This program is free free free. * Written by Jonathan Greenblatt (jonnyg@rover.umd.edu) All rights resevered. * This is a very simple program and uses a minimum of resources. * Someone may like to add some resource processing if they find this useful. */ #include <stdio.h> #include <Xlib.h> #include <Xutil.h> Display *BsDpy; Window BsWnd; #define MemorySize 250 Pixmap BsPix; int xs, ys, xh, yh; init() { BsDpy = XOpenDisplay(""); /* Open the default display */ BsWnd = XCreateSimpleWindow(BsDpy,DefaultRootWindow(BsDpy),16,16,16,16,1,WhitePixel(BsDpy,DefaultScreen(BsDpy)),BlackPixel(BsDpy,DefaultScreen(BsDpy))); XStoreName(BsDpy,BsWnd,"Bitmap Show"); XPending(BsDpy); XSelectInput(BsDpy,BsWnd,ExposureMask | SubstructureRedirectMask); } show() { XEvent BsEvent; XSizeHints BsHints; /* Put the picture in the background! */ XSetWindowBackgroundPixmap(BsDpy,BsWnd,BsPix); BsHints.flags = PPosition | PSize | USSize; BsHints.x = 0; BsHints.y = 0; BsHints.width = xs; BsHints.height = ys; XSetNormalHints(BsDpy,BsWnd,&BsHints); XPending(BsDpy); XSelectInput(BsDpy,BsWnd,StructureNotifyMask); XMapRaised(BsDpy,BsWnd); XPending(BsDpy); do { XNextEvent(BsDpy,&BsEvent); } while (BsEvent.type != MapNotify); } /* Bits ! */ char xtab[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; readbits(fname) char *fname; { FILE *f; char *buff, *malloc(); register unsigned int i, j, c; int bsize, lsize; if (fname == NULL) f = stdin; else f = fopen(fname,"r"); if (f == NULL) exit(1); fscanf(f,"%d %d\n",&xs,&ys); lsize = (xs + 7) >> 3; buff = malloc(bsize = lsize * ys); if (buff == NULL) exit(1); for (i = 0; i < bsize; i++) buff[i] = 0; for (j = 0; (j < ys) && !feof(f); j++) { register char *buf = &buff[lsize*j]; for (i = 0; (i < xs) && !feof(f); i++) { do { c = fgetc(f); } while (c != EOF && c != '1' && c != '0'); if (c != '1') { buf[i >> 3] |= xtab[i & 7]; } } } if (fname != NULL) fclose(f); BsPix = XCreateBitmapFromData(BsDpy, BsWnd, buff, xs, ys); free(buff); } waitbutton() { XEvent BsEvent; long eventmask; eventmask = ButtonPressMask; XPending(BsDpy); XSelectInput(BsDpy,BsWnd,eventmask); while (1) { XNextEvent(BsDpy,&BsEvent); switch (BsEvent.type) { case ButtonPress: return; default: break; } } } main(argc,argv) char *argv[]; { char *fname; if (argc < 2) fname = NULL; else fname = argv[1]; init(); readbits(fname); show(); waitbutton(); XCloseDisplay(BsDpy); }