home *** CD-ROM | disk | FTP | other *** search
/ GRIPS 2: Government Rast…rocessing Software & Data / GRIPS_2.cdr / dos / ncsa_tel / contribu / byu_tel2.hqx / tek / rgmac.c < prev    next >
Text File  |  1989-11-10  |  8KB  |  512 lines

  1. #ifdef lint
  2. static char *SCCSid = "%W%    (NCSA)    %G%";
  3. #endif
  4.  
  5. /*
  6.  
  7. rgmac.c by Gaige B. Paulsen
  8.   spawned from rgp.c by Aaron Contorer for NCSA
  9. Copyright 1987, board of trustees, University of Illinois
  10.  
  11. Routines for Macintosh Window output.  
  12.  
  13. */
  14.  
  15.  
  16. /* 
  17.  *    Include files 
  18.  */
  19.  
  20. #include <stdio.h>
  21.  
  22. #include <Controls.h>
  23. #include <Events.h>
  24. #include <OSutils.h>
  25. #include <Packages.h>
  26. #include <Quickdraw.h>
  27. #include <Windows.h>
  28.  
  29. #ifdef MPW
  30. #include "::main:mpw.h"
  31. #endif MPW
  32.  
  33. #define TRUE 1
  34. #define FALSE 0
  35. #define MAXWIND 20
  36. #define WINXMAX 4095
  37. #define WINYMAX 3139
  38. #define INXMAX 4096
  39. #define INYMAX 4096
  40.  
  41. #define SPLASH_SQUARED    4
  42.  
  43. char *malloc();
  44.  
  45. /*
  46.  * display structure....
  47.  */
  48.  
  49. struct RGMwindows {
  50. GrafPtr
  51.     wind;
  52. int
  53.     xorigin,
  54.     yorigin,
  55.     xscale,
  56.     yscale,
  57.     vg,
  58.     vs,
  59.     inuse,
  60.     ingin;
  61. unsigned char
  62.     *name;
  63. int
  64.     width,
  65.     height;
  66. ControlHandle
  67.     zoom,
  68.     vert,
  69.     horiz;
  70.     } *RGMwind[ MAXWIND ];    /* BYU mod - changed from an array of structure to an array of pointers */
  71.  
  72. long RGMlastclick;
  73.  
  74. int RGMcolor[]=
  75.     { 30,            /* black */
  76.       33,            /* white */
  77.       205,            /* red */
  78.       341,            /* green */
  79.       409,            /* blue */
  80.       273,            /* cyan */
  81.       137,            /* magenta */
  82.       69            /* yellow */
  83.       };
  84.  
  85.  
  86. char *macname = "Macintosh Windows";
  87.  
  88.  
  89. RGMgin(w)
  90. {
  91.     if (RGsetwind(w)) return(-1);
  92.  
  93.     setgraphcurs();
  94.     RGMwind[w]->ingin=1;
  95. }
  96.  
  97. RGMoutfunc(f)
  98. int (*f)();
  99. {}
  100.  
  101.  
  102. RGMpencolor(w, color)
  103. {
  104.     if (RGsetwind(w) ) return(-1);
  105.  
  106.     ForeColor((long) RGMcolor[color] );
  107. }
  108.  
  109. RGMclrscr(w)
  110. {
  111.     if (RGsetwind(w) ) return(-1);
  112.  
  113.     ForeColor((long) RGMcolor[0] );
  114.     EraseRect( &RGMwind[w]->wind->portRect);
  115. }
  116.  
  117. RGMclose(w)
  118. {
  119.     if (RGsetwind(w) ) return(-1);
  120.  
  121.     DisposeWindow(RGMwind[w]->wind);
  122.     RGMwind[w]->inuse  = FALSE;
  123.  
  124. }
  125.  
  126. RGMpoint(w,x,y)
  127. {
  128.     if (RGsetwind(w) ) return(-1);
  129.  
  130.     MoveTo(x,y);
  131.     LineTo(x,y);
  132.  
  133. RGMdrawline(w,x0,y0,x1,y1)
  134. int w,x0,y0,x1,y1;
  135. {
  136.     if (RGsetwind(w) ) return(-1);
  137.     x0 = (int) ((long) (x0 * RGMwind[w]->width) / INXMAX);
  138.     y0 = RGMwind[w]->height - (int) ((long) (y0 * RGMwind[w]->height) / INYMAX);
  139.     x1 = (int) ((long) (x1 * RGMwind[w]->width)/INXMAX);
  140.     y1 = RGMwind[w]->height - (int) ((long) (y1 * RGMwind[w]->height) / INYMAX);
  141.  
  142.     MoveTo(x0,y0);
  143.     LineTo(x1,y1);
  144. }
  145.  
  146. RGMpagedone(w)
  147. {
  148. }
  149.  
  150. RGMdataline(w,data,count)
  151. {}
  152.  
  153.  
  154. RGMcharmode(w,rotation,size)
  155. {}
  156.  
  157. RGMshowcur()
  158. {}
  159.  
  160. RGMlockcur()
  161. {}
  162.  
  163. RGMhidecur()
  164. {}
  165.  
  166. RGMbell(w)
  167. {}
  168.  
  169. RGMuncover(w)
  170. {}
  171.  
  172. char *RGMdevname() {
  173.     return(macname);
  174. }
  175.  
  176. RGMalloc()            /* BYU mod - allocate this structure to save global space */
  177. {                    /* BYU mod */
  178.     int i;                            /* BYU mod */
  179.     for(i=0; i<MAXWIND; i++)         /* BYU mod */
  180.         RGMwind[i] = (struct RGMwindows *) malloc(sizeof(struct RGMwindows));    /* BYU mod */
  181. }                    /* BYU mod */
  182.  
  183. RGMinit()
  184. {
  185.     int i;
  186.     for(i=0; i<20; i++) RGMwind[i]->inuse=0;
  187. }
  188.  
  189. RGMinfo(w,v,a,b,c,d)
  190. int w,a,b,c,d,v;
  191. {
  192.  
  193.     RGMwind[w]->vg=v;
  194. }
  195.  
  196. RGMgmode()
  197. {}
  198.  
  199. RGMtmode()
  200. {}
  201.  
  202. RGMnewwin()
  203. {
  204.     int i=0;
  205.  
  206.     while ( (i< MAXWIND) && (RGMwind[i]->inuse) ) i++;
  207.  
  208.     if (i>= MAXWIND) return(-1);
  209.  
  210.     RGMwind[i]->wind = GetNewWindow(256,(Ptr) 0L,(Ptr) -1L);
  211.  
  212.     if (RGMwind[i]->wind==0L) {
  213.         return(-1);
  214.         }
  215.  
  216.     RGMwind[i]->xorigin= 0;
  217.     RGMwind[i]->yorigin= 0;
  218.     RGMwind[i]->xscale = WINXMAX;
  219.     RGMwind[i]->yscale = WINYMAX;
  220.     RGMwind[i]->width  = 400;
  221.     RGMwind[i]->height = 300;
  222.     RGMwind[i]->inuse  = TRUE;
  223.     RGMwind[i]->ingin  = 0;
  224.  
  225.     ValidRect( &RGMwind[i]->wind->portRect);
  226.  
  227.     return(i);
  228. }
  229.  
  230.  
  231. RGattach(vg,virt,name)
  232. int vg,virt;
  233. char *name;
  234. {
  235.     int i,dnum;
  236.     long time;
  237.     char ts[50];
  238.  
  239.     if ( (dnum=RGfindbyVG( vg) ) <0) return(-1);
  240.  
  241.     RGMwind[dnum]->vs=virt;
  242.     RGMwind[dnum]->name=(char *)malloc(256);
  243.  
  244.     if (RGMwind[dnum]->name==0L) return(-2);
  245.  
  246.     RGMwind[dnum]->name[0]=165;
  247.     strncpy( &RGMwind[dnum]->name[1], name,255);
  248.  
  249.     GetDateTime(&time);
  250.     IUTimeString(time,FALSE, ts);                /* Put time in the temp string */
  251.     
  252.     strncat( RGMwind[dnum]->name, "  ",255);            /* Space, please */
  253.     strncat( RGMwind[dnum]->name, ts,255);            /* Place the time string at the end */
  254.  
  255.     SetWTitle(RGMwind[dnum]->wind,RGMwind[dnum]->name);
  256.     return(0);
  257. }
  258.  
  259. RGdetach(dnum)
  260. int dnum;
  261. {
  262.     int i;
  263.     if (dnum<0 || dnum>=MAXWIND) return(-1);
  264.  
  265.     strncpy( RGMwind[dnum]->name, &RGMwind[dnum]->name[1], 255);
  266.  
  267.     SetWTitle(RGMwind[dnum]->wind,RGMwind[dnum]->name);
  268.  
  269.     RGMwind[dnum]->vs=-1;
  270. }
  271.  
  272. RGsetwind(dnum)
  273. int dnum;
  274. {
  275.  
  276.     if (dnum<0 || dnum>=MAXWIND) return(-1);
  277.  
  278.     if (!RGMwind[dnum]->inuse) return(-1);
  279.  
  280.     SetPort( RGMwind[dnum]->wind);
  281.     return(0);
  282. }
  283.  
  284. RGupdate(wind)
  285. GrafPtr wind;
  286. {
  287.     int i=0,done;
  288.  
  289.     if ( (i=RGfindbywind(wind)) <0)
  290.         return(-1);
  291.  
  292.     SetPort(wind);
  293.     BeginUpdate(wind);
  294.  
  295.     VGstopred( RGMwind[i]->vg);
  296.     VGpage( RGMwind[i]->vg);
  297.     done = VGpred(  RGMwind[i]->vg,  RGMwind[i]->vg);
  298.     EndUpdate(wind);
  299.     if (!done)
  300.         netputevent(1,128,RGMwind[i]->vg);
  301.     return(done);
  302. }
  303.  
  304. RGsupdate(i)
  305. {
  306.     int rg;
  307.     rg=RGfindbyVG( i);
  308.  
  309.     if (rg<0) return(0);
  310.     SetPort( RGMwind[rg]->wind);
  311.     if (!VGpred(  RGMwind[rg]->vg,  RGMwind[rg]->vg) ) {
  312.         netputevent( 1, 128, i);
  313.         }
  314.     else return(1);
  315.     return(0);
  316. }
  317.  
  318. RGgetVG(wind)
  319. GrafPtr wind;
  320. {
  321.     int i;
  322.  
  323.     i=RGfindbywind(wind);
  324.  
  325.     return( RGMwind[i]->vg);
  326. }
  327.  
  328. RGgetdnum(wind)
  329. GrafPtr wind;
  330. {
  331.     return(RGfindbywind(wind) );
  332. }
  333.  
  334. RGfindbyVG( vg)
  335. int vg;
  336. {
  337.     int i=0;
  338.  
  339.     while ((i<MAXWIND) && ((!RGMwind[i]->inuse) || (RGMwind[i]->vg!=vg)))
  340.         i++;
  341.     if (i>=MAXWIND) return(-1);
  342.     return(i);
  343. }
  344.  
  345. RGgetVS( dnum)
  346. int dnum;
  347. {
  348.     return( RGMwind[dnum]->vs);
  349. }
  350.  
  351.  
  352. RGfindbywind(wind)
  353. GrafPtr wind;
  354. {
  355.     int i=0;
  356.  
  357.     while ((i<MAXWIND) && ((!RGMwind[i]->inuse) || (RGMwind[i]->wind!=wind)))
  358.         i++;
  359.     if (i>=MAXWIND) return(-1);
  360.     return(i);
  361. }
  362.  
  363. inSplash( p1, p2)
  364. Point *p1,*p2;
  365. {
  366.     if (p1->h-p2->h>3 || p2->h-p1->h >3)
  367.         return(0);
  368.     if (p1->v-p2->v>3 || p2->v-p1->v >3)
  369.         return(0);
  370.  
  371.     return(1);
  372. }
  373.  
  374. RGmousedown( wind, wherein, pnum)
  375. GrafPtr wind;
  376. Point *wherein;
  377. {
  378.     long lx,ly;
  379.     char thispaceforent[6];
  380.     int i;
  381.     Point where;
  382.  
  383.     where = *wherein;
  384.     if ( (i=RGfindbywind(wind)) <0)
  385.         return(-1);
  386.  
  387.     if (!RGMwind[i]->ingin) {
  388.         Point anchor, current,last;
  389. #ifndef MPW
  390.         long TickCount();
  391. #endif MPW
  392.         long GetDblTime(),tc;
  393.         int x0,y0,x1,y1;
  394.         Rect rect;
  395.         char dum[50];
  396.     
  397.         SetPort(wind);
  398.     
  399.         last  = where;
  400.         current = where;
  401.         anchor = where;
  402.     
  403.         PenPat(qd.gray);    
  404.         PenMode( patXor);
  405.     
  406.         SetRect( &rect, 0,0,0,0);
  407.     
  408.         while (StillDown()) {
  409.             GetMouse( ¤t);
  410.             if ( inSplash( ¤t, &anchor) ) continue;
  411.             tc=TickCount();
  412.             while(TickCount()==tc);
  413.             VidSync();
  414.             FrameRect(&rect);
  415.     
  416.             if (anchor.v < current.v) {
  417.                 rect.top=anchor.v;
  418.                 rect.bottom=current.v;
  419.                 }
  420.             else {
  421.                 rect.top=current.v;
  422.                 rect.bottom=anchor.v;
  423.                 }
  424.     
  425.             if (anchor.h < current.h) {
  426.                 rect.left=anchor.h;
  427.                 rect.right=current.h;
  428.                 }
  429.             else {
  430.                 rect.right=anchor.h;
  431.                 rect.left =current.h;
  432.                 }
  433.     
  434.             FrameRect(&rect);
  435.             last=current;
  436.             }
  437.     
  438.         FrameRect(&rect);
  439.  
  440.         PenPat(qd.black);    
  441.         PenMode( patCopy);
  442.  
  443.         if ( !inSplash( &anchor, ¤t)) {
  444.             x0 = (int) ((long) rect.left * RGMwind[i]->xscale / RGMwind[i]->width );
  445.             y0 = (int) RGMwind[i]->yscale -
  446.                  ((long) rect.top * RGMwind[i]->yscale / RGMwind[i]->height);
  447.             x1 = (int) ((long) rect.right * RGMwind[i]->xscale / RGMwind[i]->width);
  448.             y1 = (int) RGMwind[i]->yscale -
  449.                  ((long) rect.bottom * RGMwind[i]->yscale / RGMwind[i]->height);
  450.  
  451.             VGzoom( i,
  452.                     x0 +RGMwind[i]->xorigin,
  453.                     y1 +RGMwind[i]->yorigin,
  454.                     x1 +RGMwind[i]->xorigin,
  455.                     y0 +RGMwind[i]->yorigin);
  456.  
  457.             VGpage( RGMwind[i]->vg);
  458.  
  459.             RGMwind[i]->xscale= x1-x0;
  460.             RGMwind[i]->yscale= y0-y1;
  461.             RGMwind[i]->xorigin= x0+ RGMwind[i]->xorigin;
  462.             RGMwind[i]->yorigin= y1+ RGMwind[i]->yorigin;
  463.  
  464.             sprintf(dum,"VGzoom [%d,%d] -[%d,%d]", x0,y1,x1,y0);
  465.             putln(dum);
  466.             while( !VGpred(  RGMwind[i]->vg,  RGMwind[i]->vg) )
  467.                 Stask();
  468.             RGMlastclick=0L;
  469.             }
  470.         else {
  471.             if (RGMlastclick && ((RGMlastclick +GetDblTime() ) > TickCount()) ) {
  472.                 RGMwind[i]->xscale = WINXMAX;
  473.                 RGMwind[i]->yscale = WINYMAX;
  474.                 RGMwind[i]->xorigin= 0;
  475.                 RGMwind[i]->yorigin= 0;
  476.  
  477.                 VGzoom(i,0,0,WINXMAX,WINYMAX);
  478.                 VGpage( RGMwind[i]->vg);
  479.                 while( !VGpred(  RGMwind[i]->vg,  RGMwind[i]->vg) )
  480.                     Stask();
  481.                 RGMlastclick=0L;
  482.                 }
  483.             else RGMlastclick=TickCount();
  484.             }
  485.         return(0);
  486.     
  487.     }
  488.  
  489.  
  490.     lx= (RGMwind[i]->xscale * where.h) / ((long)RGMwind[i]->width);
  491.     ly= RGMwind[i]->yscale - ((RGMwind[i]->yscale * where.v) / ((long)RGMwind[i]->height));
  492.  
  493.     VGgindata( RGMwind[i]->vg, (int) lx, (int) ly, ' ', thispaceforent);
  494.  
  495.     RSsendstring( RGMwind[i]->vs, thispaceforent, 5);
  496.  
  497.     RGMwind[i]->ingin=0;
  498.     unsetgraphcurs();
  499.     RGMlastclick=TickCount();
  500. }
  501.  
  502. long *Ticks= (long *)0x16a;
  503.  
  504. VidSync()
  505. {
  506.     long a;
  507.  
  508.     a= *Ticks;
  509.     while (a ==*Ticks);
  510. }
  511.