#include #include #include #include #include #include #include #include #include #include "const.h" #include "struct.h" #include "global.h" #include "graph.h" #include "boutons.h" #include "palette.h" #include "aide.h" #include "operatio.h" #include "divers.h" #include "erreurs.h" #include "clavier.h" #include "io.h" #include "errno.h" #ifndef __linux__ #include "windows.h" #endif // Chercher le répertoire contenant GFX2.EXE void Chercher_repertoire_du_programme(char * Chaine) { Extraire_chemin(Repertoire_du_programme, Chaine); } word Drive_Touche[26]= { 0x041E, 0x0430, 0x042E, 0x0420, 0x0412, 0x0421, 0x0422, 0x0423, 0x0417, 0x0424, 0x0425, 0x0426, 0x0432, 0x0431, 0x0418, 0x0419, 0x0410, 0x0413, 0x041F, 0x0414, 0x0416, 0x042F, 0x0411, 0x042D, 0x0415, 0x042C }; // Ajouter un lecteur à la liste de lecteurs void Ajouter_lecteur(byte Numero, char Lettre, byte Type) { Drive[Nb_drives].Lettre=Lettre; Drive[Nb_drives].Type =Type; Drive[Nb_drives].Touche=Drive_Touche[Numero]; Nb_drives++; } // Rechercher la liste et le type des lecteurs de la machine void Rechercher_drives(void) { #ifdef __linux__ //Sous linux, il n'y a pas de lecteurs, on va juste mettre // un disque dur qui pointera vers la racine, // et un autre vers le home directory de l'utilisateur. Ajouter_lecteur(0,'/', LECTEUR_HDD); Ajouter_lecteur(1,'~', LECTEUR_HDD); #else int DriveBits = GetLogicalDrives(); int IndiceLecteur; int IndiceBit; // Sous Windows, on a la totale, presque aussi bien que sous DOS: IndiceLecteur = 0; for (IndiceBit=0; IndiceBit<26 && IndiceLecteur<23; IndiceBit++) { if ( (1 << IndiceBit) & DriveBits ) { // On a ce lecteur, il faut maintenant déterminer son type "physique". // pour profiter des jolies icones de X-man. int TypeLecteur; char CheminLecteur[]="A:\\"; // Cette API Windows est étrange, je dois m'y faire... CheminLecteur[0]='A'+IndiceBit; switch (GetDriveType(CheminLecteur)) { case DRIVE_CDROM: TypeLecteur=LECTEUR_CDROM; break; case DRIVE_REMOTE: TypeLecteur=LECTEUR_NETWORK; break; case DRIVE_REMOVABLE: TypeLecteur=LECTEUR_FLOPPY_3_5; break; case DRIVE_FIXED: TypeLecteur=LECTEUR_HDD; break; default: TypeLecteur=LECTEUR_NETWORK; break; } Ajouter_lecteur(IndiceBit, 'A'+IndiceBit, TypeLecteur); IndiceLecteur++; } } #endif } // Active un lecteur, changeant normalement le répertoire en cours. // 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; return chdir(NomLecteur); #else char NomLecteur[]="A:\\"; NomLecteur[0]=Drive[NumeroLecteur].Lettre; return ! SetCurrentDirectory(NomLecteur); #endif } // Fonction de décryptage #define DECRYPT_TAILLE_CLE 14 byte Decrypt_compteur=0; const char Decrypt_cle[DECRYPT_TAILLE_CLE]="Sunset Design"; byte Decrypt(byte Octet) { byte Temp; Temp=Octet ^ Decrypt_cle[Decrypt_compteur]; if ((++Decrypt_compteur)>=(DECRYPT_TAILLE_CLE-1)) Decrypt_compteur=0; return Temp; } // Décryptage d'une donnée void Decrypte(byte * Donnee,int Taille) { int Indice; for (Indice=0;Indice>Pos_X)) ? 1 : 0); // Lecture de la fonte alternative if (!read_bytes(Handle, Fonte_temporaire,2048)) Erreur(ERREUR_DAT_CORROMPU); for (Indice=0;Indice<256;Indice++) for (Pos_X=0;Pos_X<8;Pos_X++) for (Pos_Y=0;Pos_Y<8;Pos_Y++) Fonte_fun[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>Pos_X)) ? 1 : 0); free(Fonte_temporaire); Fonte=Fonte_systeme; // Lecture de la fonte 6x8: (spéciale aide) if (!read_bytes(Handle, Fonte_help,315*6*8)) Erreur(ERREUR_DAT_CORROMPU); // Le reste est actuellement une copie du fichier INI par défaut: // Pas besoin ici. fclose(Handle); Section_d_aide_en_cours=0; Position_d_aide_en_cours=0; Pinceau_predefini_Largeur[ 0]= 1; Pinceau_predefini_Hauteur[ 0]= 1; Pinceau_Type [ 0]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 1]= 2; Pinceau_predefini_Hauteur[ 1]= 2; Pinceau_Type [ 1]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 2]= 3; Pinceau_predefini_Hauteur[ 2]= 3; Pinceau_Type [ 2]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 3]= 4; Pinceau_predefini_Hauteur[ 3]= 4; Pinceau_Type [ 3]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 4]= 5; Pinceau_predefini_Hauteur[ 4]= 5; Pinceau_Type [ 4]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 5]= 7; Pinceau_predefini_Hauteur[ 5]= 7; Pinceau_Type [ 5]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 6]= 8; Pinceau_predefini_Hauteur[ 6]= 8; Pinceau_Type [ 6]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 7]=12; Pinceau_predefini_Hauteur[ 7]=12; Pinceau_Type [ 7]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 8]=16; Pinceau_predefini_Hauteur[ 8]=16; Pinceau_Type [ 8]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 9]=16; Pinceau_predefini_Hauteur[ 9]=16; Pinceau_Type [ 9]=FORME_PINCEAU_CARRE_TRAME; Pinceau_predefini_Largeur[10]=15; Pinceau_predefini_Hauteur[10]=15; Pinceau_Type [10]=FORME_PINCEAU_LOSANGE; Pinceau_predefini_Largeur[11]= 5; Pinceau_predefini_Hauteur[11]= 5; Pinceau_Type [11]=FORME_PINCEAU_LOSANGE; Pinceau_predefini_Largeur[12]= 3; Pinceau_predefini_Hauteur[12]= 3; Pinceau_Type [12]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[13]= 4; Pinceau_predefini_Hauteur[13]= 4; Pinceau_Type [13]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[14]= 5; Pinceau_predefini_Hauteur[14]= 5; Pinceau_Type [14]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[15]= 6; Pinceau_predefini_Hauteur[15]= 6; Pinceau_Type [15]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[16]= 8; Pinceau_predefini_Hauteur[16]= 8; Pinceau_Type [16]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[17]=10; Pinceau_predefini_Hauteur[17]=10; Pinceau_Type [17]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[18]=12; Pinceau_predefini_Hauteur[18]=12; Pinceau_Type [18]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[19]=14; Pinceau_predefini_Hauteur[19]=14; Pinceau_Type [19]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[20]=16; Pinceau_predefini_Hauteur[20]=16; Pinceau_Type [20]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[21]=15; Pinceau_predefini_Hauteur[21]=15; Pinceau_Type [21]=FORME_PINCEAU_ROND_TRAME; Pinceau_predefini_Largeur[22]=11; Pinceau_predefini_Hauteur[22]=11; Pinceau_Type [22]=FORME_PINCEAU_ROND_TRAME; Pinceau_predefini_Largeur[23]= 5; Pinceau_predefini_Hauteur[23]= 5; Pinceau_Type [23]=FORME_PINCEAU_ROND_TRAME; Pinceau_predefini_Largeur[24]= 2; Pinceau_predefini_Hauteur[24]= 1; Pinceau_Type [24]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[25]= 3; Pinceau_predefini_Hauteur[25]= 1; Pinceau_Type [25]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[26]= 4; Pinceau_predefini_Hauteur[26]= 1; Pinceau_Type [26]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[27]= 8; Pinceau_predefini_Hauteur[27]= 1; Pinceau_Type [27]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[28]= 1; Pinceau_predefini_Hauteur[28]= 2; Pinceau_Type [28]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[29]= 1; Pinceau_predefini_Hauteur[29]= 3; Pinceau_Type [29]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[30]= 1; Pinceau_predefini_Hauteur[30]= 4; Pinceau_Type [30]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[31]= 1; Pinceau_predefini_Hauteur[31]= 8; Pinceau_Type [31]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[32]= 3; Pinceau_predefini_Hauteur[32]= 3; Pinceau_Type [32]=FORME_PINCEAU_X; Pinceau_predefini_Largeur[33]= 5; Pinceau_predefini_Hauteur[33]= 5; Pinceau_Type [33]=FORME_PINCEAU_X; Pinceau_predefini_Largeur[34]= 5; Pinceau_predefini_Hauteur[34]= 5; Pinceau_Type [34]=FORME_PINCEAU_PLUS; Pinceau_predefini_Largeur[35]=15; Pinceau_predefini_Hauteur[35]=15; Pinceau_Type [35]=FORME_PINCEAU_PLUS; Pinceau_predefini_Largeur[36]= 2; Pinceau_predefini_Hauteur[36]= 2; Pinceau_Type [36]=FORME_PINCEAU_SLASH; Pinceau_predefini_Largeur[37]= 4; Pinceau_predefini_Hauteur[37]= 4; Pinceau_Type [37]=FORME_PINCEAU_SLASH; Pinceau_predefini_Largeur[38]= 8; Pinceau_predefini_Hauteur[38]= 8; Pinceau_Type [38]=FORME_PINCEAU_SLASH; Pinceau_predefini_Largeur[39]= 2; Pinceau_predefini_Hauteur[39]= 2; Pinceau_Type [39]=FORME_PINCEAU_ANTISLASH; Pinceau_predefini_Largeur[40]= 4; Pinceau_predefini_Hauteur[40]= 4; Pinceau_Type [40]=FORME_PINCEAU_ANTISLASH; Pinceau_predefini_Largeur[41]= 8; Pinceau_predefini_Hauteur[41]= 8; Pinceau_Type [41]=FORME_PINCEAU_ANTISLASH; Pinceau_predefini_Largeur[42]= 4; Pinceau_predefini_Hauteur[42]= 4; Pinceau_Type [42]=FORME_PINCEAU_ALEATOIRE; Pinceau_predefini_Largeur[43]= 8; Pinceau_predefini_Hauteur[43]= 8; Pinceau_Type [43]=FORME_PINCEAU_ALEATOIRE; Pinceau_predefini_Largeur[44]=13; Pinceau_predefini_Hauteur[44]=13; Pinceau_Type [44]=FORME_PINCEAU_ALEATOIRE; Pinceau_predefini_Largeur[45]= 3; Pinceau_predefini_Hauteur[45]= 3; Pinceau_Type [45]=FORME_PINCEAU_DIVERS; Pinceau_predefini_Largeur[46]= 3; Pinceau_predefini_Hauteur[46]= 3; Pinceau_Type [46]=FORME_PINCEAU_DIVERS; Pinceau_predefini_Largeur[47]= 7; Pinceau_predefini_Hauteur[47]= 7; Pinceau_Type [47]=FORME_PINCEAU_DIVERS; for (Indice=0;Indice>1); Pinceau_predefini_Decalage_Y[Indice]=(Pinceau_predefini_Hauteur[Indice]>>1); } Curseur_Decalage_X[FORME_CURSEUR_FLECHE]=0; Curseur_Decalage_Y[FORME_CURSEUR_FLECHE]=0; Curseur_Decalage_X[FORME_CURSEUR_CIBLE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE]=7; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE]=7; Curseur_Decalage_X[FORME_CURSEUR_SABLIER]=7; Curseur_Decalage_Y[FORME_CURSEUR_SABLIER]=7; Curseur_Decalage_X[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; Curseur_Decalage_Y[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; Curseur_Decalage_X[FORME_CURSEUR_HORIZONTAL]=7; Curseur_Decalage_Y[FORME_CURSEUR_HORIZONTAL]=3; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_FINE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_FINE]=7; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; } // Initialisation des boutons: // Action factice: void Rien_du_tout(void) {} // Initialiseur d'un bouton: void Initialiser_bouton(byte Numero, word Decalage_X , word Decalage_Y, word Largeur , word Hauteur, byte Forme, fonction_action Gauche , fonction_action Droite, fonction_action Desenclencher, byte Famille) { Bouton[Numero].Decalage_X =Decalage_X; Bouton[Numero].Decalage_Y =Decalage_Y; Bouton[Numero].Largeur =Largeur-1; Bouton[Numero].Hauteur =Hauteur-1; Bouton[Numero].Enfonce =0; Bouton[Numero].Forme =Forme; Bouton[Numero].Gauche =Gauche; Bouton[Numero].Droite =Droite; Bouton[Numero].Desenclencher =Desenclencher; Bouton[Numero].Famille =Famille; } // Initiliseur de tous les boutons: void Initialisation_des_boutons(void) { byte Indice_bouton; for (Indice_bouton=0;Indice_bouton= 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 = Fullscreen; Mode_video[Numero].Etat = Supporte; } // Initiliseur de toutes les opérations: void Definition_des_modes_video(void) { // Numero LargHaut Mode FXFY Ratio Ref WinOnly Pointeur SDL_Rect** Modes; 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=1; Indice2 < Nb_modes_video; Indice2++) if (Modes[Indice]->w == Mode_video[Indice2].Largeur && Modes[Indice]->h == Mode_video[Indice2].Hauteur) { // 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; } } //--------------------------------------------------------------------------- word Ordonnancement[NB_TOUCHES]= { SPECIAL_SCROLL_UP, // Scroll up SPECIAL_SCROLL_DOWN, // Scroll down SPECIAL_SCROLL_LEFT, // Scroll left SPECIAL_SCROLL_RIGHT, // Scroll right SPECIAL_SCROLL_UP_FAST, // Scroll up faster SPECIAL_SCROLL_DOWN_FAST, // Scroll down faster SPECIAL_SCROLL_LEFT_FAST, // Scroll left faster SPECIAL_SCROLL_RIGHT_FAST, // Scroll right faster SPECIAL_SCROLL_UP_SLOW, // Scroll up slower SPECIAL_SCROLL_DOWN_SLOW, // Scroll down slower SPECIAL_SCROLL_LEFT_SLOW, // Scroll left slower SPECIAL_SCROLL_RIGHT_SLOW, // Scroll right slower SPECIAL_MOUSE_UP, // Emulate mouse up SPECIAL_MOUSE_DOWN, // Emulate mouse down SPECIAL_MOUSE_LEFT, // Emulate mouse left SPECIAL_MOUSE_RIGHT, // Emulate mouse right SPECIAL_CLICK_LEFT, // Emulate mouse click left SPECIAL_CLICK_RIGHT, // Emulate mouse click right 0x100+BOUTON_CACHER, // Show / Hide menu SPECIAL_SHOW_HIDE_CURSOR, // Show / Hide cursor SPECIAL_PINCEAU_POINT, // Paintbrush = "." 0x100+BOUTON_PINCEAUX, // Paintbrush choice 0x200+BOUTON_PINCEAUX, // Monochrome brush 0x100+BOUTON_DESSIN, // Freehand drawing 0x200+BOUTON_DESSIN, // Switch freehand drawing mode SPECIAL_DESSIN_CONTINU, // Continuous freehand drawing 0x100+BOUTON_LIGNES, // Line 0x200+BOUTON_LIGNES, // Knotted lines 0x100+BOUTON_SPRAY, // Spray 0x200+BOUTON_SPRAY, // Spray menu 0x100+BOUTON_FLOODFILL, // Floodfill 0x200+BOUTON_FLOODFILL, // Replace color 0x100+BOUTON_COURBES, // Bézier's curves 0x200+BOUTON_COURBES, // Bézier's curve with 3 or 4 points 0x100+BOUTON_RECTANGLES, // Empty rectangle 0x100+BOUTON_FILLRECT, // Filled rectangle 0x100+BOUTON_CERCLES, // Empty circle 0x200+BOUTON_CERCLES, // Empty ellipse 0x100+BOUTON_FILLCERC, // Filled circle 0x200+BOUTON_FILLCERC, // Filled ellipse 0x100+BOUTON_POLYGONES, // Empty polygon 0x200+BOUTON_POLYGONES, // Empty polyform 0x100+BOUTON_POLYFILL, // Polyfill 0x200+BOUTON_POLYFILL, // Filled polyform 0x100+BOUTON_GRADRECT, // Gradient rectangle 0x100+BOUTON_GRADMENU, // Gradation menu 0x100+BOUTON_SPHERES, // Spheres 0x200+BOUTON_SPHERES, // Gradient ellipses 0x100+BOUTON_AJUSTER, // Adjust picture 0x200+BOUTON_AJUSTER, // Flip picture menu 0x100+BOUTON_EFFETS, // Menu des effets SPECIAL_SHADE_MODE, // Shade mode SPECIAL_SHADE_MENU, // Shade menu SPECIAL_QUICK_SHADE_MODE, // Quick-shade mode SPECIAL_QUICK_SHADE_MENU, // Quick-shade menu SPECIAL_STENCIL_MODE, // Stencil mode SPECIAL_STENCIL_MENU, // Stencil menu SPECIAL_MASK_MODE, // Mask mode SPECIAL_MASK_MENU, // Mask menu SPECIAL_GRID_MODE, // Grid mode SPECIAL_GRID_MENU, // Grid menu SPECIAL_SIEVE_MODE, // Sieve mode SPECIAL_SIEVE_MENU, // Sieve menu SPECIAL_INVERT_SIEVE, // Inverser la trame du mode Sieve SPECIAL_COLORIZE_MODE, // Colorize mode SPECIAL_COLORIZE_MENU, // Colorize menu SPECIAL_SMOOTH_MODE, // Smooth mode SPECIAL_SMOOTH_MENU, // Smooth menu SPECIAL_SMEAR_MODE, // Smear mode SPECIAL_TILING_MODE, // Tiling mode SPECIAL_TILING_MENU, // Tiling menu 0x100+BOUTON_BROSSE, // Pick brush 0x100+BOUTON_POLYBROSSE, // Pick polyform brush 0x200+BOUTON_BROSSE, // Restore brush SPECIAL_FLIP_X, // Flip X SPECIAL_FLIP_Y, // Flip Y SPECIAL_ROTATE_90, // 90° brush rotation SPECIAL_ROTATE_180, // 180° brush rotation SPECIAL_STRETCH, // Stretch brush SPECIAL_DISTORT, // Distort brush SPECIAL_OUTLINE, // Outline brush SPECIAL_NIBBLE, // Nibble brush SPECIAL_GET_BRUSH_COLORS, // Get colors from brush SPECIAL_RECOLORIZE_BRUSH, // Recolorize brush SPECIAL_ROTATE_ANY_ANGLE, // Rotate brush by any angle 0x100+BOUTON_PIPETTE, // Pipette 0x200+BOUTON_PIPETTE, // Swap fore/back color 0x100+BOUTON_LOUPE, // Magnifier mode 0x200+BOUTON_LOUPE, // Zoom factor menu SPECIAL_ZOOM_IN, // Zoom in SPECIAL_ZOOM_OUT, // Zoom out 0x100+BOUTON_EFFETS_BROSSE, // Brush effects menu 0x100+BOUTON_TEXTE, // Text 0x100+BOUTON_RESOL, // Resolution menu 0x200+BOUTON_RESOL, // Safety resolution 0x100+BOUTON_AIDE, // Help & credits 0x200+BOUTON_AIDE, // Statistics 0x100+BOUTON_PAGE, // Go to spare page 0x200+BOUTON_PAGE, // Copy to spare page 0x100+BOUTON_SAUVER, // Save as 0x200+BOUTON_SAUVER, // Save 0x100+BOUTON_CHARGER, // Load 0x200+BOUTON_CHARGER, // Re-load SPECIAL_SAVE_BRUSH, // Save brush SPECIAL_LOAD_BRUSH, // Load brush 0x100+BOUTON_PARAMETRES, // Settings 0x100+BOUTON_UNDO, // Undo 0x200+BOUTON_UNDO, // Redo 0x100+BOUTON_KILL, // Kill 0x100+BOUTON_CLEAR, // Clear 0x200+BOUTON_CLEAR, // Clear with backcolor 0x100+BOUTON_QUIT, // Quit 0x100+BOUTON_PALETTE, // Palette menu 0x200+BOUTON_PALETTE, // Palette menu secondaire SPECIAL_EXCLUDE_COLORS_MENU, // Exclude colors menu 0x100+BOUTON_PAL_LEFT, // Scroll palette left 0x100+BOUTON_PAL_RIGHT, // Scroll palette right 0x200+BOUTON_PAL_LEFT, // Scroll palette left faster 0x200+BOUTON_PAL_RIGHT, // Scroll palette right faster SPECIAL_CENTER_ATTACHMENT, // Center brush attachement SPECIAL_TOP_LEFT_ATTACHMENT, // Top-left brush attachement SPECIAL_TOP_RIGHT_ATTACHMENT, // Top-right brush attachement SPECIAL_BOTTOM_LEFT_ATTACHMENT, // Bottom-left brush attachement SPECIAL_BOTTOM_RIGHT_ATTACHMENT, // Bottom right brush attachement SPECIAL_NEXT_FORECOLOR, // Next foreground color SPECIAL_PREVIOUS_FORECOLOR, // Previous foreground color SPECIAL_NEXT_BACKCOLOR, // Next background color SPECIAL_PREVIOUS_BACKCOLOR, // Previous background color SPECIAL_NEXT_USER_FORECOLOR, // Next user-defined foreground color SPECIAL_PREVIOUS_USER_FORECOLOR, // Previous user-defined foreground color SPECIAL_NEXT_USER_BACKCOLOR, // Next user-defined background color SPECIAL_PREVIOUS_USER_BACKCOLOR, // Previous user-defined background color SPECIAL_RETRECIR_PINCEAU, // Rétrécir le pinceau SPECIAL_GROSSIR_PINCEAU // Grossir le pinceau }; byte Numero_option[NB_TOUCHES]= { 0, // Scroll up 1, // Scroll down 2, // Scroll left 3, // Scroll right 4, // Scroll up faster 5, // Scroll down faster 6, // Scroll left faster 7, // Scroll right faster 8, // Scroll up slower 9, // Scroll down slower 10, // Scroll left slower 11, // Scroll right slower 12, // Emulate mouse up 13, // Emulate mouse down 14, // Emulate mouse left 15, // Emulate mouse right 16, // Emulate mouse click left 17, // Emulate mouse click right 18, // Show / Hide menu 19, // Show / Hide cursor 20, // Paintbrush = "." 21, // Paintbrush choice 22, // Monochrome brush 23, // Freehand drawing 24, // Switch freehand drawing mode 25, // Continuous freehand drawing 26, // Line 27, // Knotted lines 28, // Spray 29, // Spray menu 30, // Floodfill 124, // Replace color 31, // Bézier's curves 32, // Bézier's curve with 3 or 4 points 33, // Empty rectangle 34, // Filled rectangle 35, // Empty circle 36, // Empty ellipse 37, // Filled circle 38, // Filled ellipse 39, // Empty polygon 40, // Empty polyform 41, // Polyfill 42, // Filled polyform 43, // Gradient rectangle 44, // Gradation menu 45, // Spheres 46, // Gradient ellipses 47, // Adjust picture 48, // Flip picture menu 49, // Menu des effets 50, // Shade mode 51, // Shade menu 131, // Quick-shade mode 132, // Quick-shade menu 52, // Stencil mode 53, // Stencil menu 54, // Mask mode 55, // Mask menu 56, // Grid mode 57, // Grid menu 58, // Sieve mode 59, // Sieve menu 60, // Inverser la trame du mode Sieve 61, // Colorize mode 62, // Colorize menu 63, // Smooth mode 123, // Smooth menu 64, // Smear mode 65, // Tiling mode 66, // Tiling menu 67, // Pick brush 68, // Pick polyform brush 69, // Restore brush 70, // Flip X 71, // Flip Y 72, // 90° brush rotation 73, // 180° brush rotation 74, // Stretch brush 75, // Distort brush 76, // Outline brush 77, // Nibble brush 78, // Get colors from brush 79, // Recolorize brush 80, // Rotate brush by any angle 81, // Pipette 82, // Swap fore/back color 83, // Magnifier mode 84, // Zoom factor menu 85, // Zoom in 86, // Zoom out 87, // Brush effects menu 88, // Text 89, // Resolution menu 90, // Safety resolution 91, // Help & credits 92, // Statistics 93, // Go to spare page 94, // Copy to spare page 95, // Save as 96, // Save 97, // Load 98, // Re-load 99, // Save brush 100, // Load brush 101, // Settings 102, // Undo 103, // Redo 133, // Kill 104, // Clear 105, // Clear with backcolor 106, // Quit 107, // Palette menu 125, // Palette menu secondaire 130, // Exclude colors menu 108, // Scroll palette left 109, // Scroll palette right 110, // Scroll palette left faster 111, // Scroll palette right faster 112, // Center brush attachement 113, // Top-left brush attachement 114, // Top-right brush attachement 115, // Bottom-left brush attachement 116, // Bottom right brush attachement 117, // Next foreground color 118, // Previous foreground color 119, // Next background color 120, // Previous background color 126, // Next user-defined foreground color 127, // Previous user-defined foreground color 128, // Next user-defined background color 129, // Previous user-defined background color 121, // Rétrécir le pinceau 122 // Grossir le pinceau }; int Charger_CFG(int Tout_charger) { FILE* Handle; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; long Taille_fichier; int Indice,Indice2; struct Config_Header CFG_Header; struct Config_Chunk Chunk; struct Config_Infos_touche CFG_Infos_touche; struct Config_Mode_video CFG_Mode_video; struct stat Informations_Fichier; int Conversion_touches = 0; strcpy(Nom_du_fichier,Repertoire_du_programme); strcat(Nom_du_fichier,"gfx2.cfg"); stat(Nom_du_fichier,&Informations_Fichier); Taille_fichier=Informations_Fichier.st_size; if ((Handle=fopen(Nom_du_fichier,"rb"))==NULL) return ERREUR_CFG_ABSENT; if ( (Taille_fichier>8) { case 0 : Config_Touche[Ordonnancement[Indice2]&0xFF]=CFG_Infos_touche.Touche; break; case 1 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_gauche = CFG_Infos_touche.Touche; break; case 2 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_droite = CFG_Infos_touche.Touche; break; } } else goto Erreur_lecture_config; } } } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_MODES_VIDEO: // Modes vidéo for (Indice=0; Indice<(Chunk.Taille/sizeof(CFG_Mode_video)); Indice++) { if (!read_byte(Handle, &CFG_Mode_video.Etat) || !read_word_le(Handle, &CFG_Mode_video.Largeur) || !read_word_le(Handle, &CFG_Mode_video.Hauteur) ) goto Erreur_lecture_config; for (Indice2=1; Indice2>8) { case 0 : CFG_Infos_touche.Touche=Config_Touche[Ordonnancement[Indice]&0xFF]; break; case 1 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche; break; case 2 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite; break; } CFG_Infos_touche.Touche2=0x00FF; if (!write_word_le(Handle, CFG_Infos_touche.Numero) || !write_word_le(Handle, CFG_Infos_touche.Touche) || !write_word_le(Handle, CFG_Infos_touche.Touche2) ) 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