home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 609b.lha / MandelSquare_v1.3 / Source.LZH / Source / SaveAnim / putanim.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-06  |  4.0 KB  |  164 lines

  1. /* putanim.c
  2.  *   opens an animation iff file by outputing the starting
  3.  *   bitmap.  Then successive change frames may be output
  4.  *   followed by closing the file.
  5.  *
  6.  *   written by G. Bonham      May 1986
  7.  *              SPARTA, Inc.
  8.  *              Laguna Hills, Calif
  9.  */
  10.  
  11. #include <intuition/intuitionbase.h>
  12. #include <graphics/gfxbase.h>
  13. #include <dos/dosextens.h>
  14. #include <exec/memory.h>
  15.  
  16. #include <iff/iff.h>
  17. #include <iff/ilbm.h>
  18. #include <iff/gio.h>
  19. #include <stdio.h>
  20.  
  21. typedef struct
  22. {
  23.     UBYTE    operation;    /* =5 for RIFF style */
  24.     UBYTE    mask;
  25.     UWORD    w,h;
  26.     WORD    x,y;
  27.     ULONG    abstime;    /* for timing w.r.t. start of anim file in jiffies (notused)*/
  28.     ULONG    reltime;    /* for timing w.r.t. last frame in jiffies */
  29.     UBYTE    interleave;    /* =0 for XORing to two frames back, =1 for last frame
  30.                    (not used yet)  */
  31.     UBYTE    pad0;
  32.     ULONG    bits;
  33.     UBYTE    pad[16];
  34. } AnimationHeader;
  35.  
  36. #define BODY_BUFSIZE    512
  37. #define MaxDepth    6
  38.  
  39. #define CkErr(exp) {if(ifferror == IFF_OKAY) ifferror = (exp);}
  40.  
  41. GroupContext fileC, form1C, form2C;
  42.  
  43. LONG Pop;
  44.  
  45. static IFFP ifferror = 0;
  46.  
  47. static UWORD bHw,bHh;
  48. static WORD bHx,bHy;
  49.  
  50. BOOL    OpenAnim(LONG file,struct BitMap *bm,WORD pageW,WORD pageH,WORD *colorMap,ULONG modes,BYTE *buffer,LONG bufsize);
  51. BOOL    AddAnim(struct BitMap *bm,WORD pageW,WORD pageH,WORD pop,BYTE *buffer,LONG bufsize);
  52. BOOL    AddAnim2(LONG *data,LONG ndata,LONG pop);
  53. BOOL    CloseAnim(LONG file);
  54. VOID    InitAnimHdr(AnimationHeader *aH,WORD op);
  55.  
  56. /* =================================================== */
  57.  
  58. BOOL
  59. OpenAnim(LONG file,struct BitMap *bm,WORD pageW,WORD pageH,WORD *colorMap,ULONG modes,BYTE *buffer,LONG bufsize)
  60. {
  61.     UBYTE        depth;
  62.     BitMapHeader    bmHdr;
  63.  
  64.     if((ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1,0,pageW,pageH)) == IFF_OKAY)
  65.     {
  66.         if(bufsize > 2 * BODY_BUFSIZE)
  67.         {
  68.             if(GWriteDeclare(file,buffer + BODY_BUFSIZE,(long)(bufsize - BODY_BUFSIZE)) < 0)
  69.                 ifferror = DOS_ERROR;
  70.  
  71.             bufsize = BODY_BUFSIZE;
  72.         }
  73.     }
  74.  
  75.     depth = bm -> Depth;
  76.  
  77.     if(depth > MaxDepth)
  78.         depth = MaxDepth;
  79.  
  80.     CkErr(OpenWIFF(file,&fileC,(long)szNotYetKnown));
  81.  
  82.     CkErr(StartWGroup(&fileC,(ID)FORM,(long)szNotYetKnown,ID_ANIM,&form1C));
  83.     CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
  84.     CkErr(PutCk(&form2C,ID_BMHD,(long)sizeof(BitMapHeader),(BYTE *)&bmHdr));
  85.  
  86.     if(colorMap)
  87.         CkErr(PutCMAP(&form2C,colorMap,depth));
  88.  
  89.     CkErr(PutCk(&form2C,ID_CAMG,(long)sizeof(CamgChunk),(BYTE *)&modes));
  90.     CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
  91.     CkErr(EndWGroup(&form2C));
  92.     CkErr(CloseWGroup(&form1C));
  93.  
  94.     return((BOOL)(ifferror == IFF_OKAY));
  95. }
  96.  
  97. BOOL
  98. AddAnim(struct BitMap *bm,WORD pageW,WORD pageH,WORD pop,BYTE *buffer,LONG bufsize)
  99. {
  100.     AnimationHeader    animHdr;
  101.     BitMapHeader    bmHdr;
  102.  
  103.     /* InitBMHdr sets w and h and x and y in bmHdr */
  104.  
  105.     Pop = pop;
  106.  
  107.     ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1,0,pageW,pageH);
  108.  
  109.     bHx = bmHdr.x;
  110.     bHy = bmHdr.y;
  111.     bHw = bmHdr.w;
  112.     bHh = bmHdr.h;
  113.  
  114.     InitAnimHdr(&animHdr,pop);
  115.  
  116.     CkErr(OpenWGroup(&fileC,&form1C));
  117.     CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
  118.     CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
  119.     CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
  120.     CkErr(EndWGroup(&form2C));
  121.     CkErr(CloseWGroup(&form1C));
  122.  
  123.     return((BOOL)(ifferror == IFF_OKAY));
  124. }
  125.  
  126. BOOL
  127. AddAnim2(LONG *data,LONG ndata,LONG pop)
  128. {
  129.     AnimationHeader animHdr;
  130.  
  131.     InitAnimHdr(&animHdr,pop);
  132.  
  133.     CkErr(OpenWGroup(&fileC,&form1C));
  134.     CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
  135.     CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
  136.     CkErr(PutCk(&form2C,ID_DLTA,ndata,data));
  137.     CkErr(EndWGroup(&form2C));
  138.     CkErr(CloseWGroup(&form1C));
  139.  
  140.     return((BOOL)(ifferror == IFF_OKAY));
  141. }
  142.  
  143. BOOL
  144. CloseAnim(LONG file)
  145. {
  146.     Pop = 0;
  147.  
  148.     CkErr(PutCkEnd(&fileC));
  149.     CkErr(CloseWGroup(&fileC));
  150.  
  151.     if(GWriteUndeclare(file) < 0 && ifferror == IFF_OKAY)
  152.         ifferror = DOS_ERROR;
  153.  
  154.     return((BOOL)(ifferror == IFF_OKAY));
  155. }
  156.  
  157. VOID
  158. InitAnimHdr(AnimationHeader *aH,WORD op)
  159. {
  160.     memset(aH,0,sizeof(AnimationHeader));
  161.  
  162.     aH -> operation    = op;
  163. }
  164.