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

// 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"; // Le chemin relatif ou absolu vers la police
  double taille = 20; // La taille de la police
  int brect[8]; // Les coordonnées du rectangle entourant le texte entier.
  /* brect[0] X bas gauche
   * brect[1] Y bas gauche
   * brect[2] X bas droit
   * brect[3] Y bas droit
   * brect[4] X haut droit
   * brect[5] Y haut droit
   * brect[6] X haut gauche
   * brect[7] Y haut gauche
   */

  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 */
  /* On a droit à 60x20 pour placer notre chaîne
   * soit brect[4]-brect[0]<60 ET brect[1]-brect[5]<20
   * --> Pour récupérer brect sans écrire le texte, on place im à NULL
   * Si on a un dépassement on réduit la taille de la police et on recommence
   */
  do {
    err = gdImageStringFT (NULL, brect,
                           jaune, font,
                           taille--,
                           0,
                           0,
                           0,
                           chaine);
    if (err) fprintf(stderr, "%s\n", err);
    fprintf (stderr, "Essai taille : %.0f\n", taille+1);
    fprintf (stderr,
             "* bas gauche ( %d, %d ), haut droite ( %d, %d )\n",
             brect[0], brect[1],
             brect[4], brect[5]);
    fprintf (stderr,
             "* largeur x hauteur : %dx%d\n",
             brect_largeur,
             brect_hauteur);
  } while ( ( brect_hauteur >= 20 ) || ( brect_largeur >= 60 ) );
  /* Une fois ici on a la bonne taille moins un
   * On cherche les coordonnées pour centrer le texte,
   * sachant que le centre de l'image est à (50,50)
   */

  /*
  gdImageRectangle (image,
                    50-brect_largeur/2,
                    50-brect_hauteur/2,
                    50+brect_largeur/2,
                    50+brect_hauteur/2,
                    noir);
   */

  /* Le milieu de l'image la moitié de la largeur nous donne le x gauche
   * Le milieu de l'image + la moitié de la hauteur nous donne le y bas
   * on retracnche la moitié des brect[0] et brect[1]
   * car on a vu qu'il ne valaient pas nécéessairement 0
   */
  err = gdImageStringFT (image,
                         brect,
                         jaune,
                         font,
                         ++taille,
                         0,
                         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("expl1.png", "w");
  gdImagePng(image, image_png);
  fclose(image_png);

  gdImageDestroy(image);

  exit (0);
}