home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 038.lha / MeltILBM / meltvp.c < prev    next >
C/C++ Source or Header  |  1987-05-16  |  3KB  |  86 lines

  1. /************************************************************************
  2.  * meltviewport(struct ViewPort *,LONG);
  3.  *    by Mark Nuiver 05/24/87
  4.  *    most of the code is borrowed from Stephen Coy's "Melt.c"
  5.  * program.
  6.  *    The code is modified here into a general function to "melt"
  7.  * any ViewPort.
  8.  *    Function is called as meltviewport(vp,secs); with vp being a pointer
  9.  * to a ViewPort struct and secs a LONG number of seconds to melt before
  10.  * returning.
  11.  *
  12.  * COMPILER INFORMATION:
  13.  *    Lattice C version 3.10
  14.  *    AmigaDOS 1.2
  15.  * LINKING INFORMATION:
  16.  *    link with LIB:lcm.lib (first library)
  17.  ***********************************************************************/
  18.  
  19. #include <exec/types.h>
  20. #include <exec/nodes.h>
  21. #include <exec/lists.h>
  22. #include <exec/tasks.h>
  23. #include <exec/ports.h>
  24. #include <exec/io.h>
  25.  
  26. #include <graphics/gfx.h>
  27. #include <graphics/view.h>
  28.  
  29. #include <intuition/intuition.h>
  30.  
  31. #include <math.h>
  32.  
  33. extern struct IntuiMessage *GetMsg();
  34. extern struct MsgPort      *CreatePort();
  35.  
  36. void meltviewport(vp,secs) struct ViewPort *vp;
  37.                            LONG secs; {
  38.    struct BitMap   *bitmap;
  39.    struct timerequest tr;
  40.    LONG   x, y,         /* start positions       */
  41.           dx, dy,       /* offsets               */
  42.           u, v;         /* size                  */
  43.    LONG   TempA[32];    /* temp buffer           */
  44.    UBYTE  mask;         /* bit-plane mask for blitter   */
  45.    SHORT  width,height;
  46.    UBYTE  depth;
  47.  
  48. /* create a reply port for the timer device */
  49.    if ((tr.tr_node.io_Message.mn_ReplyPort = CreatePort(0,0)) == NULL)
  50.       return;
  51. /* open the timer device */
  52.    if (OpenDevice(TIMERNAME,UNIT_VBLANK,&tr,0) != NULL) return;
  53. /* send a time request */
  54.    tr.tr_node.io_Command = TR_ADDREQUEST;
  55.    tr.tr_node.io_Message.mn_Node.ln_Pri = 10;
  56.    tr.tr_time.tv_secs = secs;
  57.    tr.tr_time.tv_micro = 0;
  58.    SendIO(&tr);
  59.  
  60.    bitmap = vp->RasInfo->BitMap;
  61.    width = vp->DWidth;
  62.    height = vp->DHeight;
  63.    depth = bitmap->Depth;
  64. /* do until the timerequest is returned */
  65.    FOREVER {
  66.      if(CheckIO(&tr) != NULL) {
  67.          CloseDevice(&tr);
  68.          return;
  69.      }
  70.  
  71.      for(mask=1; mask<((1<<depth)-1); mask*=2) {
  72.        u = (drand48() * (width - 3)) + 1;
  73.        v = (drand48() * (height - 3)) + 1;
  74.        x = (drand48() * (width - 1 - u)) + 1;
  75.        y = (drand48() * (height - 2 - v)) + 1;
  76.        dx = (drand48() * 3) - 1;
  77.        dy = drand48() * 3;
  78.  
  79.        BltBitMap(bitmap, x, y,
  80.                  bitmap, x+dx, y+dy,
  81.                  u, v, 0x0c0, mask, TempA);
  82.  
  83.      }
  84.    }     /* end of FOREVER */
  85. }     /* end of meltviewport */
  86.