/**********************************************************************
will add copyright bs later

$Id$
**********************************************************************/

#include "ogPixCon.h"
#include "objgfx40.h"
#include "ogFont.h"
#include "ogSprite.h"
#include "ogBlit.h"
#ifdef __DJGPP__
#include "ogDisplay_VESA.h"
#endif
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <time.h>

using namespace std;

void
testPixCon(void) {
  ogSurface * buf1 = new ogSurface();
  ogSurface * buf2 = new ogSurface();
  ogPixCon * pixCon = new ogPixCon(OG_PIXFMT_32BPP, OG_PIXFMT_16BPP);
  uInt8 r, g, b;

  buf1->ogCreate(100, 100, OG_PIXFMT_32BPP);
  buf2->ogCreate(100, 200, OG_PIXFMT_16BPP);
  
  buf1->ogSetPixel(0, 0, buf1->ogPack(128, 42, 69));
  buf2->ogSetPixel(0, 0, pixCon->ConvPix(buf1->ogGetPixel(0, 0)));

  buf2->ogUnpack(buf2->ogGetPixel(0, 0), r, g, b);
//  cout << "r: " << (uInt32)r << endl;
//  cout << "g: " << (uInt32)g << endl;
//  cout << "b: " << (uInt32)b << endl;
  return;
}; // textPixCon

void testSetPixel(ogSurface& buf) {
  uInt32 xx,yy;
  buf.ogClear(buf.ogPack(0,255,0));
  for (yy = 0; yy<=buf.ogGetMaxY(); yy++)
    for (xx = 0; xx<=buf.ogGetMaxX(); xx++)
      buf.ogSetPixel(xx,yy,xx*yy);
  getc(stdin);
  return;
} // testSetPixel

void testRect(ogSurface& buf) {
  uInt32 count;
  if (buf.ogGetBPP()==8)
    for (count=0; count<1000; count++)
      buf.ogRect(buf.ogGetMaxX() / 2 - count, buf.ogGetMaxY() / 2 - count,
                 buf.ogGetMaxX() / 2 + count, buf.ogGetMaxY() / 2 + count,
                 count);
  else
    for (count=0; count<1000; count++)
      buf.ogRect(buf.ogGetMaxX() / 2 - count, buf.ogGetMaxY() / 2 - count,
                 buf.ogGetMaxX() / 2 + count, buf.ogGetMaxY() / 2 + count,
                 buf.ogPack(count,count,count));
  getc(stdin);
  return;
} // testRect
  
void testLine(ogSurface & buf) {
  uInt32 count;
  uInt32 colour;
  buf.ogClear(buf.ogPack(0, 0, 0));
  for (count = 150; count > 0; count--) {
    buf.ogLine(buf.ogGetMaxX() / 2, buf.ogGetMaxY() / 2,
                  buf.ogGetMaxX(), count*4, buf.ogPack(192, 192, 192));
  } // for count
  getc(stdin);
  if (buf.ogGetBPP()==8)
    for (count=0; count<(buf.ogGetMaxX()+1); count+=2) {
      buf.ogLine(count-10,-10,buf.ogGetMaxX()-count+10,buf.ogGetMaxY()+10,count);
    } // for
  else {
    colour = 255;
    for (count = 0; count < (buf.ogGetMaxX()+1)/2; count+=4) {
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 buf.ogGetMaxX()/2-count,buf.ogGetMaxY(),
                 buf.ogPack(colour,colour,colour));
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 buf.ogGetMaxX()/2+count,buf.ogGetMaxY(),
                 buf.ogPack(colour,colour,colour));
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 buf.ogGetMaxX()/2-count,0,
                 buf.ogPack(0,colour,0));
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 buf.ogGetMaxX()/2+count,0,
                 buf.ogPack(0,colour,0));
                 
      --colour;
    } // for

    colour = 255;
    for (count = 0; count < (buf.ogGetMaxY()+1)/2; count+=4) {
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 0, buf.ogGetMaxY()/2-count,
                 buf.ogPack(colour,0,0));
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 0, buf.ogGetMaxY()/2+count,
                 buf.ogPack(colour,0,0));
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 buf.ogGetMaxX(), buf.ogGetMaxY()/2-count,
                 buf.ogPack(0,0,colour));
      buf.ogLine(buf.ogGetMaxX()/2, buf.ogGetMaxY()/2,
                 buf.ogGetMaxX(), buf.ogGetMaxY()/2+count,
                 buf.ogPack(0,0,colour));
      --colour;
    } // for
  } // else
  getc(stdin);
  return;
} // testLine

void testClear(ogSurface & buf) {
  uInt32 count;
  if (buf.ogGetBPP()==8)
    for (count=0; count<256; count++)
      buf.ogClear(count);
  else {
    for (count=0; count<256; count+=8)
      buf.ogClear(buf.ogPack(count,0,0));
    for (count=0; count<256; count+=8)
      buf.ogClear(buf.ogPack(0,count,0));
    for (count=0; count<256; count+=8)
      buf.ogClear(buf.ogPack(0,0,count));
    for (count=0; count<256; count+=8)
      buf.ogClear(buf.ogPack(count,count,count));
  } // else
  getc(stdin);
  return;
} // testClear

void testCircle(ogSurface & buf) {
  uInt32 count;
  if (buf.ogGetBPP()==8)
    for (count=0; count<1000; count++)
      buf.ogCircle(buf.ogGetMaxX()/2,buf.ogGetMaxY()/2, count, count);
  else
    for (count=0; count<1000; count++)
      buf.ogCircle(buf.ogGetMaxX()/2,buf.ogGetMaxY()/2,count,buf.ogPack(count,0,count));
  getc(stdin);
} // testCircle

void testVFlip(ogSurface & buf) {
  buf.ogVFlip();
  getc(stdin);
  return;
} // testVFlip

void testHFlip(ogSurface & buf) {
  buf.ogHFlip();
  getc(stdin);  
  return;
} // testHFlip

void testArc(ogSurface & buf) {
  uInt32 radius;
  uInt32 mid_x, mid_y;
  mid_x = buf.ogGetMaxX()/2;
  mid_y = buf.ogGetMaxY()/2;
  if (buf.ogGetBPP()==8) {
    for (radius = 1; radius <9; radius++) {
      buf.ogArc(mid_x, mid_y, radius*10, 0, 90, radius*15);
      buf.ogArc(mid_x, mid_y, radius*10, 180,270, 249-(radius-1)*16);
    } // for
  } else {
    for (radius = 1; radius <255; radius++) {
      buf.ogArc(mid_x, mid_y, radius, 0, 90, buf.ogPack(radius,radius,0));
      buf.ogArc(mid_x, mid_y, radius, 180,270,buf.ogPack(0,255-radius,255-radius));
    } // for
  } // else
  getchar();
  return;
} // testArc

void testCubicBezierCurve(ogSurface & buf) {
  buf.ogCubicBezierCurve(100, 100,
                         300,50,
                         400,120,
                         350,300,
                         25, buf.ogPack(255,255,255));
  getchar();
  return;
} // testCubicBezierCurve

void testCurve(ogSurface & buf) {
  buf.ogCurve(10,10,100,30,35,160,20,buf.ogPack(255,255,255));
  getchar();
  return;
} // testCurve

void testSprite(ogSurface & buf) {
  uInt32 count;
  uInt32 w,h;
  ogSprite * sprite = NULL;
  sprite = new ogSprite();
  
  buf.ogClear(buf.ogPack(0, 0, 0));
  testLine(buf);
  if (buf.ogGetBPP()==8)
    sprite->Get(buf,
                buf.ogGetMaxX()/2-80,buf.ogGetMaxY()/2-80,
                buf.ogGetMaxX()/2+80,buf.ogGetMaxY()/2+80);
  else
    sprite->Get(buf,
                buf.ogGetMaxX()/2-150,buf.ogGetMaxY()/2-150,
                buf.ogGetMaxX()/2+150,buf.ogGetMaxY()/2+150);

  sprite->Save("test.spr");
  delete sprite;
  sprite = new ogSprite();
  sprite->Load("test.spr");
  w = sprite->GetWidth()/2;
  h = sprite->GetHeight()/2;
  buf.ogClear(buf.ogPack(0, 0, 0));
  sprite->Put(buf,-10000,-10000);  // test *really* off the screen
  sprite->Put(buf,10000,10000);    // test *really* off the screen
  
  sprite->Put(buf,buf.ogGetMaxX()/2-w,buf.ogGetMaxY()/2-h);
  sprite->Put(buf,-w,-h);
  sprite->Put(buf,buf.ogGetMaxX()/2-w,-h);
  sprite->Put(buf,buf.ogGetMaxX()-w,-h);
  sprite->Put(buf,-w,buf.ogGetMaxY()/2-h);
  sprite->Put(buf,buf.ogGetMaxX()-w,buf.ogGetMaxY()/2-h);
  sprite->Put(buf,-w,buf.ogGetMaxY()-h);
  sprite->Put(buf,buf.ogGetMaxX()/2-w,buf.ogGetMaxY()-h);
  sprite->Put(buf,buf.ogGetMaxX()-w,buf.ogGetMaxY()-h);
  getc(stdin);
  for (count = 0; count < 256; count++) {
    sprite->Put(buf,random() % (buf.ogGetMaxX()+sprite->GetWidth()) - sprite->GetWidth(),
                    random() % (buf.ogGetMaxY()+sprite->GetHeight()) - sprite->GetHeight());
  } // for
  delete sprite;
  getc(stdin);
  return;
} // testSprite

void testBlit(ogSurface & buf) {
  int32 xx, yy, count;
  ogBlit * blit = NULL;
  ogBlit * blit2 = NULL;

  blit = new ogBlit();
 
  buf.ogClear(buf.ogPack(0, 0, 0));
  for (xx= 0; xx<= 20; xx++) {
    buf.ogLine(128,0,128-xx*6,255,buf.ogPack(255,255,255));
    buf.ogLine(128,0,128+xx*6,255,buf.ogPack(255,255,255));
    buf.ogLine(128,255,128-xx*6,0,buf.ogPack(255,255,255));
    buf.ogLine(128,255,128+xx*6,0,buf.ogPack(255,255,255));
  } // for

  buf.ogFillCircle(128,128,60,buf.ogPack(255,255,255));
  blit->Get(buf,0,0,255,255);
  for (yy = 0; yy<=(int32)buf.ogGetMaxY(); yy++)
    for (xx = 0; xx<=(int32)buf.ogGetMaxX(); xx++)
      buf.ogSetPixel(xx,yy,xx*yy);
  blit->Save("test.blt");
  blit2 = new ogBlit(*blit, true);

  delete blit;
  blit2->Save("test2.blt"); 
  blit = new ogBlit();
  blit->Load("test.blt");

  blit->Put(buf,-10000,-10000);  // test *really* off the screen
  blit->Put(buf,10000,10000);    // test *really* off the screen

  blit->Put(buf,-128,-128);
  blit->Put(buf,buf.ogGetMaxX()/2-128,-128);
  blit->Put(buf,buf.ogGetMaxX()-128,-128);
  blit->Put(buf,-128,buf.ogGetMaxY()/2-128);
  blit->Put(buf,buf.ogGetMaxX()/2-128,buf.ogGetMaxY()/2-128);
  blit->Put(buf,buf.ogGetMaxX()-128,buf.ogGetMaxY()/2-128);
  blit->Put(buf,-128,buf.ogGetMaxY()-128);
  blit->Put(buf,buf.ogGetMaxX()/2-128,buf.ogGetMaxY()-128);
  blit->Put(buf,buf.ogGetMaxX()-128,buf.ogGetMaxY()-128);

  getc(stdin);
  buf.ogClear(buf.ogPack(0, 0, 0));
  for (yy = 0; yy<=(int32)buf.ogGetMaxY(); yy++)
    for (xx = 0; xx<=(int32)buf.ogGetMaxX(); xx++)
      buf.ogSetPixel(xx,yy,xx*yy);
  blit->GetBlitWithMask(buf,
                        buf.ogGetMaxX()/2-blit->GetWidth(),
                        buf.ogGetMaxY()/2-blit->GetHeight());
  buf.ogClear(buf.ogPack(0, 0, 0));
  blit->Put(buf,-10000,-10000);  // test *really* off the screen
  blit->Put(buf,10000,10000);    // test *really* off the screen
  
  blit->Put(buf,-128,-128);
  blit->Put(buf,buf.ogGetMaxX()/2-128,-128);
  blit->Put(buf,buf.ogGetMaxX()-128,-128);
  blit->Put(buf,-128,buf.ogGetMaxY()/2-128);
  blit->Put(buf,buf.ogGetMaxX()/2-128,buf.ogGetMaxY()/2-128);
  blit->Put(buf,buf.ogGetMaxX()-128,buf.ogGetMaxY()/2-128);
  blit->Put(buf,-128,buf.ogGetMaxY()-128);
  blit->Put(buf,buf.ogGetMaxX()/2-128,buf.ogGetMaxY()-128);
  blit->Put(buf,buf.ogGetMaxX()-128,buf.ogGetMaxY()-128);
  
  getc(stdin);
  for (count = 0; count < 1000; count++) {
    blit->Put(buf,random() % (buf.ogGetMaxX()+blit->GetWidth()) - blit->GetWidth(),
                  random() % (buf.ogGetMaxY()+blit->GetHeight()) - blit->GetHeight());
  } // for
  getc(stdin);
  for (yy = 0; yy<=(int32)buf.ogGetMaxY(); yy++)
    for (xx = 0; xx<=(int32)buf.ogGetMaxX(); xx++)
      buf.ogSetPixel(xx,yy,xx*yy);

  blit->GetBlitWithMask(buf,buf.ogGetMaxX()/2,buf.ogGetMaxY()-128);
  buf.ogClear(buf.ogPack(128,128,128));
  blit->Put(buf,buf.ogGetMaxX()/2-128,buf.ogGetMaxY()/2-128);  
  getc(stdin);
  delete blit;
  delete blit2;
  
  return;
} // testBlit

void
testBlit2(ogSurface & buf) {
  ogBlit * blit = new ogBlit();
  ogSurface * buf2 = new ogSurface();
  ogSurface * blitsource = new ogSurface();
  uInt32 xx,yy,count,colour;
  buf.ogClear(buf.ogPack(0, 0, 0));
  if (!buf2->ogClone(buf)) cout << "Clone failed!!!" << endl;
  if (!blitsource->ogClone(buf)) cout << "Clone failed!!" << endl;

  colour = 255;
  for (count = 0; count < (buf2->ogGetMaxX()+1)/2; count+=4) {
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               buf2->ogGetMaxX()/2-count,buf2->ogGetMaxY(),
               buf2->ogPack(colour,colour,colour));
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               buf2->ogGetMaxX()/2+count,buf2->ogGetMaxY(),
               buf2->ogPack(colour,colour,colour));
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               buf2->ogGetMaxX()/2-count,0,
               buf2->ogPack(0,colour,0));
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               buf2->ogGetMaxX()/2+count,0,
               buf2->ogPack(0,colour,0));
    --colour;
  } // for

  colour = 255;
  for (count = 0; count < (buf.ogGetMaxY()+1)/2; count+=4) {
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               0, buf2->ogGetMaxY()/2-count,
               buf2->ogPack(colour,0,0));
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               0, buf2->ogGetMaxY()/2+count,
               buf2->ogPack(colour,0,0));
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               buf2->ogGetMaxX(), buf2->ogGetMaxY()/2-count,
               buf2->ogPack(0,0,colour));
    buf2->ogLine(buf2->ogGetMaxX()/2, buf2->ogGetMaxY()/2,
               buf2->ogGetMaxX(), buf2->ogGetMaxY()/2+count,
               buf2->ogPack(0,0,colour));
    --colour;
  } // for
  for (yy = 0; yy<=buf2->ogGetMaxY(); yy++)
    for (xx = 0; xx<=buf2->ogGetMaxX(); xx++)
      buf2->ogSetPixel(xx,yy, xx*yy);
  for (count = 0; count<200; count++)
    blitsource->ogFillCircle(random() % blitsource->ogGetMaxX(), random() % blitsource->ogGetMaxY(),
                             random() % 35+1,blitsource->ogPack(255,255,255));

  blit->Get(*blitsource,0,0,blitsource->ogGetMaxX(),blitsource->ogGetMaxY());
  blit->Save("bigblit.blt");
  delete blit;
  blit = new ogBlit;
  blit->Load("bigblit.blt");
  for (count = 0; count<=256; count+=4) {
  for (yy = 0; yy<=buf2->ogGetMaxY(); yy++)
    for (xx = 0; xx<=buf2->ogGetMaxX(); xx++)
      buf2->ogSetPixel(xx,yy,xx*yy*count);
  
    blit->GetBlitWithMask(*buf2,0,0);
    blit->Put(buf,0,0);
  } // for

  getc(stdin);
  delete blitsource;
  delete buf2;
  delete blit;
  return;
} // testBlit2

void
testBlit3(ogSurface & buf) {
  int32 count;
  ogBlit * blit = NULL;
  ogSurface * buf2 = NULL;
  buf2 = new ogSurface();
  blit = new ogBlit();
  buf.ogClear(buf.ogPack(0, 0, 0));
  buf.ogFillCircle(buf.ogGetMaxX()/2,buf.ogGetMaxY()/2,14,buf.ogPack(255,255,255));
  blit->Get(buf,buf.ogGetMaxX()/2-20,buf.ogGetMaxY()/2-20,
                buf.ogGetMaxX()/2+20,buf.ogGetMaxY()/2+20);
  blit->Put(buf,0,0);
  for (count=0; count<(int32)buf.ogGetMaxX(); count++)
    buf.ogLine(count,0,count,buf.ogGetMaxY(),count);
  buf2->ogClone(buf);    
  blit->GetBlitWithMask(*buf2,10,10);
  buf.ogClear(buf.ogPack(63,63,63));
  for (count=-40; count<(int32)buf.ogGetMaxX()+10; count++) {
    blit->GetBlitWithMask(*buf2,count,buf2->ogGetMaxY()/2-20);
    blit->Put(buf,count,buf.ogGetMaxY()/2-20);
    blit->GetBlitWithMask(*buf2,buf2->ogGetMaxX()/2-20,count);
    blit->Put(buf,buf.ogGetMaxX()/2-20,count);
   }
  getc(stdin);
  delete blit;
  return;
} // testBlit3

void
testSaveLoadPal(ogSurface & buf) {
  uInt32 count;
  testRect(buf);
  for (count=0; count<256; count++)
    buf.ogSetPalette(count,count,count,count);
  if (buf.ogSavePalette("test.pal")==false) cout << "SavePal() failed" << endl;
  for (count=0; count<256; count++)
    buf.ogSetPalette(count,0,0,0);
  if (buf.ogLoadPalette("test.pal")==false) cout << "LoadPal() failed" << endl;
  testRect(buf);
} // testSaveLoadPal

void
testPolygon(ogSurface & buf) {
  ogPoint2d points[16];
  uInt32 count;
  buf.ogClear(buf.ogPack(0, 0, 0));
  for (count=0; count<16; count++) {
    points[count].x = random() % buf.ogGetMaxX();
    points[count].y = random() % buf.ogGetMaxY();
  } // for
  buf.ogFillPolygon(16, points, buf.ogPack(random() & 255,random() & 255,random() & 255));
  getc(stdin);
  return;
} // testPolygon

void
testSpline(ogSurface & buf) {
  ogPoint2d points[8];
  uInt32 i;
  for (i=0; i<8; i++) {
    points[i].x = random() % buf.ogGetMaxX();
    points[i].y = random() % buf.ogGetMaxY();
  } // for
  buf.ogClear(buf.ogPack(0, 0, 0));
  buf.ogPolygon(8, points, buf.ogPack(22,229,52));
  buf.ogSpline(8, points, 24, buf.ogPack(64,64,255));
  buf.ogBSpline(8, points, 24, buf.ogPack(255,128,128));
  getchar();
  return;
} // testSpline

void
testFont(ogSurface & buf) {
  uInt32 xx, yy;
  ogBitFont * font = new ogBitFont();
  font->Load("SCRIPT.DPF", 0);
  font->SetFGColor(255, 255, 255, 255);
  font->SetBGColor(0, 0, 0, 255);

  font->PutString(buf, 0, 0, "abAByzYZ");

  for (yy = 0; yy<font->GetHeight(); yy++) {
    for (xx = 0; xx<79; xx++)
      if ((buf.ogGetPixel(xx, yy) & buf.ogGetAlphaMasker()) == 0) 
        cout << " ";
      else
        cout << "*";
    cout << endl;
  }

  delete font;
  return;
} // testFont

void
testGouraud(ogSurface & buf) {
  uInt8 r, g, b;
  ogPoint2d points[4];
  ogRGBA8 colours[4];
  r = g = b = 0;

  points[0].x = buf.ogGetMaxX() - 150;
  points[0].y = 0;
  points[1].x = buf.ogGetMaxX();
  points[1].y = 0;
  points[2].x = buf.ogGetMaxX();
  points[2].y = 150;
  points[3].x = buf.ogGetMaxX() - 250;
  points[3].y = 250;
  colours[0].red = 255;
  colours[0].green = 0;
  colours[0].blue = 0;
  colours[0].alpha = 255;
  colours[1].red = 0;
  colours[1].green = 255;
  colours[1].blue = 128;
  colours[1].alpha = 255;
  colours[2].red = 128;
  colours[2].green = 255;
  colours[2].blue = 128;
  colours[2].alpha = 255;
  colours[3].red = 63;
  colours[3].green = 63;
  colours[3].blue = 63;
  colours[3].alpha = 255;
  buf.ogFillGouraudPolygon(4, points, colours);
  getc(stdin);
  return;
} // testGouraud

void
testCopyBuf(ogSurface & buf) {
  ogSurface * buf2 = new ogSurface();
  ogPixelFmt pixFmt;
  buf.ogGetPixFmt(pixFmt);
  buf2->ogCreate(400, 400, OG_PIXFMT_32BPP);
  buf2->ogClear(buf2->ogPack(255, 128, 255));
  buf.ogCopyBuf(0, 0, *buf2, 0, 0, buf2->ogGetMaxX(), buf2->ogGetMaxY());
  delete buf2;
  getc(stdin);
  return;
}

void
testFillRect(ogSurface & buf) {
  uInt32 count;
  for (count = 100; count > 0; count--) {
    buf.ogFillRect(count, count, 0, 0, buf.ogPack(count*2, count*2, count*2));
  }
  getc(stdin);
  
  return;
} // testFillRect()
int main() {
  ogSurface* buf    = NULL;
 cout <<  "Starting program" << endl;
#ifdef __DJGPP__
  buf = new ogDisplay_VESA();
  buf->ogCreate(800, 600, OG_PIXFMT_32BPP);
#else
  buf = new ogSurface();
  if (buf->ogCreate(1024, 768, OG_PIXFMT_16BPP)==false) exit(1);
#endif
  srandom(time(NULL));

//  buf->SetBlending(true);
//  buf->SetAlpha(127);
  buf->ogSetAntiAliasing(true);
  
//cout << "testPixCon()" << endl;
//  testPixCon();
 cout << "testFillRect()" << endl;
  testFillRect(*buf);
 cout << "testCopyBuf()" << endl;
  testCopyBuf(*buf);
 cout << "testGouraud()" << endl;
  testGouraud(*buf);
 cout << "testFont()" << endl;
  testFont(*buf);
 cout << "TestRect()" << endl;
  testRect(*buf);
 cout << "testCircle()" << endl;
  testCircle(*buf);
 cout << "TestLine()" << endl;
  testLine(*buf);
cout << "TestVFlip()" << endl;
  testVFlip(*buf);
cout << "TestHFlip()" << endl;
  testHFlip(*buf);
cout << "TestArc()" << endl;
  testArc(*buf);
cout << "TestSetPixel()" << endl;
  testSetPixel(*buf);
cout << "TestClear()" << endl;
  testClear(*buf);
cout << "TestSprite()" << endl;
  testSprite(*buf);
cout << "TestBlit()" << endl;
   testBlit(*buf);
cout << "TestBlit2()" << endl;
   testBlit2(*buf);
//  testBlit3(*buf);  // special test for 320x200x8bpp
//  testSaveLoadPal(*buf);    // use an 8bpp mode
cout << "TestPolygon()" << endl;
  testPolygon(*buf);
cout << "TestCurve()" << endl;
  testCurve(*buf);
cout << "TestSpline()" << endl;
  testSpline(*buf);
  delete buf;
//  buf->SetPixel(0, 0, buf->Pack(0, 0, 0)); 
  return(0);
}
