# mission2.adb

    --
    -- Ce programme affiche une image avec différents filtres.
    --

    with JPG, GAda.Graphics, Gada.Plus ;

    procedure Mission2 is

       package Gr renames GAda.Graphics ;

       -- Affiche l'image IMG aux coordonnées x,y de la fenêtre graphique.
       procedure Afficher_Image(Img : JPG.T_Image ; X,Y : Integer) is

          -- Hauteur de l'image
          Haut : Integer := Img'Length(1) ;
       begin
          -- Affichage ligne par ligne et colonne par colonne
          for Ligne in Img'Range(1) loop
             for Colonne in Img'Range(2) loop

                -- L'axe des Y est vers le haut alors que les lignes vont vers le bas
                -- On effectue une symétrie : (- Ligne) et une translation (+ Haut).
                Gr.ColorPoint(X + Colonne, Y + Haut - 1 - Ligne,
                              Img(Ligne, Colonne)) ;
             end loop ;
          end loop ;

       end Afficher_Image ;

       -- Pour factoriser les différents traitements, on définit ce type énuméré
       -- L'alternative consiste simplement à définir 3 versions différentes de l'affichage

       type T_Traitement is (Negatif, Filtre_Rouge, Noir_Blanc) ;

       -- Affiche l'image IMG aux coordonnées x,y et en lui appliquant le traitement TRAIT
       procedure Afficher_Traitement(Img : JPG.T_Image ; X,Y : Integer ; Trait : T_Traitement) is

          Haut : Integer := Img'Length(1) ;

          -- Couleur de l'image originale
          Couleur_Originale : Gr.T_Couleur ;

          -- Couleur après traitement
          Couleur_Traitee : Gr.T_Couleur ;
       begin
          for Ligne in Img'Range(1) loop
             for Colonne in Img'Range(2) loop
                Couleur_Originale := Img(Ligne, Colonne) ;

                case Trait is
                   when Negatif =>
                      Couleur_Traitee.Rouge := 255 - Couleur_Originale.Rouge ;
                      Couleur_Traitee.Bleu := 255 - Couleur_Originale.Bleu ;
                      Couleur_Traitee.Vert := 255 - Couleur_Originale.Vert ;

                   when Filtre_Rouge =>
                      Couleur_Traitee.Bleu := 0 ;
                      Couleur_Traitee.Vert := 0 ;
                      Couleur_Traitee.Rouge := Couleur_Originale.Rouge ;

                   when Noir_Blanc =>
                      Couleur_Traitee.Rouge := (Couleur_Originale.Rouge + Couleur_Originale.Vert +
                                                Couleur_Originale.Bleu) / 3 ;
                      Couleur_Traitee.Bleu := Couleur_Traitee.Rouge ;
                      Couleur_Traitee.Vert := Couleur_Traitee.Rouge ;

                end case ;

                Gr.ColorPoint(X + Colonne, Y + Haut - 1 - Ligne, Couleur_Traitee) ;
             end loop ;
          end loop ;
       end Afficher_Traitement ;

       procedure Tester_Afficher_Image(Nom_Image : String) is
          Image : JPG.T_Image := JPG.Lire_Image(Nom_Image) ;

          Largeur, Hauteur : Integer ;
       begin
          -- La hauteur est le nombre de lignes
          Hauteur := Image'Length(1) ;

          -- La largeur est le nombre de colonnes
          Largeur := Image'Length(2) ;

          Gr.Resize(2 * Largeur, 2 * Hauteur) ;

          Afficher_Image(Image, 0, 0) ;
          Afficher_Traitement(Image, Largeur, 0, Negatif) ;
          Afficher_Traitement(Image, 0, Hauteur, Filtre_Rouge) ;
          Afficher_Traitement(Image, Largeur, Hauteur, Noir_Blanc) ;
       end Tester_Afficher_Image ;

    begin

       Tester_Afficher_Image(Gada.Plus.Choisir_Fichier) ;

    end Mission2 ;