From ff9fc1633bd87f79eedf3611d1a0412d89fa0d83 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Tue, 14 Oct 2008 19:45:39 +0000 Subject: [PATCH] AmigaOS 4 port from xeron. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@253 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- aide.c | 17 +- files.c | 3 + gfxcfg.c | 8 +- init.c | 4426 +++++++++++++++++++++++++++-------------------------- linux.c | 2 +- main.c | 1203 +++++++-------- readini.c | 8 + saveini.c | 12 + 8 files changed, 2867 insertions(+), 2812 deletions(-) diff --git a/aide.c b/aide.c index ee9c6b31..124271bd 100644 --- a/aide.c +++ b/aide.c @@ -35,8 +35,10 @@ #ifdef __linux__ #include #else +#ifndef __amigaos4__ #include #endif +#endif // -- Menu d'aide ----------------------------------------------------------- @@ -304,8 +306,12 @@ void Bouton_Stats(void) struct statfs Informations_Disque; uint64_t Taille = 0; #else - unsigned __int64 Taille; - ULARGE_INTEGER tailleU; + #ifdef __amigaos4__ + uint64_t Taille = 0; + #else + unsigned __int64 Taille; + ULARGE_INTEGER tailleU; + #endif #endif @@ -347,8 +353,11 @@ void Bouton_Stats(void) statfs(Principal_Repertoire_courant,&Informations_Disque); Taille=Informations_Disque.f_bfree * Informations_Disque.f_bsize; #else - GetDiskFreeSpaceEx(Principal_Repertoire_courant,&tailleU,NULL,NULL); - Taille = tailleU.QuadPart; + #ifdef __amigaos4__ + #else + GetDiskFreeSpaceEx(Principal_Repertoire_courant,&tailleU,NULL,NULL); + Taille = tailleU.QuadPart; + #endif #endif if(Taille > (100ULL*1024*1024*1024)) diff --git a/files.c b/files.c index 4d02077f..09256cf9 100644 --- a/files.c +++ b/files.c @@ -39,6 +39,9 @@ #ifdef __linux__ #include #define isHidden(Enreg) ((Enreg)->d_name[0]=='.') +#elif defined(__amigaos4__) + #include + #define isHidden(Enreg) (0) #elif defined(__WATCOMC__) #include #define isHidden(Enreg) ((Enreg)->d_attr & _A_HIDDEN) diff --git a/gfxcfg.c b/gfxcfg.c index c89786db..e7d7a3a2 100644 --- a/gfxcfg.c +++ b/gfxcfg.c @@ -29,7 +29,7 @@ //SDL #include -#include +#include #include //#include @@ -587,7 +587,13 @@ void Setup() /* Checks if we can write the config file */ bool Verifier_ecriture_possible() { + #ifdef __amigaos4__ + // TODO: Make it work :) + return 1; + #else + // Doesn't work on OS4. return access("./",W_OK) == 0; + #endif } /* Save the config file */ diff --git a/init.c b/init.c index b3464072..16aa6352 100644 --- a/init.c +++ b/init.c @@ -1,2207 +1,2219 @@ -/* Grafx2 - The Ultimate 256-color bitmap paint program - - Copyright 2008 Yves Rizoud - Copyright 2007 Adrien Destugues - Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) - - Grafx2 is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; version 2 - of the License. - - Grafx2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grafx2; if not, see or - write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#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 "hotkeys.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-1) - { - DEBUG("Erreur! Tentative de créer un mode de trop! Limite:", MAX_MODES_VIDEO); - return; - } - if (!Fullscreen) - Supporte = 128; // Prefere, non modifiable - else if (SDL_VideoModeOK(Largeur, Hauteur, 8, SDL_FULLSCREEN)) - Supporte = 1; // Supporte - else - { - // Non supporte : on ne le prend pas - return; - } - - Mode_video[Nb_modes_video].Largeur = Largeur; - Mode_video[Nb_modes_video].Hauteur = Hauteur; - Mode_video[Nb_modes_video].Mode = Mode; - Mode_video[Nb_modes_video].Fullscreen = Fullscreen; - Mode_video[Nb_modes_video].Etat = Supporte; - Nb_modes_video ++; -} - -// Utilisé pour trier les modes retournés par SDL -int Compare_modes_video(const void *p1, const void *p2) -{ - const struct S_Mode_video *Mode1 = (const struct S_Mode_video *)p1; - const struct S_Mode_video *Mode2 = (const struct S_Mode_video *)p2; - - // Tris par largeur - if(Mode1->Largeur - Mode2->Largeur) - return Mode1->Largeur - Mode2->Largeur; - - // Tri par hauteur - return Mode1->Hauteur - Mode2->Hauteur; -} - - -// Initiliseur de tous les modes video: -void Definition_des_modes_video(void) -{ // Numero LargHaut Mode FXFY Ratio Ref WinOnly Pointeur - SDL_Rect** Modes; - Nb_modes_video=0; - // Doit être en premier pour avoir le numéro 0: - Definir_mode_video( 640,480,MODE_SDL, 0); - - Definir_mode_video( 320,200,MODE_SDL, 1); - Definir_mode_video( 320,224,MODE_SDL, 1); - Definir_mode_video( 320,240,MODE_SDL, 1); - Definir_mode_video( 320,256,MODE_SDL, 1); - Definir_mode_video( 320,270,MODE_SDL, 1); - Definir_mode_video( 320,282,MODE_SDL, 1); - Definir_mode_video( 320,300,MODE_SDL, 1); - Definir_mode_video( 320,360,MODE_SDL, 1); - Definir_mode_video( 320,400,MODE_SDL, 1); - Definir_mode_video( 320,448,MODE_SDL, 1); - Definir_mode_video( 320,480,MODE_SDL, 1); - Definir_mode_video( 320,512,MODE_SDL, 1); - Definir_mode_video( 320,540,MODE_SDL, 1); - Definir_mode_video( 320,564,MODE_SDL, 1); - Definir_mode_video( 320,600,MODE_SDL, 1); - Definir_mode_video( 360,200,MODE_SDL, 1); - Definir_mode_video( 360,224,MODE_SDL, 1); - Definir_mode_video( 360,240,MODE_SDL, 1); - Definir_mode_video( 360,256,MODE_SDL, 1); - Definir_mode_video( 360,270,MODE_SDL, 1); - Definir_mode_video( 360,282,MODE_SDL, 1); - Definir_mode_video( 360,300,MODE_SDL, 1); - Definir_mode_video( 360,360,MODE_SDL, 1); - Definir_mode_video( 360,400,MODE_SDL, 1); - Definir_mode_video( 360,448,MODE_SDL, 1); - Definir_mode_video( 360,480,MODE_SDL, 1); - Definir_mode_video( 360,512,MODE_SDL, 1); - Definir_mode_video( 360,540,MODE_SDL, 1); - Definir_mode_video( 360,564,MODE_SDL, 1); - Definir_mode_video( 360,600,MODE_SDL, 1); - Definir_mode_video( 400,200,MODE_SDL, 1); - Definir_mode_video( 400,224,MODE_SDL, 1); - Definir_mode_video( 400,240,MODE_SDL, 1); - Definir_mode_video( 400,256,MODE_SDL, 1); - Definir_mode_video( 400,270,MODE_SDL, 1); - Definir_mode_video( 400,282,MODE_SDL, 1); - Definir_mode_video( 400,300,MODE_SDL, 1); - Definir_mode_video( 400,360,MODE_SDL, 1); - Definir_mode_video( 400,400,MODE_SDL, 1); - Definir_mode_video( 400,448,MODE_SDL, 1); - Definir_mode_video( 400,480,MODE_SDL, 1); - Definir_mode_video( 400,512,MODE_SDL, 1); - Definir_mode_video( 400,540,MODE_SDL, 1); - Definir_mode_video( 400,564,MODE_SDL, 1); - Definir_mode_video( 400,600,MODE_SDL, 1); - Definir_mode_video( 640,224,MODE_SDL, 1); - Definir_mode_video( 640,240,MODE_SDL, 1); - Definir_mode_video( 640,256,MODE_SDL, 1); - Definir_mode_video( 640,270,MODE_SDL, 1); - Definir_mode_video( 640,300,MODE_SDL, 1); - Definir_mode_video( 640,350,MODE_SDL, 1); - Definir_mode_video( 640,400,MODE_SDL, 1); - Definir_mode_video( 640,448,MODE_SDL, 1); - Definir_mode_video( 640,480,MODE_SDL, 1); - Definir_mode_video( 640,512,MODE_SDL, 1); - Definir_mode_video( 640,540,MODE_SDL, 1); - Definir_mode_video( 640,564,MODE_SDL, 1); - Definir_mode_video( 640,600,MODE_SDL, 1); - Definir_mode_video( 800,600,MODE_SDL, 1); - Definir_mode_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(Modes[Indice]->w,Modes[Indice]->h,MODE_SDL, 1); - } - } - // Tri des modes : ceux trouvés par SDL ont été listés à la fin. - qsort(&Mode_video[1], Nb_modes_video - 1, sizeof(struct S_Mode_video), Compare_modes_video); - } -} - -//--------------------------------------------------------------------------- - - - - -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 -}; - -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>8) - { - case 0 : - Config_Touche[Ordonnancement[Indice]&0xFF]=ConfigTouche[Indice].Touche; - break; - case 1 : - Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche = ConfigTouche[Indice].Touche; - break; - case 2 : - Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite = ConfigTouche[Indice].Touche; - break; - } - } - // Shade - Shade_Actuel=0; - for (Indice=0; Indice<8; Indice++) - { - Shade_Liste[Indice].Pas=1; - Shade_Liste[Indice].Mode=0; - for (Indice2=0; Indice2<512; Indice2++) - Shade_Liste[Indice].Liste[Indice2]=256; - } - // Shade par défaut pour la palette standard - for (Indice=0; Indice<7; Indice++) - for (Indice2=0; Indice2<16; Indice2++) - Shade_Liste[0].Liste[Indice*17+Indice2]=Indice*16+Indice2+16; - - Liste2tables(Shade_Liste[Shade_Actuel].Liste, - Shade_Liste[Shade_Actuel].Pas, - Shade_Liste[Shade_Actuel].Mode, - Shade_Table_gauche,Shade_Table_droite); - - // Masque - for (Indice=0; Indice<256; Indice++) - Mask[Indice]=0; - - // Stencil - for (Indice=0; Indice<256; Indice++) - Stencil[Indice]=1; - - // Dégradés - Degrade_Courant=0; - for(Indice=0;Indice<16;Indice++) - { - Degrade_Tableau[Indice].Debut=0; - Degrade_Tableau[Indice].Fin=0; - Degrade_Tableau[Indice].Inverse=0; - Degrade_Tableau[Indice].Melange=0; - Degrade_Tableau[Indice].Technique=0; - } - Degrade_Charger_infos_du_tableau(Degrade_Courant); - - // Smooth - Smooth_Matrice[0][0]=1; - Smooth_Matrice[0][1]=2; - Smooth_Matrice[0][2]=1; - Smooth_Matrice[1][0]=2; - Smooth_Matrice[1][1]=4; - Smooth_Matrice[1][2]=2; - Smooth_Matrice[2][0]=1; - Smooth_Matrice[2][1]=2; - Smooth_Matrice[2][2]=1; - - // Exclude colors - for (Indice=0; Indice<256; Indice++) - Exclude_color[Indice]=0; - - // Quick shade - Quick_shade_Step=1; - Quick_shade_Loop=0; - - // Grille - Snap_Largeur=Snap_Hauteur=8; - Snap_Decalage_X=Snap_Decalage_Y=0; - -} +/* Grafx2 - The Ultimate 256-color bitmap paint program + + Copyright 2008 Yves Rizoud + Copyright 2007 Adrien Destugues + Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) + + Grafx2 is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 + of the License. + + Grafx2 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grafx2; if not, see or + write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#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 "hotkeys.h" + +#include "errno.h" + +#ifndef __linux__ +#ifndef __amigaos4__ +#include "windows.h" +#endif +#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) +{ + + #if defined(__linux__) || defined(__amigaos4__) + //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; + #if defined(__linux__)||defined(__amigaos4__) + return chdir(Home); + #else + return ! SetCurrentDirectory(Home); + #endif + } + + #if defined(__linux__)||defined(__amigaos4__) + 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-1) + { + DEBUG("Erreur! Tentative de créer un mode de trop! Limite:", MAX_MODES_VIDEO); + return; + } + if (!Fullscreen) + Supporte = 128; // Prefere, non modifiable + else if (SDL_VideoModeOK(Largeur, Hauteur, 8, SDL_FULLSCREEN)) + Supporte = 1; // Supporte + else + { + // Non supporte : on ne le prend pas + return; + } + + Mode_video[Nb_modes_video].Largeur = Largeur; + Mode_video[Nb_modes_video].Hauteur = Hauteur; + Mode_video[Nb_modes_video].Mode = Mode; + Mode_video[Nb_modes_video].Fullscreen = Fullscreen; + Mode_video[Nb_modes_video].Etat = Supporte; + Nb_modes_video ++; +} + +// Utilisé pour trier les modes retournés par SDL +int Compare_modes_video(const void *p1, const void *p2) +{ + const struct S_Mode_video *Mode1 = (const struct S_Mode_video *)p1; + const struct S_Mode_video *Mode2 = (const struct S_Mode_video *)p2; + + // Tris par largeur + if(Mode1->Largeur - Mode2->Largeur) + return Mode1->Largeur - Mode2->Largeur; + + // Tri par hauteur + return Mode1->Hauteur - Mode2->Hauteur; +} + + +// Initiliseur de tous les modes video: +void Definition_des_modes_video(void) +{ // Numero LargHaut Mode FXFY Ratio Ref WinOnly Pointeur + SDL_Rect** Modes; + Nb_modes_video=0; + // Doit être en premier pour avoir le numéro 0: + Definir_mode_video( 640,480,MODE_SDL, 0); + + Definir_mode_video( 320,200,MODE_SDL, 1); + Definir_mode_video( 320,224,MODE_SDL, 1); + Definir_mode_video( 320,240,MODE_SDL, 1); + Definir_mode_video( 320,256,MODE_SDL, 1); + Definir_mode_video( 320,270,MODE_SDL, 1); + Definir_mode_video( 320,282,MODE_SDL, 1); + Definir_mode_video( 320,300,MODE_SDL, 1); + Definir_mode_video( 320,360,MODE_SDL, 1); + Definir_mode_video( 320,400,MODE_SDL, 1); + Definir_mode_video( 320,448,MODE_SDL, 1); + Definir_mode_video( 320,480,MODE_SDL, 1); + Definir_mode_video( 320,512,MODE_SDL, 1); + Definir_mode_video( 320,540,MODE_SDL, 1); + Definir_mode_video( 320,564,MODE_SDL, 1); + Definir_mode_video( 320,600,MODE_SDL, 1); + Definir_mode_video( 360,200,MODE_SDL, 1); + Definir_mode_video( 360,224,MODE_SDL, 1); + Definir_mode_video( 360,240,MODE_SDL, 1); + Definir_mode_video( 360,256,MODE_SDL, 1); + Definir_mode_video( 360,270,MODE_SDL, 1); + Definir_mode_video( 360,282,MODE_SDL, 1); + Definir_mode_video( 360,300,MODE_SDL, 1); + Definir_mode_video( 360,360,MODE_SDL, 1); + Definir_mode_video( 360,400,MODE_SDL, 1); + Definir_mode_video( 360,448,MODE_SDL, 1); + Definir_mode_video( 360,480,MODE_SDL, 1); + Definir_mode_video( 360,512,MODE_SDL, 1); + Definir_mode_video( 360,540,MODE_SDL, 1); + Definir_mode_video( 360,564,MODE_SDL, 1); + Definir_mode_video( 360,600,MODE_SDL, 1); + Definir_mode_video( 400,200,MODE_SDL, 1); + Definir_mode_video( 400,224,MODE_SDL, 1); + Definir_mode_video( 400,240,MODE_SDL, 1); + Definir_mode_video( 400,256,MODE_SDL, 1); + Definir_mode_video( 400,270,MODE_SDL, 1); + Definir_mode_video( 400,282,MODE_SDL, 1); + Definir_mode_video( 400,300,MODE_SDL, 1); + Definir_mode_video( 400,360,MODE_SDL, 1); + Definir_mode_video( 400,400,MODE_SDL, 1); + Definir_mode_video( 400,448,MODE_SDL, 1); + Definir_mode_video( 400,480,MODE_SDL, 1); + Definir_mode_video( 400,512,MODE_SDL, 1); + Definir_mode_video( 400,540,MODE_SDL, 1); + Definir_mode_video( 400,564,MODE_SDL, 1); + Definir_mode_video( 400,600,MODE_SDL, 1); + Definir_mode_video( 640,224,MODE_SDL, 1); + Definir_mode_video( 640,240,MODE_SDL, 1); + Definir_mode_video( 640,256,MODE_SDL, 1); + Definir_mode_video( 640,270,MODE_SDL, 1); + Definir_mode_video( 640,300,MODE_SDL, 1); + Definir_mode_video( 640,350,MODE_SDL, 1); + Definir_mode_video( 640,400,MODE_SDL, 1); + Definir_mode_video( 640,448,MODE_SDL, 1); + Definir_mode_video( 640,480,MODE_SDL, 1); + Definir_mode_video( 640,512,MODE_SDL, 1); + Definir_mode_video( 640,540,MODE_SDL, 1); + Definir_mode_video( 640,564,MODE_SDL, 1); + Definir_mode_video( 640,600,MODE_SDL, 1); + Definir_mode_video( 800,600,MODE_SDL, 1); + Definir_mode_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(Modes[Indice]->w,Modes[Indice]->h,MODE_SDL, 1); + } + } + // Tri des modes : ceux trouvés par SDL ont été listés à la fin. + qsort(&Mode_video[1], Nb_modes_video - 1, sizeof(struct S_Mode_video), Compare_modes_video); + } +} + +//--------------------------------------------------------------------------- + + + + +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 +}; + +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; + +#ifdef __amigaos4__ + strcpy(Nom_du_fichier,"PROGDIR:gfx2.cfg"); +#else + strcpy(Nom_du_fichier,Repertoire_du_programme); + strcat(Nom_du_fichier,"gfx2.cfg"); +#endif + + 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>8) + { + case 0 : + Config_Touche[Ordonnancement[Indice]&0xFF]=ConfigTouche[Indice].Touche; + break; + case 1 : + Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche = ConfigTouche[Indice].Touche; + break; + case 2 : + Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite = ConfigTouche[Indice].Touche; + break; + } + } + // Shade + Shade_Actuel=0; + for (Indice=0; Indice<8; Indice++) + { + Shade_Liste[Indice].Pas=1; + Shade_Liste[Indice].Mode=0; + for (Indice2=0; Indice2<512; Indice2++) + Shade_Liste[Indice].Liste[Indice2]=256; + } + // Shade par défaut pour la palette standard + for (Indice=0; Indice<7; Indice++) + for (Indice2=0; Indice2<16; Indice2++) + Shade_Liste[0].Liste[Indice*17+Indice2]=Indice*16+Indice2+16; + + Liste2tables(Shade_Liste[Shade_Actuel].Liste, + Shade_Liste[Shade_Actuel].Pas, + Shade_Liste[Shade_Actuel].Mode, + Shade_Table_gauche,Shade_Table_droite); + + // Masque + for (Indice=0; Indice<256; Indice++) + Mask[Indice]=0; + + // Stencil + for (Indice=0; Indice<256; Indice++) + Stencil[Indice]=1; + + // Dégradés + Degrade_Courant=0; + for(Indice=0;Indice<16;Indice++) + { + Degrade_Tableau[Indice].Debut=0; + Degrade_Tableau[Indice].Fin=0; + Degrade_Tableau[Indice].Inverse=0; + Degrade_Tableau[Indice].Melange=0; + Degrade_Tableau[Indice].Technique=0; + } + Degrade_Charger_infos_du_tableau(Degrade_Courant); + + // Smooth + Smooth_Matrice[0][0]=1; + Smooth_Matrice[0][1]=2; + Smooth_Matrice[0][2]=1; + Smooth_Matrice[1][0]=2; + Smooth_Matrice[1][1]=4; + Smooth_Matrice[1][2]=2; + Smooth_Matrice[2][0]=1; + Smooth_Matrice[2][1]=2; + Smooth_Matrice[2][2]=1; + + // Exclude colors + for (Indice=0; Indice<256; Indice++) + Exclude_color[Indice]=0; + + // Quick shade + Quick_shade_Step=1; + Quick_shade_Loop=0; + + // Grille + Snap_Largeur=Snap_Hauteur=8; + Snap_Decalage_X=Snap_Decalage_Y=0; + +} diff --git a/linux.c b/linux.c index d4458233..504ddf89 100644 --- a/linux.c +++ b/linux.c @@ -19,7 +19,7 @@ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Diverses fonctions qui existaient sous dos mais pas sous linux... -#ifdef __linux__ +#if defined(__linux__)||defined(__amigaos4__) #include #include diff --git a/main.c b/main.c index c1fca69a..5b4950c2 100644 --- a/main.c +++ b/main.c @@ -1,599 +1,604 @@ -/* Grafx2 - The Ultimate 256-color bitmap paint program - - Copyright 2007 Adrien Destugues - Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) - - Grafx2 is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; version 2 - of the License. - - Grafx2 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grafx2; if not, see or - write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#define VARIABLES_GLOBALES - -#include "const.h" -#include "struct.h" -#include "global.h" -#include "graph.h" -#include "divers.h" -#include "init.h" -#include "boutons.h" -#include "moteur.h" -#include -#include - -#include -#include -#include -#include -#include "pages.h" -#include "files.h" -#include "loadsave.h" -#include "sdlscreen.h" -#include "erreurs.h" -#include "readini.h" -#include "saveini.h" -#include "linux.h" -#include "io.h" - -#ifndef __linux__ - #include - #include - #define chdir(dir) SetCurrentDirectory(dir) - #define M_PI 3.14159265358979323846 -#endif - -byte Ancien_nb_lignes; // Ancien nombre de lignes de l'écran - - -//--- Affichage de la syntaxe, et de la liste des modes vidéos disponibles --- -void Afficher_syntaxe(void) -{ - int Indice_mode; - printf("Syntax: GFX2 [] []\n\n"); - printf(" can be:]\n"); - printf("\t/? /h /help for this help screen\n"); - printf("\t/mode to set a video mode\n\n"); - printf("Available video modes:\n\n"); - for (Indice_mode=0; Indice_mode or + write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#define VARIABLES_GLOBALES + +#include "const.h" +#include "struct.h" +#include "global.h" +#include "graph.h" +#include "divers.h" +#include "init.h" +#include "boutons.h" +#include "moteur.h" +#include +#include + +#include +#include +#include +#include +#include +#include "pages.h" +#include "files.h" +#include "loadsave.h" +#include "sdlscreen.h" +#include "erreurs.h" +#include "readini.h" +#include "saveini.h" +#include "linux.h" +#include "io.h" + +#ifndef __linux__ +#ifndef __amigaos4__ + #include + #include + #define chdir(dir) SetCurrentDirectory(dir) + #define M_PI 3.14159265358979323846 +#endif +#endif + +byte Ancien_nb_lignes; // Ancien nombre de lignes de l'écran + + +//--- Affichage de la syntaxe, et de la liste des modes vidéos disponibles --- +void Afficher_syntaxe(void) +{ + int Indice_mode; + printf("Syntax: GFX2 [] []\n\n"); + printf(" can be:]\n"); + printf("\t/? /h /help for this help screen\n"); + printf("\t/mode to set a video mode\n\n"); + printf("Available video modes:\n\n"); + for (Indice_mode=0; Indice_mode