ZX: also apply brightness constraint
There may only be one brightness per cell: either two light, or two dark colors.
This commit is contained in:
		
							parent
							
								
									f2b04e08d0
								
							
						
					
					
						commit
						1d2cfc2a8d
					
				
							
								
								
									
										210
									
								
								src/graph.c
									
									
									
									
									
								
							
							
						
						
									
										210
									
								
								src/graph.c
									
									
									
									
									
								
							@ -190,7 +190,7 @@ void Update_part_of_screen(short x, short y, short width, short height)
 | 
			
		||||
    r.h=effective_h;
 | 
			
		||||
    r.w=effective_w;
 | 
			
		||||
    SDL_FillRect(Screen_SDL,&r,3);*/
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // When the grid is displayed in Tilemap mode, this tests if
 | 
			
		||||
    // one edge of the grid has been touched :
 | 
			
		||||
    // In this case, the whole magnified area requires a refreshed grid.
 | 
			
		||||
@ -201,7 +201,7 @@ void Update_part_of_screen(short x, short y, short width, short height)
 | 
			
		||||
        y/Snap_height<(y+height)/Snap_height))
 | 
			
		||||
    {
 | 
			
		||||
      short w,h;
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      w=Min(Screen_width-Main_X_zoom, (Main_image_width-Main_magnifier_offset_X)*Main_magnifier_factor);
 | 
			
		||||
      h=Min(Menu_Y, (Main_image_height-Main_magnifier_offset_Y)*Main_magnifier_factor);
 | 
			
		||||
 | 
			
		||||
@ -241,7 +241,7 @@ int Init_mode_video(int width, int height, int fullscreen, int pix_ratio)
 | 
			
		||||
  static int Wrong_resize;
 | 
			
		||||
 | 
			
		||||
try_again:
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  switch (pix_ratio)
 | 
			
		||||
  {
 | 
			
		||||
      default:
 | 
			
		||||
@ -300,7 +300,7 @@ try_again:
 | 
			
		||||
        goto try_again;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (width > 320*pix_width && height > 200*pix_height)
 | 
			
		||||
      Wrong_resize = 0;
 | 
			
		||||
 | 
			
		||||
@ -331,10 +331,10 @@ try_again:
 | 
			
		||||
      width = (width + 15) & 0xFFFFFFF0;
 | 
			
		||||
  #else
 | 
			
		||||
      //width = (width + 3 ) & 0xFFFFFFFC;
 | 
			
		||||
  #endif  
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  pixels_changed = (Pixel_ratio!=pix_ratio);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (!screen_changed && !pixels_changed)
 | 
			
		||||
  {
 | 
			
		||||
    Resize_width=0;
 | 
			
		||||
@ -346,7 +346,7 @@ try_again:
 | 
			
		||||
  {
 | 
			
		||||
    Set_mode_SDL(&width, &height,fullscreen);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (screen_changed || pixels_changed)
 | 
			
		||||
  {
 | 
			
		||||
    Pixel_ratio=pix_ratio;
 | 
			
		||||
@ -444,9 +444,9 @@ try_again:
 | 
			
		||||
    Menu_factor_X*=2;
 | 
			
		||||
  else if (Pixel_width>Pixel_height && Screen_height>=Menu_factor_Y*2*200)
 | 
			
		||||
    Menu_factor_Y*=2;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  free(Horizontal_line_buffer);
 | 
			
		||||
  Horizontal_line_buffer=(byte *)malloc(Pixel_width * 
 | 
			
		||||
  Horizontal_line_buffer=(byte *)malloc(Pixel_width *
 | 
			
		||||
    ((Screen_width>Main_image_width)?Screen_width:Main_image_width));
 | 
			
		||||
 | 
			
		||||
  Set_palette(Main_palette);
 | 
			
		||||
@ -466,7 +466,7 @@ try_again:
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Change_palette_cells();
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Menu_Y = Screen_height;
 | 
			
		||||
  if (Menu_is_visible)
 | 
			
		||||
    Menu_Y -= Menu_height * Menu_factor_Y;
 | 
			
		||||
@ -482,7 +482,7 @@ try_again:
 | 
			
		||||
    Mouse_Y=Screen_height-1;
 | 
			
		||||
  if (fullscreen)
 | 
			
		||||
    Set_mouse_position();
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Spare_offset_X=0; // |  Il faut penser à éviter les incohérences
 | 
			
		||||
  Spare_offset_Y=0; // |- de décalage du brouillon par rapport à
 | 
			
		||||
  Spare_magnifier_mode=0; // |  la résolution.
 | 
			
		||||
@ -510,7 +510,7 @@ try_again:
 | 
			
		||||
    Position_screen_according_to_zoom();
 | 
			
		||||
  Compute_limits();
 | 
			
		||||
  Compute_paintbrush_coordinates();
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Resize_width=0;
 | 
			
		||||
  Resize_height=0;
 | 
			
		||||
  return 0;
 | 
			
		||||
@ -595,7 +595,7 @@ void Remap_spare(void)
 | 
			
		||||
  // teintes.
 | 
			
		||||
  for (layer=0; layer<Spare_backups->Pages->Nb_layers; layer++)
 | 
			
		||||
    Remap_general_lowlevel(used,Spare_backups->Pages->Image[layer].Pixels,Spare_backups->Pages->Image[layer].Pixels,Spare_image_width,Spare_image_height,Spare_image_width);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  // Change transparent color index
 | 
			
		||||
  Spare_backups->Pages->Transparent_color=used[Spare_backups->Pages->Transparent_color];
 | 
			
		||||
}
 | 
			
		||||
@ -612,11 +612,11 @@ void Get_colors_from_brush(void)
 | 
			
		||||
  int   image_color;
 | 
			
		||||
 | 
			
		||||
  //if (Confirmation_box("Modify current palette ?"))
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // Backup with unchanged layers, only palette is modified
 | 
			
		||||
  Backup_layers(LAYER_NONE);
 | 
			
		||||
 | 
			
		||||
  // Init array of new colors  
 | 
			
		||||
  // Init array of new colors
 | 
			
		||||
  for (color=0;color<=255;color++)
 | 
			
		||||
    brush_used[color]=0;
 | 
			
		||||
 | 
			
		||||
@ -627,7 +627,7 @@ void Get_colors_from_brush(void)
 | 
			
		||||
 | 
			
		||||
  // Check used colors in picture (to know which palette entries are free)
 | 
			
		||||
  Count_used_colors(usage);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // First pass : omit colors that are already in palette
 | 
			
		||||
  for (color=0; color<256; color++)
 | 
			
		||||
  {
 | 
			
		||||
@ -642,20 +642,20 @@ void Get_colors_from_brush(void)
 | 
			
		||||
         && Brush_original_palette[color].B==Main_palette[image_color].B)
 | 
			
		||||
        {
 | 
			
		||||
          // Color already in main palette:
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
          // Tag as used, so that no new color will overwrite it
 | 
			
		||||
          usage[image_color]=1;
 | 
			
		||||
 | 
			
		||||
          // Tag as non-new, to avoid it in pass 2
 | 
			
		||||
          brush_used[color]=0;
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  // Second pass : For each color to add, find an empty slot in 
 | 
			
		||||
 | 
			
		||||
  // Second pass : For each color to add, find an empty slot in
 | 
			
		||||
  // main palette to add it
 | 
			
		||||
  image_color=0;
 | 
			
		||||
  for (color=0; color<256 && image_color<256; color++)
 | 
			
		||||
@ -671,7 +671,7 @@ void Get_colors_from_brush(void)
 | 
			
		||||
          Main_palette[image_color].R=Brush_original_palette[color].R;
 | 
			
		||||
          Main_palette[image_color].G=Brush_original_palette[color].G;
 | 
			
		||||
          Main_palette[image_color].B=Brush_original_palette[color].B;
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
          image_color++;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
@ -931,7 +931,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
      if (Paintbrush_Y >= (Main_image_height-Snap_offset_Y)/Snap_height*Snap_height+Snap_offset_Y)
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // On suppose que le curseur est déjà caché.
 | 
			
		||||
    // Hide_cursor();
 | 
			
		||||
 | 
			
		||||
@ -1009,7 +1009,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
    Limit_left=old_limit_left;
 | 
			
		||||
    Limit_top=old_limit_top;
 | 
			
		||||
    Limit_bottom=old_limit_bottom;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    for (y_pos=top_reached;y_pos<=bottom_reached;y_pos++)
 | 
			
		||||
    {
 | 
			
		||||
      for (x_pos=left_reached;x_pos<=right_reached;x_pos++)
 | 
			
		||||
@ -1018,7 +1018,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
 | 
			
		||||
        // First, restore the color.
 | 
			
		||||
        Pixel_in_current_screen(x_pos,y_pos,Read_pixel_from_backup_layer(x_pos,y_pos));
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
        if (filled==2)
 | 
			
		||||
        {
 | 
			
		||||
          // Update the color according to the fill color and all effects
 | 
			
		||||
@ -1038,7 +1038,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
    if(Main_magnifier_mode)
 | 
			
		||||
    {
 | 
			
		||||
      short w,h;
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      w=Min(Screen_width-Main_X_zoom, (Main_image_width-Main_magnifier_offset_X)*Main_magnifier_factor);
 | 
			
		||||
      h=Min(Menu_Y, (Main_image_height-Main_magnifier_offset_Y)*Main_magnifier_factor);
 | 
			
		||||
 | 
			
		||||
@ -1072,7 +1072,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
  {
 | 
			
		||||
    Draw_paintbrush(x_pos,y_pos,color);
 | 
			
		||||
    Permanent_draw_count ++;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Check every 8 pixels
 | 
			
		||||
    if (! (Permanent_draw_count&7))
 | 
			
		||||
    {
 | 
			
		||||
@ -1095,7 +1095,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
         (y_pos<=Limit_bottom) )
 | 
			
		||||
    Display_pixel(x_pos,y_pos,color);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // Affichage d'un point pour une preview
 | 
			
		||||
  void Pixel_figure_preview(word x_pos,word y_pos,byte color)
 | 
			
		||||
  {
 | 
			
		||||
@ -1119,7 +1119,7 @@ void Fill_general(byte fill_color)
 | 
			
		||||
  void Pixel_figure_preview_xor(short x_pos,short y_pos,byte color)
 | 
			
		||||
  {
 | 
			
		||||
    (void)color; // unused
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if ( (x_pos>=Limit_left) &&
 | 
			
		||||
         (x_pos<=Limit_right) &&
 | 
			
		||||
         (y_pos>=Limit_top)   &&
 | 
			
		||||
@ -1127,26 +1127,26 @@ void Fill_general(byte fill_color)
 | 
			
		||||
      Pixel_preview(x_pos,y_pos,xor_lut[Read_pixel(x_pos-Main_offset_X,
 | 
			
		||||
                                           y_pos-Main_offset_Y)]);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // Affichage d'un point pour une preview en xor additif
 | 
			
		||||
  // (Il lit la couleur depuis la page backup)
 | 
			
		||||
  void Pixel_figure_preview_xorback(word x_pos,word y_pos,byte color)
 | 
			
		||||
  {
 | 
			
		||||
    (void)color; // unused
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if ( (x_pos>=Limit_left) &&
 | 
			
		||||
         (x_pos<=Limit_right) &&
 | 
			
		||||
         (y_pos>=Limit_top)   &&
 | 
			
		||||
         (y_pos<=Limit_bottom) )
 | 
			
		||||
      Pixel_preview(x_pos,y_pos,xor_lut[Main_screen[x_pos+y_pos*Main_image_width]]);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Effacement d'un point de preview
 | 
			
		||||
  void Pixel_figure_clear_preview(word x_pos,word y_pos,byte color)
 | 
			
		||||
  {
 | 
			
		||||
    (void)color; // unused
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if ( (x_pos>=Limit_left) &&
 | 
			
		||||
         (x_pos<=Limit_right) &&
 | 
			
		||||
         (y_pos>=Limit_top)   &&
 | 
			
		||||
@ -1299,7 +1299,7 @@ int Circle_squared_diameter(int diameter)
 | 
			
		||||
    return result-6;
 | 
			
		||||
  if (diameter==14)
 | 
			
		||||
    return result-4;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1459,18 +1459,18 @@ void Clamp_coordinates_regular_angle(short ax, short ay, short* bx, short* by)
 | 
			
		||||
  float angle;
 | 
			
		||||
 | 
			
		||||
  dx = *bx-ax;
 | 
			
		||||
  dy = *by-ay; 
 | 
			
		||||
  dy = *by-ay;
 | 
			
		||||
 | 
			
		||||
  // No mouse move: no need to clamp anything
 | 
			
		||||
  if (dx==0 || dy == 0) return; 
 | 
			
		||||
  if (dx==0 || dy == 0) return;
 | 
			
		||||
 | 
			
		||||
  // Determine angle (heading)
 | 
			
		||||
  angle = atan2(dx, dy);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  // Get absolute values, useful from now on:
 | 
			
		||||
  //dx=abs(dx);
 | 
			
		||||
  //dy=abs(dy);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  // Negative Y
 | 
			
		||||
  if (angle < M_PI*(-15.0/16.0) || angle > M_PI*(15.0/16.0))
 | 
			
		||||
  {
 | 
			
		||||
@ -1587,7 +1587,7 @@ void Draw_line_general(short start_x,short start_y,short end_x,short end_y, byte
 | 
			
		||||
  short incr_x,incr_y;
 | 
			
		||||
  short i,cumul;
 | 
			
		||||
  short delta_x,delta_y;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  x_pos=start_x;
 | 
			
		||||
  y_pos=start_y;
 | 
			
		||||
 | 
			
		||||
@ -1676,13 +1676,13 @@ void Draw_line_preview(short start_x,short start_y,short end_x,short end_y,byte
 | 
			
		||||
void Draw_line_preview_xor(short start_x,short start_y,short end_x,short end_y,byte color)
 | 
			
		||||
{
 | 
			
		||||
  int w, h;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Pixel_figure=(Func_pixel)Pixel_figure_preview_xor;
 | 
			
		||||
  // Needed a cast because this function supports signed shorts,
 | 
			
		||||
  // (it's usually in image space), while this time it's in screen space
 | 
			
		||||
  // and some line endpoints can be out of screen.
 | 
			
		||||
  Draw_line_general(start_x,start_y,end_x,end_y,color);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (start_x<Limit_left)
 | 
			
		||||
    start_x=Limit_left;
 | 
			
		||||
  if (start_y<Limit_top)
 | 
			
		||||
@ -1691,8 +1691,8 @@ void Draw_line_preview_xor(short start_x,short start_y,short end_x,short end_y,b
 | 
			
		||||
    end_x=Limit_left;
 | 
			
		||||
  if (end_y<Limit_top)
 | 
			
		||||
    end_y=Limit_top;
 | 
			
		||||
  // bottom & right limits are handled by Update_part_of_screen()  
 | 
			
		||||
  
 | 
			
		||||
  // bottom & right limits are handled by Update_part_of_screen()
 | 
			
		||||
 | 
			
		||||
  w = end_x-start_x;
 | 
			
		||||
  h = end_y-start_y;
 | 
			
		||||
  Update_part_of_screen((start_x<end_x)?start_x:end_x,(start_y<end_y)?start_y:end_y,abs(w)+1,abs(h)+1);
 | 
			
		||||
@ -1744,7 +1744,7 @@ void Draw_empty_rectangle(short start_x,short start_y,short end_x,short end_y,by
 | 
			
		||||
 | 
			
		||||
  // On trace le rectangle:
 | 
			
		||||
  Init_permanent_draw();
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  for (x_pos=start_x;x_pos<=end_x;x_pos++)
 | 
			
		||||
  {
 | 
			
		||||
    Pixel_figure_permanent(x_pos,start_y,color);
 | 
			
		||||
@ -1756,7 +1756,7 @@ void Draw_empty_rectangle(short start_x,short start_y,short end_x,short end_y,by
 | 
			
		||||
    Pixel_figure_permanent(start_x,y_pos,color);
 | 
			
		||||
    Pixel_figure_permanent(  end_x,y_pos,color);
 | 
			
		||||
  }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
#if defined(__macosx__) || defined(__FreeBSD__)
 | 
			
		||||
  Update_part_of_screen(start_x,end_x,end_x-start_x,end_y-start_y);
 | 
			
		||||
#endif
 | 
			
		||||
@ -2320,14 +2320,14 @@ void Draw_grad_rectangle(short rax,short ray,short rbx,short rby,short vax,short
 | 
			
		||||
      Gradient_total_range = sqrt(pow(vby - vay,2)+pow(vbx - vax,2));
 | 
			
		||||
      a = (float)(vby - vay)/(float)(vbx - vax);
 | 
			
		||||
      b = vay - a*vax;
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      for (y_pos=ray;y_pos<=rby;y_pos++)
 | 
			
		||||
        for (x_pos = rax;x_pos<=rbx;x_pos++)
 | 
			
		||||
        {
 | 
			
		||||
          // On calcule ou on en est dans le dégradé
 | 
			
		||||
          distance_x = pow((y_pos - vay),2)+pow((x_pos - vax),2);
 | 
			
		||||
          distance_y = pow((-a * x_pos + y_pos - b),2)/(a*a+1);
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
          Gradient_function((int)sqrt(distance_x - distance_y),x_pos,y_pos);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -2465,12 +2465,12 @@ void Polyfill_general(int vertices, short * points, int color)
 | 
			
		||||
  T_Polygon_edge *edge, *next_edge, *initial_edge;
 | 
			
		||||
  T_Polygon_edge *active_edges = NULL;
 | 
			
		||||
  T_Polygon_edge *inactive_edges = NULL;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (vertices < 1)
 | 
			
		||||
    return;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  top = bottom = points[1];
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  /* allocate some space and fill the edge table */
 | 
			
		||||
  initial_edge=edge=(T_Polygon_edge *) malloc(sizeof(T_Polygon_edge) * vertices);
 | 
			
		||||
 | 
			
		||||
@ -2581,7 +2581,7 @@ void Polyfill(int vertices, short * points, int color)
 | 
			
		||||
  // (pixels dessinés plus d'une fois) alors on force le FX Feedback à OFF
 | 
			
		||||
  Update_FX_feedback(0);
 | 
			
		||||
 | 
			
		||||
  Pixel_figure=Pixel_clipped;    
 | 
			
		||||
  Pixel_figure=Pixel_clipped;
 | 
			
		||||
  Polyfill_general(vertices,points,color);
 | 
			
		||||
 | 
			
		||||
  // Remarque: pour dessiner la bordure avec la brosse en cours au lieu
 | 
			
		||||
@ -2615,7 +2615,7 @@ void Replace(byte new_color)
 | 
			
		||||
    {
 | 
			
		||||
      word x;
 | 
			
		||||
      word y;
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      // Update all pixels
 | 
			
		||||
      for (y=0; y<Main_image_height; y++)
 | 
			
		||||
        for (x=0; x<Main_image_width; x++)
 | 
			
		||||
@ -2731,7 +2731,7 @@ byte No_effect(word x, word y, byte color)
 | 
			
		||||
{
 | 
			
		||||
  (void)x; // unused
 | 
			
		||||
  (void)y; // unused
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  return color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2740,7 +2740,7 @@ byte No_effect(word x, word y, byte color)
 | 
			
		||||
byte Effect_shade(word x,word y,byte color)
 | 
			
		||||
{
 | 
			
		||||
  (void)color; // unused
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  return Shade_table[Read_pixel_from_feedback_screen(x,y)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2796,7 +2796,7 @@ byte Effect_quick_shade(word x,word y,byte color)
 | 
			
		||||
byte Effect_tiling(word x,word y,byte color)
 | 
			
		||||
{
 | 
			
		||||
  (void)color; // unused
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  return Read_pixel_from_brush((x+Brush_width-Tiling_offset_X)%Brush_width,
 | 
			
		||||
                               (y+Brush_height-Tiling_offset_Y)%Brush_height);
 | 
			
		||||
}
 | 
			
		||||
@ -2919,7 +2919,7 @@ void Horizontal_grid_line(word x_pos,word y_pos,word width)
 | 
			
		||||
void Vertical_grid_line(word x_pos,word y_pos,word height)
 | 
			
		||||
{
 | 
			
		||||
  int y;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  for (y=!(y_pos&1);y<height;y+=2)
 | 
			
		||||
    Pixel(x_pos, y_pos+y, xor_lut[*(Screen_pixels+(x_pos*Pixel_width-1)+(y_pos*Pixel_height+y*Pixel_height)*VIDEO_LINE_WIDTH)]);
 | 
			
		||||
}
 | 
			
		||||
@ -2930,14 +2930,14 @@ void Redraw_grid(short x, short y, unsigned short w, unsigned short h)
 | 
			
		||||
  int row, col;
 | 
			
		||||
  if (!Show_grid)
 | 
			
		||||
    return;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  row=y+((Snap_height*1000-(y-0)/Main_magnifier_factor-Main_magnifier_offset_Y+Snap_offset_Y-1)%Snap_height)*Main_magnifier_factor+Main_magnifier_factor-1;
 | 
			
		||||
  while (row < y+h)
 | 
			
		||||
  {
 | 
			
		||||
    Horizontal_grid_line(x, row, w);
 | 
			
		||||
    row+= Snap_height*Main_magnifier_factor;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  col=x+((Snap_width*1000-(x-Main_X_zoom)/Main_magnifier_factor-Main_magnifier_offset_X+Snap_offset_X-1)%Snap_width)*Main_magnifier_factor+Main_magnifier_factor-1;
 | 
			
		||||
  while (col < x+w)
 | 
			
		||||
  {
 | 
			
		||||
@ -2948,23 +2948,23 @@ void Redraw_grid(short x, short y, unsigned short w, unsigned short h)
 | 
			
		||||
 | 
			
		||||
byte Read_pixel_from_current_screen  (word x,word y)
 | 
			
		||||
{
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  byte depth;
 | 
			
		||||
  byte color;
 | 
			
		||||
 | 
			
		||||
  if (Main_backups->Pages->Image_mode == IMAGE_MODE_ANIMATION)
 | 
			
		||||
  {
 | 
			
		||||
    return *((y)*Main_image_width+(x)+Main_backups->Pages->Image[Main_current_layer].Pixels);  
 | 
			
		||||
    return *((y)*Main_image_width+(x)+Main_backups->Pages->Image[Main_current_layer].Pixels);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (Main_backups->Pages->Image_mode == IMAGE_MODE_MODE5)  
 | 
			
		||||
 | 
			
		||||
  if (Main_backups->Pages->Image_mode == IMAGE_MODE_MODE5)
 | 
			
		||||
    if (Main_current_layer==4)
 | 
			
		||||
      return *(Main_backups->Pages->Image[Main_current_layer].Pixels + x+y*Main_image_width);
 | 
			
		||||
 | 
			
		||||
  color = *(Main_screen+y*Main_image_width+x);
 | 
			
		||||
  if (color != Main_backups->Pages->Transparent_color) // transparent color
 | 
			
		||||
    return color;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  depth = *(Main_visible_image_depth_buffer.Image+x+y*Main_image_width);
 | 
			
		||||
  return *(Main_backups->Pages->Image[depth].Pixels + x+y*Main_image_width);
 | 
			
		||||
}
 | 
			
		||||
@ -2992,7 +2992,7 @@ void Pixel_in_screen_layered(word x,word y,byte color)
 | 
			
		||||
    if (color == Main_backups->Pages->Transparent_color) // transparent color
 | 
			
		||||
      // fetch pixel color from the topmost visible layer
 | 
			
		||||
      color=*(Main_backups->Pages->Image[depth].Pixels + x+y*Main_image_width);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    *(x+y*Main_image_width+Main_screen)=color;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -3007,9 +3007,9 @@ void Pixel_in_screen_layered_with_preview(word x,word y,byte color)
 | 
			
		||||
    if (color == Main_backups->Pages->Transparent_color) // transparent color
 | 
			
		||||
      // fetch pixel color from the topmost visible layer
 | 
			
		||||
      color=*(Main_backups->Pages->Image[depth].Pixels + x+y*Main_image_width);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    *(x+y*Main_image_width+Main_screen)=color;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    Pixel_preview(x,y,color);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -3134,35 +3134,56 @@ void Pixel_in_screen_zx(word x,word y,byte color)
 | 
			
		||||
  uint8_t c1, c2;
 | 
			
		||||
 | 
			
		||||
  // The color we are going to replace
 | 
			
		||||
  c1 = *(Main_backups->Pages->Image[Main_current_layer].Pixels + x+y*Main_image_width);
 | 
			
		||||
  c1 = *(Main_backups->Pages->Image[Main_current_layer].Pixels
 | 
			
		||||
     + x + y * Main_image_width);
 | 
			
		||||
 | 
			
		||||
  if (c1 == color)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  // find if there is another color in the cell
 | 
			
		||||
  for (x2 = 0; x2 < 8; x2++)
 | 
			
		||||
  for (y2 = 0; y2 < 8; y2++)
 | 
			
		||||
  {
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels + (x2+start)+(y2+starty)*Main_image_width);
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels
 | 
			
		||||
       + (x2 + start) + (y2 + starty) * Main_image_width);
 | 
			
		||||
    // Pixel is already of the color we are going to add, it is no problem
 | 
			
		||||
    if (c2 == color)
 | 
			
		||||
      continue;
 | 
			
		||||
    // We have found another color, which is the one we will keep from the cell
 | 
			
		||||
    if (c2 != c1)
 | 
			
		||||
      goto done;
 | 
			
		||||
  }
 | 
			
		||||
done:
 | 
			
		||||
 | 
			
		||||
  if (c2 == c1 || c2 == color)
 | 
			
		||||
  if ((c2 == c1 || c2 == color))
 | 
			
		||||
  {
 | 
			
		||||
    // There was only one color, so we can add a second one.
 | 
			
		||||
    // There was only one color, so we can add a second one
 | 
			
		||||
 | 
			
		||||
    // First make sure we have a single brightness
 | 
			
		||||
    if ((c2 & 8) != (color & 8))
 | 
			
		||||
    {
 | 
			
		||||
      for (x2 = 0; x2 < 8; x2++)
 | 
			
		||||
      for (y2 = 0; y2 < 8; y2++)
 | 
			
		||||
      {
 | 
			
		||||
        Pixel_in_screen_layered(x2+start,y2+starty,c2 ^ 8);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Pixel_in_screen_layered(x,y,color);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Now replace all pixels which are of color c1, with color c2
 | 
			
		||||
  for (x2 = 0; x2 < 8; x2++)
 | 
			
		||||
  for (y2 = 0; y2 < 8; y2++)
 | 
			
		||||
  {
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels + (x2+start)+(y2+starty)*Main_image_width);
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels
 | 
			
		||||
       + (x2 + start) + (y2 + starty) * Main_image_width);
 | 
			
		||||
    if (c2 == c1) {
 | 
			
		||||
      Pixel_in_screen_layered(x2+start,y2+starty,color);
 | 
			
		||||
    } else {
 | 
			
		||||
      // Force the brightness bit
 | 
			
		||||
      Pixel_in_screen_layered(x2+start,y2+starty,(c2 & ~8) | (color & 8));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -3175,7 +3196,8 @@ void Pixel_in_screen_zx_with_preview(word x,word y,byte color)
 | 
			
		||||
  uint8_t c1, c2;
 | 
			
		||||
 | 
			
		||||
  // The color we are going to replace
 | 
			
		||||
  c1 = *(Main_backups->Pages->Image[Main_current_layer].Pixels + x+y*Main_image_width);
 | 
			
		||||
  c1 = *(Main_backups->Pages->Image[Main_current_layer].Pixels
 | 
			
		||||
     + x + y * Main_image_width);
 | 
			
		||||
 | 
			
		||||
  // Pixel is already of the wanted color: nothing to do
 | 
			
		||||
  if (c1 == color)
 | 
			
		||||
@ -3185,7 +3207,8 @@ void Pixel_in_screen_zx_with_preview(word x,word y,byte color)
 | 
			
		||||
  for (x2 = 0; x2 < 8; x2++)
 | 
			
		||||
  for (y2 = 0; y2 < 8; y2++)
 | 
			
		||||
  {
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels + (x2+start)+(y2+starty)*Main_image_width);
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels
 | 
			
		||||
       + (x2 + start) + (y2 + starty) * Main_image_width);
 | 
			
		||||
    // Pixel is already of the color we are going to add, it is no problem
 | 
			
		||||
    if (c2 == color)
 | 
			
		||||
      continue;
 | 
			
		||||
@ -3195,20 +3218,35 @@ void Pixel_in_screen_zx_with_preview(word x,word y,byte color)
 | 
			
		||||
  }
 | 
			
		||||
done:
 | 
			
		||||
 | 
			
		||||
  if (c2 == c1 || c2 == color)
 | 
			
		||||
  if ((c2 == c1 || c2 == color))
 | 
			
		||||
  {
 | 
			
		||||
    // There was only one color, so we can add a second one.
 | 
			
		||||
    // There was only one color, so we can add a second one
 | 
			
		||||
 | 
			
		||||
    // First make sure we have a single brightness
 | 
			
		||||
    if ((c2 & 8) != (color & 8))
 | 
			
		||||
    {
 | 
			
		||||
      for (x2 = 0; x2 < 8; x2++)
 | 
			
		||||
      for (y2 = 0; y2 < 8; y2++)
 | 
			
		||||
      {
 | 
			
		||||
        Pixel_in_screen_layered_with_preview(x2+start,y2+starty,c2 ^ 8);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Pixel_in_screen_layered_with_preview(x,y,color);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Replace all C1 with C2
 | 
			
		||||
  // Replace all C1 with color
 | 
			
		||||
  for (x2 = 0; x2 < 8; x2++)
 | 
			
		||||
  for (y2 = 0; y2 < 8; y2++)
 | 
			
		||||
  {
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels + (x2+start)+(y2+starty)*Main_image_width);
 | 
			
		||||
    c2 = *(Main_backups->Pages->Image[Main_current_layer].Pixels
 | 
			
		||||
       + (x2 + start) + (y2 + starty) * Main_image_width);
 | 
			
		||||
    if (c2 == c1) {
 | 
			
		||||
      Pixel_in_screen_layered_with_preview(x2+start,y2+starty,color);
 | 
			
		||||
    } else {
 | 
			
		||||
      // Force the brightness bit
 | 
			
		||||
      Pixel_in_screen_layered_with_preview(x2+start,y2+starty,(c2 & ~8) | (color & 8));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -3217,12 +3255,12 @@ done:
 | 
			
		||||
void Pixel_in_screen_underlay(word x,word y,byte color)
 | 
			
		||||
{
 | 
			
		||||
  byte depth;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  // Paste in layer
 | 
			
		||||
  *(Main_backups->Pages->Image[Main_current_layer].Pixels + x+y*Main_image_width)=color;
 | 
			
		||||
  // Search depth
 | 
			
		||||
  depth = *(Main_backups->Pages->Image[4].Pixels + x+y*Main_image_width);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if ( depth == Main_current_layer)
 | 
			
		||||
  {
 | 
			
		||||
    // Draw that color on the visible image buffer
 | 
			
		||||
@ -3234,17 +3272,17 @@ void Pixel_in_screen_underlay(word x,word y,byte color)
 | 
			
		||||
void Pixel_in_screen_underlay_with_preview(word x,word y,byte color)
 | 
			
		||||
{
 | 
			
		||||
  byte depth;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  // Paste in layer
 | 
			
		||||
  *(Main_backups->Pages->Image[Main_current_layer].Pixels + x+y*Main_image_width)=color;
 | 
			
		||||
  // Search depth
 | 
			
		||||
  depth = *(Main_backups->Pages->Image[4].Pixels + x+y*Main_image_width);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if ( depth == Main_current_layer)
 | 
			
		||||
  {
 | 
			
		||||
    // Draw that color on the visible image buffer
 | 
			
		||||
    *(x+y*Main_image_width+Main_screen)=color;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    Pixel_preview(x,y,color);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -3259,8 +3297,8 @@ void Pixel_in_screen_overlay(word x,word y,byte color)
 | 
			
		||||
    // Paste in depth buffer
 | 
			
		||||
    *(Main_visible_image_depth_buffer.Image+x+y*Main_image_width)=color;
 | 
			
		||||
    // Fetch pixel color from the target raster layer
 | 
			
		||||
	if (Main_layers_visible & (1 << color))
 | 
			
		||||
    	color=*(Main_backups->Pages->Image[color].Pixels + x+y*Main_image_width);
 | 
			
		||||
    if (Main_layers_visible & (1 << color))
 | 
			
		||||
        color=*(Main_backups->Pages->Image[color].Pixels + x+y*Main_image_width);
 | 
			
		||||
    // Draw that color on the visible image buffer
 | 
			
		||||
    *(x+y*Main_image_width+Main_screen)=color;
 | 
			
		||||
  }
 | 
			
		||||
@ -3276,11 +3314,11 @@ void Pixel_in_screen_overlay_with_preview(word x,word y,byte color)
 | 
			
		||||
    // Paste in depth buffer
 | 
			
		||||
    *(Main_visible_image_depth_buffer.Image+x+y*Main_image_width)=color;
 | 
			
		||||
    // Fetch pixel color from the target raster layer
 | 
			
		||||
	if (Main_layers_visible & (1 << color))
 | 
			
		||||
    	color=*(Main_backups->Pages->Image[color].Pixels + x+y*Main_image_width);
 | 
			
		||||
    if (Main_layers_visible & (1 << color))
 | 
			
		||||
        color=*(Main_backups->Pages->Image[color].Pixels + x+y*Main_image_width);
 | 
			
		||||
    // Draw that color on the visible image buffer
 | 
			
		||||
    *(x+y*Main_image_width+Main_screen)=color;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    Pixel_preview(x,y,color);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user