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
This commit is contained in:
Yves Rizoud 2009-02-09 21:44:15 +00:00
parent 990e016381
commit 82dc541a3c
8 changed files with 145 additions and 88 deletions

View File

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

View File

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

View File

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

11
graph.c
View File

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

View File

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

View File

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

115
windows.c
View File

@ -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+Config.Palette_Cells_X*Config.Palette_Cells_Y) && (Menu_visible))
if ((Fore_color>=Couleur_debut_palette) && (Fore_color<Couleur_debut_palette+Menu_Cellules_X*Menu_Cellules_Y) && (Menu_visible))
{
if (Config.Couleurs_separees)
{
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);
Debut_X=(LARGEUR_MENU+((Fore_color-Couleur_debut_palette)/Menu_Cellules_Y)*Menu_Taille_couleur)*Menu_Facteur_X;
Debut_Y=Menu_Ordonnee+((1+(((Fore_color-Couleur_debut_palette)%Menu_Cellules_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*Hauteur_cellule),(Menu_Taille_couleur+1)*Menu_Facteur_X,Menu_Facteur_Y,Couleur);
@ -164,8 +178,8 @@ void Encadrer_couleur_menu(byte Couleur)
{
if (Couleur==CM_Noir)
{
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);
Debut_X=(LARGEUR_MENU+1+((Fore_color-Couleur_debut_palette)/Menu_Cellules_Y)*Menu_Taille_couleur)*Menu_Facteur_X;
Debut_Y=Menu_Ordonnee+((2+(((Fore_color-Couleur_debut_palette)%Menu_Cellules_Y)*Hauteur_cellule))*Menu_Facteur_Y);
Block(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X,
Menu_Facteur_Y*Hauteur_cellule,Fore_color);
@ -174,8 +188,8 @@ void Encadrer_couleur_menu(byte Couleur)
}
else
{
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);
Debut_X=LARGEUR_MENU+1+((Fore_color-Couleur_debut_palette)/Menu_Cellules_Y)*Menu_Taille_couleur;
Debut_Y=2+(((Fore_color-Couleur_debut_palette)%Menu_Cellules_Y)*Hauteur_cellule);
Fin_X=Debut_X+Menu_Taille_couleur-1;
Fin_Y=Debut_Y+Hauteur_cellule-1;
@ -211,7 +225,7 @@ void Encadrer_couleur_menu(byte Couleur)
void Afficher_palette_du_menu(void)
{
int Couleur;
byte Hauteur_cellule=32/Config.Palette_Cells_Y;
byte Hauteur_cellule=32/Menu_Cellules_Y;
// Largeur: Menu_Taille_couleur
if (Menu_visible)
@ -219,16 +233,16 @@ void Afficher_palette_du_menu(void)
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<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),
for (Couleur=0;Couleur_debut_palette+Couleur<256&&Couleur<Menu_Cellules_X*Menu_Cellules_Y;Couleur++)
Block((LARGEUR_MENU+1+(Couleur/Menu_Cellules_Y)*Menu_Taille_couleur)*Menu_Facteur_X,
Menu_Ordonnee+((2+((Couleur%Menu_Cellules_Y)*Hauteur_cellule))*Menu_Facteur_Y),
(Menu_Taille_couleur-1)*Menu_Facteur_X,
Menu_Facteur_Y*(Hauteur_cellule-1),
Couleur_debut_palette+Couleur);
else
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),
for (Couleur=0;Couleur_debut_palette+Couleur<256&&Couleur<Menu_Cellules_X*Menu_Cellules_Y;Couleur++)
Block((LARGEUR_MENU+1+(Couleur/Menu_Cellules_Y)*Menu_Taille_couleur)*Menu_Facteur_X,
Menu_Ordonnee+((2+((Couleur%Menu_Cellules_Y)*Hauteur_cellule))*Menu_Facteur_Y),
Menu_Taille_couleur*Menu_Facteur_X,
Menu_Facteur_Y*Hauteur_cellule,
Couleur_debut_palette+Couleur);
@ -248,30 +262,71 @@ void Recadrer_palette(void)
if (Fore_color<Couleur_debut_palette)
{
while (Fore_color<Couleur_debut_palette)
Couleur_debut_palette-=Config.Palette_Cells_Y;
Couleur_debut_palette-=Menu_Cellules_Y;
}
else
{
while (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<Config.Palette_Cells_X*Config.Palette_Cells_Y;Couleur++,Vraie_couleur++)
for (Couleur=0,Vraie_couleur=Couleur_debut_palette;Couleur<Menu_Cellules_X*Menu_Cellules_Y;Couleur++,Vraie_couleur++)
{
if (Table[Vraie_couleur]!=Vraie_couleur)
{
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);
Debut_X=(LARGEUR_MENU+1+(Couleur/Menu_Cellules_Y)*Menu_Taille_couleur)*Menu_Facteur_X;
Debut_Y=Menu_Ordonnee_avant_fenetre+((2+((Couleur%Menu_Cellules_Y)*(32/Menu_Cellules_Y)))*Menu_Facteur_Y);
Fin_X=Debut_X+Largeur;
Fin_Y=Debut_Y+Hauteur;

View File

@ -39,7 +39,10 @@ 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 Changer_cellules_palette(void);
int Couleur_palette(void);
word Palette_Cells_X(void);
word Palette_Cells_Y(void);
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);