Configurable palette size (issue 47)

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@618 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2009-02-08 23:59:30 +00:00
parent dbdd73c0c3
commit bba08c936f
9 changed files with 128 additions and 70 deletions

View File

@ -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,17 +325,13 @@ 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);
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 --------------------
void Bouton_Choix_backcolor(void)
@ -333,15 +341,11 @@ 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);
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();
}
}
//---------------------- Cacher ou réafficher le menu ------------------------

View File

@ -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)

View File

@ -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;

13
graph.c
View File

@ -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;

View File

@ -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);

View File

@ -705,6 +705,25 @@ int Charger_INI(struct S_Config * Conf)
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);
free(Nom_du_fichier);

View File

@ -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);

View File

@ -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+64) && (Menu_visible))
if ((Fore_color>=Couleur_debut_palette) && (Fore_color<Couleur_debut_palette+Config.Palette_Cells_X*Config.Palette_Cells_Y) && (Menu_visible))
{
if (Config.Couleurs_separees)
{
Debut_X=(LARGEUR_MENU+((Fore_color-Couleur_debut_palette)>>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<Config.Palette_Cells_X*Config.Palette_Cells_Y;Couleur++)
Block((LARGEUR_MENU+1+(Couleur/Config.Palette_Cells_Y)*Menu_Taille_couleur)*Menu_Facteur_X,
Menu_Ordonnee+((2+((Couleur%Config.Palette_Cells_Y)*Hauteur_cellule))*Menu_Facteur_Y),
(Menu_Taille_couleur-1)*Menu_Facteur_X,
Menu_Facteur_Y*3,
Menu_Facteur_Y*(Hauteur_cellule-1),
Couleur_debut_palette+Couleur);
else
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<Config.Palette_Cells_X*Config.Palette_Cells_Y;Couleur++)
Block((LARGEUR_MENU+1+(Couleur/Config.Palette_Cells_Y)*Menu_Taille_couleur)*Menu_Facteur_X,
Menu_Ordonnee+((2+((Couleur%Config.Palette_Cells_Y)*Hauteur_cellule))*Menu_Facteur_Y),
Menu_Taille_couleur*Menu_Facteur_X,
Menu_Facteur_Y<<2,
Menu_Facteur_Y*Hauteur_cellule,
Couleur_debut_palette+Couleur);
Encadrer_couleur_menu(CM_Blanc);
@ -245,17 +248,29 @@ void Recadrer_palette(void)
if (Fore_color<Couleur_debut_palette)
{
while (Fore_color<Couleur_debut_palette)
Couleur_debut_palette-=8;
Couleur_debut_palette-=Config.Palette_Cells_Y;
}
else
{
while (Fore_color>=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)
@ -463,12 +477,10 @@ void Print_nom_fichier(void)
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<Config.Palette_Cells_X*Config.Palette_Cells_Y;Couleur++,Vraie_couleur++)
{
if (Table[Vraie_couleur]!=Vraie_couleur)
{
Debut_X=(LARGEUR_MENU+1+(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;

View File

@ -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);