Save/Load: Fixed backspace, limit 255 characters, various fixes for long filenames,
(linux) drive '~' uses $HOME environment variable. Fixed some more struct packing issues (ex: GIF saving) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@163 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
2a66650568
commit
ca8be4e399
@ -2133,7 +2133,7 @@ void Print_Nom_fichier_dans_selecteur(void)
|
||||
//
|
||||
{
|
||||
Block(Fenetre_Pos_X+(Menu_Facteur_X*(13+9*8)),Fenetre_Pos_Y+(Menu_Facteur_Y*90),Menu_Facteur_X*(27*8),Menu_Facteur_Y<<3,CM_Clair);
|
||||
Print_dans_fenetre(13+9*8,90,Principal_Nom_fichier,CM_Noir,CM_Clair);
|
||||
Print_dans_fenetre_limite(13+9*8,90,Principal_Nom_fichier,27,CM_Noir,CM_Clair);
|
||||
}
|
||||
|
||||
|
||||
@ -2593,7 +2593,7 @@ byte Bouton_Load_ou_Save(byte Load, byte Image)
|
||||
break;
|
||||
case 8 : // Saisie du nom de fichier
|
||||
Effacer_curseur();
|
||||
if (Readline(13+9*8,90,Principal_Nom_fichier,50,2))
|
||||
if (Readline(13+9*8,90,Principal_Nom_fichier,27,2))
|
||||
{
|
||||
// On regarde s'il faut rajouter une extension. C'est-à-dire s'il
|
||||
// n'y a pas de '.' dans le nom du fichier.
|
||||
|
||||
58
graph.c
58
graph.c
@ -542,7 +542,7 @@ void Liste2tables(word * Liste,short Pas,byte Mode,byte * Table_inc,byte * Table
|
||||
}
|
||||
|
||||
|
||||
// Transformer un nombre (entier naturel) en chaŒne
|
||||
// Transformer un nombre (entier naturel) en chaîne
|
||||
void Num2str(dword Nombre,char * Chaine,byte Taille)
|
||||
{
|
||||
int Indice;
|
||||
@ -558,7 +558,7 @@ void Num2str(dword Nombre,char * Chaine,byte Taille)
|
||||
Chaine[Taille]='\0';
|
||||
}
|
||||
|
||||
// Transformer une chaŒne en un entier naturel (renvoie -1 si ch. invalide)
|
||||
// Transformer une chaîne en un entier naturel (renvoie -1 si ch. invalide)
|
||||
int Str2num(char * Chaine)
|
||||
{
|
||||
int Valeur=0;
|
||||
@ -1032,14 +1032,14 @@ void Afficher_pixel(word X,word Y,byte Couleur)
|
||||
|
||||
// -- Interface avec le menu et les fenêtres ---------------------------------
|
||||
|
||||
// Affichage d'un pixel dans le menu (le menu doŒt être visible)
|
||||
// Affichage d'un pixel dans le menu (le menu doît être visible)
|
||||
|
||||
void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur)
|
||||
{
|
||||
Block_Fast(X*Menu_Facteur_X,(Y*Menu_Facteur_Y)+Menu_Ordonnee,Menu_Facteur_X,Menu_Facteur_Y,Couleur);
|
||||
}
|
||||
|
||||
// Affichage d'un pixel dans la fenêtre (la fenêtre doŒt être visible)
|
||||
// Affichage d'un pixel dans la fenêtre (la fenêtre doît être visible)
|
||||
|
||||
void Pixel_dans_fenetre(word X,word Y,byte Couleur)
|
||||
{
|
||||
@ -1354,7 +1354,7 @@ unsigned char Caractere_OEM[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||
|
||||
// -- Affichage de texte -----------------------------------------------------
|
||||
|
||||
// -- Afficher une chaŒne n'importe o— à l'écran --
|
||||
// -- Afficher une chaîne n'importe où à l'écran --
|
||||
|
||||
void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
|
||||
{
|
||||
@ -1388,10 +1388,9 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur
|
||||
|
||||
// -- Afficher un caractère dans une fenêtre --
|
||||
|
||||
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond)
|
||||
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond)
|
||||
{
|
||||
short X,Y;
|
||||
|
||||
Pos_X=(Pos_X*Menu_Facteur_X)+Fenetre_Pos_X;
|
||||
Pos_Y=(Pos_Y*Menu_Facteur_Y)+Fenetre_Pos_Y;
|
||||
|
||||
@ -1404,7 +1403,7 @@ void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur
|
||||
|
||||
// -- Afficher un caractère sans fond dans une fenêtre --
|
||||
|
||||
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur)
|
||||
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur)
|
||||
{
|
||||
short X,Y;
|
||||
|
||||
@ -1420,7 +1419,23 @@ void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,
|
||||
}
|
||||
}
|
||||
|
||||
// -- Afficher une chaŒne dans une fenêtre --
|
||||
// -- Afficher une chaîne dans une fenêtre, avec taille maxi --
|
||||
|
||||
void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond)
|
||||
{
|
||||
char Chaine_affichee[256];
|
||||
strncpy(Chaine_affichee, Chaine, Taille);
|
||||
Chaine_affichee[255]='\0';
|
||||
|
||||
if (strlen(Chaine_affichee) > Taille)
|
||||
{
|
||||
Chaine_affichee[Taille-1]=CARACTERE_TRIANGLE_DROIT;
|
||||
Chaine_affichee[Taille]='\0';
|
||||
}
|
||||
Print_dans_fenetre(X, Y, Chaine_affichee, Couleur_texte, Couleur_fond);
|
||||
}
|
||||
|
||||
// -- Afficher une chaîne dans une fenêtre --
|
||||
|
||||
void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
|
||||
{
|
||||
@ -1429,7 +1444,7 @@ void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Co
|
||||
Chaine,Couleur_texte,Couleur_fond);
|
||||
}
|
||||
|
||||
// -- Afficher une chaŒne dans le menu --
|
||||
// -- Afficher une chaîne dans le menu --
|
||||
|
||||
void Print_dans_menu(char * Chaine, short Position)
|
||||
{
|
||||
@ -1473,15 +1488,24 @@ void Print_coordonnees(void)
|
||||
void Print_nom_fichier(void)
|
||||
{
|
||||
short Debut_X;
|
||||
|
||||
|
||||
if (Menu_visible)
|
||||
{
|
||||
// Si le nom de fichier fait plus de 12 caractères, on n'affiche que les 12 derniers
|
||||
char * Nom_affiche = Principal_Nom_fichier;
|
||||
int Taille_nom =strlen(Principal_Nom_fichier);
|
||||
if (Taille_nom>12)
|
||||
{
|
||||
Nom_affiche=Principal_Nom_fichier + Taille_nom - 12;
|
||||
Taille_nom = 12;
|
||||
}
|
||||
|
||||
Block((LARGEUR_MENU+2+((Menu_Taille_couleur-12)<<3))*Menu_Facteur_X,
|
||||
Menu_Ordonnee_Texte,Menu_Facteur_X*96,Menu_Facteur_Y<<3,CM_Clair);
|
||||
|
||||
Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-strlen(Principal_Nom_fichier))<<3);
|
||||
Debut_X=LARGEUR_MENU+2+((Menu_Taille_couleur-Taille_nom)<<3);
|
||||
|
||||
Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Principal_Nom_fichier,CM_Noir,CM_Clair);
|
||||
Print_general(Debut_X*Menu_Facteur_X,Menu_Ordonnee_Texte,Nom_affiche,CM_Noir,CM_Clair);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4727,12 +4751,12 @@ void Degrade_de_trames_simples(long Indice,short Pos_X,short Pos_Y)
|
||||
// dans cette procédure par "Position_dans_degrade", on calcule la position
|
||||
// de l'indice dans le schéma suivant:
|
||||
//
|
||||
// Ú Les indices qui traŒnent de ce c“té du segment se voient subir
|
||||
// Ú Les indices qui traînent de ce c“té du segment se voient subir
|
||||
// ³ une incrémentation conditionnelle à leur position dans l'écran.
|
||||
// v
|
||||
// ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄúúú ú ú
|
||||
// ^
|
||||
// ÀÄ Les indices qui traŒnent de ce c“té du segment se voient subir une
|
||||
// ÀÄ Les indices qui traînent de ce c“té du segment se voient subir une
|
||||
// décrémentation conditionnelle à leur position dans l'écran.
|
||||
|
||||
// On fait d'abord un premier calcul partiel
|
||||
@ -4799,12 +4823,12 @@ void Degrade_de_trames_etendues(long Indice,short Pos_X,short Pos_Y)
|
||||
// dans cette procédure par "Position_dans_degrade", on calcule la position
|
||||
// de l'indice dans le schéma suivant:
|
||||
//
|
||||
// Ú Les indices qui traŒnent de ce c“té du segment se voient subir
|
||||
// Ú Les indices qui traînent de ce c“té du segment se voient subir
|
||||
// ³ une incrémentation conditionnelle à leur position dans l'écran.
|
||||
// v
|
||||
// ÃÄÄÄÅÄÄÄÅÄÄÄÅÄÄÄúúú ú ú
|
||||
// ^
|
||||
// ÀÄ Les indices qui traŒnent de ce c“té du segment se voient subir une
|
||||
// ÀÄ Les indices qui traînent de ce c“té du segment se voient subir une
|
||||
// décrémentation conditionnelle à leur position dans l'écran.
|
||||
|
||||
// On fait d'abord un premier calcul partiel
|
||||
|
||||
5
graph.h
5
graph.h
@ -38,8 +38,9 @@ void Recadrer_palette(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);
|
||||
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur_texte,byte Couleur_fond);
|
||||
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,char Caractere,byte Couleur);
|
||||
void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond);
|
||||
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond);
|
||||
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur);
|
||||
void Print_dans_menu(char * Chaine, short Position);
|
||||
void Print_coordonnees(void);
|
||||
void Print_nom_fichier(void);
|
||||
|
||||
13
init.c
13
init.c
@ -140,6 +140,19 @@ void Rechercher_drives(void)
|
||||
// Renvoie 0 si ok, -1 si problème.
|
||||
int ActiverLecteur(int NumeroLecteur)
|
||||
{
|
||||
// Cas particulier du lecteur ~
|
||||
if (Drive[NumeroLecteur].Lettre == '~')
|
||||
{
|
||||
char * Home = getenv("HOME");
|
||||
if (! Home)
|
||||
return -1;
|
||||
#ifdef __linux__
|
||||
return chdir(Home);
|
||||
#else
|
||||
return ! SetCurrentDirectory(Home);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
char NomLecteur[]=" ";
|
||||
NomLecteur[0]=Drive[NumeroLecteur].Lettre;
|
||||
|
||||
20
loadsave.c
20
loadsave.c
@ -758,7 +758,7 @@ typedef struct
|
||||
word Hauteur;
|
||||
byte Filler2[118];
|
||||
T_Palette Palette;
|
||||
} T_Header_IMG;
|
||||
} __attribute__((__packed__)) T_Header_IMG;
|
||||
|
||||
// -- Tester si un fichier est au format IMG --------------------------------
|
||||
void Test_IMG(void)
|
||||
@ -931,7 +931,7 @@ typedef struct
|
||||
T_Palette Palette; // Palette RVB 256*3
|
||||
word Jump; // Taille du saut entre le header et l'image:
|
||||
// On va s'en servir pour rajouter un commentaire
|
||||
} T_Header_PKM;
|
||||
} __attribute__((__packed__)) T_Header_PKM;
|
||||
|
||||
// -- Tester si un fichier est au format PKM --------------------------------
|
||||
void Test_PKM(void)
|
||||
@ -1357,7 +1357,7 @@ typedef struct
|
||||
byte Yaspect; // Inutile
|
||||
short Xscreen;
|
||||
short Yscreen;
|
||||
} T_Header_LBM;
|
||||
} __attribute__((__packed__)) T_Header_LBM;
|
||||
|
||||
// -- Tester si un fichier est au format LBM --------------------------------
|
||||
|
||||
@ -2118,7 +2118,7 @@ typedef struct
|
||||
uint32_t YPM;
|
||||
uint32_t Nb_Clr;
|
||||
uint32_t Clr_Imprt;
|
||||
} T_BMP_Header;
|
||||
} __attribute__((__packed__)) T_BMP_Header;
|
||||
|
||||
// -- Tester si un fichier est au format BMP --------------------------------
|
||||
void Test_BMP(void)
|
||||
@ -2545,7 +2545,7 @@ typedef struct
|
||||
byte Resol; // Informations sur la résolution (et autres)
|
||||
byte Backcol; // Couleur de fond
|
||||
byte Aspect; // Informations sur l'aspect ratio (et autres)
|
||||
} T_LSDB; // Logical Screen Descriptor Block
|
||||
} __attribute__((__packed__)) T_LSDB; // Logical Screen Descriptor Block
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -2555,7 +2555,7 @@ typedef struct
|
||||
word Hauteur_image; // Hauteur de l'image
|
||||
byte Indicateur; // Informations diverses sur l'image
|
||||
byte Nb_bits_pixel; // Nb de bits par pixel
|
||||
} T_IDB; // Image Descriptor Block
|
||||
} __attribute__((__packed__)) T_IDB; // Image Descriptor Block
|
||||
|
||||
// -- Tester si un fichier est au format GIF --------------------------------
|
||||
|
||||
@ -3855,7 +3855,7 @@ typedef struct
|
||||
{
|
||||
word Width; // Largeur de l'image
|
||||
word Height; // Hauteur de l'image
|
||||
} T_CEL_Header1;
|
||||
} __attribute__((__packed__)) T_CEL_Header1;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -3868,7 +3868,7 @@ typedef struct
|
||||
word Decalage_X; // Decalage en X de l'image
|
||||
word Decalage_Y; // Decalage en Y de l'image
|
||||
byte Filler2[16]; // ???
|
||||
} T_CEL_Header2;
|
||||
} __attribute__((__packed__)) T_CEL_Header2;
|
||||
|
||||
// -- Tester si un fichier est au format CEL --------------------------------
|
||||
|
||||
@ -4163,7 +4163,7 @@ typedef struct
|
||||
byte Octet2;
|
||||
} Couleur[16];
|
||||
} Palette[10];
|
||||
} T_KCF_Header;
|
||||
} __attribute__((__packed__)) T_KCF_Header;
|
||||
|
||||
// -- Tester si un fichier est au format KCF --------------------------------
|
||||
|
||||
@ -4419,7 +4419,7 @@ typedef struct
|
||||
word Hauteur;
|
||||
byte Filler2;
|
||||
byte Plans;
|
||||
} T_SCx_Header;
|
||||
} __attribute__((__packed__)) T_SCx_Header;
|
||||
|
||||
// -- Tester si un fichier est au format SCx --------------------------------
|
||||
void Test_SCx(void)
|
||||
|
||||
27
readline.c
27
readline.c
@ -79,7 +79,7 @@ void Rafficher_toute_la_chaine(word Pos_X,word Pos_Y,char * Chaine,byte Position
|
||||
//****************************************************************************
|
||||
//* Enhanced super scanf deluxe pro plus giga mieux :-) *
|
||||
//****************************************************************************
|
||||
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie)
|
||||
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_affichee,byte Type_saisie)
|
||||
// Paramètres:
|
||||
// Pos_X, Pos_Y : Coordonnées de la saisie dans la fenêtre
|
||||
// Chaine : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
|
||||
@ -94,13 +94,13 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
|
||||
byte Taille;
|
||||
word Touche_lue=0;
|
||||
byte Touche_autorisee;
|
||||
byte Taille_affichee;
|
||||
byte Taille_maxi;
|
||||
// Grosse astuce pour les noms de fichiers: La taille affichée est différente
|
||||
// de la taille maximum gérée.
|
||||
if (Type_saisie == 2)
|
||||
Taille_affichee = 27;
|
||||
Taille_maxi = 255;
|
||||
else
|
||||
Taille_affichee = Taille_maxi;
|
||||
Taille_maxi = Taille_affichee;
|
||||
byte Offset=0; // Indice du premier caractère affiché
|
||||
|
||||
|
||||
@ -118,6 +118,8 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
|
||||
|
||||
Taille=strlen(Chaine);
|
||||
Position=(Taille<Taille_maxi)? Taille:Taille-1;
|
||||
if (Position-Offset>Taille_affichee)
|
||||
Offset=Position-Taille_affichee+1;
|
||||
// Formatage d'une partie de la chaine (si trop longue pour tenir)
|
||||
strncpy(Chaine_affichee, Chaine + Offset, Taille_affichee);
|
||||
Chaine_affichee[Taille_affichee]='\0';
|
||||
@ -191,10 +193,13 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
|
||||
goto affichage;
|
||||
}
|
||||
break;
|
||||
case SDLK_BACKSPACE :
|
||||
case SDLK_BACKSPACE : // Backspace : combinaison de gauche + suppr
|
||||
if (Position)
|
||||
{
|
||||
Supprimer_caractere(Chaine,--Position);
|
||||
{
|
||||
Position--;
|
||||
if (Offset > 0 && (Position == 0 || Position < (Offset + 1)))
|
||||
Offset--;
|
||||
Supprimer_caractere(Chaine,Position);
|
||||
Taille--;
|
||||
// Effacement de la chaîne
|
||||
Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y),
|
||||
@ -242,8 +247,6 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
|
||||
if (Taille<Taille_maxi)
|
||||
{
|
||||
Position++;
|
||||
//if (Position > Taille_affichee + Offset - 2 && !(Position<Taille) && (Position<Taille_maxi-1))
|
||||
//if (Offset + Taille_affichee < Taille_maxi && (Position == Taille || (Position > Taille_affichee + Offset - 2)))
|
||||
if (Chaine_affichee[Position-Offset]==CARACTERE_TRIANGLE_DROIT || Position-Offset>=Taille_affichee)
|
||||
Offset++;
|
||||
}
|
||||
@ -270,7 +273,7 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
|
||||
|
||||
// Effacement de la chaîne
|
||||
Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y),
|
||||
Taille_maxi*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND);
|
||||
Taille_affichee*(Menu_Facteur_X<<3),(Menu_Facteur_Y<<3),COULEUR_FOND);
|
||||
// On raffiche la chaine correctement
|
||||
if (Type_saisie==1)
|
||||
{
|
||||
@ -282,7 +285,9 @@ byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_sai
|
||||
Print_dans_fenetre(Pos_X+((Taille_maxi-Taille)<<3),Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND);
|
||||
}
|
||||
else
|
||||
Print_dans_fenetre(Pos_X,Pos_Y,Chaine,COULEUR_TEXTE,COULEUR_FOND);
|
||||
{
|
||||
Print_dans_fenetre_limite(Pos_X,Pos_Y,Chaine,Taille_affichee,COULEUR_TEXTE,COULEUR_FOND);
|
||||
}
|
||||
|
||||
return (Touche_lue==SDLK_RETURN);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_maxi,byte Type_saisie);
|
||||
byte Readline(word Pos_X,word Pos_Y,char * Chaine,byte Taille_affichee,byte Type_saisie);
|
||||
// Paramètres:
|
||||
// Pos_X, Pos_Y : Coordonnées de la saisie dans la fenêtre
|
||||
// Chaine : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user