/* SWILL Mandelbrot example */ #include "swill.h" #include "gd.h" /* Structure containing plot data */ typedef struct { double Xmin; double Xmax; double Ymin; double Ymax; int Tolerance; gdImagePtr im; } MandelData; /* Handler function that draws an image */ void mandel(FILE *f, MandelData *m) { double scalingx; double scalingy; double zr,zi,ztr,zti,cr,ci; double cscale; int i,j,n; scalingx = (m->Xmax-m->Xmin)/m->im->sx; scalingy = (m->Ymax-m->Ymin)/m->im->sy; cscale = 256.0/m->Tolerance; for (i = 0; i < m->im->sx; i++) { for (j = 0; j < m->im->sy; j++) { zr = scalingx*i + m->Xmin; zi = scalingy*j + m->Ymin; cr = zr; ci = zi; n = 0; while (n < m->Tolerance) { ztr = zr*zr-zi*zi + cr; zti = 2*zr*zi + ci; zr = ztr; zi = zti; if (ztr*ztr + zti*zti > 20) break; n = n + 1; } if (n >= m->Tolerance) gdImageSetPixel(m->im,i,j,0); else gdImageSetPixel(m->im,i,j,(int) (n*cscale)); } } gdImagePng(m->im,f); } /* Handler that produces HTML form for changing values */ void mandelpage(FILE *f, MandelData *m) { double xmin, xmax, ymin, ymax; double xshift,yshift; int tol; fprintf(f,"\n"); if (!swill_getargs("d(xmin)d(xmax)d(ymin)d(ymax)i(tol)", &xmin,&xmax,&ymin,&ymax,&tol)) { fprintf(f,"Missing form variable!\n"); } else { m->Xmin = xmin; m->Xmax = xmax; m->Ymin = ymin; m->Ymax = ymax; m->Tolerance = tol; } /* Link to image picture */ fprintf(f,"

\n"); xshift = (m->Xmax - m->Xmin)/4; yshift = (m->Ymax - m->Ymin)/4; fprintf(f,"

\n"); fprintf(f,"Xmin-xshift,m->Xmax-xshift,m->Ymin,m->Ymax,m->Tolerance); fprintf(f,"\">[ Left ]"); fprintf(f,"Xmin+xshift,m->Xmax+xshift,m->Ymin,m->Ymax,m->Tolerance); fprintf(f,"\">[ Right ]"); fprintf(f,"Xmin,m->Xmax,m->Ymin-yshift,m->Ymax-yshift,m->Tolerance); fprintf(f,"\">[ Up ]"); fprintf(f,"Xmin,m->Xmax,m->Ymin+yshift,m->Ymax+yshift,m->Tolerance); fprintf(f,"\">[ Down ]"); fprintf(f,"Xmin+xshift,m->Xmax-xshift,m->Ymin+yshift,m->Ymax-yshift,m->Tolerance); fprintf(f,"\">[ Zoom in ]"); fprintf(f,"Xmin-xshift,m->Xmax+xshift,m->Ymin-yshift,m->Ymax+yshift,m->Tolerance); fprintf(f,"\">[ Zoom out ]"); fprintf(f,"

\n"); /* Form to change values manually */ fprintf(f,"

\n"); fprintf(f,"Xmin :
\n", m->Xmin); fprintf(f,"Xmax :
\n", m->Xmax); fprintf(f,"Ymin :
\n", m->Ymin); fprintf(f,"Ymax :
\n", m->Ymax); fprintf(f,"Tolerance :
\n", m->Tolerance); fprintf(f,"\n"); fprintf(f,"
\n"); fprintf(f,"\n"); } int main(int argc, char **argv) { int i; MandelData *m; printf("Mandelbrot set viewer\n"); m = (MandelData *) malloc(sizeof(MandelData)); m->Xmin = -2.0; m->Xmax = 2.0; m->Ymin = -2.0; m->Ymax = 2.0; m->Tolerance = 50; m->im = gdImageCreate(400,400); /* Allocate colormap */ for (i = 0; i < 256; i++) { gdImageColorAllocate(m->im,i/2,i,i); } if (swill_init(8080)) { printf("Server listening on port 8080\n"); } else { printf("Couldn't start server!\n"); exit(1); } swill_handle("mandel.png", mandel, m); swill_handle("mandelpage.html", mandelpage,m); swill_handle("index.html",mandelpage,m); while (1) { swill_serve(); } }