/****************************************************************
*																																*
*	 Filename : GfxL3.c																						*
*																																*
*****************************************************************
*																																*
*		Comment : Level 3 der Plotlibrary. Alle Funktionen für die	*
*							Graphik welche Computer oder Compiler abhängig		*
*							sind, müssen in dieser Datei enthalten sein.			*
*																																*
*			                    Funktionen														*
*	                        ==========														*
*																																*
*			ScOpenGraphics()			öffnet das Graphiksystem						*
*			ScCloseGraphics()			schliesst das Graphiksystem					*
*			ScClearGraphics()			löscht den Bildschirm								*
*			ScGetMaxX()						max. horiz. Auflösung								*
*			ScGetMaxY()						max. vert. Auflösung								*
*			ScDrawText()					schreibt eine Text									*
*			ScSetLineStyle()			setzt Linienattribute								*
*			ScGetTextSize()				holt Textgrösse											*
*			ScSetTextSize()				setzt 8*8 Text											*
*			ScGetFgColor()				holt Stiftfarbe											*
*			ScSetFgColor()				setzt Stiftfarbe										*
*			ScGetBackColor()			holt Hintergrundefarbe							*
*			ScSetBackColor()			setzt Hintergrundfarbe							*
*			ScDrawLine()					zeichnet eine Line									*
*			ScDrawPolyLine()			zeichnet Kurvenzug									*
*			ScFillPolyLine()			zeichnet Polygon										*
*			ScSetFillStyle()			setzt Füllmuster										*
*			ScDrawRectangle()			zeichnet ein Rechteck								*
*			ScGetMaxColor()				holt max. verfügbare Farbenanzahl		*
*																																*
*			#ifdef AMIGA																							*
*			openlib()						öffnet Funktionslibrary								*
*			openscreen()				öffnet Graphikbildschirm							*
*			#endif																										*
*																																*
*			#ifdef __MSDOS__																					*
*			#ifdef __TURBOC__																					*
*			initdriver()				initialisiert Graphiktreiber					*
*			#endif																										*
*			#endif																										*
*																																*
*				Rev : V1.0																							*
*																																*
*		History : V1.0 erstellen dieses Files							04/12/89	*
*																																*
*				Doc : Plotlibrary User's Guide													*
*																																*
*			 Bugs : keine bekannten																		*
*																																*
*			Autor : Oesch Silvano																			*
*																																*
*			Datum : 04/12/89																					*
*																																*
****************************************************************/

/****************************************************************
*																																*
*	Plotlibrary Includedateien																		*
*																																*
****************************************************************/

#include "Plot.h"
#include "GfxL3.h"

/****************************************************************
*																																*
*	spezifische Includedateien																		*
*																																*
****************************************************************/

/*******************/
#ifdef AMIGA
/*******************/
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <intuition/screens.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/
#include <graphics.h>
#endif
#endif

/****************************************************************
*																																*
*	globale statische Variablen																		*
*																																*
****************************************************************/

/*******************/
#ifdef AMIGA
/*******************/

extern struct IntuitionBase *IntuitionBase;
																		/* Intuitionlibrary					*/
extern struct GfxBase *GfxBase;
static struct IntuitionBase *IBase = NULL;
																		/* Intuitionlibrary					*/
static struct GfxBase *GBase = NULL;
																		/* Graphicslibrary					*/
static struct Screen *Sc=NULL;			/* Screenpointer						*/
static struct Window *Mw=NULL;			/* Windowpointer						*/
static struct ViewPort *Vp;					/* Viewportpointer					*/
static struct RastPort *Rp;					/* Rastportpointer Screen		*/
static struct RastPort *WRp;				/* Rastportpointer Window		*/

#include "ScreenL3.h"

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

/****************************************************************
*																																*
*	Die Definition für die einzelnen Treiber müssen in Plotlib.h	*
*	gemacht werden. Sie werden hier abgefragt, damit nicht alle		*
*	Treiber dem Linker bekannt sind. Das Array DRIVERS wird in		*
*	Plotlib.h so aufgebaut, dass all definierten Treiber darin		*
*	enthalten sind.																								*
*																																*
****************************************************************/

extern void (*DRIVERS[])(void);

static int GraphDriver = DETECT;		/* Graphiktreiber						*/
static int GraphMode = NULL;				/* Graphikmode							*/

static int palette[MAXDEFCOL] =			/* Farbdefinitionen					*/
{
	BLACK,
	WHITE,
	LIGHTGRAY,
	LIGHTBLUE,
	LIGHTGREEN,
	LIGHTCYAN,
	LIGHTRED,
	LIGHTMAGENTA,
	BLUE,
	GREEN,
	CYAN,
	RED,
	MAGENTA,
	BROWN,
	DARKGRAY,
	YELLOW
};

#endif
#endif

/****************************************************************
*																																*
*	externe Variablen																							*
*																																*
****************************************************************/

extern struct Plot *plot;
extern int plerr;

/****************************************************************
*																																*
*	Function : ScOpenGraphics()																		*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int returnset																			*
*							!= FALSE    	alle klar														*
*							== FALSE			Fehler															*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion hat die Aufgabe in den Graphikmodus	*
*						 des Computers umzuschalten. Wenn ein Computer			*
*						 keine unterscheidung zwischen Graphik und Text			*
*						 macht, kann hier ein neuer Bildschirm geöffnet			*
*						 werden. Es wird nur ein Fehler GROPER gesetzt für	*
*						 die komplette Funktion.														*
*						 Der Indikator disp in der Plotstruktur ist zu			*
*						 diesem Zeitpunk mit den entsprechenden Optionen		*
*						 GRAPHSET oder GRAPHNOTSET gesetzt. Anhand dieser		*
*						 Indikation können die benötigten Resourcen					*
*						 angefordert werden.																*
*																																*
*		 AMIGA : Wenn GRAPHSET, dann werden nur die Funktions-			*
*						 librarys geöffnet. Es werden auch nur die Library-	*
*						 pointer initialisiert,															*
*						 ACHTUNG : Die Librarys sind nur für die Plotlib		*
*											 nützbar. Das Applikationsprogramm muss		*
*											 diese Librarys auch öffnen wenn sie 			*
*											 diese benötigt.													*
*						 Ansonsten wird ein Bildschirm mit einer Auflösung	*
*						 von 640*512/400 Punkte mit 16 Farben geöffnet. Ein	*
*						 entsprechendes Window wird ebenfalls auf diesem		*
*						 Screen geöffnet.																		*
*						 Die folgenden static global Variablen werden				*
*						 danach initialisiert:															*
*																																*
*								IntuitionBase		Library													*
*								GfxBase					Library													*
*								Sc							Screenpointer										*
*								Vp							ViewPort												*
*								Rp							Rastport												*
*								Mw							Windowpointer										*
*								WRp							Windowrastport									*
*																																*
*		 MSDOS : Wenn GRAPHSET, dann wird der aktuelle Graphikmode	*
*						 geholt. Danach wird kontrolliert, ob ein Fehler		*
*						 bei dieser Funktion aufgetreten ist. Wenn dies			*
*						 zutrifft, dann wird mit einer Fehlermeldung ver-		*
*						 zweigt.																						*
*						 Ansonsten wird der Graphiktreiber mit der höchsten	*
*						 Auflösung initialisiert un in diesen Mode um-			*
*						 geschaltet.																				*
*						 Die folgenden static global Variablen werden				*
*						 initialisiert:																			*
*																																*
*								GraphDriver			Treiber													*
*								GraphMode				Modus														*
*																																*
****************************************************************/

int ScOpenGraphics()
{

	int returnset;


/*******************/
#ifdef AMIGA
/*******************/

	if ( openlib() == FALSE )					/* alle Librarys öffnen			*/
		setreturn(FALSE);								/* Fehler										*/
	else
	{
		if (plot->disp & GRAPHNOTSET)		/* muss ein Screen geöffnet	*/
			if (openscreen() == FALSE)		/* werden. Ja								*/
				setreturn(FALSE);						/* Fehler										*/
			else
				setreturn(TRUE);						/* alles klar für NOTSET		*/
		else
		{
/****************************************************************
*																																*
*	Wenn GRAPHSET gesetzt ist, wird der aktive Screen als der			*
*	genommen. Dasselbe gilt für das Window.												*
*																																*
****************************************************************/

			Sc = IntuitionBase->ActiveScreen;
			Vp = &Sc->ViewPort;							/* Viewport initialisieren	*/
			Rp = &Sc->RastPort;							/* Rastport initialisieren	*/
			Mw = IntuitionBase->ActiveWindow;
			WRp = Mw->RPort;							/* Rastport initialisieren	*/
			setreturn(TRUE);							/* alles klar für SET				*/
		}
	}

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	if (plot->disp & GRAPHNOTSET)			/* Driver laden ?						*/
	{																	/* Ja												*/
		initdriver();										/* Graphiktreiber inst.			*/
		GraphDriver = DETECT;						/* welcher vorhanden ist		*/
		setgraphbufsize(8192);					/* bis ca. 1200 Eckpunkte		*/
		initgraph(&GraphDriver,&GraphMode,"");
																		/* laden und umschalten			*/
		if (graphresult() != grOk)			/* Fehler ?									*/
		{
			seterror(GROPER);							/* Ja												*/
			setreturn(FALSE);
		}
		else
			setreturn(TRUE);							/* Nein											*/
	}
	else															/* kein Diver laden					*/
	{																	/* nur kontrolle						*/
		GraphMode = getgraphmode();			/* hole Mode								*/
		if (graphresult() != grOk)			/* Fehler beim Mode					*/
		{
			seterror(GROPER);							/* Ja												*/
			setreturn(FALSE);
		}
		else
			setreturn(TRUE);							/* Nein, alles klar					*/
	}

#endif
#endif

	return(returnset);
}

/****************************************************************
*																																*
*	Function : ScCloseGraphics()																	*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion schliesst die kompletten Graphik-		*
*						 resourcen, welche bei OpenGraphics angefordert			*
*						 wurden. Die entsprechenden statischen globalen			*
*						 Variablen werden wieder auf ihre Standartwerte			*
*						 zurückgesetzt um spätere komplikationen zu ver-		*
*						 meiden. Der Displayparameter wird ebenfalls				*
*						 zurückgesetzt.																			*
*																																*
*		 AMIGA : Wenn die Plotlibrary einen Screen geöffnet hat,		*
*						 so schliesst sie diesen wieder. Die Librarys sind	*
*						 für alle Darstellungen geöffnet worden. Sie werden	*
*						 auch immer wieder geschlossen. Alle Werte werden		*
*						 initialisiert.																			*
*																																*
*		 MSDOS : Wenn die Plotlibrary die Graphik geöffnet hat, so	*
*						 wird wieder in den Textmodus umgeschaltet.					*
*						 Alle Werte werden initialisiert.										*
*																																*
****************************************************************/

void ScCloseGraphics()
{

/*******************/
#ifdef AMIGA
/*******************/


	if (plot->disp & GRAPHNOTSET)			/* Wer hat Graphik geöffnet	*/
	{																	/* Ich											*/
		if (Mw != NULL)									/* also wieder schliessen		*/
			CloseWindow(Mw);							/* Mainwindow								*/
		if (Sc != NULL)
			CloseScreen(Sc);							/* Screen										*/
		plot->disp &= ~GRAPHNOTSET;			/* Indikator reseten				*/
	}
	else															/* Graphik nicht von mir		*/
		plot->disp &= ~GRAPHSET;				/* Indikator init.					*/

/****************************************************************
*																																*
*	alle Librarys schliessen																			*
*																																*
****************************************************************/

	if (GBase != NULL)
		CloseLibrary(GBase);						/* Graphicslibrary					*/
	if (IBase != NULL)
		CloseLibrary(IBase);						/* Intuitionlibrary					*/

	Mw = NULL;												/* alle Pointer init.				*/
	Sc = NULL;
	GBase = NULL;
	IBase = NULL;

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	if (plot->disp & GRAPHNOTSET)			/* Ist Graphik von mir ?		*/
	{																	/* Ja												*/
		closegraph();										/* also schliessen					*/
		plot->disp &= ~GRAPHNOTSET;			/* Indikator init.					*/
	}
	else															/* Nein											*/
		plot->disp &= ~GRAPHSET;				/* Indikator reseten				*/

		GraphDriver = DETECT;						/* Werte initialisieren			*/
		GraphMode = NULL;

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScGetMaxColor()																		*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int maxcolor				max setzbares Farbregister			*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese computerabhängige Funktion stellt die max		*
*						 mögliche darstellbaren Farben-1 fest und schreibt	*
*						 diese in die Plotstruktur. Da 0 im Normalfall auch	*
*						 eine Farbe ist, muss 1 subtrahiert werden.					*
*																																*
*		 AMIGA : Die Anzahl Bitplanes welche für den Screen 				*
*						 definiert sind geben die Anzahl möglicher Farben		*
*						 an.																								*
*																																*
*		 MSDOS : Es wird die getmaxcolor vom Turbo C Compiler				*
*						 verwendet.																					*
*																																*
****************************************************************/

int ScGetMaxColor()
{

/*******************/
#ifdef AMIGA
/*******************/

		return((int)(1<<Sc->BitMap.Depth)-1);
																		/* Planes und shiften				*/
#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	return((int)getmaxcolor());				/* color holen							*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScGetMaxX()																				*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int maxx				max. horizontaler setzbarer Punkt		*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion hat die Aufgabe die max.						*
*						 horizontale Koordinate der aktuellen Graphik-			*
*						 einstellung als Rückgabewert zu liefern.						*
*						 Die Bildschirmauflösung ist normalerweise um 1			*
*						 höher.																							*
*																																*
*		 AMIGA : Es wird vom aktiven Window die max. Koordinate			*
*						 geholt. Wenn also dieses Window später verkleinert	*
*						 wird, passt sich die Graphik der neuen Grösse an.	*
*																																*
*		 MSDOS : Es wird die getmaxx Funktion vom Turbo C Compiler	*
*						 verwendet.																					*
*																																*
****************************************************************/

int ScGetMaxX()
{

/*******************/
#ifdef AMIGA
/*******************/

		return((int)(Mw->Width-1));			/* Grösse aus Window holen	*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	return((int)getmaxx());						/* Na ja, dasselbe					*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScGetMaxY()																				*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int maxy				max. vertikaler setzbarer Punkt			*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion hat die Aufgabe die max.						*
*						 vertikale Koordinate der aktuellen Graphik-				*
*						 einstellung als Rückgabewert zu liefern.						*
*						 Die Bildschirmauflösung ist normalerweise um 1			*
*						 höher.																							*
*																																*
*		 AMIGA : Es wird vom aktiven Window die max. Koordinate			*
*						 geholt. Wenn also dieses Window später verkleinert	*
*						 wird, passt sich die Graphik der neuen Grösse an.	*
*																																*
*		 MSDOS : Es wird die getmaxy Funktion vom Turbo C Compiler	*
*						 verwendet.																					*
*																																*
****************************************************************/

int ScGetMaxY()
{

/*******************/
#ifdef AMIGA
/*******************/

		return((int)(Mw->Height-1));		/* Grösse von Window holen	*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	return((int)getmaxy());						/* dito												*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScSetTextSize()																		*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : SetTextSize() setzt einen 8*8 grossen Text. Diese	*
*						 Textgrösse sollte eingehalten werden. Sie kann			*
*						 aber auch kleiner werden.													*
*																																*
*		 AMIGA : Es wird die ROM Schrift TOPAZ geöffnet und für			*
*						 dieses Window gesetzt.															*
*																																*
*		 MSDOS : Es wird die Textausrichtung auf die linke untere		*
*						 Ecke gesetz, die Standartschrift gesetzt und ihre	*
*						 Ausrichtung auf horizontal gesetzt.								*
*																																*
****************************************************************/

void ScSetTextSize()
{

/*******************/
#ifdef AMIGA
/*******************/

	struct TextFont *textfont;				/* Fontzeiger								*/

	textfont = OpenFont(&TOPAZ80);		/* öffne Font								*/
	SetFont(WRp,textfont);						/* und setzten							*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	settextjustify(LEFT_TEXT,BOTTOM_TEXT);
																		/* untere linke Ecke				*/
	settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
																		/* Standartschrift					*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScClearGraphics()																	*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion muss den Bildschirm löschen können	*
*						 in welchen gezeichnet wird.												*
*																																*
*		 AMIGA : Es wird die Standartfunktion verwendet.						*
*																																*
*		 MSDOS : Es wird die Standartfunktion verwendet.						*
*																																*
****************************************************************/

void ScClearGraphics()
{

/*******************/
#ifdef AMIGA
/*******************/

	Move(WRp,0,0);										/* löschen von Anfang an		*/
	ClearScreen(WRp);									/* und löschen							*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	cleardevice();										/* alles löschen						*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScDrawText()																				*
*																																*
*****************************************************************
*																																*
*		 Input : x,y,string																					*
*							int x						horiz. Startpunkt									*
*							int y						vert. Startpunkt									*
*							char *string		Textzeiger												*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : ScDrawText schreibt einen Text startend mit dem		*
*						 Koordinatenpunkt (x/y). Dieser Punkt legt die			*
*																																*
*		 AMIGA : Korrektur der Koordinate um die Basisline und			*
*						 verwenden der Standartfunktion.										*
*																																*
*		 MSDOS : Standartfunktion von Turbo C												*
*																																*
****************************************************************/

void ScDrawText(x,y,string)
int x,y;
char *string;
{

/*******************/
#ifdef AMIGA
/*******************/

	Move(WRp,x,y-WRp->TxHeight+WRp->TxBaseline);
																		/* Koordinatenkorr.					*/
	Text(WRp,string,strlen(string));	/* schreibe Text						*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	outtextxy(x,y,string);						/* schreibe Text						*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScGetFgColor()																			*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int color				aktuelle Stiftfarbe								*
*																																*
*****************************************************************
*																																*
*	 Comment : ScGetFgColor gibt die aktuelle Stiftfarbe zurück		*
*						 mit welcher gezeichnet wird.												*
*																																*
*		 AMIGA : Stiftfarbe aus Rastport holen.											*
*																																*
*		 MSDOS : Standartfunktion von Turbo C												*
*																																*
****************************************************************/

int ScGetFgColor()
{

/*******************/
#ifdef AMIGA
/*******************/

	return((int)WRp->FgPen);					/* Vordergrund holen				*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	return(convcolor(getcolor()));		/* Farbe holen und konv.		*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScSetFgColor()																			*
*																																*
*****************************************************************
*																																*
*		 Input : int color					neuer Stiftfarbe								*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion setzt die angegebene Farbe als			*
*						 neuen Stift.																				*
*																																*
*		 AMIGA : Verwendung der Standartfunktion für das setzten		*
*						 der Vodergrundfarbe.																*
*																																*
*		 MSDOS : Turbo C Standartfunktion														*
*																																*
****************************************************************/

void ScSetFgColor(color)
int color;
{

/*******************/
#ifdef AMIGA
/*******************/

	SetAPen(WRp,color);								/* Farbe setzten						*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	if (color < MAXDEFCOL)						/* konvertieren							*/
		color = palette[color];
	setcolor(color);									/* Farbe setzen							*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScGetBackColor()																		*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int color						aktuelle Stiftfarbe						*
*																																*
*****************************************************************
*																																*
*	 Comment : ScGetBackColor holt die aktuelle Hintergrundfarbe.	*
*																																*
*		 AMIGA : Aus Rastport BackgroundPen holen										*
*																																*
*		 MSDOS : Verwenden von Turbo C Standartfunktion							*
*																																*
****************************************************************/

int ScGetBackColor()
{

/*******************/
#ifdef AMIGA
/*******************/

	return((int)WRp->BgPen);					/* hole Background					*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	return(convcolor(getbkcolor()));	/* Farbe holen und konv.		*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScSetBackColor()																		*
*																																*
*****************************************************************
*																																*
*		 Input : int color				setzt neue Hintergrundfarbe				*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion setzt eine neue Hintergrundfarbe		*
*						 für die aktuelle Ausgabe.													*
*																																*
*		 AMIGA : Standartfunktion der graphics.library							*
*																																*
*		 MSDOS : Turbo C Funktion																		*
*																																*
****************************************************************/

void ScSetBackColor(color)
int color;
{

/*******************/
#ifdef AMIGA
/*******************/

	SetBPen(WRp,color);								/* Farbe setzten						*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	if (color < MAXDEFCOL)						/* konvertieren							*/
		color = palette[color];
	setbkcolor(color);								/* Farbe setzten						*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScDrawLine()																				*
*																																*
*****************************************************************
*																																*
*		 Input : x1,y1,x2,y2																				*
*							int x1					horiz. Startwert									*
*							int y1					vert. Startwert										*
*							int x2					horiz. Endtwert										*
*							int y2					vert. Emdwert											*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : ScDrawLine zeichnet eine Linie von dem Punkt				*
*						 (x1/y1) nach (x2/y2) in der aktuellen Stiftfarbe.	*
*																																*
*		 AMIGA : Standartfunktionen aus graphics.library						*
*																																*
*		 MSDOS : Turbo C Funktionen																	*
*																																*
****************************************************************/

void ScDrawLine(x1,y1,x2,y2)
int x1,
		y1,
		x2,
		y2;
{

/*******************/
#ifdef AMIGA
/*******************/

	Move(WRp,x1,y1);									/* Startposition						*/
	Draw(WRp,x2,y2);									/* zeichne Linie						*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	line(x1,y1,x2,y2);								/* zeichne Linie						*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScDrawPolyLine()																		*
*																																*
*****************************************************************
*																																*
*		 Input : counter,array																			*
*							int counter						Anzahl Koordinatenpunkte		*
*							GPT *array						Zeiger auf Koordinatenpaare	*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion zeichnet ein Kurvenzug in der				*
*						 aktuellen Stiftfarbe. Es werden alle Punkte				*
*						 in dem Array nacheinander verbunden.								*
*																																*
*		 AMIGA : Standartfunktion in graphics.library								*
*																																*
*		 MSDOS : Verwenden der drawpolyfunktion. 										*
*																																*
****************************************************************/

void ScDrawPolyLine(counter,array)
int counter;
GPT	*array;
{

/*******************/
#ifdef AMIGA
/*******************/

		Move(WRp,*array++,*array++);		/* Startkoordinate					*/
		PolyDraw(WRp,counter-1,array);	/* und zeichnen							*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	drawpoly(counter,array);					/* zeichene Kurve						*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScFillPolyLine()																		*
*																																*
*****************************************************************
*																																*
*		 Input : counter,array																			*
*							int counter						Anzahl Koordinatenpunkte		*
*							GPT *array						Zeiger auf Koordinatenpaare	*
*																																*
*		Output : int returnset					Rückgabewert								*
*							returnset != FALSE		alles klar									*
*							returnset == FALSE		Fehler beim zeichnen des		*
*																		Polygones										*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion zeichnet ein Polygon in der					*
*						 aktuellen Stiftfarbe. Zusätzlich wird dieses				*
*						 mit dem aktuellen Muster ausgefüllt. Wenn das			*
*						 Muster 0 angewählt wurde, dann soll kein aus-			*
*						 füllen geschehen. Die Abfrage für das Muster 0			*
*						 kann über die Plotstruktur geschehen. Wenn in			*
*						 plot->style == NOSTYLE steht, ist kein Muster			*
*						 ewrwünscht.																				*
*																																*
*																																*
*		 AMIGA : Wenn kein Muster erwünscht ist, verwenden der			*
*						 einfachen Zeichnungsfunktion.											*
*						 Sonst verwenden der Area-Funktionen mit ihrem			*
*						 komplexen Handling.																*
*																																*
*		 MSDOS : Verwenden der fillpolyfunktion. Für den Rückgabe-	*
*						 wird graphresult aufgerufen.												*
*																																*
****************************************************************/

int ScFillPolyLine(counter,array)
int counter;
GPT	*array;
{

	int returnset = TRUE;

/*******************/
#ifdef AMIGA
/*******************/

PLANEPTR araster;										/* TempRastPortpointer			*/
struct TmpRas myTmpRas;							/* Rastportstruktur					*/
struct AreaInfo myareainfo;					/* Areastruktur							*/
WORD *datas;												/* Zeiger auf neue Daten		*/
int i;															/* Schleifenzähler					*/

	if (plot->style == NOSTYLE)				/* mit Muster								*/
	{																	/* Nein											*/
		Move(WRp,*array++,*array++);		/* Startkoordinate					*/
		PolyDraw(WRp,counter-1,array);	/* und zeichnen							*/
	}
	else															/* Ja												*/
	{
		SetOPen(WRp,WRp->FgPen);				/* setzte Umrandung					*/
		datas = malloc((counter+1)*5*sizeof(WORD));
																		/* Speicher für Areabefehle	*/

		if (!datas)											/* Speicher bekommen				*/
		{
			seterror(GRAPHFILL);					/* Nein setzte Fehler				*/
			return(FALSE);								/* zurück mit Fehler				*/
		}

		araster = AllocRaster(640,512);	/* neuer TempRastport holen	*/
		if (!araster)										/* bekommen ?								*/
		{
			seterror(GRAPHFILL);					/* Nein setzte Fehler				*/
			return(FALSE);								/* zurück mit Fehler				*/
		}

		InitArea(&myareainfo,datas,counter+1);
		InitTmpRas(&myTmpRas,araster,RASSIZE(640,512));
																		/* Speicher init.						*/
		WRp->TmpRas = &myTmpRas;				/* und Werte einsetzten			*/
		WRp->AreaInfo = &myareainfo;
		AreaMove(WRp,(WORD)*array++,(WORD)*array++);
																		/* Startkoordinate					*/
		for (i=1;i<counter;i++)					/* und alle Punkte					*/
			AreaDraw(WRp,(WORD)*array++,(WORD)*array++);
		AreaEnd(WRp);										/* zeichnen									*/
		BNDRYOFF(WRp);									/* Umrandung ausschalten		*/

		free(datas);										/* Speicher freigeben				*/
		FreeRaster(araster,640,512);		/* RastPort freigeben				*/
		WRp->AreaInfo = NULL;						/* Zeiger rücksetzten				*/
		WRp->TmpRas = NULL;
	}

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	fillpoly(counter,array);					/* zeichene Polygon					*/
	if (graphresult() != grOk)				/* ist alles klar						*/
	{
		seterror(GRAPHFILL);						/* Nein setzte Fehler				*/
		setreturn(FALSE);								/* und Rückgabewert					*/
	}

#endif
#endif

	return(returnset);

}

/****************************************************************
*																																*
*	Function : ScSetFillStyle()																		*
*																																*
*****************************************************************
*																																*
*		 Input : style																							*
*							int style				neues Muster											*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion setzt eine neuse Füllmuster welches	*
*						 bei ScFillPolyLine verwendet wird. Der Aufbau der	*
*						 Muster ist folgende :															*
*																																*
*							-	Es müssen mindestens 12 Muster definiert werden	*
*							-	Das Muster 0 darf nicht gezeichnet werden, d.h.	*
*								der Hintergrund wird mit diesem Muster nicht		*
*								verändert.																			*
*							- Die Vorlage für die def. Muster wurde aus dem		*
*								Turbo C Compiler entnommen.											*
*																																*
*		 AMIGA : definieren aller 12 Muster und verwenden der				*
*						 Standartfunktion in der graphics.library						*
*																																*
*		 MSDOS : Verwenden der Standartfunktionen des Turbo C				*
*						 Compilers.																					*
*																																*
****************************************************************/

void ScSetFillStyle(style)
int style;
{

/*******************/
#ifdef AMIGA
/*******************/

static WORD stylearray[12][8] =			/* Füllmuster								*/
{
	{ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 },
	{	0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF	},
	{	0xFFFF,0xFFFF,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000	},
	{	0x0101,0x0202,0x0404,0x0808,0x1010,0x2020,0x4040,0x8080	},
	{	0x8181,0x0303,0x0606,0x0C0C,0x1818,0x3030,0x6060,0xC0C0	},
	{	0xC0C0,0x6060,0x3030,0x1818,0x0C0C,0x0606,0x0303,0x8181	},
	{	0x8080,0x4040,0x2020,0x1010,0x0808,0x0404,0x0202,0x0101	},
	{	0x1111,0x1111,0x1111,0xFFFF,0x1111,0x1111,0x1111,0xFFFF	},
	{	0x9090,0x6060,0x6060,0x9090,0x0909,0x0606,0x0606,0x0909	},
	{	0xAAAA,0x7777,0xAAAA,0x7777,0xAAAA,0x7777,0xAAAA,0x7777	},
	{	0x8080,0x0000,0x0404,0x0000,0x8080,0x0000,0x0404,0x0000	},
	{	0xAAAA,0x0000,0x6666,0x0000,0xAAAA,0x0000,0x6666,0x0000	}
};

	SetAfPt(WRp,&stylearray[style][0],3);
																		/* Muster setzten						*/
#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	setfillstyle(style,getcolor());		/* Muster setzen						*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScDrawRectangle()																	*
*																																*
*****************************************************************
*																																*
*		 Input : x1,y1,x2,y2																				*
*							int x1				linke obere Ecke										*
*							int y1				linke obere Ecke										*
*							int x2				rechte untere Ecke									*
*							int y2				rechte untere Ecke									*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion zeichnet ein Rechteck welches nicht	*
*						 nicht ausgefüllt ist.															*
*																																*
*		 AMIGA : Anwendung der Line-Befehle													*
*																																*
*		 MSDOS : Turbo C Standartfunktion														*
*																																*
****************************************************************/

void ScDrawRectangle(x1,y1,x2,y2)
int x1,
		y1,
		x2,
		y2;
{

/*******************/
#ifdef AMIGA
/*******************/

	Move(WRp,x1,y1);									/* Startkoordinate					*/
	Draw(WRp,x2,y1);									/* rechte obere Ecke				*/
	Draw(WRp,x2,y2);									/* rechte untere Ecke				*/
	Draw(WRp,x1,y2);									/* linke untere Ecke				*/
	Draw(WRp,x1,y1);									/* linke obere Ecke					*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	rectangle(x1,y1,x2,y2);						/* Rechteck zeichnen				*/

#endif
#endif

}

/****************************************************************
*																																*
*	Function : ScGetTextSize()																		*
*																																*
*****************************************************************
*																																*
*		 Input : int axis				Breite oder Höhe										*
*																																*
*		Output : int size				Grösse in Punkten										*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion gibt die Grösse des eingestellten		*
*						 Zeichensatzes zurück. Für die Achsen können die		*
*						 Variablen XSIZE und YSIZE verwendet werden.				*
*																																*
*		 AMIGA : holen der entsprechenden Grösse aus dem Rastport		*
*																																*
*		 MSDOS : Turbo C Standartfunktionen													*
*																																*
****************************************************************/

int ScGetTextSize(axis)
int axis;
{

	int returnset;

/*******************/
#ifdef AMIGA
/*******************/

	switch(axis)
	{
		case XSIZE:
			setreturn(WRp->TxWidth);			/* Textlänge								*/
			break;

		case YSIZE:
			setreturn(WRp->TxHeight);			/* Texthöhe									*/
			break;
	}

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	switch (axis)
	{
		case XSIZE:
			setreturn(textwidth(" "));		/* Textlänge								*/
			break;

		case YSIZE:
			setreturn(textheight(" "));		/* Texthöhe									*/
			break;
	}

#endif
#endif

	return(returnset);

}

/****************************************************************
*																																*
*	Function : ScSetLineStyle()																		*
*																																*
*****************************************************************
*																																*
*		 Input : int typ			Linienmuster													*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion setzt ein neues Muster für eine			*
*						 Linie. Die folgenden Bedingungen müssen erfüllt		*
*						 werden.																						*
*																																*
*								- Es müssen mindeseten 4 Muster vorhanden sein	*
*								- Muster 0 muss eine ausgezogene Linie zeichen	*
*								- Muster 1 sollte eine fein gestrichelte Line		*
*									zeichnen																			*
*																																*
*		 AMIGA : definieren der Muster und verwenden der Standart-	*
*						 funktion ind grahics.library.											*
*																																*
*		 MSDOS : definieren der Muster und verwenden der Standart-	*
*						 funktion von Turbo C.															*
*																																*
****************************************************************/

void ScSetLineStyle(typ)
int typ;
{
	unsigned int style[] =						/* Musterdefinition					*/
	{
		0xFFFF,0xCCCC,0xF0F0,0xFCFC,0xE8E8
	};

/*******************/
#ifdef AMIGA
/*******************/

	SetDrPt(WRp,(UWORD)style[typ]);		/* setzten des Musters			*/

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

	setlinestyle(USERBIT_LINE,style[typ],NORM_WIDTH);
																		/* setzten des Musters			*/
#endif
#endif

}

/****************************************************************
*																																*
*	Nachfolgend sind Funktionen aufgeführt, welche nur für einen	*
*	Rechner verwendet werden. Es sind dies Hilfsfunktionen von		*
*	den Level 3 Funktionen.																				*
*																																*
****************************************************************/

/*******************/
#ifdef AMIGA
/*******************/

/****************************************************************
*																																*
*	Function : openlib()																					*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : int returnset																			*
*							!= FALSE    	alle klar														*
*							== FALSE			Fehler															*
*																																*
*****************************************************************
*																																*
*	 Comment : Diese Funktion öffnet die notwendigen Librarys.		*
*						 Sie wird nur benützt für AMIGA!										*
*																																*
****************************************************************/

static int openlib()
{

	int returnset;										/* allg Rückgabewert				*/

	IBase = (struct IntuitionBase *)
		OpenLibrary ("intuition.library",NULL);
	if (IBase == NULL)								/* Fehler ?									*/
	{																	/* IntuitionBase = NULL			*/
		seterror(GROPER);								/* setzte Fehler						*/
		setreturn(FALSE);
	}
	else
	{
		if (IntuitionBase != IBase)			/* schon geöffnet ?					*/
			IntuitionBase = IBase;				/* Nein, setzten						*/
		GBase = (struct GfxBase *)
			OpenLibrary("graphics.library",NULL);
		if (GBase == NULL)							/* Fehler ?									*/
		{																/* GfxBase = NULL						*/
			seterror(GROPER);							/* Fehler										*/
			setreturn(FALSE);
		}
		else
		{
			if (GfxBase != GBase)					/* schon geöffnet						*/
				GfxBase = GBase;						/* Nein, setzten						*/
			setreturn(TRUE);
		}
	}
	return(returnset);								/* und zurück								*/
}

/****************************************************************
*																																*
*	Function : openscreen()																				*
*																																*
*****************************************************************
*																																*
*		Input : void																								*
*																																*
*	 Output : int returnset																				*
*							!= FALSE    	alle klar														*
*							== FALSE			Fehler															*
*																																*
*****************************************************************
*																																*
*	Comment : Oeffnet einen Screen und ein entsprechendes					*
*						Window. Es werden auch Defaultfarben gesetzt.				*
*						Diese Funktion wird nur benützt für AMIGA!					*
*																																*
****************************************************************/

static int openscreen()
{
	int returnset,									/* allg. Rückgabewert					*/
			i;													/* Schleifenzähler						*/
	int	rot,												/* Farbanteile								*/
			gruen,
			blau;

	if (GfxBase->DisplayFlags & PAL)	/* Version bestimmen				*/
		newscreen.Height = 512;					/* PAL Auflösung						*/
	else
		newscreen.Height = 400;					/* NTSC Auflösung						*/

	Sc = (struct Screen *)OpenScreen(&newscreen);
																		/* Öffnen des Screens				*/
	if ( Sc == NULL )									/* Fehler ?									*/
	{																	/* Sc = NULL								*/
		seterror(GROPER);								/* setzte Fehler						*/
		setreturn(FALSE);
	}
	else
	{
		Vp = &Sc->ViewPort;							/* Viewport initialisieren	*/
		Rp = &Sc->RastPort;							/* Rastport initialisieren	*/

		ShowTitle(Sc,FALSE);						/* kein Titel								*/

		for (i=0;i<16;i++)							/* setzten aller Farben			*/
		{
			rot = ROT(Palette[i]);
			gruen = GRUEN(Palette[i]);
			blau = BLAU(Palette[i]);
			SetRGB4(Vp,i,rot,gruen,blau);	/* Farbe setzten						*/
		}

		window.Screen = Sc;							/* Init. Windowstruktur			*/
		window.Height = newscreen.Height;

		Mw = (struct Window *)OpenWindow(&window);
																		/* Öffne Mainwindow					*/
		if ( Mw == NULL )								/* Fehler ?									*/
		{																/* Mw = NULL								*/
			seterror(GROPER);							/* Fehler setzten						*/
			setreturn(FALSE);
		}
		else
			WRp = Mw->RPort;							/* Rastport initialisieren	*/
	}
	return(returnset);
}

#endif

/*******************/
#ifdef __MSDOS__
#ifdef __TURBOC__
/*******************/

/****************************************************************
*																																*
*	Function : initdriver()																				*
*																																*
*****************************************************************
*																																*
*		 Input : void																								*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : Registriert die gelinkten Graphiktreiber, sodass		*
*						 diese nicht mehr von der Disk gelesen werden 			*
*						 müssen.																						*
*																																*
****************************************************************/

static void initdriver()
{

	int i;

	for (i=0;i<MAXDRIVERS;i++)
	{
		if (DRIVERS[i] != NULL)					/* Wenn Treiber definiert		*/
			registerbgidriver(DRIVERS[i]);
	}

}

/****************************************************************
*																																*
*	Function : convcolor()																				*
*																																*
*****************************************************************
*																																*
*		 Input : int color					Farbwert												*
*																																*
*		Output : int convcolor			konvert. Farbwert								*
*																																*
*****************************************************************
*																																*
*	 Comment : Konvertiert Farbwerte auf einen gemeinsamen 				*
*						 Nenner.																						*
*																																*
****************************************************************/

static int convcolor(color)
int color;
{
	int i;

	for (i=0;i<MAXDEFCOL;i++)
		if (color == palette[i])
			break;
	if (i == MAXDEFCOL)
		return(color);
	else
		return(i);
}

#endif
#endif
