Fix issue 339 (Grad Rectangle can leave construction lines on image)
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1451 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
048f197636
commit
ff2c44eaf9
426
src/operatio.c
426
src/operatio.c
@ -3371,6 +3371,121 @@ void Grad_rectangle_12_5(void)
|
|||||||
Operation_push(Paintbrush_Y);
|
Operation_push(Paintbrush_Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start and End coordinates must be sorted
|
||||||
|
void Draw_xor_rect(short start_x, short start_y, short end_x, short end_y)
|
||||||
|
{
|
||||||
|
short offset_width = 0;
|
||||||
|
short offset_height = 0;
|
||||||
|
short offset_left = 0;
|
||||||
|
short offset_top = 0;
|
||||||
|
short width = end_x-start_x;
|
||||||
|
short height = end_y-start_y;
|
||||||
|
|
||||||
|
// Handle clipping
|
||||||
|
if (end_x-Main_offset_X > Min(Main_image_width,
|
||||||
|
Main_magnifier_mode?Main_separator_position:Screen_width))
|
||||||
|
{
|
||||||
|
offset_width = end_x - Min(Main_image_width,
|
||||||
|
Main_magnifier_mode?Main_separator_position:Screen_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end_y-Main_offset_Y > Min(Main_image_height, Menu_Y))
|
||||||
|
offset_height = end_y - Min(Main_image_height, Menu_Y);
|
||||||
|
|
||||||
|
if (width == 0)
|
||||||
|
{
|
||||||
|
// Single line
|
||||||
|
Vertical_XOR_line(start_x-Main_offset_X, start_y
|
||||||
|
- Main_offset_Y, height - offset_height + 1);
|
||||||
|
}
|
||||||
|
else if (height == 0)
|
||||||
|
{
|
||||||
|
// Single line
|
||||||
|
Horizontal_XOR_line(start_x-Main_offset_X,
|
||||||
|
start_y - Main_offset_Y, width - offset_width + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Dessin dans la zone de dessin normale
|
||||||
|
Horizontal_XOR_line(start_x-Main_offset_X,
|
||||||
|
start_y - Main_offset_Y, width - offset_width + 1);
|
||||||
|
|
||||||
|
// If not, this line is out of the picture so there is no need to draw it
|
||||||
|
if (offset_height == 0 || end_y - 1 > Menu_Y + Main_offset_Y)
|
||||||
|
{
|
||||||
|
Horizontal_XOR_line(start_x - Main_offset_X, end_y
|
||||||
|
- Main_offset_Y, width - offset_width + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (height > offset_height + 2)
|
||||||
|
{
|
||||||
|
Vertical_XOR_line(start_x-Main_offset_X, start_y
|
||||||
|
- Main_offset_Y + 1, height - offset_height - 1);
|
||||||
|
|
||||||
|
if (offset_width == 0)
|
||||||
|
{
|
||||||
|
Vertical_XOR_line(end_x - Main_offset_X, start_y
|
||||||
|
- Main_offset_Y + 1, height - offset_height - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Update_rect(start_x - Main_offset_X, start_y - Main_offset_Y,
|
||||||
|
width + 1 - offset_width, height + 1 - offset_height);
|
||||||
|
|
||||||
|
// Dessin dans la zone zoomée
|
||||||
|
if (Main_magnifier_mode && start_x <= Limit_right_zoom
|
||||||
|
&& end_x > Limit_left_zoom
|
||||||
|
&& start_y <= Limit_bottom_zoom
|
||||||
|
&& end_y > Limit_top_zoom )
|
||||||
|
{
|
||||||
|
offset_width = 0;
|
||||||
|
offset_height = 0;
|
||||||
|
|
||||||
|
if (start_x<Limit_left_zoom) // On dépasse du zoom à gauche
|
||||||
|
{
|
||||||
|
offset_width += Limit_left_zoom - start_x;
|
||||||
|
offset_left = Limit_left_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(end_x>Limit_right_zoom) // On dépasse du zoom à droite
|
||||||
|
offset_width += end_x - Limit_right_zoom;
|
||||||
|
|
||||||
|
if(start_y<Limit_top_zoom) // On dépasse du zoom en haut
|
||||||
|
{
|
||||||
|
offset_height += Limit_top_zoom - start_y;
|
||||||
|
offset_top = Limit_top_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(end_y>Limit_bottom_zoom) // On dépasse du zoom en bas
|
||||||
|
offset_height += end_y - Limit_bottom_zoom;
|
||||||
|
|
||||||
|
if(width > offset_width)
|
||||||
|
{
|
||||||
|
if(offset_top==0) // La ligne du haut est visible
|
||||||
|
Horizontal_XOR_line_zoom(offset_left>0?offset_left:start_x,start_y,width-offset_width+1);
|
||||||
|
|
||||||
|
if(height!=0 && end_y<=Limit_bottom_zoom) // La ligne du bas est visible
|
||||||
|
Horizontal_XOR_line_zoom(offset_left>0?offset_left:start_x,end_y,width-offset_width+1);
|
||||||
|
}
|
||||||
|
if (width==0 && height!=0 && height > offset_height && offset_left==0)
|
||||||
|
{
|
||||||
|
// Single vertical line
|
||||||
|
Vertical_XOR_line_zoom(start_x,offset_top!=0?offset_top:start_y,height-offset_height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(height > offset_height + 2)
|
||||||
|
{
|
||||||
|
if(offset_left==0) // La ligne de gauche est visible
|
||||||
|
Vertical_XOR_line_zoom(start_x,offset_top!=0?offset_top:(start_y+1),height-offset_height-(offset_top==0)+(end_y>Limit_bottom_zoom));
|
||||||
|
|
||||||
|
if(end_x<=Limit_right_zoom) // La ligne de droite est visible
|
||||||
|
Vertical_XOR_line_zoom(end_x,offset_top!=0?offset_top:(start_y+1),height-offset_height-(offset_top==0)+(end_y>Limit_bottom_zoom));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
void Grad_rectangle_0_5(void)
|
void Grad_rectangle_0_5(void)
|
||||||
// OPERATION_GRAD_RECTANGLE
|
// OPERATION_GRAD_RECTANGLE
|
||||||
// click souris 0
|
// click souris 0
|
||||||
@ -3382,129 +3497,54 @@ void Grad_rectangle_0_5(void)
|
|||||||
// on doit donc attendre que l'utilisateur clique quelque part
|
// 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
|
// 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)
|
// !!! Cette fonction remet start_x start_y end_x end_y dans la pile à la fin donc il ne faut pas les modifier ! (sauf éventuellement un tri)
|
||||||
short rax;
|
short start_x;
|
||||||
short ray;
|
short start_y;
|
||||||
short rbx;
|
short end_x;
|
||||||
short rby, width,height;
|
short end_y;
|
||||||
short offset_width = 0;
|
short width,height;
|
||||||
short offset_height = 0;
|
|
||||||
short offset_left = 0;
|
|
||||||
short offset_top = 0;
|
|
||||||
|
|
||||||
|
|
||||||
// Tracé propre du rectangle
|
// Tracé propre du rectangle
|
||||||
Operation_pop(&rby);
|
Operation_pop(&end_y);
|
||||||
Operation_pop(&rbx);
|
Operation_pop(&end_x);
|
||||||
Operation_pop(&ray);
|
Operation_pop(&start_y);
|
||||||
Operation_pop(&rax);
|
Operation_pop(&start_x);
|
||||||
|
|
||||||
|
// This trick will erase the large crosshair at original position,
|
||||||
|
// in normal and zoomed views.
|
||||||
|
Paintbrush_X = start_x;
|
||||||
|
Paintbrush_Y = start_y;
|
||||||
|
|
||||||
|
if (start_x>end_x)
|
||||||
|
SWAP_SHORTS(start_x, end_x)
|
||||||
|
|
||||||
|
if (start_y>end_y)
|
||||||
|
SWAP_SHORTS(start_y, end_y)
|
||||||
|
|
||||||
Paintbrush_X = rax;
|
|
||||||
Paintbrush_Y = ray;
|
|
||||||
Hide_cursor();
|
Hide_cursor();
|
||||||
|
|
||||||
width = abs(rbx - rax);
|
width = end_x - start_x;
|
||||||
height = abs(rby - ray);
|
height = end_y - start_y;
|
||||||
|
|
||||||
// Check if the rectangle is not fully outside the picture
|
// Check if the rectangle is not fully outside the picture
|
||||||
if (Min(rax, rbx) > Main_image_width // Rectangle at right of picture
|
if (start_x > Main_image_width // Rectangle at right of picture
|
||||||
|| Min(ray, rby) > Main_image_height // Rectangle below picture
|
|| start_y > Main_image_height // Rectangle below picture
|
||||||
|| Min(ray, rby) - 1 - Main_offset_Y > Menu_Y ) // Rectangle below viewport
|
|| start_y - 1 - Main_offset_Y > Menu_Y ) // Rectangle below viewport
|
||||||
{
|
{
|
||||||
Operation_pop(&rby); // reset the stack
|
Operation_pop(&end_y); // reset the stack
|
||||||
return; // cancel the operation
|
return; // cancel the operation
|
||||||
}
|
}
|
||||||
|
Draw_xor_rect(start_x, start_y, end_x, end_y);
|
||||||
|
|
||||||
// Handle clipping
|
Operation_push(start_x);
|
||||||
if (Max(rax, rbx)-Main_offset_X > Min(Main_image_width,
|
Operation_push(start_y);
|
||||||
Main_magnifier_mode?Main_separator_position:Screen_width))
|
Operation_push(end_x);
|
||||||
{
|
Operation_push(end_y);
|
||||||
offset_width = Max(rax, rbx) - Min(Main_image_width,
|
|
||||||
Main_magnifier_mode?Main_separator_position:Screen_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Max(ray, rby)-Main_offset_Y > Min(Main_image_height, Menu_Y))
|
|
||||||
offset_height = Max(ray, rby) - Min(Main_image_height, Menu_Y);
|
|
||||||
|
|
||||||
// Dessin dans la zone de dessin normale
|
|
||||||
Horizontal_XOR_line(Min(rax, rbx)-Main_offset_X,
|
|
||||||
Min(ray, rby) - Main_offset_Y, width - offset_width);
|
|
||||||
|
|
||||||
// If not, this line is out of the picture so there is no need to draw it
|
|
||||||
if (offset_height == 0 || Max(ray, rby) - 1 > Menu_Y + Main_offset_Y )
|
|
||||||
{
|
|
||||||
Horizontal_XOR_line(Min(rax, rbx) - Main_offset_X, Max(ray, rby) - 1
|
|
||||||
- Main_offset_Y, width - offset_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (height > offset_height) {
|
|
||||||
Vertical_XOR_line(Min(rax, rbx)-Main_offset_X, Min(ray, rby)
|
|
||||||
- Main_offset_Y, height - offset_height);
|
|
||||||
|
|
||||||
if (offset_width == 0)
|
|
||||||
{
|
|
||||||
Vertical_XOR_line(Max(rax, rbx) - 1 - Main_offset_X, Min(ray, rby)
|
|
||||||
- Main_offset_Y, height - offset_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Update_rect(Min(rax, rbx) - Main_offset_X, Min(ray, rby) - Main_offset_Y,
|
|
||||||
width + 1 - offset_width, height + 1 - offset_height);
|
|
||||||
|
|
||||||
// Dessin dans la zone zoomée
|
|
||||||
if (Main_magnifier_mode && Min(rax, rbx) <= Limit_right_zoom
|
|
||||||
&& Max(rax, rbx) > Limit_left_zoom
|
|
||||||
&& Min(ray, rby) <= Limit_bottom_zoom
|
|
||||||
&& Max(ray, rby) > Limit_top_zoom )
|
|
||||||
{
|
|
||||||
offset_width = 0;
|
|
||||||
offset_height = 0;
|
|
||||||
|
|
||||||
if (Min(rax, rbx)<=Limit_left_zoom) // On dépasse du zoom à gauche
|
|
||||||
{
|
|
||||||
offset_width += Limit_left_zoom - Min(rax, rbx);
|
|
||||||
offset_left = Limit_left_zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Max(rax,rbx)>Limit_right_zoom) // On dépasse du zoom à droite
|
|
||||||
offset_width += Max(rax,rbx) - Limit_right_zoom - 1;
|
|
||||||
|
|
||||||
if(Min(ray,rby)<Limit_top_zoom) // On dépasse du zoom en haut
|
|
||||||
{
|
|
||||||
offset_height += Limit_top_zoom - Min(ray,rby);
|
|
||||||
offset_top = Limit_top_zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Max(ray,rby)>Limit_bottom_zoom) // On dépasse du zoom en bas
|
|
||||||
offset_height += Max(ray,rby) - Limit_bottom_zoom - 1;
|
|
||||||
|
|
||||||
if(width > offset_width)
|
|
||||||
{
|
|
||||||
if(offset_top==0) // La ligne du haut est visible
|
|
||||||
Horizontal_XOR_line_zoom(offset_left>0?offset_left:Min(rax,rbx),Min(ray,rby),width-offset_width);
|
|
||||||
|
|
||||||
if(Max(ray,rby)<=Limit_bottom_zoom) // La ligne du bas est visible
|
|
||||||
Horizontal_XOR_line_zoom(offset_left>0?offset_left:Min(rax,rbx),Max(ray,rby),width-offset_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(height>offset_height)
|
|
||||||
{
|
|
||||||
if(offset_left==0) // La ligne de gauche est visible
|
|
||||||
Vertical_XOR_line_zoom(Min(rax,rbx),offset_top>0?offset_top:Min(ray,rby),height-offset_height);
|
|
||||||
|
|
||||||
if(Max(rax,rbx)<=Limit_right_zoom) // La ligne de droite est visible
|
|
||||||
Vertical_XOR_line_zoom(Max(rax,rbx),offset_top>0?offset_top:Min(ray,rby),height-offset_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Operation_push(rax);
|
|
||||||
Operation_push(ray);
|
|
||||||
Operation_push(rbx);
|
|
||||||
Operation_push(rby);
|
|
||||||
|
|
||||||
// On ajoute des trucs dans la pile pour forcer le passage à l'étape suivante
|
// On ajoute des trucs dans la pile pour forcer le passage à l'étape suivante
|
||||||
Operation_push(rbx);
|
Operation_push(end_x);
|
||||||
Operation_push(rby);
|
Operation_push(end_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Grad_rectangle_0_7(void)
|
void Grad_rectangle_0_7(void)
|
||||||
@ -3534,24 +3574,24 @@ void Grad_rectangle_12_7(void)
|
|||||||
|
|
||||||
// Si l'utilisateur utilise le mauvais bouton, on annule le tracé. Mais ça nous oblige à vider toute la pile pour vérifier :(
|
// 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,click;
|
short start_x,end_x,start_y,end_y,vax,vay,click;
|
||||||
|
|
||||||
Operation_pop(&vay);
|
Operation_pop(&vay);
|
||||||
Operation_pop(&vax);
|
Operation_pop(&vax);
|
||||||
Operation_pop(&ray);
|
Operation_pop(&end_y);
|
||||||
Operation_pop(&rax);
|
Operation_pop(&end_x);
|
||||||
Operation_pop(&rby);
|
Operation_pop(&start_y);
|
||||||
Operation_pop(&rbx);
|
Operation_pop(&start_x);
|
||||||
Operation_pop(&click);
|
Operation_pop(&click);
|
||||||
|
|
||||||
|
|
||||||
if(click==Mouse_K)
|
if(click==Mouse_K)
|
||||||
{
|
{
|
||||||
Operation_push(click);
|
Operation_push(click);
|
||||||
Operation_push(rbx);
|
Operation_push(start_x);
|
||||||
Operation_push(rby);
|
Operation_push(start_y);
|
||||||
Operation_push(rax);
|
Operation_push(end_x);
|
||||||
Operation_push(ray);
|
Operation_push(end_y);
|
||||||
Operation_push(vax);
|
Operation_push(vax);
|
||||||
Operation_push(vay);
|
Operation_push(vay);
|
||||||
Operation_push(Paintbrush_X);
|
Operation_push(Paintbrush_X);
|
||||||
@ -3562,83 +3602,14 @@ void Grad_rectangle_12_7(void)
|
|||||||
{
|
{
|
||||||
// Mauvais bouton > anulation de l'opération.
|
// Mauvais bouton > anulation de l'opération.
|
||||||
// On a déjà vidé la pile, il reste à effacer le rectangle XOR
|
// On a déjà vidé la pile, il reste à effacer le rectangle XOR
|
||||||
short width, height;
|
Draw_xor_rect(start_x, start_y, end_x, end_y);
|
||||||
short offset_width = 0;
|
|
||||||
short offset_height = 0;
|
|
||||||
short offset_left = 0;
|
|
||||||
short offset_top = 0;
|
|
||||||
|
|
||||||
width = abs(rbx-rax);
|
|
||||||
height = abs(rby-ray);
|
|
||||||
|
|
||||||
if (Max(rax,rbx)-Main_offset_X > Min(Main_image_width,Main_magnifier_mode?Main_separator_position:Screen_width)) // Tous les clippings à gérer sont là
|
|
||||||
offset_width = Max(rax,rbx) - Min(Main_image_width,Main_magnifier_mode?Main_separator_position:Screen_width);
|
|
||||||
|
|
||||||
if (Max(ray,rby)-Main_offset_Y > Min(Main_image_height,Menu_Y))
|
|
||||||
offset_height = Max(ray,rby) - Min(Main_image_height,Menu_Y);
|
|
||||||
|
|
||||||
// Dessin dans la zone de dessin normale
|
|
||||||
Horizontal_XOR_line(Min(rax,rbx)-Main_offset_X,Min(ray,rby)-Main_offset_Y,width - offset_width);
|
|
||||||
if(offset_height == 0)
|
|
||||||
Horizontal_XOR_line(Min(rax,rbx)-Main_offset_X,Max(ray,rby)-1-Main_offset_Y,width - offset_width);
|
|
||||||
|
|
||||||
Vertical_XOR_line(Min(rax,rbx)-Main_offset_X,Min(ray,rby)-Main_offset_Y,height-offset_height);
|
|
||||||
if (offset_width == 0) // Sinon cette ligne est en dehors de la zone image, inutile de la dessiner
|
|
||||||
Vertical_XOR_line(Max(rax,rbx)-1-Main_offset_X,Min(ray,rby)-Main_offset_Y,height-offset_height);
|
|
||||||
|
|
||||||
Update_rect(Min(rax,rbx)-Main_offset_X,Min(ray,rby)-Main_offset_Y,width+1-offset_width,height+1-offset_height);
|
|
||||||
|
|
||||||
// Dessin dans la zone zoomée
|
|
||||||
if (Main_magnifier_mode && Min(rax, rbx) <= Limit_right_zoom
|
|
||||||
&& Max(rax, rbx)>Limit_left_zoom && Min(ray, rby) <= Limit_bottom_zoom
|
|
||||||
&& Max(ray,rby)>Limit_top_zoom )
|
|
||||||
{
|
|
||||||
offset_width = 0;
|
|
||||||
offset_height=0;
|
|
||||||
|
|
||||||
if(Min(rax,rbx)<Limit_left_zoom) // On dépasse du zoom à gauche
|
|
||||||
{
|
|
||||||
offset_width += Limit_left_zoom - Min(rax,rbx);
|
|
||||||
offset_left = Limit_left_zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Max(rax,rbx)>Limit_right_zoom) // On dépasse du zoom à droite
|
|
||||||
offset_width += Max(rax,rbx) - Limit_right_zoom - 1;
|
|
||||||
|
|
||||||
if(Min(ray,rby)<Limit_top_zoom) // On dépasse du zoom en haut
|
|
||||||
{
|
|
||||||
offset_height += Limit_top_zoom - Min(ray,rby);
|
|
||||||
offset_top = Limit_top_zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Max(ray,rby)>Limit_bottom_zoom) // On dépasse du zoom en bas
|
|
||||||
offset_height += Max(ray,rby) - Limit_bottom_zoom - 1;
|
|
||||||
|
|
||||||
if(width > offset_width)
|
|
||||||
{
|
|
||||||
if(offset_top==0) // La ligne du haut est visible
|
|
||||||
Horizontal_XOR_line_zoom(offset_left>0?offset_left:Min(rax,rbx),Min(ray,rby),width-offset_width);
|
|
||||||
|
|
||||||
if(Max(ray,rby)<Limit_bottom_zoom) // La ligne du bas est visible
|
|
||||||
Horizontal_XOR_line_zoom(offset_left>0?offset_left:Min(rax,rbx),Max(ray,rby),width-offset_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(height>offset_height)
|
|
||||||
{
|
|
||||||
if(offset_left==0) // La ligne de gauche est visible
|
|
||||||
Vertical_XOR_line_zoom(Min(rax,rbx),offset_top>0?offset_top:Min(ray,rby),height-offset_height);
|
|
||||||
|
|
||||||
if(Max(rax,rbx)<=Limit_right_zoom) // La ligne de droite est visible
|
|
||||||
Vertical_XOR_line_zoom(Max(rax,rbx),offset_top>0?offset_top:Min(ray,rby),height-offset_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Grad_rectangle_12_9(void)
|
void Grad_rectangle_12_9(void)
|
||||||
// Opération : OPERATION_GRAD_RECTANGLE
|
// Opération : OPERATION_GRAD_RECTANGLE
|
||||||
// Click Souris: 1
|
// Click Souris: 1
|
||||||
// Taille_Pile : 5
|
// Taille_Pile : 9
|
||||||
//
|
//
|
||||||
// Souris effacée: Oui
|
// Souris effacée: Oui
|
||||||
|
|
||||||
@ -3709,89 +3680,18 @@ void Grad_rectangle_0_9(void)
|
|||||||
|
|
||||||
Hide_cursor();
|
Hide_cursor();
|
||||||
// Maintenant on efface tout le bazar temporaire : rectangle et ligne XOR
|
// Maintenant on efface tout le bazar temporaire : rectangle et ligne XOR
|
||||||
|
Draw_xor_rect(rect_start_x, rect_start_y, rect_end_x, rect_end_y);
|
||||||
Hide_line_preview(vector_start_x,vector_start_y,vector_end_x,vector_end_y);
|
Hide_line_preview(vector_start_x,vector_start_y,vector_end_x,vector_end_y);
|
||||||
|
|
||||||
// Et enfin on trace le rectangle avec le dégradé dedans !
|
// Et enfin on trace le rectangle avec le dégradé dedans !
|
||||||
if (vector_end_x==vector_start_x && vector_end_y==vector_start_y)
|
if (vector_end_x==vector_start_x && vector_end_y==vector_start_y)
|
||||||
{
|
{
|
||||||
// Vecteur nul > pas de rectangle tracé
|
// Vecteur nul > pas de rectangle tracé
|
||||||
// Du coup on doit effacer la preview xor ...
|
|
||||||
short width, height;
|
|
||||||
short offset_width = 0;
|
|
||||||
short offset_height = 0;
|
|
||||||
short offset_left = 0;
|
|
||||||
short offset_top = 0;
|
|
||||||
|
|
||||||
width = abs(rect_end_x-rect_start_x);
|
|
||||||
height = abs(rect_end_y-rect_start_y);
|
|
||||||
|
|
||||||
if (Max(rect_start_x,rect_end_x)-Main_offset_X > Min(Main_image_width,Main_magnifier_mode?Main_separator_position:Screen_width)) // Tous les clippings à gérer sont là
|
|
||||||
offset_width = Max(rect_start_x,rect_end_x) - Min(Main_image_width,Main_magnifier_mode?Main_separator_position:Screen_width);
|
|
||||||
|
|
||||||
if (Max(rect_start_y,rect_end_y)-Main_offset_Y > Min(Main_image_height,Menu_Y))
|
|
||||||
offset_height = Max(rect_start_y,rect_end_y) - Min(Main_image_height,Menu_Y);
|
|
||||||
|
|
||||||
// Dessin dans la zone de dessin normale
|
|
||||||
Horizontal_XOR_line(Min(rect_start_x,rect_end_x)-Main_offset_X,Min(rect_start_y,rect_end_y)-Main_offset_Y,width - offset_width);
|
|
||||||
if(offset_height == 0)
|
|
||||||
Horizontal_XOR_line(Min(rect_start_x,rect_end_x)-Main_offset_X,Max(rect_start_y,rect_end_y)-1-Main_offset_Y,width - offset_width);
|
|
||||||
|
|
||||||
Vertical_XOR_line(Min(rect_start_x,rect_end_x)-Main_offset_X,Min(rect_start_y,rect_end_y)-Main_offset_Y,height-offset_height);
|
|
||||||
if (offset_width == 0) // Sinon cette ligne est en dehors de la zone image, inutile de la dessiner
|
|
||||||
Vertical_XOR_line(Max(rect_start_x,rect_end_x)-1-Main_offset_X,Min(rect_start_y,rect_end_y)-Main_offset_Y,height-offset_height);
|
|
||||||
|
|
||||||
Update_rect(Min(rect_start_x,rect_end_x)-Main_offset_X,Min(rect_start_y,rect_end_y)-Main_offset_Y,width+1-offset_width,height+1-offset_height);
|
|
||||||
|
|
||||||
// Dessin dans la zone zoomée
|
|
||||||
if (Main_magnifier_mode
|
|
||||||
&& Min(rect_start_x, rect_end_x) <= Limit_right_zoom
|
|
||||||
&& Max(rect_start_x, rect_end_x) > Limit_left_zoom
|
|
||||||
&& Min(rect_start_y, rect_end_y) <= Limit_bottom_zoom
|
|
||||||
&& Max(rect_start_y, rect_end_y) > Limit_top_zoom )
|
|
||||||
{
|
|
||||||
offset_width = 0;
|
|
||||||
offset_height=0;
|
|
||||||
|
|
||||||
if(Min(rect_start_x,rect_end_x)<Limit_left_zoom) // On dépasse du zoom à gauche
|
|
||||||
{
|
|
||||||
offset_width += Limit_left_zoom - Min(rect_start_x,rect_end_x);
|
|
||||||
offset_left = Limit_left_zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Max(rect_start_x,rect_end_x)>Limit_right_zoom) // On dépasse du zoom à droite
|
|
||||||
offset_width += Max(rect_start_x,rect_end_x) - Limit_right_zoom;
|
|
||||||
|
|
||||||
if(Min(rect_start_y,rect_end_y)<Limit_top_zoom) // On dépasse du zoom en haut
|
|
||||||
{
|
|
||||||
offset_height += Limit_top_zoom - Min(rect_start_y,rect_end_y);
|
|
||||||
offset_top = Limit_top_zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Max(rect_start_y,rect_end_y)>Limit_bottom_zoom) // On dépasse du zoom en bas
|
|
||||||
offset_height += Max(rect_start_y,rect_end_y) - Limit_bottom_zoom;
|
|
||||||
|
|
||||||
if(width > offset_width)
|
|
||||||
{
|
|
||||||
if(offset_top==0) // La ligne du haut est visible
|
|
||||||
Horizontal_XOR_line_zoom(offset_left>0?offset_left:Min(rect_start_x,rect_end_x),Min(rect_start_y,rect_end_y),width-offset_width);
|
|
||||||
|
|
||||||
if(Max(rect_start_y,rect_end_y) <= Limit_bottom_zoom) // La ligne du bas est visible
|
|
||||||
Horizontal_XOR_line_zoom(offset_left>0?offset_left:Min(rect_start_x,rect_end_x),Max(rect_start_y,rect_end_y),width-offset_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(height>offset_height)
|
|
||||||
{
|
|
||||||
if(offset_left==0) // La ligne de gauche est visible
|
|
||||||
Vertical_XOR_line_zoom(Min(rect_start_x,rect_end_x),offset_top>0?offset_top:Min(rect_start_y,rect_end_y),height-offset_height);
|
|
||||||
|
|
||||||
if(Max(rect_start_x,rect_end_x) <= Limit_right_zoom) // La ligne de droite est visible
|
|
||||||
Vertical_XOR_line_zoom(Max(rect_start_x,rect_end_x),offset_top>0?offset_top:Min(rect_start_y,rect_end_y),height-offset_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
Draw_grad_rectangle(rect_start_x,rect_start_y,rect_end_x,rect_end_y,vector_start_x,vector_start_y,vector_end_x,vector_end_y);
|
Draw_grad_rectangle(rect_start_x,rect_start_y,rect_end_x,rect_end_y,vector_start_x,vector_start_y,vector_end_x,vector_end_y);
|
||||||
|
}
|
||||||
Display_cursor();
|
Display_cursor();
|
||||||
End_of_modification();
|
End_of_modification();
|
||||||
Wait_end_of_click();
|
Wait_end_of_click();
|
||||||
|
|||||||
@ -1929,7 +1929,7 @@ void Vertical_XOR_line_zoom(short x_pos, short y_pos, short height)
|
|||||||
{
|
{
|
||||||
short real_x_pos=Main_X_zoom+(x_pos-Main_magnifier_offset_X)*Main_magnifier_factor;
|
short real_x_pos=Main_X_zoom+(x_pos-Main_magnifier_offset_X)*Main_magnifier_factor;
|
||||||
short real_y_pos=(y_pos-Main_magnifier_offset_Y)*Main_magnifier_factor;
|
short real_y_pos=(y_pos-Main_magnifier_offset_Y)*Main_magnifier_factor;
|
||||||
short end_y_pos=(real_y_pos+(height*Main_magnifier_factor<Menu_Y))?real_y_pos+(height*Main_magnifier_factor):Menu_Y;
|
short end_y_pos=(real_y_pos+height*Main_magnifier_factor<Menu_Y)?real_y_pos+(height*Main_magnifier_factor):Menu_Y;
|
||||||
short index;
|
short index;
|
||||||
|
|
||||||
for (index=real_y_pos; index<end_y_pos; index++)
|
for (index=real_y_pos; index<end_y_pos; index++)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user