home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 311.lha / Wipedemo_v4.0 / cycler.c next >
C/C++ Source or Header  |  1980-12-10  |  5KB  |  206 lines

  1. #include "jiff.h"
  2.  
  3. struct IORequest *CreateIOTask(length,tsk)
  4. int length;
  5. struct Task *tsk;
  6. {
  7. struct IORequest *ioreq;
  8. struct MsgPort *port;
  9.  
  10.    ioreq = AllocMem((long) length,MEMF_CLEAR|MEMF_PUBLIC);
  11.    if (ioreq == NULL)
  12.       return(NULL);
  13.    port = AllocMem((long) sizeof(struct MsgPort),MEMF_CLEAR|MEMF_PUBLIC);
  14.    port->mp_Node.ln_Name = "WIPE MSGPORT";
  15.    port->mp_Node.ln_Pri = 0;
  16.    port->mp_Node.ln_Type = NT_MSGPORT;
  17.    port->mp_Flags = PA_SIGNAL;
  18.    port->mp_SigBit = 31;
  19.    port->mp_SigTask = tsk;
  20.    tsk->tc_SigAlloc = 0x80000000;
  21.    AddPort(port);
  22.    ioreq->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  23.    ioreq->io_Message.mn_Length = length;
  24.    ioreq->io_Message.mn_ReplyPort = port;
  25.    return(ioreq);
  26. }
  27.  
  28. DeleteIOPort(port)
  29. struct MsgPort *port;
  30. {
  31.    RemPort(port);
  32.    FreeMem(port,(LONG) sizeof(*port));
  33. }
  34.  
  35. CycleScreen(scrn,info)
  36. struct Screen *scrn;
  37. struct ILBM_info *info;
  38. {
  39. int t0;
  40.  
  41.    for (t0 = 0; t0 != 6; t0++)
  42.       if (info->crng[t0].rate && info->crng[t0].active)
  43.          if (info->crng[t0].low != info->crng[t0].high)
  44.             {
  45.             if (info->crng[t0].active == 3)
  46.                AddCringe(t0,(int) info->crng[t0].high,
  47.                   (int) info->crng[t0].low,info->crng[t0].rate,
  48.                   &scrn->ViewPort);
  49.             else
  50.                AddCringe(t0,(int) info->crng[t0].low,
  51.                   (int) info->crng[t0].high,info->crng[t0].rate,
  52.                   &scrn->ViewPort);
  53.             }
  54. }
  55.  
  56. void CringeTimer();
  57. struct Task *CringeTask[6] = {0,0,0,0,0,0};
  58. struct timerequest *CringeReq[6];
  59. int start[6],finish[6];
  60. long seclist[6],miclist[6];
  61. struct ViewPort *sport;
  62.  
  63. AddCringe(num,st,fin,rate,port)
  64. int num,st,fin;
  65. UWORD rate;
  66. struct ViewPort *port;
  67. {
  68. APTR Stack;
  69. double delwk;
  70. long secs,micros;
  71.  
  72.    sport = port;
  73.    start[num] = st;
  74.    finish[num] = fin;
  75.    delwk = (16384.0/rate)*16666.666667;
  76.    secs = (delwk/1000000.0);
  77.    micros = ((long) delwk) % 1000000;
  78.    CringeTask[num] = (struct Task *) AllocMem((long) sizeof(struct Task),
  79.          MEMF_PUBLIC|MEMF_CLEAR);
  80.    if (!CringeTask[num])
  81.       return;
  82.    Stack = (APTR) AllocMem(1024L,MEMF_CLEAR);
  83.    if (!Stack)
  84.       {
  85.       FreeMem(CringeTask[num],(long) sizeof(struct Task));
  86.       return;
  87.       }
  88.    CringeReq[num] = (struct timerequest *)
  89.       CreateIOTask(sizeof(struct timerequest),CringeTask[num]);
  90.    CringeReq[num]->tr_node.io_Command = TR_ADDREQUEST;
  91.    OpenDevice(TIMERNAME,UNIT_MICROHZ,CringeReq[num],0L);
  92.    seclist[num] = secs;
  93.    miclist[num] = micros;
  94.    CringeTask[num]->tc_SPLower = Stack;
  95.    CringeTask[num]->tc_SPUpper = (APTR) (1024+(ULONG) Stack);
  96.    CringeTask[num]->tc_SPReg = CringeTask[num]->tc_SPUpper;
  97.    CringeTask[num]->tc_Node.ln_Type = NT_TASK;
  98.    CringeTask[num]->tc_Node.ln_Pri = 1;
  99.    CringeTask[num]->tc_Node.ln_Name = "Cringing";
  100.    AddTask(CringeTask[num],CringeTimer,0L);
  101. }
  102.  
  103. StopCringe()
  104. {
  105. int num;
  106.  
  107.   for (num = 0; num != 6; num++)
  108.    if (CringeTask[num])
  109.       {
  110.       RemTask(CringeTask[num]);
  111.       FreeMem(CringeTask[num]->tc_SPLower,1024L);
  112.       FreeMem(CringeTask[num],(long) sizeof(struct Task));
  113.       AbortIO(CringeReq[num]);
  114.       CloseDevice(CringeReq[num]);
  115.       DeleteIOPort(CringeReq[num]->tr_node.io_Message.mn_ReplyPort);
  116.       DeleteExtIO(CringeReq[num],(long) sizeof(struct timerequest));
  117.       CringeTask[num] = 0;
  118.       }
  119. }
  120.  
  121. void CringeTimer()
  122. {
  123. long st,fi,t0,num,sc,mc;
  124. struct ColorMap *smap;
  125. struct Task *mytask;
  126.  
  127.    geta4();
  128.    mytask = FindTask(0L);
  129.    for (num = 0; num != 6; num++)
  130.       if (CringeTask[num] == mytask)
  131.          break;
  132.    st = start[num];
  133.    fi = finish[num];
  134.    sc = seclist[num];
  135.    mc = miclist[num];
  136.    smap = sport->ColorMap;
  137.    FOREVER
  138.       {
  139.       CringeReq[num]->tr_time.tv_secs = sc;
  140.       CringeReq[num]->tr_time.tv_micro = mc;
  141.       DoIO(CringeReq[num]);
  142.       if (st < fi)
  143.          FWrap(smap,st,fi);
  144.       else
  145.          BWrap(smap,fi,st);
  146.       }
  147. }
  148.  
  149. FWrap(cmap,s,f)
  150. struct ColorMap *cmap;
  151. long s,f;
  152. {
  153. long t0;
  154. UWORD a,b;
  155.  
  156.    Forbid();
  157.    a = GetRGB4(cmap,f);
  158.    for (t0 = f-1; t0 >= s; t0--)
  159.       {
  160.       b = GetRGB4(cmap,t0);
  161.       SetRGB4(sport,t0+1L,(b >> 8) & 0x0fL,(b >> 4) & 0x0fL,b & 0x0fL);
  162.       }
  163.    SetRGB4(sport,s,(a >> 8) & 0x0fL,(a >> 4) & 0x0fL,a & 0x0fL);
  164.    Permit();
  165. }
  166.  
  167. BWrap(cmap,s,f)
  168. struct ColorMap *cmap;
  169. long s,f;
  170. {
  171. long t0;
  172. UWORD a,b;
  173.  
  174.    Forbid();
  175.    a = GetRGB4(cmap,s);
  176.    for (t0 = s+1; t0 <= f; t0++)
  177.       {
  178.       b = GetRGB4(cmap,t0);
  179.       SetRGB4(sport,t0-1L,(b >> 8) & 0x0fL,(b >> 4) & 0x0fL,b & 0x0fL);
  180.       }
  181.    SetRGB4(sport,f,(a >> 8) & 0x0fL,(a >> 4) & 0x0fL,a & 0x0fL);
  182.    Permit();
  183. }
  184.  
  185. WipeOut(vp,rp,cmap,ncmap,mx,my,topcol)
  186. UWORD *cmap;
  187. UBYTE *ncmap;
  188. struct RastPort *rp;
  189. struct ViewPort *vp;
  190. int topcol;
  191. long mx,my;
  192. {
  193. int col;
  194. long y,r,g,b;
  195.  
  196.    SetAPen(rp,0L);
  197.    for (y = 0; y != my; y++)
  198.       RectFill(rp,0L,y,mx-1,y);
  199.    for (col = 0; col != topcol; col++)
  200.       {
  201.       r = ncmap[col*3]; g = ncmap[col*3+1]; b = ncmap[col*3+2];
  202.       SetRGB4(vp,(long) col,r,g,b);
  203.       cmap[col] = (r << 8) | (g << 4) | b;
  204.       }
  205. }
  206.