add Pixel_in_layer() and Read_pixel_from_layer()
To access another layer than the current layer
This commit is contained in:
		
							parent
							
								
									1bffaacead
								
							
						
					
					
						commit
						7b21ac8a90
					
				
							
								
								
									
										86
									
								
								src/graph.c
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								src/graph.c
									
									
									
									
									
								
							@ -3164,7 +3164,7 @@ byte Effect_layer_copy(word x,word y,byte color)
 | 
			
		||||
{
 | 
			
		||||
  if (color<Main.backups->Pages->Nb_layers)
 | 
			
		||||
  {
 | 
			
		||||
    return *((y)*Main.image_width+(x)+Main.backups->Pages->Image[color].Pixels);
 | 
			
		||||
    return Read_pixel_from_layer(color, x, y);
 | 
			
		||||
  }
 | 
			
		||||
  return Read_pixel_from_feedback_screen(x,y);
 | 
			
		||||
}
 | 
			
		||||
@ -3227,7 +3227,7 @@ byte Read_pixel_from_current_screen  (word x,word y)
 | 
			
		||||
    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);
 | 
			
		||||
  return Read_pixel_from_layer(depth, x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Paint a a single pixel in image and optionnaly on screen: as-is.
 | 
			
		||||
@ -3247,7 +3247,7 @@ static void Pixel_in_screen_layered_with_opt_preview(word x,word y,byte color, i
 | 
			
		||||
  {
 | 
			
		||||
    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);
 | 
			
		||||
      color = Read_pixel_from_layer(depth, x, y);
 | 
			
		||||
 | 
			
		||||
    *(x+y*Main.image_width+Main_screen)=color;
 | 
			
		||||
 | 
			
		||||
@ -3490,7 +3490,7 @@ static void Pixel_in_screen_underlay_with_opt_preview(word x,word y,byte color,i
 | 
			
		||||
  // Paste in layer
 | 
			
		||||
  Pixel_in_current_layer(x, y, color);
 | 
			
		||||
  // Search depth
 | 
			
		||||
  depth = *(Main.backups->Pages->Image[4].Pixels + x+y*Main.image_width);
 | 
			
		||||
  depth = Read_pixel_from_layer(4, x, y);
 | 
			
		||||
 | 
			
		||||
  if ( depth == Main.current_layer)
 | 
			
		||||
  {
 | 
			
		||||
@ -3520,7 +3520,7 @@ static void Pixel_in_screen_overlay_with_opt_preview(word x,word y,byte color,in
 | 
			
		||||
    // search for this color in the 4 defined inks
 | 
			
		||||
    for (ink = 0; ink < 4; ink++)
 | 
			
		||||
    {
 | 
			
		||||
      if (color == Main.backups->Pages->Image[ink].Pixels[x+y*Main.image_width])
 | 
			
		||||
      if (color == Read_pixel_from_layer(ink, x, y))
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    if (ink >= 4)
 | 
			
		||||
@ -3533,7 +3533,7 @@ static void Pixel_in_screen_overlay_with_opt_preview(word x,word y,byte color,in
 | 
			
		||||
  *(Main_visible_image_depth_buffer.Image+x+y*Main.image_width) = ink;
 | 
			
		||||
  // Fetch pixel color from the target raster layer
 | 
			
		||||
  if (Main.layers_visible & (1 << ink))
 | 
			
		||||
    color=*(Main.backups->Pages->Image[ink].Pixels + x+y*Main.image_width);
 | 
			
		||||
    color = Read_pixel_from_layer(ink, x, y);
 | 
			
		||||
  else
 | 
			
		||||
    color = ink;
 | 
			
		||||
 | 
			
		||||
@ -3544,6 +3544,64 @@ static void Pixel_in_screen_overlay_with_opt_preview(word x,word y,byte color,in
 | 
			
		||||
    Pixel_preview(x,y,color);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Paint a pixel in HGR mode in the monochrome layer
 | 
			
		||||
///
 | 
			
		||||
/// - Layer 1 is the monochrome screen. Pixels are either black or white. 2 different values to reflect high bit
 | 
			
		||||
/// - Layer 2 is the screen seen as color
 | 
			
		||||
static void Pixel_in_screen_hgr_mono_with_opt_preview(word x,word y,byte color,int preview)
 | 
			
		||||
{
 | 
			
		||||
  word column;
 | 
			
		||||
  word x2;
 | 
			
		||||
 | 
			
		||||
  if (color >= 8)
 | 
			
		||||
    return;
 | 
			
		||||
  if ((color & 3) != 0)
 | 
			
		||||
    color |= 3; // force black or white.
 | 
			
		||||
 | 
			
		||||
  // put pixel
 | 
			
		||||
  if (color == Read_pixel_from_layer(0, x, y))
 | 
			
		||||
    return; // nothing to do !
 | 
			
		||||
  Pixel_in_layer_with_opt_preview(0, x, y, color, preview);
 | 
			
		||||
  column = x / 7;
 | 
			
		||||
  // update the palette bit of the whole column (byte)
 | 
			
		||||
  for (x2 = column * 7; x2 < column * 7 + 7; x2++)
 | 
			
		||||
  {
 | 
			
		||||
    byte pixel = Read_pixel_from_layer(0, x2, y);
 | 
			
		||||
    if ((pixel & 4) != (color & 4)) // palettes are different
 | 
			
		||||
      Pixel_in_layer_with_opt_preview(0, x2, y, (color & 4) | (pixel & 3), preview);
 | 
			
		||||
  }
 | 
			
		||||
  // update color pixels !
 | 
			
		||||
  for (x2 = (column * 7) & ~1; x2 < column * 7 + 7; x2 += 2)
 | 
			
		||||
  {
 | 
			
		||||
    byte b2, b1, b0;
 | 
			
		||||
    b2 = (x2 > 0) ? Read_pixel_from_layer(0, x2 - 1, y) : 0;
 | 
			
		||||
    b1 = Read_pixel_from_layer(0, x2, y);
 | 
			
		||||
    b0 = Read_pixel_from_layer(0, x2 + 1, y);
 | 
			
		||||
    color = (b1 & 6) | (b0 & 1);
 | 
			
		||||
    if ((b2 & 3) && (b1 & 3))
 | 
			
		||||
    {
 | 
			
		||||
      // two consecutive 1 : force white
 | 
			
		||||
      Pixel_in_layer_with_opt_preview(1, x2 - 1, y, b2 | 3, preview);
 | 
			
		||||
      Pixel_in_layer_with_opt_preview(1, x2, y, color | 3, preview);
 | 
			
		||||
    }
 | 
			
		||||
    else //if (color != Read_pixel_from_layer(1, x2, y)) // depth buffer looks badly initialized, so we need to force putpixel :(
 | 
			
		||||
      Pixel_in_layer_with_opt_preview(1, x2, y, color, preview);
 | 
			
		||||
 | 
			
		||||
    //if (color != Read_pixel_from_layer(1, x2 + 1, y))
 | 
			
		||||
      Pixel_in_layer_with_opt_preview(1, x2 + 1, y, color, preview);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Paint in the color layer of HGR.
 | 
			
		||||
///
 | 
			
		||||
/// In fact we just write the two monochrome pixels
 | 
			
		||||
static void Pixel_in_screen_hgr_color_with_opt_preview(word x,word y,byte color,int preview)
 | 
			
		||||
{
 | 
			
		||||
  x &= ~1;
 | 
			
		||||
  Pixel_in_screen_hgr_mono_with_opt_preview(x, y, color & 6, preview);      // palette bit(4) + upper bit(2)
 | 
			
		||||
  Pixel_in_screen_hgr_mono_with_opt_preview(x + 1, y, color & 5, preview);  // palette bit(4) + lower bit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// end of constraints group
 | 
			
		||||
/// @}
 | 
			
		||||
 | 
			
		||||
@ -3572,10 +3630,22 @@ void Pixel_in_current_layer(word x,word y, byte color)
 | 
			
		||||
  Pixel_in_document_current_layer(&Main, x, y, color);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// put a pixel in a specific layer of Main Page
 | 
			
		||||
void Pixel_in_layer(int layer, word x,word y, byte color)
 | 
			
		||||
{
 | 
			
		||||
  T_Document * doc = &Main;
 | 
			
		||||
  doc->backups->Pages->Image[layer].Pixels[x + y*doc->image_width] = color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
byte Read_pixel_from_current_layer(word x,word y)
 | 
			
		||||
{
 | 
			
		||||
  // return Main.backups->Pages->Image[Main.current_layer].Pixels[x + y*Main.image_width];
 | 
			
		||||
  return *((y)*Main.image_width+(x)+Main.backups->Pages->Image[Main.current_layer].Pixels);
 | 
			
		||||
  return Read_pixel_from_layer(Main.current_layer, x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Read a pixel from a specific layer of Main Page
 | 
			
		||||
byte Read_pixel_from_layer(int layer, word x,word y)
 | 
			
		||||
{
 | 
			
		||||
  return Main.backups->Pages->Image[layer].Pixels[x + y*Main.image_width];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Update_pixel_renderer(void)
 | 
			
		||||
 | 
			
		||||
@ -130,8 +130,11 @@ void Redraw_grid(short x, short y, unsigned short w, unsigned short h);
 | 
			
		||||
 | 
			
		||||
void Pixel_in_spare(word x,word y, byte color);
 | 
			
		||||
void Pixel_in_current_layer(word x,word y, byte color);
 | 
			
		||||
void Pixel_in_layer(int layer, word x,word y, byte color);
 | 
			
		||||
byte Read_pixel_from_current_screen  (word x,word y);
 | 
			
		||||
byte Read_pixel_from_current_layer(word x,word y);
 | 
			
		||||
byte Read_pixel_from_layer(int layer, word x,word y);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Paint a single pixel in image only.
 | 
			
		||||
#define Pixel_in_current_screen(x,y,c) Pixel_in_current_screen_with_opt_preview(x,y,c,0)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user