diff --git a/boutons.c b/boutons.c index 9051d956..82a7489e 100644 --- a/boutons.c +++ b/boutons.c @@ -260,7 +260,10 @@ void Bouton_Pal_left(void) Effacer_curseur(); if (Couleur_debut_palette) { - Couleur_debut_palette-=8; + if (Couleur_debut_palette>=Config.Palette_Cells_Y) + Couleur_debut_palette-=Config.Palette_Cells_Y; + else + Couleur_debut_palette=0; Afficher_palette_du_menu(); } Desenclencher_bouton(BOUTON_PAL_LEFT); @@ -272,7 +275,10 @@ void Bouton_Pal_left_fast(void) Effacer_curseur(); if (Couleur_debut_palette) { - Couleur_debut_palette=(Couleur_debut_palette>=64)? Couleur_debut_palette-64 : 0; + if (Couleur_debut_palette>=Config.Palette_Cells_Y*Config.Palette_Cells_X) + Couleur_debut_palette-=Config.Palette_Cells_Y*Config.Palette_Cells_X; + else + Couleur_debut_palette=0; Afficher_palette_du_menu(); } Desenclencher_bouton(BOUTON_PAL_LEFT); @@ -284,9 +290,12 @@ void Bouton_Pal_left_fast(void) void Bouton_Pal_right(void) { Effacer_curseur(); - if (Couleur_debut_palette<=184) + if ((int)Couleur_debut_palette+Config.Palette_Cells_Y*Config.Palette_Cells_X<256) { - Couleur_debut_palette+=8; + 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; Afficher_palette_du_menu(); } Desenclencher_bouton(BOUTON_PAL_RIGHT); @@ -296,9 +305,12 @@ void Bouton_Pal_right(void) void Bouton_Pal_right_fast(void) { Effacer_curseur(); - if (Couleur_debut_palette<=184) + if ((int)Couleur_debut_palette+Config.Palette_Cells_Y*Config.Palette_Cells_X<256) { - Couleur_debut_palette=(Couleur_debut_palette<=120)? Couleur_debut_palette+64 : 192; + 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; + else + Couleur_debut_palette=256-Config.Palette_Cells_Y*Config.Palette_Cells_X; Afficher_palette_du_menu(); } Desenclencher_bouton(BOUTON_PAL_RIGHT); @@ -313,16 +325,12 @@ void Bouton_Choix_forecolor(void) Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; - if ((!Config.Couleurs_separees) - || ((Pos_X%Menu_Taille_couleur!=Menu_Taille_couleur-1) && ((Pos_Y&3)!=3))) - { - Effacer_curseur(); - Encadrer_couleur_menu(CM_Noir); - Fore_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)<<3)+(Pos_Y>>2); - Encadrer_couleur_menu(CM_Blanc); - Afficher_foreback(); - Afficher_curseur(); - } + 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(); } //-------------------- Choix de la backcolor dans le menu -------------------- @@ -333,14 +341,10 @@ void Bouton_Choix_backcolor(void) Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; - if ((!Config.Couleurs_separees) - || ((Pos_X%Menu_Taille_couleur!=Menu_Taille_couleur-1) && ((Pos_Y&3)!=3))) - { - Effacer_curseur(); - Back_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)<<3)+(Pos_Y>>2); - Afficher_foreback(); - Afficher_curseur(); - } + 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(); } diff --git a/gfx2def.ini b/gfx2def.ini index 0114c997..30509e46 100644 --- a/gfx2def.ini +++ b/gfx2def.ini @@ -296,3 +296,8 @@ ; steps. A very high value (100) guarantees that Grafx2 merges all the mouse ; 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 + Palette_Cells_X = 8; (Default 8) + ; Number of columns in the menu's palette. Can be 1 to 21 + Palette_Cells_Y = 8; (Default 8) diff --git a/global.h b/global.h index b1ab8c2c..841831f3 100644 --- a/global.h +++ b/global.h @@ -73,6 +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; byte FX_Feedback; byte Safety_colors; byte Opening_message; diff --git a/graph.c b/graph.c index 5c80dbef..d5f945e3 100644 --- a/graph.c +++ b/graph.c @@ -337,12 +337,21 @@ void Initialiser_mode_video(int Largeur, int Hauteur, int Fullscreen) } } - Menu_Taille_couleur = ((Largeur_ecran/Menu_Facteur_X)-(LARGEUR_MENU+2)) >> 3; + while (1) + { + Changer_cellules_palette(Config.Palette_Cells_X, Config.Palette_Cells_Y); + if (Menu_Taille_couleur>2) + break; + Config.Palette_Cells_X--; + } + + 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; Menu_Ordonnee_Texte = Hauteur_ecran-(Menu_Facteur_Y<<3); - Bouton[BOUTON_CHOIX_COL].Largeur=(Menu_Taille_couleur<<3)-1; Sensibilite_X = Config.Indice_Sensibilite_souris_X; Sensibilite_Y = Config.Indice_Sensibilite_souris_Y; diff --git a/moteur.c b/moteur.c index d36f7077..1ee33fba 100644 --- a/moteur.c +++ b/moteur.c @@ -984,15 +984,13 @@ void Gestion_principale(void) } else { // Le curseur est-il sur une couleur de la palette? - if ( (!Config.Couleurs_separees) - || ( ( ((Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1))%Menu_Taille_couleur != Menu_Taille_couleur-1 ) - && ( (( ((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y) -2)&3)!=3 ) ) ) + if (1) { Effacer_curseur(); Temp_color=Couleur_debut_palette; Temp=Temp_color+ - ((((Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1))/Menu_Taille_couleur)<<3)+ - ((((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2)>>2); + ((((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); diff --git a/readini.c b/readini.c index 9490a22c..8a18d570 100644 --- a/readini.c +++ b/readini.c @@ -704,6 +704,25 @@ int Charger_INI(struct S_Config * Conf) goto Erreur_ERREUR_INI_CORROMPU; Conf->Mouse_Merge_movement=Valeurs[0]; } + + Conf->Palette_Cells_X=8; + // 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)) + goto Erreur_ERREUR_INI_CORROMPU; + Conf->Palette_Cells_X=Valeurs[0]; + } + Conf->Palette_Cells_Y=8; + // 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) + 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/saveini.c b/saveini.c index e582aa64..a5dab8a3 100644 --- a/saveini.c +++ b/saveini.c @@ -608,6 +608,14 @@ int Sauver_INI(struct S_Config * Conf) if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Merge_movement",1,Valeurs,0))) goto Erreur_Retour; + Valeurs[0]=(Conf->Palette_Cells_X); + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Palette_Cells_X",1,Valeurs,0))) + goto Erreur_Retour; + + Valeurs[0]=(Conf->Palette_Cells_Y); + if ((Retour=Sauver_INI_Set_values (Ancien_fichier,Nouveau_fichier,Buffer,"Palette_Cells_Y",1,Valeurs,0))) + goto Erreur_Retour; + Sauver_INI_Flush(Ancien_fichier,Nouveau_fichier,Buffer); fclose(Nouveau_fichier); diff --git a/windows.c b/windows.c index 472d40b9..43f7a065 100644 --- a/windows.c +++ b/windows.c @@ -143,41 +143,42 @@ 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; - if ((Fore_color>=Couleur_debut_palette) && (Fore_color=Couleur_debut_palette) && (Fore_color>3)*Menu_Taille_couleur)*Menu_Facteur_X; - Debut_Y=Menu_Ordonnee+((1+(((Fore_color-Couleur_debut_palette)&7)<<2))*Menu_Facteur_Y); + Debut_X=(LARGEUR_MENU+((Fore_color-Couleur_debut_palette)/Config.Palette_Cells_Y)*Menu_Taille_couleur)*Menu_Facteur_X; + Debut_Y=Menu_Ordonnee+((1+(((Fore_color-Couleur_debut_palette)%Config.Palette_Cells_Y)*Hauteur_cellule))*Menu_Facteur_Y); Block(Debut_X,Debut_Y,(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y,Couleur); - Block(Debut_X,Debut_Y+(Menu_Facteur_Y<<2),(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y,Couleur); + Block(Debut_X,Debut_Y+(Menu_Facteur_Y*Hauteur_cellule),(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y,Couleur); - Block(Debut_X,Debut_Y+Menu_Facteur_Y,Menu_Facteur_X,Menu_Facteur_Y*3,Couleur); - Block(Debut_X+(Menu_Taille_couleur*Menu_Facteur_X),Debut_Y+Menu_Facteur_Y,Menu_Facteur_X,Menu_Facteur_Y*3,Couleur); + Block(Debut_X,Debut_Y+Menu_Facteur_Y,Menu_Facteur_X,Menu_Facteur_Y*(Hauteur_cellule-1),Couleur); + Block(Debut_X+(Menu_Taille_couleur*Menu_Facteur_X),Debut_Y+Menu_Facteur_Y,Menu_Facteur_X,Menu_Facteur_Y*(Hauteur_cellule-1),Couleur); - UpdateRect(Debut_X,Debut_Y,(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y*4); + UpdateRect(Debut_X,Debut_Y,(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y*(Hauteur_cellule+1)); } else { if (Couleur==CM_Noir) { - Debut_X=(LARGEUR_MENU+1+((Fore_color-Couleur_debut_palette)>>3)*Menu_Taille_couleur)*Menu_Facteur_X; - Debut_Y=Menu_Ordonnee+((2+(((Fore_color-Couleur_debut_palette)&7)<<2))*Menu_Facteur_Y); + Debut_X=(LARGEUR_MENU+1+((Fore_color-Couleur_debut_palette)/Config.Palette_Cells_Y)*Menu_Taille_couleur)*Menu_Facteur_X; + Debut_Y=Menu_Ordonnee+((2+(((Fore_color-Couleur_debut_palette)%Config.Palette_Cells_Y)*Hauteur_cellule))*Menu_Facteur_Y); Block(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X, - Menu_Facteur_Y<<2,Fore_color); + Menu_Facteur_Y*Hauteur_cellule,Fore_color); - UpdateRect(Debut_X,Debut_Y,(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y*4); + UpdateRect(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X,Menu_Facteur_Y*Hauteur_cellule); } else { - Debut_X=LARGEUR_MENU+1+((Fore_color-Couleur_debut_palette)>>3)*Menu_Taille_couleur; - Debut_Y=2+(((Fore_color-Couleur_debut_palette)&7)<<2); + Debut_X=LARGEUR_MENU+1+((Fore_color-Couleur_debut_palette)/Config.Palette_Cells_Y)*Menu_Taille_couleur; + Debut_Y=2+(((Fore_color-Couleur_debut_palette)%Config.Palette_Cells_Y)*Hauteur_cellule); Fin_X=Debut_X+Menu_Taille_couleur-1; - Fin_Y=Debut_Y+3; + Fin_Y=Debut_Y+Hauteur_cellule-1; for (Indice=Debut_X; Indice<=Fin_X; Indice++) Block(Indice*Menu_Facteur_X,Menu_Ordonnee+(Debut_Y*Menu_Facteur_Y), @@ -199,7 +200,7 @@ void Encadrer_couleur_menu(byte Couleur) Menu_Facteur_X,Menu_Facteur_Y, ((Indice+Fin_Y)&1)?CM_Blanc:CM_Noir); - UpdateRect(Debut_X*Menu_Facteur_X,Debut_Y*Menu_Facteur_Y,Menu_Taille_couleur*Menu_Facteur_X,Menu_Ordonnee+Menu_Facteur_Y*4); + UpdateRect(Debut_X*Menu_Facteur_X,Debut_Y*Menu_Facteur_Y,Menu_Taille_couleur*Menu_Facteur_X,Menu_Ordonnee+Menu_Facteur_Y*Hauteur_cellule); } } } @@ -209,25 +210,27 @@ void Encadrer_couleur_menu(byte Couleur) void Afficher_palette_du_menu(void) { - byte Couleur; - + int Couleur; + byte Hauteur_cellule=32/Config.Palette_Cells_Y; + // Largeur: Menu_Taille_couleur + if (Menu_visible) { Block(LARGEUR_MENU*Menu_Facteur_X,Menu_Ordonnee,Largeur_ecran-(LARGEUR_MENU*Menu_Facteur_X),(HAUTEUR_MENU-9)*Menu_Facteur_Y,CM_Noir); if (Config.Couleurs_separees) - for (Couleur=0;Couleur<64;Couleur++) - Block((LARGEUR_MENU+1+(Couleur>>3)*Menu_Taille_couleur)*Menu_Facteur_X, - Menu_Ordonnee+((2+((Couleur&7)<<2))*Menu_Facteur_Y), + for (Couleur=0;Couleur>3)*Menu_Taille_couleur)*Menu_Facteur_X, - Menu_Ordonnee+((2+((Couleur&7)<<2))*Menu_Facteur_Y), + for (Couleur=0;Couleur=Couleur_debut_palette+64) - Couleur_debut_palette+=8; + while (Fore_color>=Couleur_debut_palette+Config.Palette_Cells_X*Config.Palette_Cells_Y) + Couleur_debut_palette+=Config.Palette_Cells_Y; } if (Ancienne_couleur!=Couleur_debut_palette) Afficher_palette_du_menu(); } +void Changer_cellules_palette(byte Cells_X, byte Cells_Y) +{ + Config.Palette_Cells_X=Cells_X; + Config.Palette_Cells_Y=Cells_Y; + + // Cale Couleur_debut_palette sur un multiple de Cells_Y (arrondi inférieur) + Couleur_debut_palette=Couleur_debut_palette/Cells_Y*Cells_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; +} // -- Afficher tout le menu -- @@ -448,7 +463,6 @@ void Print_coordonnees(void) void Print_nom_fichier(void) { - short Debut_X; char Nom_affiche[12+1]; int Taille_nom; if (Menu_visible) @@ -462,13 +476,11 @@ void Print_nom_fichier(void) Nom_affiche[11]=CARACTERE_SUSPENSION; Taille_nom = 12; } - - Block((LARGEUR_MENU+2+((Menu_Taille_couleur-12)<<3))*Menu_Facteur_X, + + Block(Largeur_ecran-96*Menu_Facteur_X, Menu_Ordonnee_Texte,Menu_Facteur_X*96,Menu_Facteur_Y<<3,CM_Clair); - Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-Taille_nom)<<3); - - Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Nom_affiche,CM_Noir,CM_Clair); + Print_general(Largeur_ecran-Taille_nom*8*Menu_Facteur_X,Menu_Ordonnee_Texte,Nom_affiche,CM_Noir,CM_Clair); } } @@ -936,20 +948,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*3; + Hauteur=Menu_Facteur_Y*(32/Config.Palette_Cells_Y-1); } else { Largeur=Menu_Taille_couleur*Menu_Facteur_X; - Hauteur=Menu_Facteur_Y<<2; + Hauteur=Menu_Facteur_Y*(32/Config.Palette_Cells_Y); } - for (Couleur=0,Vraie_couleur=Couleur_debut_palette;Couleur<64;Couleur++,Vraie_couleur++) + for (Couleur=0,Vraie_couleur=Couleur_debut_palette;Couleur>3)*Menu_Taille_couleur)*Menu_Facteur_X; - Debut_Y=Menu_Ordonnee_avant_fenetre+((2+((Couleur&7)<<2))*Menu_Facteur_Y); + Debut_X=(LARGEUR_MENU+1+(Couleur/Config.Palette_Cells_Y)*Menu_Taille_couleur)*Menu_Facteur_X; + Debut_Y=Menu_Ordonnee_avant_fenetre+((2+((Couleur%Config.Palette_Cells_Y)*(32/Config.Palette_Cells_Y)))*Menu_Facteur_Y); Fin_X=Debut_X+Largeur; Fin_Y=Debut_Y+Hauteur; diff --git a/windows.h b/windows.h index 2e18be87..9e761292 100644 --- a/windows.h +++ b/windows.h @@ -39,6 +39,7 @@ void Encadrer_couleur_menu(byte Couleur); void Afficher_palette_du_menu(void); void Afficher_menu(void); void Recadrer_palette(void); +void Changer_cellules_palette(byte Cells_X, byte Cells_Y); void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond); void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond);