DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T g

⟦6f07f52a5⟧ TextFile

    Length: 6833 (0x1ab1)
    Types: TextFile
    Names: »graphics.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/X/Xmandel/graphics.c« 

TextFile

#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <math.h>
#include <signal.h>
#include "graphics.h"

#define NMAX 256
#define SCFAC 5
#define FLOOR2(x) ((x)/2)
#define CEIL2(x)  ((x) - (x)/2)

unsigned long pixellist[NMAX];

char *malloc();

int ntx,nrx,nty,nry;
int nmaxt,nmint,numpix;
int nomin = 1;
int nomax = NMAX-1;
char *display = NULL;
double xin = 0;
double yin = 0;
double scale = 1;
int rsiz = 12;
double dx,dy;
double pscale;
int restartflag;
int (*func)();
char *name = "XGraphics";

Rectangle root;

int rscreen;
Display *dpy;
Colormap cid;
Window rwindow,nwindow;
Pixmap pixmap;
Pixmap npixmap;
GC gc;
XGCValues gcv;

graphics(display0,xin0,yin0,scale0,res,f)
char *display0;
double xin0,yin0,scale0;
int res,(*f)();
{
	display = display0;
	xin = xin0;
	yin = yin0;
	scale = scale0;
	func = f;
	rsiz = res;

	root.x = root.y = 0;
	root.w = root.h = rsiz;
	rectinit(&root);
	init();
	doplot();

	finish();
}

init()
{
	int sigfin();
	int i,width,height;
	XWindowAttributes war;
	XSetWindowAttributes setwa;
	XColor sdr;

	signal(SIGINT, sigfin);
	signal(SIGQUIT, sigfin);
	signal(SIGTERM, sigfin);

        if ((dpy = XOpenDisplay(display)) == 0) {
                fprintf(stderr, "Graphics: Can't open display \"%s\"\n",
                    XDisplayName(display));
                exit(1);
        }

	rwindow = XDefaultRootWindow(dpy);
	pointerinit();

	rscreen = XDefaultScreen(dpy);

	XGetWindowAttributes(dpy,rwindow,&war);
	width = war.width;
	height = war.height;
	nrx = ceil(((double) width)/rsiz);
	ntx = nrx*rsiz;
	nry = ceil(((double) height)/rsiz);
	nty = nry*rsiz;

	nwindow = XCreateWindow(dpy, rwindow, 0, 0,
		(unsigned int) nrx, (unsigned int) nry, 0, 0,
		CopyFromParent, CopyFromParent, 0L, &setwa);
	 /* Give the window a name */
	XChangeProperty(dpy, nwindow, XA_WM_NAME, XA_STRING, 8,
		PropModeReplace, name, strlen(name));
	XMapWindow(dpy,nwindow);
	XMoveWindow(dpy,nwindow,0,0);

	cid = XDefaultColormap(dpy,rscreen);

	numpix = 1<<war.depth;
	pixellist[0] = 1;
	for (i=1;i<NMAX;i++){
		pixellist[i] = (i + 1) % numpix;
	}

	pixmap = XCreatePixmap(dpy,rwindow,ntx,nty,war.depth);
	if (pixmap==0){
		fprintf(stderr, "Graphics: Unable to create Pixmap");
		exit(1);
	}
	npixmap = XCreatePixmap(dpy,nwindow,nrx,nry,war.depth);
	if (npixmap==0){
		fprintf(stderr, "Graphics: Unable to create Pixmap");
		exit(1);
	}
	gc = XCreateGC(dpy,pixmap,0L,&gcv);
}

initpix()
{
	int i;

	pixellist[0] = 1;
	nomax = nmaxt;
	nomin = nmint;
	for (i=1;i<NMAX;i++){
		pixellist[i] = (2 + ((i - nomin)*(numpix-2)) /
					(nomax-nomin)) % numpix;
	}
}

pointerinit()
{
	long event_mask;
	int mkpm;
	XModifierKeymap *modmap;
	KeyCode *mkdptr;

	modmap = XGetModifierMapping(dpy);
	mkpm = modmap->max_keypermod;
	mkdptr = modmap->modifiermap;
	mkdptr[4*mkpm] = (char) 26; /* This is the keycode for the Alt key,
					and Mod2 has position 4 */
	XSetModifierMapping(dpy,modmap);

	event_mask = ButtonPressMask;
	XGrabButton(dpy,AnyButton,Mod2Mask,rwindow,True,event_mask,
		GrabModeAsync,GrabModeAsync,None,0);
}

int rescale(n)
int n;
{
	int i;

	i = abs(n)%NMAX;
	if (i>nmaxt) nmaxt = i;
	if ((i>0)&&(i<nmint)) nmint = i;
	return i;
}

plotpt(i,j,w,h,n)
int i,j,w,h,n;
{
	XSetForeground(dpy,gc,pixellist[n]);
	XFillRectangle(dpy,pixmap,gc,i,j,w,h);
	if ((i%rsiz==0)&&(j%rsiz==0))
			XDrawPoint(dpy,npixmap,gc,i/rsiz,j/rsiz);
}

plotall()
{
	XSetWindowBackgroundPixmap(dpy,rwindow,pixmap);
	XSetWindowBackgroundPixmap(dpy,nwindow,npixmap);
	XClearWindow(dpy,rwindow);
	XClearWindow(dpy,nwindow);
	XFlush(dpy);
	checkevent();
}

checkevent()
{
	long event_mask;
	XEvent evr;
	XButtonEvent xbevr;
	char *args = NULL;
	Bool checkb2();

	event_mask = ButtonPressMask;
	if (XCheckIfEvent(dpy,&evr,checkb2,args)== True){
		restartflag = 1;
		xbevr = evr.xbutton;
		xin += (-(nrx+1)*rsiz + 2*xbevr.x)/(pscale*rsiz);
		yin += (-(nry+1)*rsiz + 2*xbevr.y)/(pscale*rsiz);
	}
	while(XCheckMaskEvent(dpy,event_mask,&evr)==True){
		restartflag = 1;
		xbevr = evr.xbutton;
		if (xbevr.button == Button1) scale /= SCFAC;
		if (xbevr.button == Button3) scale *= SCFAC;
	}
	printf("xin,yin: %g, %g, scale: %g\n",xin,yin,scale);
}

Bool checkb2(display,event,args)
Display *display;
XEvent *event;
char *args;
{
	XButtonEvent xbevr;
	xbevr = event->xbutton;
	if ((xbevr.button == Button2)&&
		(event->type==ButtonPress)) return True;
	else return False;
}

Rectangle *newrect()
{
	Rectangle *t;

	t = (Rectangle *) malloc(sizeof(Rectangle));
	return t;
}

rectinit(rptr)
Rectangle *rptr;
{
	Rectangle *nptr;
	int w,h;

	w  = rptr->w;
	h = rptr->h;

	if ((h==1)&&(w==1)) rptr->ul = NULL;
	else {
		nptr = rptr->ul = newrect();
		nptr->x = rptr->x;
		nptr->y = rptr->y;
		nptr->w = CEIL2(w);
		nptr->h = CEIL2(h);
		rectinit(nptr);
	}
	if (w==1) rptr->ur = NULL;
	else {

		nptr = rptr->ur = newrect();
		nptr->x = rptr->x + CEIL2(w);
		nptr->y = rptr->y;
		nptr->w = FLOOR2(w);
		nptr->h = CEIL2(h);
		rectinit(nptr);
	}
	if (h == 1) rptr->ll = NULL;
	else {
		nptr = rptr->ll = newrect();
		nptr->x = rptr->x;
		nptr->y = rptr->y + CEIL2(h);
		nptr->w = CEIL2(w);
		nptr->h = FLOOR2(h);
		rectinit(nptr);
	}
	if ((h == 1)||(w == 1)) rptr->lr = NULL;
	else {
		nptr = rptr->lr = newrect();
		nptr->x = rptr->x + CEIL2(w);
		nptr->y = rptr->y + CEIL2(h);
		nptr->w = FLOOR2(w);
		nptr->h = FLOOR2(h);
		rectinit(nptr);
	}
}

doplot()
{
	int dographics();
	int l,maxl;

	maxl = 0;
	l = 1;
	while (l<rsiz){
		l *=2;
		maxl++;
	}
restart:
	
	restartflag = 0;
	pscale = nrx*scale;
	dx = 2/(pscale);
	dy = 2/(pscale);
	nmaxt = 0;
	nmint = NMAX;
	if (dographics(&root,0)==0) goto restart;
	initpix();
	for (l=0;l<=maxl;l++){
		if (dographics(&root,l)==0) goto restart;
	}
}

int dographics(rptr,level)
Rectangle *rptr;
int level;
{
	int i,j,ii,jj,n;
	double xstart,ystart,x,y;

	if (rptr==NULL) return 1;
	if (level==0){
	    ii = rptr->x;
	    jj = rptr->y;
	    xstart = xin - nrx/pscale + (-rsiz+2*ii)/(pscale*rsiz);
	    ystart = yin - nry/pscale + (-rsiz + 2*jj)/(pscale*rsiz);
	    for (x = xstart,i=0;i<nrx;i++,x += dx)
	 	for (y = ystart, j=0;j<nry;j++,y += dy){
			n = rescale((*func)(x,y));
			plotpt(rsiz*i+ii,rsiz*j+jj,rptr->w,rptr->h,n);
		}
	    plotall();
	    if (restartflag==1) return(0);
	    return(1);
	}
	if (dographics2(rptr,level)==0) return 0;
	return 1;
}

int dographics2(rptr,level)
Rectangle *rptr;
int level;
{
	if (rptr==NULL) return 1;
	if (dographics2(rptr->ul,level-1)==0) return 0;
	if (dographics(rptr->ur,level-1)==0) return 0;
	if (dographics(rptr->ll,level-1)==0) return 0;
	if (dographics(rptr->lr,level-1)==0) return 0;
	return 1;
}

finish()
{
	XFreeGC(dpy,gc);
	XFreePixmap(dpy,pixmap);
	XFreePixmap(dpy,npixmap);
	XDestroyWindow(dpy,nwindow);
}

sigfin(sig,code,scp)
int sig,code;
struct sigcontext *scp;
{
	finish();
	exit(sig);
}