diff --git a/Makefile b/Makefile index caa013d1..21552f9d 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,15 @@ -CC = distcc powerpc-linux-gnu-gcc -COPT = -Wall -Os -c +CC = gcc +COPT = -Wall -Os -c -g LOPT = -lSDL -o grafx2 +debug: grafx2 + @echo --- Everything OK. + +release: grafx2 + strip grafx2 + grafx2 : main.o init.o graph.o sdlscreen.o divers.o special.o boutons.o palette.o aide.o operatio.o loadsave.o readline.o moteur.o files.o op_c.o linux.o op_asm.o $(CC) $(LOPT) main.o graph.o divers.o init.o files.o linux.o loadsave.o boutons.o moteur.o sdlscreen.o aide.o palette.o operatio.o op_c.o readline.o special.o op_asm.o - strip grafx2 main.o : graph.o const.h struct.h global.h graph.h divers.h init.h boutons.h moteur.h files.h loadsave.h main.c readini.h saveini.h $(CC) $(COPT) main.c diff --git a/aide.c b/aide.c index 62b279f2..bf1d0406 100644 --- a/aide.c +++ b/aide.c @@ -1,289 +1,289 @@ -#include -#include "const.h" -#include "struct.h" -#include "global.h" -#include "divers.h" -#include "graph.h" -#include "moteur.h" +#include +#include "const.h" +#include "struct.h" +#include "global.h" +#include "divers.h" +#include "graph.h" +#include "moteur.h" #include -#include - -// -- Menu d'aide ----------------------------------------------------------- - -void Afficher_aide(void) -{ - byte * Curseur; - byte * Curseur_initial; - word Debut_de_fonte; - short X; // Indices d'affichage d'un caractŠre - short Y; - short Position_X; // Parcours de remplissage du buffer de ligne - short Indice_de_ligne; // 0-15 (16 lignes de textes) - short Indice_de_caractere; // Parcours des caractŠres d'une ligne - short Ligne_de_depart=Position_d_aide_en_cours; - short Longueur_de_ligne; // Longueur en char d'une ligne de texte - short Repeat_Menu_Facteur_X; - short Repeat_Menu_Facteur_Y; - short Pos_Reel_X; - short Pos_Reel_Y; - short Largeur; // Largeur physique d'une ligne de texte - - Pos_Reel_X=Fenetre_Pos_X+(13*Menu_Facteur_X); - Pos_Reel_Y=Fenetre_Pos_Y+(19*Menu_Facteur_Y); - - for (Curseur=Table_d_aide[Section_d_aide_en_cours].Debut_de_la_liste; - Ligne_de_depart>0; - Ligne_de_depart--) - Curseur+=( (*Curseur) & 0x7F )+1; - - for (Indice_de_ligne=0;Indice_de_ligne<16;Indice_de_ligne++) - { - // On affiche la ligne - Debut_de_fonte =((*Curseur) & 0x80)?147:0; - Indice_de_caractere=((*Curseur) & 0x7F); - Curseur++; - - Curseur_initial=Curseur; - Longueur_de_ligne=Indice_de_caractere; - Largeur=Longueur_de_ligne*Menu_Facteur_X*6; - - // Pour chaque ligne dans la fenˆtre: - for (Y=0;Y<8;Y++) - { - Curseur=Curseur_initial; - Position_X=0; - - // On cr‚e une nouvelle ligne … splotcher - for (Indice_de_caractere=0;Indice_de_caracterePosition=Position_d_aide_en_cours; - Calculer_hauteur_curseur_jauge(Fenetre_Liste_boutons_scroller); - Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); - Afficher_aide(); - Afficher_curseur(); -} - - -void Bouton_Aide(void) -{ - short Bouton_clicke; - short Nb_lignes=Table_d_aide[Section_d_aide_en_cours].Nombre_de_lignes; - - Ouvrir_fenetre(310,175,"Help / About..."); - - // dessiner de la fenˆtre o— va d‚filer le texte - Fenetre_Afficher_cadre_creux(8,17,274,132); - Block(Fenetre_Pos_X+(Menu_Facteur_X*9), - Fenetre_Pos_Y+(Menu_Facteur_Y*18), - Menu_Facteur_X*272,Menu_Facteur_Y*130,CM_Noir); - - Fenetre_Definir_bouton_normal(266,153,35,14,"Exit",0,1,0x0001); // 1 - Fenetre_Definir_bouton_scroller(290,18,130,Nb_lignes, - 16,Position_d_aide_en_cours); // 2 - - Fenetre_Definir_bouton_normal( 9,154, 59,14,"Credits" ,1,1,0x002E); // 3 - Fenetre_Definir_bouton_normal( 71,154, 75,14,"Register?",1,1,0x0013); // 4 - Fenetre_Definir_bouton_normal(149,154, 75,14,"Greetings",1,1,0x0022); // 5 - - Afficher_aide(); - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch (Bouton_clicke) - { - case -1: - case 0: - case 1: - break; - default: - Effacer_curseur(); - if (Bouton_clicke>2) - { - Section_d_aide_en_cours=Bouton_clicke-3; - Position_d_aide_en_cours=0; - Nb_lignes=Table_d_aide[Section_d_aide_en_cours].Nombre_de_lignes; - Fenetre_Liste_boutons_scroller->Position=0; - Fenetre_Liste_boutons_scroller->Nb_elements=Nb_lignes; - Calculer_hauteur_curseur_jauge(Fenetre_Liste_boutons_scroller); - Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); - } - else - Position_d_aide_en_cours=Fenetre_Attribut2; - - Afficher_aide(); - Afficher_curseur(); - } - - - // Gestion des touches de d‚placement dans la liste - switch (Touche) - { - case 0x0048 : // Haut - if (Position_d_aide_en_cours>0) - Position_d_aide_en_cours--; - Scroller_aide(); - break; - case 0x0050 : // Bas - if (Position_d_aide_en_cours15) - Position_d_aide_en_cours-=15; - else - Position_d_aide_en_cours=0; - Scroller_aide(); - break; - case 0x0051 : // PageDown - if (Position_d_aide_en_cours + +// -- Menu d'aide ----------------------------------------------------------- + +void Afficher_aide(void) +{ + byte * Curseur; + byte * Curseur_initial; + word Debut_de_fonte; + short X; // Indices d'affichage d'un caractŠre + short Y; + short Position_X; // Parcours de remplissage du buffer de ligne + short Indice_de_ligne; // 0-15 (16 lignes de textes) + short Indice_de_caractere; // Parcours des caractŠres d'une ligne + short Ligne_de_depart=Position_d_aide_en_cours; + short Longueur_de_ligne; // Longueur en char d'une ligne de texte + short Repeat_Menu_Facteur_X; + short Repeat_Menu_Facteur_Y; + short Pos_Reel_X; + short Pos_Reel_Y; + short Largeur; // Largeur physique d'une ligne de texte + + Pos_Reel_X=Fenetre_Pos_X+(13*Menu_Facteur_X); + Pos_Reel_Y=Fenetre_Pos_Y+(19*Menu_Facteur_Y); + + for (Curseur=Table_d_aide[Section_d_aide_en_cours].Debut_de_la_liste; + Ligne_de_depart>0; + Ligne_de_depart--) + Curseur+=( (*Curseur) & 0x7F )+1; + + for (Indice_de_ligne=0;Indice_de_ligne<16;Indice_de_ligne++) + { + // On affiche la ligne + Debut_de_fonte =((*Curseur) & 0x80)?147:0; + Indice_de_caractere=((*Curseur) & 0x7F); + Curseur++; + + Curseur_initial=Curseur; + Longueur_de_ligne=Indice_de_caractere; + Largeur=Longueur_de_ligne*Menu_Facteur_X*6; + + // Pour chaque ligne dans la fenˆtre: + for (Y=0;Y<8;Y++) + { + Curseur=Curseur_initial; + Position_X=0; + + // On cr‚e une nouvelle ligne … splotcher + for (Indice_de_caractere=0;Indice_de_caracterePosition=Position_d_aide_en_cours; + Calculer_hauteur_curseur_jauge(Fenetre_Liste_boutons_scroller); + Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); + Afficher_aide(); + Afficher_curseur(); +} + + +void Bouton_Aide(void) +{ + short Bouton_clicke; + short Nb_lignes=Table_d_aide[Section_d_aide_en_cours].Nombre_de_lignes; + + Ouvrir_fenetre(310,175,"Help / About..."); + + // dessiner de la fenˆtre o— va d‚filer le texte + Fenetre_Afficher_cadre_creux(8,17,274,132); + Block(Fenetre_Pos_X+(Menu_Facteur_X*9), + Fenetre_Pos_Y+(Menu_Facteur_Y*18), + Menu_Facteur_X*272,Menu_Facteur_Y*130,CM_Noir); + + Fenetre_Definir_bouton_normal(266,153,35,14,"Exit",0,1,0x0001); // 1 + Fenetre_Definir_bouton_scroller(290,18,130,Nb_lignes, + 16,Position_d_aide_en_cours); // 2 + + Fenetre_Definir_bouton_normal( 9,154, 59,14,"Credits" ,1,1,0x002E); // 3 + Fenetre_Definir_bouton_normal( 71,154, 75,14,"Register?",1,1,0x0013); // 4 + Fenetre_Definir_bouton_normal(149,154, 75,14,"Greetings",1,1,0x0022); // 5 + + Afficher_aide(); + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch (Bouton_clicke) + { + case -1: + case 0: + case 1: + break; + default: + Effacer_curseur(); + if (Bouton_clicke>2) + { + Section_d_aide_en_cours=Bouton_clicke-3; + Position_d_aide_en_cours=0; + Nb_lignes=Table_d_aide[Section_d_aide_en_cours].Nombre_de_lignes; + Fenetre_Liste_boutons_scroller->Position=0; + Fenetre_Liste_boutons_scroller->Nb_elements=Nb_lignes; + Calculer_hauteur_curseur_jauge(Fenetre_Liste_boutons_scroller); + Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); + } + else + Position_d_aide_en_cours=Fenetre_Attribut2; + + Afficher_aide(); + Afficher_curseur(); + } + + + // Gestion des touches de d‚placement dans la liste + switch (Touche) + { + case 0x0048 : // Haut + if (Position_d_aide_en_cours>0) + Position_d_aide_en_cours--; + Scroller_aide(); + break; + case 0x0050 : // Bas + if (Position_d_aide_en_cours15) + Position_d_aide_en_cours-=15; + else + Position_d_aide_en_cours=0; + Scroller_aide(); + break; + case 0x0051 : // PageDown + if (Position_d_aide_en_coursf_bfree; - if (Taille>=0) - { - sprintf(Buffer,"%ld bytes",Taille); - Print_dans_fenetre(146,51,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - } - else - Print_dans_fenetre(146,51,"* Error *",STATS_COULEUR_DONNEES,CM_Noir); - - // Affichage des informations sur l'image - Print_dans_fenetre(10,67,"Picture info.:",STATS_COULEUR_TITRES,CM_Noir); - - // Affichage des dimensions de l'image - Print_dans_fenetre(18,75,"Dimensions :",STATS_COULEUR_TITRES,CM_Noir); - sprintf(Buffer,"%dx%d",Principal_Largeur_image,Principal_Hauteur_image); - Print_dans_fenetre(122,75,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - - // Affichage du nombre de couleur utilis‚ - Print_dans_fenetre(18,83,"Colors used:",STATS_COULEUR_TITRES,CM_Noir); - sprintf(Buffer,"%d",Palette_Compter_nb_couleurs_utilisees(Utilisation_couleur)); - Print_dans_fenetre(122,83,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - - // Affichage des dimensions de l'‚cran - Print_dans_fenetre(10,99,"Resolution:",STATS_COULEUR_TITRES,CM_Noir); - sprintf(Buffer,"%dx%d",Largeur_ecran,Hauteur_ecran); - Print_dans_fenetre(106,99,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - - // Affichage des infos VESA - Print_dans_fenetre(10,115,"VESA info.:",STATS_COULEUR_TITRES,CM_Noir); - if (((VESA_Version_Unite*10)+VESA_Version_Decimale)>=12) - { - Print_dans_fenetre(18,123,"Version :",STATS_COULEUR_TITRES,CM_Noir); - sprintf(Buffer,"%d.%d",VESA_Version_Unite,VESA_Version_Decimale); - Print_dans_fenetre(106,123,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - - Print_dans_fenetre(18,131,"Manufact.:",STATS_COULEUR_TITRES,CM_Noir); - strncpy(Buffer,VESA_Constructeur,TAILLE_NOM_CONSTRUCTEUR); - Buffer[TAILLE_NOM_CONSTRUCTEUR]='\0'; - Print_dans_fenetre(106,131,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - - Print_dans_fenetre(18,139,"Memory :",STATS_COULEUR_TITRES,CM_Noir); - sprintf(Buffer,"%d Kb",VESA_Taille_memoire*64); - Print_dans_fenetre(106,139,Buffer,STATS_COULEUR_DONNEES,CM_Noir); - } - else - Print_dans_fenetre(106,115,"* No VESA support *",STATS_COULEUR_DONNEES,CM_Noir); - - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while ( (Bouton_clicke!=1) && (Touche!=0x001C) ); - - Fermer_fenetre(); - Desenclencher_bouton(BOUTON_AIDE); - Afficher_curseur(); -} + statfs(Principal_Repertoire_courant,Informations_Disque); + Taille=Informations_Disque->f_bfree; + if (Taille>=0) + { + sprintf(Buffer,"%ld bytes",Taille); + Print_dans_fenetre(146,51,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + } + else + Print_dans_fenetre(146,51,"* Error *",STATS_COULEUR_DONNEES,CM_Noir); + + // Affichage des informations sur l'image + Print_dans_fenetre(10,67,"Picture info.:",STATS_COULEUR_TITRES,CM_Noir); + + // Affichage des dimensions de l'image + Print_dans_fenetre(18,75,"Dimensions :",STATS_COULEUR_TITRES,CM_Noir); + sprintf(Buffer,"%dx%d",Principal_Largeur_image,Principal_Hauteur_image); + Print_dans_fenetre(122,75,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + + // Affichage du nombre de couleur utilis‚ + Print_dans_fenetre(18,83,"Colors used:",STATS_COULEUR_TITRES,CM_Noir); + sprintf(Buffer,"%d",Palette_Compter_nb_couleurs_utilisees(Utilisation_couleur)); + Print_dans_fenetre(122,83,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + + // Affichage des dimensions de l'‚cran + Print_dans_fenetre(10,99,"Resolution:",STATS_COULEUR_TITRES,CM_Noir); + sprintf(Buffer,"%dx%d",Largeur_ecran,Hauteur_ecran); + Print_dans_fenetre(106,99,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + + // Affichage des infos VESA + Print_dans_fenetre(10,115,"VESA info.:",STATS_COULEUR_TITRES,CM_Noir); + if (((VESA_Version_Unite*10)+VESA_Version_Decimale)>=12) + { + Print_dans_fenetre(18,123,"Version :",STATS_COULEUR_TITRES,CM_Noir); + sprintf(Buffer,"%d.%d",VESA_Version_Unite,VESA_Version_Decimale); + Print_dans_fenetre(106,123,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + + Print_dans_fenetre(18,131,"Manufact.:",STATS_COULEUR_TITRES,CM_Noir); + strncpy(Buffer,VESA_Constructeur,TAILLE_NOM_CONSTRUCTEUR); + Buffer[TAILLE_NOM_CONSTRUCTEUR]='\0'; + Print_dans_fenetre(106,131,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + + Print_dans_fenetre(18,139,"Memory :",STATS_COULEUR_TITRES,CM_Noir); + sprintf(Buffer,"%d Kb",VESA_Taille_memoire*64); + Print_dans_fenetre(106,139,Buffer,STATS_COULEUR_DONNEES,CM_Noir); + } + else + Print_dans_fenetre(106,115,"* No VESA support *",STATS_COULEUR_DONNEES,CM_Noir); + + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while ( (Bouton_clicke!=1) && (Touche!=0x001C) ); + + Fermer_fenetre(); + Desenclencher_bouton(BOUTON_AIDE); + Afficher_curseur(); +} diff --git a/boutons.c b/boutons.c index a37fe537..a0aaed81 100644 --- a/boutons.c +++ b/boutons.c @@ -2957,7 +2957,7 @@ void Load_picture(byte Image) char Nom_fichier_initial[13]; byte Format_fichier_initial; byte Ne_pas_restaurer; - byte Utiliser_palette_brosse; + byte Utiliser_palette_brosse = 0; struct Composantes * Palette_initiale=NULL; byte Ancienne_forme_curseur; short Principal_Largeur_image_initiale=Principal_Largeur_image; @@ -5464,9 +5464,9 @@ void Bouton_Effets(void) Afficher_curseur(); break; case 13 : // Feedback (pour Colorize et Shade) - if (Config.FX_Feedback=!Config.FX_Feedback) //??? - FX_Feedback_Ecran=Principal_Ecran; - else +// if (Config.FX_Feedback=!Config.FX_Feedback) //??? +// FX_Feedback_Ecran=Principal_Ecran; +// else FX_Feedback_Ecran=Ecran_backup; Effacer_curseur(); Afficher_etat_feedback(); diff --git a/divers.c b/divers.c index 1f9dd07f..d3aaa539 100644 --- a/divers.c +++ b/divers.c @@ -3,6 +3,7 @@ #include "sdlscreen.h" #include "global.h" #include "graph.h" //Afficher_curseur +#include "erreurs.h" // Gestion du mode texte de départ (pour pouvoir y retourner en cas de problème byte Recuperer_nb_lignes(void) @@ -48,16 +49,14 @@ word Palette_Compter_nb_couleurs_utilisees(dword* Tableau) void Set_palette(T_Palette Palette) { - SDL_Color PaletteSDL[255]; - byte i=0; - do + register int i; + SDL_Color PaletteSDL[256]; + for(i=0;i<256;i++) { PaletteSDL[i].r=Palette[i].R*4; //Les couleurs VGA ne vont que de 0 à 63 PaletteSDL[i].g=Palette[i].V*4; PaletteSDL[i].b=Palette[i].B*4; - i++; } - while(i!=0); SDL_SetPalette(Ecran_SDL,SDL_PHYSPAL|SDL_LOGPAL,PaletteSDL,0,256); } diff --git a/files.c b/files.c index 4c5ad447..e91d1c5a 100644 --- a/files.c +++ b/files.c @@ -64,7 +64,7 @@ int Fichier_existe(char * Fichier) // D‚termine si un fichier pass‚ en paramŠtre existe ou non dans le // r‚pertoire courant. { - struct stat* buf; + struct stat* buf = NULL; int Resultat; Resultat=stat(Fichier,buf); @@ -161,15 +161,12 @@ void Lire_liste_des_fichiers(byte Format_demande) // Cette proc‚dure charge dans la liste chain‚e les fichiers dont l'extension // correspond au format demand‚. { - int Attribut; // Attribut des fichiers/r‚pertoires … lire DIR* Repertoire_Courant; //Répertoire courant - struct dirent* Enreg; // Structure de lecture des ‚l‚ments - char Filtre[6]="*."; // Place pour ‚crire "*.XXX" et un '\0' + struct dirent* Enreg; // Structure de lecture des éléments + char Filtre[6]="*."; // Place pour écrire "*.XXX" et un '\0' - char Chaine[20]; - - // Tout d'abord, on d‚duit du format demand‚ un filtre … utiliser: - if (Format_demande) // Format (extension) sp‚cifique + // Tout d'abord, on déduit du format demandé un filtre à utiliser: + if (Format_demande) // Format (extension) spécifique strcat(Filtre,Format_Extension[Format_demande-1]); else // *.* strcat(Filtre,"*"); @@ -177,54 +174,38 @@ void Lire_liste_des_fichiers(byte Format_demande) // Ensuite, on vide la liste actuelle: Detruire_liste_du_fileselect(); - // AprŠs effacement, il ne reste ni fichier ni r‚pertoire dans la liste + // Après effacement, il ne reste ni fichier ni répertoire dans la liste Liste_Nb_fichiers=0; Liste_Nb_repertoires=0; - // On lit tous les r‚pertoires: + // On lit tous les répertoires: Repertoire_Courant=opendir(getcwd(NULL,0)); -/* -Ceci est à revoir... pas tout à fait géré pareil sous linux... - Attribut=(_A_NORMAL|_A_SUBDIR|//_A_RDONLY|_A_ARCH| - (_A_HIDDEN & Config.Lire_les_repertoires_caches)| - (_A_SYSTEM & Config.Lire_les_repertoires_systemes)); -*/ Enreg=readdir(Repertoire_Courant); while (Enreg) { - // Si l'‚l‚ment n'est pas le r‚pertoire courant - if ( (strcmp(Enreg->d_name,".")!=0) && - // et que l'‚l‚ment trouv‚ est r‚ellement un r‚pertoire - (Enreg->d_type == DT_DIR) ) + // Si l'élément n'est pas le répertoire courant + if ( (Enreg->d_name[0]!='.') && (Enreg->d_name[1] != 0)) { - // On rajoute le r‚pertore … la liste - Ajouter_element_a_la_liste(Enreg); - Liste_Nb_repertoires++; + // et que l'élément trouvé est un répertoire + if( (Enreg->d_type == DT_DIR) && + // et qu'il n'est pas caché + (Enreg->d_name[0]!='.' || Config.Lire_les_repertoires_caches)) + { + // On rajoute le répertore à la liste + Ajouter_element_a_la_liste(Enreg); + Liste_Nb_repertoires++; + } + else if ((Enreg->d_type==DT_REG) //Il s'agit d'un fichier + && (Enreg->d_name[0]!='.' || Config.Lire_les_fichiers_caches)) //Il n'est pas caché + { + // On rajoute le fichier à la liste + Ajouter_element_a_la_liste(Enreg); + Liste_Nb_fichiers++; + } } - // On cherche l'‚l‚ment suivant - Enreg=readdir(Repertoire_Courant); - } - // Enfin, on lit les fichiers du format demand‚: - -/* -Ici aussi, à revoir... - Attribut=(_A_NORMAL|_A_SYSTEM|//_A_RDONLY|_A_ARCH| - (_A_HIDDEN & Config.Lire_les_fichiers_caches)); -*/ - - rewinddir(Repertoire_Courant); - Enreg=readdir(Repertoire_Courant); - while (Enreg) - { - if (Enreg->d_type==DT_REG) //Il s'agit bien d'un fichier - { - // On rajoute le fichier … la liste - Ajouter_element_a_la_liste(Enreg); - Liste_Nb_fichiers++; - } - // On cherche l'‚l‚ment suivant + // On cherche l'élément suivant Enreg=readdir(Repertoire_Courant); } diff --git a/gfx2.cfg b/gfx2.cfg index d827fb22..6d2d8ac2 100644 Binary files a/gfx2.cfg and b/gfx2.cfg differ diff --git a/graph.c b/graph.c index da666430..fd5a0494 100644 --- a/graph.c +++ b/graph.c @@ -11,7 +11,8 @@ #include "boutons.h" #include "pages.h" #include "global.h" - +#include "struct.h" +#include "erreurs.h" // On déclare méchamment le prototype de Erreur pour éviter de faire un // fichier "main.h": @@ -837,13 +838,11 @@ void Initialiser_mode_video(int Numero) { int Sensibilite_X; int Sensibilite_Y; - //int Indice_VESA; - - if (Resolution_actuelle!=Numero) + if (Resolution_actuelle != Numero) { - Largeur_ecran=Mode_video[Numero].Largeur; - Hauteur_ecran=Mode_video[Numero].Hauteur; + Largeur_ecran = Mode_video[Numero].Largeur; + Hauteur_ecran = Mode_video[Numero].Hauteur; switch (Config.Ratio) { @@ -877,72 +876,39 @@ void Initialiser_mode_video(int Numero) switch (Mode_video[Numero].Mode) { case MODE_SDL: - Pixel= Pixel_SDL; + Pixel = Pixel_SDL; Lit_pixel= Lit_Pixel_SDL; - Clear_screen= Effacer_Tout_l_Ecran_SDL; - Display_screen= Afficher_partie_de_l_ecran_SDL; + Clear_screen = Effacer_Tout_l_Ecran_SDL; + Display_screen = Afficher_partie_de_l_ecran_SDL; Block = Block_SDL; Block_Fast = Block_SDL_Fast; - Pixel_Preview_Normal= Pixel_Preview_Normal_SDL; - Pixel_Preview_Loupe=Pixel_Preview_Loupe_SDL; - Ligne_horizontale_XOR=Ligne_horizontale_XOR_SDL; - Ligne_verticale_XOR=Ligne_verticale_XOR_SDL; - Display_brush_Color=Display_brush_Color_SDL; - Display_brush_Mono=Display_brush_Mono_SDL; - Clear_brush=Clear_brush_SDL; - Remap_screen=Remap_screen_SDL; - Afficher_ligne=Afficher_une_ligne_ecran_SDL; - Lire_ligne=Lire_une_ligne_ecran_SDL; - Display_zoomed_screen=Afficher_partie_de_l_ecran_zoomee_SDL; - Display_brush_Color_zoom=Display_brush_Color_zoom_SDL; - Display_brush_Mono_zoom=Display_brush_Mono_zoom_SDL; - Clear_brush_zoom=Clear_brush_zoom_SDL; + Pixel_Preview_Normal = Pixel_Preview_Normal_SDL; + Pixel_Preview_Loupe = Pixel_Preview_Loupe_SDL; + Ligne_horizontale_XOR = Ligne_horizontale_XOR_SDL; + Ligne_verticale_XOR = Ligne_verticale_XOR_SDL; + Display_brush_Color = Display_brush_Color_SDL; + Display_brush_Mono = Display_brush_Mono_SDL; + Clear_brush = Clear_brush_SDL; + Remap_screen = Remap_screen_SDL; + Afficher_ligne = Afficher_une_ligne_ecran_SDL; + Lire_ligne = Lire_une_ligne_ecran_SDL; + Display_zoomed_screen = Afficher_partie_de_l_ecran_zoomee_SDL; + Display_brush_Color_zoom = Display_brush_Color_zoom_SDL; + Display_brush_Mono_zoom = Display_brush_Mono_zoom_SDL; + Clear_brush_zoom = Clear_brush_zoom_SDL; Set_Mode_SDL(); break; -/* - switch(Mode_video[Numero].Mode_VESA_de_base) - { - case 0x100 : Indice_VESA=0; // 640x400 - break; - case 0x101 : Indice_VESA=1; // 640x480 - break; - case 0x103 : Indice_VESA=2; // 800x600 - break; - default : Indice_VESA=3; // 1024x768 - } - - // On regarde si le mode supporte le LFB - if (VESA_Mode_Infos[Indice_VESA].Adresse_physique_LFB!=0) - { - // C'est le cas => on va s'en servir - - Set_VESA_mode(Mode_video[Numero].Mode_VESA_de_base | 0x4000); - Initialiser_le_LFB(VESA_Mode_Infos[Indice_VESA].Adresse_physique_LFB, - VESA_Mode_Infos[Indice_VESA].Taille_LFB); - if (Mode_X_Ptr!=NULL) - Retoucher_CRTC(); - } - else - { - // Ce n'est pas le cas, on continue comme si de rien n'était - Granularite =VESA_Mode_Infos[Indice_VESA].Granularite; - VESA_WinFuncPtr=VESA_Mode_Infos[Indice_VESA].WinFuncPtr; - - Initialiser_mode_video_VESA(Mode_video[Numero].Mode_VESA_de_base); - if (Mode_X_Ptr!=NULL) - Retoucher_CRTC(); - } -*/ } + Set_palette(Principal_Palette); - Resolution_actuelle=Numero; + Resolution_actuelle = Numero; - Menu_Taille_couleur=((Largeur_ecran/Menu_Facteur_X)-(LARGEUR_MENU+2)) >> 3; - Menu_Ordonnee=Hauteur_ecran; + Menu_Taille_couleur = ((Largeur_ecran/Menu_Facteur_X)-(LARGEUR_MENU+2)) >> 3; + Menu_Ordonnee = Hauteur_ecran; if (Menu_visible) - Menu_Ordonnee-=HAUTEUR_MENU*Menu_Facteur_Y; - Menu_Ordonnee_Texte=Hauteur_ecran-(Menu_Facteur_Y<<3); + Menu_Ordonnee -= HAUTEUR_MENU * Menu_Facteur_Y; + Menu_Ordonnee_Texte = Hauteur_ecran-(Menu_Facteur_Y<<3); Bouton[BOUTON_CHOIX_COL].Largeur=(Menu_Taille_couleur<<3)-1; Clip_mouse(); @@ -950,8 +916,8 @@ void Initialiser_mode_video(int Numero) Mouse_Y = Hauteur_ecran >> 1; Set_mouse_position(); - Sensibilite_X=Config.Indice_Sensibilite_souris_X/Mode_video[Numero].Facteur_X; - Sensibilite_Y=Config.Indice_Sensibilite_souris_Y/Mode_video[Numero].Facteur_Y; + Sensibilite_X = Config.Indice_Sensibilite_souris_X / Mode_video[Numero].Facteur_X; + Sensibilite_Y = Config.Indice_Sensibilite_souris_Y / Mode_video[Numero].Facteur_Y; Sensibilite_X>>=Mouse_Facteur_de_correction_X; Sensibilite_Y>>=Mouse_Facteur_de_correction_Y; Sensibilite_souris(Sensibilite_X?Sensibilite_X:1,Sensibilite_Y?Sensibilite_Y:1); @@ -3804,13 +3770,13 @@ void Remplir(byte Couleur_de_remplissage) fonction_afficheur Pixel_figure; // Affichage d'un point de façon définitive (utilisation du pinceau) - void Pixel_figure_Definitif(short Pos_X,short Pos_Y,byte Couleur) + void Pixel_figure_Definitif(word Pos_X,word Pos_Y,byte Couleur) { Afficher_pinceau(Pos_X,Pos_Y,Couleur,0); } // Affichage d'un point pour une preview - void Pixel_figure_Preview(short Pos_X,short Pos_Y,byte Couleur) + void Pixel_figure_Preview(word Pos_X,word Pos_Y,byte Couleur) { if ( (Pos_X>=Limite_Gauche) && (Pos_X<=Limite_Droite) && @@ -3820,7 +3786,7 @@ void Remplir(byte Couleur_de_remplissage) } // Affichage d'un point pour une preview en xor - void Pixel_figure_Preview_xor(short Pos_X,short Pos_Y,byte Couleur) + void Pixel_figure_Preview_xor(word Pos_X,word Pos_Y,byte Couleur) { if ( (Pos_X>=Limite_Gauche) && (Pos_X<=Limite_Droite) && @@ -3831,7 +3797,7 @@ void Remplir(byte Couleur_de_remplissage) } // Effacement d'un point de preview - void Pixel_figure_Effacer_preview(short Pos_X,short Pos_Y,byte Couleur) + void Pixel_figure_Effacer_preview(word Pos_X,word Pos_Y,byte Couleur) { if ( (Pos_X>=Limite_Gauche) && (Pos_X<=Limite_Droite) && @@ -3841,7 +3807,7 @@ void Remplir(byte Couleur_de_remplissage) } // Affichage d'un point dans la brosse - void Pixel_figure_Dans_brosse(short Pos_X,short Pos_Y,byte Couleur) + void Pixel_figure_Dans_brosse(word Pos_X,word Pos_Y,byte Couleur) { Pos_X-=Brosse_Decalage_X; Pos_Y-=Brosse_Decalage_Y; diff --git a/graph.h b/graph.h index e3fa37a3..b87697ab 100644 --- a/graph.h +++ b/graph.h @@ -1,158 +1,158 @@ #include "global.h" -//byte Meilleure_couleur(byte Rouge, byte Vert, byte Bleu); - -void Remapper_ecran_apres_changement_couleurs_menu(void); -void Calculer_couleurs_menu_optimales(struct Composantes * Palette); - -dword Memoire_libre(void); - -void Liste2tables(word * Liste,short Pas,byte Mode,byte * Table_inc,byte * Table_dec); - -void Num2str(dword Nombre,char * Chaine,byte Taille); -int Str2num(char * Chaine); - -short Round(float Valeur); +//byte Meilleure_couleur(byte Rouge, byte Vert, byte Bleu); + +void Remapper_ecran_apres_changement_couleurs_menu(void); +void Calculer_couleurs_menu_optimales(struct Composantes * Palette); + +dword Memoire_libre(void); + +void Liste2tables(word * Liste,short Pas,byte Mode,byte * Table_inc,byte * Table_dec); + +void Num2str(dword Nombre,char * Chaine,byte Taille); +int Str2num(char * Chaine); + +short Round(float Valeur); short Round_max(short Numerateur,short Diviseur); short Round_div_max(short Numerateur,short Diviseur); -int Min(int A,int B); - -void Transformer_point(short X, short Y, - float cosA, float sinA, short * Xr, short * Yr); - -void Recadrer_ecran_par_rapport_au_zoom(void); -void Calculer_split(void); -void Calculer_donnees_loupe(void); -void Calculer_limites(void); -void Calculer_coordonnees_pinceau(void); - -char* Libelle_mode(int Mode); - -void Initialiser_mode_video(int Numero); -void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur); -void Pixel_dans_fenetre(word X,word Y,byte Couleur); -void Encadrer_couleur_menu(byte Couleur); -void Afficher_palette_du_menu(void); -void Afficher_menu(void); -void Recadrer_palette(void); - -void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); -void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); -void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond); -void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur); -void Print_dans_menu(char * Chaine, short Position); -void Print_coordonnees(void); -void Print_nom_fichier(void); - -byte Aucun_effet(word X,word Y,byte Couleur); -byte Effet_Shade(word X,word Y,byte Couleur); -byte Effet_Quick_shade(word X,word Y,byte Couleur); -byte Effet_Tiling(word X,word Y,byte Couleur); -byte Effet_Smooth(word X,word Y,byte Couleur); - -void Afficher_foreback(void); - - -void Afficher_pixel(word X,word Y,byte Couleur); - -void Afficher_pinceau(short X,short Y,byte Couleur,byte Preview); -void Effacer_pinceau(short X,short Y); -void Effacer_curseur(void); -void Afficher_curseur(void); - -byte Demande_de_confirmation(char * Message); -void Warning_message(char * Message); - -void Afficher_limites_de_l_image(void); -void Afficher_ecran(void); -void Fenetre_Afficher_cadre_general(word Pos_X,word Pos_Y,word Largeur,word Hauteur, - byte Couleur_HG,byte Couleur_BD,byte Couleur_S,byte Couleur_CHG,byte Couleur_CBD); -void Fenetre_Afficher_cadre_mono(word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte Couleur); -void Fenetre_Afficher_cadre_creux(word Pos_X,word Pos_Y,word Largeur,word Hauteur); -void Fenetre_Afficher_cadre_bombe(word Pos_X,word Pos_Y,word Largeur,word Hauteur); -void Fenetre_Afficher_cadre(word Pos_X,word Pos_Y,word Largeur,word Hauteur); - -void Afficher_sprite_dans_menu(int Numero_bouton,int Numero_sprite); -void Afficher_pinceau_dans_menu(void); -void Afficher_pinceau_dans_fenetre(word X,word Y,int Numero); - -void Dessiner_zigouigoui(word X,word Y, byte Couleur, short Sens); -void Bloc_degrade_dans_fenetre(word Pos_X,word Pos_Y,word Debut_block,word Fin_block); -void Redimentionner_image(word Largeur_choisie,word Hauteur_choisie); - -void Fenetre_Afficher_sprite_drive(word Pos_X,word Pos_Y,byte Type); - -void Capturer_brosse(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,short Effacement); -void Rotate_90_deg(void); -void Etirer_brosse(short X1, short Y1, short X2, short Y2); -void Etirer_brosse_preview(short X1, short Y1, short X2, short Y2); -void Tourner_brosse(float Angle); -void Tourner_brosse_preview(float Angle); - -void Remap_brosse(void); -void Get_colors_from_brush(void); -void Outline_brush(void); -void Nibble_brush(void); - -void Remplir(byte Couleur_de_remplissage); -void Remplacer(byte Nouvelle_couleur); - -void Pixel_figure_Preview (short Pos_X,short Pos_Y,byte Couleur); -void Pixel_figure_Preview_xor(short Pos_X,short Pos_Y,byte Couleur); - -void Tracer_cercle_vide_Definitif(short Centre_X,short Centre_Y,short Rayon,byte Couleur); -void Tracer_cercle_vide_Preview (short Centre_X,short Centre_Y,short Rayon,byte Couleur); -void Effacer_cercle_vide_Preview (short Centre_X,short Centre_Y,short Rayon); -void Tracer_cercle_plein (short Centre_X,short Centre_Y,short Rayon,byte Couleur); - -void Tracer_ellipse_vide_Definitif(short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,byte Couleur); -void Tracer_ellipse_vide_Preview (short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,byte Couleur); -void Effacer_ellipse_vide_Preview (short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical); -void Tracer_ellipse_pleine (short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,byte Couleur); - -void Tracer_ligne_Definitif (short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); -void Tracer_ligne_Preview (short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); -void Tracer_ligne_Preview_xor(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); -void Effacer_ligne_Preview (short Debut_X,short Debut_Y,short Fin_X,short Fin_Y); - -void Tracer_rectangle_vide(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); -void Tracer_rectangle_plein(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); - -void Tracer_courbe_Definitif(short X1, short Y1, short X2, short Y2, short X3, short Y3, short X4, short Y4, byte Couleur); -void Tracer_courbe_Preview (short X1, short Y1, short X2, short Y2, short X3, short Y3, short X4, short Y4, byte Couleur); -void Effacer_courbe_Preview (short X1, short Y1, short X2, short Y2, short X3, short Y3, short X4, short Y4, byte Couleur); - -void Aerographe(short Bouton_clicke); - -void Degrade_de_base (long Indice,short Pos_X,short Pos_Y); -void Degrade_de_trames_simples (long Indice,short Pos_X,short Pos_Y); -void Degrade_de_trames_etendues(long Indice,short Pos_X,short Pos_Y); -void Degrade_aleatoire (long Indice,short Pos_X,short Pos_Y); - -void Tracer_cercle_degrade (short Centre_X,short Centre_Y,short Rayon,short Eclairage_X,short Eclairage_Y); -void Tracer_ellipse_degradee(short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,short Eclairage_X,short Eclairage_Y); - -void Polyfill(int Vertices, short * Points, int Color); -void Capturer_brosse_au_lasso(int Vertices, short * Points,short Effacement); - -// Gestion des backups: -void Download_infos_page_principal(S_Page * Page); -void Upload_infos_page_principal(S_Page * Page); -void Download_infos_page_brouillon(S_Page * Page); -void Upload_infos_page_brouillon(S_Page * Page); -void Download_infos_backup(S_Liste_de_pages * Liste); -int Initialiser_les_listes_de_backups_en_debut_de_programme(int Taille,int Largeur,int Hauteur); -void Detruire_les_listes_de_backups_en_fin_de_programme(void); -void Nouveau_nombre_de_backups(int Nouveau); -int Backup_avec_nouvelles_dimensions(int Upload,int Largeur,int Hauteur); -int Backuper_et_redimensionner_brouillon(int Largeur,int Hauteur); -void Backup(void); -void Undo(void); -void Redo(void); -void Detruire_la_page_courante(void); +int Min(int A,int B); + +void Transformer_point(short X, short Y, + float cosA, float sinA, short * Xr, short * Yr); + +void Recadrer_ecran_par_rapport_au_zoom(void); +void Calculer_split(void); +void Calculer_donnees_loupe(void); +void Calculer_limites(void); +void Calculer_coordonnees_pinceau(void); + +char* Libelle_mode(int Mode); + +void Initialiser_mode_video(int Numero); +void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur); +void Pixel_dans_fenetre(word X,word Y,byte Couleur); +void Encadrer_couleur_menu(byte Couleur); +void Afficher_palette_du_menu(void); +void Afficher_menu(void); +void Recadrer_palette(void); + +void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); +void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); +void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond); +void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur); +void Print_dans_menu(char * Chaine, short Position); +void Print_coordonnees(void); +void Print_nom_fichier(void); + +byte Aucun_effet(word X,word Y,byte Couleur); +byte Effet_Shade(word X,word Y,byte Couleur); +byte Effet_Quick_shade(word X,word Y,byte Couleur); +byte Effet_Tiling(word X,word Y,byte Couleur); +byte Effet_Smooth(word X,word Y,byte Couleur); + +void Afficher_foreback(void); + + +void Afficher_pixel(word X,word Y,byte Couleur); + +void Afficher_pinceau(short X,short Y,byte Couleur,byte Preview); +void Effacer_pinceau(short X,short Y); +void Effacer_curseur(void); +void Afficher_curseur(void); + +byte Demande_de_confirmation(char * Message); +void Warning_message(char * Message); + +void Afficher_limites_de_l_image(void); +void Afficher_ecran(void); +void Fenetre_Afficher_cadre_general(word Pos_X,word Pos_Y,word Largeur,word Hauteur, + byte Couleur_HG,byte Couleur_BD,byte Couleur_S,byte Couleur_CHG,byte Couleur_CBD); +void Fenetre_Afficher_cadre_mono(word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte Couleur); +void Fenetre_Afficher_cadre_creux(word Pos_X,word Pos_Y,word Largeur,word Hauteur); +void Fenetre_Afficher_cadre_bombe(word Pos_X,word Pos_Y,word Largeur,word Hauteur); +void Fenetre_Afficher_cadre(word Pos_X,word Pos_Y,word Largeur,word Hauteur); + +void Afficher_sprite_dans_menu(int Numero_bouton,int Numero_sprite); +void Afficher_pinceau_dans_menu(void); +void Afficher_pinceau_dans_fenetre(word X,word Y,int Numero); + +void Dessiner_zigouigoui(word X,word Y, byte Couleur, short Sens); +void Bloc_degrade_dans_fenetre(word Pos_X,word Pos_Y,word Debut_block,word Fin_block); +void Redimentionner_image(word Largeur_choisie,word Hauteur_choisie); + +void Fenetre_Afficher_sprite_drive(word Pos_X,word Pos_Y,byte Type); + +void Capturer_brosse(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,short Effacement); +void Rotate_90_deg(void); +void Etirer_brosse(short X1, short Y1, short X2, short Y2); +void Etirer_brosse_preview(short X1, short Y1, short X2, short Y2); +void Tourner_brosse(float Angle); +void Tourner_brosse_preview(float Angle); + +void Remap_brosse(void); +void Get_colors_from_brush(void); +void Outline_brush(void); +void Nibble_brush(void); + +void Remplir(byte Couleur_de_remplissage); +void Remplacer(byte Nouvelle_couleur); + +void Pixel_figure_Preview (word Pos_X,word Pos_Y,byte Couleur); +void Pixel_figure_Preview_xor(word Pos_X,word Pos_Y,byte Couleur); + +void Tracer_cercle_vide_Definitif(short Centre_X,short Centre_Y,short Rayon,byte Couleur); +void Tracer_cercle_vide_Preview (short Centre_X,short Centre_Y,short Rayon,byte Couleur); +void Effacer_cercle_vide_Preview (short Centre_X,short Centre_Y,short Rayon); +void Tracer_cercle_plein (short Centre_X,short Centre_Y,short Rayon,byte Couleur); + +void Tracer_ellipse_vide_Definitif(short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,byte Couleur); +void Tracer_ellipse_vide_Preview (short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,byte Couleur); +void Effacer_ellipse_vide_Preview (short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical); +void Tracer_ellipse_pleine (short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,byte Couleur); + +void Tracer_ligne_Definitif (short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); +void Tracer_ligne_Preview (short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); +void Tracer_ligne_Preview_xor(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); +void Effacer_ligne_Preview (short Debut_X,short Debut_Y,short Fin_X,short Fin_Y); + +void Tracer_rectangle_vide(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); +void Tracer_rectangle_plein(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,byte Couleur); + +void Tracer_courbe_Definitif(short X1, short Y1, short X2, short Y2, short X3, short Y3, short X4, short Y4, byte Couleur); +void Tracer_courbe_Preview (short X1, short Y1, short X2, short Y2, short X3, short Y3, short X4, short Y4, byte Couleur); +void Effacer_courbe_Preview (short X1, short Y1, short X2, short Y2, short X3, short Y3, short X4, short Y4, byte Couleur); + +void Aerographe(short Bouton_clicke); + +void Degrade_de_base (long Indice,short Pos_X,short Pos_Y); +void Degrade_de_trames_simples (long Indice,short Pos_X,short Pos_Y); +void Degrade_de_trames_etendues(long Indice,short Pos_X,short Pos_Y); +void Degrade_aleatoire (long Indice,short Pos_X,short Pos_Y); + +void Tracer_cercle_degrade (short Centre_X,short Centre_Y,short Rayon,short Eclairage_X,short Eclairage_Y); +void Tracer_ellipse_degradee(short Centre_X,short Centre_Y,short Rayon_horizontal,short Rayon_vertical,short Eclairage_X,short Eclairage_Y); + +void Polyfill(int Vertices, short * Points, int Color); +void Capturer_brosse_au_lasso(int Vertices, short * Points,short Effacement); + +// Gestion des backups: +void Download_infos_page_principal(S_Page * Page); +void Upload_infos_page_principal(S_Page * Page); +void Download_infos_page_brouillon(S_Page * Page); +void Upload_infos_page_brouillon(S_Page * Page); +void Download_infos_backup(S_Liste_de_pages * Liste); +// int Initialiser_les_listes_de_backups_en_debut_de_programme(int Taille,int Largeur,int Hauteur); // pages.h +void Detruire_les_listes_de_backups_en_fin_de_programme(void); +void Nouveau_nombre_de_backups(int Nouveau); +int Backup_avec_nouvelles_dimensions(int Upload,int Largeur,int Hauteur); +int Backuper_et_redimensionner_brouillon(int Largeur,int Hauteur); +void Backup(void); +void Undo(void); +void Redo(void); +void Detruire_la_page_courante(void); void Interchanger_image_principale_et_brouillon(void); -void Changer_facteur_loupe(byte Indice_facteur); +void Changer_facteur_loupe(byte Indice_facteur); void Remap_picture(void); diff --git a/loadsave.c b/loadsave.c index 7d6dffa9..b1c458bd 100644 --- a/loadsave.c +++ b/loadsave.c @@ -451,7 +451,7 @@ void Modif_Erreur_fichier(int Nouvelle_valeur) void Charger_image(byte Image) { int Indice; // Indice de balayage des formats - int Format; // Format du fichier à charger + int Format=0; // Format du fichier à charger // On place par défaut Erreur_fichier à vrai au cas o— on ne sache pas @@ -2168,7 +2168,7 @@ void Load_BMP(void) byte * Buffer; word Indice; byte Palette_locale[256][4]; // R,V,B,0 - word Nb_Couleurs; + word Nb_Couleurs = 0; short Pos_X; short Pos_Y; word Taille_ligne; diff --git a/main.c b/main.c index 71bccda0..5609f840 100644 --- a/main.c +++ b/main.c @@ -21,6 +21,7 @@ #include "files.h" #include "loadsave.h" #include "sdlscreen.h" +#include "erreurs.h" byte Ancien_nb_lignes; // Ancien nombre de lignes de l'écran @@ -503,17 +504,18 @@ void Initialisation_du_programme(int argc,char * argv[]) Mode_dans_lequel_on_demarre=Resolution_actuelle; Buffer_de_ligne_horizontale=NULL; Resolution_actuelle=-1; // On n'était pas dans un mode graphique + Initialiser_mode_video(Mode_dans_lequel_on_demarre); Principal_Largeur_image=Largeur_ecran; Principal_Hauteur_image=Hauteur_ecran; Brouillon_Largeur_image=Largeur_ecran; Brouillon_Hauteur_image=Hauteur_ecran; - +DEBUG("Avant init",0); // Allocation de mémoire pour les différents écrans virtuels (et brosse) if (Initialiser_les_listes_de_backups_en_debut_de_programme(Config.Nb_pages_Undo+1,Largeur_ecran,Hauteur_ecran)==0) Erreur(ERREUR_MEMOIRE); - +DEBUG("Apres init",1); // On remet le nom par défaut pour la page de brouillon car il été modifié // par le passage d'un fichier en paramètre lors du traitement précédent. // Note: le fait que l'on ne modifie que les variables globales Brouillon_* diff --git a/moteur.c b/moteur.c index 0742109b..f1ea988b 100644 --- a/moteur.c +++ b/moteur.c @@ -426,7 +426,7 @@ void Gestion_principale(void) int Indice_bouton_precedent=0; // Numéro de bouton de menu sur lequel on était précédemment byte Blink; // L'opération demande un effacement du curseur int Bouton_Touche; // Bouton à enclencher d'après la touche de raccourci enfoncée - byte Bouton_Cote; // C“té du bouton à enclencher d'après la touche de raccourci enfoncée + byte Bouton_Cote = 0; // Côté du bouton à enclencher d'après la touche de raccourci enfoncée int Indice_Touche; // Indice du tableau de touches spéciales correspondant à la touche enfoncée char Chaine[25]; byte Temp; diff --git a/op_c.c b/op_c.c index fd1f2bbf..c50d797b 100644 --- a/op_c.c +++ b/op_c.c @@ -1,4 +1,4 @@ - +#include #include #include #include @@ -290,7 +290,6 @@ void Cluster_Analyser(Cluster * c,Table_occurence * to) { int rmin,rmax,vmin,vmax,bmin,bmax; int r,v,b; - int nbocc; // On cherche les mins et les maxs de chaque composante sur la couverture diff --git a/pages.c b/pages.c index d78e9197..94f2206c 100644 --- a/pages.c +++ b/pages.c @@ -1,6 +1,6 @@ -////////////////////////////////////////////////////////////////////////// -/////////////////////////// GESTION DU BACKUP //////////////////////////// -////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +/////////////////////////// GESTION DU BACKUP //////////////////////////// +////////////////////////////////////////////////////////////////////////// #include #include @@ -14,1003 +14,1001 @@ // On déclare méchamment le prototype de Erreur pour éviter de faire un // fichier "main.h": void Erreur(int Code); - - /// - /// GESTION DES PAGES - /// - -void Initialiser_S_Page(S_Page * Page) -{ - // Important: appeler cette fonction sur toute nouvelle structure S_Page! - - if (Page!=NULL) - { - Page->Image=NULL; - Page->Largeur=0; - Page->Hauteur=0; - memset(Page->Palette,0,sizeof(T_Palette)); - memset(Page->Commentaire,0,TAILLE_COMMENTAIRE+1); - memset(Page->Repertoire_fichier,0,256); - memset(Page->Nom_fichier,0,13); - Page->Format_fichier=FORMAT_PAR_DEFAUT; -/* - Page->Decalage_X=0; - Page->Decalage_Y=0; - Page->Ancien_Decalage_X=0; - Page->Ancien_Decalage_Y=0; - Page->Split=0; - Page->X_Zoom=0; - Page->Proportion_split=PROPORTION_SPLIT; - Page->Loupe_Mode=0; - Page->Loupe_Facteur=FACTEUR_DE_ZOOM_PAR_DEFAUT; - Page->Loupe_Hauteur=0; - Page->Loupe_Largeur=0; - Page->Loupe_Decalage_X=0; - Page->Loupe_Decalage_Y=0; -*/ - } -} - -void Download_infos_page_principal(S_Page * Page) -{ - //int Indice_facteur; - int Dimensions_modifiees; - - if (Page!=NULL) - { - Dimensions_modifiees=(Principal_Largeur_image!=Page->Largeur) || - (Principal_Hauteur_image!=Page->Hauteur); - - Principal_Ecran=Page->Image; - Principal_Largeur_image=Page->Largeur; - Principal_Hauteur_image=Page->Hauteur; - memcpy(Principal_Palette,Page->Palette,sizeof(T_Palette)); - memcpy(Principal_Commentaire,Page->Commentaire,TAILLE_COMMENTAIRE+1); - memcpy(Principal_Repertoire_fichier,Page->Repertoire_fichier,256); - memcpy(Principal_Nom_fichier,Page->Nom_fichier,13); - Principal_Format_fichier=Page->Format_fichier; -/* - Principal_Decalage_X=Page->Decalage_X; - Principal_Decalage_Y=Page->Decalage_Y; - - // On corrige les décalages en fonction de la dimension de l'‚cran - if ( (Principal_Decalage_X>0) && - (Principal_Decalage_X+Largeur_ecran>Principal_Largeur_image) ) - Principal_Decalage_X=Max(0,Principal_Largeur_image-Largeur_ecran); - if ( (Principal_Decalage_Y>0) && - (Principal_Decalage_Y+Menu_Ordonnee>Principal_Hauteur_image) ) - Principal_Decalage_Y=Max(0,Principal_Hauteur_image-Menu_Ordonnee); - - Ancien_Principal_Decalage_X=Page->Ancien_Decalage_X; - Ancien_Principal_Decalage_Y=Page->Ancien_Decalage_Y; - Principal_Split=Page->Split; - Principal_X_Zoom=Page->X_Zoom; - Principal_Proportion_split=Page->Proportion_split; - Loupe_Mode=Page->Loupe_Mode; - Loupe_Facteur=Page->Loupe_Facteur; - Loupe_Hauteur=Page->Loupe_Hauteur; - Loupe_Largeur=Page->Loupe_Largeur; - Loupe_Decalage_X=Page->Loupe_Decalage_X; - Loupe_Decalage_Y=Page->Loupe_Decalage_Y; - - // Comme le facteur de zoom a des chances d'avoir chang‚, on appelle - // "Changer_facteur_loupe". - for (Indice_facteur=0; FACTEUR_ZOOM[Indice_facteur]!=Loupe_Facteur; Indice_facteur++); - Changer_facteur_loupe(Indice_facteur); -*/ - if (Dimensions_modifiees) - { - Loupe_Mode=0; - Principal_Decalage_X=0; - Principal_Decalage_Y=0; - Pixel_Preview=Pixel_Preview_Normal; - Calculer_limites(); - Calculer_coordonnees_pinceau(); - } - } -} - -void Upload_infos_page_principal(S_Page * Page) -{ - if (Page!=NULL) - { - Page->Image=Principal_Ecran; - Page->Largeur=Principal_Largeur_image; - Page->Hauteur=Principal_Hauteur_image; - memcpy(Page->Palette,Principal_Palette,sizeof(T_Palette)); - memcpy(Page->Commentaire,Principal_Commentaire,TAILLE_COMMENTAIRE+1); - memcpy(Page->Repertoire_fichier,Principal_Repertoire_fichier,256); - memcpy(Page->Nom_fichier,Principal_Nom_fichier,13); - Page->Format_fichier=Principal_Format_fichier; -/* - Page->Decalage_X=Principal_Decalage_X; - Page->Decalage_Y=Principal_Decalage_Y; - Page->Ancien_Decalage_X=Ancien_Principal_Decalage_X; - Page->Ancien_Decalage_X=Ancien_Principal_Decalage_Y; - Page->Split=Principal_Split; - Page->X_Zoom=Principal_X_Zoom; - Page->Proportion_split=Principal_Proportion_split; - Page->Loupe_Mode=Loupe_Mode; - Page->Loupe_Facteur=Loupe_Facteur; - Page->Loupe_Hauteur=Loupe_Hauteur; - Page->Loupe_Largeur=Loupe_Largeur; - Page->Loupe_Decalage_X=Loupe_Decalage_X; - Page->Loupe_Decalage_Y=Loupe_Decalage_Y; -*/ - } -} - -void Download_infos_page_brouillon(S_Page * Page) -{ - if (Page!=NULL) - { - Brouillon_Ecran=Page->Image; - Brouillon_Largeur_image=Page->Largeur; - Brouillon_Hauteur_image=Page->Hauteur; - memcpy(Brouillon_Palette,Page->Palette,sizeof(T_Palette)); - memcpy(Brouillon_Commentaire,Page->Commentaire,TAILLE_COMMENTAIRE+1); - memcpy(Brouillon_Repertoire_fichier,Page->Repertoire_fichier,256); - memcpy(Brouillon_Nom_fichier,Page->Nom_fichier,13); - Brouillon_Format_fichier=Page->Format_fichier; -/* - Brouillon_Decalage_X=Page->Decalage_X; - Brouillon_Decalage_Y=Page->Decalage_Y; - Ancien_Brouillon_Decalage_X=Page->Ancien_Decalage_X; - Ancien_Brouillon_Decalage_Y=Page->Ancien_Decalage_Y; - Brouillon_Split=Page->Split; - Brouillon_X_Zoom=Page->X_Zoom; - Brouillon_Proportion_split=Page->Proportion_split; - Brouillon_Loupe_Mode=Page->Loupe_Mode; - Brouillon_Loupe_Facteur=Page->Loupe_Facteur; - Brouillon_Loupe_Hauteur=Page->Loupe_Hauteur; - Brouillon_Loupe_Largeur=Page->Loupe_Largeur; - Brouillon_Loupe_Decalage_X=Page->Loupe_Decalage_X; - Brouillon_Loupe_Decalage_Y=Page->Loupe_Decalage_Y; -*/ - } -} - -void Upload_infos_page_brouillon(S_Page * Page) -{ - if (Page!=NULL) - { - Page->Image=Brouillon_Ecran; - Page->Largeur=Brouillon_Largeur_image; - Page->Hauteur=Brouillon_Hauteur_image; - memcpy(Page->Palette,Brouillon_Palette,sizeof(T_Palette)); - memcpy(Page->Commentaire,Brouillon_Commentaire,TAILLE_COMMENTAIRE+1); - memcpy(Page->Repertoire_fichier,Brouillon_Repertoire_fichier,256); - memcpy(Page->Nom_fichier,Brouillon_Nom_fichier,13); - Page->Format_fichier=Brouillon_Format_fichier; -/* - Page->Decalage_X=Brouillon_Decalage_X; - Page->Decalage_Y=Brouillon_Decalage_Y; - Page->Ancien_Decalage_X=Ancien_Brouillon_Decalage_X; - Page->Ancien_Decalage_Y=Ancien_Brouillon_Decalage_Y; - Page->Split=Brouillon_Split; - Page->X_Zoom=Brouillon_X_Zoom; - Page->Proportion_split=Brouillon_Proportion_split; - Page->Loupe_Mode=Brouillon_Loupe_Mode; - Page->Loupe_Facteur=Brouillon_Loupe_Facteur; - Page->Loupe_Hauteur=Brouillon_Loupe_Hauteur; - Page->Loupe_Largeur=Brouillon_Loupe_Largeur; - Page->Loupe_Decalage_X=Brouillon_Loupe_Decalage_X; - Page->Loupe_Decalage_Y=Brouillon_Loupe_Decalage_Y; -*/ - } -} - -void Download_infos_backup(S_Liste_de_pages * Liste) -{ - Ecran_backup=Liste->Pages[1].Image; - - if (Config.FX_Feedback) - FX_Feedback_Ecran=Liste->Pages[0].Image; - else - FX_Feedback_Ecran=Liste->Pages[1].Image; -} - -int Allouer_une_page(S_Page * Page,int Largeur,int Hauteur) -{ - // Important: la S_Page ne doit pas déjà désigner une page allouée auquel - // cas celle-ci serait perdue. - - /* Debug : if (Page->Image!=NULL) exit(666); */ - - // On alloue la mémoire pour le bitmap - Page->Image=(byte *)malloc(Largeur*Hauteur); - - // On vérifie que l'allocation se soit bien passée - if (Page->Image==NULL) - return 0; // Echec - else - { - Page->Largeur=Largeur; - Page->Hauteur=Hauteur; - // Important: La mise à jour des autres infos est du ressort de - // l'appelant. - - return 1; // Succès - } -} - -void Liberer_une_page(S_Page * Page) -{ - // On peut appeler cette fonction sur une page non allouée. - - if (Page->Image!=NULL) - free(Page->Image); - Page->Image=NULL; - Page->Largeur=0; - Page->Hauteur=0; - // On ne se préoccupe pas de ce que deviens le reste des infos de l'image. -} - -void Copier_S_page(S_Page * Destination,S_Page * Source) -{ - *Destination=*Source; -} - -int Taille_d_une_page(S_Page * Page) -{ - return sizeof(S_Page)+(Page->Largeur*Page->Hauteur)+8; - // 8 = 4 + 4 - // (Toute zone allouée en mémoire est précédée d'un mot double indiquant sa - // taille, or la taille d'un mot double est de 4 octets, et on utilise deux - // allocations de mémoires: une pour la S_Page et une pour l'image) -} - - - /// - /// GESTION DES LISTES DE PAGES - /// - -void Initialiser_S_Liste_de_pages(S_Liste_de_pages * Liste) -{ - // Important: appeler cette fonction sur toute nouvelle structure - // S_Liste_de_pages! - - Liste->Taille_liste=0; - Liste->Nb_pages_allouees=0; - Liste->Pages=NULL; -} - -int Allouer_une_liste_de_pages(S_Liste_de_pages * Liste,int Taille) -{ - // Important: la S_Liste_de_pages ne doit pas déjà désigner une liste de - // pages allouée auquel cas celle-ci serait perdue. - int Indice; - - /* Debug : if (Liste->Pages!=NULL) exit(666); */ - - // On alloue la mémoire pour la liste - Liste->Pages=(S_Page *)malloc(Taille*sizeof(S_Page)); - - // On vérifie que l'allocation se soit bien passée - if (Liste->Pages==NULL) - return 0; // Echec - else - { - // On initialise chacune des nouvelles pages - for (Indice=0;IndicePages+Indice); - Liste->Taille_liste=Taille; - Liste->Nb_pages_allouees=0; - - return 1; // Succès - } -} - -void Liberer_une_liste_de_pages(S_Liste_de_pages * Liste) -{ - // On peut appeler cette fonction sur une liste de pages non allouée. - - // Important: cette fonction ne libère pas les pages de la liste. Il faut - // donc le faire préalablement si nécessaire. - - if (Liste->Pages!=NULL) - free(Liste->Pages); - Liste->Pages=NULL; - Liste->Taille_liste=0; - Liste->Nb_pages_allouees=0; -} - -int Taille_d_une_liste_de_pages(S_Liste_de_pages * Liste) -{ - int Resultat=0; - int Indice; - - for (Indice=0;IndiceNb_pages_allouees;Indice++) - Resultat+=Taille_d_une_page(Liste->Pages+Indice); - - return Resultat+sizeof(S_Liste_de_pages)+4; - - // C.F. la remarque à propos de Taille_d_une_page pour la valeur 4. -} - -void Reculer_dans_une_liste_de_pages(S_Liste_de_pages * Liste) -{ - // Cette fonction fait l'‚quivalent d'un "Undo" dans la liste de pages. - // Elle effectue une sorte de ROL (Rotation Left) sur la liste: - // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | - // º0º1³2³3³4³5³6³7³8³9³Aº | - // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | 0=Page courante - // ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ |_ A=Page la plus ancienne - // v v v v v v v v v v v | 1=Dernière page (1er backup) - // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | - // º1º2³3³4³5³6³7³8³9³A³0º | - // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | - - // Pour simuler un véritable Undo, l'appelant doit mettre la structure - // de page courante à jour avant l'appel, puis en réextraire les infos en - // sortie, ainsi que celles relatives à la plus récente page d'undo (1ère - // page de la liste). - - int Indice; - S_Page * Page_tempo; - - if (Liste->Nb_pages_allouees>1) - { - // On crée la page tempo - Page_tempo=(S_Page *)malloc(sizeof(S_Page)); - Initialiser_S_Page(Page_tempo); - - // On copie la 1ère page (Page 0) dans la page temporaire - Copier_S_page(Page_tempo,Liste->Pages); - - // On copie toutes les pages 1-A à leur gauche - for (Indice=1;IndiceNb_pages_allouees;Indice++) - Copier_S_page(Liste->Pages+Indice-1,Liste->Pages+Indice); - - // On copie la page 0 (dont la sauvegarde a été effectuée dans la page - // temporaire) en dernière position - Copier_S_page(Liste->Pages+Liste->Nb_pages_allouees-1,Page_tempo); - - // On détruit la page tempo - free(Page_tempo); - } -} - -void Avancer_dans_une_liste_de_pages(S_Liste_de_pages * Liste) -{ - // Cette fonction fait l'‚quivalent d'un "Redo" dans la liste de pages. - // Elle effectue une sorte de ROR (Rotation Right) sur la liste: - // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | - // º0º1³2³3³4³5³6³7³8³9³Aº | - // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | 0=Page courante - // ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ |_ A=Page la plus ancienne - // v v v v v v v v v v v | 1=Dernière page (1er backup) - // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | - // ºAº0³1³2³3³4³5³6³7³8³9º | - // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | - - // Pour simuler un véritable Redo, l'appelant doit mettre la structure - // de page courante à jour avant l'appel, puis en réextraire les infos en - // sortie, ainsi que celles relatives à la plus récente page d'undo (1ère - // page de la liste). - - int Indice; - S_Page * Page_tempo; - - if (Liste->Nb_pages_allouees>1) - { - // On crée la page tempo - Page_tempo=(S_Page *)malloc(sizeof(S_Page)); - Initialiser_S_Page(Page_tempo); - - // On copie la dernière page dans la page temporaire - Copier_S_page(Page_tempo,Liste->Pages+Liste->Nb_pages_allouees-1); - - // On copie toutes les pages 0-9 à leur droite - for (Indice=Liste->Nb_pages_allouees-1;Indice>0;Indice--) - Copier_S_page(Liste->Pages+Indice,Liste->Pages+Indice-1); - - // On copie la page plus ancienne page (la "A", dont la sauvegarde a été - // effectuée dans la page temporaire) en 1ère position - Copier_S_page(Liste->Pages,Page_tempo); - - // On détruit la page tempo - free(Page_tempo); - } -} - -int Nouvelle_page_possible(S_Page * Nouvelle_page,S_Liste_de_pages * Liste_courante,S_Liste_de_pages * Liste_secondaire) -{ - int Taille_immediatement_disponible; - int Taille_liste_courante; - int Taille_liste_brouillon; - int Taille_page_courante; - int Taille_page_brouillon; - int Taille_nouvelle_page; - - Taille_immediatement_disponible=Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER; - Taille_liste_courante =Taille_d_une_liste_de_pages(Liste_courante); - Taille_liste_brouillon=Taille_d_une_liste_de_pages(Liste_secondaire); - Taille_page_courante =Taille_d_une_page(Liste_courante->Pages); - Taille_page_brouillon =Taille_d_une_page(Liste_secondaire->Pages); - Taille_nouvelle_page =Taille_d_une_page(Nouvelle_page); - - // Il faut pouvoir loger la nouvelle page et son backup dans la page - // courante, en conservant au pire la 1ère page de brouillon. - if ((Taille_immediatement_disponible+Taille_liste_courante+ - Taille_liste_brouillon-Taille_page_brouillon)<(2*Taille_nouvelle_page)) - return 0; - - // Il faut pouvoir loger le brouillon et son backup dans la page de - // brouillon, en conservant au pire un exemplaire de la nouvelle page dans - // la page courante. (pour permettre à l'utilisateur de travailler sur son - // brouillon) - if ((Taille_immediatement_disponible+Taille_liste_courante+ - Taille_liste_brouillon-Taille_nouvelle_page)<(2*Taille_page_brouillon)) - return 0; - - return 1; -} - -void Detruire_derniere_page_allouee_de_la_liste(S_Liste_de_pages * Liste) -{ - if (Liste!=NULL) - { - if (Liste->Nb_pages_allouees>0) - { - Liste->Nb_pages_allouees--; - Liberer_une_page(Liste->Pages+Liste->Nb_pages_allouees); - } - } -} - -void Creer_nouvelle_page(S_Page * Nouvelle_page,S_Liste_de_pages * Liste_courante,S_Liste_de_pages * Liste_secondaire) -{ - -// Cette fonction crée une nouvelle page dont les attributs correspondent à -// ceux de Nouvelle_page (Largeur,Hauteur,...) (le champ Image est invalide -// à l'appel, c'est la fonction qui le met à jour), et l'enfile dans -// Liste_courante. -// Il est impératif que la création de cette page soit possible, -// éventuellement au détriment des backups de la page de brouillon -// (Liste_secondaire). Afin de s'en assurer, il faut vérifier cette -// possibilité à l'aide de -// Nouvelle_page_possible(Nouvelle_page,Liste_courante,Liste_secondaire) avant -// l'appel à cette fonction. -// De plus, il faut qu'il y ait au moins une page dans chacune des listes. - - int Il_faut_liberer; - S_Liste_de_pages * Liste_a_raboter=NULL; - S_Page * Page_a_supprimer; - int Indice; - - // On regarde s'il faut libérer des pages: - Il_faut_liberer= - // C'est le cas si la Liste_courante est pleine - ( (Liste_courante->Taille_liste==Liste_courante->Nb_pages_allouees) - // ou qu'il ne reste plus assez de place pour allouer la Nouvelle_page - || ( (Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER)< - (Nouvelle_page->Hauteur*Nouvelle_page->Largeur) ) ); - - if (!Il_faut_liberer) - { - // On a assez de place pour allouer une page, et de plus la Liste_courante - // n'est pas pleine. On n'a donc aucune page à supprimer. On peut en - // allouer une directement. - Nouvelle_page->Image=(byte *)malloc(Nouvelle_page->Hauteur*Nouvelle_page->Largeur); - } - else - { - // On manque de mémoire ou la Liste_courante est pleine. Dans tous les - // cas, il faut libérer une page... qui peut-ˆtre pourra re-servir. - - // Tant qu'il faut libérer - while (Il_faut_liberer) - { - // On cherche sur quelle liste on va virer une page - - // S'il reste des pages à libérer dans la Liste_courante - if (Liste_courante->Nb_pages_allouees>1) - // Alors on va détruire la dernière page allouée de la Liste_courante - Liste_a_raboter=Liste_courante; - else - { - if (Liste_secondaire->Nb_pages_allouees>1) - { - // Sinon on va détruire la dernière page allouée de la - // Liste_secondaire - Liste_a_raboter=Liste_secondaire; - } - else - { - Erreur(ERREUR_SORRY_SORRY_SORRY); - } - } - - // Puis on détermine la page que l'on va supprimer (c'est la dernière de - // la liste) - Page_a_supprimer=Liste_a_raboter->Pages+(Liste_a_raboter->Nb_pages_allouees)-1; - - // On regarde si on peut recycler directement la page (cas o— elle - // aurait la mˆme surface que la Nouvelle_page) - if ((Page_a_supprimer->Hauteur*Page_a_supprimer->Largeur)== - (Nouvelle_page->Hauteur*Nouvelle_page->Largeur)) - { - // Alors - // On récupère le bitmap de la page à supprimer (‚vite de faire des - // allocations/désallocations fastidieuses et inutiles) - Nouvelle_page->Image=Page_a_supprimer->Image; - - // On fait semblant que la dernière page allouée ne l'est pas - Liste_a_raboter->Nb_pages_allouees--; - - // On n'a plus besoin de libérer de la mémoire puisqu'on a refilé à - // Nouvelle_page un bitmap valide - Il_faut_liberer=0; - } - else - { - // Sinon - - // Détruire la dernière page allouée dans la Liste_à_raboter - Detruire_derniere_page_allouee_de_la_liste(Liste_a_raboter); - - // On regarde s'il faut continuer à libérer de la place - Il_faut_liberer=(Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER) - <(Nouvelle_page->Hauteur*Nouvelle_page->Largeur); - - // S'il ne faut pas, c'est qu'on peut allouer un bitmap - // pour la Nouvelle_page - if (!Il_faut_liberer) - Nouvelle_page->Image=(byte *)malloc(Nouvelle_page->Hauteur*Nouvelle_page->Largeur); - } - } - } - - // D'après l'hypothèse de départ, la boucle ci-dessus doit s'arrˆter car - // on a assez de mémoire pour allouer la nouvelle page. - // Désormais Nouvelle_page contient un pointeur sur une zone bitmap valide. - - // Décaler la Liste_courante d'un cran vers le pass‚. - for (Indice=Liste_courante->Taille_liste-1;Indice>0;Indice--) - Copier_S_page(Liste_courante->Pages+Indice,Liste_courante->Pages+Indice-1); - - // Recopier la Nouvelle_page en 1ère position de la Liste_courante - Copier_S_page(Liste_courante->Pages,Nouvelle_page); - Liste_courante->Nb_pages_allouees++; -} - -void Changer_nombre_de_pages_d_une_liste(S_Liste_de_pages * Liste,int Nb) -{ - int Indice; - S_Page * Nouvelles_pages; - - // Si la liste a déjà la taille demandée - if (Liste->Taille_liste==Nb) - // Alors il n'y a rien à faire - return; - - // Si la liste contient plus de pages que souhaité - if (Liste->Taille_liste>Nb) - // Alors pour chaque page en excés - for (Indice=Nb;IndiceTaille_liste;Indice++) - // On libère la page - Liberer_une_page(Liste->Pages+Indice); - - // On fait une nouvelle liste de pages: - Nouvelles_pages=(S_Page *)malloc(Nb*sizeof(S_Page)); - for (Indice=0;IndiceTaille_liste);Indice++) - Copier_S_page(Nouvelles_pages+Indice,Liste->Pages+Indice); - - // On libère l'ancienne liste - free(Liste->Pages); - - // On met à jour les champs de la nouvelle liste - Liste->Pages=Nouvelles_pages; - Liste->Taille_liste=Nb; - if (Liste->Nb_pages_allouees>Nb) - Liste->Nb_pages_allouees=Nb; -} - -void Detruire_la_page_courante_d_une_liste(S_Liste_de_pages * Liste) -{ - // On ne peut pas détruire la page courante de la liste si après - // destruction il ne reste pas encore au moins une page. - if (Liste->Nb_pages_allouees>1) - { - // On fait faire un undo à la liste, comme ‡a, la nouvelle page courante - // est la page précédente - Reculer_dans_une_liste_de_pages(Principal_Backups); - - // Puis on détruit la dernière page, qui est l'ancienne page courante - Detruire_derniere_page_allouee_de_la_liste(Liste); - } -} - - - /// - /// GESTION DES BACKUPS - /// - -int Initialiser_les_listes_de_backups_en_debut_de_programme(int Taille,int Largeur,int Hauteur) -{ - // Taille correspond au nombre de pages que l'on souhaite dans chaque liste - // (1 pour la page courante, puis 1 pour chaque backup, soit 2 au minimum). - // Largeur et Hauteur correspondent à la dimension des images de départ. - - S_Page * Page; - int Retour=0; - - if (Allouer_une_liste_de_pages(Principal_Backups,Taille) && - Allouer_une_liste_de_pages(Brouillon_Backups,Taille)) - { - // On a réussi à allouer deux listes de pages dont la taille correspond à - // celle demandée par l'utilisateur. - - // On crée un descripteur de page correspondant à la page principale - Page=(S_Page *)malloc(sizeof(S_Page)); - Initialiser_S_Page(Page); - Upload_infos_page_principal(Page); - // On y met les infos sur la dimension de démarrage - Page->Largeur=Largeur; - Page->Hauteur=Hauteur; - - // On regarde si on peut ajouter cette page - if (Nouvelle_page_possible(Page,Principal_Backups,Brouillon_Backups)) - { - // On peut, donc on va la créer - Creer_nouvelle_page(Page,Principal_Backups,Brouillon_Backups); - Download_infos_page_principal(Page); - Download_infos_backup(Principal_Backups); - - // Maintenant, on regarde si on a le droit de créer la mˆme page dans - // la page de brouillon. - if (Nouvelle_page_possible(Page,Brouillon_Backups,Principal_Backups)) - { - // On peut donc on le fait - Creer_nouvelle_page(Page,Brouillon_Backups,Principal_Backups); - Download_infos_page_brouillon(Page); - - // Et on efface les 2 images en les remplacant de "0" - memset(Principal_Ecran,0,Principal_Largeur_image*Principal_Hauteur_image); - memset(Brouillon_Ecran,0,Brouillon_Largeur_image*Brouillon_Hauteur_image); - - Retour=1; - } - else - { - // Il n'est pas possible de démarrer le programme avec la page - // principale et la page de brouillon aux dimensions demandée par - // l'utilisateur. ==> On l'envoie ballader - Retour=0; - } - } - else - { - // On ne peut pas démarrer le programme avec ne serait-ce qu'une page - // de la dimension souhaitée, donc on laisse tout tomber et on le - // renvoie chier. - Retour=0; - } - } - else - { - // On n'a mˆme pas réussi à créer les listes. Donc c'est mˆme pas la - // peine de continuer : l'utilisateur ne pourra jamais rien faire, autant - // avorter le chargement du programme. - Retour=0; - } - - return Retour; -} - -void Detruire_les_listes_de_backups_en_fin_de_programme(void) -{ - // On commence par supprimer les pages une à une dans chacune des listes - // Liste de la page principale - while (Principal_Backups->Nb_pages_allouees>0) - Detruire_derniere_page_allouee_de_la_liste(Principal_Backups); - // Liste de la page de brouillon - while (Brouillon_Backups->Nb_pages_allouees>0) - Detruire_derniere_page_allouee_de_la_liste(Brouillon_Backups); - - // Puis on peut détruire les structures de liste elles-mˆmes - Liberer_une_liste_de_pages(Principal_Backups); - Liberer_une_liste_de_pages(Brouillon_Backups); - free(Principal_Backups); - free(Brouillon_Backups); -} - -void Nouveau_nombre_de_backups(int Nouveau) -{ - Changer_nombre_de_pages_d_une_liste(Principal_Backups,Nouveau+1); - Changer_nombre_de_pages_d_une_liste(Brouillon_Backups,Nouveau+1); - - // Le +1 vient du fait que dans chaque liste, en 1ère position on retrouve - // les infos de la page courante sur le brouillon et la page principale. - // (Nouveau = Nombre de backups, sans compter les pages courantes) -} - -int Backup_avec_nouvelles_dimensions(int Upload,int Largeur,int Hauteur) -{ - // Retourne 1 si une nouvelle page est disponible (alors pleine de 0) et - // 0 sinon. - - S_Page * Nouvelle_page; - int Retour=0; - - if (Upload) - // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les - // retrouver plus tard) - Upload_infos_page_principal(Principal_Backups->Pages); - - // On crée un descripteur pour la nouvelle page courante - Nouvelle_page=(S_Page *)malloc(sizeof(S_Page)); - Initialiser_S_Page(Nouvelle_page); - - Upload_infos_page_principal(Nouvelle_page); - Nouvelle_page->Largeur=Largeur; - Nouvelle_page->Hauteur=Hauteur; - if (Nouvelle_page_possible(Nouvelle_page,Principal_Backups,Brouillon_Backups)) - { - Creer_nouvelle_page(Nouvelle_page,Principal_Backups,Brouillon_Backups); - Download_infos_page_principal(Nouvelle_page); - Download_infos_backup(Principal_Backups); - // On nettoie la nouvelle image: - memset(Principal_Ecran,0,Principal_Largeur_image*Principal_Hauteur_image); - Retour=1; - } - - // On détruit le descripteur de la page courante - free(Nouvelle_page); - - return Retour; -} - -int Backuper_et_redimensionner_brouillon(int Largeur,int Hauteur) -{ - // Retourne 1 si la page de dimension souhaitee est disponible en brouillon - // et 0 sinon. - - S_Page * Nouvelle_page; - int Retour=0; - - // On remet à jour l'‚tat des infos de la page de brouillon (pour pouvoir - // les retrouver plus tard) - Upload_infos_page_brouillon(Brouillon_Backups->Pages); - - // On crée un descripteur pour la nouvelle page de brouillon - Nouvelle_page=(S_Page *)malloc(sizeof(S_Page)); - Initialiser_S_Page(Nouvelle_page); - - Upload_infos_page_brouillon(Nouvelle_page); - Nouvelle_page->Largeur=Largeur; - Nouvelle_page->Hauteur=Hauteur; - if (Nouvelle_page_possible(Nouvelle_page,Brouillon_Backups,Principal_Backups)) - { - Creer_nouvelle_page(Nouvelle_page,Brouillon_Backups,Principal_Backups); - Download_infos_page_brouillon(Nouvelle_page); - Retour=1; - } - - // On détruit le descripteur de la page courante - free(Nouvelle_page); - - return Retour; -} - -void Backup(void) -{ - S_Page * Nouvelle_page; - - // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les - // retrouver plus tard) - Upload_infos_page_principal(Principal_Backups->Pages); - - // On crée un descripteur pour la nouvelle page courante - Nouvelle_page=(S_Page *)malloc(sizeof(S_Page)); - Initialiser_S_Page(Nouvelle_page); - - // Enrichissement de l'historique - Copier_S_page(Nouvelle_page,Principal_Backups->Pages); - Creer_nouvelle_page(Nouvelle_page,Principal_Backups,Brouillon_Backups); - Download_infos_page_principal(Nouvelle_page); - Download_infos_backup(Principal_Backups); - - // On copie l'image du backup vers la page courante: - memcpy(Principal_Ecran,Ecran_backup,Principal_Largeur_image*Principal_Hauteur_image); - - // On détruit le descripteur de la page courante - free(Nouvelle_page); - - // On allume l'indicateur de modification de l'image - Principal_Image_modifiee=1; -} - -void Undo(void) -{ - // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les - // retrouver plus tard) - Upload_infos_page_principal(Principal_Backups->Pages); - // On fait faire un undo à la liste des backups de la page principale - Reculer_dans_une_liste_de_pages(Principal_Backups); - - // On extrait ensuite les infos sur la nouvelle page courante - Download_infos_page_principal(Principal_Backups->Pages); - // Et celles du backup - Download_infos_backup(Principal_Backups); - // Note: le backup n'a pas obligatoirement les mˆmes dimensions ni la mˆme - // palette que la page courante. Mais en temps normal, le backup - // n'est pas utilisé à la suite d'un Undo. Donc ‡a ne devrait pas - // poser de problèmes. -} - -void Redo(void) -{ - // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les - // retrouver plus tard) - Upload_infos_page_principal(Principal_Backups->Pages); - // On fait faire un redo à la liste des backups de la page principale - Avancer_dans_une_liste_de_pages(Principal_Backups); - - // On extrait ensuite les infos sur la nouvelle page courante - Download_infos_page_principal(Principal_Backups->Pages); - // Et celles du backup - Download_infos_backup(Principal_Backups); - // Note: le backup n'a pas obligatoirement les mˆmes dimensions ni la mˆme - // palette que la page courante. Mais en temps normal, le backup - // n'est pas utilisé à la suite d'un Redo. Donc ‡a ne devrait pas - // poser de problèmes. -} - -void Detruire_la_page_courante(void) -{ - // On détruit la page courante de la liste principale - Detruire_la_page_courante_d_une_liste(Principal_Backups); - // On extrait ensuite les infos sur la nouvelle page courante - Download_infos_page_principal(Principal_Backups->Pages); - // Et celles du backup - Download_infos_backup(Principal_Backups); - // Note: le backup n'a pas obligatoirement les mˆmes dimensions ni la mˆme - // palette que la page courante. Mais en temps normal, le backup - // n'est pas utilisé à la suite d'une destruction de page. Donc ‡a ne - // devrait pas poser de problèmes. -} - -void Interchanger_image_principale_et_brouillon(void) -{ - S_Liste_de_pages * Liste_tempo; - - // On commence par mettre à jour dans les descripteurs les infos sur les - // pages qu'on s'apprˆte à échanger, pour qu'on se retrouve pas avec de - // vieilles valeurs qui datent de mathuzalem. - Upload_infos_page_principal(Principal_Backups->Pages); - Upload_infos_page_brouillon(Brouillon_Backups->Pages); - - // On inverse les listes de pages - Liste_tempo=Principal_Backups; - Principal_Backups=Brouillon_Backups; - Brouillon_Backups=Liste_tempo; - - // On extrait ensuite les infos sur les nouvelles pages courante, brouillon - // et backup. - - /* SECTION GROS CACA PROUT PROUT */ - // Auparavant on ruse en mettant déjà à jour les dimensions de la - // nouvelle page courante. Si on ne le fait pas, le "Download" va détecter - // un changement de dimensions et va bˆtement sortir du mode loupe, alors - // que lors d'un changement de page, on veut bien conserver l'‚tat du mode - // loupe du brouillon. - Principal_Largeur_image=Principal_Backups->Pages->Largeur; - Principal_Hauteur_image=Principal_Backups->Pages->Hauteur; - - Download_infos_page_principal(Principal_Backups->Pages); - Download_infos_page_brouillon(Brouillon_Backups->Pages); - Download_infos_backup(Principal_Backups); -} - - -int Emprunt_memoire_de_page_possible(int taille) -{ - int Taille_immediatement_disponible; - int Taille_liste_courante; - int Taille_liste_brouillon; - int Taille_page_courante; - int Taille_page_brouillon; - - Taille_immediatement_disponible=Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER; - Taille_liste_courante =Taille_d_une_liste_de_pages(Principal_Backups); - Taille_liste_brouillon=Taille_d_une_liste_de_pages(Brouillon_Backups); - Taille_page_courante =Taille_d_une_page(Principal_Backups->Pages); - Taille_page_brouillon =Taille_d_une_page(Brouillon_Backups->Pages); - - // Il faut pouvoir loger la zone mémoire ainsi qu'un exemplaire de la page - // courante, en conservant au pire la 1ère page de brouillon. - if ((Taille_immediatement_disponible - +Taille_liste_courante - +Taille_liste_brouillon - -Taille_page_courante - -Taille_page_brouillon)Nb_pages_allouees>1) - // Alors on va détruire la dernière page allouée de la liste des - // brouillons - Liste_a_raboter=Brouillon_Backups; - else - { - if (Principal_Backups->Nb_pages_allouees>1) - { - // Sinon on va détruire la dernière page allouée de la - // liste principale - Liste_a_raboter=Principal_Backups; - } - else - { - // Dans cette branche, il était prévu qu'on obtienne la mémoire - // nécessaire mais on n'arrive pas à la trouver. On indique donc - // qu'elle n'est pas disponible, et on aura perdu des backups - // pour rien - return 0; - } - } - - // Puis on détermine la page que l'on va supprimer (c'est la dernière - // de la liste) - Page_a_supprimer=Liste_a_raboter->Pages+(Liste_a_raboter->Nb_pages_allouees)-1; - - // Détruire la dernière page allouée dans la Liste_à_raboter - Detruire_derniere_page_allouee_de_la_liste(Liste_a_raboter); - - // On regarde s'il faut continuer à libérer de la place - Il_faut_liberer= - (Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER)Image=NULL; + Page->Largeur=0; + Page->Hauteur=0; + memset(Page->Palette,0,sizeof(T_Palette)); + memset(Page->Commentaire,0,TAILLE_COMMENTAIRE+1); + memset(Page->Repertoire_fichier,0,256); + memset(Page->Nom_fichier,0,13); + Page->Format_fichier=FORMAT_PAR_DEFAUT; +/* + Page->Decalage_X=0; + Page->Decalage_Y=0; + Page->Ancien_Decalage_X=0; + Page->Ancien_Decalage_Y=0; + Page->Split=0; + Page->X_Zoom=0; + Page->Proportion_split=PROPORTION_SPLIT; + Page->Loupe_Mode=0; + Page->Loupe_Facteur=FACTEUR_DE_ZOOM_PAR_DEFAUT; + Page->Loupe_Hauteur=0; + Page->Loupe_Largeur=0; + Page->Loupe_Decalage_X=0; + Page->Loupe_Decalage_Y=0; +*/ + } +} + +void Download_infos_page_principal(S_Page * Page) +{ + //int Indice_facteur; + int Dimensions_modifiees; + + if (Page!=NULL) + { + Dimensions_modifiees=(Principal_Largeur_image!=Page->Largeur) || + (Principal_Hauteur_image!=Page->Hauteur); + + Principal_Ecran=Page->Image; + Principal_Largeur_image=Page->Largeur; + Principal_Hauteur_image=Page->Hauteur; + memcpy(Principal_Palette,Page->Palette,sizeof(T_Palette)); + memcpy(Principal_Commentaire,Page->Commentaire,TAILLE_COMMENTAIRE+1); + memcpy(Principal_Repertoire_fichier,Page->Repertoire_fichier,256); + memcpy(Principal_Nom_fichier,Page->Nom_fichier,13); + Principal_Format_fichier=Page->Format_fichier; +/* + Principal_Decalage_X=Page->Decalage_X; + Principal_Decalage_Y=Page->Decalage_Y; + + // On corrige les décalages en fonction de la dimension de l'‚cran + if ( (Principal_Decalage_X>0) && + (Principal_Decalage_X+Largeur_ecran>Principal_Largeur_image) ) + Principal_Decalage_X=Max(0,Principal_Largeur_image-Largeur_ecran); + if ( (Principal_Decalage_Y>0) && + (Principal_Decalage_Y+Menu_Ordonnee>Principal_Hauteur_image) ) + Principal_Decalage_Y=Max(0,Principal_Hauteur_image-Menu_Ordonnee); + + Ancien_Principal_Decalage_X=Page->Ancien_Decalage_X; + Ancien_Principal_Decalage_Y=Page->Ancien_Decalage_Y; + Principal_Split=Page->Split; + Principal_X_Zoom=Page->X_Zoom; + Principal_Proportion_split=Page->Proportion_split; + Loupe_Mode=Page->Loupe_Mode; + Loupe_Facteur=Page->Loupe_Facteur; + Loupe_Hauteur=Page->Loupe_Hauteur; + Loupe_Largeur=Page->Loupe_Largeur; + Loupe_Decalage_X=Page->Loupe_Decalage_X; + Loupe_Decalage_Y=Page->Loupe_Decalage_Y; + + // Comme le facteur de zoom a des chances d'avoir chang‚, on appelle + // "Changer_facteur_loupe". + for (Indice_facteur=0; FACTEUR_ZOOM[Indice_facteur]!=Loupe_Facteur; Indice_facteur++); + Changer_facteur_loupe(Indice_facteur); +*/ + if (Dimensions_modifiees) + { + Loupe_Mode=0; + Principal_Decalage_X=0; + Principal_Decalage_Y=0; + Pixel_Preview=Pixel_Preview_Normal; + Calculer_limites(); + Calculer_coordonnees_pinceau(); + } + } +} + +void Upload_infos_page_principal(S_Page * Page) +{ + if (Page!=NULL) + { + Page->Image=Principal_Ecran; + Page->Largeur=Principal_Largeur_image; + Page->Hauteur=Principal_Hauteur_image; + memcpy(Page->Palette,Principal_Palette,sizeof(T_Palette)); + memcpy(Page->Commentaire,Principal_Commentaire,TAILLE_COMMENTAIRE+1); + memcpy(Page->Repertoire_fichier,Principal_Repertoire_fichier,256); + memcpy(Page->Nom_fichier,Principal_Nom_fichier,13); + Page->Format_fichier=Principal_Format_fichier; +/* + Page->Decalage_X=Principal_Decalage_X; + Page->Decalage_Y=Principal_Decalage_Y; + Page->Ancien_Decalage_X=Ancien_Principal_Decalage_X; + Page->Ancien_Decalage_X=Ancien_Principal_Decalage_Y; + Page->Split=Principal_Split; + Page->X_Zoom=Principal_X_Zoom; + Page->Proportion_split=Principal_Proportion_split; + Page->Loupe_Mode=Loupe_Mode; + Page->Loupe_Facteur=Loupe_Facteur; + Page->Loupe_Hauteur=Loupe_Hauteur; + Page->Loupe_Largeur=Loupe_Largeur; + Page->Loupe_Decalage_X=Loupe_Decalage_X; + Page->Loupe_Decalage_Y=Loupe_Decalage_Y; +*/ + } +} + +void Download_infos_page_brouillon(S_Page * Page) +{ + if (Page!=NULL) + { + Brouillon_Ecran=Page->Image; + Brouillon_Largeur_image=Page->Largeur; + Brouillon_Hauteur_image=Page->Hauteur; + memcpy(Brouillon_Palette,Page->Palette,sizeof(T_Palette)); + memcpy(Brouillon_Commentaire,Page->Commentaire,TAILLE_COMMENTAIRE+1); + memcpy(Brouillon_Repertoire_fichier,Page->Repertoire_fichier,256); + memcpy(Brouillon_Nom_fichier,Page->Nom_fichier,13); + Brouillon_Format_fichier=Page->Format_fichier; +/* + Brouillon_Decalage_X=Page->Decalage_X; + Brouillon_Decalage_Y=Page->Decalage_Y; + Ancien_Brouillon_Decalage_X=Page->Ancien_Decalage_X; + Ancien_Brouillon_Decalage_Y=Page->Ancien_Decalage_Y; + Brouillon_Split=Page->Split; + Brouillon_X_Zoom=Page->X_Zoom; + Brouillon_Proportion_split=Page->Proportion_split; + Brouillon_Loupe_Mode=Page->Loupe_Mode; + Brouillon_Loupe_Facteur=Page->Loupe_Facteur; + Brouillon_Loupe_Hauteur=Page->Loupe_Hauteur; + Brouillon_Loupe_Largeur=Page->Loupe_Largeur; + Brouillon_Loupe_Decalage_X=Page->Loupe_Decalage_X; + Brouillon_Loupe_Decalage_Y=Page->Loupe_Decalage_Y; +*/ + } +} + +void Upload_infos_page_brouillon(S_Page * Page) +{ + if (Page!=NULL) + { + Page->Image=Brouillon_Ecran; + Page->Largeur=Brouillon_Largeur_image; + Page->Hauteur=Brouillon_Hauteur_image; + memcpy(Page->Palette,Brouillon_Palette,sizeof(T_Palette)); + memcpy(Page->Commentaire,Brouillon_Commentaire,TAILLE_COMMENTAIRE+1); + memcpy(Page->Repertoire_fichier,Brouillon_Repertoire_fichier,256); + memcpy(Page->Nom_fichier,Brouillon_Nom_fichier,13); + Page->Format_fichier=Brouillon_Format_fichier; +/* + Page->Decalage_X=Brouillon_Decalage_X; + Page->Decalage_Y=Brouillon_Decalage_Y; + Page->Ancien_Decalage_X=Ancien_Brouillon_Decalage_X; + Page->Ancien_Decalage_Y=Ancien_Brouillon_Decalage_Y; + Page->Split=Brouillon_Split; + Page->X_Zoom=Brouillon_X_Zoom; + Page->Proportion_split=Brouillon_Proportion_split; + Page->Loupe_Mode=Brouillon_Loupe_Mode; + Page->Loupe_Facteur=Brouillon_Loupe_Facteur; + Page->Loupe_Hauteur=Brouillon_Loupe_Hauteur; + Page->Loupe_Largeur=Brouillon_Loupe_Largeur; + Page->Loupe_Decalage_X=Brouillon_Loupe_Decalage_X; + Page->Loupe_Decalage_Y=Brouillon_Loupe_Decalage_Y; +*/ + } +} + +void Download_infos_backup(S_Liste_de_pages * Liste) +{ + Ecran_backup=Liste->Pages[1].Image; + + if (Config.FX_Feedback) + FX_Feedback_Ecran=Liste->Pages[0].Image; + else + FX_Feedback_Ecran=Liste->Pages[1].Image; +} + +int Allouer_une_page(S_Page * Page,int Largeur,int Hauteur) +{ + // Important: la S_Page ne doit pas déjà désigner une page allouée auquel + // cas celle-ci serait perdue. + + /* Debug : if (Page->Image!=NULL) exit(666); */ + + // On alloue la mémoire pour le bitmap + Page->Image=(byte *)malloc(Largeur*Hauteur); + + // On vérifie que l'allocation se soit bien passée + if (Page->Image==NULL) + return 0; // Echec + else + { + Page->Largeur=Largeur; + Page->Hauteur=Hauteur; + // Important: La mise à jour des autres infos est du ressort de + // l'appelant. + + return 1; // Succès + } +} + +void Liberer_une_page(S_Page * Page) +{ + // On peut appeler cette fonction sur une page non allouée. + + if (Page->Image!=NULL) + free(Page->Image); + Page->Image=NULL; + Page->Largeur=0; + Page->Hauteur=0; + // On ne se préoccupe pas de ce que deviens le reste des infos de l'image. +} + +void Copier_S_page(S_Page * Destination,S_Page * Source) +{ + *Destination=*Source; +} + +int Taille_d_une_page(S_Page * Page) +{ + return sizeof(S_Page)+(Page->Largeur*Page->Hauteur)+8; + // 8 = 4 + 4 + // (Toute zone allouée en mémoire est précédée d'un mot double indiquant sa + // taille, or la taille d'un mot double est de 4 octets, et on utilise deux + // allocations de mémoires: une pour la S_Page et une pour l'image) +} + + + /// + /// GESTION DES LISTES DE PAGES + /// + +void Initialiser_S_Liste_de_pages(S_Liste_de_pages * Liste) +{ + // Important: appeler cette fonction sur toute nouvelle structure + // S_Liste_de_pages! + + Liste->Taille_liste=0; + Liste->Nb_pages_allouees=0; + Liste->Pages=NULL; +} + +int Allouer_une_liste_de_pages(S_Liste_de_pages * Liste,int Taille) +{ + // Important: la S_Liste_de_pages ne doit pas déjà désigner une liste de + // pages allouée auquel cas celle-ci serait perdue. + int Indice; + + /* Debug : if (Liste->Pages!=NULL) exit(666); */ + + // On alloue la mémoire pour la liste + Liste->Pages=(S_Page *)malloc(Taille*sizeof(S_Page)); + + // On vérifie que l'allocation se soit bien passée + if (Liste->Pages==NULL) + return 0; // Echec + else + { + // On initialise chacune des nouvelles pages + for (Indice=0;IndicePages+Indice); + Liste->Taille_liste=Taille; + Liste->Nb_pages_allouees=0; + + return 1; // Succès + } +} + +void Liberer_une_liste_de_pages(S_Liste_de_pages * Liste) +{ + // On peut appeler cette fonction sur une liste de pages non allouée. + + // Important: cette fonction ne libère pas les pages de la liste. Il faut + // donc le faire préalablement si nécessaire. + + if (Liste->Pages!=NULL) + free(Liste->Pages); + Liste->Pages=NULL; + Liste->Taille_liste=0; + Liste->Nb_pages_allouees=0; +} + +int Taille_d_une_liste_de_pages(S_Liste_de_pages * Liste) +{ + int Resultat=0; + int Indice; + + for (Indice=0;IndiceNb_pages_allouees;Indice++) + Resultat+=Taille_d_une_page(Liste->Pages+Indice); + + return Resultat+sizeof(S_Liste_de_pages)+4; + + // C.F. la remarque à propos de Taille_d_une_page pour la valeur 4. +} + +void Reculer_dans_une_liste_de_pages(S_Liste_de_pages * Liste) +{ + // Cette fonction fait l'‚quivalent d'un "Undo" dans la liste de pages. + // Elle effectue une sorte de ROL (Rotation Left) sur la liste: + // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | + // º0º1³2³3³4³5³6³7³8³9³Aº | + // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | 0=Page courante + // ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ |_ A=Page la plus ancienne + // v v v v v v v v v v v | 1=Dernière page (1er backup) + // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | + // º1º2³3³4³5³6³7³8³9³A³0º | + // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | + + // Pour simuler un véritable Undo, l'appelant doit mettre la structure + // de page courante à jour avant l'appel, puis en réextraire les infos en + // sortie, ainsi que celles relatives à la plus récente page d'undo (1ère + // page de la liste). + + int Indice; + S_Page * Page_tempo; + + if (Liste->Nb_pages_allouees>1) + { + // On crée la page tempo + Page_tempo=(S_Page *)malloc(sizeof(S_Page)); + Initialiser_S_Page(Page_tempo); + + // On copie la 1ère page (Page 0) dans la page temporaire + Copier_S_page(Page_tempo,Liste->Pages); + + // On copie toutes les pages 1-A à leur gauche + for (Indice=1;IndiceNb_pages_allouees;Indice++) + Copier_S_page(Liste->Pages+Indice-1,Liste->Pages+Indice); + + // On copie la page 0 (dont la sauvegarde a été effectuée dans la page + // temporaire) en dernière position + Copier_S_page(Liste->Pages+Liste->Nb_pages_allouees-1,Page_tempo); + + // On détruit la page tempo + free(Page_tempo); + } +} + +void Avancer_dans_une_liste_de_pages(S_Liste_de_pages * Liste) +{ + // Cette fonction fait l'‚quivalent d'un "Redo" dans la liste de pages. + // Elle effectue une sorte de ROR (Rotation Right) sur la liste: + // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | + // º0º1³2³3³4³5³6³7³8³9³Aº | + // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | 0=Page courante + // ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ |_ A=Page la plus ancienne + // v v v v v v v v v v v | 1=Dernière page (1er backup) + // ÉÍËÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍÑÍ» | + // ºAº0³1³2³3³4³5³6³7³8³9º | + // ÈÍÊÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏÍÏͼ | + + // Pour simuler un véritable Redo, l'appelant doit mettre la structure + // de page courante à jour avant l'appel, puis en réextraire les infos en + // sortie, ainsi que celles relatives à la plus récente page d'undo (1ère + // page de la liste). + + int Indice; + S_Page * Page_tempo; + + if (Liste->Nb_pages_allouees>1) + { + // On crée la page tempo + Page_tempo=(S_Page *)malloc(sizeof(S_Page)); + Initialiser_S_Page(Page_tempo); + + // On copie la dernière page dans la page temporaire + Copier_S_page(Page_tempo,Liste->Pages+Liste->Nb_pages_allouees-1); + + // On copie toutes les pages 0-9 à leur droite + for (Indice=Liste->Nb_pages_allouees-1;Indice>0;Indice--) + Copier_S_page(Liste->Pages+Indice,Liste->Pages+Indice-1); + + // On copie la page plus ancienne page (la "A", dont la sauvegarde a été + // effectuée dans la page temporaire) en 1ère position + Copier_S_page(Liste->Pages,Page_tempo); + + // On détruit la page tempo + free(Page_tempo); + } +} + +int Nouvelle_page_possible(S_Page * Nouvelle_page,S_Liste_de_pages * Liste_courante,S_Liste_de_pages * Liste_secondaire) +{ + unsigned int Taille_immediatement_disponible; + unsigned int Taille_liste_courante; + unsigned int Taille_liste_brouillon; + unsigned int Taille_page_courante; + unsigned int Taille_page_brouillon; + unsigned int Taille_nouvelle_page; + + Taille_immediatement_disponible=Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER; + Taille_liste_courante =Taille_d_une_liste_de_pages(Liste_courante); + Taille_liste_brouillon=Taille_d_une_liste_de_pages(Liste_secondaire); + Taille_page_courante =Taille_d_une_page(Liste_courante->Pages); + Taille_page_brouillon =Taille_d_une_page(Liste_secondaire->Pages); + Taille_nouvelle_page =Taille_d_une_page(Nouvelle_page); + + // Il faut pouvoir loger la nouvelle page et son backup dans la page + // courante, en conservant au pire la 1ère page de brouillon. + if ((Taille_immediatement_disponible+Taille_liste_courante+ + Taille_liste_brouillon-Taille_page_brouillon)<(2*Taille_nouvelle_page)) + { + DEBUG("A",0); + return 0; + } + + // Il faut pouvoir loger le brouillon et son backup dans la page de + // brouillon, en conservant au pire un exemplaire de la nouvelle page dans + // la page courante. (pour permettre à l'utilisateur de travailler sur son + // brouillon) + if ((Taille_immediatement_disponible+Taille_liste_courante+ + Taille_liste_brouillon-Taille_nouvelle_page)<(2*Taille_page_brouillon)) + { + DEBUG("B",1); + return 0; + } + + return 1; +} + +void Detruire_derniere_page_allouee_de_la_liste(S_Liste_de_pages * Liste) +{ + if (Liste!=NULL) + { + if (Liste->Nb_pages_allouees>0) + { + Liste->Nb_pages_allouees--; + Liberer_une_page(Liste->Pages+Liste->Nb_pages_allouees); + } + } +} + +void Creer_nouvelle_page(S_Page * Nouvelle_page,S_Liste_de_pages * Liste_courante,S_Liste_de_pages * Liste_secondaire) +{ + +// Cette fonction crée une nouvelle page dont les attributs correspondent à +// ceux de Nouvelle_page (Largeur,Hauteur,...) (le champ Image est invalide +// à l'appel, c'est la fonction qui le met à jour), et l'enfile dans +// Liste_courante. +// Il est impératif que la création de cette page soit possible, +// éventuellement au détriment des backups de la page de brouillon +// (Liste_secondaire). Afin de s'en assurer, il faut vérifier cette +// possibilité à l'aide de +// Nouvelle_page_possible(Nouvelle_page,Liste_courante,Liste_secondaire) avant +// l'appel à cette fonction. +// De plus, il faut qu'il y ait au moins une page dans chacune des listes. + + int Il_faut_liberer; + S_Liste_de_pages * Liste_a_raboter=NULL; + S_Page * Page_a_supprimer; + int Indice; + + // On regarde s'il faut libérer des pages: + Il_faut_liberer= + // C'est le cas si la Liste_courante est pleine + ( (Liste_courante->Taille_liste==Liste_courante->Nb_pages_allouees) + // ou qu'il ne reste plus assez de place pour allouer la Nouvelle_page + || ( (Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER)< + (Nouvelle_page->Hauteur*Nouvelle_page->Largeur) ) ); + + if (!Il_faut_liberer) + { + // On a assez de place pour allouer une page, et de plus la Liste_courante + // n'est pas pleine. On n'a donc aucune page à supprimer. On peut en + // allouer une directement. + Nouvelle_page->Image=(byte *)malloc(Nouvelle_page->Hauteur*Nouvelle_page->Largeur); + } + else + { + // On manque de mémoire ou la Liste_courante est pleine. Dans tous les + // cas, il faut libérer une page... qui peut-ˆtre pourra re-servir. + + // Tant qu'il faut libérer + while (Il_faut_liberer) + { + // On cherche sur quelle liste on va virer une page + + // S'il reste des pages à libérer dans la Liste_courante + if (Liste_courante->Nb_pages_allouees>1) + // Alors on va détruire la dernière page allouée de la Liste_courante + Liste_a_raboter=Liste_courante; + else + { + if (Liste_secondaire->Nb_pages_allouees>1) + { + // Sinon on va détruire la dernière page allouée de la + // Liste_secondaire + Liste_a_raboter=Liste_secondaire; + } + else + { + Erreur(ERREUR_SORRY_SORRY_SORRY); + } + } + + // Puis on détermine la page que l'on va supprimer (c'est la dernière de + // la liste) + Page_a_supprimer=Liste_a_raboter->Pages+(Liste_a_raboter->Nb_pages_allouees)-1; + + // On regarde si on peut recycler directement la page (cas o— elle + // aurait la mˆme surface que la Nouvelle_page) + if ((Page_a_supprimer->Hauteur*Page_a_supprimer->Largeur)== + (Nouvelle_page->Hauteur*Nouvelle_page->Largeur)) + { + // Alors + // On récupère le bitmap de la page à supprimer (‚vite de faire des + // allocations/désallocations fastidieuses et inutiles) + Nouvelle_page->Image=Page_a_supprimer->Image; + + // On fait semblant que la dernière page allouée ne l'est pas + Liste_a_raboter->Nb_pages_allouees--; + + // On n'a plus besoin de libérer de la mémoire puisqu'on a refilé à + // Nouvelle_page un bitmap valide + Il_faut_liberer=0; + } + else + { + // Sinon + + // Détruire la dernière page allouée dans la Liste_à_raboter + Detruire_derniere_page_allouee_de_la_liste(Liste_a_raboter); + + // On regarde s'il faut continuer à libérer de la place + Il_faut_liberer=(Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER) + <(Nouvelle_page->Hauteur*Nouvelle_page->Largeur); + + // S'il ne faut pas, c'est qu'on peut allouer un bitmap + // pour la Nouvelle_page + if (!Il_faut_liberer) + Nouvelle_page->Image=(byte *)malloc(Nouvelle_page->Hauteur*Nouvelle_page->Largeur); + } + } + } + + // D'après l'hypothèse de départ, la boucle ci-dessus doit s'arrˆter car + // on a assez de mémoire pour allouer la nouvelle page. + // Désormais Nouvelle_page contient un pointeur sur une zone bitmap valide. + + // Décaler la Liste_courante d'un cran vers le pass‚. + for (Indice=Liste_courante->Taille_liste-1;Indice>0;Indice--) + Copier_S_page(Liste_courante->Pages+Indice,Liste_courante->Pages+Indice-1); + + // Recopier la Nouvelle_page en 1ère position de la Liste_courante + Copier_S_page(Liste_courante->Pages,Nouvelle_page); + Liste_courante->Nb_pages_allouees++; +} + +void Changer_nombre_de_pages_d_une_liste(S_Liste_de_pages * Liste,int Nb) +{ + int Indice; + S_Page * Nouvelles_pages; + + // Si la liste a déjà la taille demandée + if (Liste->Taille_liste==Nb) + // Alors il n'y a rien à faire + return; + + // Si la liste contient plus de pages que souhaité + if (Liste->Taille_liste>Nb) + // Alors pour chaque page en excés + for (Indice=Nb;IndiceTaille_liste;Indice++) + // On libère la page + Liberer_une_page(Liste->Pages+Indice); + + // On fait une nouvelle liste de pages: + Nouvelles_pages=(S_Page *)malloc(Nb*sizeof(S_Page)); + for (Indice=0;IndiceTaille_liste);Indice++) + Copier_S_page(Nouvelles_pages+Indice,Liste->Pages+Indice); + + // On libère l'ancienne liste + free(Liste->Pages); + + // On met à jour les champs de la nouvelle liste + Liste->Pages=Nouvelles_pages; + Liste->Taille_liste=Nb; + if (Liste->Nb_pages_allouees>Nb) + Liste->Nb_pages_allouees=Nb; +} + +void Detruire_la_page_courante_d_une_liste(S_Liste_de_pages * Liste) +{ + // On ne peut pas détruire la page courante de la liste si après + // destruction il ne reste pas encore au moins une page. + if (Liste->Nb_pages_allouees>1) + { + // On fait faire un undo à la liste, comme ‡a, la nouvelle page courante + // est la page précédente + Reculer_dans_une_liste_de_pages(Principal_Backups); + + // Puis on détruit la dernière page, qui est l'ancienne page courante + Detruire_derniere_page_allouee_de_la_liste(Liste); + } +} + + + /// + /// GESTION DES BACKUPS + /// + +int Initialiser_les_listes_de_backups_en_debut_de_programme(int Taille,int Largeur,int Hauteur) +{ + // Taille correspond au nombre de pages que l'on souhaite dans chaque liste + // (1 pour la page courante, puis 1 pour chaque backup, soit 2 au minimum). + // Largeur et Hauteur correspondent à la dimension des images de départ. + + S_Page * Page; + int Retour=0; + + if (Allouer_une_liste_de_pages(Principal_Backups,Taille) && + Allouer_une_liste_de_pages(Brouillon_Backups,Taille)) + { + // On a réussi à allouer deux listes de pages dont la taille correspond à + // celle demandée par l'utilisateur. + + // On crée un descripteur de page correspondant à la page principale + Page=(S_Page *)malloc(sizeof(S_Page)); + Initialiser_S_Page(Page); + Upload_infos_page_principal(Page); + // On y met les infos sur la dimension de démarrage + Page->Largeur=Largeur; + Page->Hauteur=Hauteur; + + // On regarde si on peut ajouter cette page + if (Nouvelle_page_possible(Page,Principal_Backups,Brouillon_Backups)) + { + // On peut, donc on va la créer + Creer_nouvelle_page(Page,Principal_Backups,Brouillon_Backups); + Download_infos_page_principal(Page); + Download_infos_backup(Principal_Backups); + + // Maintenant, on regarde si on a le droit de créer la mˆme page dans + // la page de brouillon. + if (Nouvelle_page_possible(Page,Brouillon_Backups,Principal_Backups)) + { + // On peut donc on le fait + Creer_nouvelle_page(Page,Brouillon_Backups,Principal_Backups); + Download_infos_page_brouillon(Page); + + // Et on efface les 2 images en les remplacant de "0" + memset(Principal_Ecran,0,Principal_Largeur_image*Principal_Hauteur_image); + memset(Brouillon_Ecran,0,Brouillon_Largeur_image*Brouillon_Hauteur_image); + + Retour=1; + } + else + {DEBUG("Il n'est pas possible de démarrer le programme avec la page principale et la page de brouillon aux dimensions demandée par l'utilisateur. ==> On l'envoie ballader",0); + Retour=0; + } + } + else + {DEBUG("On ne peut pas démarrer le programme avec ne serait-ce qu'une page de la dimension souhaitée, donc on laisse tout tomber et on le renvoie chier.",0); + Retour=0; + } + } + else + { + DEBUG("On n'a même pas réussi à créer les listes. Donc c'est même pas la peine de continuer : l'utilisateur ne pourra jamais rien faire, autant avorter le chargement du programme.",0); + Retour=0; + } + + return Retour; +} + +void Detruire_les_listes_de_backups_en_fin_de_programme(void) +{ + // On commence par supprimer les pages une à une dans chacune des listes + // Liste de la page principale + while (Principal_Backups->Nb_pages_allouees>0) + Detruire_derniere_page_allouee_de_la_liste(Principal_Backups); + // Liste de la page de brouillon + while (Brouillon_Backups->Nb_pages_allouees>0) + Detruire_derniere_page_allouee_de_la_liste(Brouillon_Backups); + + // Puis on peut détruire les structures de liste elles-mˆmes + Liberer_une_liste_de_pages(Principal_Backups); + Liberer_une_liste_de_pages(Brouillon_Backups); + free(Principal_Backups); + free(Brouillon_Backups); +} + +void Nouveau_nombre_de_backups(int Nouveau) +{ + Changer_nombre_de_pages_d_une_liste(Principal_Backups,Nouveau+1); + Changer_nombre_de_pages_d_une_liste(Brouillon_Backups,Nouveau+1); + + // Le +1 vient du fait que dans chaque liste, en 1ère position on retrouve + // les infos de la page courante sur le brouillon et la page principale. + // (Nouveau = Nombre de backups, sans compter les pages courantes) +} + +int Backup_avec_nouvelles_dimensions(int Upload,int Largeur,int Hauteur) +{ + // Retourne 1 si une nouvelle page est disponible (alors pleine de 0) et + // 0 sinon. + + S_Page * Nouvelle_page; + int Retour=0; + + if (Upload) + // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les + // retrouver plus tard) + Upload_infos_page_principal(Principal_Backups->Pages); + + // On crée un descripteur pour la nouvelle page courante + Nouvelle_page=(S_Page *)malloc(sizeof(S_Page)); + Initialiser_S_Page(Nouvelle_page); + + Upload_infos_page_principal(Nouvelle_page); + Nouvelle_page->Largeur=Largeur; + Nouvelle_page->Hauteur=Hauteur; + if (Nouvelle_page_possible(Nouvelle_page,Principal_Backups,Brouillon_Backups)) + { + Creer_nouvelle_page(Nouvelle_page,Principal_Backups,Brouillon_Backups); + Download_infos_page_principal(Nouvelle_page); + Download_infos_backup(Principal_Backups); + // On nettoie la nouvelle image: + memset(Principal_Ecran,0,Principal_Largeur_image*Principal_Hauteur_image); + Retour=1; + } + + // On détruit le descripteur de la page courante + free(Nouvelle_page); + + return Retour; +} + +int Backuper_et_redimensionner_brouillon(int Largeur,int Hauteur) +{ + // Retourne 1 si la page de dimension souhaitee est disponible en brouillon + // et 0 sinon. + + S_Page * Nouvelle_page; + int Retour=0; + + // On remet à jour l'‚tat des infos de la page de brouillon (pour pouvoir + // les retrouver plus tard) + Upload_infos_page_brouillon(Brouillon_Backups->Pages); + + // On crée un descripteur pour la nouvelle page de brouillon + Nouvelle_page=(S_Page *)malloc(sizeof(S_Page)); + Initialiser_S_Page(Nouvelle_page); + + Upload_infos_page_brouillon(Nouvelle_page); + Nouvelle_page->Largeur=Largeur; + Nouvelle_page->Hauteur=Hauteur; + if (Nouvelle_page_possible(Nouvelle_page,Brouillon_Backups,Principal_Backups)) + { + Creer_nouvelle_page(Nouvelle_page,Brouillon_Backups,Principal_Backups); + Download_infos_page_brouillon(Nouvelle_page); + Retour=1; + } + + // On détruit le descripteur de la page courante + free(Nouvelle_page); + + return Retour; +} + +void Backup(void) +{ + S_Page * Nouvelle_page; + + // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les + // retrouver plus tard) + Upload_infos_page_principal(Principal_Backups->Pages); + + // On crée un descripteur pour la nouvelle page courante + Nouvelle_page=(S_Page *)malloc(sizeof(S_Page)); + Initialiser_S_Page(Nouvelle_page); + + // Enrichissement de l'historique + Copier_S_page(Nouvelle_page,Principal_Backups->Pages); + Creer_nouvelle_page(Nouvelle_page,Principal_Backups,Brouillon_Backups); + Download_infos_page_principal(Nouvelle_page); + Download_infos_backup(Principal_Backups); + + // On copie l'image du backup vers la page courante: + memcpy(Principal_Ecran,Ecran_backup,Principal_Largeur_image*Principal_Hauteur_image); + + // On détruit le descripteur de la page courante + free(Nouvelle_page); + + // On allume l'indicateur de modification de l'image + Principal_Image_modifiee=1; +} + +void Undo(void) +{ + // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les + // retrouver plus tard) + Upload_infos_page_principal(Principal_Backups->Pages); + // On fait faire un undo à la liste des backups de la page principale + Reculer_dans_une_liste_de_pages(Principal_Backups); + + // On extrait ensuite les infos sur la nouvelle page courante + Download_infos_page_principal(Principal_Backups->Pages); + // Et celles du backup + Download_infos_backup(Principal_Backups); + // Note: le backup n'a pas obligatoirement les mˆmes dimensions ni la mˆme + // palette que la page courante. Mais en temps normal, le backup + // n'est pas utilisé à la suite d'un Undo. Donc ‡a ne devrait pas + // poser de problèmes. +} + +void Redo(void) +{ + // On remet à jour l'‚tat des infos de la page courante (pour pouvoir les + // retrouver plus tard) + Upload_infos_page_principal(Principal_Backups->Pages); + // On fait faire un redo à la liste des backups de la page principale + Avancer_dans_une_liste_de_pages(Principal_Backups); + + // On extrait ensuite les infos sur la nouvelle page courante + Download_infos_page_principal(Principal_Backups->Pages); + // Et celles du backup + Download_infos_backup(Principal_Backups); + // Note: le backup n'a pas obligatoirement les mˆmes dimensions ni la mˆme + // palette que la page courante. Mais en temps normal, le backup + // n'est pas utilisé à la suite d'un Redo. Donc ‡a ne devrait pas + // poser de problèmes. +} + +void Detruire_la_page_courante(void) +{ + // On détruit la page courante de la liste principale + Detruire_la_page_courante_d_une_liste(Principal_Backups); + // On extrait ensuite les infos sur la nouvelle page courante + Download_infos_page_principal(Principal_Backups->Pages); + // Et celles du backup + Download_infos_backup(Principal_Backups); + // Note: le backup n'a pas obligatoirement les mˆmes dimensions ni la mˆme + // palette que la page courante. Mais en temps normal, le backup + // n'est pas utilisé à la suite d'une destruction de page. Donc ‡a ne + // devrait pas poser de problèmes. +} + +void Interchanger_image_principale_et_brouillon(void) +{ + S_Liste_de_pages * Liste_tempo; + + // On commence par mettre à jour dans les descripteurs les infos sur les + // pages qu'on s'apprˆte à échanger, pour qu'on se retrouve pas avec de + // vieilles valeurs qui datent de mathuzalem. + Upload_infos_page_principal(Principal_Backups->Pages); + Upload_infos_page_brouillon(Brouillon_Backups->Pages); + + // On inverse les listes de pages + Liste_tempo=Principal_Backups; + Principal_Backups=Brouillon_Backups; + Brouillon_Backups=Liste_tempo; + + // On extrait ensuite les infos sur les nouvelles pages courante, brouillon + // et backup. + + /* SECTION GROS CACA PROUT PROUT */ + // Auparavant on ruse en mettant déjà à jour les dimensions de la + // nouvelle page courante. Si on ne le fait pas, le "Download" va détecter + // un changement de dimensions et va bˆtement sortir du mode loupe, alors + // que lors d'un changement de page, on veut bien conserver l'‚tat du mode + // loupe du brouillon. + Principal_Largeur_image=Principal_Backups->Pages->Largeur; + Principal_Hauteur_image=Principal_Backups->Pages->Hauteur; + + Download_infos_page_principal(Principal_Backups->Pages); + Download_infos_page_brouillon(Brouillon_Backups->Pages); + Download_infos_backup(Principal_Backups); +} + + +int Emprunt_memoire_de_page_possible(int taille) +{ + int Taille_immediatement_disponible; + int Taille_liste_courante; + int Taille_liste_brouillon; + int Taille_page_courante; + int Taille_page_brouillon; + + Taille_immediatement_disponible=Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER; + Taille_liste_courante =Taille_d_une_liste_de_pages(Principal_Backups); + Taille_liste_brouillon=Taille_d_une_liste_de_pages(Brouillon_Backups); + Taille_page_courante =Taille_d_une_page(Principal_Backups->Pages); + Taille_page_brouillon =Taille_d_une_page(Brouillon_Backups->Pages); + + // Il faut pouvoir loger la zone mémoire ainsi qu'un exemplaire de la page + // courante, en conservant au pire la 1ère page de brouillon. + if ((Taille_immediatement_disponible + +Taille_liste_courante + +Taille_liste_brouillon + -Taille_page_courante + -Taille_page_brouillon)Nb_pages_allouees>1) + // Alors on va détruire la dernière page allouée de la liste des + // brouillons + Liste_a_raboter=Brouillon_Backups; + else + { + if (Principal_Backups->Nb_pages_allouees>1) + { + // Sinon on va détruire la dernière page allouée de la + // liste principale + Liste_a_raboter=Principal_Backups; + } + else + { + // Dans cette branche, il était prévu qu'on obtienne la mémoire + // nécessaire mais on n'arrive pas à la trouver. On indique donc + // qu'elle n'est pas disponible, et on aura perdu des backups + // pour rien + return 0; + } + } + + // Puis on détermine la page que l'on va supprimer (c'est la dernière + // de la liste) + Page_a_supprimer=Liste_a_raboter->Pages+(Liste_a_raboter->Nb_pages_allouees)-1; + + // Détruire la dernière page allouée dans la Liste_à_raboter + Detruire_derniere_page_allouee_de_la_liste(Liste_a_raboter); + + // On regarde s'il faut continuer à libérer de la place + Il_faut_liberer= + (Memoire_libre()-QUANTITE_MINIMALE_DE_MEMOIRE_A_CONSERVER)pixels; } diff --git a/struct.h b/struct.h index 2b360995..75852a77 100644 --- a/struct.h +++ b/struct.h @@ -1,13 +1,14 @@ #ifndef _STRUCT_H_ #define _STRUCT_H_ +#include #include "const.h" // Déclaration des types de base ///////////////////////////////////////////// -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned long dword; +typedef uint8_t byte; +typedef uint16_t word; +typedef uint32_t dword; typedef void (* fonction_action) (void); typedef void (* fonction_afficheur) (word,word,byte);