home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / magazine / aeo / aeo_9202 / pview.c < prev   
C/C++ Source or Header  |  1992-05-14  |  9KB  |  380 lines

  1. /************************************************
  2.           PANEL MANAGER
  3. *************************************************/
  4.  
  5. #include <osbind.h>
  6. #include <obdefs.h>
  7. #include <aesbind.h>
  8. #include <gemdefs.h>
  9. #include <vdibind.h>
  10.  
  11. #define NOWINDOW    0        /* There be no window */
  12. #define WPARMS        NAME | CLOSER | MOVER |\
  13.             FULLER | SIZER | VSLIDE | HSLIDE
  14.  
  15. #define WAW        200
  16. #define WAH        200
  17.  
  18. /* Buffers */
  19.  
  20. char buffer[32*1024L];        /* Screen buffer */
  21. char *sc;            /* Screen base pointer */
  22. int header[17];            /* Header buffer */
  23. int xs = 0,ys = 0;        /* Pointers into screen buffer */
  24. int handle;            /* TOS file handle */
  25.  
  26. /* Evnt_multi() idiocy */
  27.  
  28. int w_handle = NOWINDOW;    /* Accessory window handle */
  29. int xd,yd;            /* X and Y offsets to window work area */
  30. int mx,my,mb,mk;        /* Dummy variables for mouse event */
  31. Mouse mouse = {&mx,&my,&mb,&mk};/* Dummy pointers to said variables */
  32. int key,dum;            /* More dummy variables */
  33. int msgbuf[8];            /* AES message buffer */
  34. int event;            /* AES event holding variable */
  35.  
  36. /* VDI binding control arrays and similar stuff */
  37.  
  38. int contrl[12],intin[128],intout[128],ptsin[128],ptsout[128],wks_handle;
  39. int work_in[] = {1,1,1,1,1,1,1,1,1,1,2};
  40. int work_out[57];
  41. int xrast,yrast;
  42. int rez;
  43. int menu_id;                    /* Acc's menu-item ID */
  44.  
  45. int wx,wy,ww,wh;                /* Window rect */
  46. int bx,by,bw,bh;                /* Work-area rect */
  47. int xd,yd,wd,hd;                /* Offset */
  48.  
  49. int tx,ty,tw,th;                /* Temporary coords */
  50.  
  51. /* Memory form definition blocks */
  52.  
  53. FDB source = {0L,640,400,40,0,1,0,0,0};
  54. FDB dest   = {0L,0,0,0,0,0,0,0,0};
  55.  
  56. char file[80];
  57.  
  58. /************************************************
  59.         File Selector
  60. *************************************************/
  61.  
  62. filename()
  63. {
  64. int drv,button;
  65. static char path[160];
  66. char *p = path;
  67.  
  68. if (path[0] == '\0'){
  69.     *p++ = (drv = Dgetdrv()) + 'A';
  70.     *p++ = ':';
  71.     Dgetpath(p,drv + 1);
  72.     }
  73. else{
  74.     p = path + strlen(path) - 1;
  75.     while(*p != '\\' && *p != ':')
  76.         *p-- = '\0';
  77.     }
  78.  
  79. strcat(path,"*.P?3");
  80. *file = '\0';
  81.  
  82. do{
  83.     while(!fsel_input(path,file,&button));
  84.     if (!button)
  85.         return(-1);
  86.     p = path + strlen(path) - 1;
  87.     while(*p != '\\') *p-- = '\0';
  88.     strcat(path,file);
  89.     } while ((handle = Fopen(path,0)) < 0);
  90. return(handle);
  91. }
  92.  
  93. /************************************************
  94.         Get PC3 File
  95. *************************************************/
  96.  
  97. read_pc3()
  98. {
  99. char *d = sc,*base = sc + 32000L,*buf,*s;
  100. int count;
  101.  
  102. s = buf = (char *) Malloc(32000L);
  103.  
  104. if (Fread(handle,32000L,buf) < 0)
  105.     return(-1);
  106.  
  107. while(1) {
  108.     if ((count = *s++) == -128)
  109.         continue;
  110.  
  111.     if (count < 0){
  112.         count = -count + 1;
  113.         while(count--){
  114.             *d++ = *s;
  115.             if (d == base)
  116.                 goto ripcord;
  117.             }
  118.         s++;
  119.         }
  120.     else {
  121.         count++;
  122.         while(count--){
  123.             *d++ = *s++;
  124.             if (d == base)
  125.                 goto ripcord;
  126.             }
  127.         }
  128.     }
  129. ripcord:
  130. Mfree(buf);
  131. return(1);
  132. }
  133.  
  134. /************************************************
  135.         Get PI3 File
  136. *************************************************/
  137.  
  138. getpic()
  139. {
  140. if (filename() < 0)
  141.     return(-1);
  142. if (Fread(handle,34L,header) < 0)
  143.     return(-1);
  144. if (header[0] & 0x0003 != rez){
  145.     Fclose(handle);
  146.     return(-1);
  147.     }
  148. if (!(header[0] & 0x8000)){
  149.     if (Fread(handle,32000L,sc) < 0)
  150.         return(-1);
  151.     }
  152. else
  153.     if (read_pc3() < 0)
  154.         return(-1);
  155. return(Fclose(handle));
  156. }
  157.  
  158. /************************************************
  159.         Set Slider Size
  160. *************************************************/
  161.  
  162. set_slider_size()
  163. {
  164. int hsl,vsl;
  165.  
  166. hsl = (long) bw * 1000L / (long) xrast;
  167. vsl = (long) bh * 1000L / (long) yrast;
  168. wind_set(w_handle,WF_HSLSIZE,hsl,0,0,0);
  169. wind_set(w_handle,WF_VSLSIZE,vsl,0,0,0);
  170. }
  171.  
  172. /************************************************
  173.         Set Slider Pos
  174. *************************************************/
  175.  
  176. set_slider_pos()
  177. {
  178. int hsl,vsl;
  179.  
  180. hsl = (long) xs * 1000L / (long) xrast;
  181. vsl = (long) ys * 1000L / (long) yrast;
  182. wind_set(w_handle,WF_HSLIDE,hsl,0,0,0);
  183. wind_set(w_handle,WF_VSLIDE,vsl,0,0,0);
  184. }
  185.  
  186. /************************************************
  187.            MAKE WINDOW
  188. *************************************************/
  189.  
  190. wind_make()
  191. {
  192. bx = (xrast - WAW) >> 1; by = (yrast - WAH) >> 1;
  193. bw = WAW; bh = WAH; 
  194. wind_calc(0,WPARMS,bx,by,bw,bh,&wx,&wy,&ww,&wh);
  195. xd = bx - wx; yd = by - wy; wd = ww - bw; hd = wh - bh;
  196. w_handle = wind_create(WPARMS,wx,wy,ww,wh);
  197. wind_set(w_handle,WF_NAME,file,0,0);
  198. wind_set(w_handle,WF_HSLIDE,1,0,0,0);
  199. wind_set(w_handle,WF_VSLIDE,1,0,0,0);
  200. set_slider_size();
  201. set_slider_pos();
  202. wind_open(w_handle,wx,wy,ww,wh);
  203. }
  204.  
  205. /************************************************
  206.       Blit from buffer to window
  207. *************************************************/
  208.  
  209. blit(x,y,w,h)
  210. int x,y,w,h;
  211. {
  212. int xyc[4] = {x,y,x + w - 1,y + h - 1};
  213. int xy[8];
  214.  
  215. if (xyc[3] > xrast - 1)
  216.     xyc[3] = xrast - 1;
  217. if (xyc[4] > yrast - 1)
  218.     xyc[4] = yrast - 1;
  219.  
  220. vs_clip(wks_handle,1,xyc);
  221. xy[0] = xs; xy[1] = ys; xy[2] = xs + bw - 1; xy[3] = ys + bh - 1;
  222. xy[4] = bx; xy[5] = by; xy[6] = bx + bw - 1; xy[7] = by + bh - 1;
  223. vro_cpyfm(wks_handle,3,xy,&source,&dest);
  224. }
  225.  
  226. /************************************************
  227.     Open VDI Virtual Workstation
  228. *************************************************/
  229.  
  230. void open_wk()
  231. {
  232. wks_handle = graf_handle(&dum,&dum,&dum,&dum);
  233. v_opnvwk(work_in,&wks_handle,work_out);
  234. xrast = work_out[0]; yrast = work_out[1];
  235. rez = Getrez();
  236. }
  237.  
  238. /************************************************
  239.         Mainline Routine
  240. *************************************************/
  241.  
  242. main()
  243. {
  244. extern int gl_apid;
  245. int loaded = -1;                /* Pic loaded? */
  246.  
  247. appl_init();                    /* Register APP */
  248. menu_id = menu_register(gl_apid,"  PIView  ");    /* Register ACC */
  249. open_wk();                    /* Open workstation */
  250.  
  251. /* Set buffer pointer to even page of memory */
  252.  
  253. sc = (char *) (((long) buffer + 0xFFL) & ~(0xffL));
  254.  
  255. source.fd_addr = (long) sc;
  256.  
  257. for(;;){
  258.  
  259.     event = evnt_multi(MU_MESAG,1,1,1,0,0,0,0,0,0,0,0,0,0,
  260.                 msgbuf,1000,0,mouse,&key,&dum);
  261.  
  262.     if (event & MU_MESAG){
  263.           switch(msgbuf[0]){
  264.                case(AC_OPEN):
  265.                     if (msgbuf[4] == menu_id){
  266.                          if (w_handle == NOWINDOW){
  267.                               if (loaded < 0){
  268.                             loaded = getpic();
  269.                             if (loaded >= 0)
  270.                                 wind_make();
  271.                             }
  272.                               else
  273.                             wind_make();
  274.  
  275.                               }        
  276.                          else
  277.                               wind_set(w_handle,WF_TOP,0,0,0,0);
  278.                           }
  279.                 break;
  280.  
  281.             case(AC_CLOSE):
  282.                 if (msgbuf[3] == menu_id)
  283.                     w_handle = NOWINDOW;
  284.                 break;
  285.  
  286.             case(WM_CLOSED):
  287.                 if (msgbuf[3] == w_handle){
  288.                     wind_close(w_handle);
  289.                     wind_delete(w_handle);
  290.                     w_handle = NOWINDOW;
  291.                     }
  292.                 break;
  293.  
  294.             case(WM_MOVED):
  295.                 if (msgbuf[3] == w_handle){
  296.                     bx = (wx = msgbuf[4]) + xd;
  297.                     by = (wy = msgbuf[5]) + yd;
  298.                     wind_set(w_handle,WF_CURRXYWH,wx,wy,ww,wh);
  299.                     }
  300.                 break;
  301.  
  302.             case(WM_TOPPED):
  303.             case(WM_NEWTOP):
  304.                 if (msgbuf[3] == w_handle)
  305.                     wind_set(w_handle,WF_TOP,0,0,0,0);
  306.                 break;
  307.  
  308.             case(WM_REDRAW):
  309.                 if (msgbuf[3] == w_handle){
  310.                 wind_update(BEG_UPDATE);
  311.                 graf_mouse(M_OFF,0L);
  312.                 wind_get(w_handle,WF_FIRSTXYWH,&tx,&ty,&tw,&th);
  313.                 while(tw && th){
  314.                     blit(tx,ty,tw,th);
  315.                     wind_get(w_handle,WF_NEXTXYWH,
  316.                         &tx,&ty,&tw,&th);
  317.                     }
  318.                 graf_mouse(M_ON,0L);
  319.                 wind_update(END_UPDATE);
  320.                 }
  321.                 break;
  322.  
  323.             case(WM_SIZED):
  324.                 if (msgbuf[3] == w_handle){
  325.                 wx = msgbuf[4];
  326.                 wy = msgbuf[5];
  327.                 ww = msgbuf[6];
  328.                 wh = msgbuf[7];
  329.                 wind_set(w_handle,WF_CURRXYWH,wx,wy,ww,wh);
  330.                 wind_get(w_handle,WF_WORKXYWH,&bx,&by,&bw,&bh);
  331.                 if (xs + bw > xrast - 1)
  332.                     xs = xrast - bw - 1;
  333.                 if (ys + bh > yrast - 1)
  334.                     ys = yrast - bh - 1;
  335.                 set_slider_size();
  336.                 set_slider_pos();
  337.                 }
  338.                 break;
  339.  
  340.             case(WM_FULLED):
  341.                 if (msgbuf[3] == w_handle){
  342.                 if (getpic() >= 0){
  343.                 wind_update(BEG_UPDATE);
  344.                 graf_mouse(M_OFF,0L);
  345.                 blit(bx,by,bw,bh);
  346.                 graf_mouse(M_ON,0L);
  347.                 wind_update(END_UPDATE);
  348.                 }
  349.                 }
  350.                 break;
  351.  
  352.             case(WM_HSLID):
  353.                 if (msgbuf[3] == w_handle){
  354.                 xs = (long) msgbuf[4] * (long) (xrast - bw - 1) / 1000L;
  355.                 wind_set(w_handle,WF_HSLIDE,msgbuf[4],0,0,0);
  356.                 wind_update(BEG_UPDATE);
  357.                 graf_mouse(M_OFF,0L);
  358.                 blit(bx,by,bw,bh);
  359.                 graf_mouse(M_ON,0L);
  360.                 wind_update(END_UPDATE);
  361.                 }
  362.                 break;
  363.  
  364.             case(WM_VSLID):
  365.                 if (msgbuf[3] == w_handle){
  366.                 ys = (long) msgbuf[4] * (long) (yrast - bh - 1) / 1000L;
  367.                 wind_set(w_handle,WF_VSLIDE,msgbuf[4],0,0,0);
  368.                 wind_update(BEG_UPDATE);
  369.                 graf_mouse(M_OFF,0L);
  370.                 blit(bx,by,bw,bh);
  371.                 graf_mouse(M_ON,0L);
  372.                 wind_update(END_UPDATE);
  373.                 }
  374.                 break;
  375.                 
  376.             }
  377.         }
  378.     }
  379. }
  380.