home *** CD-ROM | disk | FTP | other *** search
/ Graphics 16,000 / graphics-16000.iso / amiga / fractal / mandlsqr / source / playanim / playanim.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-05  |  4.4 KB  |  256 lines

  1. /* PlayAnim.c
  2.  *
  3.  * Load an ILBM raster image file from C structures in memory
  4.  * into an existing bitmap (preloaded files from PreLoadAnim).
  5.  *
  6.  * Written by Gary Bonham, Sparta, Inc.  15 Aug 1986
  7.  * Modified by Olaf `Olsen' Barthel, 16-Sep-1991
  8.  *
  9.  */
  10.  
  11. #include <libraries/dosextens.h>
  12. #include <intuition/intuition.h>
  13.  
  14. #include "ilbm.h"
  15. #include "preloadanim.h"
  16.  
  17. #define UGetByte()    (*source++)
  18. #define UPutByte(c)    (*dest++ = (c))
  19.  
  20. extern BYTE         CheckAbort();
  21.  
  22. extern VOID         FrameSetup(ULONG jiffies);
  23. extern VOID         FrameSync(VOID);
  24. extern VOID         SwapBits(VOID);
  25. extern VOID         CopyBits(VOID);
  26. extern VOID         LoadPalette(UWORD *Palette);
  27. extern VOID __asm     decode_vkplane(register __a0 UBYTE *deltabyte,register __a2 PLANEPTR plane,register __d2 UWORD bytesperrow);
  28.  
  29. STATIC VOID __regargs     UnPackRow(BYTE **pSource,BYTE **pDest,WORD srcBytes0,WORD dstBytes0);
  30. STATIC VOID __regargs     SetRIFF(struct BitMap *bm,struct FrameHD *cfr);
  31. STATIC VOID __regargs     SetBODY(struct BitMap *bm,struct FrameHD *cfr);
  32. BYTE             PlayAnim(VOID);
  33.  
  34. extern struct IFFfile    *IFFfileList;
  35. extern struct BitMap    *DrawBitMap;
  36. STATIC BitMapHeader     masterbmhd;
  37.  
  38. STATIC VOID __regargs
  39. UnPackRow(BYTE **pSource,BYTE **pDest,WORD srcBytes0,WORD dstBytes0)
  40. {
  41.     BYTE    *source        = *pSource,
  42.         *dest        = *pDest,c;
  43.     WORD    n,
  44.         srcBytes    = srcBytes0,
  45.         dstBytes    = dstBytes0;
  46.         
  47.     while(dstBytes > 0)
  48.     {
  49.         if((--srcBytes) < 0)
  50.             break;
  51.  
  52.         if((n = UGetByte()) >= 0)
  53.         {
  54.             n++;
  55.  
  56.             if((srcBytes -= n) < 0)
  57.                 break;
  58.  
  59.             if((dstBytes -= n) < 0)
  60.                 break;
  61.  
  62.             do
  63.                 UPutByte(UGetByte());
  64.             while(--n);
  65.         }
  66.         else
  67.         {
  68.             if(n != (WORD)(-128))    /* compiler generates a cmp.w! */
  69.             {
  70.                 n = -n + 1;
  71.  
  72.                 if((--srcBytes) < 0)
  73.                     break;
  74.  
  75.                 if((dstBytes -= n) < 0)
  76.                     break;
  77.  
  78.                 c = UGetByte();
  79.  
  80.                 do
  81.                     UPutByte(c);
  82.                 while(--n);
  83.             }
  84.         }
  85.     }
  86.  
  87.     *pSource    = source;
  88.     *pDest        = dest;
  89. }
  90.  
  91. STATIC VOID __regargs
  92. SetRIFF(struct BitMap *bm,struct FrameHD *cfr)
  93. {
  94.     UBYTE    *deltabyte;
  95.     LONG    *deltadata;
  96.     int     i;
  97.  
  98.     deltadata = (LONG *)cfr -> body;
  99.  
  100.     for(i = 0 ; i < bm -> Depth ; i++)
  101.     {
  102.         if(deltadata[i])
  103.         {
  104.             deltabyte = (UBYTE *)deltadata + deltadata[i];
  105.  
  106.             decode_vkplane(deltabyte,bm -> Planes[i],bm -> BytesPerRow);
  107.         }
  108.     }
  109. }
  110.  
  111. STATIC VOID __regargs
  112. SetBODY(struct BitMap *bm,struct FrameHD *cfr)
  113. {
  114.     LONG     x,y,deltabyte,i,irow,ip;
  115.     BYTE    *planes[9],*ss,**dd;
  116.     WORD      srcRowBytes,w,h;
  117.     UBYTE     mask;
  118.  
  119.     if(cfr -> anhd)
  120.     {
  121.         w = cfr -> anhd -> w;
  122.         h = cfr -> anhd -> h;
  123.         x = cfr -> anhd -> x;
  124.         y = cfr -> anhd -> y;
  125.  
  126.         mask = cfr -> anhd -> mask;
  127.     }
  128.     else
  129.     {
  130.         w = cfr -> bmhd -> w;
  131.         h = cfr -> bmhd -> h;
  132.         x = cfr -> bmhd -> x;
  133.         y = cfr -> bmhd -> y;
  134.  
  135.         mask = 0xFF;
  136.     }
  137.  
  138.     srcRowBytes    = RowBytes(w);
  139.     deltabyte    = (masterbmhd . pageWidth >> 3) - (w >> 3);
  140.  
  141.     /* assume cmpByteRun1 data compression */
  142.  
  143.     for(i = 0 ; i < masterbmhd . nPlanes ; i++)
  144.     {
  145.         if((mask >> i) & 1)
  146.             planes[i] = (BYTE *)bm -> Planes[i] + y * bm -> BytesPerRow + (x >> 3);
  147.         else
  148.             planes[i] = NULL;
  149.     }
  150.  
  151.     ss = (BYTE *)cfr -> body;
  152.  
  153.     for(irow = h ; irow > 0 ; irow--)
  154.     {
  155.         for(ip = 0 ; ip < masterbmhd . nPlanes ; ip++)
  156.         {
  157.             if(planes[ip])
  158.             {
  159.                 dd = &planes[ip];
  160.  
  161.                 UnPackRow(&ss,dd,10000,srcRowBytes);
  162.  
  163.                 planes[ip] += deltabyte;
  164.             }
  165.         }
  166.     }
  167. }
  168.  
  169. BYTE
  170. PlayAnim()
  171. {
  172.     struct FrameHD    *currentframe    = IFFfileList -> firstframe;
  173.     BYTE         firstframe    = TRUE;
  174.     ULONG         FrameSkip    = 0;
  175.     UBYTE         Pop        = 0;
  176.  
  177.     while(currentframe)
  178.     {
  179.         if(firstframe)
  180.         {
  181.             if(currentframe -> bmhd)
  182.                 masterbmhd = *currentframe -> bmhd;
  183.         }
  184.         else
  185.         {
  186.             if(currentframe -> bmhd)
  187.                 masterbmhd = *currentframe -> bmhd;
  188.         }
  189.  
  190.         if(currentframe -> anhd)
  191.         {
  192.             Pop        = currentframe -> anhd -> operation;
  193.             FrameSkip    = currentframe -> anhd -> reltime;
  194.         }
  195.  
  196.         if(currentframe -> nColorRegs)
  197.             LoadPalette(currentframe->cmap);
  198.  
  199.         if(FrameSkip)
  200.         {
  201.             FrameSetup(FrameSkip);
  202.  
  203.             FrameSkip = 0;
  204.  
  205.             if(Pop >= 2)
  206.             {
  207.                 if(currentframe -> body)
  208.                 {
  209.                     if(Pop == 5)
  210.                         SetRIFF(DrawBitMap,currentframe);
  211.                 }
  212.             }
  213.             else
  214.             {
  215.                 if(currentframe -> body)
  216.                     SetBODY(DrawBitMap,currentframe);
  217.             }
  218.  
  219.             FrameSync();
  220.         }
  221.         else
  222.         {
  223.             if(Pop >= 2)
  224.             {
  225.                 if(currentframe -> body)
  226.                 {
  227.                     if(Pop == 5)
  228.                         SetRIFF(DrawBitMap,currentframe);
  229.                 }
  230.             }
  231.             else
  232.             {
  233.                 if(currentframe -> body)
  234.                     SetBODY(DrawBitMap,currentframe);
  235.             }
  236.         }
  237.  
  238.         SwapBits();
  239.  
  240.         if(CheckAbort())
  241.             return(FALSE);
  242.  
  243.         if(firstframe)
  244.         {
  245.             CopyBits();
  246.  
  247.             firstframe = FALSE;
  248.         }
  249.  
  250.         if(currentframe)
  251.             currentframe = currentframe -> next;
  252.     }
  253.  
  254.     return(TRUE);
  255. }
  256.