Fix issue 384: Imprecise palette sliders when RGB scale is lower than 256 (but bigger than 3)

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1606 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2010-09-06 23:33:50 +00:00
parent 25f8942641
commit 730903251c

View File

@ -72,13 +72,36 @@ int Get_palette_RGB_scale(void)
return RGB_scale; return RGB_scale;
} }
///
/// Round a 0-255 RGB component according to the RGB_scale.
/// The result is also in the 0-255 range.
byte Round_palette_component(byte comp) byte Round_palette_component(byte comp)
{ {
return ((comp+128/RGB_scale)*(RGB_scale-1)/255*255+(RGB_scale&1?1:0))/(RGB_scale-1); return ((comp+128/RGB_scale)*(RGB_scale-1)/255*255+(RGB_scale&1?1:0))/(RGB_scale-1);
} }
///
/// Turns a RGB component from 0-255 scale to 0-(RGB_scale-1).
/// The passed value should come from Round_palette_component(),
/// otherwise the rounding will be "down".
int Reduce_component(int comp)
{
return (comp)*255/Color_max;
}
///
/// Turns a RGB component from 0-(RGB_scale-1) to 0-255.
int Expand_component(int comp)
{
if (Color_max==255)
return comp;
return (comp+1)*Color_max/255;
// The +1 cancel any rounding down, the above test prevents
// the only case where it would be too much.
}
// Définir les unités pour les graduations R G B ou H S V // Définir les unités pour les graduations R G B ou H S V
void Componant_unit(int count) void Component_unit(int count)
{ {
Color_count = count; Color_count = count;
Color_max = count-1; Color_max = count-1;
@ -142,7 +165,7 @@ void Set_blue(byte color, short new_color, T_Palette palette)
palette[color].B=new_color; palette[color].B=new_color;
} }
void Format_componant(byte value, char *str) void Format_component(byte value, char *str)
// Formate une chaine de 4 caractères+\0 : "nnn " // Formate une chaine de 4 caractères+\0 : "nnn "
{ {
Num2str(value,str,3); Num2str(value,str,3);
@ -709,12 +732,12 @@ void Display_sliders(T_Scroller_button * red_slider,
RGB_to_HSL(j1,j2,j3,&j1,&j2,&j3); RGB_to_HSL(j1,j2,j3,&j1,&j2,&j3);
} }
Format_componant(j1*Color_count/256,str); Format_component(j1*Color_count/256,str);
Set_palette_slider(red_slider,Color_count,Color_max-j1*Color_max/255,str,NUMERIC_R_X); Set_palette_slider(red_slider,Color_count,Color_max-Expand_component(j1),str,NUMERIC_R_X);
Format_componant(j2*Color_count/256,str); Format_component(j2*Color_count/256,str);
Set_palette_slider(green_slider,Color_count,Color_max-j2*Color_max/255,str,NUMERIC_G_X); Set_palette_slider(green_slider,Color_count,Color_max-Expand_component(j2),str,NUMERIC_G_X);
Format_componant(j3*Color_count/256,str); Format_component(j3*Color_count/256,str);
Set_palette_slider(blue_slider,Color_count,Color_max-j3*Color_max/255,str,NUMERIC_B_X); Set_palette_slider(blue_slider,Color_count,Color_max-Expand_component(j3),str,NUMERIC_B_X);
} }
} }
@ -754,18 +777,18 @@ void Draw_all_palette_sliders(T_Scroller_button * red_slider,
RGB_to_HSL(j1,j2,j3,&j1,&j2,&j3); RGB_to_HSL(j1,j2,j3,&j1,&j2,&j3);
} }
DEBUG("j1",j1); DEBUG("j1",j1);
Format_componant(j1*Color_count/256,str); Format_component(j1*Color_count/256,str);
red_slider->Position=Color_max-j1*Color_max/255; red_slider->Position=Color_max-Expand_component(j1);
Window_draw_slider(red_slider); Window_draw_slider(red_slider);
Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light);
Format_componant(j2*Color_count/256,str); Format_component(j2*Color_count/256,str);
green_slider->Position=Color_max-j2*Color_max/255; green_slider->Position=Color_max-Expand_component(j2);
Window_draw_slider(green_slider); Window_draw_slider(green_slider);
Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light);
Format_componant(j3*Color_count/256,str); Format_component(j3*Color_count/256,str);
blue_slider->Position=Color_max-j3*Color_max/255; blue_slider->Position=Color_max-Expand_component(j3);
Window_draw_slider(blue_slider); Window_draw_slider(blue_slider);
Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
@ -1014,7 +1037,7 @@ void Button_Palette(void)
temp_palette=(T_Components *)malloc(sizeof(T_Palette)); temp_palette=(T_Components *)malloc(sizeof(T_Palette));
working_palette=(T_Components *)malloc(sizeof(T_Palette)); working_palette=(T_Components *)malloc(sizeof(T_Palette));
Componant_unit(RGB_scale); Component_unit(RGB_scale);
Open_window(299, 188,"Palette"); Open_window(299, 188,"Palette");
@ -1037,16 +1060,16 @@ void Button_Palette(void)
Window_rectangle(207,138,17,1,MC_Dark); Window_rectangle(207,138,17,1,MC_Dark);
Window_rectangle(234,138,17,1,MC_Dark); Window_rectangle(234,138,17,1,MC_Dark);
// Jauges de couleur // Jauges de couleur
red_slider = Window_set_scroller_button(183, 79, 88,Color_count,1,Color_max-working_palette[Fore_color].R*Color_max/255);// 2 red_slider = Window_set_scroller_button(183, 79, 88,Color_count,1,Color_max-Reduce_component(working_palette[Fore_color].R));// 2
green_slider = Window_set_scroller_button(210, 79, 88,Color_count,1,Color_max-working_palette[Fore_color].G*Color_max/255);// 3 green_slider = Window_set_scroller_button(210, 79, 88,Color_count,1,Color_max-Reduce_component(working_palette[Fore_color].G));// 3
blue_slider = Window_set_scroller_button(237, 79, 88,Color_count,1,Color_max-working_palette[Fore_color].B*Color_max/255);// 4 blue_slider = Window_set_scroller_button(237, 79, 88,Color_count,1,Color_max-Reduce_component(working_palette[Fore_color].B));// 4
if(Palette_view_is_RGB==1) { if(Palette_view_is_RGB==1) {
Print_RGB_or_HSL(0); Print_RGB_or_HSL(0);
Componant_unit(RGB_scale); Component_unit(RGB_scale);
} else { } else {
Print_RGB_or_HSL(1); Print_RGB_or_HSL(1);
Componant_unit(256); Component_unit(256);
} }
first_color=last_color=block_start=block_end=Fore_color; first_color=last_color=block_start=block_end=Fore_color;
@ -1318,8 +1341,8 @@ void Button_Palette(void)
{ {
if(Palette_view_is_RGB) if(Palette_view_is_RGB)
{ {
Set_red(Fore_color,(Color_max-red_slider->Position)*255/Color_max,working_palette); Set_red(Fore_color,Reduce_component(Color_max-red_slider->Position),working_palette);
Format_componant((working_palette[Fore_color].R)*Color_count/256,str); Format_component((working_palette[Fore_color].R)*Color_count/256,str);
} }
else else
{ {
@ -1330,7 +1353,7 @@ void Button_Palette(void)
&working_palette[Fore_color].R, &working_palette[Fore_color].R,
&working_palette[Fore_color].G, &working_palette[Fore_color].G,
&working_palette[Fore_color].B); &working_palette[Fore_color].B);
Format_componant((int)255-red_slider->Position,str); Format_component((int)255-red_slider->Position,str);
} }
Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
@ -1339,7 +1362,7 @@ void Button_Palette(void)
if(Palette_view_is_RGB) if(Palette_view_is_RGB)
{ {
for (i=block_start; i<=block_end; i++) for (i=block_start; i<=block_end; i++)
Set_red(i,temp_palette[i].R+(Color_max-red_slider->Position)*255/Color_max,working_palette); Set_red(i,temp_palette[i].R+Reduce_component(Color_max-red_slider->Position),working_palette);
} }
else else
{ {
@ -1386,8 +1409,8 @@ void Button_Palette(void)
{ {
if(Palette_view_is_RGB) if(Palette_view_is_RGB)
{ {
Set_green (Fore_color,(Color_max-green_slider->Position)*255/Color_max,working_palette); Set_green (Fore_color,Reduce_component(Color_max-green_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].G*Color_count/256,str); Format_component(working_palette[Fore_color].G*Color_count/256,str);
} }
else else
{ {
@ -1398,7 +1421,7 @@ void Button_Palette(void)
&working_palette[Fore_color].R, &working_palette[Fore_color].R,
&working_palette[Fore_color].G, &working_palette[Fore_color].G,
&working_palette[Fore_color].B); &working_palette[Fore_color].B);
Format_componant((int)255-green_slider->Position,str); Format_component((int)255-green_slider->Position,str);
} }
Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
@ -1407,7 +1430,7 @@ void Button_Palette(void)
if(Palette_view_is_RGB) if(Palette_view_is_RGB)
{ {
for (i=block_start; i<=block_end; i++) for (i=block_start; i<=block_end; i++)
Set_green (i,temp_palette[i].G+(Color_max-green_slider->Position)*255/Color_max,working_palette); Set_green (i,temp_palette[i].G+Reduce_component(Color_max-green_slider->Position),working_palette);
} }
else else
{ {
@ -1454,8 +1477,8 @@ void Button_Palette(void)
{ {
if(Palette_view_is_RGB) if(Palette_view_is_RGB)
{ {
Set_blue (Fore_color,(Color_max-blue_slider->Position)*255/Color_max,working_palette); Set_blue (Fore_color,Reduce_component(Color_max-blue_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].B*Color_count/256,str); Format_component(working_palette[Fore_color].B*Color_count/256,str);
} }
else else
{ {
@ -1466,7 +1489,7 @@ void Button_Palette(void)
&working_palette[Fore_color].R, &working_palette[Fore_color].R,
&working_palette[Fore_color].G, &working_palette[Fore_color].G,
&working_palette[Fore_color].B); &working_palette[Fore_color].B);
Format_componant((int)255-blue_slider->Position,str); Format_component((int)255-blue_slider->Position,str);
} }
Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
@ -1475,7 +1498,7 @@ void Button_Palette(void)
if(Palette_view_is_RGB) if(Palette_view_is_RGB)
{ {
for (i=block_start; i<=block_end; i++) for (i=block_start; i<=block_end; i++)
Set_blue(i,temp_palette[i].B+(Color_max-blue_slider->Position)*255/Color_max,working_palette); Set_blue(i,temp_palette[i].B+Reduce_component(Color_max-blue_slider->Position),working_palette);
} }
else else
{ {
@ -1859,24 +1882,24 @@ void Button_Palette(void)
{ {
(red_slider->Position)--; (red_slider->Position)--;
Window_draw_slider(red_slider); Window_draw_slider(red_slider);
Set_red(Fore_color,(Color_max-red_slider->Position)*255/Color_max,working_palette); Set_red(Fore_color,Reduce_component(Color_max-red_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].R*Color_count/256,str); Format_component(working_palette[Fore_color].R*Color_count/256,str);
Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
if (green_slider->Position) if (green_slider->Position)
{ {
(green_slider->Position)--; (green_slider->Position)--;
Window_draw_slider(green_slider); Window_draw_slider(green_slider);
Set_green (Fore_color,(Color_max-green_slider->Position)*255/Color_max,working_palette); Set_green (Fore_color,Reduce_component(Color_max-green_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].G*Color_count/256,str); Format_component(working_palette[Fore_color].G*Color_count/256,str);
Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
if (blue_slider->Position) if (blue_slider->Position)
{ {
(blue_slider->Position)--; (blue_slider->Position)--;
Window_draw_slider(blue_slider); Window_draw_slider(blue_slider);
Set_blue (Fore_color,(Color_max-blue_slider->Position)*255/Color_max,working_palette); Set_blue (Fore_color,Reduce_component(Color_max-blue_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].B*Color_count/256,str); Format_component(working_palette[Fore_color].B*Color_count/256,str);
Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
} }
@ -1900,9 +1923,9 @@ void Button_Palette(void)
for (i=block_start; i<=block_end; i++) for (i=block_start; i<=block_end; i++)
{ {
Set_red(i,temp_palette[i].R+(Color_max-red_slider->Position)*255/Color_max,working_palette); Set_red(i,temp_palette[i].R+Reduce_component(Color_max-red_slider->Position),working_palette);
Set_green (i,temp_palette[i].G+(Color_max-green_slider->Position)*255/Color_max,working_palette); Set_green (i,temp_palette[i].G+Reduce_component(Color_max-green_slider->Position),working_palette);
Set_blue (i,temp_palette[i].B+(Color_max-blue_slider->Position)*255/Color_max,working_palette); Set_blue (i,temp_palette[i].B+Reduce_component(Color_max-blue_slider->Position),working_palette);
} }
// -- red -- // -- red --
@ -1984,24 +2007,24 @@ void Button_Palette(void)
{ {
(red_slider->Position)++; (red_slider->Position)++;
Window_draw_slider(red_slider); Window_draw_slider(red_slider);
Set_red(Fore_color,(Color_max-red_slider->Position)*255/Color_max,working_palette); Set_red(Fore_color,Reduce_component(Color_max-red_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].R*Color_count/256,str); Format_component(working_palette[Fore_color].R*Color_count/256,str);
Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_R_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
if (green_slider->Position<Color_max) if (green_slider->Position<Color_max)
{ {
(green_slider->Position)++; (green_slider->Position)++;
Window_draw_slider(green_slider); Window_draw_slider(green_slider);
Set_green (Fore_color,(Color_max-green_slider->Position)*255/Color_max,working_palette); Set_green (Fore_color,Reduce_component(Color_max-green_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].G*Color_count/256,str); Format_component(working_palette[Fore_color].G*Color_count/256,str);
Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_G_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
if (blue_slider->Position<Color_max) if (blue_slider->Position<Color_max)
{ {
(blue_slider->Position)++; (blue_slider->Position)++;
Window_draw_slider(blue_slider); Window_draw_slider(blue_slider);
Set_blue (Fore_color,(Color_max-blue_slider->Position)*255/Color_max,working_palette); Set_blue (Fore_color,Reduce_component(Color_max-blue_slider->Position),working_palette);
Format_componant(working_palette[Fore_color].B*Color_count/256,str); Format_component(working_palette[Fore_color].B*Color_count/256,str);
Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light); Print_counter(NUMERIC_B_X,NUMERIC_Y,str,MC_Black,MC_Light);
} }
} }
@ -2025,9 +2048,9 @@ void Button_Palette(void)
for (i=block_start; i<=block_end; i++) for (i=block_start; i<=block_end; i++)
{ {
Set_red(i,temp_palette[i].R+(Color_max-red_slider->Position)*255/Color_max,working_palette); Set_red(i,temp_palette[i].R+Reduce_component(Color_max-red_slider->Position),working_palette);
Set_green (i,temp_palette[i].G+(Color_max-green_slider->Position)*255/Color_max,working_palette); Set_green (i,temp_palette[i].G+Reduce_component(Color_max-green_slider->Position),working_palette);
Set_blue (i,temp_palette[i].B+(Color_max-blue_slider->Position)*255/Color_max,working_palette); Set_blue (i,temp_palette[i].B+Reduce_component(Color_max-blue_slider->Position),working_palette);
} }
// -- red -- // -- red --
@ -2180,7 +2203,7 @@ void Button_Palette(void)
{ {
// On passe en HSL // On passe en HSL
Print_RGB_or_HSL(1); Print_RGB_or_HSL(1);
Componant_unit(256); Component_unit(256);
// Display the + and - button as disabled // Display the + and - button as disabled
Window_draw_normal_bouton(BUTTON_PLUS_X, BUTTON_PLUS_Y,12,11,"+",0,0); Window_draw_normal_bouton(BUTTON_PLUS_X, BUTTON_PLUS_Y,12,11,"+",0,0);
@ -2190,7 +2213,7 @@ void Button_Palette(void)
{ {
// On passe en RGB // On passe en RGB
Print_RGB_or_HSL(0); Print_RGB_or_HSL(0);
Componant_unit(RGB_scale); Component_unit(RGB_scale);
// Display the + and - button as enabled // Display the + and - button as enabled
Window_draw_normal_bouton(BUTTON_PLUS_X, BUTTON_PLUS_Y,12,11,"+",0,1); Window_draw_normal_bouton(BUTTON_PLUS_X, BUTTON_PLUS_Y,12,11,"+",0,1);