/*
**	ForcePens
**
**	Copyright ©1995, 1996 by Daniel Balster
**
*/

#include <exec/exec.h>
#include <dos/dos.h>
#include <utility/hooks.h>
#include <intuition/intuition.h>

#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>

#include <string.h>
#include <stdlib.h>

/****************************************************/
//#define DEBUG

#ifdef DEBUG
void kprintf(UBYTE *fmt,...);
#define bug kprintf
#define D(X) X
#else
#define D(X)
#endif

#define AllocStruct(X)	AllocVec(sizeof(struct X),MEMF_CLEAR|MEMF_PUBLIC)
#define FreeStruct(X)	if (X) FreeVec(X)

#define ifnot(expr)	if(!(expr))

typedef enum { false=0, true=~(false) } bool;
/****************************************************/

/* OpenWorkBench */
#define VEC -0xd2
#define LIB (struct Library*) IntuitionBase

extern APTR NewVector;
extern APTR OldVector;

extern long __oslibversion = 37L;

static char vers[] = "$VER: ForcePens 1.1 (29.1.96) ©1996 Daniel Balster";

/* bad style, but works */

#define TEMPL	"PEN1/N/A,R1/N/A,G1/N/A,B1/N/A,PEN2/N/A,R2/N/A,G2/N/A,B2/N/A,PEN3/N/A,R3/N/A,G3/N/A,B3/N/A,PEN4/N/A,R4/N/A,G4/N/A,B4/N/A,BORDERMAGIC/N,QUIET/S"

struct {
	ULONG *pen1,*r1,*g1,*b1;
	ULONG *pen2,*r2,*g2,*b2;
	ULONG *pen3,*r3,*g3,*b3;
	ULONG *pen4,*r4,*g4,*b4;
	ULONG *bordermagic;
	ULONG quiet;
} args = {0};


VOID __asm newfunc (register __a0 struct Screen *scr)
{
	struct ViewPort *vp = &(scr->ViewPort);
	struct ColorMap *cm = vp->ColorMap;

	if (args.bordermagic) scr->WBorBottom = *args.bordermagic;

	if ( *args.pen1 == ObtainPen (cm, *args.pen1, *args.r1, *args.g1, *args.b1, PEN_EXCLUSIVE) )
	if ( *args.pen2 == ObtainPen (cm, *args.pen2, *args.r2, *args.g2, *args.b2, PEN_EXCLUSIVE) )
	if ( *args.pen3 == ObtainPen (cm, *args.pen3, *args.r3, *args.g3, *args.b3, PEN_EXCLUSIVE) )
	if ( *args.pen4 == ObtainPen (cm, *args.pen4, *args.r4, *args.g4, *args.b4, PEN_EXCLUSIVE) )
	{
		SetRGB32 (vp, *args.pen1, (*args.r1<<24)|0xffffff, (*args.g1<<24)|0xffffff, (*args.b1<<24)|0xffffff);
		SetRGB32 (vp, *args.pen2, (*args.r2<<24)|0xffffff, (*args.g2<<24)|0xffffff, (*args.b2<<24)|0xffffff);
		SetRGB32 (vp, *args.pen3, (*args.r3<<24)|0xffffff, (*args.g3<<24)|0xffffff, (*args.b3<<24)|0xffffff);
		SetRGB32 (vp, *args.pen4, (*args.r4<<24)|0xffffff, (*args.g4<<24)|0xffffff, (*args.b4<<24)|0xffffff);
	}
}

int main ()
{
	struct RDArgs *rda;
	
	if (rda = ReadArgs(TEMPL,(LONG*)&args,NULL))
	{
		if (!args.quiet) PutStr(
"*** ForcePens 1.1 ***\n"
"Copyright © 1996 by Daniel Balster\n"
"All Rights Reserved.\n");

		Disable();
		OldVector = SetFunction (LIB,VEC,(ULONG(*)())&(NewVector));
		CacheClearU();
		Enable();

		Wait (SIGBREAKF_CTRL_C);
		
		if (FindPort("SetMan"))
		{
			Disable();
			SetFunction (LIB,VEC,(ULONG(*)())(OldVector));
			CacheClearU();
			Enable();
		}
		else Wait(0);

		FreeArgs(rda);
	}
	else PrintFault(IoErr(),0);

	return 0;
}
