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 // 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_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 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 // Affichage des couleurs de travail
Afficher_foreback(); Afficher_foreback();
if (!Une_fenetre_est_ouverte) if (!Fenetre)
{ {
if ((Mouse_Y<Menu_Ordonnee) && if ((Mouse_Y<Menu_Ordonnee) &&
( (!Loupe_Mode) || (Mouse_X<Principal_Split) || (Mouse_X>=Principal_X_Zoom) )) ( (!Loupe_Mode) || (Mouse_X<Principal_Split) || (Mouse_X>=Principal_X_Zoom) ))
@ -2380,7 +2380,7 @@ void Afficher_curseur(void)
if ( ( (Mouse_Y<Menu_Ordonnee) if ( ( (Mouse_Y<Menu_Ordonnee)
&& ( (!Loupe_Mode) || (Mouse_X<Principal_Split) || (Mouse_X>=Principal_X_Zoom) ) ) && ( (!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; Forme=Forme_curseur;
else else
Forme=FORME_CURSEUR_FLECHE; Forme=FORME_CURSEUR_FLECHE;
@ -2678,7 +2678,7 @@ void Effacer_curseur(void)
if ( ( (Mouse_Y<Menu_Ordonnee) if ( ( (Mouse_Y<Menu_Ordonnee)
&& ( (!Loupe_Mode) || (Mouse_X<Principal_Split) && ( (!Loupe_Mode) || (Mouse_X<Principal_Split)
|| (Mouse_X>=Principal_X_Zoom) ) ) || (Mouse_X>=Principal_X_Zoom) ) )
|| (Une_fenetre_est_ouverte) || (Forme_curseur==FORME_CURSEUR_SABLIER) ) || (Fenetre) || (Forme_curseur==FORME_CURSEUR_SABLIER) )
Forme=Forme_curseur; Forme=Forme_curseur;
else else
Forme=FORME_CURSEUR_FLECHE; 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 opérations
Initialisation_des_operations(); Initialisation_des_operations();
Une_fenetre_est_ouverte=0; Fenetre=0;
// Charger les sprites et la palette // Charger les sprites et la palette
Charger_DAT(); Charger_DAT();

192
moteur.c
View File

@ -50,6 +50,8 @@ byte Smooth_Mode_avant_annulation;
byte Tiling_Mode_avant_annulation; byte Tiling_Mode_avant_annulation;
fonction_effet Fonction_effet_avant_annulation; fonction_effet Fonction_effet_avant_annulation;
byte * Fond_fenetre[8];
void Annuler_les_effets(void) void Annuler_les_effets(void)
{ {
Shade_Mode_avant_annulation=Shade_Mode; Shade_Mode_avant_annulation=Shade_Mode;
@ -133,6 +135,22 @@ char * TITRE_BOUTON[NB_BOUTONS]=
"Color #" , "Color #" ,
"Hide tool bar " "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 // Afficher la barre en XOR
Effacer_curseur(); Effacer_curseur();
Une_fenetre_est_ouverte=1; Fenetre=1;
Forme_curseur=FORME_CURSEUR_HORIZONTAL; Forme_curseur=FORME_CURSEUR_HORIZONTAL;
Ligne_verticale_XOR(Principal_Split,0,Menu_Ordonnee); Ligne_verticale_XOR(Principal_Split,0,Menu_Ordonnee);
Ligne_verticale_XOR(Principal_X_Zoom-1,0,Menu_Ordonnee); Ligne_verticale_XOR(Principal_X_Zoom-1,0,Menu_Ordonnee);
@ -430,7 +448,7 @@ void Deplacer_Split(void)
Effacer_curseur(); Effacer_curseur();
Ligne_verticale_XOR(Principal_Split,0,Menu_Ordonnee); Ligne_verticale_XOR(Principal_Split,0,Menu_Ordonnee);
Ligne_verticale_XOR(Principal_X_Zoom-1,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; Forme_curseur=Ancienne_forme_curseur;
Calculer_donnees_loupe(); Calculer_donnees_loupe();
Recadrer_ecran_par_rapport_au_zoom(); Recadrer_ecran_par_rapport_au_zoom();
@ -980,7 +998,7 @@ void Ouvrir_fenetre(word Largeur,word Hauteur, char * Titre)
Effacer_curseur(); Effacer_curseur();
Une_fenetre_est_ouverte=1; Fenetre++;
Fenetre_Largeur=Largeur; Fenetre_Largeur=Largeur;
Fenetre_Hauteur=Hauteur; 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; 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 // 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); 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; Fenetre_Liste_boutons_special=Temp4;
} }
Une_fenetre_est_ouverte=0; Fenetre--;
Curseur_dans_menu_precedent=0; // il faut rafficher le libellé dans la barre Curseur_dans_menu_precedent=0; // il faut rafficher le libellé dans la barre
// d'outils si le curseur est sur une icône. // d'outils si le curseur est sur une icône.
@ -1075,8 +1096,12 @@ void Fermer_fenetre(void)
Menu_visible=Menu_visible_avant_fenetre; Menu_visible=Menu_visible_avant_fenetre;
Forme_curseur=Forme_curseur_avant_fenetre; Forme_curseur=Forme_curseur_avant_fenetre;
Afficher_ecran(); // Restore de ce que la fenêtre cachait
Afficher_menu(); 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; Touche=0;
Mouse_K=0; Mouse_K=0;
@ -1596,97 +1621,100 @@ void Deplacer_fenetre(short Dx, short Dy)
short Ancien_Y; short Ancien_Y;
short Largeur=Fenetre_Largeur*Menu_Facteur_X; short Largeur=Fenetre_Largeur*Menu_Facteur_X;
short Hauteur=Fenetre_Hauteur*Menu_Facteur_Y; short Hauteur=Fenetre_Hauteur*Menu_Facteur_Y;
short Indice;
short A; short A;
byte B; 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(); Ancien_X=Nouveau_X;
for (Indice=0; Indice<Hauteur; Indice++) Ancien_Y=Nouveau_Y;
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);
Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y+Hauteur-1,Largeur);
Forme_curseur=FORME_CURSEUR_MULTIDIRECTIONNEL;
Afficher_curseur();
while (Mouse_K) Get_input();
{
Ancien_X=Nouveau_X; Nouveau_X=Mouse_X-Dx;
Ancien_Y=Nouveau_Y; if (Nouveau_X<0)
Nouveau_X=0;
Get_input(); if (Nouveau_X>Largeur_ecran-Largeur)
Nouveau_X=Largeur_ecran-Largeur;
Nouveau_X=Mouse_X-Dx;
if (Nouveau_X<0) Nouveau_Y=Mouse_Y-Dy;
Nouveau_X=0; if (Nouveau_Y<0)
if (Nouveau_X>Largeur_ecran-Largeur) Nouveau_Y=0;
Nouveau_X=Largeur_ecran-Largeur; if (Nouveau_Y>Hauteur_ecran-Hauteur)
Nouveau_Y=Hauteur_ecran-Hauteur;
Nouveau_Y=Mouse_Y-Dy;
if (Nouveau_Y<0) if ((Nouveau_X!=Ancien_X)
Nouveau_Y=0; || (Nouveau_Y!=Ancien_Y))
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; 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);
Fenetre_Pos_X=Nouveau_X;
Fenetre_Pos_Y=Nouveau_Y;
}
else
{ {
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_horizontale_XOR(Nouveau_X,Nouveau_Y,Largeur);
Ligne_verticale_XOR(Nouveau_X,Nouveau_Y+1,Hauteur-2); Ligne_verticale_XOR(Nouveau_X,Nouveau_Y+1,Hauteur-2);
Ligne_verticale_XOR(Nouveau_X+Largeur-1,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); Ligne_horizontale_XOR(Nouveau_X,Nouveau_Y+Hauteur-1,Largeur);
Afficher_curseur();
} }
Forme_curseur=FORME_CURSEUR_FLECHE; SDL_UpdateRect(Ecran_SDL,Ancien_X,Ancien_Y,Largeur,Hauteur);
Afficher_curseur(); SDL_UpdateRect(Ecran_SDL,Nouveau_X,Nouveau_Y,Largeur,Hauteur);
free(Buffer);
} }
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); A=Menu_Ordonnee;
Attendre_fin_de_click(); 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();
} }