#include	<exec/types.h>
#include 	<exec/nodes.h>
#include	<exec/libraries.h>
#include	<graphics/gfx.h>
#include	<graphics/rastport.h>
#include	<graphics/text.h>
#include	<intuition/intuition.h>
#include 	<stdio.h>
#include 	"jiff.h"

struct Screen *show_iff();
struct ILBM_info *load_iff();

extern struct Screen *OpenScreen();

struct NewScreen ShowNewScreen;

struct Screen *EagleScreen, *ControlScreen;

struct ILBM_info *EagleInfo, *ControlInfo;

void
put_ea_cmap(screen, cmap, colors)
struct Screen *screen;
unsigned char *cmap;
int colors;
{
	int i;

	for (i=0; i<colors; i++)
		SetRGB4(&screen->ViewPort, i,
			(long)cmap[3*i+0]>>4, (long)cmap[3*i+1]>>4, (long)cmap[3*i+2]>>4);
}

void
show_cleanup()
{
	if (EagleScreen != NULL)
		CloseScreen(EagleScreen);
	if (ControlScreen != NULL)
		CloseScreen(ControlScreen);
	if (EagleInfo) 
		free_image(EagleInfo);
	if (ControlInfo) 
		free_image(ControlInfo);
}

show_init()
{
	EagleScreen = NULL;
	ControlScreen = NULL;
	EagleInfo = NULL;
	ControlInfo = NULL;

	add_cleanup(show_cleanup, "show");
	if(EagleInfo = load_iff("lander.ilbm"))
		ControlInfo = load_iff("control.ilbm");
}

struct Screen *show_iff(info)
struct ILBM_info *info;
{
	struct Screen *screen;

	ShowNewScreen.LeftEdge = 0;
	ShowNewScreen.TopEdge = 0;
	ShowNewScreen.Width = info->header.w;
	ShowNewScreen.Height = info->header.h;
	ShowNewScreen.Depth = info->header.nPlanes;
	if((info->viewmode & HAM) != HAM &&
	   (info->viewmode & DUALPF) != DUALPF &&
	   info->header.nPlanes > 5
	) {
		info->viewmode |= HAM;
	}
	ShowNewScreen.ViewModes = info->viewmode;
	ShowNewScreen.Type = CUSTOMSCREEN | CUSTOMBITMAP | SCREENQUIET | SCREENBEHIND;
	ShowNewScreen.Font = NULL;
	ShowNewScreen.DefaultTitle = NULL;
	ShowNewScreen.Gadgets = NULL;
	ShowNewScreen.CustomBitMap = &info->bitmap;
	if ( (screen = OpenScreen(&ShowNewScreen) ) != NULL)
		put_ea_cmap(screen, info->cmap, info->colors);
	ScreenToFront(screen);
	return screen;
}

struct ILBM_info *load_iff(file)
char *file;
{
	return read_iff(file, 0);
}

ShowEagle()
{
	if(EagleInfo)
		EagleScreen = show_iff(EagleInfo);
}

HideEagle()
{
	if(EagleScreen) {
		CloseScreen(EagleScreen);
		EagleScreen = 0;
	}
}

ShowControl()
{
	if(ControlInfo)
		ControlScreen = show_iff(ControlInfo);
}

HideControl()
{
	if(ControlScreen) {
		CloseScreen(ControlScreen);
		ControlScreen = 0;
	}
}
