diff --git a/boutons.c b/boutons.c index f243b12f..3f6e1af5 100644 --- a/boutons.c +++ b/boutons.c @@ -1184,9 +1184,7 @@ void Cocher_bouton_mode(short Pos_X, short Pos_Y, byte Etat) { byte Couleur; - if (Etat>=128) - Etat-=128; - switch (Etat) + switch (Etat & 0x7F) { case 0 : Couleur=CM_Blanc; break; case 1 : Couleur=CM_Clair; break; @@ -1276,7 +1274,6 @@ void Bouton_Resol(void) short Debut_liste; short Position_curseur; short Temp; - byte Temp2; char Chaine[5]; struct Fenetre_Bouton_special * Bouton_saisie_Width, * Bouton_saisie_Height; @@ -1314,14 +1311,14 @@ void Bouton_Resol(void) if (Mode_choisi>=6) { - if (Mode_choisi incompatible }; -GLOBAL struct S_Mode_video Mode_video[NB_MODES_VIDEO]; +GLOBAL struct S_Mode_video Mode_video[MAX_MODES_VIDEO]; +GLOBAL int Nb_modes_video; // Nombre de modes réellement recensés dans Mode_video[] GLOBAL struct { diff --git a/graph.c b/graph.c index aa8d804a..0b738b71 100644 --- a/graph.c +++ b/graph.c @@ -991,7 +991,7 @@ void Initialiser_mode_video(int Largeur, int Hauteur, int Fullscreen) if (!Fullscreen) Resolution_actuelle=0; else - for (Indice=1; Indice= MAX_MODES_VIDEO) + { + DEBUG("Erreur! Tentative de créer un mode de trop:", Numero); + return; + } + if (!Fullscreen) + Supporte = 128; // Prefere, non modifiable + else if (SDL_VideoModeOK(Largeur, Hauteur, 8, SDL_FULLSCREEN)) + Supporte = 1; // Supporte + else + Supporte = 128+3; // Non supporte, non modifiable + Mode_video[Numero].Largeur = Largeur; Mode_video[Numero].Hauteur = Hauteur; Mode_video[Numero].Mode = Mode; - Mode_video[Numero].Fullscreen = Plein_Ecran; + Mode_video[Numero].Fullscreen = Fullscreen; + Mode_video[Numero].Etat = Supporte; } @@ -1318,88 +1334,91 @@ void Definir_mode_video(int Numero, void Definition_des_modes_video(void) { // Numero LargHaut Mode FXFY Ratio Ref WinOnly Pointeur SDL_Rect** Modes; - int Indice=0; - Definir_mode_video( Indice++, 640,480,MODE_SDL, 0); - Definir_mode_video( Indice++, 320,200,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,224,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,240,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,256,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,270,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,282,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,300,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,360,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,400,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,448,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,480,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,512,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,540,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,564,MODE_SDL, 1); - Definir_mode_video( Indice++, 320,600,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,200,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,224,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,240,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,256,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,270,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,282,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,300,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,360,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,400,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,448,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,480,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,512,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,540,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,564,MODE_SDL, 1); - Definir_mode_video( Indice++, 360,600,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,200,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,224,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,240,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,256,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,270,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,282,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,300,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,360,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,400,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,448,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,480,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,512,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,540,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,564,MODE_SDL, 1); - Definir_mode_video( Indice++, 400,600,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,224,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,240,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,256,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,270,MODE_SDL, 1); - //Definir_mode_video( Indice++, 640,282,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,300,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,350,MODE_SDL, 1); - //Definir_mode_video( Indice++, 640,360,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,400,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,448,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,480,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,512,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,540,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,564,MODE_SDL, 1); - Definir_mode_video( Indice++, 640,600,MODE_SDL, 1); - Definir_mode_video( Indice++, 800,600,MODE_SDL, 1); - Definir_mode_video(Indice++,1024,768,MODE_SDL, 1); + Nb_modes_video=0; + Definir_mode_video( Nb_modes_video++, 640,480,MODE_SDL, 0); + Definir_mode_video( Nb_modes_video++, 320,200,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,224,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,240,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,256,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,270,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,282,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,300,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,360,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,400,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,448,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,480,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,512,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,540,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,564,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 320,600,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,200,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,224,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,240,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,256,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,270,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,282,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,300,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,360,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,400,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,448,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,480,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,512,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,540,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,564,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 360,600,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,200,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,224,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,240,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,256,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,270,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,282,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,300,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,360,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,400,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,448,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,480,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,512,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,540,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,564,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 400,600,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,224,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,240,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,256,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,270,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,300,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,350,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,400,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,448,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,480,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,512,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,540,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,564,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 640,600,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++, 800,600,MODE_SDL, 1); + Definir_mode_video( Nb_modes_video++,1024,768,MODE_SDL, 1); Modes = SDL_ListModes(NULL, SDL_FULLSCREEN); if ((Modes != (SDL_Rect**)0) && (Modes!=(SDL_Rect**)-1)) { + int Indice; for (Indice=0; Modes[Indice]; Indice++) { int Indice2; - for (Indice2=0; Indice2 < NB_MODES_VIDEO; Indice2++) + for (Indice2=1; Indice2 < Nb_modes_video; Indice2++) if (Modes[Indice]->w == Mode_video[Indice2].Largeur && Modes[Indice]->h == Mode_video[Indice2].Hauteur) { - Mode_video[Indice2].Etat = 1; + // Mode déja prévu: ok break; } + if (Indice2 >= Nb_modes_video) + { + // Nouveau mode à ajouter à la liste + Definir_mode_video( Nb_modes_video++,Modes[Indice]->w,Modes[Indice]->h,MODE_SDL, 1); + } } return; } - } //--------------------------------------------------------------------------- @@ -1787,14 +1806,18 @@ int Charger_CFG(int Tout_charger) !read_word_le(Handle, &CFG_Mode_video.Largeur) || !read_word_le(Handle, &CFG_Mode_video.Hauteur) ) goto Erreur_lecture_config; - - for (Indice2=0; Indice2>6)) + Mode_video[Indice2].Hauteur==CFG_Mode_video.Hauteur) { - Mode_video[Indice2].Etat=(Mode_video[Indice2].Etat&0xFC) | (CFG_Mode_video.Etat&3); + // On ne prend le paramètre utilisateur que si la résolution + // est effectivement supportée par SDL + // Seules les deux petits bits sont récupérés, car les anciens fichiers + // de configuration (DOS 96.5%) utilisaient d'autres bits. + if (! (Mode_video[Indice2].Etat & 128)) + Mode_video[Indice2].Etat=CFG_Mode_video.Etat&3; break; } } @@ -1957,6 +1980,7 @@ int Sauver_CFG(void) FILE* Handle; int Indice; int Indice2; + int Modes_a_sauver; //byte Octet; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; struct Config_Header CFG_Header; @@ -2007,23 +2031,31 @@ int Sauver_CFG(void) goto Erreur_sauvegarde_config; } + // D'abord compter les modes pour lesquels l'utilisateur a mis une préférence + Modes_a_sauver=0; + for (Indice=1; Indice=128) - Erreur(ERREUR_MODE_VESA_INVALIDE); - else - if (Mode_video[Resolution_actuelle].Etat==3) - Erreur(ERREUR_MODE_INTERDIT); + if ((Mode_video[Resolution_actuelle].Etat & 0x7F) == 3) + Erreur(ERREUR_MODE_INTERDIT); } // ------------------------ Initialiser le programme ------------------------- diff --git a/readini.c b/readini.c index d47fa746..74da791e 100644 --- a/readini.c +++ b/readini.c @@ -606,7 +606,7 @@ int Charger_INI(struct S_Config * Conf) if ((Retour=Charger_INI_Get_values (Fichier,Buffer,"Default_video_mode",1,Valeurs))) goto Erreur_Retour; - if ((Valeurs[0]<0) || (Valeurs[0]>NB_MODES_VIDEO)) + if ((Valeurs[0]<0) || (Valeurs[0]>=Nb_modes_video)) goto Erreur_ERREUR_INI_CORROMPU; Conf->Resolution_par_defaut=Valeurs[0];