home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- #include "stdio.h"
- #include "gl.h"
- #include "device.h"
- #include "demograph.h"
-
- extern CATEGORY *curcategory, *categoryroot;
- extern WINREC winrec;
- extern MACHREC machrec;
- extern int updatetext;
- extern DATA *curdata;
- extern int drawtype;
-
- extern void (*drawmap)(float *data);
- extern void draw_slider(int minx, int miny, int maxx, int maxy, int fillcolor);
- extern void draw_line_map(float *data);
- extern void draw_solid_map(float *data);
- extern void draw_lighted_map(float *data);
-
- Matrix idmatrix = { {1.0,0.0,0.0,0.0},
- {0.0,1.0,0.0,0.0},
- {0.0,0.0,1.0,0.0},
- {0.0,0.0,0.0,1.0}};
-
- float map_light[] ={LCOLOR, 1.0, 1.0, 1.0,
- POSITION, -1.0, 2.0, 2.0, 0.0,
- LMNULL};
-
- int datamax, displaymax;
- int mainmenu, datamenu, displaymenu;
-
- void initwin(void)
- {
- void init_cmRGB(void);
- void initmenus(void);
-
- keepaspect(WID, HT);
- minsize(WID, HT);
- winopen("demograph");
- wintitle("demograph");
-
- mmode(MVIEWING);
- loadmatrix(idmatrix);
- subpixel(FALSE);
-
- qdevice(REDRAW);
- qdevice(LEFTMOUSE);
- qdevice(RIGHTMOUSE);
- qdevice(MIDDLEMOUSE);
- qdevice(WINQUIT);
- qdevice(WINSHUT);
-
- qreset();
- qenter(REDRAW, 0);
-
- doublebuffer();
- gconfig();
-
- /* set color mode (RGB or cmap) in file init_cmRGB */
- init_cmRGB();
-
- /* initialize drawing modes */
- /* this must go after init_cmRGB as RGBmode() is set in init_cmRGB */
-
- if (machrec.RGB) {
- lmdef(DEFMATERIAL, 1, 0, NULL);
- lmdef(DEFLIGHT, 1, 0, map_light);
- lmdef(DEFLMODEL, 1, 0, NULL);
- }
-
- if (machrec.zbuffer) {
- if (machrec.RGB) {
- drawtype = LIGHTED;
- drawmap = draw_lighted_map;
- } else {
- drawtype = SOLID;
- drawmap = draw_solid_map;
- }
- } else {
- drawtype = LINES;
- drawmap = draw_line_map;
- }
-
-
- initmenus();
- }
-
-
- void redraw()
- {
- long sizex, sizey;
- register int s_frame_wid, m_frame_wid;
- register WINREC *win;
-
- frontbuffer(TRUE);
-
- win = &winrec;
-
- /* resize the window */
- getsize(&sizex, &sizey);
- getorigin(&win->orgx, &win->orgy);
- viewport(0,sizex - 1, 0, sizey - 1);
- ortho2(0.0,(float)(sizex - 1), 0.0, (float)(sizey - 1));
-
- if (drawtype == LIGHTED) {
- lmbind(MATERIAL,1);
- lmbind(LMODEL,1);
- }
-
- setcolor(0,0,0);
- clear();
-
- /* set window parameters and draw the borders */
- win->scale = (float)sizex/WID;
- win->sliderminx = win->sliderminy = 0;
- win->slidermaxx = sizex - 1;
- win->slidermaxy = (int)(SLIDERHT * win->scale + 0.5);
- win->statminx = 0;
- win->statmaxx = sizex - 1;
- win->statminy = win->slidermaxy;
- win->statmaxy = (int)((SLIDERHT + STATUSHT) * win->scale + 0.5);
- win->mapminx = 0;
- win->mapmaxx = sizex - 1;
- win->mapminy = win->statmaxy;
- win->mapmaxy = sizey - 1;
-
- s_frame_wid = (int)(S_FRAME_WID * win->scale + 0.5);
- m_frame_wid = (int)(M_FRAME_WID * win->scale + 0.5);
-
- drawboarder(win->sliderminx, win->sliderminy, win->slidermaxx,
- win->slidermaxy,s_frame_wid);
- drawboarder(win->mapminx, win->mapminy, win->mapmaxx, win->mapmaxy,
- m_frame_wid);
-
- win->statminy += 2;
- win->statmaxy -= 2;
-
- setcolor(0Xbb,0Xbb,0Xbb);
- sboxfi(win->statminx, win->statminy, win->statmaxx, win->statmaxy);
-
- win->sliderminx += s_frame_wid;
- win->sliderminy += s_frame_wid;
- win->slidermaxx -= s_frame_wid;
- win->slidermaxy -= s_frame_wid;
-
- win->mapminx += m_frame_wid;
- win->mapminy += m_frame_wid;
- win->mapmaxx -= m_frame_wid;
- win->mapmaxy -= m_frame_wid;
-
- win->sliderwid = (int)(SLIDERWID * win->scale / 2.0 + 0.5);
-
-
- setcolor(0xbb,0xbb,0xbb);
- sboxfi(win->sliderminx, win->sliderminy, win->slidermaxx, win->slidermaxy);
-
- setcolor(0,0,0);
- sboxfi(win->mapminx, win->mapminy, win->mapmaxx, win->mapmaxy);
- sboxi(win->sliderminx, win->sliderminy, win->slidermaxx, win->slidermaxy);
-
- win->sliderminx++;
- win->sliderminy++;
- win->slidermaxx--;
- win->slidermaxy--;
- win->mapminx++;
- win->mapminy++;
- win->mapmaxx--;
- win->mapmaxy--;
-
- init_text();
- writetitle(curcategory->title);
- if (winrec.fps) {
- writefps(winrec.lasttime);
- }
-
- frontbuffer(FALSE);
- drawaction();
- }
-
- drawaction()
- {
- int x;
- int wid = winrec.sliderwid;
- int sminx = winrec.sliderminx;
- int smaxx = winrec.slidermaxx;
- int sminy = winrec.sliderminy;
- int smaxy = winrec.slidermaxy;
- int minval = sminx + wid;
- int index;
-
- float range = (smaxx - wid) - minval;
-
- x = (winrec.slideroldx * (range) + 0.5) + sminx + wid;
- if (x < minval) {
- x = minval;
- winrec.slideroldx = (float)(x-sminx-wid) / (float)(range);
- }
- draw_slider(x - wid,sminy, x + wid,smaxy,0xbb);
-
- index = (int)((float)((x-minval)*(MAXDATA-1))/range + 0.5);
- curdata = &curcategory->dataarray[index];
- writesliderdate(curdata->date,(float)x);
- (*drawmap)(curdata->data);
- /* if(updatetext) {
- /* displaydata(curdata->data);
- /* }
- */
- swapbuffers();
- setcolor(0xbb, 0xbb, 0xbb);
- sboxfi(x - wid, sminy, x + wid, smaxy);
- }
-
-
-
- /****************************************************************************
- Needs to be rewritten to be color dominanat instead of position dominant.
- We use rectfi here because Personal IRIS does not do pattern masked lines.
- Not particularly critical for speed - only gets drawn once.
- ****************************************************************************/
- /* draws a boarder mimmicking the news "shaded" window 9 pixels wide. This
- routine expects a 1 to 1 scale with the screen.
- */
- int drawboarder(xmin, ymin, xmax, ymax, width)
- /* these must be scaled to screen coordinates */
- int xmin, ymin, xmax, ymax, width;
- {
- int tmp;
-
- /* force minimum width */
- if (width < 7.0)
- width = 7.0;
-
- /* fill in the background sbox does not work here (a23) */
- tmp = width - 1;
-
- setcolor(0xbb, 0xbb, 0xbb);
- sboxfi(xmin, ymin, xmax, ymin + tmp); /* bottom */
- sboxfi(xmin, ymin + tmp, xmin + tmp, ymax - tmp); /* left */
- sboxfi(xmax - tmp, ymin + tmp, xmax, ymax - tmp); /* right */
- sboxfi(xmin, ymax - tmp, xmax, ymax); /* top */
-
-
- /* draw top highlight and move in one more pixel on the top */
- setcolor(0xff, 0xff, 0xff);
- sboxfi(xmin, ymax, xmax, ymax); /* outside */
- sboxfi(xmin + width, ymin + tmp, xmax - width, ymin + tmp);/* inside */
- ymax--;
-
- tmp = ymin + 1;
- setcolor(0xee, 0xee, 0xee);
- sboxfi(xmin, tmp, xmin, ymax); /* outside */
- sboxfi(xmin, ymax, xmax, ymax);
- sboxfi(xmax, ymax, xmax, tmp);
- xmin++;
- xmax--;
- ymax--;
-
- tmp = width - 2;
- setcolor(0xee, 0xee, 0xee);
- sboxfi(xmin + tmp, ymax - tmp, xmin + tmp, ymin + tmp); /* inside */
- sboxfi(xmin + tmp, ymin + tmp, xmax - tmp, ymin + tmp);
- sboxfi(xmax - tmp, ymin + tmp, xmax - tmp, ymax - tmp);
-
- tmp = ymin + 2;
- setcolor(0xdd, 0xdd, 0xdd);
- sboxfi(xmin, tmp, xmin, ymax); /* outside */
- sboxfi(xmin, ymax, xmax, ymax);
- sboxfi(xmax, ymax, xmax, tmp);
- tmp = width - 3;
-
- setcolor(0xdd, 0xdd, 0xdd);
- sboxfi(xmin + tmp, ymax - tmp, xmin + tmp, ymin + tmp); /* inside */
- sboxfi(xmin + tmp, ymin + tmp, xmax - tmp, ymin + tmp);
- sboxfi(xmax - tmp, ymin + tmp, xmax - tmp, ymax - tmp);
-
- setcolor(0x66, 0x66, 0x66);
- sboxfi(xmin, ymin, xmax, ymin); /* outside */
- xmin++;
- ymin++;
- xmax--;
-
-
- ymax -= width - 3;
-
- tmp = width - 2;
- setcolor(0x66, 0x66, 0x66);
- sboxfi(xmin + tmp, ymax, xmax - tmp, ymax); /* inside */
- ymax++;
-
- setcolor(0x88, 0x88, 0x88);
- sboxfi(xmin, ymin, xmax, ymin);
- xmin++;
-
- tmp = width - 3;
- setcolor(0x88, 0x88, 0x88);
- sboxfi(xmin + tmp, ymax, xmax - tmp, ymax); /* inside */
- ymax++;
-
- setcolor(0xaa, 0xaa, 0xaa);
- sboxfi(xmin, ymin, xmax, ymin); /* outside */
-
- tmp = width - 4;
- setcolor(0xaa, 0xaa, 0xaa);
- sboxfi(xmin + tmp, ymax, xmax - tmp, ymax); /* inside */
- return (width);
- }
-
-
- void qprocess(dev,qval)
- int dev;
- short qval;
- {
- long x, y;
- int menuret;
- int i;
-
- switch (dev) {
- case LEFTMOUSE:
- if (qval) {
- x = getvaluator(MOUSEX) - winrec.orgx;
- y = getvaluator(MOUSEY) - winrec.orgy;
- if (getview(x,y) == SLIDERPORT) {
- updateslider();
- } else {
- flipmap(TRANSXY);
- }
- }
- break;
- case MIDDLEMOUSE:
- if(qval) {
- x = getvaluator(MOUSEX) - winrec.orgx;
- y = getvaluator(MOUSEY) - winrec.orgy;
- if (getview(x,y) == MAPPORT) {
- flipmap(SPIN);
- }
- }
- break;
- case RIGHTMOUSE:
- menuret = dopup(mainmenu);
- if (menuret < 1) {
- break;
- }
- if (menuret <= datamax) {
- curcategory = categoryroot;
- for (i = 1; i < menuret; i++) {
- curcategory = curcategory->next;
- }
- /* erase the status window */
- frontbuffer(TRUE);
- setcolor(0xbb,0xbb,0xbb);
- sboxfi(winrec.statminx,winrec.statminy,
- winrec.statmaxx,winrec.statmaxy);
- init_text();
- writetitle(curcategory->title);
- writefps(0.0);
-
- /* drawaction will update the frames_per_second */
- frontbuffer(FALSE);
- drawaction();
- } else if (menuret <= displaymax) {
- /* drawtype: 0=lines, 1=tops, 2=solid, 3=lighted */
- drawtype = menuret - (datamax+1);
- switch (drawtype) {
- case LINES:
- drawtype = LINES;
- drawmap = draw_line_map;
- break;
- case TOPS:
- drawtype = TOPS;
- drawmap = draw_line_map;
- break;
- case SOLID:
- drawtype = SOLID;
- drawmap = draw_solid_map;
- break;
- case LIGHTED:
- drawtype = LIGHTED;
- drawmap = draw_lighted_map;
- break;
- default:
- fprintf(stderr,"unrecognized drawing type\n");
- break;
- }
- drawaction();
- } else {
- exit(0);
- }
- break;
- case REDRAW:
- redraw();
- break;
- case WINQUIT:
- case WINSHUT:
- /* if text - shut down text window */
- exit(0);
- break;
- }
- }
-
- int getview(x,y)
- long x, y;
- {
- if (x < winrec.slidermaxx && x > winrec.sliderminx && y < winrec.slidermaxy
- && y > winrec.sliderminy) {
- return(SLIDERPORT);
- }
-
- if (x < winrec.mapmaxx && x > winrec.mapminx && y < winrec.mapmaxy
- && y > winrec.mapminy) {
- return(MAPPORT);
- }
- return(NOPORT);
- }
-
-
- void initmenus()
- {
- char menustr[256];
- int n;
- CATEGORY *tmpcategory;
-
- tmpcategory = categoryroot;
- n = 0;
-
- /* make submenu to pick data type */
- datamenu = newpup();
- while (tmpcategory != NULL) {
- n++;
- sprintf(menustr,"%s %%x%d",tmpcategory->title,n);
- addtopup(datamenu,menustr);
- tmpcategory = tmpcategory->next;
- }
-
- datamax = n;
-
- /* make display menu */
- n++;
- displaymenu = newpup();
- sprintf(menustr,"Lines %%x%d",n);
- addtopup(displaymenu,menustr);
-
- if (machrec.zbuffer) {
- n++;
- sprintf(menustr,"Tops %%x%d",n);
- addtopup(displaymenu,menustr);
-
- n++;
- sprintf(menustr,"Solids %%x%d",n);
- addtopup(displaymenu,menustr);
-
- if (machrec.RGB) {
- n++;
- sprintf(menustr,"Lighted %%x%d",n);
- addtopup(displaymenu,
- menustr);
- n++;
- }
- }
- displaymax = n;
-
- sprintf(menustr,
- "Demographics %%t|Data %%x%d%%m|Display %%x%d%%m|Exit %%x%d",
- n+1,n+2,n+3);
-
- mainmenu = defpup(menustr,datamenu,displaymenu);
- }
-