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 ;