From 82dc541a3c786b8561e1c0063e784fe3d8b8b6b9 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Mon, 9 Feb 2009 21:44:15 +0000 Subject: [PATCH] Menu: Palette size is now free, 1-256 on X and 1-16 on Y (non-powers-of-two are accepted) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@622 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 69 +++++++++++++++++-------------- gfx2def.ini | 11 ++++- global.h | 4 +- graph.c | 11 +---- moteur.c | 12 ++---- readini.c | 6 +-- windows.c | 115 ++++++++++++++++++++++++++++++++++++++-------------- windows.h | 5 ++- 8 files changed, 145 insertions(+), 88 deletions(-) diff --git a/boutons.c b/boutons.c index 82a7489e..deeba44b 100644 --- a/boutons.c +++ b/boutons.c @@ -257,11 +257,13 @@ void Bouton_Redo(void) //---------------------------- SCROLL PALETTE LEFT --------------------------- void Bouton_Pal_left(void) { + short Cells_Y = Palette_Cells_Y(); + Effacer_curseur(); if (Couleur_debut_palette) { - if (Couleur_debut_palette>=Config.Palette_Cells_Y) - Couleur_debut_palette-=Config.Palette_Cells_Y; + if (Couleur_debut_palette>=Cells_Y) + Couleur_debut_palette-=Cells_Y; else Couleur_debut_palette=0; Afficher_palette_du_menu(); @@ -272,11 +274,14 @@ void Bouton_Pal_left(void) void Bouton_Pal_left_fast(void) { + short Cells_X = Palette_Cells_X(); + short Cells_Y = Palette_Cells_Y(); + Effacer_curseur(); if (Couleur_debut_palette) { - if (Couleur_debut_palette>=Config.Palette_Cells_Y*Config.Palette_Cells_X) - Couleur_debut_palette-=Config.Palette_Cells_Y*Config.Palette_Cells_X; + if (Couleur_debut_palette>=Cells_Y*Cells_X) + Couleur_debut_palette-=Cells_Y*Cells_X; else Couleur_debut_palette=0; Afficher_palette_du_menu(); @@ -289,13 +294,12 @@ void Bouton_Pal_left_fast(void) //--------------------------- SCROLL PALETTE RIGHT --------------------------- void Bouton_Pal_right(void) { + short Cells_Y = Palette_Cells_Y(); + Effacer_curseur(); - if ((int)Couleur_debut_palette+Config.Palette_Cells_Y*Config.Palette_Cells_X<256) + if ((int)Couleur_debut_palette+Cells_Y*Palette_Cells_X()<256) { - if ((int)Couleur_debut_palette+(Config.Palette_Cells_Y+1)*Config.Palette_Cells_X<256) - Couleur_debut_palette+=Config.Palette_Cells_Y; - else - Couleur_debut_palette=256-Config.Palette_Cells_Y*Config.Palette_Cells_X; + Couleur_debut_palette+=Cells_Y; Afficher_palette_du_menu(); } Desenclencher_bouton(BOUTON_PAL_RIGHT); @@ -304,13 +308,16 @@ void Bouton_Pal_right(void) void Bouton_Pal_right_fast(void) { + short Cells_X = Palette_Cells_X(); + short Cells_Y = Palette_Cells_Y(); + Effacer_curseur(); - if ((int)Couleur_debut_palette+Config.Palette_Cells_Y*Config.Palette_Cells_X<256) + if ((int)Couleur_debut_palette+Cells_Y*Cells_X<256) { - if ((int)Couleur_debut_palette+(Config.Palette_Cells_Y)*Config.Palette_Cells_X*2<256) - Couleur_debut_palette+=Config.Palette_Cells_X*Config.Palette_Cells_Y; + if ((int)Couleur_debut_palette+(Cells_Y)*Cells_X*2<256) + Couleur_debut_palette+=Cells_X*Cells_Y; else - Couleur_debut_palette=256-Config.Palette_Cells_Y*Config.Palette_Cells_X; + Couleur_debut_palette=255/Cells_Y*Cells_Y-(Cells_X-1)*Cells_Y; Afficher_palette_du_menu(); } Desenclencher_bouton(BOUTON_PAL_RIGHT); @@ -320,31 +327,31 @@ void Bouton_Pal_right_fast(void) //-------------------- Choix de la forecolor dans le menu -------------------- void Bouton_Choix_forecolor(void) { - word Pos_X, Pos_Y; + int Couleur=Couleur_palette(); - Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); - Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; - - Effacer_curseur(); - Encadrer_couleur_menu(CM_Noir); - Fore_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)*Config.Palette_Cells_Y)+(Pos_Y/(32/Config.Palette_Cells_Y)); - Encadrer_couleur_menu(CM_Blanc); - Afficher_foreback(); - Afficher_curseur(); + if (Couleur!=-1) + { + Effacer_curseur(); + Encadrer_couleur_menu(CM_Noir); + Fore_color=Couleur; + Encadrer_couleur_menu(CM_Blanc); + Afficher_foreback(); + Afficher_curseur(); + } } //-------------------- Choix de la backcolor dans le menu -------------------- void Bouton_Choix_backcolor(void) { - word Pos_X, Pos_Y; + int Couleur=Couleur_palette(); - Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); - Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; - - Effacer_curseur(); - Back_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)*Config.Palette_Cells_Y)+(Pos_Y/(32/Config.Palette_Cells_Y)); - Afficher_foreback(); - Afficher_curseur(); + if (Couleur!=-1) + { + Effacer_curseur(); + Back_color=Couleur; + Afficher_foreback(); + Afficher_curseur(); + } } diff --git a/gfx2def.ini b/gfx2def.ini index 30509e46..3ab7201b 100644 --- a/gfx2def.ini +++ b/gfx2def.ini @@ -297,7 +297,14 @@ ; steps into a single one. Merge_movement = 100 ; (default 100) - ; Number of lines in the menu's palette. Can be 1,2,4,8 or 16 + ; Number of columns in the palette of the menu bar. Can be any number from + ; 1 to 256. If there is not enough room, the program will display less + ; columns. But your preference will be kept, and as soon as there is more + ; space in the screen, more columns will be shown. + ; Palette_Cells_X = 8; (Default 8) - ; Number of columns in the menu's palette. Can be 1 to 21 + + ; Number of lines in the palette of the menu. Can be any number from + ; 1 to 16. The menu can always display the number of lines you request. + ; Palette_Cells_Y = 8; (Default 8) diff --git a/global.h b/global.h index 841831f3..3234ab0c 100644 --- a/global.h +++ b/global.h @@ -73,8 +73,8 @@ GFX2_GLOBAL struct S_Config byte Fast_zoom; byte Find_file_fast; byte Couleurs_separees; - short Palette_Cells_X; - short Palette_Cells_Y; + word Palette_Cells_X; + word Palette_Cells_Y; byte FX_Feedback; byte Safety_colors; byte Opening_message; diff --git a/graph.c b/graph.c index d5f945e3..17022db3 100644 --- a/graph.c +++ b/graph.c @@ -337,17 +337,8 @@ void Initialiser_mode_video(int Largeur, int Hauteur, int Fullscreen) } } - while (1) - { - Changer_cellules_palette(Config.Palette_Cells_X, Config.Palette_Cells_Y); - if (Menu_Taille_couleur>2) - break; - Config.Palette_Cells_X--; - } + Changer_cellules_palette(); - Menu_Taille_couleur = ((Largeur_ecran/Menu_Facteur_X)-(LARGEUR_MENU+2)) / Config.Palette_Cells_X; - Bouton[BOUTON_CHOIX_COL].Largeur=(Menu_Taille_couleur*Config.Palette_Cells_X)-1; - Menu_Ordonnee = Hauteur_ecran; if (Menu_visible) Menu_Ordonnee -= HAUTEUR_MENU * Menu_Facteur_Y; diff --git a/moteur.c b/moteur.c index 1ee33fba..68bb8612 100644 --- a/moteur.c +++ b/moteur.c @@ -494,7 +494,6 @@ void Deplacer_Split(void) } - //======================= Gestion principale du moteur ======================= void Gestion_principale(void) { @@ -984,16 +983,12 @@ void Gestion_principale(void) } else { // Le curseur est-il sur une couleur de la palette? - if (1) + int Couleur; + if ((Couleur=Couleur_palette())!=-1) { Effacer_curseur(); - Temp_color=Couleur_debut_palette; - Temp=Temp_color+ - ((((Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1))/Menu_Taille_couleur)*Config.Palette_Cells_Y)+ - ((((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2)/(32/Config.Palette_Cells_Y)); - strcpy(Chaine,TITRE_BOUTON[Indice_bouton]); - sprintf(Chaine+strlen(Chaine),"%d (%d,%d,%d)",Temp,Principal_Palette[Temp].R,Principal_Palette[Temp].V,Principal_Palette[Temp].B); + sprintf(Chaine+strlen(Chaine),"%d (%d,%d,%d)",Couleur,Principal_Palette[Couleur].R,Principal_Palette[Couleur].V,Principal_Palette[Couleur].B); for (Temp=strlen(Chaine); Temp<24; Temp++) Chaine[Temp]=' '; Chaine[24]=0; @@ -1006,6 +1001,7 @@ void Gestion_principale(void) { Effacer_curseur(); Block(18*Menu_Facteur_X,Menu_Ordonnee_Texte,192*Menu_Facteur_X,Menu_Facteur_Y<<3,CM_Clair); + UpdateRect(18*Menu_Facteur_X,Menu_Ordonnee_Texte,192*Menu_Facteur_X,8*Menu_Facteur_Y); Afficher_curseur(); } } diff --git a/readini.c b/readini.c index 8a18d570..e4820d84 100644 --- a/readini.c +++ b/readini.c @@ -709,7 +709,7 @@ int Charger_INI(struct S_Config * Conf) // Optionnel, nombre de colonnes dans la palette (>98.0%) if (!Charger_INI_Get_values (Fichier,Buffer,"Palette_Cells_X",1,Valeurs)) { - if ((Valeurs[0]<1) || (Valeurs[0]>32)) + if ((Valeurs[0]<1) || (Valeurs[0]>256)) goto Erreur_ERREUR_INI_CORROMPU; Conf->Palette_Cells_X=Valeurs[0]; } @@ -717,12 +717,10 @@ int Charger_INI(struct S_Config * Conf) // Optionnel, nombre de lignes dans la palette (>98.0%) if (!Charger_INI_Get_values (Fichier,Buffer,"Palette_Cells_Y",1,Valeurs)) { - if (Valeurs[0]!=1 && Valeurs[0]!=2 && Valeurs[0]!=4 && Valeurs[0]!=8 && Valeurs[0]!=16) + if (Valeurs[0]<1 || Valeurs[0]>16) goto Erreur_ERREUR_INI_CORROMPU; Conf->Palette_Cells_Y=Valeurs[0]; } - if (Conf->Palette_Cells_X*Conf->Palette_Cells_Y>256) - Conf->Palette_Cells_X=256/Conf->Palette_Cells_Y; fclose(Fichier); diff --git a/windows.c b/windows.c index 43f7a065..92d1b3d4 100644 --- a/windows.c +++ b/windows.c @@ -35,6 +35,20 @@ #include "sdlscreen.h" #include "erreurs.h" +// L'encapsulation tente une percée...ou un dernier combat. + +// Nombre de cellules réel dans la palette du menu +word Menu_Cellules_X; +word Palette_Cells_X() +{ + return Menu_Cellules_X; +} +word Menu_Cellules_Y; +word Palette_Cells_Y() +{ + return Menu_Cellules_Y; +} + // Affichage d'un pixel dans le menu (le menu doit être visible) void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur) { @@ -143,14 +157,14 @@ void Encadrer_couleur_menu(byte Couleur) { word Debut_X,Debut_Y,Fin_X,Fin_Y; word Indice; - word Hauteur_cellule=32/Config.Palette_Cells_Y; + word Hauteur_cellule=32/Menu_Cellules_Y; - if ((Fore_color>=Couleur_debut_palette) && (Fore_color=Couleur_debut_palette) && (Fore_color=Couleur_debut_palette+Config.Palette_Cells_X*Config.Palette_Cells_Y) - Couleur_debut_palette+=Config.Palette_Cells_Y; + while (Fore_color>=Couleur_debut_palette+Menu_Cellules_X*Menu_Cellules_Y) + Couleur_debut_palette+=Menu_Cellules_Y; } if (Ancienne_couleur!=Couleur_debut_palette) Afficher_palette_du_menu(); } -void Changer_cellules_palette(byte Cells_X, byte Cells_Y) +void Changer_cellules_palette() { - Config.Palette_Cells_X=Cells_X; - Config.Palette_Cells_Y=Cells_Y; + // On initialise avec la configuration de l'utilisateur + Menu_Cellules_X=Config.Palette_Cells_X; + Menu_Cellules_Y=Config.Palette_Cells_Y; + // Mais on sait jamais + if (Menu_Cellules_X<1) + Menu_Cellules_X=1; + if (Menu_Cellules_Y<1) + Menu_Cellules_Y=1; + + while (1) + { + Menu_Taille_couleur = ((Largeur_ecran/Menu_Facteur_X)-(LARGEUR_MENU+2)) / Menu_Cellules_X; + + // Si ça tient, c'est bon. Sinon, on retente avec une colonne de moins + if (Menu_Taille_couleur>2) + break; + Menu_Cellules_X--; + } // Cale Couleur_debut_palette sur un multiple de Cells_Y (arrondi inférieur) - Couleur_debut_palette=Couleur_debut_palette/Cells_Y*Cells_Y; + Couleur_debut_palette=Couleur_debut_palette/Menu_Cellules_Y*Menu_Cellules_Y; - // Mise à jour du menu - Menu_Taille_couleur = ((Largeur_ecran/Menu_Facteur_X)-(LARGEUR_MENU+2)) / Cells_X; - Bouton[BOUTON_CHOIX_COL].Largeur=(Menu_Taille_couleur*Config.Palette_Cells_X)-1; + // Si le nombre de cellules a beaucoup augmenté et qu'on était près de + // la fin, il faut reculer Couleur_debut_palette pour montrer plein + // de couleurs. + if ((int)Couleur_debut_palette+(Menu_Cellules_Y)*Menu_Cellules_X*2>=256) + Couleur_debut_palette=255/Menu_Cellules_Y*Menu_Cellules_Y-(Menu_Cellules_X-1)*Menu_Cellules_Y; + + // Mise à jour de la taille du bouton dans le menu. C'est pour pas que + // la bordure noire soit active. + Bouton[BOUTON_CHOIX_COL].Largeur=(Menu_Taille_couleur*Menu_Cellules_X)-1; + Bouton[BOUTON_CHOIX_COL].Hauteur=32/Menu_Cellules_Y*Menu_Cellules_Y-1; } +// Retrouve la couleur sur laquelle pointe le curseur souris. +// Cette fonction suppose qu'on a déja vérifié que le curseur est dans +// la zone rectangulaire du BOUTON_CHOIX_COL +// La fonction renvoie -1 si on est "trop à gauche" (pas possible) +// ou après la couleur 255 (Ce qui peut arriver si la palette est affichée +// avec un nombre de lignes qui n'est pas une puissance de deux.) +int Couleur_palette() +{ + int Col; + int Ligne; + Ligne=(((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2)/(32/Menu_Cellules_Y); + + Col=Couleur_debut_palette+Ligne+ + ((((Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1))/Menu_Taille_couleur)*Menu_Cellules_Y); + if (Col<0 || Col>255) + return -1; + return Col; +} // -- Afficher tout le menu -- @@ -948,20 +1003,20 @@ void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table) if (Config.Couleurs_separees) { Largeur=(Menu_Taille_couleur-1)*Menu_Facteur_X; - Hauteur=Menu_Facteur_Y*(32/Config.Palette_Cells_Y-1); + Hauteur=Menu_Facteur_Y*(32/Menu_Cellules_Y-1); } else { Largeur=Menu_Taille_couleur*Menu_Facteur_X; - Hauteur=Menu_Facteur_Y*(32/Config.Palette_Cells_Y); + Hauteur=Menu_Facteur_Y*(32/Menu_Cellules_Y); } - for (Couleur=0,Vraie_couleur=Couleur_debut_palette;Couleur