//////////////////////////////////////////////////////////////////////////////
//
//  This file is part of the Atari Machine Specific Library,
//  and is Copyright 1992 by Warwick W. Allison.
//
//  You are free to copy and modify these sources, provided you acknoledge
//  the origin by retaining this notice, and adhere to the conditions
//  described in the file COPYING.
//
//////////////////////////////////////////////////////////////////////////////

#include <linea.h>
#include "SmallGraphics.h"

static short Pattern[4]={0xffff,0xffff,0xffff,0xffff};

void InitSmallGraphics()
{
	linea0();
	__aline->_LNMASK=0xffff;
	__aline->_PTSIN[0]=0;
	__aline->_PTSIN[1]=0;
	__aline->_WMODE=0;
	__aline->_LNMASK=0xffff;
	__aline->_LSTLIN=-1;
	__aline->_PATPTR=Pattern;
	__aline->_PATMSK=4;
	__aline->_MFILL=0;
	__aline->_CLIP=0;
}

void Colour(int C)
{
	__aline->_INTIN[0]=C;
	__aline->_COLBIT0=C&1;
	__aline->_COLBIT1=C&2;
	__aline->_COLBIT2=C&4;
	__aline->_COLBIT3=C&8;
}

void Plot(int x, int y)
{
	__aline->_PTSIN[0]=x;
	__aline->_PTSIN[1]=y;
	linea1();
}

void Plot(int x, int y, int C)
{
	Colour(C);
	__aline->_PTSIN[0]=x;
	__aline->_PTSIN[1]=y;
	linea1();
}

int ColourAt(int x, int y)
{
	__aline->_PTSIN[0]=x;
	__aline->_PTSIN[1]=y;
	return linea2();
}

void Line(int x, int y)
{
	__aline->_PTSIN[2]=__aline->_PTSIN[0];
	__aline->_PTSIN[3]=__aline->_PTSIN[1];
	__aline->_PTSIN[0]=x;
	__aline->_PTSIN[1]=y;
	linea3();
}

void Line(int x1, int y1, int x2, int y2)
{
/*
	__aline->_PTSIN[0]=x1;
	__aline->_PTSIN[1]=y1;
	__aline->_PTSIN[2]=x2;
	__aline->_PTSIN[3]=y2;
*/
	__aline->_X1=x1;
	__aline->_Y1=y1;
	__aline->_X2=x2;
	__aline->_Y2=y2;
	linea3();
}

void Rectangle(int x1, int y1, int x2, int y2)
{
	__aline->_PTSIN[0]=x1;
	__aline->_PTSIN[1]=y1;
	__aline->_PTSIN[2]=x2;
	__aline->_PTSIN[3]=y2;
	linea5();
}

void Fill(int x, int y)
{
	__aline->_PTSIN[0]=x;
	__aline->_PTSIN[1]=y;
	lineae();
}

int MaxX()
{
	return V_X_MAX;
}

int MaxY()
{
	return V_Y_MAX;
}
/*
IMPLEMENTATION MODULE SmallGraphics;

FROM BIOS		IMPORT bconout,setColor,PalleteArray,setPallete;
FROM LINEA		IMPORT AInit,PutPixel,DrawLine,FilledRectangle,PInterface,PFontList,Interface,GetPixel;
FROM SYSTEM		IMPORT ADR;
FROM Resolutions	IMPORT CurrentResolution,ScreenWidth,ScreenHeight,Resolution;
FROM RunSupport		IMPORT UponTermination;


VAR	Iface:PInterface;
	Fonts:PFontList;
	Col:CARDINAL;
	Pattern:ARRAY [0..15] OF CARDINAL;


PROCEDURE SolidPattern;
VAR	i:CARDINAL;
BEGIN
	FOR i:=0 TO 15 DO
		Pattern[i]:=65535;
	END;
END SolidPattern;


PROCEDURE Colour(c:CARDINAL);
BEGIN
	Col:=c;
END Colour;


VAR	OldCol:CARDINAL;
PROCEDURE SetColourPlanes;

VAR	c:CARDINAL;

BEGIN
	IF OldCol<>Col THEN
		OldCol:=Col;
		c:=Col;
		WITH Iface^ DO
			IF c>=8 THEN
				c:=c-8;
				COLBIT[3]:=1;
			ELSE
				COLBIT[3]:=0;
			END;
			IF c>=4 THEN
				c:=c-4;
				COLBIT[2]:=1;
			ELSE
				COLBIT[2]:=0;
			END;
			IF c>=2 THEN
				c:=c-2;
				COLBIT[1]:=1;
			ELSE
				COLBIT[1]:=0;
			END;
			IF c>=1 THEN
				COLBIT[0]:=1;
			ELSE
				COLBIT[0]:=0;
			END;
		END;
	END;
END SetColourPlanes;


PROCEDURE Bar(x,y,w,h:CARDINAL);
BEGIN
	SetColourPlanes;
	WITH Iface^ DO
		X1:=x;
		Y1:=y;
		X2:=x+w-1;
		Y2:=y+h-1;
	END;

	FilledRectangle;
END Bar;


PROCEDURE Plot(x,y:CARDINAL);
BEGIN
	PutPixel(Col,x,y)
	WITH Iface^ DO
		X2:=x;
		Y2:=y;
	END;
END Plot;

PROCEDURE ColourAt(x,y:CARDINAL):CARDINAL;
(* Get colour at (x,y) *)
BEGIN
	RETURN GetPixel(x,y)
END ColourAt;

PROCEDURE LineTo(x,y:CARDINAL);
BEGIN
	SetColourPlanes;
	WITH Iface^ DO
		X1:=x;
		Y1:=y;
		DrawLine;
		X2:=x;
		Y2:=y;
	END;
END LineTo;

PROCEDURE Line(x1,y1,x2,y2:CARDINAL);
BEGIN
	SetColourPlanes;
	WITH Iface^ DO
		X1:=x1;
		Y1:=y1
		X2:=x2;
		Y2:=y2;
		DrawLine;
	END;
END Line;


PROCEDURE SetScreenSize;
BEGIN
	WITH Iface^ DO
		XMINCL:=0;
		YMINCL:=0;
		XMAXCL:=ScreenWidth[CurrentResolution]-1;
		YMAXCL:=ScreenHeight[CurrentResolution]-1;
(*
		CASE CurrentResolution OF
		  Low:	VPLANES:=4;
		| Medium: VPLANES:=2;
		| High:	VPLANES:=1;
		END;
*)
	END;
END SetScreenSize;


PROCEDURE EraseScreen;
BEGIN
	bconout(2,1bh);
	bconout(2,ORD('E'));
	bconout(2,1bh);
	bconout(2,ORD('v'));
	SetScreenSize;
END EraseScreen;


PROCEDURE UseXOR;
(* Graphics will use XORing *)
BEGIN
	Iface^.WMODE:=2;
END UseXOR;


PROCEDURE UseReplace;
(* Graphics will mask and OR *)
BEGIN
	Iface^.WMODE:=0;
END UseReplace;


VAR OriginalColour:PalleteArray;
PROCEDURE SetColour(C:CARDINAL; R,G,B:CARDINAL);
VAR j:CARDINAL;
BEGIN
	j:=setColor(R*256+G*16+B,C);
END SetColour;

PROCEDURE GetOriginalColours;
VAR c:CARDINAL;
BEGIN
	FOR c:=0 TO 15 DO
		OriginalColour[c]:=setColor(65535,c);
	END;
END GetOriginalColours;

PROCEDURE ResetColours;
VAR c:CARDINAL;
BEGIN
	FOR c:=0 TO 15 DO
		OriginalColour[c]:=setColor(OriginalColour[c],c);
	END;
(*
	setPallete(OriginalColour);
*)
END ResetColours;


BEGIN
	GetOriginalColours;
	AInit(Iface,Fonts);
	WITH Iface^ DO
		X2:=0;
		Y2:=0;
		WMODE:=0;
		LNMASK:=0ffffh;
		LSTLIN:=-1;
		Colour(0);
		PATPTR:=ADR(Pattern);
		PATMSK:=4;
		SolidPattern;
		MFILL:=0;
		CLIP:=0;
		SetScreenSize;
	END;
	UponTermination(ResetColours);
END SmallGraphics.
*/
