paul@torch.UUCP (Paul Andrews) (09/12/88)
Here's a somewhat primitive program to display one of Marks raytraced pic's on an X display. There's no makefile, but then there's only one source file. # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # readme # pictoximage.c # This archive created: Mon Sep 12 11:09:47 1988 cat << \SHAR_EOF > readme This is a first bash at getting one of Mark V's ray traced pic files up onto an X screen. It reads the data and converts it into an 8 bit ZPixmap which it then displays on the screen. It also creates a palette for this. It doesn't: 1) Save this pixmap anywhere for later use. 2) Use the palette correctly. 3) Do any dithering. 4) Cope with anything other than an 8 bit pseudo colour display. 5) Cope with funny word/byte/bit orderings. But it does work (on our Sun 3/60C). Hope you find it worth it. Paul. SHAR_EOF cat << \SHAR_EOF > pictoximage.c /***************************************************************************** * * * Read a pic file and display it on an 8 bit X display. * * * * Paul Andrews, 1988. * * * * Copy and do with what you will, but I accept no responsibility for that. * * * *****************************************************************************/ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> int w,h; /* Width and height of image */ unsigned char *data; /* The image data itself */ /* * Read the pic file in on stdin, display it on an X screen. We take one * argument, this will be used as the value for h and will override that * stored in the pic file. This allows you to display a partially completed * image if you get impatient (like me). */ main (argc, argv) int argc; char *argv[]; { int x,y; unsigned char r,g,b; Display *screen; Window window; XEvent event; XImage *image; Colormap colours; XColor colval; scanf("%d %d",&w,&h); if (argc == 2) sscanf (argv[1], "%d", &h); data = (unsigned char*) malloc(w*h); r = getchar(); /* Scrap the newline */ /* * Convert RGB triplets into a packed byte, R=3 bits, G=3 bits, B=2 bits. * This is ZPixmap format. */ for (y=0; y<h; y++) { for (x=0; x<w; x++) { r = getchar(); g = getchar(); b = getchar(); *(data+y*w+x) = (r & 0xe0) | (g >> 3 & 0x1c) | (b >> 6 & 0x3); } } /* Now loads of X stuff. */ screen = XOpenDisplay (NULL); window = XCreateSimpleWindow (screen, DefaultRootWindow(screen), 0, 0, w, h, 1, 0, 0); /* Create a 256 colour palette */ colours = XCreateColormap (screen, window, DefaultVisual(screen, DefaultScreen(screen)), AllocAll); colval.flags = DoRed | DoGreen | DoBlue; for (x=0; x<256; x++) { colval.pixel = x; colval.red = (x & 0xe0) << 8; colval.green = (x & 0x1c) << 11; colval.blue = (x & 3) << 14; XStoreColor (screen, colours, &colval); } XMapWindow (screen, window); XSetWindowColormap (screen, window, colours); /* This is wrong. We shouldn't have to install the colour map. The window manager should do it. So whats going wrong? */ XInstallColormap (screen, colours); XSelectInput (screen, window, ExposureMask); image = XCreateImage (screen, DefaultVisual(screen, DefaultScreen(screen)), 8, ZPixmap, 0, data, w, h, 8, 0); while (1) { XNextEvent (screen, &event); if (event.type == Expose) XPutImage (screen, window, DefaultGC (screen, DefaultScreen(screen)), image, 0, 0, 0, 0, w, h); } } SHAR_EOF # End of shell archive exit 0