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