/********************************************************************/
/* 			malmal.c V1.0				    */
/********************************************************************/
/* von Frank Stratmann	25.08.1990  für C-CORNER im GetIt PD Magazin*/
/********************************************************************/
/* dieses Programm ist PUPLIC DOMAIN				    */
/********************************************************************/
/* wenn Du den Befehl `Delay(40)` löscht und dann compilierst,      */
/* kannst Du Dir so ungefähr vorstellen, wie schnell C-Programme    */
/* für Grafiken sind.						    */
/********************************************************************/
 
/* IncludeFiles... */

#include "exec/types.h"
#include "libraries/dosextens.h"
#include "libraries/dos.h"
#include "exec/memory.h"
#include "functions.h"
#include "stdio.h"
#include "math.h"
#include "exec/io.h"
#include "graphics/gfxmacros.h"
#include "graphics/gfx.h"
#include "graphics/rastport.h"
#include "graphics/view.h"
#include "graphics/regions.h"
#include "graphics/text.h"
#include "graphics/gfxbase.h"
#include "graphics/clip.h"

struct View View;			/* Unser View */
struct ViewPort ViewPort;		/* Unser ViewPort */
struct RastPort RastPort;		/* Zum Malen */
struct BitMap BitMap;			/* Für die Grafikdaten */
struct RasInfo RasInfo;			/* Verbindung zw. RastPort u. BitMap */
struct View *oldView;			/* Zum retten vom alten View */
struct GfxBas *GfxBase;			/* brauchen wir alles */
struct Colormap *ColorMap;		/* brauchen wir als Maler */ 

int a,b;				/* Schleifenvariable */

char *texte[]={"C-Corner die erste, aber bestimmt nicht die letzte!",
		"mit kleinem Schatten, der ist aber ein bißchen dunkel?",
		"SCROLLEN KÖNNEN WIR NATÜRLICH AUCH, UND WIE DAS GEHT: RAUF UND RUNTER..."
	};
char *LeftMouse=(char*)0xBFE001;	/* zur Mouseknopfabfrage */
USHORT mycolor[]={0x000,0xaaa,0x33f,0x3f3,0xf33,
		0xff3,0xf3f,0x3ff};	/* Farbdaten */

VOID InitGraph()
{
	GfxBase=(struct GfxBase*)OpenLibrary("graphics.library",0); /* Öffnen der Garphics
						Library */
	oldView=GfxBase->ActiView;	/* alten View retten */
	InitView(&View);		/* View Instalieren */
	InitVPort(&ViewPort);		/* ViewPort Instalieren */
	View.ViewPort=&ViewPort;	/* View mit ViewPort verbinden */
	InitBitMap(&BitMap,3,600,200);	/* BitMap Initalisieren */
	RasInfo.BitMap=&BitMap;		/* ViewPort mit BitMap */
	RasInfo.RxOffset=0;		/* über RasInfo verbinden */
	RasInfo.RyOffset=0;
	RasInfo.Next=NULL;
	ViewPort.DxOffset=20;		/* ViewPort um 20 nach rechts */
	ViewPort.DyOffset=50;		/* ViewPort um 50 nach unten */
	ViewPort.DWidth=600;		/* ViewPort 600 Punkte breit */
	ViewPort.DHeight=100;		/* ViewPort 100 Punkte hoch */
	ViewPort.Modes=HIRES;		/* HIRES-Modus */
	ViewPort.Next=NULL;		/* diesmal noch einer, aber das... */
	ViewPort.RasInfo=&RasInfo;	/* welches RasInfo??? */
	ViewPort.ColorMap=(struct ColorMap*)
		GetColorMap(8);		/* wir haben Farben */
	LoadRGB4(&ViewPort,&mycolor[0],8);/* jetzt noch die Farbwerte */
			  		/* übertragen */
	for(a=0;a<3;a++)		/* BitPlanes löschen */
	   {
		if((BitMap.Planes[a]=(PLANEPTR)
			AllocRaster(600,200))==NULL)
			exit(2);
		BltClear((UBYTE*)BitMap.Planes[a],
			RASSIZE(600,200),0);
	   }
	InitRastPort(&RastPort);	/* RastPort Initalisieren */
	RastPort.BitMap=&BitMap;	/* RastPort mit BitMap verbinden */
	MakeVPort(&View,&ViewPort);	/* CopperListen für ViewPort */
	MrgCop(&View);			/* CopperListen für View */
	LoadView(&View);		/* View darstellen */
}
/**************************************/
/* Texter: gibt den Text so aus, daß  */
/* 	   er in der Mitte steht.     */
/**************************************/
/* Nummer: Nummer des Textes.	      */
/* Farbe:  In der Farbe wird der Text */
/*	   ausgegeben.		      */	
/* ypos:   Y-Position des Textes.     */
/**************************************/
VOID Texter(Nummer,Farbe,ypos)
int Nummer,Farbe,ypos;
{
	SetAPen(&RastPort,Farbe);
	Move(&RastPort,300-(TextLength(&RastPort,texte[Nummer],strlen(texte[Nummer]))/2),ypos);
	Text(&RastPort,texte[Nummer],strlen(texte[Nummer]));
}
VOID PaintGraph()
{
	SetAPen(&RastPort,1);
	SetDrMd(&RastPort,JAM1);
	Move(&RastPort,0,8);
	Text(&RastPort,"Hallo GetIt-Leser, wie geht es denn so?",39);
	RectFill(&RastPort,10,10,600,50);
	Texter(0,3,20);			/* bringt die einzelnen Texte */
	Texter(1,0,29);			/* auf den Bildschirmm */
	Texter(1,4,30);
	Texter(2,0,38);			/* d. Effekt mit dem Schatten kommt */
	Texter(2,5,40);			/* daher,daß der Text dunkel u. dann */
				/* in der gewünschten Farbe gemalt wird */
	SetAPen(&RastPort,7);		/* die Linien werden gemalt */
	for(a=0;a<600;a+=5)		
	   {
		Move(&RastPort,0,199);
		Draw(&RastPort,a,51);
	   }
}
VOID Movement()
{
	a=0,b=1;
	while((*LeftMouse&0x40)==0x40)	/* solang die rechte Mousetaste */
	   {				/* nicht gedrückt ist weitermachen */
		RasInfo.RyOffset=a;	/* y-Position der BitMap im View */
					/* verändern */
		MakeVPort(&View,&ViewPort);/* neue CopperListe berechnen */
		WaitBOVP(&ViewPort);	/* warten bis letzt Zeile des */
					/* ViewPort`s erreicht ist */
		MrgCop(&View);		/* neue CopperListe berechnen */
		a+=b;			/* a+b=a+1 wenn b=1, sonst a-1 */
		if(a==99) b=-1;		
		if(a==0)
		   {
			b=1;
			Delay(40);	/* ein wenig warten, daß man auch */
		   }			/* den Text lesen kann */
	   }
}
VOID Closeall()
{
	for(a=0;a<3;a++)	FreeRaster(BitMap.Planes[a],600,200);
					/* Speicher für BitPlanes freigeben */
	FreeColorMap(ViewPort.ColorMap);/* Speicherplatz für ColorMap frei */
	FreeVPortCopLists(&ViewPort);	/* CopperList des ViewPort`s frei */
	FreeCprList(View.LOFCprList);	/* CopperListen des View`s frei */
	FreeCprList(View.SHFCprList);	/* zwei, wegen Interlace-Modus */
	CloseLibrary(GfxBase);		/* GrafikLibrary schließen */
}

main()
{
	InitGraph();
	PaintGraph();
	Movement();	
	LoadView(oldView);
	Closeall();
	
}