#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) { #ifdef __WATCOMC__ GetCurrentDirectory(255,Repertoire_du_programme); strcat(Repertoire_du_programme,"\\"); #else puts("Chercher_repertoire_du_programme: implémentation incomplète"); Repertoire_du_programme[0]=0; //On va travailler dans le dossier courant ... #endif } 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>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 if ((Chunk.Taille/sizeof(CFG_Mode_video))!=NB_MODES_VIDEO) goto Erreur_lecture_config; for (Indice=1; Indice<=NB_MODES_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=0; Indice2>6)) { Mode_video[Indice2].Etat=(Mode_video[Indice2].Etat&0xFC) | (CFG_Mode_video.Etat&3); break; } } } break; case CHUNK_SHADE: // Shade if (Tout_charger) { if (! read_byte(Handle, &Shade_Actuel) ) goto Erreur_lecture_config; for (Indice=0; Indice<8; Indice++) { for (Indice2=0; Indice2<512; Indice2++) { if (! read_word_le(Handle, &Shade_Liste[Indice].Liste[Indice2])) goto Erreur_lecture_config; } if (! read_byte(Handle, &Shade_Liste[Indice].Pas) || ! read_byte(Handle, &Shade_Liste[Indice].Mode) ) goto Erreur_lecture_config; } Liste2tables(Shade_Liste[Shade_Actuel].Liste, Shade_Liste[Shade_Actuel].Pas, Shade_Liste[Shade_Actuel].Mode, Shade_Table_gauche,Shade_Table_droite); } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_MASQUE: // Masque if (Tout_charger) { if (!read_bytes(Handle, Mask, 256)) goto Erreur_lecture_config; } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_STENCIL: // Stencil if (Tout_charger) { if (!read_bytes(Handle, Stencil, 256)) goto Erreur_lecture_config; } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_DEGRADES: // Infos sur les dégradés if (Tout_charger) { // fixme endianness : Degrade_Courant est un int, enregistre en byte if (! read_byte(Handle, &Degrade_Courant)) goto Erreur_lecture_config; for(Indice=0;Indice<16;Indice++) { if (!read_byte(Handle, &Degrade_Tableau[Indice].Debut) || !read_byte(Handle, &Degrade_Tableau[Indice].Fin) || !read_dword_le(Handle, &Degrade_Tableau[Indice].Inverse) || !read_dword_le(Handle, &Degrade_Tableau[Indice].Melange) || !read_dword_le(Handle, &Degrade_Tableau[Indice].Technique) ) goto Erreur_lecture_config; } Degrade_Charger_infos_du_tableau(Degrade_Courant); } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_SMOOTH: // Matrice du smooth if (Tout_charger) { for (Indice=0; Indice<3; Indice++) for (Indice2=0; Indice2<3; Indice2++) if (!read_byte(Handle, &(Smooth_Matrice[Indice][Indice2]))) goto Erreur_lecture_config; } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_EXCLUDE_COLORS: // Exclude_color if (Tout_charger) { if (!read_bytes(Handle, Exclude_color, 256)) goto Erreur_lecture_config; } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_QUICK_SHADE: // Quick-shade if (Tout_charger) { if (!read_byte(Handle, &Quick_shade_Step)) goto Erreur_lecture_config; if (!read_byte(Handle, &Quick_shade_Loop)) goto Erreur_lecture_config; } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_GRILLE: // Grille if (Tout_charger) { if (!read_word_le(Handle, &Snap_Largeur)) goto Erreur_lecture_config; if (!read_word_le(Handle, &Snap_Hauteur)) goto Erreur_lecture_config; if (!read_word_le(Handle, &Snap_Decalage_X)) goto Erreur_lecture_config; if (!read_word_le(Handle, &Snap_Decalage_Y)) goto Erreur_lecture_config; } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; default: // Chunk inconnu goto Erreur_lecture_config; } } if (fclose(Handle)) return ERREUR_CFG_CORROMPU; return 0; Erreur_lecture_config: fclose(Handle); return ERREUR_CFG_CORROMPU; Erreur_config_ancienne: fclose(Handle); return ERREUR_CFG_ANCIEN; } int Sauver_CFG(void) { FILE* Handle; int Indice; int Indice2; //byte Octet; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; struct Config_Header CFG_Header; struct Config_Chunk Chunk; struct Config_Infos_touche CFG_Infos_touche; struct Config_Mode_video CFG_Mode_video; strcpy(Nom_du_fichier,Repertoire_du_programme); strcat(Nom_du_fichier,"gfx2.cfg"); if ((Handle=fopen(Nom_du_fichier,"wb"))==NULL) return ERREUR_SAUVEGARDE_CFG; // Ecriture du header memcpy(CFG_Header.Signature,"CFG",3); CFG_Header.Version1=VERSION1; CFG_Header.Version2=VERSION2; CFG_Header.Beta1 =BETA1; CFG_Header.Beta2 =BETA2; if (!write_bytes(Handle, &CFG_Header.Signature,3) || !write_byte(Handle, CFG_Header.Version1) || !write_byte(Handle, CFG_Header.Version2) || !write_byte(Handle, CFG_Header.Beta1) || !write_byte(Handle, CFG_Header.Beta2) ) goto Erreur_sauvegarde_config; // Enregistrement des touches Chunk.Numero=CHUNK_TOUCHES; Chunk.Taille=NB_TOUCHES*sizeof(CFG_Infos_touche); if (!write_byte(Handle, Chunk.Numero) || !write_word_le(Handle, Chunk.Taille) ) goto Erreur_sauvegarde_config; for (Indice=0; Indice>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; } // Sauvegarde de l'état de chaque mode vidéo Chunk.Numero=CHUNK_MODES_VIDEO; Chunk.Taille=NB_MODES_VIDEO * sizeof(CFG_Mode_video); if (!write_byte(Handle, Chunk.Numero) || !write_word_le(Handle, Chunk.Taille) ) goto Erreur_sauvegarde_config; for (Indice=0; Indice