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
This commit is contained in:
Yves Rizoud 2008-10-12 17:32:46 +00:00
parent e91ef156b1
commit 8a1e44ed30
4 changed files with 115 additions and 87 deletions

View File

@ -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

View File

@ -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<Menu_Ordonnee) &&
( (!Loupe_Mode) || (Mouse_X<Principal_Split) || (Mouse_X>=Principal_X_Zoom) ))
@ -2380,7 +2380,7 @@ void Afficher_curseur(void)
if ( ( (Mouse_Y<Menu_Ordonnee)
&& ( (!Loupe_Mode) || (Mouse_X<Principal_Split) || (Mouse_X>=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<Menu_Ordonnee)
&& ( (!Loupe_Mode) || (Mouse_X<Principal_Split)
|| (Mouse_X>=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;

2
main.c
View File

@ -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();

View File

@ -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<Hauteur*Menu_Facteur_Y; Indice++)
Afficher_ligne(Pos_X,Pos_Y+Indice,Largeur*Menu_Facteur_X,Buffer+((int)Indice*Largeur*Menu_Facteur_Y));
free(Buffer);
}
@ -390,7 +408,7 @@ void Deplacer_Split(void)
// Afficher la barre en XOR
Effacer_curseur();
Une_fenetre_est_ouverte=1;
Fenetre=1;
Forme_curseur=FORME_CURSEUR_HORIZONTAL;
Ligne_verticale_XOR(Principal_Split,0,Menu_Ordonnee);
Ligne_verticale_XOR(Principal_X_Zoom-1,0,Menu_Ordonnee);
@ -430,7 +448,7 @@ void Deplacer_Split(void)
Effacer_curseur();
Ligne_verticale_XOR(Principal_Split,0,Menu_Ordonnee);
Ligne_verticale_XOR(Principal_X_Zoom-1,0,Menu_Ordonnee);
Une_fenetre_est_ouverte=0;
Fenetre=0;
Forme_curseur=Ancienne_forme_curseur;
Calculer_donnees_loupe();
Recadrer_ecran_par_rapport_au_zoom();
@ -980,7 +998,7 @@ void Ouvrir_fenetre(word Largeur,word Hauteur, char * Titre)
Effacer_curseur();
Une_fenetre_est_ouverte=1;
Fenetre++;
Fenetre_Largeur=Largeur;
Fenetre_Hauteur=Hauteur;
@ -990,6 +1008,9 @@ void Ouvrir_fenetre(word Largeur,word Hauteur, char * Titre)
Fenetre_Pos_Y=(Hauteur_ecran-(Hauteur*Menu_Facteur_Y))>>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,17 +1621,12 @@ 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;
if ((Buffer=(byte *) malloc(Largeur*Hauteur)))
{
Effacer_curseur();
for (Indice=0; Indice<Hauteur; Indice++)
Lire_ligne(Nouveau_X,Nouveau_Y+Indice,Largeur,Buffer+((int)Indice*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);
@ -1652,6 +1672,11 @@ void Deplacer_fenetre(short Dx, short Dy)
}
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))
{
@ -1659,34 +1684,37 @@ void Deplacer_fenetre(short Dx, short Dy)
Menu_Ordonnee=Menu_Ordonnee_avant_fenetre;
B=Menu_visible;
Menu_visible=Menu_visible_avant_fenetre;
Afficher_ecran();
Afficher_menu();
//Afficher_ecran();
//Afficher_menu();
Menu_Ordonnee=A;
Menu_visible=B;
for (Indice=0; Indice<Hauteur; Indice++)
Afficher_ligne(Nouveau_X,Nouveau_Y+Indice,Largeur,Buffer+((int)Indice*Largeur));
SDL_UpdateRect(Ecran_SDL,Nouveau_X,Nouveau_Y,Largeur,Hauteur);
// 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;
}
else
{
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_FLECHE;
Afficher_curseur();
free(Buffer);
}
else
{
Erreur(0);
Attendre_fin_de_click();
}
}