#include "viewport.h"

#define DEPTH 3                   /* Anzahl der Bitplanes   */
#define WIDTH 325                 /* Breite des Screens */
#define HEIGHT 205                /* Hoehe  des Screens */

struct View v1,v2,*oldview;
struct ViewPort vp1,vp2;
struct ColorMap *cm1,*cm2;
struct RasInfo ri1,ri2;
struct BitMap b1,b2;
struct RastPort rastport,*rp;
extern struct ColorMap *GetColorMap();
USHORT colortable[]={0x000,0x333,0x555,0x777,0x999,0xbbb,0xddd,0xfff};
USHORT *colorpalette,visible=1;
struct GfxBase *GfxBase,*OpenLibrary();
unsigned char *displaymem;
PLANEPTR *AllocRaster();

#define MAXPTS 64
struct AreaInfo ai;
USHORT areamem[(MAXPTS/2)*5];

struct TmpRas tr;
PLANEPTR *Rast;
int i;

int q1[1000],w1[1000],q2[1000],w2[1000],q3[1000],w3[1000];


/* ------------------------Dies ist das Hauptprogramm--------------------*/
/*                              Hier aendern                             */
main()
{
  int a,b;
  int x1=10, y1=15, x2=210, y2=30, x3=200, y3=160;
  int a1= 3, b1= 4, a2= -2, b2= 4, a3=  3, b3=  5;
  Init();

  SetAPen(rp,7);
  for(a=0;a<600;a++) {
    x1+=a1; y1+=b1;
    if(x1>230 || x1<10) a1=-a1;
    if(y1>170 || y1<10) b1=-b1;
    x2+=a2; y2+=b2;
    if(x2>230 || x2<10) a2=-a2;
    if(y2>170 || y2<10) b2=-b2;
    x3+=a3; y3+=b3;
    if(x3>230 || x3<10) a3=-a3;
    if(y3>170 || y3<10) b3=-b3;
    q1[a]=x1; w1[a]=y1;
    q2[a]=x2; w2[a]=y2;
    q3[a]=x3; w3[a]=y3;
  };

  for(a=0;a<600;a++) {
    for(b=0;b<7;b++) {
      SetAPen(rp,1+b);
      AreaMove(rp,q1[a+b],w1[a+b]);
      AreaDraw(rp,q2[a+b],w2[a+b]);
      AreaDraw(rp,q3[a+b],w3[a+b]);
      AreaEnd(rp);
    };
    Switch();
  };
  FreeMemory();
}
/*-------------------------Ende Hauptprogramm------------------------------*/
/*                       Ab hier nichts mehr aendern                       */

Init()
{
  int i;

  GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);
  if (GfxBase == NULL) exit(100);

  oldview=GfxBase->ActiView;

  InitView(&v1);
  InitView(&v2);

  InitVPort(&vp1);
  InitVPort(&vp2);

  v1.ViewPort=&vp1;
  v2.ViewPort=&vp2;

  InitBitMap(&b1,DEPTH,WIDTH,HEIGHT);
  for(i=0;i<DEPTH;i++) {
    b1.Planes[i]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
    if (b1.Planes[i]==NULL) exit(200);
  }

  InitBitMap(&b2,DEPTH,WIDTH,HEIGHT);
  for(i=0;i<DEPTH;i++) {
    b2.Planes[i]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
    if (b2.Planes[i]==NULL) exit(300);
  }

  ri1.BitMap=&b1;      /* RasInfo zeigt auf BitMap */
  ri1.RxOffset=0;      /* Verschiebung des 0-Punkts im Grafikspeicher */
  ri1.RyOffset=0;
  ri1.Next=NULL;       /* Naechster RasInfo: Keiner */

  ri2.BitMap=&b2;
  ri2.RxOffset=0;
  ri2.RyOffset=0;
  ri2.Next=NULL;

  cm1=GetColorMap(8);
  if(cm1==NULL) exit(300);
  colorpalette=(unsigned short *)cm1->ColorTable;
  for(i=0;i<8;i++) {
    *colorpalette++=colortable[i];
  }

  cm2=GetColorMap(8);
  if(cm2==NULL) exit(400);
  colorpalette=(unsigned short *)cm2->ColorTable;
  for(i=0;i<8;i++) {
    *colorpalette++=colortable[i];
  }


  vp1.DWidth=WIDTH;   /* Die Breite des ViewPorts */
  vp1.DHeight=HEIGHT; /* Die Hoehe des ViewPorts  */
  vp1.RasInfo=&ri1;    /* Zeigt auf die RasInfo-Struktur  */
  vp1.ColorMap=cm1;    /* Zeigt auf die ColorMap-Struktur */

  vp2.DWidth=WIDTH;
  vp2.DHeight=HEIGHT;
  vp2.RasInfo=&ri2;
  vp2.ColorMap=cm2;

  InitRastPort(&rastport);

  MakeVPort(&v1,&vp1);
  MrgCop(&v1);

  MakeVPort(&v2,&vp2);
  MrgCop(&v2);

  for(i=0;i<DEPTH;i++) {
    displaymem=(unsigned char *)b1.Planes[i];
    BltClear(displaymem,RASSIZE(WIDTH,HEIGHT),0);
  }

  for(i=0;i<DEPTH;i++) {
    displaymem=(unsigned char *)b2.Planes[i];
    BltClear(displaymem,RASSIZE(WIDTH,HEIGHT),0);
  }

  LoadView(&v1);

  Rast=AllocRaster(WIDTH,HEIGHT);
  if(Rast==NULL) {
    printf("Shit!\n");
    exit(100);
  }
  tr.RasPtr=Rast;
  tr.Size=RASSIZE(WIDTH,HEIGHT);

  InitArea(&ai,areamem,MAXPTS);

  rastport.TmpRas=&tr;
  rastport.AreaInfo=&ai;
  rastport.BitMap=&b2;
  rp=&rastport;

  SetAPen(rp,1);
  SetBPen(rp,0);
  SetDrMd(rp,JAM1);
}

FreeMemory()
{
  int i;
  LoadView(oldview);

  for(i=0;i<DEPTH;i++) {
    FreeRaster(b1.Planes[i],WIDTH,HEIGHT);
    FreeRaster(b2.Planes[i],WIDTH,HEIGHT);
  }

  FreeRaster(Rast,WIDTH,HEIGHT);

  FreeColorMap(cm1);           /* Farbspeicher freimachen */
  FreeColorMap(cm2);
  FreeVPortCopLists(&vp1);     /* Copper Lists freimachen (Wurden vom */
  FreeVPortCopLists(&vp2);
  FreeCprList(v1.LOFCprList);  /* Copper gebraucht */
  FreeCprList(v2.LOFCprList);

  CloseLibrary(GfxBase);      /* graphics.library loslassen */

  exit(0);                    /* Ade ! */
}

Switch()
{
  int a;
  if(visible==1) {
    visible=2;
    WaitBOVP(&vp1);
    LoadView(&v2);
    rastport.BitMap=&b1;
    for(a=0;a<DEPTH;a++) BltClear((unsigned char *)b1.Planes[a],RASSIZE(WIDTH,HEIGHT),0);
  }
  else {
    visible=1;
    WaitBOVP(&vp2);
    LoadView(&v1);
    rastport.BitMap=&b2;
    for(a=0;a<DEPTH;a++) BltClear((unsigned char *)b2.Planes[a],RASSIZE(WIDTH,HEIGHT),0);
  };
}
     
  

