/* draw.c draws holigraphically on crt dr_iRastWindow() initializes raster coords of window dr_iProgCoords() initializes user floating point coords of screen dr_zoom() zoom in to subsection of screen dr_Vreset() resets V stack dr_Vpush() push V onto stack dr_Vpop() pop V from stack dr_sBox() starts the filling in of the above box dr_compute() divides sub box into required rectangles dr_area generate a box of points around the current one dr_xy() computes a mandelbrot value and puts in buffer dr_putBuf() puts buffer on crt dr_clip sets clip rectangle for dr_putBuf load_clut() */ #include #include #include #include #include #include #define L (long) #define LOG_CELLS 9 /* was 9 */ #define ASPECT_F (16.0/19.0) /* X dimension of pixel / Y~ */ int vs_handle; /* virtual workstation handle */ int wi_handle; /* window handle */ /**** shared with window.c: */ double Vx0, Vy0, Vxw, Vyw; /* Size of viewed area, in real numbers */ int Niter = 256; /* max number of iterations */ int box_invisible; /* if 0, boxes get outlined in black */ #define Nunzoom 50 /* stack of zoom-ins, to allow unzoom */ int Iunzoom; struct unzoom { double x0, y0, xw, yw; } unzoom[Nunzoom]; long Tx0, Ty0; /* Transform from Raster Coords to Prog Coords*/ double Txx, Tyy; /* was pc X Y min gain */ int Wx0, Wy0; /* Display Window Position, in Raster Coords */ int Wxw, Wyw; int Wx1, Wy1; int Cx0, Cx1, Cy0, Cy1; /* clip window */ int len; /* side in pixels of boxes being generated */ long count; int count_slider, slider; /* of bar graph */ #define SIZEOF_BUF 160 int bufI, *bufP; int buf[SIZEOF_BUF+1][5]; char str[128]; int v_pr_ct = 3; #define v_printf(a,b,c) sprintf(str,a,b,c);v_gtext(handl,30,10*v_pr_ct++,str); dr_iRastWindow(X0,Y0, Xw,Yw) int X0, Y0, Xw, Yw; /* of window, in rc's */ { Wx0 = X0; Wy0 = Y0; Wxw = Xw; Wyw = Yw; Wx1 = Wx0 + Wxw -1; Wy1 = Wy0 + Wyw -1; } long debug1; dr_iProgCoords(x0,y0, xw,yw) double x0, y0, xw, yw; { double ratio, dif; long magnification; ratio = (double)Wxw * ASPECT_F/(double)Wyw; if (xw < (dif= ratio * yw)) { x0 -= (dif - xw)/2; /* expand pcX */ xw = dif; }else { dif = xw / ratio; /* expand pcY */ y0 -= (dif - yw)/2; yw = dif; } Vx0 = x0; Vy0 = y0; Vxw = xw; Vyw = yw; Tx0 = x0 * (double)0x4000000; Ty0 = y0 * (double)0x4000000; Tyy = yw/(double)Wyw * (double)0x4000000; /*2^26*/; Txx = Tyy * ASPECT_F; magnification = 1.0/xw + 1.0; clip_full(); sprintf(str, "%ldx ", magnification); v_gtext(vs_handle, Wx0+20, Wy0-3, str); clip_current(); } dr_zoom(x0,y0, x1,y1) int x0,y0, x1,y1; { double Rx, Ry; int dx, dy, i; if (x0 > x1) { i=x0; x0=x1; x1=i; } if (y0 > y1) { i=y0; y0=y1; y1=i; } dr_Vpush(); Vx0 += (double)(x0-Wx0) / (double)Wxw * Vxw; Vy0 += (double)(y0-Wy0) / (double)Wyw * Vyw; Vxw *= Rx = (double)(x1-x0+1) / (double)Wxw; Vyw *= Ry = (double)(y1-y0+1) / (double)Wyw; dr_iProgCoords(Vx0, Vy0, Vxw, Vyw); } dr_Vpush() { if (Iunzoom == Nunzoom) { form_alert(0,"[1][Unzoom stack overflow,|UNZOOM is now broken.]\ [I understand]"); Iunzoom++; } else if (Iunzoom < Nunzoom) { unzoom[Iunzoom].x0 = Vx0; unzoom[Iunzoom].y0 = Vy0; unzoom[Iunzoom].xw = Vxw; unzoom[Iunzoom++].yw = Vyw; } } dr_Vpop() { if (Iunzoom0 ) { Vx0 = unzoom[Iunzoom].x0; Vy0 = unzoom[Iunzoom].y0; Vxw = unzoom[Iunzoom].xw; Vyw = unzoom[Iunzoom].yw; dr_iProgCoords(Vx0, Vy0, Vxw, Vyw); return(1); } else { form_alert(0,"[1][No previous place to|zoom back to.|\ Command ignored.][acknowlege]"); Iunzoom = 0; return(0); } } dr_Vreset() { Iunzoom = 0; } dr_Vprint() { int i; printf("V = (%f,%f) + (%f,%f)\n",Vx0,Vy0,Vxw,Vyw); for (i = Iunzoom; --i>=0;) printf("%d = (%f,%f) + (%f,%f)\n",i, unzoom[i].x0,unzoom[i].y0, unzoom[i].xw,unzoom[i].yw); wait(); } wait() { long i; for (i=0; i<2000000; i++); } dr_sBox() /* called when finally going to restart */ { int pxyarray[4]; st_inz(LOG_CELLS, Wxw, Wyw); count_slider = 0; slider = 0; /* of bar graph */ wind_set(wi_handle, WF_VSLIDE, 0, 0, 0, 0); vsf_interior(vs_handle,2); vsf_style(vs_handle,8); } dr_clip(x0,y0, xw,yw) int x0,y0, xw,yw; { Cx0 = x0; Cy0 = y0; Cx1 = x0 + xw - 1; Cy1 = y0 + yw - 1; } dr_compute() { dprintf(stderr, "dr_compute()\n");/**/ bufP = buf; bufI = 0; /* (64 --- space for recursive splits) */ while (bufI < SIZEOF_BUFF - 64) /* or LOG_CELLS*3 -5 */ { dprintf(stderr, "dr_compute: bufI=%d\n",bufI);/**/ if (st_do_next() == 0) { dprintf(stderr, "st_do_next returned 0\n");/**/ break; } } dprintf(stderr, "dr_compute returning %d\n", bufI);/**/ return (bufI); } dr_area(x0, y0, len) int x0, y0, len; { int i, j; bufP = buf; bufI = 0; for (i = -len; i<=len; i++) for (j = -len; j<=len; i++) dr_xy(x0+i, y0+j, 1); } dr_xy(x0, y0, len) int x0, y0, len; { long Zx, Zy; long pcX, pcY; int x,y; int count, count_max, color; char str[128]; dprintf(stderr, "dr_xy: X=%x, Y=%x, l=%x, ", x0, y0, len);/**/ if (x0>2) %14 +2; if (bufI > SIZEOF_BUF) panic("write bufI overflow\n", 0L, 0L); *bufP++ = color; *bufP++ = ((x = Wx0 + x0) < Cx0)? Cx0: x; *bufP++ = ((y = Wy0 + y0) < Cy0)? Cy0: y; *bufP++ = ((x += len-1) > Cx1)? Cx1: x; *bufP++ = ((y += len-1) > Cy1)? Cy1: y; bufI++; dprintf(stderr, "c=%d, bI=%d\n", count, bufI);/**/ } else { dprintf(stderr, "off-screen\n");/**/ count = -1; } return (count); } dr_putBuf(box_count) int box_count; { int i; int *p; draw_on_screen(); st_check("dr_putBuf: \b\b\b\b\b\b\b\b\b\b\b"); for (i=0; i2; i--) { clut[i][0] = clut[i-1][0]; clut[i][1] = clut[i-1][1]; clut[i][2] = clut[i-1][2]; } clut[2][0] = r; clut[2][1] = g; clut[2][2] = b; load_clut(handle,clut,(int *)0); } load_clut(handle, new, old) int handle, new[16][3], old[16][3]; { int i; for (i=0; i<16; i++) { if (old) vq_color(handle, i, 0, old[i]); vs_color(handle, i, new[i]); } }