Correctly remap backgrounds buffers of windows

This commit is contained in:
Thomas Bernard 2018-01-24 15:18:09 +01:00
parent 207e487d99
commit 48ae5bf0d8
3 changed files with 76 additions and 24 deletions

View File

@ -3502,33 +3502,86 @@ short Window_clicked_button(void)
// Fonction qui sert à remapper les parties sauvegardées derriere les // Fonction qui sert à remapper les parties sauvegardées derriere les
// fenetres ouvertes. C'est utilisé par exemple par la fenetre de palette // fenetres ouvertes. C'est utilisé par exemple par la fenetre de palette
// Qui remappe des couleurs, afin de propager les changements. // Qui remappe des couleurs, afin de propager les changements.
void Remap_window_backgrounds(byte * conversion_table, int Min_Y, int Max_Y) void Remap_window_backgrounds(const byte * conversion_table, int Min_Y, int Max_Y)
{ {
int window_index; int window_index;
byte* EDI; byte* EDI;
int dx,cx; int dx,cx;
for (window_index=0; window_index<Windows_open; window_index++) for (window_index=0; window_index<Windows_open; window_index++)
{ {
EDI = Window_background[window_index]; EDI = Window_background[window_index];
// Pour chaque ligne // Pour chaque ligne
for(dx=0; dx<Window_stack[window_index].Height*Menu_factor_Y;dx++) for(dx=0; dx<Window_stack[window_index].Height*Menu_factor_Y;dx++)
{
if (dx+Window_stack[window_index].Pos_Y>Max_Y)
return;
if (dx+Window_stack[window_index].Pos_Y<Min_Y)
EDI += Window_stack[window_index].Width*Menu_factor_X*Pixel_width;
else
{ // Pour chaque pixel
for(cx=Window_stack[window_index].Width*Menu_factor_X*Pixel_width;cx>0;cx--)
{ {
if (dx+Window_stack[window_index].Pos_Y>Max_Y) *EDI = conversion_table[*EDI];
return; EDI ++;
if (dx+Window_stack[window_index].Pos_Y<Min_Y)
{
EDI += Window_stack[window_index].Width*Menu_factor_X*Pixel_width;
}
else
// Pour chaque pixel
for(cx=Window_stack[window_index].Width*Menu_factor_X*Pixel_width;cx>0;cx--)
{
*EDI = conversion_table[*EDI];
EDI ++;
}
} }
}
}
}
}
void Remap_UI_window_backgrounds(const byte * conversion_table)
{
int i, j;
int pos_y;
// all window backgrounds
for (i = 0; i < Windows_open; i++)
{
// remap pixels of background that are either Menu or another window below
byte * p = Window_background[i];
for (pos_y = Window_stack[i].Pos_Y;
pos_y < (Window_stack[i].Pos_Y + Window_stack[i].Height*Menu_factor_Y);
pos_y++)
{
// for each line of the background
int min_x = 0xffff;
int max_x = 0;
if (Menu_is_visible_before_window && pos_y >= Menu_Y_before_window)
{
min_x = 0;
max_x = Screen_width;
}
else for(j = 0; j < i; j++)
{
// check all windows below
if (pos_y < Window_stack[j].Pos_Y
|| pos_y >= (Window_stack[j].Pos_Y + Window_stack[j].Height*Menu_factor_Y) )
continue; // this window doesn't occupy this screen row
if (min_x > Window_stack[j].Pos_X)
min_x = Window_stack[j].Pos_X;
if (max_x < (Window_stack[j].Pos_X + Window_stack[j].Width*Menu_factor_X))
max_x = Window_stack[j].Pos_X + Window_stack[j].Width*Menu_factor_X;
}
if (min_x < Window_stack[i].Pos_X)
min_x = Window_stack[i].Pos_X;
if (max_x > Window_stack[i].Pos_X + Window_stack[i].Width*Menu_factor_X)
max_x = Window_stack[i].Pos_X + Window_stack[i].Width*Menu_factor_X;
if (max_x > min_x)
{
int x;
min_x -= Window_stack[i].Pos_X;
max_x -= Window_stack[i].Pos_X;
// do the conversion
for (x = min_x; x < max_x; x++)
{
p[x] = conversion_table[p[x]];
}
}
p += Window_stack[i].Width*Menu_factor_X*Pixel_width;
}
} }
} }

View File

@ -109,7 +109,8 @@ void Get_color_behind_window(byte * color, byte * click);
short Window_clicked_button(void); short Window_clicked_button(void);
int Button_under_mouse(void); int Button_under_mouse(void);
short Window_get_clicked_button(void); short Window_get_clicked_button(void);
void Remap_window_backgrounds(byte * conversion_table, int Min_Y, int Max_Y); void Remap_window_backgrounds(const byte * conversion_table, int Min_Y, int Max_Y);
void Remap_UI_window_backgrounds(const byte * conversion_table);
void Pixel_background(int x_pos, int y_pos, byte color); void Pixel_background(int x_pos, int y_pos, byte color);
/// ///
/// Updates the status bar line with a color number. /// Updates the status bar line with a color number.

View File

@ -2951,12 +2951,10 @@ void Remap_screen_after_menu_colors_change(void)
Remap_screen(min_x, pos_y, max_x - min_x, 1, conversion_table); Remap_screen(min_x, pos_y, max_x - min_x, 1, conversion_table);
} }
Remap_window_backgrounds(conversion_table, 0, Screen_height);// TODO check // Remap windows and menu in the backgrounds buffers
Remap_UI_window_backgrounds(conversion_table);
if (Menu_is_visible_before_window) if (Menu_is_visible_before_window)
{ {
// Remappage de la partie du fond de la fenetre qui cacherait le menu...
//Remap_window_backgrounds(conversion_table, Menu_Y_before_window, Screen_height);
// TODO remapper les parties de fenetres cachées par la fenetre "on top"
/* /*
Il faudrait peut-être remapper les pointillés délimitant l'image. Il faudrait peut-être remapper les pointillés délimitant l'image.
Mais ça va être chiant parce qu'ils peuvent être affichés en mode Loupe. Mais ça va être chiant parce qu'ils peuvent être affichés en mode Loupe.