/*
 * Fichier expl_gd2_2.c
 *
 * Pour les explications de base,
 * se reporter à l'article sur gd.
 */
#include <stdlib.h>
#include <stdio.h>
#include <gd.h>
#include <math.h>

#define en_radians(ndeg) (M_PI*(ndeg)/180)
#define min(a,b) ( (a) <= (b) ? (a) : (b) )
#define min4(a,b,c,d) ( min ( (a) , min( (b), min( (c) , (d) ) ) )

// Deux macros qui simplifient la vie
#define brect_largeur (brect[4]-brect[0])
#define brect_hauteur (brect[1]-brect[5])

int main(void) {
  gdImagePtr image;
  FILE *image_png;
  char *err;
  int rouge, blanc, jaune, noir;
  char *chaine = "santé"; // La chaîne à écrire
  char *font = "/home/xavier/Docs/contribs_lea/c4/comic.ttf";
  double taille = 20; // La taille de la police
  int brect[8]; // Les coordonnées du rectangle entourant le texte entier.
  gdPoint brect_points[4]; // Le tableau de points pour tracer le polygone

  image = gdImageCreate(100, 100);
  blanc = gdImageColorAllocate(image, 255, 255, 255);
  rouge = gdImageColorAllocate(image, 255, 0, 0);
  jaune = gdImageColorAllocate(image, 255, 255, 0);
  noir = gdImageColorAllocate(image, 0, 0, 0);

  gdImageFilledRectangle(image, 20, 40, 80, 60, rouge);
  gdImageFilledRectangle(image, 40, 20, 60, 80, rouge);

  /* Les nouveautés commencent ici */
  err = gdImageStringFT (NULL, brect,
                         jaune, font,
                         taille,
                         en_radians(45),
                         0,
                         0,
                         chaine);
  brect_points[0].x = brect[0]+50-(brect_largeur-brect[0])/2;
  brect_points[0].y = brect[1]+50+(brect_hauteur-brect[1])/2;
  brect_points[1].x = brect[2]+50-(brect_largeur-brect[0])/2;
  brect_points[1].y = brect[3]+50+(brect_hauteur-brect[1])/2;
  brect_points[2].x = brect[4]+50-(brect_largeur-brect[0])/2;
  brect_points[2].y = brect[5]+50+(brect_hauteur-brect[1])/2;
  brect_points[3].x = brect[6]+50-(brect_largeur-brect[0])/2;
  brect_points[3].y = brect[7]+50+(brect_hauteur-brect[1])/2;
  gdImagePolygon (image, brect_points, 4, noir);
  err = gdImageStringFT (image,
                         brect,
                         jaune,
                         font,
                         taille,
                         en_radians(45),
                         50-(brect_largeur-brect[0])/2,
                         50+(brect_hauteur-brect[1])/2,
                         chaine);
  if (err) fprintf(stderr, "%s\n", err);

  /* Les nouveautés s'arrêtent ici */

  image_png = fopen("expl2.png", "w");
  gdImagePng(image, image_png);
  fclose(image_png);

  gdImageDestroy(image);

  exit (0);
}