Grad Rect cancellation now works :)

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@621 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues 2009-02-09 20:30:14 +00:00
parent de54ecb44a
commit 990e016381
3 changed files with 310 additions and 139 deletions

BIN
gfx2.cfg

Binary file not shown.

1
init.c
View File

@ -1597,6 +1597,7 @@ void Initialisation_des_operations(void)
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,5,Rectangle_Degrade_0_5,1); Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,5,Rectangle_Degrade_0_5,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,7,Rectangle_Degrade_0_7,0); Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,7,Rectangle_Degrade_0_7,0);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,7,Rectangle_Degrade_12_7,1); Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,7,Rectangle_Degrade_12_7,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,2,7,Rectangle_Degrade_12_7,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,9,Rectangle_Degrade_12_9,1); Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,9,Rectangle_Degrade_12_9,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,9,Rectangle_Degrade_0_9,0); Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,9,Rectangle_Degrade_0_9,0);

View File

@ -4258,12 +4258,12 @@ void Rectangle_Degrade_12_0(void)
if (Mouse_K==A_GAUCHE) if (Mouse_K==A_GAUCHE)
{ {
Shade_Table=Shade_Table_gauche; Shade_Table=Shade_Table_gauche;
Operation_PUSH(Fore_color); Operation_PUSH(Mouse_K);
} }
else else
{ {
Shade_Table=Shade_Table_droite; Shade_Table=Shade_Table_droite;
Operation_PUSH(Back_color); Operation_PUSH(Mouse_K);
} }
Operation_PUSH(Pinceau_X); Operation_PUSH(Pinceau_X);
@ -4414,7 +4414,7 @@ void Rectangle_Degrade_0_5(void)
Operation_PUSH(RBX); Operation_PUSH(RBX);
Operation_PUSH(RBY); Operation_PUSH(RBY);
// Forme_curseur = FORME_CURSEUR_CIBLE; // On reste en mode cible XOR pour ne pas effacer l'empreinte du rectangle ... // On ajoute des trucs dans la pile pour forcer le passage à l'étape suivante
Operation_PUSH(RBX); Operation_PUSH(RBX);
Operation_PUSH(RBY); Operation_PUSH(RBY);
} }
@ -4443,9 +4443,106 @@ void Rectangle_Degrade_12_7(void)
// Début du tracé du vecteur (premier clic) // Début du tracé du vecteur (premier clic)
// On garde les anciennes coordonnées dans la pile, et on ajoute les nouvelles par dessus // On garde les anciennes coordonnées dans la pile, et on ajoute les nouvelles par dessus
// Si l'utilisateur utilise le mauvais bouton, on annule le tracé. Mais ça nous oblige à vider toute la pile pour vérifier :(
{ {
short RAX,RBX,RAY,RBY,VAX,VAY,Clic;
Operation_POP(&VAY);
Operation_POP(&VAX);
Operation_POP(&RAY);
Operation_POP(&RAX);
Operation_POP(&RBY);
Operation_POP(&RBX);
Operation_POP(&Clic);
if(Clic==Mouse_K)
{
Operation_PUSH(Clic);
Operation_PUSH(RBX);
Operation_PUSH(RBY);
Operation_PUSH(RAX);
Operation_PUSH(RAY);
Operation_PUSH(VAX);
Operation_PUSH(VAY);
Operation_PUSH(Pinceau_X); Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y); Operation_PUSH(Pinceau_Y);
}
else
{
// Mauvais bouton > anulation de l'opération.
// On a déjà vidé la pile, il reste à effacer le rectangle XOR
short largeur, hauteur;
short decalage_largeur = 0;
short decalage_hauteur = 0;
short decalage_gauche = 0;
short decalage_haut = 0;
largeur = abs(RBX-RAX);
hauteur = abs(RBY-RAY);
if (Max(RAX,RBX)-Principal_Decalage_X > Min(Principal_Largeur_image,Loupe_Mode?Principal_Split:Largeur_ecran)) // Tous les clippings à gérer sont là
decalage_largeur = Max(RAX,RBX) - Min(Principal_Largeur_image,Loupe_Mode?Principal_Split:Largeur_ecran);
if (Max(RAY,RBY)-Principal_Decalage_Y > Min(Principal_Hauteur_image,Menu_Ordonnee))
decalage_hauteur = Max(RAY,RBY) - Min(Principal_Hauteur_image,Menu_Ordonnee);
// Dessin dans la zone de dessin normale
Ligne_horizontale_XOR(Min(RAX,RBX)-Principal_Decalage_X,Min(RAY,RBY)-Principal_Decalage_Y,largeur - decalage_largeur);
if(decalage_hauteur == 0)
Ligne_horizontale_XOR(Min(RAX,RBX)-Principal_Decalage_X,Max(RAY,RBY)-1-Principal_Decalage_Y,largeur - decalage_largeur);
Ligne_verticale_XOR(Min(RAX,RBX)-Principal_Decalage_X,Min(RAY,RBY)-Principal_Decalage_Y,hauteur-decalage_hauteur);
if (decalage_largeur == 0) // Sinon cette ligne est en dehors de la zone image, inutile de la dessiner
Ligne_verticale_XOR(Max(RAX,RBX)-1-Principal_Decalage_X,Min(RAY,RBY)-Principal_Decalage_Y,hauteur-decalage_hauteur);
UpdateRect(Min(RAX,RBX)-Principal_Decalage_X,Min(RAY,RBY)-Principal_Decalage_Y,largeur+1-decalage_largeur,hauteur+1-decalage_hauteur);
// Dessin dans la zone zoomée
if(Loupe_Mode && Min(RAX,RBX)<Limite_visible_Droite_Zoom && Max(RAX,RBX)>Limite_Gauche_Zoom && Min(RAY,RBY)<Limite_visible_Bas_Zoom && Max(RAY,RBY)>Limite_Haut_Zoom )
{
decalage_largeur = 0;
decalage_hauteur=0;
if(Min(RAX,RBX)<Limite_Gauche_Zoom) // On dépasse du zoom à gauche
{
decalage_largeur += Limite_Gauche_Zoom - Min(RAX,RBX);
decalage_gauche = Limite_Gauche_Zoom;
}
if(Max(RAX,RBX)>Limite_visible_Droite_Zoom) // On dépasse du zoom à droite
decalage_largeur += Max(RAX,RBX) - Limite_visible_Droite_Zoom;
if(Min(RAY,RBY)<Limite_Haut_Zoom) // On dépasse du zoom en haut
{
decalage_hauteur += Limite_Haut_Zoom - Min(RAY,RBY);
decalage_haut = Limite_Haut_Zoom;
}
if(Max(RAY,RBY)>Limite_visible_Bas_Zoom) // On dépasse du zoom en bas
decalage_hauteur += Max(RAY,RBY) - Limite_visible_Bas_Zoom;
if(largeur > decalage_largeur)
{
if(decalage_haut==0) // La ligne du haut est visible
Ligne_horizontale_XOR_Zoom(decalage_gauche>0?decalage_gauche:Min(RAX,RBX),Min(RAY,RBY),largeur-decalage_largeur);
if(Max(RAY,RBY)<Limite_visible_Bas_Zoom) // La ligne du bas est visible
Ligne_horizontale_XOR_Zoom(decalage_gauche>0?decalage_gauche:Min(RAX,RBX),Max(RAY,RBY),largeur-decalage_largeur);
}
if(hauteur>decalage_hauteur)
{
if(decalage_gauche==0) // La ligne de gauche est visible
Ligne_verticale_XOR_Zoom(Min(RAX,RBX),decalage_haut>0?decalage_haut:Min(RAY,RBY),hauteur-decalage_hauteur);
if(Max(RAX,RBX)<Limite_visible_Droite_Zoom) // La ligne de droite est visible
Ligne_verticale_XOR_Zoom(Max(RAX,RBX),decalage_haut>0?decalage_haut:Min(RAY,RBY),hauteur-decalage_hauteur);
}
}
}
} }
void Rectangle_Degrade_12_9(void) void Rectangle_Degrade_12_9(void)
@ -4464,11 +4561,11 @@ void Rectangle_Degrade_12_9(void)
Operation_POP(&Fin_Y); Operation_POP(&Fin_Y);
Operation_POP(&Fin_X); Operation_POP(&Fin_X);
Operation_POP(&Debut_Y);
Operation_POP(&Debut_X);
if ((Pinceau_X!=Fin_X) || (Pinceau_Y!=Fin_Y)) if ((Pinceau_X!=Fin_X) || (Pinceau_Y!=Fin_Y))
{ {
Operation_POP(&Debut_Y);
Operation_POP(&Debut_X);
// On corrige les coordonnées de la ligne si la touche shift est appuyée... // On corrige les coordonnées de la ligne si la touche shift est appuyée...
if(SDL_GetModState() & KMOD_SHIFT) if(SDL_GetModState() & KMOD_SHIFT)
Rectifier_coordonnees_a_45_degres(Debut_X,Debut_Y,&Pinceau_X,&Pinceau_Y); Rectifier_coordonnees_a_45_degres(Debut_X,Debut_Y,&Pinceau_X,&Pinceau_Y);
@ -4478,19 +4575,19 @@ void Rectangle_Degrade_12_9(void)
Tracer_ligne_Preview_xor(Debut_X,Debut_Y,Fin_X,Fin_Y,0); Tracer_ligne_Preview_xor(Debut_X,Debut_Y,Fin_X,Fin_Y,0);
Tracer_ligne_Preview_xor(Debut_X,Debut_Y,Pinceau_X,Pinceau_Y,0); Tracer_ligne_Preview_xor(Debut_X,Debut_Y,Pinceau_X,Pinceau_Y,0);
Operation_PUSH(Debut_X);
Operation_PUSH(Debut_Y);
} }
Operation_PUSH(Debut_X);
Operation_PUSH(Debut_Y);
Operation_PUSH(Pinceau_X); Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y); Operation_PUSH(Pinceau_Y);
} }
void Rectangle_Degrade_0_9(void) void Rectangle_Degrade_0_9(void)
// Opération : OPERATION_RECTANGLE_DEGRADE // Opération : OPERATION_RECTANGLE_DEGRADE
// Click Souris: 1 ou 2 // Click Souris: 0
// Taille_Pile : 0 // Taille_Pile : 9
// //
// Souris effacée: Oui // Souris effacée: Oui
@ -4521,7 +4618,80 @@ void Rectangle_Degrade_0_9(void)
Effacer_ligne_Preview(Vecteur_Debut_X,Vecteur_Debut_Y,Vecteur_Fin_X,Vecteur_Fin_Y); Effacer_ligne_Preview(Vecteur_Debut_X,Vecteur_Debut_Y,Vecteur_Fin_X,Vecteur_Fin_Y);
// Et enfin on trace le rectangle avec le dégradé dedans ! // Et enfin on trace le rectangle avec le dégradé dedans !
// if (Mouse_K==Ancien_Mouse_K) // TODO sauver l'ancien mouse K à la place de la couleur dans l'étape 1. Modifier aussi les autres étapes pour pouvoir annuler à tout moment. if (Vecteur_Fin_X==Vecteur_Debut_X && Vecteur_Fin_Y==Vecteur_Debut_Y)
{
// Vecteur nul > pas de rectangle tracé
// Du coup on doit effacer la preview xor ...
short largeur, hauteur;
short decalage_largeur = 0;
short decalage_hauteur = 0;
short decalage_gauche = 0;
short decalage_haut = 0;
largeur = abs(Rect_Fin_X-Rect_Debut_X);
hauteur = abs(Rect_Fin_Y-Rect_Debut_Y);
if (Max(Rect_Debut_X,Rect_Fin_X)-Principal_Decalage_X > Min(Principal_Largeur_image,Loupe_Mode?Principal_Split:Largeur_ecran)) // Tous les clippings à gérer sont là
decalage_largeur = Max(Rect_Debut_X,Rect_Fin_X) - Min(Principal_Largeur_image,Loupe_Mode?Principal_Split:Largeur_ecran);
if (Max(Rect_Debut_Y,Rect_Fin_Y)-Principal_Decalage_Y > Min(Principal_Hauteur_image,Menu_Ordonnee))
decalage_hauteur = Max(Rect_Debut_Y,Rect_Fin_Y) - Min(Principal_Hauteur_image,Menu_Ordonnee);
// Dessin dans la zone de dessin normale
Ligne_horizontale_XOR(Min(Rect_Debut_X,Rect_Fin_X)-Principal_Decalage_X,Min(Rect_Debut_Y,Rect_Fin_Y)-Principal_Decalage_Y,largeur - decalage_largeur);
if(decalage_hauteur == 0)
Ligne_horizontale_XOR(Min(Rect_Debut_X,Rect_Fin_X)-Principal_Decalage_X,Max(Rect_Debut_Y,Rect_Fin_Y)-1-Principal_Decalage_Y,largeur - decalage_largeur);
Ligne_verticale_XOR(Min(Rect_Debut_X,Rect_Fin_X)-Principal_Decalage_X,Min(Rect_Debut_Y,Rect_Fin_Y)-Principal_Decalage_Y,hauteur-decalage_hauteur);
if (decalage_largeur == 0) // Sinon cette ligne est en dehors de la zone image, inutile de la dessiner
Ligne_verticale_XOR(Max(Rect_Debut_X,Rect_Fin_X)-1-Principal_Decalage_X,Min(Rect_Debut_Y,Rect_Fin_Y)-Principal_Decalage_Y,hauteur-decalage_hauteur);
UpdateRect(Min(Rect_Debut_X,Rect_Fin_X)-Principal_Decalage_X,Min(Rect_Debut_Y,Rect_Fin_Y)-Principal_Decalage_Y,largeur+1-decalage_largeur,hauteur+1-decalage_hauteur);
// Dessin dans la zone zoomée
if(Loupe_Mode && Min(Rect_Debut_X,Rect_Fin_X)<Limite_visible_Droite_Zoom && Max(Rect_Debut_X,Rect_Fin_X)>Limite_Gauche_Zoom && Min(Rect_Debut_Y,Rect_Fin_Y)<Limite_visible_Bas_Zoom && Max(Rect_Debut_Y,Rect_Fin_Y)>Limite_Haut_Zoom )
{
decalage_largeur = 0;
decalage_hauteur=0;
if(Min(Rect_Debut_X,Rect_Fin_X)<Limite_Gauche_Zoom) // On dépasse du zoom à gauche
{
decalage_largeur += Limite_Gauche_Zoom - Min(Rect_Debut_X,Rect_Fin_X);
decalage_gauche = Limite_Gauche_Zoom;
}
if(Max(Rect_Debut_X,Rect_Fin_X)>Limite_visible_Droite_Zoom) // On dépasse du zoom à droite
decalage_largeur += Max(Rect_Debut_X,Rect_Fin_X) - Limite_visible_Droite_Zoom;
if(Min(Rect_Debut_Y,Rect_Fin_Y)<Limite_Haut_Zoom) // On dépasse du zoom en haut
{
decalage_hauteur += Limite_Haut_Zoom - Min(Rect_Debut_Y,Rect_Fin_Y);
decalage_haut = Limite_Haut_Zoom;
}
if(Max(Rect_Debut_Y,Rect_Fin_Y)>Limite_visible_Bas_Zoom) // On dépasse du zoom en bas
decalage_hauteur += Max(Rect_Debut_Y,Rect_Fin_Y) - Limite_visible_Bas_Zoom;
if(largeur > decalage_largeur)
{
if(decalage_haut==0) // La ligne du haut est visible
Ligne_horizontale_XOR_Zoom(decalage_gauche>0?decalage_gauche:Min(Rect_Debut_X,Rect_Fin_X),Min(Rect_Debut_Y,Rect_Fin_Y),largeur-decalage_largeur);
if(Max(Rect_Debut_Y,Rect_Fin_Y)<Limite_visible_Bas_Zoom) // La ligne du bas est visible
Ligne_horizontale_XOR_Zoom(decalage_gauche>0?decalage_gauche:Min(Rect_Debut_X,Rect_Fin_X),Max(Rect_Debut_Y,Rect_Fin_Y),largeur-decalage_largeur);
}
if(hauteur>decalage_hauteur)
{
if(decalage_gauche==0) // La ligne de gauche est visible
Ligne_verticale_XOR_Zoom(Min(Rect_Debut_X,Rect_Fin_X),decalage_haut>0?decalage_haut:Min(Rect_Debut_Y,Rect_Fin_Y),hauteur-decalage_hauteur);
if(Max(Rect_Debut_X,Rect_Fin_X)<Limite_visible_Droite_Zoom) // La ligne de droite est visible
Ligne_verticale_XOR_Zoom(Max(Rect_Debut_X,Rect_Fin_X),decalage_haut>0?decalage_haut:Min(Rect_Debut_Y,Rect_Fin_Y),hauteur-decalage_hauteur);
}
}
}
else
Tracer_rectangle_degrade(Rect_Debut_X,Rect_Debut_Y,Rect_Fin_X,Rect_Fin_Y,Vecteur_Debut_X,Vecteur_Debut_Y,Vecteur_Fin_X,Vecteur_Fin_Y); Tracer_rectangle_degrade(Rect_Debut_X,Rect_Debut_Y,Rect_Fin_X,Rect_Fin_Y,Vecteur_Debut_X,Vecteur_Debut_Y,Vecteur_Fin_X,Vecteur_Fin_Y);
Afficher_curseur(); Afficher_curseur();