diff --git a/gfx2.cfg b/gfx2.cfg index 817c6196..8bcb0dc5 100644 Binary files a/gfx2.cfg and b/gfx2.cfg differ diff --git a/graph.c b/graph.c index 6755c697..2a421a51 100644 --- a/graph.c +++ b/graph.c @@ -5246,6 +5246,16 @@ void Tracer_rectangle_degrade(short RAX,short RAY,short RBX,short RBY,short VAX, RAY = Pos_Y; } + // Correction des bornes d'après les limites + if (RAYLimite_Bas) + RBY=Limite_Bas; + if (RAXLimite_Droite) + RBX=Limite_Droite; + if(VBX == VAX) { // Le vecteur est vertical, donc on évite la partie en dessous qui foirerait avec une division par 0... diff --git a/operatio.c b/operatio.c index a50cb6ca..f9bab000 100644 --- a/operatio.c +++ b/operatio.c @@ -4236,10 +4236,15 @@ void Rectangle_Degrade_0_5(void) // on doit donc attendre que l'utilisateur clique quelque part // On stocke tout de suite les coordonnées du pinceau comme ça on change d'état et on passe à la suite { + // !!! Cette fonction remet RAX RAY RBX RBY dans la pile à la fin donc il ne faut pas les modifier ! (sauf éventuellement un tri) short RAX; short RAY; short RBX; short RBY, largeur,hauteur; + short decalage_largeur = 0; + short decalage_hauteur = 0; + short decalage_gauche = 0; + short decalage_haut = 0; // Tracé propre du rectangle @@ -4254,11 +4259,53 @@ void Rectangle_Degrade_0_5(void) largeur = abs(RBX-RAX); hauteur = abs(RBY-RAY); - Ligne_horizontale_XOR(Min(RAX,RBX),Min(RAY,RBY),largeur); // FIXME: ceci ne gère pas le zoom - Ligne_horizontale_XOR(Min(RAX,RBX),Max(RAY,RBY)-1,largeur); // ni si l'offset est !=0 - Ligne_verticale_XOR(Min(RAX,RBX),Min(RAY,RBY),hauteur); - Ligne_verticale_XOR(Max(RAX,RBX)-1,Min(RAY,RBY),hauteur); - UpdateRect(Min(RAX,RBX),Min(RAY,RBY),largeur+1,hauteur+1); + + 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 > Menu_Ordonnee) + decalage_hauteur = Max(RAY,RBY) - 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_largeur); + + // Dessin dans la zone zoomée + if(Loupe_Mode) + { + decalage_largeur = 0; + if(Min(RAX,RBX)Limite_visible_Droite_Zoom) + decalage_largeur += Max(RAX,RAY) - Limite_visible_Droite_Zoom; + + decalage_hauteur=0; + if(Min(RAY,RBY)Limite_visible_Bas_Zoom) + decalage_hauteur += Max(RAX,RAY) + Limite_visible_Bas_Zoom; + + if(decalage_haut==0) + Ligne_horizontale_XOR_Zoom(decalage_gauche>0?decalage_gauche:Min(RAX,RBX),Min(RAY,RBY),largeur-decalage_largeur); + if(Max(RAY,RBY)0?decalage_gauche:Min(RAX,RBX),Max(RAY,RBY),largeur-decalage_largeur); + if(decalage_gauche==0) + Ligne_verticale_XOR_Zoom(Min(RAX,RBX),decalage_haut>0?decalage_haut:Min(RAY,RBY),hauteur-decalage_hauteur); + if(Max(RAX,RBX)0?decalage_haut:Min(RAY,RBY),hauteur-decalage_hauteur); + } Operation_PUSH(RAX); Operation_PUSH(RAY);