From 8ff9028eab03e1f4b8fa1bdbe3a34802e86ac558 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sun, 29 Mar 2009 21:58:38 +0000 Subject: [PATCH] Implemented palette ordering (issue 112). You can activate it in the secondary palette window (shift-P), it's saved in gfx2.ini. The skin file has 2 more icons for the arrows (Ilija, grafx2 won't load if you don't update yours) Updated contextual help for the secondary palette window. Fixed some typos in code. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@704 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- buttons.c | 31 ++++++------ const.h | 68 +++++++++++++------------- engine.c | 4 +- gfx2def.ini | 6 +++ gfx2gui.gif | Bin 21534 -> 21577 bytes helpfile.h | 57 +++++++++++++++------- init.c | 2 +- main.c | 1 + palette.c | 31 +++++++++--- palette.h | 2 +- readini.c | 9 +++- saveini.c | 4 ++ struct.h | 1 + windows.c | 136 +++++++++++++++++++++++++++++++++++----------------- 14 files changed, 233 insertions(+), 119 deletions(-) diff --git a/buttons.c b/buttons.c index 7a3422d3..8df28a44 100644 --- a/buttons.c +++ b/buttons.c @@ -234,13 +234,14 @@ void Button_Redo(void) //---------------------------- SCROLL PALETTE LEFT --------------------------- void Button_Pal_left(void) { - short cells_y = Palette_cells_Y(); + short cells; + cells = (Config.Palette_vertical)?Palette_cells_X():Palette_cells_Y(); Hide_cursor(); if (First_color_in_palette) { - if (First_color_in_palette>=cells_y) - First_color_in_palette-=cells_y; + if (First_color_in_palette>=cells) + First_color_in_palette-=cells; else First_color_in_palette=0; Display_menu_palette(); @@ -251,14 +252,14 @@ void Button_Pal_left(void) void Button_Pal_left_fast(void) { - short cells_X = Palette_cells_X(); + short cells_x = Palette_cells_X(); short cells_y = Palette_cells_Y(); Hide_cursor(); if (First_color_in_palette) { - if (First_color_in_palette>=cells_y*cells_X) - First_color_in_palette-=cells_y*cells_X; + if (First_color_in_palette>=cells_y*cells_x) + First_color_in_palette-=cells_y*cells_x; else First_color_in_palette=0; Display_menu_palette(); @@ -271,30 +272,32 @@ void Button_Pal_left_fast(void) //--------------------------- SCROLL PALETTE RIGHT --------------------------- void Button_Pal_right(void) { - short cells_y = Palette_cells_Y(); + short cells; + cells = (Config.Palette_vertical)?Palette_cells_X():Palette_cells_Y(); Hide_cursor(); - if ((int)First_color_in_palette+cells_y*Palette_cells_X()<256) + if ((int)First_color_in_palette+Palette_cells_X()*Palette_cells_Y()<256) { - First_color_in_palette+=cells_y; + First_color_in_palette+=cells; Display_menu_palette(); } + Unselect_bouton(BUTTON_PAL_RIGHT); Display_cursor(); } void Button_Pal_right_fast(void) { - short cells_X = Palette_cells_X(); + short cells_x = Palette_cells_X(); short cells_y = Palette_cells_Y(); Hide_cursor(); - if ((int)First_color_in_palette+cells_y*cells_X<256) + if ((int)First_color_in_palette+cells_y*cells_x<256) { - if ((int)First_color_in_palette+(cells_y)*cells_X*2<256) - First_color_in_palette+=cells_X*cells_y; + if ((int)First_color_in_palette+(cells_y)*cells_x*2<256) + First_color_in_palette+=cells_x*cells_y; else - First_color_in_palette=255/cells_y*cells_y-(cells_X-1)*cells_y; + First_color_in_palette=255/cells_y*cells_y-(cells_x-1)*cells_y; Display_menu_palette(); } Unselect_bouton(BUTTON_PAL_RIGHT); diff --git a/const.h b/const.h index b9eec263..e305ac03 100644 --- a/const.h +++ b/const.h @@ -36,50 +36,50 @@ #define ALPHA_BETA "ß" // Type de la version "Þ" ou "ß" #define MAX_VIDEO_MODES 100 // Nombre de modes vidéo maxi #define NB_BUTTONS 38 // Nombre de boutons à gérer -#define NB_SHORTCUTS 134 // Nombre de combinaisons de touches +#define NB_SHORTCUTS 134 // Nombre de combinaisons de touches #define NB_SPECIAL_SHORTCUTS 72 // Nombre de touches spéciales #define NB_OPERATIONS 33 // Nombre d'opérations gérées par le moteur -#define NB_ZOOM_FACTORS 12 // Nombre de facteurs de zoom -#define MENU_WIDTH 254 // Largeur du menu en taille réelle -#define MENU_HEIGHT 44 // Hauteur du menu en taille réelle -#define NB_CURSOR_SPRITES 8 // Nombre de sprites de curseur -#define CURSOR_SPRITE_WIDTH 15 // Largeur d'un sprite de curseur en pixels -#define CURSOR_SPRITE_HEIGHT 15 // Hauteur d'un sprite de curseur en pixels -#define NB_EFFECTS_SPRITES 9 // Nombre de sprites d'effets -#define NB_MENU_SPRITES 18 // Nombre de sprites de menu -#define MENU_SPRITE_WIDTH 14 // Largeur d'un sprite de menu en pixels -#define MENU_SPRITE_HEIGHT 14 // Hauteur d'un sprite de menu en pixels -#define PAINTBRUSH_WIDTH 16 // Largeur d'un sprite de pinceau prédéfini -#define PAINTBRUSH_HEIGHT 16 // Hauteur d'un sprite de pinceau prédéfini +#define NB_ZOOM_FACTORS 12 // Nombre de facteurs de zoom +#define MENU_WIDTH 254 // Largeur du menu en taille réelle +#define MENU_HEIGHT 44 // Hauteur du menu en taille réelle +#define NB_CURSOR_SPRITES 8 // Nombre de sprites de curseur +#define CURSOR_SPRITE_WIDTH 15 // Largeur d'un sprite de curseur en pixels +#define CURSOR_SPRITE_HEIGHT 15 // Hauteur d'un sprite de curseur en pixels +#define NB_EFFECTS_SPRITES 9 // Nombre de sprites d'effets +#define NB_MENU_SPRITES 20 // Nombre de sprites de menu +#define MENU_SPRITE_WIDTH 14 // Largeur d'un sprite de menu en pixels +#define MENU_SPRITE_HEIGHT 14 // Hauteur d'un sprite de menu en pixels +#define PAINTBRUSH_WIDTH 16 // Largeur d'un sprite de pinceau prédéfini +#define PAINTBRUSH_HEIGHT 16 // Hauteur d'un sprite de pinceau prédéfini #define MAX_PAINTBRUSH_SIZE 127 // Taille maxi des pinceaux -#define NB_ICON_SPRITES 7 // Nombre de sprites de drives -#define ICON_SPRITE_WIDTH 8 // Largeur d'un sprite de drive en pixels -#define ICON_SPRITE_HEIGHT 8 // Hauteur d'un sprite de drive en pixels -#define NB_PAINTBRUSH_SPRITES 48 // Nombre de sprites de pinceau -#define NB_PRESET_SIEVE 12 // Nombre de trames prédéfinies -#define OPERATION_STACK_SIZE 16 // Nombre maximum d'éléments utilisés par les opérations -#define MAX_DISPLAYABLE_PATH 37 // Taille maximum affichable du répertoire courant dans les fenêtres du fileselect -#define COMMENT_SIZE 32 // Taille maxi des commentaires pour le PKM +#define NB_ICON_SPRITES 7 // Nombre de sprites de drives +#define ICON_SPRITE_WIDTH 8 // Largeur d'un sprite de drive en pixels +#define ICON_SPRITE_HEIGHT 8 // Hauteur d'un sprite de drive en pixels +#define NB_PAINTBRUSH_SPRITES 48 // Nombre de sprites de pinceau +#define NB_PRESET_SIEVE 12 // Nombre de trames prédéfinies +#define OPERATION_STACK_SIZE 16 // Nombre maximum d'éléments utilisés par les opérations +#define MAX_DISPLAYABLE_PATH 37 // Taille maximum affichable du répertoire courant dans les fenêtres du fileselect +#define COMMENT_SIZE 32 // Taille maxi des commentaires pour le PKM #define NB_MAX_PAGES_UNDO 99 // Nombre maximal de pages d'undo -#define DEFAULT_ZOOM_FACTOR 4 // Facteur de zoom initial -#define MAX_PATH_CHARACTERS 260 // Le nombre de caractères maxi pour un nom de fichier avec chemin complet +#define DEFAULT_ZOOM_FACTOR 4 // Facteur de zoom initial +#define MAX_PATH_CHARACTERS 260 // Le nombre de caractères maxi pour un nom de fichier avec chemin complet #define NB_BOOKMARKS 4 // Nombre de boutons "signet" dans l'ecran Save/Load // Caractères présents dans les deux fontes #define RIGHT_TRIANGLE_CHARACTER 16 -#define LEFT_TRIANGLE_CHARACTER 17 -#define ELLIPSIS_CHARACTER '…' +#define LEFT_TRIANGLE_CHARACTER 17 +#define ELLIPSIS_CHARACTER '…' // On impose à l'allocation dynamique des pages de backups de conserver un // minimum de 256 Ko pour que le reste du programme puisse continuer à // fonctionner. #define MINIMAL_MEMORY_TO_RESERVE (256*1024) -#define LEFT_SIDE 1 // Indique une direction (ou click) à gauche -#define RIGHT_SIDE 2 // Indique une direction (ou click) à droite +#define LEFT_SIDE 1 // Indique une direction (ou click) à gauche +#define RIGHT_SIDE 2 // Indique une direction (ou click) à droite -#define SEPARATOR_WIDTH 6 // [ Û±±° ] -#define INITIAL_SEPARATOR_PROPORTION 0.3 // proportion de la zone non-zoomée en largeur par rapport à l'écran -#define NB_ZOOMED_PIXELS_MIN 4 // Nombre minimal de pixels zoomés en largeur (Note: En dessous de 4, on ne peut plus scroller!) +#define SEPARATOR_WIDTH 6 // [ Û±±° ] +#define INITIAL_SEPARATOR_PROPORTION 0.3 // proportion de la zone non-zoomée en largeur par rapport à l'écran +#define NB_ZOOMED_PIXELS_MIN 4 // Nombre minimal de pixels zoomés en largeur (Note: En dessous de 4, on ne peut plus scroller!) #if defined(__MORPHOS__) || defined(__amigaos4__) || defined(__amigaos__) #define PARENT_DIR "/" @@ -91,13 +91,13 @@ #ifndef __no_pnglib__ #define NB_KNOWN_FORMATS 13 // Nombre de formats connus (devrait être la valeur maximale de NB_FORMATS_LOAD et NB_FORMATS_SAVE, mais plus généralement: Card({NB_FORMATS_LOAD} UNION {NB_FORMATS_SAVE})) -#define NB_FORMATS_LOAD 13 // Nombre de formats que l'on sait charger -#define NB_FORMATS_SAVE 13 // Nombre de formats que l'on sait sauver +#define NB_FORMATS_LOAD 13 // Nombre de formats que l'on sait charger +#define NB_FORMATS_SAVE 13 // Nombre de formats que l'on sait sauver #else // Without pnglib #define NB_KNOWN_FORMATS 12 // Nombre de formats connus (devrait être la valeur maximale de NB_FORMATS_LOAD et NB_FORMATS_SAVE, mais plus généralement: Card({NB_FORMATS_LOAD} UNION {NB_FORMATS_SAVE})) -#define NB_FORMATS_LOAD 12 // Nombre de formats que l'on sait charger -#define NB_FORMATS_SAVE 12 // Nombre de formats que l'on sait sauver +#define NB_FORMATS_LOAD 12 // Nombre de formats que l'on sait charger +#define NB_FORMATS_SAVE 12 // Nombre de formats que l'on sait sauver #endif enum FILE_FORMATS diff --git a/engine.c b/engine.c index 241fb5b5..5ffc645d 100644 --- a/engine.c +++ b/engine.c @@ -139,8 +139,8 @@ char * Menu_tooltip[NB_BUTTONS]= "Kill current page ", "Quit ", "Palette editor ", - "Scroll pal. left / Fast ", - "Scroll pal. right / Fast", + "Scroll pal. bkwd / Fast ", + "Scroll pal. fwd / Fast ", "Color #" , "Hide tool bar " }; diff --git a/gfx2def.ini b/gfx2def.ini index 08a7961f..7db8a8a3 100644 --- a/gfx2def.ini +++ b/gfx2def.ini @@ -323,4 +323,10 @@ Bookmark_label = Bookmark_directory = + ; In the classic layout, the palette in the menu has colors from left to + ; right. If you prefer the colors ordered top to bottom, set this option + ; to YES. + ; + Palette_vertical = NO; (Default NO) + ; end of configuration diff --git a/gfx2gui.gif b/gfx2gui.gif index 4b328cb7ef7b50ecf202a7d6154b9d40871c41c8..9429fb684fb039c29b48eee715d118e686d25c29 100644 GIT binary patch delta 17355 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 Cnl&Z> delta 17312 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 zh*PH;UL@G6v-%(rl&ibitG^no!&Position!=256-Config.Palette_cells_X || lines_slider->Position!=16-Config.Palette_cells_Y) { Config.Palette_cells_X = 256-columns_slider->Position; Config.Palette_cells_Y = 16-lines_slider->Position; - Change_palette_cells(); palette_needs_redraw=1; } if (rgb_scale_slider->Position!=256-RGB_scale) @@ -2165,5 +2180,9 @@ void Button_Pecondary_palette(void) Menu_tag_colors("Tag colors to exclude",Exclude_color,&dummy,1, NULL); } if (palette_needs_redraw) + { + Change_palette_cells(); Display_menu(); + Display_sprite_in_menu(BUTTON_PAL_LEFT,18+(Config.Palette_vertical!=0)); + } } diff --git a/palette.h b/palette.h index d4a046bc..c328b5e3 100644 --- a/palette.h +++ b/palette.h @@ -19,7 +19,7 @@ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ void Button_Palette(void); -void Button_Pecondary_palette(void); +void Button_Secondary_palette(void); // Choose the number of graduations for RGB components, from 2 to 256. void Set_palette_RGB_scale(int); diff --git a/readini.c b/readini.c index 90292c2d..c04ff89b 100644 --- a/readini.c +++ b/readini.c @@ -765,7 +765,14 @@ int Load_INI(T_Config * conf) else break; } - + conf->Palette_vertical=0; + // Optionnel, vertical palette option (>98.0%) + if (!Load_INI_get_values (file,buffer,"Palette_vertical",1,values)) + { + if ((values[0]<0) || (values[0]>1)) + goto Erreur_ERREUR_INI_CORROMPU; + conf->Palette_vertical=values[0]; + } fclose(file); free(filename); diff --git a/saveini.c b/saveini.c index 7b186f56..b3217844 100644 --- a/saveini.c +++ b/saveini.c @@ -627,6 +627,10 @@ int Save_INI(T_Config * conf) if ((return_code=Save_INI_set_strings (Ancien_fichier,Nouveau_fichier,buffer,"Bookmark_directory",conf->Bookmark_directory[index]))) goto Erreur_Retour; } + values[0]=(conf->Palette_vertical); + if ((return_code=Save_INI_set_values (Ancien_fichier,Nouveau_fichier,buffer,"Palette_vertical",1,values,1))) + goto Erreur_Retour; + Save_INI_flush(Ancien_fichier,Nouveau_fichier,buffer); diff --git a/struct.h b/struct.h index 8158f308..5ff9253c 100644 --- a/struct.h +++ b/struct.h @@ -238,6 +238,7 @@ typedef struct byte Couleurs_separees; word Palette_cells_X; word Palette_cells_Y; + byte Palette_vertical; byte FX_Feedback; byte Safety_colors; byte Opening_message; diff --git a/windows.c b/windows.c index 54a9690a..a4a5901f 100644 --- a/windows.c +++ b/windows.c @@ -157,8 +157,40 @@ void Display_foreback(void) } } - // -- Tracer un cadre de couleur autour de la Fore_color dans le menu -- +/*! Get the top left corner for the palette cell of a color + @param index Index of the color, starting at 0 for the top left one. Limited to Menu_cells_X/Menu_cells_Y. +*/ +word Palette_cell_X(byte index) +{ + if (Config.Palette_vertical) + { + return (MENU_WIDTH+1+((index-First_color_in_palette)%Menu_cells_X)*Menu_palette_cell_width)*Menu_factor_X; + } + else + { + return (MENU_WIDTH+1+((index-First_color_in_palette)/Menu_cells_Y)*Menu_palette_cell_width)*Menu_factor_X; + } +} +/*! Get the top left corner for the palette cell of a color + @param index Index of the color, starting at 0 for the top left one. Limited to Menu_cells_X/Menu_cells_Y. +*/ +word Palette_cell_Y(byte index) +{ + if (Config.Palette_vertical) + { + return Menu_Y+((2+(((index-First_color_in_palette)/Menu_cells_X)*(32/Menu_cells_Y)))*Menu_factor_Y); + } + else + { + return Menu_Y+((2+(((index-First_color_in_palette)%Menu_cells_Y)*(32/Menu_cells_Y)))*Menu_factor_Y); + } +} + +/// +/// Redraw the cell in the menu palette for ::Fore_color. +/// This function checks bounds, it won't draw anything if Fore_color is not visible. +/// @param color: Pass MC_White to mark the color with a frame, MC_Black to unmark it. void Frame_menu_color(byte color) { word start_x,start_y,end_x,end_y; @@ -169,8 +201,8 @@ void Frame_menu_color(byte color) { if (Config.Couleurs_separees) { - start_x=(MENU_WIDTH+((Fore_color-First_color_in_palette)/Menu_cells_Y)*Menu_palette_cell_width)*Menu_factor_X; - start_y=Menu_Y+((1+(((Fore_color-First_color_in_palette)%Menu_cells_Y)*cell_height))*Menu_factor_Y); + start_x=Palette_cell_X(Fore_color)-1*Menu_factor_X; + start_y=Palette_cell_Y(Fore_color)-1*Menu_factor_Y; Block(start_x,start_y,(Menu_palette_cell_width+1)*Menu_factor_X,Menu_factor_Y,color); Block(start_x,start_y+(Menu_factor_Y*cell_height),(Menu_palette_cell_width+1)*Menu_factor_X,Menu_factor_Y,color); @@ -184,39 +216,40 @@ void Frame_menu_color(byte color) { if (color==MC_Black) { - start_x=(MENU_WIDTH+1+((Fore_color-First_color_in_palette)/Menu_cells_Y)*Menu_palette_cell_width)*Menu_factor_X; - start_y=Menu_Y+((2+(((Fore_color-First_color_in_palette)%Menu_cells_Y)*cell_height))*Menu_factor_Y); + start_x=Palette_cell_X(Fore_color); + start_y=Palette_cell_Y(Fore_color); Block(start_x,start_y,Menu_palette_cell_width*Menu_factor_X, - Menu_factor_Y*cell_height,Fore_color); + cell_height*Menu_factor_Y,Fore_color); - Update_rect(start_x,start_y,Menu_palette_cell_width*Menu_factor_X,Menu_factor_Y*cell_height); + Update_rect(start_x,start_y,Menu_palette_cell_width*Menu_factor_X,cell_height*Menu_factor_Y); } else { - start_x=MENU_WIDTH+1+((Fore_color-First_color_in_palette)/Menu_cells_Y)*Menu_palette_cell_width; - start_y=2+(((Fore_color-First_color_in_palette)%Menu_cells_Y)*cell_height); + start_x=Palette_cell_X(Fore_color); + start_y=Palette_cell_Y(Fore_color); - end_x=start_x+Menu_palette_cell_width-1; - end_y=start_y+cell_height-1; + end_x=Menu_palette_cell_width-1; + end_y=cell_height-1; - for (index=start_x; index<=end_x; index++) - Block(index*Menu_factor_X,Menu_Y+(start_y*Menu_factor_Y), + // Top line + for (index=0; index<=end_x; index++) + Block(start_x+index*Menu_factor_X,start_y, Menu_factor_X,Menu_factor_Y, - ((index+start_y)&1)?MC_White:MC_Black); - - for (index=start_y+1; index=First_color_in_palette+Menu_cells_X*Menu_cells_Y) - First_color_in_palette+=Menu_cells_Y; + First_color_in_palette+=cells; } if (old_color!=First_color_in_palette) Display_menu_palette(); @@ -300,8 +339,11 @@ void Change_palette_cells() Menu_cells_X--; } - // Cale First_color_in_palette sur un multiple de cells_y (arrondi inférieur) - First_color_in_palette=First_color_in_palette/Menu_cells_Y*Menu_cells_Y; + // Cale First_color_in_palette sur un multiple du nombre de cellules (arrondi inférieur) + if (Config.Palette_vertical) + First_color_in_palette=First_color_in_palette/Menu_cells_X*Menu_cells_X; + else + First_color_in_palette=First_color_in_palette/Menu_cells_Y*Menu_cells_Y; // Si le nombre de cellules a beaucoup augmenté et qu'on était près de // la fin, il faut reculer First_color_in_palette pour montrer plein @@ -325,10 +367,18 @@ int Pick_color_in_palette() { int color; int line; + int column; + line=(((Mouse_Y-Menu_Y)/Menu_factor_Y)-2)/(32/Menu_cells_Y); - - color=First_color_in_palette+line+ - ((((Mouse_X/Menu_factor_X)-(MENU_WIDTH+1))/Menu_palette_cell_width)*Menu_cells_Y); + column=(((Mouse_X/Menu_factor_X)-(MENU_WIDTH+1))/Menu_palette_cell_width); + if (Config.Palette_vertical) + { + color=First_color_in_palette+line*Menu_cells_X+column; + } + else + { + color=First_color_in_palette+line+column*Menu_cells_Y; + } if (color<0 || color>255) return -1; return color; @@ -1025,8 +1075,8 @@ void Display_menu_palette_avoiding_window(byte * table) { if (table[real_color]!=real_color) { - start_x=(MENU_WIDTH+1+(color/Menu_cells_Y)*Menu_palette_cell_width)*Menu_factor_X; - start_y=Menu_Y_before_window+((2+((color%Menu_cells_Y)*(32/Menu_cells_Y)))*Menu_factor_Y); + start_x=Palette_cell_X(real_color); + start_y=Palette_cell_Y(real_color); //Menu_Y_before_window ??! end_x=start_x+width; end_y=start_y+height;