Premier commit
[powerfractal.git] / CD / Src / Power_Bmp.adb
1 ------------------------------------------------------------------------------------------------
2 -- Nom : Power_Bmp / fait partie du programme Power Fractal --
3 -- --
4 -- Auteurs : Gregory Burri & Adrien Crivelli --
5 ------------------------------------------------------------------------------------------------
6 -- But : Mettre a diposition un outil pour ecrire des bmps --
7 ------------------------------------------------------------------------------------------------
8
9 with Ada.Sequential_Io; --Pour la gestion de fichier binaire
10 with Power_Types; use type Power_Types.Byte; --Le format d'une couleur
11
12 package body Power_Bmp is
13
14 --Instanciation du paquetage.
15 package Bmp_IO is new Ada.Sequential_Io(Byte); use Bmp_IO;
16
17 --Pour stocker les info de l'entete
18 type T_Entete is array(1..54) of Byte;
19
20 --Pour generer certaines partie de l'entete
21 function Split(A: Integer) return T_Entete is
22 R: T_Entete;
23 begin
24 R(1):= Byte(A mod 256);
25 R(2):= Byte(A / 256 mod 256);
26 R(3):= Byte(A / 256 / 256 mod 256);
27 R(4):= Byte(A / 256 / 256 / 256 mod 256);
28 return R;
29 end;
30
31 ------------------------------------------------------------------------------------------------
32 -- Nom : Ecrire_Bmp --
33 -- But : Inverser une couleur RGB --
34 -- Parametres ----------------------------------------------------------------------------------
35 -- In-out : * La couleur --
36 ------------------------------------------------------------------------------------------------
37 procedure Ecrire_Bmp (Matrice_Image : in T_Matrice_Tampon; Nom_Fichier : in String) is
38
39 Entete: T_Entete := (others => 0); --L'entete du fichier bmp
40
41 --Entiers-------------
42 Hauteur, --Hauteur de la matrice
43 Largeur, --Largeur de la matrice
44
45 Nb_Byte_Fin, --Nombre de byte pour finir le fichier
46
47 Taille_Fichier, --La taille du fichier (byte)
48 Taille_Image --La taille de l'image (byte)
49 : Integer;------------
50
51 Fichier_Bmp: File_Type; --le fichier
52
53 begin --Ecrire_Bmp
54
55 --Definit la largeur et la hauteur de la matrice
56 Largeur := Matrice_Image'Length(1);
57 Hauteur := Matrice_Image'Length(2);
58 --
59
60 --Calcul le nombre de byte de fin de fichier
61 Nb_Byte_Fin := (Largeur * 8 rem 32) / 8;
62
63
64 Taille_Image := (Largeur * 3 + Nb_Byte_Fin) * Hauteur; --Calcul la taille de l'image
65 Taille_Fichier := 14 + 40 + Taille_Image; --Calcul la taille du fichier
66
67 ---------------ECRITURE DE L'ENTETE---------------
68 Entete(1) := Character'Pos('B');
69 Entete(2) := Character'Pos('M');
70 Entete(3..6) := Split(Taille_Fichier)(1..4);
71
72 Entete(11) := 54;
73 Entete(15) := 40;
74 Entete(19..22) := Split(Largeur)(1..4);
75 Entete(23..26) := Split(Hauteur)(1..4);
76 Entete(27) := 1;
77 Entete(29) := 24;
78 Entete(35..38) := Split(Taille_Image)(1..4);
79 Entete(39..42) := Split(2835)(1..4);
80 Entete(43..46) := Split(2835)(1..4);
81 ---------------------------------------------------
82
83 --Cree le fichier
84 Create (Fichier_Bmp, Out_File, Nom_Fichier);
85
86 --Ecrit l'entete dans le fichier
87 for I in 1..54 loop
88 Write(Fichier_Bmp, Entete(I));
89 end loop;
90
91 --Ecrit toute la matrice (fractal) dans le fichier
92 for X in reverse Matrice_Image'range(2) loop
93 for Y in Matrice_Image'range(1) loop
94 Write(Fichier_Bmp, Matrice_Image(Y, X).B);
95 Write(Fichier_Bmp, Matrice_Image(Y, X).G);
96 Write(Fichier_Bmp, Matrice_Image(Y, X).R);
97 end loop;
98
99 --Ecrit les bytes de fin de fichier
100 for Z in 1..Nb_Byte_Fin loop
101 Write(Fichier_Bmp, 0);
102 end loop;
103 end loop;
104
105 Close(Fichier_Bmp);
106 end Ecrire_Bmp;
107
108 end Power_Bmp;