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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
// OPERATION_GRAD_RECTANGLE
 | 
			
		||||
// click souris 0
 | 
			
		||||
@ -3382,129 +3497,54 @@ void Grad_rectangle_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, width,height;
 | 
			
		||||
  short offset_width = 0;
 | 
			
		||||
  short offset_height = 0;
 | 
			
		||||
  short offset_left = 0;
 | 
			
		||||
  short offset_top = 0;
 | 
			
		||||
  // !!! 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 start_x;
 | 
			
		||||
  short start_y;
 | 
			
		||||
  short end_x;
 | 
			
		||||
  short end_y;
 | 
			
		||||
  short width,height;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Tracé propre du rectangle
 | 
			
		||||
  Operation_pop(&rby);
 | 
			
		||||
  Operation_pop(&rbx);
 | 
			
		||||
  Operation_pop(&ray);
 | 
			
		||||
  Operation_pop(&rax);
 | 
			
		||||
  Operation_pop(&end_y);
 | 
			
		||||
  Operation_pop(&end_x);
 | 
			
		||||
  Operation_pop(&start_y);
 | 
			
		||||
  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();
 | 
			
		||||
 | 
			
		||||
  width = abs(rbx - rax);
 | 
			
		||||
  height = abs(rby - ray);
 | 
			
		||||
  width = end_x - start_x;
 | 
			
		||||
  height = end_y - start_y;
 | 
			
		||||
 | 
			
		||||
  // Check if the rectangle is not fully outside the picture
 | 
			
		||||
  if (Min(rax, rbx) > Main_image_width                  // Rectangle at right of picture
 | 
			
		||||
      || Min(ray, rby) > Main_image_height              // Rectangle below picture
 | 
			
		||||
      || Min(ray, rby) - 1 - Main_offset_Y > Menu_Y )   // Rectangle below viewport
 | 
			
		||||
  if (start_x > Main_image_width                  // Rectangle at right of picture
 | 
			
		||||
      || start_y > Main_image_height              // Rectangle below picture
 | 
			
		||||
      || 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
 | 
			
		||||
  }
 | 
			
		||||
  Draw_xor_rect(start_x, start_y, end_x, end_y);
 | 
			
		||||
 | 
			
		||||
  // Handle clipping
 | 
			
		||||
  if (Max(rax, rbx)-Main_offset_X > Min(Main_image_width,
 | 
			
		||||
    Main_magnifier_mode?Main_separator_position:Screen_width))
 | 
			
		||||
  {
 | 
			
		||||
    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);
 | 
			
		||||
  Operation_push(start_x);
 | 
			
		||||
  Operation_push(start_y);
 | 
			
		||||
  Operation_push(end_x);
 | 
			
		||||
  Operation_push(end_y);
 | 
			
		||||
 | 
			
		||||
  // On ajoute des trucs dans la pile pour forcer le passage à l'étape suivante
 | 
			
		||||
  Operation_push(rbx);
 | 
			
		||||
  Operation_push(rby);
 | 
			
		||||
  Operation_push(end_x);
 | 
			
		||||
  Operation_push(end_y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 :(
 | 
			
		||||
{
 | 
			
		||||
  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(&vax);
 | 
			
		||||
  Operation_pop(&ray);
 | 
			
		||||
  Operation_pop(&rax);
 | 
			
		||||
  Operation_pop(&rby);
 | 
			
		||||
  Operation_pop(&rbx);
 | 
			
		||||
  Operation_pop(&end_y);
 | 
			
		||||
  Operation_pop(&end_x);
 | 
			
		||||
  Operation_pop(&start_y);
 | 
			
		||||
  Operation_pop(&start_x);
 | 
			
		||||
  Operation_pop(&click);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if(click==Mouse_K)
 | 
			
		||||
  {
 | 
			
		||||
      Operation_push(click);
 | 
			
		||||
      Operation_push(rbx);
 | 
			
		||||
      Operation_push(rby);
 | 
			
		||||
      Operation_push(rax);
 | 
			
		||||
      Operation_push(ray);
 | 
			
		||||
      Operation_push(start_x);
 | 
			
		||||
      Operation_push(start_y);
 | 
			
		||||
      Operation_push(end_x);
 | 
			
		||||
      Operation_push(end_y);
 | 
			
		||||
      Operation_push(vax);
 | 
			
		||||
      Operation_push(vay);
 | 
			
		||||
      Operation_push(Paintbrush_X);
 | 
			
		||||
@ -3562,83 +3602,14 @@ void Grad_rectangle_12_7(void)
 | 
			
		||||
  {
 | 
			
		||||
      // Mauvais bouton > anulation de l'opération.
 | 
			
		||||
      // On a déjà vidé la pile, il reste à effacer le rectangle XOR
 | 
			
		||||
      short width, height;
 | 
			
		||||
      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);
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
      Draw_xor_rect(start_x, start_y, end_x, end_y);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Grad_rectangle_12_9(void)
 | 
			
		||||
    // Opération   : OPERATION_GRAD_RECTANGLE
 | 
			
		||||
    // Click Souris: 1
 | 
			
		||||
    // Taille_Pile : 5
 | 
			
		||||
    // Taille_Pile : 9
 | 
			
		||||
    //
 | 
			
		||||
    // Souris effacée: Oui
 | 
			
		||||
 | 
			
		||||
@ -3709,89 +3680,18 @@ void Grad_rectangle_0_9(void)
 | 
			
		||||
 | 
			
		||||
    Hide_cursor();
 | 
			
		||||
    // 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);
 | 
			
		||||
 | 
			
		||||
    // Et enfin on trace le rectangle avec le dégradé dedans !
 | 
			
		||||
    if (vector_end_x==vector_start_x && vector_end_y==vector_start_y)
 | 
			
		||||
    {
 | 
			
		||||
        // 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
 | 
			
		||||
    {
 | 
			
		||||
        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();
 | 
			
		||||
    End_of_modification();
 | 
			
		||||
    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_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;
 | 
			
		||||
 | 
			
		||||
  for (index=real_y_pos; index<end_y_pos; index++)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user