Histogram: Shows pixel count, and selects the clicked color.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1563 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
		
							parent
							
								
									b7a083ee92
								
							
						
					
					
						commit
						684034c687
					
				
							
								
								
									
										139
									
								
								src/palette.c
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								src/palette.c
									
									
									
									
									
								
							@ -766,11 +766,16 @@ void Draw_all_palette_sliders(T_Scroller_button * red_slider,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Window_Histogram(unsigned char block_start, unsigned char block_end, dword* color_usage)
 | 
			
		||||
int Window_Histogram(unsigned char block_start, unsigned char block_end, dword* color_usage)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  unsigned int max_count = 0;
 | 
			
		||||
  int old_height=0;
 | 
			
		||||
  int hovered_color=-1;
 | 
			
		||||
  int new_hovered_color;
 | 
			
		||||
  int bar_width;
 | 
			
		||||
  T_Special_button *histo;
 | 
			
		||||
  int clicked_button;
 | 
			
		||||
 | 
			
		||||
  /* Draws an histogram of the selected range in a separate window */
 | 
			
		||||
  
 | 
			
		||||
@ -790,15 +795,21 @@ void Window_Histogram(unsigned char block_start, unsigned char block_end, dword*
 | 
			
		||||
    if(color_usage[i] > max_count) max_count = color_usage[i];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (max_count == 0) {
 | 
			
		||||
  if (max_count == 0)
 | 
			
		||||
  {
 | 
			
		||||
    Warning_message("All these colors are unused!");
 | 
			
		||||
    return;
 | 
			
		||||
    Hide_cursor();
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  Open_window(263, 150, "Histogram");
 | 
			
		||||
  Window_set_normal_button(120, 130, 42, 14, "Close",-1,1,SDLK_RETURN);
 | 
			
		||||
 | 
			
		||||
  Open_window(263, 140, "Histogram");
 | 
			
		||||
  Window_set_normal_button(120, 120, 42, 14, "Close",-1,1,SDLK_RETURN);
 | 
			
		||||
  Print_in_window(6, 17, "Color:", MC_Dark, MC_Light);
 | 
			
		||||
  Print_in_window(110+12*8, 17, "Pixels", MC_Dark, MC_Light);
 | 
			
		||||
 | 
			
		||||
  // Step 2 : draw bars
 | 
			
		||||
  bar_width=256/(block_end-block_start+1);
 | 
			
		||||
  j = 0;
 | 
			
		||||
  for(i=block_start; i<= block_end; i++) {
 | 
			
		||||
    int height = 100*color_usage[i]/max_count;
 | 
			
		||||
@ -810,30 +821,30 @@ void Window_Histogram(unsigned char block_start, unsigned char block_end, dword*
 | 
			
		||||
        height=1;
 | 
			
		||||
        
 | 
			
		||||
      Window_rectangle(
 | 
			
		||||
            3+j*(256/(block_end-block_start+1)),
 | 
			
		||||
            117-height,
 | 
			
		||||
            256/(block_end-block_start+1),
 | 
			
		||||
            3+j*bar_width,
 | 
			
		||||
            127-height,
 | 
			
		||||
            bar_width,
 | 
			
		||||
            height, i);
 | 
			
		||||
    
 | 
			
		||||
      //if (i == MC_Light) {
 | 
			
		||||
        Window_rectangle(
 | 
			
		||||
              3+j*(256/(block_end-block_start+1)),
 | 
			
		||||
              116-height,
 | 
			
		||||
              256/(block_end-block_start+1),
 | 
			
		||||
              3+j*bar_width,
 | 
			
		||||
              126-height,
 | 
			
		||||
              bar_width,
 | 
			
		||||
              1,MC_Black);
 | 
			
		||||
      //}
 | 
			
		||||
    }
 | 
			
		||||
    // vertical outline
 | 
			
		||||
    if (height>old_height)
 | 
			
		||||
      Window_rectangle(
 | 
			
		||||
              2+j*(256/(block_end-block_start+1)),
 | 
			
		||||
              116-height,
 | 
			
		||||
              2+j*bar_width,
 | 
			
		||||
              126-height,
 | 
			
		||||
              1,
 | 
			
		||||
              height-old_height+1,MC_Black);
 | 
			
		||||
    else if (old_height>height)
 | 
			
		||||
      Window_rectangle(
 | 
			
		||||
              3+j*(256/(block_end-block_start+1)),
 | 
			
		||||
              116-old_height,
 | 
			
		||||
              3+j*bar_width,
 | 
			
		||||
              126-old_height,
 | 
			
		||||
              1,
 | 
			
		||||
              old_height-height+1,MC_Black);
 | 
			
		||||
      
 | 
			
		||||
@ -844,16 +855,71 @@ void Window_Histogram(unsigned char block_start, unsigned char block_end, dword*
 | 
			
		||||
  if (old_height!=0)
 | 
			
		||||
  Window_rectangle(
 | 
			
		||||
      3+j*(256/(block_end-block_start+1)),
 | 
			
		||||
      116-old_height,
 | 
			
		||||
      126-old_height,
 | 
			
		||||
      1,
 | 
			
		||||
      old_height+1,MC_Black);
 | 
			
		||||
 | 
			
		||||
  Update_window_area(0,0,263,140);
 | 
			
		||||
  Display_cursor();
 | 
			
		||||
  histo = Window_set_special_button(3, 27, j*bar_width, 100); // 2
 | 
			
		||||
 | 
			
		||||
  while(Window_clicked_button() != 1 && Key != KEY_ESC);
 | 
			
		||||
  Close_window();
 | 
			
		||||
  Update_window_area(0,0,263,150);
 | 
			
		||||
  Display_cursor();
 | 
			
		||||
  do
 | 
			
		||||
  {
 | 
			
		||||
    // Find hovered area
 | 
			
		||||
    if (Window_click_in_rectangle(histo->Pos_X,histo->Pos_Y,histo->Pos_X+histo->Width-1,histo->Pos_Y+histo->Height-1))
 | 
			
		||||
    {
 | 
			
		||||
      short x_pos;
 | 
			
		||||
      x_pos=((short)Mouse_X-Window_pos_X)/Menu_factor_X;
 | 
			
		||||
      new_hovered_color=block_start+(x_pos-histo->Pos_X)/bar_width;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
      new_hovered_color=-1;
 | 
			
		||||
    
 | 
			
		||||
    // When changing hovered color, update the info area
 | 
			
		||||
    if (new_hovered_color!=hovered_color)
 | 
			
		||||
    {
 | 
			
		||||
      char str[12];
 | 
			
		||||
      
 | 
			
		||||
      hovered_color=new_hovered_color;
 | 
			
		||||
      Hide_cursor();
 | 
			
		||||
      if (hovered_color==-1)
 | 
			
		||||
      {
 | 
			
		||||
        Window_rectangle(6+6*8,17,3*8,7,MC_Light);
 | 
			
		||||
        Update_window_area(6+6*8,17,3*8,7);
 | 
			
		||||
        Window_rectangle(86,17,2*8,8,MC_Light);
 | 
			
		||||
        Update_window_area(86,17,2*8,8);
 | 
			
		||||
        Window_rectangle(110,17,11*8,7,MC_Light);
 | 
			
		||||
        Update_window_area(110,17,11*8,7);
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        Num2str(hovered_color,str  ,3);
 | 
			
		||||
        Print_in_window(6+6*8,17,str,MC_Black,MC_Light);
 | 
			
		||||
        Window_rectangle(86,17,2*8,8,hovered_color);
 | 
			
		||||
        Update_window_area(86,17,2*8,8);
 | 
			
		||||
        Num2str(color_usage[hovered_color],str  ,11);
 | 
			
		||||
        Print_in_window(110,17,str,MC_Black,MC_Light);
 | 
			
		||||
      }
 | 
			
		||||
      Display_cursor();
 | 
			
		||||
    }
 | 
			
		||||
    clicked_button=Window_clicked_button();
 | 
			
		||||
    if (Key == KEY_ESC)
 | 
			
		||||
      clicked_button=1;
 | 
			
		||||
      
 | 
			
		||||
  } while( clicked_button < 1);
 | 
			
		||||
  Close_window();
 | 
			
		||||
  
 | 
			
		||||
  if (clicked_button==2)
 | 
			
		||||
  {
 | 
			
		||||
    // This is a counter-hack. Close_window() sets Mouse_K to zero
 | 
			
		||||
    // on exit, I don't know why (It will become 1 again if you move
 | 
			
		||||
    // the mouse slightly)
 | 
			
		||||
    // Here I force it back to 1, so that the Wait_end_of_click()
 | 
			
		||||
    // will really wait for a release of mouse button.
 | 
			
		||||
    Mouse_K=1;
 | 
			
		||||
    return hovered_color;  
 | 
			
		||||
  }
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Print_RGB_or_HSL(byte mode)
 | 
			
		||||
@ -2289,8 +2355,39 @@ void Button_Palette(void)
 | 
			
		||||
      break;
 | 
			
		||||
      
 | 
			
		||||
      case 25: // Number of colors used: Open histogram
 | 
			
		||||
        Window_Histogram(block_start, block_end, color_usage);
 | 
			
		||||
      {
 | 
			
		||||
        int selected_col;
 | 
			
		||||
        
 | 
			
		||||
        selected_col=Window_Histogram(block_start, block_end, color_usage);
 | 
			
		||||
        if (selected_col!=-1)
 | 
			
		||||
        {
 | 
			
		||||
          // Tag selected color
 | 
			
		||||
          Fore_color=first_color=last_color=block_start=block_end=selected_col;
 | 
			
		||||
          Tag_color_range(block_start,block_end);
 | 
			
		||||
      
 | 
			
		||||
          // Affichage du n° de la couleur sélectionnée
 | 
			
		||||
          Window_rectangle(COLOR_X,COLOR_Y,56,7,MC_Light);
 | 
			
		||||
          Num2str(Fore_color,str,3);
 | 
			
		||||
          Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
 | 
			
		||||
          Update_window_area(COLOR_X,COLOR_Y,56,7);
 | 
			
		||||
      
 | 
			
		||||
          // Affichage des jauges
 | 
			
		||||
          Window_rectangle(NUMERIC_R_X,NUMERIC_Y,72,7,MC_Light);
 | 
			
		||||
          Display_sliders(red_slider,green_slider,blue_slider,0,working_palette);
 | 
			
		||||
      
 | 
			
		||||
          // Affichage dans le block de visu de la couleur en cours
 | 
			
		||||
          Window_rectangle(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,Fore_color);
 | 
			
		||||
          Update_window_area(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H);
 | 
			
		||||
      
 | 
			
		||||
          memcpy(backup_palette    ,working_palette,sizeof(T_Palette));
 | 
			
		||||
          memcpy(temp_palette,working_palette,sizeof(T_Palette));
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        Display_cursor();
 | 
			
		||||
        Input_sticky_control=0;
 | 
			
		||||
        Wait_end_of_click();
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user