/*
	ShowIFF.c  -  an easy IFF file view program by Christian A. Weber
	Requires the iff.library (in the LIBS: dircetory or in a ROM)
	This program may be freely used and modified!
	I compiled it with Aztec C V3.6, it should also work with Lattice.
*/

#include <exec/types.h>
#include <graphics/gfxbase.h>
#include <intuition/intuition.h>
#include <libraries/iff.h>

struct Library *IntuitionBase,*IFFBase=NULL, *OpenLibrary();
struct GfxBase *GfxBase;

struct NewScreen ns =
{
	0,0,0,0,0,0,0, NULL, CUSTOMSCREEN|SCREENQUIET, NULL,
	(STRPTR)"ShowIFF by Christian A. Weber", NULL, NULL
};

struct Screen *myscreen = NULL, *OpenScreen();
APTR ifffile = NULL;

void SetOverscan(screen,x,y,modes)
register struct Screen *screen;
register WORD x,y,modes;
{
	register WORD rows;

	rows = GfxBase->NormalDisplayRows; if(rows>300) rows>>=1;

	if(modes & HIRES) x -= 320;   x -= 320;
	if(modes & LACE)  y -= rows;  y -= rows;

	x >>=1; if(x>32) x=32; if(x<0) x=0;
	y >>=1; if(y>36) y=36; if(y<0) y=0;

	screen->ViewPort.DxOffset -= x;
	screen->ViewPort.DyOffset -= y;

	RemakeDisplay();
}


main(argc,argv)
int argc;
char **argv;
{
	long count,i;
	UWORD colortable[128];
	struct BitMapHeader *bmhd;

	if((argc != 2) || !strcmp(argv[1],"?")) {
		printf("Format: %s filename\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);
	}

	printf("Loading file %s ... ",argv[1]);

	if(!(ifffile=OpenIFF(argv[1]))) Fail("Error opening file");

	if(!(bmhd=GetBMHD(ifffile)))    Fail("BitMapHeader not found");

	ns.Width      = bmhd->w;
	ns.Height     = bmhd->h;
	ns.Depth      = bmhd->nPlanes;
	ns.ViewModes  = GetViewModes(ifffile);

	if(!(myscreen = OpenScreen(&ns))) Fail("Can't open screen!");
	SetOverscan(myscreen,ns.Width,ns.Height,ns.ViewModes);

	count = GetColorTab(ifffile,colortable);
	if(count>32L) count = 32L; /* Some HAM pictures have 64 colors ?! */
	LoadRGB4(&(myscreen->ViewPort),colortable,count);

	if(!DecodePic(ifffile,&myscreen->BitMap)) Fail("Can't decode picture");

	for(i=0; i<100; ++i)
	{
		if(!((*((UBYTE*)0xbfe001))&64)) break;	/* I know it's a hack */
		Delay(5L);
	}

	Fail("done"); /* Close the whole stuff */
}


Fail(text)
char *text;
{
	if(ifffile) CloseIFF(ifffile);
	if(myscreen) CloseScreen(myscreen);

	printf("%s\n",text);
	printf("IffError = %ld\n",IffError());

	if(IFFBase) CloseLibrary(IFFBase);	/* MUST ALWAYS BE CLOSED !! */
	CloseLibrary(IntuitionBase);
	CloseLibrary(GfxBase);
	exit(0);
}

