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:
parent
e91ef156b1
commit
8a1e44ed30
2
global.h
2
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
|
||||
|
||||
6
graph.c
6
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<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
2
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();
|
||||
|
||||
94
moteur.c
94
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<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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user