GUI skins: The loader now recovers cleanly from errors and displays a message that says what's the problem in the image.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@881 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
0d54a9524f
commit
f683d9ff2e
46
buttons.c
46
buttons.c
@ -1231,34 +1231,28 @@ void Button_Skins(void)
|
|||||||
|
|
||||||
if(clicked_button == 1)
|
if(clicked_button == 1)
|
||||||
{
|
{
|
||||||
T_Gui_skin * gfx = (T_Gui_skin *)malloc(sizeof(T_Gui_skin));
|
T_Gui_skin * gfx;
|
||||||
if (gfx == NULL)
|
strcpy(skinsdir,"skins/");
|
||||||
|
strcat(
|
||||||
|
skinsdir,
|
||||||
|
Get_selected_skin(skin_list->List_start+skin_list->Cursor_position)->Full_name);
|
||||||
|
gfx=Load_graphics(skinsdir);
|
||||||
|
if (gfx == NULL) // Error
|
||||||
{
|
{
|
||||||
Error(0);
|
Verbose_error_message(Gui_loading_error_message);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy(skinsdir,"skins/");
|
|
||||||
strcat(
|
|
||||||
skinsdir,
|
|
||||||
Get_selected_skin(skin_list->List_start+skin_list->Cursor_position)->Full_name);
|
|
||||||
Load_graphics(gfx, skinsdir);
|
|
||||||
if (0) // Error
|
|
||||||
{
|
|
||||||
free(gfx);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free(Gfx);
|
|
||||||
Gfx = gfx;
|
|
||||||
strcpy(Config_choisie.SkinFile,skinsdir+6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Font selection
|
|
||||||
if (Config_choisie.Font)
|
|
||||||
Menu_font=Gfx->Fun_font;
|
|
||||||
else
|
else
|
||||||
Menu_font=Gfx->System_font;
|
{
|
||||||
|
free(Gfx);
|
||||||
|
Gfx = gfx;
|
||||||
|
// Font selection
|
||||||
|
if (Config_choisie.Font)
|
||||||
|
Menu_font=Gfx->Fun_font;
|
||||||
|
else
|
||||||
|
Menu_font=Gfx->System_font;
|
||||||
|
|
||||||
|
strcpy(Config_choisie.SkinFile,skinsdir+6);
|
||||||
|
}
|
||||||
|
|
||||||
Config = Config_choisie ;
|
Config = Config_choisie ;
|
||||||
}
|
}
|
||||||
|
|||||||
263
init.c
263
init.c
@ -66,6 +66,7 @@
|
|||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "transform.h"
|
#include "transform.h"
|
||||||
|
|
||||||
|
char Gui_loading_error_message[512];
|
||||||
|
|
||||||
// Rechercher la liste et le type des lecteurs de la machine
|
// Rechercher la liste et le type des lecteurs de la machine
|
||||||
|
|
||||||
@ -74,7 +75,7 @@ void bstrtostr( BSTR in, STRPTR out, TEXT max );
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Fonctions de lecture dans la skin de l'interface graphique
|
// Fonctions de lecture dans la skin de l'interface graphique
|
||||||
void GUI_seek_down(SDL_Surface *gui, int *start_x, int *start_y, byte neutral_color,char * section)
|
byte GUI_seek_down(SDL_Surface *gui, int *start_x, int *start_y, byte neutral_color,char * section)
|
||||||
{
|
{
|
||||||
byte color;
|
byte color;
|
||||||
int y;
|
int y;
|
||||||
@ -86,17 +87,17 @@ void GUI_seek_down(SDL_Surface *gui, int *start_x, int *start_y, byte neutral_co
|
|||||||
if (color!=neutral_color)
|
if (color!=neutral_color)
|
||||||
{
|
{
|
||||||
*start_y=y;
|
*start_y=y;
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
y++;
|
y++;
|
||||||
} while (y<gui->h);
|
} while (y<gui->h);
|
||||||
|
|
||||||
printf("Error in skin file: Was looking down from %d,%d for a '%s', and reached the end of the image\n",
|
sprintf(Gui_loading_error_message, "Error in skin file: Was looking down from %d,%d for a '%s', and reached the end of the image\n",
|
||||||
*start_x, *start_y, section);
|
*start_x, *start_y, section);
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_seek_right(SDL_Surface *gui, int *start_x, int start_y, byte neutral_color, char * section)
|
byte GUI_seek_right(SDL_Surface *gui, int *start_x, int start_y, byte neutral_color, char * section)
|
||||||
{
|
{
|
||||||
byte color;
|
byte color;
|
||||||
int x;
|
int x;
|
||||||
@ -108,17 +109,17 @@ void GUI_seek_right(SDL_Surface *gui, int *start_x, int start_y, byte neutral_co
|
|||||||
if (color!=neutral_color)
|
if (color!=neutral_color)
|
||||||
{
|
{
|
||||||
*start_x=x;
|
*start_x=x;
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
x++;
|
x++;
|
||||||
} while (x<gui->w);
|
} while (x<gui->w);
|
||||||
|
|
||||||
printf("Error in skin file: Was looking right from %d,%d for a '%s', and reached the edege of the image\n",
|
sprintf(Gui_loading_error_message, "Error in skin file: Was looking right from %d,%d for a '%s', and reached the edege of the image\n",
|
||||||
*start_x, start_y, section);
|
*start_x, start_y, section);
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Read_GUI_block(SDL_Surface *gui, int start_x, int start_y, void *dest, int width, int height, char * section, int type)
|
byte Read_GUI_block(SDL_Surface *gui, int start_x, int start_y, void *dest, int width, int height, char * section, int type)
|
||||||
{
|
{
|
||||||
// type: 0 = normal GUI element, only 4 colors allowed
|
// type: 0 = normal GUI element, only 4 colors allowed
|
||||||
// type: 1 = mouse cursor, 4 colors allowed + transparent
|
// type: 1 = mouse cursor, 4 colors allowed + transparent
|
||||||
@ -132,9 +133,9 @@ void Read_GUI_block(SDL_Surface *gui, int start_x, int start_y, void *dest, int
|
|||||||
// Verification taille
|
// Verification taille
|
||||||
if (start_y+height>=gui->h || start_x+width>=gui->w)
|
if (start_y+height>=gui->h || start_x+width>=gui->w)
|
||||||
{
|
{
|
||||||
printf("Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but it doesn't fit the image.\n",
|
sprintf(Gui_loading_error_message, "Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but it doesn't fit the image.\n",
|
||||||
start_x, start_y, height, width, section);
|
start_x, start_y, height, width, section);
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (y=start_y; y<start_y+height; y++)
|
for (y=start_y; y<start_y+height; y++)
|
||||||
@ -144,23 +145,23 @@ void Read_GUI_block(SDL_Surface *gui, int start_x, int start_y, void *dest, int
|
|||||||
color=Get_SDL_pixel_8(gui,x,y);
|
color=Get_SDL_pixel_8(gui,x,y);
|
||||||
if (type==0 && (color != MC_Black && color != MC_Dark && color != MC_Light && color != MC_White))
|
if (type==0 && (color != MC_Black && color != MC_Dark && color != MC_Light && color != MC_White))
|
||||||
{
|
{
|
||||||
printf("Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but at %d,%d a pixel was found with color %d which isn't one of the GUI colors (which were detected as %d,%d,%d,%d.\n",
|
sprintf(Gui_loading_error_message, "Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but at %d,%d a pixel was found with color %d which isn't one of the GUI colors (which were detected as %d,%d,%d,%d.\n",
|
||||||
start_x, start_y, height, width, section, x, y, color, MC_Black, MC_Dark, MC_Light, MC_White);
|
start_x, start_y, height, width, section, x, y, color, MC_Black, MC_Dark, MC_Light, MC_White);
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
if (type==1 && (color != MC_Black && color != MC_Dark && color != MC_Light && color != MC_White && color != MC_Trans))
|
if (type==1 && (color != MC_Black && color != MC_Dark && color != MC_Light && color != MC_White && color != MC_Trans))
|
||||||
{
|
{
|
||||||
printf("Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but at %d,%d a pixel was found with color %d which isn't one of the mouse colors (which were detected as %d,%d,%d,%d,%d.\n",
|
sprintf(Gui_loading_error_message, "Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but at %d,%d a pixel was found with color %d which isn't one of the mouse colors (which were detected as %d,%d,%d,%d,%d.\n",
|
||||||
start_x, start_y, height, width, section, x, y, color, MC_Black, MC_Dark, MC_Light, MC_White, MC_Trans);
|
start_x, start_y, height, width, section, x, y, color, MC_Black, MC_Dark, MC_Light, MC_White, MC_Trans);
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
if (type==2)
|
if (type==2)
|
||||||
{
|
{
|
||||||
if (color != MC_White && color != MC_Trans)
|
if (color != MC_White && color != MC_Trans)
|
||||||
{
|
{
|
||||||
printf("Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but at %d,%d a pixel was found with color %d which isn't one of the brush colors (which were detected as %d on %d.\n",
|
sprintf(Gui_loading_error_message, "Error in skin file: Was looking at %d,%d for a %d*%d object (%s) but at %d,%d a pixel was found with color %d which isn't one of the brush colors (which were detected as %d on %d.\n",
|
||||||
start_x, start_y, height, width, section, x, y, color, MC_White, MC_Trans);
|
start_x, start_y, height, width, section, x, y, color, MC_White, MC_Trans);
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
// Conversion en 0/1 pour les brosses monochromes internes
|
// Conversion en 0/1 pour les brosses monochromes internes
|
||||||
color = (color != MC_Trans);
|
color = (color != MC_Trans);
|
||||||
@ -169,14 +170,16 @@ void Read_GUI_block(SDL_Surface *gui, int start_x, int start_y, void *dest, int
|
|||||||
dest_ptr++;
|
dest_ptr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Read_GUI_pattern(SDL_Surface *gui, int start_x, int start_y, word *dest, char * section)
|
byte Read_GUI_pattern(SDL_Surface *gui, int start_x, int start_y, word *dest, char * section)
|
||||||
{
|
{
|
||||||
byte buffer[256];
|
byte buffer[256];
|
||||||
int x,y;
|
int x,y;
|
||||||
|
|
||||||
Read_GUI_block(gui, start_x, start_y, buffer, 16, 16, section, 2);
|
if (Read_GUI_block(gui, start_x, start_y, buffer, 16, 16, section, 2))
|
||||||
|
return 1;
|
||||||
|
|
||||||
for (y=0; y<16; y++)
|
for (y=0; y<16; y++)
|
||||||
{
|
{
|
||||||
@ -187,6 +190,7 @@ void Read_GUI_pattern(SDL_Surface *gui, int start_x, int start_y, word *dest, ch
|
|||||||
}
|
}
|
||||||
dest++;
|
dest++;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Center_GUI_cursor(T_Gui_skin *gfx, byte *cursor_buffer, int cursor_number)
|
void Center_GUI_cursor(T_Gui_skin *gfx, byte *cursor_buffer, int cursor_number)
|
||||||
@ -233,12 +237,9 @@ void Center_GUI_cursor(T_Gui_skin *gfx, byte *cursor_buffer, int cursor_number)
|
|||||||
gfx->Cursor_sprite[cursor_number][y][x]=cursor_buffer[(start_y+y)*29+start_x+x];
|
gfx->Cursor_sprite[cursor_number][y][x]=cursor_buffer[(start_y+y)*29+start_x+x];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
char filename[MAX_PATH_CHARACTERS];
|
|
||||||
SDL_Surface * gui;
|
|
||||||
SDL_Palette * SDLPal;
|
|
||||||
int i;
|
int i;
|
||||||
int cursor_x=0,cursor_y=0;
|
int cursor_x=0,cursor_y=0;
|
||||||
byte color;
|
byte color;
|
||||||
@ -248,28 +249,21 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
int char_3=0; // l'une des fontes dans l'ordre : 1 2
|
int char_3=0; // l'une des fontes dans l'ordre : 1 2
|
||||||
int char_4=0; // 3 4
|
int char_4=0; // 3 4
|
||||||
byte mouse_cursor_area[29][29];
|
byte mouse_cursor_area[29][29];
|
||||||
|
SDL_Palette * SDLPal;
|
||||||
|
|
||||||
// Lecture du fichier "skin"
|
// Default palette
|
||||||
strcpy(filename,Data_directory);
|
|
||||||
strcat(filename,skin_file);
|
|
||||||
|
|
||||||
gui=IMG_Load(filename);
|
|
||||||
if (!gui)
|
|
||||||
{
|
|
||||||
Error(ERROR_GUI_MISSING);
|
|
||||||
}
|
|
||||||
if (!gui->format || gui->format->BitsPerPixel != 8)
|
if (!gui->format || gui->format->BitsPerPixel != 8)
|
||||||
{
|
{
|
||||||
printf("Not a 8-bit image");
|
sprintf(Gui_loading_error_message, "Not a 8-bit image");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
SDLPal=gui->format->palette;
|
SDLPal=gui->format->palette;
|
||||||
if (!SDLPal || SDLPal->ncolors!=256)
|
if (!SDLPal || SDLPal->ncolors!=256)
|
||||||
{
|
{
|
||||||
printf("Not a 256-color palette");
|
sprintf(Gui_loading_error_message, "Not a 256-color palette");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
// Lecture de la palette par défaut
|
// Read the default palette
|
||||||
for (i=0; i<256; i++)
|
for (i=0; i<256; i++)
|
||||||
{
|
{
|
||||||
gfx->Default_palette[i].R=SDLPal->colors[i].r;
|
gfx->Default_palette[i].R=SDLPal->colors[i].r;
|
||||||
@ -283,8 +277,8 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (++cursor_x>=gui->w)
|
if (++cursor_x>=gui->w)
|
||||||
{
|
{
|
||||||
printf("Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
sprintf(Gui_loading_error_message, "Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
||||||
} while(color==MC_Black);
|
} while(color==MC_Black);
|
||||||
@ -294,8 +288,8 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (++cursor_x>=gui->w)
|
if (++cursor_x>=gui->w)
|
||||||
{
|
{
|
||||||
printf("Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
sprintf(Gui_loading_error_message, "Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
||||||
} while(color==MC_Dark);
|
} while(color==MC_Dark);
|
||||||
@ -305,8 +299,8 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (++cursor_x>gui->w)
|
if (++cursor_x>gui->w)
|
||||||
{
|
{
|
||||||
printf("Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
sprintf(Gui_loading_error_message, "Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
||||||
} while(color==MC_Light);
|
} while(color==MC_Light);
|
||||||
@ -316,8 +310,8 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (++cursor_x>=gui->w)
|
if (++cursor_x>=gui->w)
|
||||||
{
|
{
|
||||||
printf("Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
sprintf(Gui_loading_error_message, "Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
||||||
} while(color==MC_White);
|
} while(color==MC_White);
|
||||||
@ -327,8 +321,8 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (++cursor_x>=gui->w)
|
if (++cursor_x>=gui->w)
|
||||||
{
|
{
|
||||||
printf("Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
sprintf(Gui_loading_error_message, "Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
|
||||||
} while(color==MC_Trans);
|
} while(color==MC_Trans);
|
||||||
@ -343,24 +337,33 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
cursor_y++;
|
cursor_y++;
|
||||||
if (cursor_y>=gui->h)
|
if (cursor_y>=gui->h)
|
||||||
{
|
{
|
||||||
printf("Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
sprintf(Gui_loading_error_message, "Error in GUI skin file: should start with 5 consecutive squares for black, dark, light, white, transparent, then a neutral color\n");
|
||||||
Error(ERROR_GUI_CORRUPTED);
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Menu
|
// Menu
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "menu");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "menu"))
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, gfx->Menu_block, MENU_WIDTH, MENU_HEIGHT,"menu",0);
|
return 1;
|
||||||
|
if (Read_GUI_block(gui, cursor_x, cursor_y, gfx->Menu_block, MENU_WIDTH, MENU_HEIGHT,"menu",0))
|
||||||
|
return 1;
|
||||||
cursor_y+=MENU_HEIGHT;
|
cursor_y+=MENU_HEIGHT;
|
||||||
|
|
||||||
// Effets
|
// Effets
|
||||||
for (i=0; i<NB_EFFECTS_SPRITES; i++)
|
for (i=0; i<NB_EFFECTS_SPRITES; i++)
|
||||||
{
|
{
|
||||||
if (i==0)
|
if (i==0)
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "effect sprite");
|
{
|
||||||
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "effect sprite"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "effect sprite");
|
{
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, gfx->Effect_sprite[i], MENU_SPRITE_WIDTH, MENU_SPRITE_HEIGHT, "effect sprite",0);
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "effect sprite"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Read_GUI_block(gui, cursor_x, cursor_y, gfx->Effect_sprite[i], MENU_SPRITE_WIDTH, MENU_SPRITE_HEIGHT, "effect sprite",0))
|
||||||
|
return 1;
|
||||||
cursor_x+=MENU_SPRITE_WIDTH;
|
cursor_x+=MENU_SPRITE_WIDTH;
|
||||||
}
|
}
|
||||||
cursor_y+=MENU_SPRITE_HEIGHT;
|
cursor_y+=MENU_SPRITE_HEIGHT;
|
||||||
@ -369,10 +372,17 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
for (i=0; i<NB_CURSOR_SPRITES; i++)
|
for (i=0; i<NB_CURSOR_SPRITES; i++)
|
||||||
{
|
{
|
||||||
if (i==0)
|
if (i==0)
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "mouse cursor");
|
{
|
||||||
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "mouse cursor"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "mouse cursor");
|
{
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, mouse_cursor_area, 29, 29, "mouse cursor",1);
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "mouse cursor"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Read_GUI_block(gui, cursor_x, cursor_y, mouse_cursor_area, 29, 29, "mouse cursor",1))
|
||||||
|
return 1;
|
||||||
Center_GUI_cursor(gfx, (byte *)mouse_cursor_area,i);
|
Center_GUI_cursor(gfx, (byte *)mouse_cursor_area,i);
|
||||||
cursor_x+=29;
|
cursor_x+=29;
|
||||||
}
|
}
|
||||||
@ -382,10 +392,17 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
for (i=0; i<NB_MENU_SPRITES; i++)
|
for (i=0; i<NB_MENU_SPRITES; i++)
|
||||||
{
|
{
|
||||||
if (i==0)
|
if (i==0)
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "menu sprite");
|
{
|
||||||
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "menu sprite"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "menu sprite");
|
{
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, gfx->Menu_sprite[i], MENU_SPRITE_WIDTH, MENU_SPRITE_HEIGHT, "menu sprite",1);
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "menu sprite"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Read_GUI_block(gui, cursor_x, cursor_y, gfx->Menu_sprite[i], MENU_SPRITE_WIDTH, MENU_SPRITE_HEIGHT, "menu sprite",1))
|
||||||
|
return 1;
|
||||||
cursor_x+=MENU_SPRITE_WIDTH;
|
cursor_x+=MENU_SPRITE_WIDTH;
|
||||||
}
|
}
|
||||||
cursor_y+=MENU_SPRITE_HEIGHT;
|
cursor_y+=MENU_SPRITE_HEIGHT;
|
||||||
@ -398,13 +415,16 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (i!=0)
|
if (i!=0)
|
||||||
cursor_y+=PAINTBRUSH_HEIGHT;
|
cursor_y+=PAINTBRUSH_HEIGHT;
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "brush icon");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "brush icon"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "brush icon");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "brush icon"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, gfx->Paintbrush_sprite[i], PAINTBRUSH_WIDTH, PAINTBRUSH_HEIGHT, "brush icon",2);
|
if (Read_GUI_block(gui, cursor_x, cursor_y, gfx->Paintbrush_sprite[i], PAINTBRUSH_WIDTH, PAINTBRUSH_HEIGHT, "brush icon",2))
|
||||||
|
return 1;
|
||||||
cursor_x+=PAINTBRUSH_WIDTH;
|
cursor_x+=PAINTBRUSH_WIDTH;
|
||||||
}
|
}
|
||||||
cursor_y+=PAINTBRUSH_HEIGHT;
|
cursor_y+=PAINTBRUSH_HEIGHT;
|
||||||
@ -413,30 +433,44 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
for (i=0; i<NB_ICON_SPRITES; i++)
|
for (i=0; i<NB_ICON_SPRITES; i++)
|
||||||
{
|
{
|
||||||
if (i==0)
|
if (i==0)
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "sprite drive");
|
{
|
||||||
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "sprite drive"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "sprite drive");
|
{
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, gfx->Icon_sprite[i], ICON_SPRITE_WIDTH, ICON_SPRITE_HEIGHT, "sprite drive",1);
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "sprite drive"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Read_GUI_block(gui, cursor_x, cursor_y, gfx->Icon_sprite[i], ICON_SPRITE_WIDTH, ICON_SPRITE_HEIGHT, "sprite drive",1))
|
||||||
|
return 1;
|
||||||
cursor_x+=ICON_SPRITE_WIDTH;
|
cursor_x+=ICON_SPRITE_WIDTH;
|
||||||
}
|
}
|
||||||
cursor_y+=ICON_SPRITE_HEIGHT;
|
cursor_y+=ICON_SPRITE_HEIGHT;
|
||||||
|
|
||||||
// Logo splash screen
|
// Logo splash screen
|
||||||
if (!(gfx->Logo_grafx2=(byte *)malloc(231*56)))
|
|
||||||
Error(ERROR_MEMORY);
|
|
||||||
|
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "logo menu");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "logo menu"))
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, gfx->Logo_grafx2, 231, 56, "logo menu",3);
|
return 1;
|
||||||
|
if (Read_GUI_block(gui, cursor_x, cursor_y, gfx->Logo_grafx2, 231, 56, "logo menu",3))
|
||||||
|
return 1;
|
||||||
cursor_y+=56;
|
cursor_y+=56;
|
||||||
|
|
||||||
// Trames
|
// Trames
|
||||||
for (i=0; i<NB_PRESET_SIEVE; i++)
|
for (i=0; i<NB_PRESET_SIEVE; i++)
|
||||||
{
|
{
|
||||||
if (i==0)
|
if (i==0)
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "sieve pattern");
|
{
|
||||||
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "sieve pattern"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "sieve pattern");
|
{
|
||||||
Read_GUI_pattern(gui, cursor_x, cursor_y, gfx->Sieve_pattern[i],"sieve pattern");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "sieve pattern"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Read_GUI_pattern(gui, cursor_x, cursor_y, gfx->Sieve_pattern[i],"sieve pattern"))
|
||||||
|
return 1;
|
||||||
cursor_x+=16;
|
cursor_x+=16;
|
||||||
}
|
}
|
||||||
cursor_y+=16;
|
cursor_y+=16;
|
||||||
@ -449,17 +483,19 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (i!=0)
|
if (i!=0)
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "system font");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "system font"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "system font");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "system font"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, &gfx->System_font[i*64], 8, 8, "system font",2);
|
if (Read_GUI_block(gui, cursor_x, cursor_y, &gfx->System_font[i*64], 8, 8, "system font",2))
|
||||||
|
return 1;
|
||||||
cursor_x+=8;
|
cursor_x+=8;
|
||||||
}
|
}
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
Menu_font=gfx->System_font;
|
|
||||||
|
|
||||||
// Font Fun
|
// Font Fun
|
||||||
for (i=0; i<256; i++)
|
for (i=0; i<256; i++)
|
||||||
@ -469,13 +505,16 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (i!=0)
|
if (i!=0)
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "fun font");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "fun font"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "fun font");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "fun font"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, &gfx->Fun_font[i*64], 8, 8, "fun font",2);
|
if (Read_GUI_block(gui, cursor_x, cursor_y, &gfx->Fun_font[i*64], 8, 8, "fun font",2))
|
||||||
|
return 1;
|
||||||
cursor_x+=8;
|
cursor_x+=8;
|
||||||
}
|
}
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
@ -488,13 +527,16 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (i!=0)
|
if (i!=0)
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "help font (norm)");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "help font (norm)"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "help font (norm)");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "help font (norm)"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, &(gfx->Help_font_norm[i][0][0]), 6, 8, "help font (norm)",0);
|
if (Read_GUI_block(gui, cursor_x, cursor_y, &(gfx->Help_font_norm[i][0][0]), 6, 8, "help font (norm)",0))
|
||||||
|
return 1;
|
||||||
cursor_x+=6;
|
cursor_x+=6;
|
||||||
}
|
}
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
@ -507,13 +549,16 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (i!=0)
|
if (i!=0)
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "help font (bold)");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "help font (bold)"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "help font (bold)");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "help font (bold)"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, &(gfx->Bold_font[i][0][0]), 6, 8, "help font (bold)",0);
|
if (Read_GUI_block(gui, cursor_x, cursor_y, &(gfx->Bold_font[i][0][0]), 6, 8, "help font (bold)",0))
|
||||||
|
return 1;
|
||||||
cursor_x+=6;
|
cursor_x+=6;
|
||||||
}
|
}
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
@ -527,11 +572,13 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
{
|
{
|
||||||
if (i!=0)
|
if (i!=0)
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "help font (title)");
|
if (GUI_seek_down(gui, &cursor_x, &cursor_y, neutral_color, "help font (title)"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "help font (title)");
|
if (GUI_seek_right(gui, &cursor_x, cursor_y, neutral_color, "help font (title)"))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i&1)
|
if (i&1)
|
||||||
@ -545,14 +592,12 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
else
|
else
|
||||||
dest=&(gfx->Help_font_t1[char_1++][0][0]);
|
dest=&(gfx->Help_font_t1[char_1++][0][0]);
|
||||||
|
|
||||||
Read_GUI_block(gui, cursor_x, cursor_y, dest, 6, 8, "help font (title)",0);
|
if (Read_GUI_block(gui, cursor_x, cursor_y, dest, 6, 8, "help font (title)",0))
|
||||||
|
return 1;
|
||||||
cursor_x+=6;
|
cursor_x+=6;
|
||||||
}
|
}
|
||||||
cursor_y+=8;
|
cursor_y+=8;
|
||||||
|
|
||||||
// Terminé: libération de l'image skin
|
|
||||||
SDL_FreeSurface(gui);
|
|
||||||
|
|
||||||
Current_help_section=0;
|
Current_help_section=0;
|
||||||
Help_position=0;
|
Help_position=0;
|
||||||
|
|
||||||
@ -753,7 +798,41 @@ void Load_graphics(T_Gui_skin *gfx, const char * skin_file)
|
|||||||
gfx->Preset_paintbrush_offset_X[index]=(gfx->Preset_paintbrush_width [index]>>1);
|
gfx->Preset_paintbrush_offset_X[index]=(gfx->Preset_paintbrush_width [index]>>1);
|
||||||
gfx->Preset_paintbrush_offset_Y[index]=(gfx->Preset_paintbrush_height[index]>>1);
|
gfx->Preset_paintbrush_offset_Y[index]=(gfx->Preset_paintbrush_height[index]>>1);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
T_Gui_skin * Load_graphics(const char * skin_file)
|
||||||
|
{
|
||||||
|
T_Gui_skin * gfx;
|
||||||
|
char filename[MAX_PATH_CHARACTERS];
|
||||||
|
SDL_Surface * gui;
|
||||||
|
|
||||||
|
gfx = (T_Gui_skin *)malloc(sizeof(T_Gui_skin));
|
||||||
|
if (gfx == NULL)
|
||||||
|
{
|
||||||
|
sprintf(Gui_loading_error_message, "Not enough memory to read skin file\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the "skin" file
|
||||||
|
strcpy(filename,Data_directory);
|
||||||
|
strcat(filename,skin_file);
|
||||||
|
|
||||||
|
gui=IMG_Load(filename);
|
||||||
|
if (!gui)
|
||||||
|
{
|
||||||
|
sprintf(Gui_loading_error_message, "Unable to load the skin image (missing? not an image file?)\n");
|
||||||
|
free(gfx);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (Parse_skin(gui, gfx))
|
||||||
|
{
|
||||||
|
SDL_FreeSurface(gui);
|
||||||
|
free(gfx);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SDL_FreeSurface(gui);
|
||||||
|
return gfx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
4
init.h
4
init.h
@ -22,7 +22,7 @@
|
|||||||
/// Initialization (and some de-initialization) functions.
|
/// Initialization (and some de-initialization) functions.
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Load_graphics(T_Gui_skin *gfx, const char * skin_file);
|
T_Gui_skin *Load_graphics(const char * skin_file);
|
||||||
void Init_buttons(void);
|
void Init_buttons(void);
|
||||||
void Init_operations(void);
|
void Init_operations(void);
|
||||||
int Load_CFG(int reload_all);
|
int Load_CFG(int reload_all);
|
||||||
@ -30,3 +30,5 @@ int Save_CFG(void);
|
|||||||
void Set_all_video_modes(void);
|
void Set_all_video_modes(void);
|
||||||
void Set_config_defaults(void);
|
void Set_config_defaults(void);
|
||||||
void Init_sighandler(void);
|
void Init_sighandler(void);
|
||||||
|
|
||||||
|
extern char Gui_loading_error_message[512];
|
||||||
|
|||||||
11
main.c
11
main.c
@ -534,12 +534,13 @@ int Init_program(int argc,char * argv[])
|
|||||||
Analyze_command_line(argc,argv);
|
Analyze_command_line(argc,argv);
|
||||||
|
|
||||||
// Load sprites, palette etc.
|
// Load sprites, palette etc.
|
||||||
Gfx = (T_Gui_skin *)malloc(sizeof(T_Gui_skin));
|
|
||||||
if (Gfx == NULL)
|
|
||||||
Error(ERROR_MEMORY);
|
|
||||||
strcpy(Gui_skin_file+6,Config.SkinFile);
|
strcpy(Gui_skin_file+6,Config.SkinFile);
|
||||||
Load_graphics(Gfx, Gui_skin_file);
|
Gfx = Load_graphics(Gui_skin_file);
|
||||||
|
if (Gfx == NULL)
|
||||||
|
{
|
||||||
|
printf("%s", Gui_loading_error_message);
|
||||||
|
Error(ERROR_GUI_MISSING);
|
||||||
|
}
|
||||||
// Infos sur les trames (Sieve)
|
// Infos sur les trames (Sieve)
|
||||||
Sieve_mode=0;
|
Sieve_mode=0;
|
||||||
Copy_preset_sieve(0);
|
Copy_preset_sieve(0);
|
||||||
|
|||||||
2
struct.h
2
struct.h
@ -362,7 +362,7 @@ typedef struct
|
|||||||
/// Bitmap data for the different "effects" icons.
|
/// Bitmap data for the different "effects" icons.
|
||||||
byte Effect_sprite[NB_EFFECTS_SPRITES][MENU_SPRITE_HEIGHT][MENU_SPRITE_WIDTH];
|
byte Effect_sprite[NB_EFFECTS_SPRITES][MENU_SPRITE_HEIGHT][MENU_SPRITE_WIDTH];
|
||||||
/// Bitmap data for the Grafx2 logo that appears on splash screen. All 256 colors allowed.
|
/// Bitmap data for the Grafx2 logo that appears on splash screen. All 256 colors allowed.
|
||||||
byte * Logo_grafx2;
|
byte Logo_grafx2[231*56];
|
||||||
/// Bitmap data for the 6x8 font used in help screens.
|
/// Bitmap data for the 6x8 font used in help screens.
|
||||||
byte Help_font_norm [256][6][8];
|
byte Help_font_norm [256][6][8];
|
||||||
/// Bitmap data for the 6x8 font used in help screens ("bold" verstion).
|
/// Bitmap data for the 6x8 font used in help screens ("bold" verstion).
|
||||||
|
|||||||
41
windows.c
41
windows.c
@ -860,6 +860,47 @@ void Warning_message(char * message)
|
|||||||
Display_cursor();
|
Display_cursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---- Window that shows a big message, and waits for a click on OK -----
|
||||||
|
void Verbose_error_message(char * message)
|
||||||
|
{
|
||||||
|
short clicked_button;
|
||||||
|
int line;
|
||||||
|
int i;
|
||||||
|
char buffer[36]; // 35 characters + \0
|
||||||
|
|
||||||
|
Open_window(300,160,"Error!");
|
||||||
|
|
||||||
|
// Word-wrap the message
|
||||||
|
for (line=0; line < 10; line++)
|
||||||
|
{
|
||||||
|
for (i=0;i<35 && *message!='\0';i++)
|
||||||
|
{
|
||||||
|
if (*message == '\n')
|
||||||
|
{
|
||||||
|
message++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buffer[i]=*message;
|
||||||
|
message++;
|
||||||
|
}
|
||||||
|
buffer[i]='\0';
|
||||||
|
Print_in_window(10,20+line*8,buffer,MC_Black,MC_Light);
|
||||||
|
if (*message=='\0')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window_set_normal_button(300/2-20,160-23,40,14,"OK",1,1,SDLK_RETURN); // 1
|
||||||
|
Update_window_area(0,0,Window_width,Window_height);
|
||||||
|
Display_cursor();
|
||||||
|
|
||||||
|
do
|
||||||
|
clicked_button=Window_clicked_button();
|
||||||
|
while ((clicked_button<=0) && (Key!=KEY_ESC) && (Key!=SDLK_o));
|
||||||
|
Key=0;
|
||||||
|
|
||||||
|
Close_window();
|
||||||
|
Display_cursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// -- Redessiner le sprite d'un bouton dans le menu --
|
// -- Redessiner le sprite d'un bouton dans le menu --
|
||||||
|
|||||||
@ -70,6 +70,7 @@ void Print_counter(short x,short y,const char * str,byte text_color,byte backgro
|
|||||||
|
|
||||||
byte Confirmation_box(char * message);
|
byte Confirmation_box(char * message);
|
||||||
void Warning_message(char * message);
|
void Warning_message(char * message);
|
||||||
|
void Verbose_error_message(char * message);
|
||||||
|
|
||||||
void Display_image_limits(void);
|
void Display_image_limits(void);
|
||||||
void Display_all_screen(void);
|
void Display_all_screen(void);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user