From 8a1e44ed304aa07bcd007e7d121b10ceab02b6f2 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sun, 12 Oct 2008 17:32:46 +0000 Subject: [PATCH] Windows restore their background. Fixes/speeds-up some refreshes, and prepares for pop-up windows git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@237 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- global.h | 2 +- graph.c | 6 +- main.c | 2 +- moteur.c | 192 +++++++++++++++++++++++++++++++------------------------ 4 files changed, 115 insertions(+), 87 deletions(-) diff --git a/global.h b/global.h index 2b295552..d7b0129f 100644 --- a/global.h +++ b/global.h @@ -327,7 +327,7 @@ GLOBAL word Menu_Taille_couleur; // Taille d'une couleur de la palette du menu // Données sur la fenêtre de menu -GLOBAL byte Une_fenetre_est_ouverte; +GLOBAL byte Fenetre; GLOBAL word Fenetre_Pos_X; // Position du bord gauche de la fenêtre dans l'écran GLOBAL word Fenetre_Pos_Y; // Position du bord haut de la fenêtre dans l'écran diff --git a/graph.c b/graph.c index 8671c0ea..64dc2631 100644 --- a/graph.c +++ b/graph.c @@ -1373,7 +1373,7 @@ void Afficher_menu(void) // Affichage des couleurs de travail Afficher_foreback(); - if (!Une_fenetre_est_ouverte) + if (!Fenetre) { if ((Mouse_Y=Principal_X_Zoom) )) @@ -2380,7 +2380,7 @@ void Afficher_curseur(void) if ( ( (Mouse_Y=Principal_X_Zoom) ) ) - || (Une_fenetre_est_ouverte) || (Forme_curseur==FORME_CURSEUR_SABLIER) ) + || (Fenetre) || (Forme_curseur==FORME_CURSEUR_SABLIER) ) Forme=Forme_curseur; else Forme=FORME_CURSEUR_FLECHE; @@ -2678,7 +2678,7 @@ void Effacer_curseur(void) if ( ( (Mouse_Y=Principal_X_Zoom) ) ) - || (Une_fenetre_est_ouverte) || (Forme_curseur==FORME_CURSEUR_SABLIER) ) + || (Fenetre) || (Forme_curseur==FORME_CURSEUR_SABLIER) ) Forme=Forme_curseur; else Forme=FORME_CURSEUR_FLECHE; diff --git a/main.c b/main.c index e6f20f85..2fceed4d 100644 --- a/main.c +++ b/main.c @@ -419,7 +419,7 @@ void Initialisation_du_programme(int argc,char * argv[]) // Initialisation des opérations Initialisation_des_operations(); - Une_fenetre_est_ouverte=0; + Fenetre=0; // Charger les sprites et la palette Charger_DAT(); diff --git a/moteur.c b/moteur.c index d92b0988..34ccb007 100644 --- a/moteur.c +++ b/moteur.c @@ -50,6 +50,8 @@ byte Smooth_Mode_avant_annulation; byte Tiling_Mode_avant_annulation; fonction_effet Fonction_effet_avant_annulation; +byte * Fond_fenetre[8]; + void Annuler_les_effets(void) { Shade_Mode_avant_annulation=Shade_Mode; @@ -133,6 +135,22 @@ char * TITRE_BOUTON[NB_BOUTONS]= "Color #" , "Hide tool bar " }; +// Sauvegarde un bloc (généralement l'arrière-plan d'une fenêtre) +void Sauve_fond(byte **Buffer, int Pos_X, int Pos_Y, int Largeur, int Hauteur) +{ + int Indice; + *Buffer=(byte *) malloc(Largeur*Menu_Facteur_X*Hauteur*Menu_Facteur_Y); + for (Indice=0; Indice<(Hauteur*Menu_Facteur_Y); Indice++) + Lire_ligne(Pos_X,Pos_Y+Indice,Largeur*Menu_Facteur_X,(*Buffer)+((int)Indice*Largeur*Menu_Facteur_X)); +} +// Restaure de ce que la fenêtre cachait +void Restaure_fond(byte *Buffer, int Pos_X, int Pos_Y, int Largeur, int Hauteur) +{ + int Indice; + for (Indice=0; Indice>1; + // Sauvegarde de ce que la fenêtre remplace + Sauve_fond(&(Fond_fenetre[Fenetre-1]), Fenetre_Pos_X, Fenetre_Pos_Y, Largeur, Hauteur); + // Fenêtre grise Block(Fenetre_Pos_X+(Menu_Facteur_X<<1),Fenetre_Pos_Y+(Menu_Facteur_Y<<1),(Largeur-4)*Menu_Facteur_X,(Hauteur-4)*Menu_Facteur_Y,CM_Clair); @@ -1065,7 +1086,7 @@ void Fermer_fenetre(void) Fenetre_Liste_boutons_special=Temp4; } - Une_fenetre_est_ouverte=0; + Fenetre--; Curseur_dans_menu_precedent=0; // il faut rafficher le libellé dans la barre // d'outils si le curseur est sur une icône. @@ -1075,8 +1096,12 @@ void Fermer_fenetre(void) Menu_visible=Menu_visible_avant_fenetre; Forme_curseur=Forme_curseur_avant_fenetre; - Afficher_ecran(); - Afficher_menu(); + // Restore de ce que la fenêtre cachait + Restaure_fond(Fond_fenetre[Fenetre], Fenetre_Pos_X, Fenetre_Pos_Y, Fenetre_Largeur, Fenetre_Hauteur); + SDL_UpdateRect(Ecran_SDL,Fenetre_Pos_X,Fenetre_Pos_Y,Fenetre_Largeur*Menu_Facteur_X,Fenetre_Hauteur*Menu_Facteur_Y); + + //Afficher_ecran(); + //Afficher_menu(); Touche=0; Mouse_K=0; @@ -1596,97 +1621,100 @@ void Deplacer_fenetre(short Dx, short Dy) short Ancien_Y; short Largeur=Fenetre_Largeur*Menu_Facteur_X; short Hauteur=Fenetre_Hauteur*Menu_Facteur_Y; - short Indice; short A; byte B; - byte * Buffer; + byte *Buffer=NULL; + Effacer_curseur(); - if ((Buffer=(byte *) malloc(Largeur*Hauteur))) + Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y,Largeur); + Ligne_verticale_XOR(Nouveau_X,Nouveau_Y+1,Hauteur-2); + Ligne_verticale_XOR(Nouveau_X+Largeur-1,Nouveau_Y+1,Hauteur-2); + Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y+Hauteur-1,Largeur); + Forme_curseur=FORME_CURSEUR_MULTIDIRECTIONNEL; + Afficher_curseur(); + + while (Mouse_K) { - Effacer_curseur(); - for (Indice=0; IndiceLargeur_ecran-Largeur) - Nouveau_X=Largeur_ecran-Largeur; - - Nouveau_Y=Mouse_Y-Dy; - if (Nouveau_Y<0) - Nouveau_Y=0; - if (Nouveau_Y>Hauteur_ecran-Hauteur) - Nouveau_Y=Hauteur_ecran-Hauteur; - - if ((Nouveau_X!=Ancien_X) - || (Nouveau_Y!=Ancien_Y)) - { - Effacer_curseur(); - Ligne_horizontale_XOR(Ancien_X,Ancien_Y,Largeur); - Ligne_verticale_XOR(Ancien_X,Ancien_Y+1,Hauteur-2); - Ligne_verticale_XOR(Ancien_X+Largeur-1,Ancien_Y+1,Hauteur-2); - Ligne_horizontale_XOR(Ancien_X,Ancien_Y+Hauteur-1,Largeur); - Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y,Largeur); - Ligne_verticale_XOR(Nouveau_X,Nouveau_Y+1,Hauteur-2); - Ligne_verticale_XOR(Nouveau_X+Largeur-1,Nouveau_Y+1,Hauteur-2); - Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y+Hauteur-1,Largeur); - Afficher_curseur(); - } - SDL_UpdateRect(Ecran_SDL,Ancien_X,Ancien_Y,Largeur,Hauteur); - SDL_UpdateRect(Ecran_SDL,Nouveau_X,Nouveau_Y,Largeur,Hauteur); - } - - Effacer_curseur(); - if ((Nouveau_X!=Fenetre_Pos_X) - || (Nouveau_Y!=Fenetre_Pos_Y)) - { - A=Menu_Ordonnee; - Menu_Ordonnee=Menu_Ordonnee_avant_fenetre; - B=Menu_visible; - Menu_visible=Menu_visible_avant_fenetre; - Afficher_ecran(); - Afficher_menu(); - Menu_Ordonnee=A; - Menu_visible=B; - for (Indice=0; IndiceLargeur_ecran-Largeur) + Nouveau_X=Largeur_ecran-Largeur; + + Nouveau_Y=Mouse_Y-Dy; + if (Nouveau_Y<0) + Nouveau_Y=0; + if (Nouveau_Y>Hauteur_ecran-Hauteur) + Nouveau_Y=Hauteur_ecran-Hauteur; + + if ((Nouveau_X!=Ancien_X) + || (Nouveau_Y!=Ancien_Y)) { + Effacer_curseur(); + Ligne_horizontale_XOR(Ancien_X,Ancien_Y,Largeur); + Ligne_verticale_XOR(Ancien_X,Ancien_Y+1,Hauteur-2); + Ligne_verticale_XOR(Ancien_X+Largeur-1,Ancien_Y+1,Hauteur-2); + Ligne_horizontale_XOR(Ancien_X,Ancien_Y+Hauteur-1,Largeur); Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y,Largeur); Ligne_verticale_XOR(Nouveau_X,Nouveau_Y+1,Hauteur-2); Ligne_verticale_XOR(Nouveau_X+Largeur-1,Nouveau_Y+1,Hauteur-2); Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y+Hauteur-1,Largeur); + Afficher_curseur(); } - Forme_curseur=FORME_CURSEUR_FLECHE; - Afficher_curseur(); - - free(Buffer); - + SDL_UpdateRect(Ecran_SDL,Ancien_X,Ancien_Y,Largeur,Hauteur); + SDL_UpdateRect(Ecran_SDL,Nouveau_X,Nouveau_Y,Largeur,Hauteur); } - else + + Effacer_curseur(); + Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y,Largeur); + Ligne_verticale_XOR(Nouveau_X,Nouveau_Y+1,Hauteur-2); + Ligne_verticale_XOR(Nouveau_X+Largeur-1,Nouveau_Y+1,Hauteur-2); + Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y+Hauteur-1,Largeur); + + if ((Nouveau_X!=Fenetre_Pos_X) + || (Nouveau_Y!=Fenetre_Pos_Y)) { - Erreur(0); - Attendre_fin_de_click(); + A=Menu_Ordonnee; + Menu_Ordonnee=Menu_Ordonnee_avant_fenetre; + B=Menu_visible; + Menu_visible=Menu_visible_avant_fenetre; + //Afficher_ecran(); + //Afficher_menu(); + Menu_Ordonnee=A; + Menu_visible=B; + + // Sauvegarde du contenu actuel de la fenêtre + Sauve_fond(&Buffer, Fenetre_Pos_X, Fenetre_Pos_Y, Fenetre_Largeur, Fenetre_Hauteur); + + // Restore de ce que la fenêtre cachait + Restaure_fond(Fond_fenetre[Fenetre-1], Fenetre_Pos_X, Fenetre_Pos_Y, Fenetre_Largeur, Fenetre_Hauteur); + + // Sauvegarde de ce que la fenêtre remplace + Sauve_fond(&(Fond_fenetre[Fenetre-1]), Nouveau_X, Nouveau_Y, Fenetre_Largeur, Fenetre_Hauteur); + + // Raffichage de la fenêtre + Restaure_fond(Buffer, Nouveau_X, Nouveau_Y, Fenetre_Largeur, Fenetre_Hauteur); + + // Mise à jour du rectangle englobant + SDL_UpdateRect(Ecran_SDL, + (Nouveau_X>Fenetre_Pos_X)?Fenetre_Pos_X:Nouveau_X, + (Nouveau_Y>Fenetre_Pos_Y)?Fenetre_Pos_Y:Nouveau_Y, + ((Nouveau_X>Fenetre_Pos_X)?(Nouveau_X-Fenetre_Pos_X):(Fenetre_Pos_X-Nouveau_X)) + Fenetre_Largeur*Menu_Facteur_X, + ((Nouveau_Y>Fenetre_Pos_Y)?(Nouveau_Y-Fenetre_Pos_Y):(Fenetre_Pos_Y-Nouveau_Y)) + Fenetre_Hauteur*Menu_Facteur_Y); + + Fenetre_Pos_X=Nouveau_X; + Fenetre_Pos_Y=Nouveau_Y; + } + Forme_curseur=FORME_CURSEUR_FLECHE; + Afficher_curseur(); + }