/*******************************************************************
BITMAP : Sauver le dessin de l'écran (capture d'écran)

         Le dessin se fait directement à l'écran
         (code dérivé de l'exemple 4_0 souris du cours 1)
         Le fichier sauvé est "capture_ecran.bmp"

         Une option STORE permet de mémoriser l'état actuel
         de l'écran et de le résituer avec UNDO
*******************************************************************/

#include <allegro.h>

int main(int argc, char *argv[])
{
    // Image mémoire servant à mémoriser l'écran
    BITMAP *page;

    // tableau pour les boutons de choix de couleurs
    int couleurs[5];

    // tableau pour les noms sur les boutons de l'interface
    char *noms[10] = { "","","","","","CLEAR","STORE","UNDO","SAVE","EXIT"};

    int fin,ymenu,couleur;


    // Lancer allegro et le mode graphique
    allegro_init();
    install_mouse();
    install_keyboard();

    set_color_depth(desktop_color_depth());
    if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0)!=0)
    {
        allegro_message("prb gfx mode");
        allegro_exit();
        exit(EXIT_FAILURE);
    }

    show_mouse(screen);

    // déterminer les couleurs de la palette du menu
    couleurs[0]=makecol(  0,  0,  0);
    couleurs[1]=makecol(255,255,255);
    couleurs[2]=makecol(255,  0,  0);
    couleurs[3]=makecol(  0,255,  0);
    couleurs[4]=makecol(  0,  0,255);

    // dessiner les zones de l'interface en haut à gauche de l'écran
    for (ymenu=0;ymenu<10;ymenu++){
        if (ymenu<5)
            rectfill(screen,0,ymenu*40,79,ymenu*40+39,couleurs[ymenu]);
        rect(screen,0,ymenu*40,79,ymenu*40+39,makecol(255,255,255));
        textprintf_ex(screen,font,20,ymenu*40+16,makecol(255,255,255),-1,noms[ymenu]);
    }

    // couleur initiale : blanc
    couleur=makecol(255,255,255);

    // Création de l'image mémoire à la taille de l'écran
    page=create_bitmap(SCREEN_W,SCREEN_H);

    // Boucle interactive
    fin=0;
    while (!fin)
    {
        // si clic gauche...
        if (mouse_b & 1)
        {
            // si je suis dans le menu...
            if (mouse_x<80 && mouse_y< 10*40){
                ymenu=mouse_y/40;
                switch(ymenu)
                {
                    // CHOIX D'UNE COULEUR
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                            couleur=couleurs[ymenu];
                            break;

                    // CLEAR : effacer partie droite de l'écran (pas le menu !)
                    case 5:
                            rectfill(screen,80,0,SCREEN_W-1,SCREEN_H-1,makecol(0,0,0));
                            break;

                    // STORE : copie de l'écran sur la page mémoire
                    case 6:
                            blit(screen,page,0,0,0,0,SCREEN_W,SCREEN_H);
                            break;

                    // UNDO : copie de la page mémoire sur l'écran
                    case 7:
                            blit(page,screen,0,0,0,0,SCREEN_W,SCREEN_H);
                            break;

                    // SAVE : copie de l'écran sur la page mémoire
                    //        puis sauvegarde de la page dans un fichier .bmp
                    case 8:
                            blit(screen,page,0,0,0,0,SCREEN_W,SCREEN_H);
                            save_bitmap("capture.bmp",page,NULL);
                            break;

                    // EXIT : indiquer de terminer la boucle interactive (fin programme)
                    case 9:
                            fin=1;
                            break;
                }

                // tant que je reste appuyé sur le bouton souris rester bloqué ici
                while (mouse_b&1);
            }

            // si je ne suis pas dans le menu alors je pose la couleur active
            else
                circlefill(screen, mouse_x, mouse_y, 15, couleur);

        } // Fin de test  if (mouse_b & 1)

        if (key[KEY_ESC])
            fin=1;

    } // Fin de boucle interactive

    return 0;
}
END_OF_MAIN();