/* AnimExample.c - A simple DPaint animation player by Christian A. Weber. This program is in the public domain, use and abuse at your own risk. Requires the iff.library in the LIBS: dircetory. Compiles with Lattice C V5.04 (LC -v -L AnimExample), should also work with Manx. */ #include #include #include #include /* Our iff header file */ struct Library *IntuitionBase,*IFFBase, *OpenLibrary(); struct GfxBase *GfxBase; struct NewScreen ns = { 0,0,0,0,0,0,0, NULL, CUSTOMSCREEN|SCREENBEHIND|SCREENQUIET, NULL, (STRPTR)"Anim Player Example by Christian A. Weber", NULL, NULL }; struct Screen *screen1,*screen2, *OpenScreen(); ULONG *ifffile; void SetOverscan(screen) /* Adjust the screen position for overscan */ register struct Screen *screen; { register WORD cols,rows,x=screen->Width,y=screen->Height; register struct ViewPort *vp=&(screen->ViewPort); cols = GfxBase->NormalDisplayColumns>>1; rows = GfxBase->NormalDisplayRows; if(rows>300) rows>>=1; x -= cols; if(vp->Modes & HIRES) x -= cols; y -= rows; if(vp->Modes & LACE) y -= rows; x >>=1; if(x<0) x=0; y >>=1; if(y<0) y=0; if(y>32) y=32; if(vp->Modes & HAM) /* Correct overscan HAM color distortions */ { if(GfxBase->ActiView->DxOffset-x < 96) x=GfxBase->ActiView->DxOffset-96; } vp->DxOffset = -x; vp->DyOffset = -y; MakeScreen(screen); RethinkDisplay(); } void Fail(text) /* Print error message, free resources and exit */ char *text; { printf("%s, IFFError = %ld\n",text,IFFError()); if(ifffile) CloseIFF(ifffile); if(screen1) CloseScreen(screen1); if(screen2) CloseScreen(screen2); if(IFFBase) CloseLibrary(IFFBase); /* MUST ALWAYS BE CLOSED !! */ CloseLibrary(IntuitionBase); CloseLibrary(GfxBase); exit(0); } void main(argc,argv) int argc; char **argv; { register LONG count,i,delay; register ULONG *form,*loopform; struct BitMapHeader *bmhd; UWORD colortable[128]; if((argc != 4) || !strcmp(argv[1],"?")) { printf("Format: %s filename <# of loops>\n",argv[0]); exit(20); } GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L); IntuitionBase = OpenLibrary("intuition.library",0L); if(!(IFFBase = OpenLibrary(IFFNAME,IFFVERSION))) { printf("Copy the iff.library to your LIBS: directory!\n"); exit(10); } if(!(ifffile=OpenIFF(argv[1]))) Fail("Error opening file"); form=ifffile+3; /* Skip FORM....ANIM */ if(ifffile[2] != ID_ANIM) Fail("Not an ANIM file"); if(!(bmhd=GetBMHD(form))) Fail("BitMapHeader not found"); ns.Width = bmhd->w; ns.Height = bmhd->h; ns.Depth = bmhd->nPlanes; ns.ViewModes = GetViewModes(form); if(!(screen1 = OpenScreen(&ns))) Fail("Can't open screen 1!"); if(!(screen2 = OpenScreen(&ns))) Fail("Can't open screen 2!"); SetOverscan(screen1); SetOverscan(screen2); count = GetColorTab(form,colortable); if(count>32L) count = 32L; /* Some HAM pictures have 64 colors ?! */ LoadRGB4(&(screen1->ViewPort),colortable,count); LoadRGB4(&(screen2->ViewPort),colortable,count); /* Decode and display the first frame: */ if(!DecodePic(form,&screen1->BitMap)) Fail("Can't decode picture"); DecodePic(form,&screen2->BitMap); ScreenToFront(screen2); if((delay=atol(argv[2])) > 1) Delay(delay); /* Decode and display the second frame: copy and modify the first one */ form=FindChunk(ifffile+3,0L); /* First FORM containing a DLTA */ if(!ModifyFrame(form,&screen1->BitMap)) Fail("Can't decode frame"); ScreenToFront(screen1); if(delay>1) Delay(delay); loopform=FindChunk(form,0L); /* FORM to start loop at */ for(i=0; iBitMap)) Fail("Can't decode frame"); dummy=screen1; screen1=screen2; screen2=dummy; /* Flip screens */ ScreenToFront(screen1); if(delay>1) Delay(delay); } } Fail("done"); /* Normal termination */ }