Fix crashing bug when using pipette on a software-zoomed video mode from the palette menu. Fixes issue 196. Warning! Version 2.0 needs a new build!

git-svn-id: svn://pulkomandy.tk/GrafX2/branches/release@951 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues 2009-07-24 08:34:20 +00:00
parent 164b538725
commit d47e40b7cb

178
engine.c
View File

@ -1835,109 +1835,95 @@ short Wait_click_in_palette(T_Palette_button * button)
// -------------- Récupération d'une couleur derrière un menu ---------------- // -------------- Récupération d'une couleur derrière un menu ----------------
void Get_color_behind_window(byte * color, byte * click) void Get_color_behind_window(byte * color, byte * click)
{ {
short width=Window_width*Menu_factor_X;
short height=Window_height*Menu_factor_Y;
short old_x=-1; short old_x=-1;
short old_y=-1; short old_y=-1;
short index; short index;
short a,b,c,d; // Variables temporaires et multitâches... short a,b,c,d; // Variables temporaires et multitâches...
byte * buffer; byte * buffer = NULL;
char str[25]; char str[25];
byte cursor_was_hidden; byte cursor_was_hidden;
Hide_cursor();
if ((buffer=(byte *) malloc(width*height))) cursor_was_hidden=Cursor_hidden;
Cursor_hidden=0;
Save_background(&buffer,Window_pos_X,Window_pos_Y,Window_width,Window_height);
a=Menu_Y;
Menu_Y=Menu_Y_before_window;
b=Menu_is_visible;
Menu_is_visible=Menu_is_visible_before_window;
Display_all_screen();
Display_menu();
Menu_Y=a;
Menu_is_visible=b;
Cursor_shape=CURSOR_SHAPE_COLORPICKER;
b=Paintbrush_hidden;
Paintbrush_hidden=1;
c=-1; // color pointée: au début aucune, comme ça on initialise tout
if (Menu_is_visible_before_window)
Print_in_menu(Menu_tooltip[BUTTON_CHOOSE_COL],0);
Display_cursor();
do
{ {
Hide_cursor(); if(!Get_input())SDL_Delay(20);
cursor_was_hidden=Cursor_hidden; if ((Mouse_X!=old_x) || (Mouse_Y!=old_y))
Cursor_hidden=0; {
Hide_cursor();
a=Read_pixel(Mouse_X,Mouse_Y);
if (a!=c)
{
c=a; // Mise à jour de la couleur pointée
if (Menu_is_visible_before_window)
{
sprintf(str,"%d",a);
d=strlen(str);
strcat(str," (");
sprintf(str+strlen(str),"%d",Main_palette[a].R);
strcat(str,",");
sprintf(str+strlen(str),"%d",Main_palette[a].G);
strcat(str,",");
sprintf(str+strlen(str),"%d",Main_palette[a].B);
strcat(str,")");
a=24-d;
for (index=strlen(str); index<a; index++)
str[index]=' ';
str[a]=0;
Print_in_menu(str,strlen(Menu_tooltip[BUTTON_CHOOSE_COL]));
for (index=0; index<height; index++) Print_general((26+((d+strlen(Menu_tooltip[BUTTON_CHOOSE_COL]))<<3))*Menu_factor_X,
Read_line(Window_pos_X,Window_pos_Y+index,width,buffer+((int)index*width*Pixel_width)); Menu_status_Y," ",0,c);
a=Menu_Y; }
Menu_Y=Menu_Y_before_window; }
b=Menu_is_visible; Display_cursor();
Menu_is_visible=Menu_is_visible_before_window; }
Display_all_screen();
Display_menu();
Menu_Y=a;
Menu_is_visible=b;
Cursor_shape=CURSOR_SHAPE_COLORPICKER; old_x=Mouse_X;
b=Paintbrush_hidden; old_y=Mouse_Y;
Paintbrush_hidden=1; } while (!(Mouse_K || (Key==KEY_ESC)));
c=-1; // color pointée: au début aucune, comme ça on initialise tout
if (Menu_is_visible_before_window)
Print_in_menu(Menu_tooltip[BUTTON_CHOOSE_COL],0);
Display_cursor(); if (Mouse_K)
{
do Hide_cursor();
{ *click=Mouse_K;
if(!Get_input())SDL_Delay(20); *color=Read_pixel(Mouse_X,Mouse_Y);
if ((Mouse_X!=old_x) || (Mouse_Y!=old_y))
{
Hide_cursor();
a=Read_pixel(Mouse_X,Mouse_Y);
if (a!=c)
{
c=a; // Mise à jour de la couleur pointée
if (Menu_is_visible_before_window)
{
sprintf(str,"%d",a);
d=strlen(str);
strcat(str," (");
sprintf(str+strlen(str),"%d",Main_palette[a].R);
strcat(str,",");
sprintf(str+strlen(str),"%d",Main_palette[a].G);
strcat(str,",");
sprintf(str+strlen(str),"%d",Main_palette[a].B);
strcat(str,")");
a=24-d;
for (index=strlen(str); index<a; index++)
str[index]=' ';
str[a]=0;
Print_in_menu(str,strlen(Menu_tooltip[BUTTON_CHOOSE_COL]));
Print_general((26+((d+strlen(Menu_tooltip[BUTTON_CHOOSE_COL]))<<3))*Menu_factor_X,
Menu_status_Y," ",0,c);
}
}
Display_cursor();
}
old_x=Mouse_X;
old_y=Mouse_Y;
} while (!(Mouse_K || (Key==KEY_ESC)));
if (Mouse_K)
{
Hide_cursor();
*click=Mouse_K;
*color=Read_pixel(Mouse_X,Mouse_Y);
}
else
{
*click=0;
Hide_cursor();
}
for (index=0; index<height; index++)
Display_line(Window_pos_X,Window_pos_Y+index,width,buffer+((int)index*width));
Update_rect(Window_pos_X, Window_pos_Y, Window_width*Menu_factor_X, Window_height*Menu_factor_Y);
Cursor_shape=CURSOR_SHAPE_ARROW;
Paintbrush_hidden=b;
Cursor_hidden=cursor_was_hidden;
Display_cursor();
free(buffer);
} }
else else
{ {
Error(0); *click=0;
Hide_cursor();
} }
Restore_background(buffer,Window_pos_X,Window_pos_Y,Window_width,Window_height);
Update_rect(Window_pos_X, Window_pos_Y, Window_width*Menu_factor_X, Window_height*Menu_factor_Y);
Cursor_shape=CURSOR_SHAPE_ARROW;
Paintbrush_hidden=b;
Cursor_hidden=cursor_was_hidden;
Display_cursor();
} }
@ -1945,17 +1931,17 @@ void Get_color_behind_window(byte * color, byte * click)
// ------------ Opération de déplacement de la fenêtre à l'écran ------------- // ------------ Opération de déplacement de la fenêtre à l'écran -------------
void Move_window(short dx, short dy) void Move_window(short dx, short dy)
{ {
short new_x=Mouse_X-dx; short new_x=Mouse_X-dx;
short new_y=Mouse_Y-dy; short new_y=Mouse_Y-dy;
short old_x; short old_x;
short old_y; short old_y;
short width=Window_width*Menu_factor_X; short width=Window_width*Menu_factor_X;
short height=Window_height*Menu_factor_Y; short height=Window_height*Menu_factor_Y;
short a; short a;
byte b; byte b;
byte *buffer=NULL; byte *buffer=NULL;
Hide_cursor(); Hide_cursor();
Horizontal_XOR_line(new_x,new_y,width); Horizontal_XOR_line(new_x,new_y,width);
Vertical_XOR_line(new_x,new_y+1,height-2); Vertical_XOR_line(new_x,new_y+1,height-2);