home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / disk / misc / dcmp / source / source.lha / crawl.c < prev    next >
C/C++ Source or Header  |  1993-02-02  |  3KB  |  99 lines

  1. /*------------------------------------------------*
  2.   $Id: crawl.c,v 1.4 92/11/03 17:14:49 tf Exp $
  3.   Crawling frames and some other EOR tricks
  4.   written by Tobias Ferber, 1992
  5.  *------------------------------------------------*/
  6.  
  7. #include <exec/types.h>
  8. #include <intuition/intuition.h>
  9. #include <intuition/intuitionbase.h>
  10. #include <graphics/gfx.h>
  11. #include <graphics/gfxbase.h>
  12. #include <graphics/gfxmacros.h>
  13.  
  14. static char rcs_id[] = "$Id: crawl.c,v 1.4 92/11/03 17:14:49 tf Exp $";
  15.  
  16. extern struct IntuitionBase *IntuitionBase;
  17. extern struct GfxBase *GfxBase;
  18. static struct RastPort CrawlPort;
  19.  
  20. static UWORD fptrn= 0xF0F0;        /* $F0F0 == %1111000011110000 */
  21.  
  22. static UWORD gptrn[]= { 0x8888,    /* $8888 == %1000100010001000 */
  23.                         0x2222,    /* $2222 == %0010001000100010 */
  24.                         0xAAAA,    /* $AAAA == %1010101010101010 */
  25.                         0x5555,    /* $5555 == %0101010101010101 */
  26.                         0xCCCC,    /* $CCCC == %1100110011001100 */
  27.                         0x3333     /* $3333 == %0011001100110011 */
  28.                       };
  29.  
  30. static struct frame { USHORT x1,y1;
  31.                       USHORT x2,y2;
  32.                     } fbox;
  33.  
  34. #define erase_frame() draw_frame() /* draw mode complement => EOR frame away */
  35.  
  36. void draw_frame()
  37. { Move(&CrawlPort, fbox.x1,fbox.y1);  Draw(&CrawlPort, fbox.x2,fbox.y1);
  38.   Move(&CrawlPort, fbox.x2,fbox.y1);  Draw(&CrawlPort, fbox.x2,fbox.y2);
  39.   Move(&CrawlPort, fbox.x2,fbox.y2);  Draw(&CrawlPort, fbox.x1,fbox.y2);
  40.   Move(&CrawlPort, fbox.x1,fbox.y2);  Draw(&CrawlPort, fbox.x1,fbox.y1);
  41. }
  42.  
  43. void crawl_frame(int dir)
  44. { UWORD temp= fptrn;
  45.   if(dir)
  46.     fptrn= ((fptrn << 1) & 0xFFFE) | ((fptrn & 0x8000) >> 15);
  47.   else
  48.     fptrn= ((fptrn >> 1) & 0x7FFF) | ((fptrn & 0x001L) << 15);
  49.  
  50.   temp ^= fptrn;
  51.   SetDrPt(&CrawlPort, temp);
  52.   WaitTOF();
  53.   draw_frame();
  54.   SetDrPt(&CrawlPort, fptrn);
  55. }
  56.  
  57. void init_frame(rp, x1,y1, x2,y2)
  58. struct RastPort *rp;
  59. USHORT x1,y1, x2,y2;
  60. { CopyMem(rp, &CrawlPort, sizeof(struct RastPort)); /* make a copy ! */
  61.   SetAPen(&CrawlPort, 1L);
  62.   SetDrMd(&CrawlPort, COMPLEMENT);
  63.   SetDrPt(&CrawlPort, fptrn);
  64.   fbox.x1= x1;  fbox.y1= y1;
  65.   fbox.x2= x2;  fbox.y2= y2;
  66.   draw_frame();
  67. }
  68.  
  69. void resize_frame(x1,y1, x2,y2)
  70. USHORT x1,y1, x2,y2;
  71. { WaitTOF();
  72.   erase_frame();  /* EOR frame away */
  73.   fbox.x1= x1; fbox.y1= y1;
  74.   fbox.x2= x2; fbox.y2= y2;
  75.   WaitTOF();
  76.   draw_frame();   /* draw new frame */
  77. }
  78.  
  79. void grid_frame(frame,pen)
  80. struct frame *frame;
  81. UBYTE pen;
  82. { USHORT x1,y1, x2,y2;
  83.  
  84.   /*
  85.    * RectFill() expects the following relations to be true:
  86.    *
  87.    *               (x1 <= x2) and (y1 <= y2)
  88.    */
  89.  
  90.   if(frame->x1 <= frame->x2) { x1= frame->x1; x2= frame->x2; }
  91.   else { x1= frame->x2; x2= frame->x1; }
  92.   if(frame->y1 <= frame->y2) { y1= frame->y1; y2= frame->y2; }
  93.   else { y1= frame->y2; y2= frame->y1; }
  94.  
  95.   SetAPen(&CrawlPort,pen);
  96.   SetAfPt(&CrawlPort,&gptrn[0],1L);
  97.   RectFill(&CrawlPort,x1,y1,x2,y2);
  98. }
  99.