#include "gd.h"

/* This is a quickie test program to show a bug in gd.
 * There is a red line that is drawn across the bottom of
 * the image that shouldn't be there.
 *
 */

int main(int argc, char *argv[]) 
{

  //                              R    G    B
  int white   = gdTrueColorAlpha(255, 255, 255, 10);
  int black   = gdTrueColorAlpha(  0,   0,   0, 10);
  int red     = gdTrueColorAlpha(255,   0,   0, 10);
  int green   = gdTrueColorAlpha(  0, 255,   0, 10);
  int blue    = gdTrueColorAlpha(  0,   0, 255, 10);
  int yellow  = gdTrueColorAlpha(255, 255,   0, 10);
  int cyan    = gdTrueColorAlpha(  0, 255, 255, 10);
  int magenta = gdTrueColorAlpha(255,   0, 255, 10);
  int purple  = gdTrueColorAlpha(100,   0, 100, 10);

  gdImagePtr im = gdImageCreateTrueColor(256, 256);
  gdImageFilledRectangle(im, 0, 0, 256, 256, white);

  gdPoint pointy[5]; 
  int d,x, y, top, bot, left, right;
  
  // M (bridge)
  // okay with stock gd
  // broken with mine
  top = 240;
  bot = 255;
  d = 30;
  x = 100;
  pointy[0].x = x;
  pointy[0].y = top;

  pointy[1].x = x+2*d;
  pointy[1].y = top;

  pointy[2].x = x+2*d;
  pointy[2].y = bot;

  pointy[3].x = x+d;
  pointy[3].y = (top+bot)/2;

  pointy[4].x = x;
  pointy[4].y = bot;
  gdImageFilledPolygon(im, pointy, 5, yellow);

  
  // left-facing M not on baseline
  // okay with stock gd
  top = 40;
  bot = 70;
  left = 120;
  right = 180;
  pointy[0].x = left;
  pointy[0].y = top;

  pointy[1].x = right;
  pointy[1].y = top;

  pointy[2].x = right;
  pointy[2].y = bot;

  pointy[3].x = left;
  pointy[3].y = bot;

  pointy[4].x = (left+right)/2;
  pointy[4].y = (top+bot)/2;
  gdImageFilledPolygon(im, pointy, 5, purple);

  // left-facing M on baseline
  // broken with stock gd
  // okay with mine
  top = 240;
  bot = 270;
  left = 20;
  right = 80;
  pointy[0].x = left;
  pointy[0].y = top;
  pointy[1].x = right;
  pointy[1].y = top;
  pointy[2].x = right;
  pointy[2].y = bot;
  pointy[3].x = left;
  pointy[3].y = bot;
  pointy[4].x = (left+right)/2;
  pointy[4].y = (top+bot)/2;
  gdImageFilledPolygon(im, pointy, 5, magenta);


  // okay with stock gd
  // broken with mine
  gdPoint diamond[4]; 
  d = 30;
  x = 150;
  y = 150;
  diamond[0].x = x-d;
  diamond[0].y = y;
  diamond[1].x = x;
  diamond[1].y = y+d;
  diamond[2].x = x+d;
  diamond[2].y = y;
  diamond[3].x = x;
  diamond[3].y = y-d;
  gdImageFilledPolygon(im, diamond, 4, green);



  // okay with stock gd
  // okay with mine
  x = 180;
  y = 225;
  diamond[0].x = x-d;
  diamond[0].y = y;
  diamond[1].x = x;
  diamond[1].y = y+d;
  diamond[2].x = x+d;
  diamond[2].y = y;
  diamond[3].x = x;
  diamond[3].y = y-d;
  gdImageFilledPolygon(im, diamond, 4, red);

  // okay with stock gd
  // okay with mine
  x = 225;
  y = 255;
  diamond[0].x = x-d;
  diamond[0].y = y;
  diamond[1].x = x;
  diamond[1].y = y+d;
  diamond[2].x = x+d;
  diamond[2].y = y;
  diamond[3].x = x;
  diamond[3].y = y-d;
  gdImageFilledPolygon(im, diamond, 4, cyan);


  // M (bridge) not touching bottom boundary
  // okay with stock gd
  // broken with mine
  top = 100;
  bot = 150;
  x = 30;
  pointy[0].x = x;
  pointy[0].y = top;
  pointy[1].x = x+2*d;
  pointy[1].y = top;
  pointy[2].x = x+2*d;
  pointy[2].y = bot;
  pointy[3].x = x+d;
  pointy[3].y = (top+bot)/2;
  pointy[4].x = x;
  pointy[4].y = bot;
  gdImageFilledPolygon(im, pointy, 5, black);

  FILE * pngout = fopen("/tmp/tmp.png", "wb");	
  gdImagePng(im, pngout);
  fclose(pngout);
}
