Owners of these platforms, please check if I did it ok. It should crash spectacularly on program init or shutdown if I messed up. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@312 416bcca6-2ee7-4201-b75f-2eb2f807beb1
2146 lines
75 KiB
C
2146 lines
75 KiB
C
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
|
|
|
Copyright 2008 Peter Gordon
|
|
Copyright 2008 Yves Rizoud
|
|
Copyright 2008 Franck Charlet
|
|
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 <http://www.gnu.org/licenses/> or
|
|
write to the Free Software Foundation, Inc.,
|
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <SDL/SDL_byteorder.h>
|
|
|
|
#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
|
|
|
|
#ifdef __macosx__
|
|
#import <corefoundation/corefoundation.h>
|
|
#import <sys/param.h>
|
|
#endif
|
|
|
|
// Chercher le répertoire contenant GFX2.EXE
|
|
// en: Determine which directory contains the executable, data, and configuration.
|
|
// The argument is argv[0], but some platforms don't need it.
|
|
#if defined(__macosx__) || defined(__amigaos4__)
|
|
#define ARG_UNUSED __attribute__((unused))
|
|
#else
|
|
#define ARG_UNUSED
|
|
#endif
|
|
void Chercher_repertoire_du_programme(ARG_UNUSED char * Chaine)
|
|
{
|
|
#undef ARG_UNUSED
|
|
|
|
// MacOSX
|
|
#if defined(__macosx__)
|
|
CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
|
|
CFURLGetFileSystemRepresentation(url,true,(UInt8*)Repertoire_du_programme,MAXPATHLEN);
|
|
CFRelease(url);
|
|
strcat(Repertoire_du_programme,"/Contents/Resources/");
|
|
|
|
// AmigaOS4: hard-coded volume name.
|
|
#elif defined(__amigaos4__)
|
|
strcpy(Repertoire_du_programme,"PROGDIR:");
|
|
|
|
// Windows, linux: The part of argv[0] before the executable name.
|
|
// Keep the last / or \.
|
|
#else
|
|
Extraire_chemin(Repertoire_du_programme, Chaine);
|
|
#endif
|
|
}
|
|
|
|
// Ajouter un lecteur à la liste de lecteurs
|
|
void Ajouter_lecteur(char Lettre, byte Type, char *Chemin)
|
|
{
|
|
Drive[Nb_drives].Lettre=Lettre;
|
|
Drive[Nb_drives].Type =Type;
|
|
Drive[Nb_drives].Chemin=(char *)malloc(strlen(Chemin)+1);
|
|
strcpy(Drive[Nb_drives].Chemin, Chemin);
|
|
|
|
Nb_drives++;
|
|
}
|
|
|
|
|
|
// Rechercher la liste et le type des lecteurs de la machine
|
|
void Rechercher_drives(void)
|
|
{
|
|
|
|
#if defined(__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.
|
|
char * Home = getenv("HOME");
|
|
Ajouter_lecteur('/', LECTEUR_HDD, "/");
|
|
Ajouter_lecteur('~', LECTEUR_HDD, Home ? Home : "");
|
|
|
|
#elif defined(__amigaos4__)
|
|
// No icons by default.
|
|
// It's possible to add some here.
|
|
#elif defined (__WIN32__)
|
|
char NomLecteur[]="A:\\";
|
|
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;
|
|
}
|
|
NomLecteur[0]='A'+IndiceBit;
|
|
Ajouter_lecteur(NomLecteur[0], TypeLecteur,NomLecteur);
|
|
IndiceLecteur++;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// Active un lecteur, changeant normalement le répertoire en cours.
|
|
// Renvoie 0 si ok, -1 si problème.
|
|
int ActiverLecteur(int NumeroLecteur)
|
|
{
|
|
return chdir(Drive[NumeroLecteur].Chemin);
|
|
}
|
|
|
|
void Charger_DAT(void)
|
|
{
|
|
FILE* Handle;
|
|
int Taille_fichier;
|
|
int Indice;
|
|
char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
|
|
byte * Fonte_temporaire;
|
|
byte Pos_X;
|
|
byte Pos_Y;
|
|
|
|
struct stat Informations_Fichier;
|
|
|
|
strcpy(Nom_du_fichier,Repertoire_du_programme);
|
|
strcat(Nom_du_fichier,"gfx2.dat");
|
|
|
|
if(stat(Nom_du_fichier,&Informations_Fichier))
|
|
{
|
|
switch errno
|
|
{
|
|
case EACCES: puts("La permission de parcours est refusée pour un des répertoires contenu dans le chemin path."); break;
|
|
case EBADF: puts("filedes est un mauvais descripteur."); break;
|
|
case EFAULT: puts("Un pointeur se trouve en dehors de l'espace d'adressage."); break;
|
|
case ENAMETOOLONG: puts("Nom de fichier trop long."); break;
|
|
case ENOENT: puts("Un composant du chemin path n'existe pas, ou il s'agit d'une chaîne vide."); break;
|
|
case ENOMEM: puts("Pas assez de mémoire pour le noyau."); break;
|
|
case ENOTDIR: puts("Un composant du chemin d'accès n'est pas un répertoire."); break;
|
|
#if defined(__linux__)||defined(__amigaos4__)
|
|
case ELOOP: puts("Trop de liens symboliques rencontrés dans le chemin d'accès."); break;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
Taille_fichier=Informations_Fichier.st_size;
|
|
if (Taille_fichier<DAT_DEBUT_INI_PAR_DEFAUT)
|
|
{
|
|
DEBUG("Taille",0);
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
}
|
|
|
|
Handle=fopen(Nom_du_fichier,"rb");
|
|
if (Handle==NULL)
|
|
{
|
|
DEBUG("Absent",0);
|
|
Erreur(ERREUR_DAT_ABSENT);
|
|
}
|
|
|
|
if (!read_bytes(Handle, Palette_defaut,sizeof(T_Palette)))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, BLOCK_MENU,LARGEUR_MENU*HAUTEUR_MENU))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, SPRITE_EFFET,LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_EFFETS))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, SPRITE_CURSEUR,LARGEUR_SPRITE_CURSEUR*HAUTEUR_SPRITE_CURSEUR*NB_SPRITES_CURSEUR))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, SPRITE_MENU,LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_MENU))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, SPRITE_PINCEAU,LARGEUR_PINCEAU*HAUTEUR_PINCEAU*NB_SPRITES_PINCEAU))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, SPRITE_DRIVE,LARGEUR_SPRITE_DRIVE*HAUTEUR_SPRITE_DRIVE*NB_SPRITES_DRIVES))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!(Logo_GrafX2=(byte *)malloc(231*56)))
|
|
Erreur(ERREUR_MEMOIRE);
|
|
if (!read_bytes(Handle, Logo_GrafX2,231*56))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
if (!read_bytes(Handle, TRAME_PREDEFINIE,2*16*NB_TRAMES_PREDEFINIES))
|
|
Erreur(ERREUR_DAT_CORROMPU);
|
|
|
|
// Lecture des fontes 8x8:
|
|
if (!(Fonte_temporaire=(byte *)malloc(2048)))
|
|
Erreur(ERREUR_MEMOIRE);
|
|
|
|
// Lecture de la fonte système
|
|
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_systeme[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>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<NB_SPRITES_PINCEAU;Indice++)
|
|
{
|
|
Pinceau_predefini_Decalage_X[Indice]=(Pinceau_predefini_Largeur[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<NB_BOUTONS;Indice_bouton++)
|
|
{
|
|
Bouton[Indice_bouton].Raccourci_gauche=0xFFFF;
|
|
Bouton[Indice_bouton].Raccourci_droite=0xFFFF;
|
|
Initialiser_bouton(Indice_bouton,
|
|
0,0,
|
|
1,1,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Rien_du_tout,Rien_du_tout,
|
|
Rien_du_tout,
|
|
0);
|
|
}
|
|
|
|
// Ici viennent les déclarations des boutons que l'on sait gérer
|
|
|
|
Initialiser_bouton(BOUTON_PINCEAUX,
|
|
0,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Menu_pinceaux,Bouton_Brosse_monochrome,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
// !!! TEMPORAIRE !!!
|
|
Initialiser_bouton(BOUTON_AJUSTER,
|
|
0,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Ajuster,Bouton_Ajuster,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
/*
|
|
Initialiser_bouton(BOUTON_AJUSTER,
|
|
0,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Ajuster,Rien_du_tout,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
*/
|
|
|
|
Initialiser_bouton(BOUTON_DESSIN,
|
|
17,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Dessin,Bouton_Dessin_Switch_mode,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_COURBES,
|
|
17,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Courbes,Bouton_Courbes_Switch_mode,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_LIGNES,
|
|
34,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Lignes,Bouton_Lignes_Switch_mode,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_SPRAY,
|
|
34,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Spray,Bouton_Spray_Menu,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_FLOODFILL,
|
|
51,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Fill,Bouton_Remplacer,
|
|
Bouton_desenclencher_Fill,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_POLYGONES,
|
|
51,18,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Polygone,Bouton_Polyform,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_POLYFILL,
|
|
52,19,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Polyfill,Bouton_Filled_polyform,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_RECTANGLES,
|
|
68,1,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Rectangle_vide,Bouton_Rectangle_vide,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_FILLRECT,
|
|
69,2,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Rectangle_plein,Bouton_Rectangle_plein,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_CERCLES,
|
|
68,18,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Cercle_vide,Bouton_Ellipse_vide,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_FILLCERC,
|
|
69,19,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Cercle_plein,Bouton_Ellipse_pleine,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
// !!! TEMPORAIRE !!!
|
|
Initialiser_bouton(BOUTON_GRADRECT,
|
|
85,1,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Rectangle_degrade,Bouton_Rectangle_degrade,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
/*
|
|
Initialiser_bouton(BOUTON_GRADRECT,
|
|
85,1,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Rien_du_tout,Rien_du_tout,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
*/
|
|
|
|
Initialiser_bouton(BOUTON_GRADMENU,
|
|
86,2,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Degrades,Bouton_Degrades,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_SPHERES,
|
|
85,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Cercle_degrade,Bouton_Ellipse_degrade,
|
|
Rien_du_tout,
|
|
FAMILLE_OUTIL);
|
|
|
|
Initialiser_bouton(BOUTON_BROSSE,
|
|
106,1,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Brosse,Bouton_Restaurer_brosse,
|
|
Bouton_desenclencher_Brosse,
|
|
FAMILLE_INTERRUPTION);
|
|
|
|
Initialiser_bouton(BOUTON_POLYBROSSE,
|
|
107,2,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Lasso,Bouton_Restaurer_brosse,
|
|
Bouton_desenclencher_Lasso,
|
|
FAMILLE_INTERRUPTION);
|
|
|
|
Initialiser_bouton(BOUTON_EFFETS_BROSSE,
|
|
106,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Brush_FX,Bouton_Brush_FX,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_EFFETS,
|
|
123,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Effets,Bouton_Effets,
|
|
Rien_du_tout,
|
|
FAMILLE_EFFETS);
|
|
|
|
// !!! TEMPORAIRE !!!
|
|
Initialiser_bouton(BOUTON_TEXTE,
|
|
123,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Texte,Message_Non_disponible,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
/*
|
|
Initialiser_bouton(BOUTON_TEXTE,
|
|
123,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Rien_du_tout,Rien_du_tout,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
*/
|
|
|
|
Initialiser_bouton(BOUTON_LOUPE,
|
|
140,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Loupe,Bouton_Menu_Loupe,
|
|
Bouton_desenclencher_Loupe,
|
|
FAMILLE_INTERRUPTION);
|
|
|
|
Initialiser_bouton(BOUTON_PIPETTE,
|
|
140,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Pipette,Bouton_Inverser_foreback,
|
|
Bouton_desenclencher_Pipette,
|
|
FAMILLE_INTERRUPTION);
|
|
|
|
Initialiser_bouton(BOUTON_RESOL,
|
|
161,1,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Resol,Bouton_Safety_resol,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_PAGE,
|
|
161,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Page,Bouton_Copy_page,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_SAUVER,
|
|
178,1,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Save,Bouton_Autosave,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_CHARGER,
|
|
179,2,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Load,Bouton_Reload,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_PARAMETRES,
|
|
178,18,
|
|
16,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Settings,Bouton_Settings,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_CLEAR,
|
|
195,1,
|
|
17,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Clear,Bouton_Clear_colore,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_AIDE,
|
|
195,18,
|
|
17,16,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Aide,Bouton_Stats,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_UNDO,
|
|
213,1,
|
|
19,12,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Undo,Bouton_Redo,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_KILL,
|
|
213,14,
|
|
19,7,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Kill,Bouton_Kill,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_QUIT,
|
|
213,22,
|
|
19,12,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Quit,Bouton_Quit,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_PALETTE,
|
|
237,9,
|
|
16,8,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Palette,Bouton_Palette_secondaire,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_PAL_LEFT,
|
|
237,18,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
|
|
Bouton_Pal_left,Bouton_Pal_left_fast,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_PAL_RIGHT,
|
|
238,19,
|
|
15,15,
|
|
FORME_BOUTON_TRIANGLE_BAS_DROITE,
|
|
Bouton_Pal_right,Bouton_Pal_right_fast,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_CHOIX_COL,
|
|
LARGEUR_MENU+1,2,
|
|
1,32, // La largeur est mise à jour à chq chngmnt de mode
|
|
FORME_BOUTON_SANS_CADRE,
|
|
Bouton_Choix_forecolor,Bouton_Choix_backcolor,
|
|
Rien_du_tout,
|
|
FAMILLE_INSTANTANE);
|
|
|
|
Initialiser_bouton(BOUTON_CACHER,
|
|
0,35,
|
|
16,9,
|
|
FORME_BOUTON_RECTANGLE,
|
|
Bouton_Cacher_menu,Bouton_Cacher_menu,
|
|
Rien_du_tout,
|
|
FAMILLE_TOOLBAR);
|
|
}
|
|
|
|
|
|
|
|
// Initialisation des opérations:
|
|
|
|
// Initialiseur d'une opération:
|
|
|
|
void Initialiser_operation(byte Numero_operation,
|
|
byte Numero_bouton_souris,
|
|
byte Taille_de_pile,
|
|
fonction_action Action,
|
|
byte Effacer_curseur)
|
|
{
|
|
Operation[Numero_operation][Numero_bouton_souris]
|
|
[Taille_de_pile].Action=Action;
|
|
Operation[Numero_operation][Numero_bouton_souris]
|
|
[Taille_de_pile].Effacer_curseur=Effacer_curseur;
|
|
}
|
|
|
|
|
|
// Initiliseur de toutes les opérations:
|
|
|
|
void Initialisation_des_operations(void)
|
|
{
|
|
byte Numero; // Numéro de l'option en cours d'auto-initialisation
|
|
byte Bouton; // Bouton souris en cours d'auto-initialisation
|
|
byte Taille; // Taille de la pile en cours d'auto-initialisation
|
|
|
|
// Auto-initialisation des opérations (vers des actions inoffensives)
|
|
|
|
for (Numero=0;Numero<NB_OPERATIONS;Numero++)
|
|
for (Bouton=0;Bouton<3;Bouton++)
|
|
for (Taille=0;Taille<TAILLE_PILE_OPERATIONS;Taille++)
|
|
Initialiser_operation(Numero,Bouton,Taille,Print_coordonnees,0);
|
|
|
|
|
|
// Ici viennent les déclarations détaillées des opérations
|
|
Initialiser_operation(OPERATION_DESSIN_CONTINU,1,0,
|
|
Freehand_Mode1_1_0,1);
|
|
Initialiser_operation(OPERATION_DESSIN_CONTINU,1,2,
|
|
Freehand_Mode1_1_2,0);
|
|
Initialiser_operation(OPERATION_DESSIN_CONTINU,0,2,
|
|
Freehand_Mode12_0_2,0);
|
|
Initialiser_operation(OPERATION_DESSIN_CONTINU,2,0,
|
|
Freehand_Mode1_2_0,1);
|
|
Initialiser_operation(OPERATION_DESSIN_CONTINU,2,2,
|
|
Freehand_Mode1_2_2,0);
|
|
|
|
Initialiser_operation(OPERATION_DESSIN_DISCONTINU,1,0,
|
|
Freehand_Mode2_1_0,1);
|
|
Initialiser_operation(OPERATION_DESSIN_DISCONTINU,1,2,
|
|
Freehand_Mode2_1_2,0);
|
|
Initialiser_operation(OPERATION_DESSIN_DISCONTINU,0,2,
|
|
Freehand_Mode12_0_2,0);
|
|
Initialiser_operation(OPERATION_DESSIN_DISCONTINU,2,0,
|
|
Freehand_Mode2_2_0,1);
|
|
Initialiser_operation(OPERATION_DESSIN_DISCONTINU,2,2,
|
|
Freehand_Mode2_2_2,0);
|
|
|
|
Initialiser_operation(OPERATION_DESSIN_POINT,1,0,
|
|
Freehand_Mode3_1_0,1);
|
|
Initialiser_operation(OPERATION_DESSIN_POINT,2,0,
|
|
Freehand_Mode3_2_0,1);
|
|
Initialiser_operation(OPERATION_DESSIN_POINT,0,1,
|
|
Freehand_Mode3_0_1,0);
|
|
|
|
Initialiser_operation(OPERATION_LIGNE,1,0,
|
|
Ligne_12_0,1);
|
|
Initialiser_operation(OPERATION_LIGNE,1,5,
|
|
Ligne_12_5,0);
|
|
Initialiser_operation(OPERATION_LIGNE,0,5,
|
|
Ligne_0_5,1);
|
|
Initialiser_operation(OPERATION_LIGNE,2,0,
|
|
Ligne_12_0,1);
|
|
Initialiser_operation(OPERATION_LIGNE,2,5,
|
|
Ligne_12_5,0);
|
|
|
|
Initialiser_operation(OPERATION_K_LIGNE,1,0,
|
|
K_Ligne_12_0,1);
|
|
Initialiser_operation(OPERATION_K_LIGNE,1,6,
|
|
K_Ligne_12_6,0);
|
|
Initialiser_operation(OPERATION_K_LIGNE,1,7,
|
|
K_Ligne_12_7,1);
|
|
Initialiser_operation(OPERATION_K_LIGNE,2,0,
|
|
K_Ligne_12_0,1);
|
|
Initialiser_operation(OPERATION_K_LIGNE,2,6,
|
|
K_Ligne_12_6,0);
|
|
Initialiser_operation(OPERATION_K_LIGNE,2,7,
|
|
K_Ligne_12_7,1);
|
|
Initialiser_operation(OPERATION_K_LIGNE,0,6,
|
|
K_Ligne_0_6,1);
|
|
Initialiser_operation(OPERATION_K_LIGNE,0,7,
|
|
K_Ligne_12_6,0);
|
|
|
|
Initialiser_operation(OPERATION_RECTANGLE_VIDE,1,0,
|
|
Rectangle_12_0,1);
|
|
Initialiser_operation(OPERATION_RECTANGLE_VIDE,2,0,
|
|
Rectangle_12_0,1);
|
|
Initialiser_operation(OPERATION_RECTANGLE_VIDE,1,5,
|
|
Rectangle_12_5,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_VIDE,2,5,
|
|
Rectangle_12_5,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_VIDE,0,5,
|
|
Rectangle_vide_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_RECTANGLE_PLEIN,1,0,
|
|
Rectangle_12_0,1);
|
|
Initialiser_operation(OPERATION_RECTANGLE_PLEIN,2,0,
|
|
Rectangle_12_0,1);
|
|
Initialiser_operation(OPERATION_RECTANGLE_PLEIN,1,5,
|
|
Rectangle_12_5,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_PLEIN,2,5,
|
|
Rectangle_12_5,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_PLEIN,0,5,
|
|
Rectangle_plein_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_CERCLE_VIDE,1,0,
|
|
Cercle_12_0,1);
|
|
Initialiser_operation(OPERATION_CERCLE_VIDE,2,0,
|
|
Cercle_12_0,1);
|
|
Initialiser_operation(OPERATION_CERCLE_VIDE,1,5,
|
|
Cercle_12_5,0);
|
|
Initialiser_operation(OPERATION_CERCLE_VIDE,2,5,
|
|
Cercle_12_5,0);
|
|
Initialiser_operation(OPERATION_CERCLE_VIDE,0,5,
|
|
Cercle_vide_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_CERCLE_PLEIN,1,0,
|
|
Cercle_12_0,1);
|
|
Initialiser_operation(OPERATION_CERCLE_PLEIN,2,0,
|
|
Cercle_12_0,1);
|
|
Initialiser_operation(OPERATION_CERCLE_PLEIN,1,5,
|
|
Cercle_12_5,0);
|
|
Initialiser_operation(OPERATION_CERCLE_PLEIN,2,5,
|
|
Cercle_12_5,0);
|
|
Initialiser_operation(OPERATION_CERCLE_PLEIN,0,5,
|
|
Cercle_plein_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_ELLIPSE_VIDE,1,0,
|
|
Ellipse_12_0,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_VIDE,2,0,
|
|
Ellipse_12_0,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_VIDE,1,5,
|
|
Ellipse_12_5,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_VIDE,2,5,
|
|
Ellipse_12_5,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_VIDE,0,5,
|
|
Ellipse_vide_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_ELLIPSE_PLEINE,1,0,
|
|
Ellipse_12_0,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_PLEINE,2,0,
|
|
Ellipse_12_0,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_PLEINE,1,5,
|
|
Ellipse_12_5,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_PLEINE,2,5,
|
|
Ellipse_12_5,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_PLEINE,0,5,
|
|
Ellipse_pleine_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_FILL,1,0,
|
|
Fill_1_0,1);
|
|
Initialiser_operation(OPERATION_FILL,2,0,
|
|
Fill_2_0,1);
|
|
|
|
Initialiser_operation(OPERATION_REMPLACER,1,0,
|
|
Remplacer_1_0,1);
|
|
Initialiser_operation(OPERATION_REMPLACER,2,0,
|
|
Remplacer_2_0,1);
|
|
|
|
Initialiser_operation(OPERATION_PRISE_BROSSE,1,0,
|
|
Brosse_12_0,1);
|
|
Initialiser_operation(OPERATION_PRISE_BROSSE,2,0,
|
|
Brosse_12_0,1);
|
|
Initialiser_operation(OPERATION_PRISE_BROSSE,1,5,
|
|
Brosse_12_5,0);
|
|
Initialiser_operation(OPERATION_PRISE_BROSSE,2,5,
|
|
Brosse_12_5,0);
|
|
Initialiser_operation(OPERATION_PRISE_BROSSE,0,5,
|
|
Brosse_0_5,1);
|
|
|
|
Initialiser_operation(OPERATION_ETIRER_BROSSE,1,0,
|
|
Etirer_brosse_12_0,1);
|
|
Initialiser_operation(OPERATION_ETIRER_BROSSE,2,0,
|
|
Etirer_brosse_12_0,1);
|
|
Initialiser_operation(OPERATION_ETIRER_BROSSE,1,7,
|
|
Etirer_brosse_1_7,0);
|
|
Initialiser_operation(OPERATION_ETIRER_BROSSE,0,7,
|
|
Etirer_brosse_0_7,0);
|
|
Initialiser_operation(OPERATION_ETIRER_BROSSE,2,7,
|
|
Etirer_brosse_2_7,1);
|
|
|
|
Initialiser_operation(OPERATION_TOURNER_BROSSE,1,0,
|
|
Tourner_brosse_12_0,1);
|
|
Initialiser_operation(OPERATION_TOURNER_BROSSE,2,0,
|
|
Tourner_brosse_12_0,1);
|
|
Initialiser_operation(OPERATION_TOURNER_BROSSE,1,5,
|
|
Tourner_brosse_1_5,0);
|
|
Initialiser_operation(OPERATION_TOURNER_BROSSE,0,5,
|
|
Tourner_brosse_0_5,0);
|
|
Initialiser_operation(OPERATION_TOURNER_BROSSE,2,5,
|
|
Tourner_brosse_2_5,1);
|
|
|
|
Initialiser_operation(OPERATION_POLYBROSSE,1,0,
|
|
Filled_polyform_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYBROSSE,2,0,
|
|
Filled_polyform_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYBROSSE,1,8,
|
|
Polybrosse_12_8,0);
|
|
Initialiser_operation(OPERATION_POLYBROSSE,2,8,
|
|
Polybrosse_12_8,0);
|
|
Initialiser_operation(OPERATION_POLYBROSSE,0,8,
|
|
Filled_polyform_0_8,0);
|
|
|
|
Pipette_Couleur=-1;
|
|
Initialiser_operation(OPERATION_PIPETTE,1,0,
|
|
Pipette_12_0,1);
|
|
Initialiser_operation(OPERATION_PIPETTE,2,0,
|
|
Pipette_12_0,0);
|
|
Initialiser_operation(OPERATION_PIPETTE,1,1,
|
|
Pipette_1_1,0);
|
|
Initialiser_operation(OPERATION_PIPETTE,2,1,
|
|
Pipette_2_1,0);
|
|
Initialiser_operation(OPERATION_PIPETTE,0,1,
|
|
Pipette_0_1,1);
|
|
|
|
Initialiser_operation(OPERATION_LOUPE,1,0,
|
|
Loupe_12_0,1);
|
|
Initialiser_operation(OPERATION_LOUPE,2,0,
|
|
Loupe_12_0,1);
|
|
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,1,0,
|
|
Courbe_34_points_1_0,1);
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,2,0,
|
|
Courbe_34_points_2_0,1);
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,1,5,
|
|
Courbe_34_points_1_5,0);
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,2,5,
|
|
Courbe_34_points_2_5,0);
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,0,5,
|
|
Courbe_4_points_0_5,1);
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,1,9,
|
|
Courbe_4_points_1_9,0);
|
|
Initialiser_operation(OPERATION_COURBE_4_POINTS,2,9,
|
|
Courbe_4_points_2_9,1);
|
|
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,1,0,
|
|
Courbe_34_points_1_0,1);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,2,0,
|
|
Courbe_34_points_2_0,1);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,1,5,
|
|
Courbe_34_points_1_5,0);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,2,5,
|
|
Courbe_34_points_2_5,0);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,0,5,
|
|
Courbe_3_points_0_5,1);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,0,11,
|
|
Courbe_3_points_0_11,0);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,1,11,
|
|
Courbe_3_points_12_11,1);
|
|
Initialiser_operation(OPERATION_COURBE_3_POINTS,2,11,
|
|
Courbe_3_points_12_11,1);
|
|
|
|
Initialiser_operation(OPERATION_SPRAY,1,0,
|
|
Spray_1_0,0);
|
|
Initialiser_operation(OPERATION_SPRAY,2,0,
|
|
Spray_2_0,0);
|
|
Initialiser_operation(OPERATION_SPRAY,1,3,
|
|
Spray_12_3,0);
|
|
Initialiser_operation(OPERATION_SPRAY,2,3,
|
|
Spray_12_3,0);
|
|
Initialiser_operation(OPERATION_SPRAY,0,3,
|
|
Spray_0_3,0);
|
|
|
|
Initialiser_operation(OPERATION_POLYGONE,1,0,
|
|
Polygone_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYGONE,2,0,
|
|
Polygone_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYGONE,1,8,
|
|
K_Ligne_12_6,0);
|
|
Initialiser_operation(OPERATION_POLYGONE,2,8,
|
|
K_Ligne_12_6,0);
|
|
Initialiser_operation(OPERATION_POLYGONE,1,9,
|
|
Polygone_12_9,1);
|
|
Initialiser_operation(OPERATION_POLYGONE,2,9,
|
|
Polygone_12_9,1);
|
|
Initialiser_operation(OPERATION_POLYGONE,0,8,
|
|
K_Ligne_0_6,1);
|
|
Initialiser_operation(OPERATION_POLYGONE,0,9,
|
|
K_Ligne_12_6,0);
|
|
|
|
Initialiser_operation(OPERATION_POLYFILL,1,0,
|
|
Polyfill_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYFILL,2,0,
|
|
Polyfill_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYFILL,1,8,
|
|
Polyfill_12_8,0);
|
|
Initialiser_operation(OPERATION_POLYFILL,2,8,
|
|
Polyfill_12_8,0);
|
|
Initialiser_operation(OPERATION_POLYFILL,1,9,
|
|
Polyfill_12_9,1);
|
|
Initialiser_operation(OPERATION_POLYFILL,2,9,
|
|
Polyfill_12_9,1);
|
|
Initialiser_operation(OPERATION_POLYFILL,0,8,
|
|
Polyfill_0_8,1);
|
|
Initialiser_operation(OPERATION_POLYFILL,0,9,
|
|
Polyfill_12_8,0);
|
|
|
|
Initialiser_operation(OPERATION_POLYFORM,1,0,
|
|
Polyform_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYFORM,2,0,
|
|
Polyform_12_0,1);
|
|
Initialiser_operation(OPERATION_POLYFORM,1,8,
|
|
Polyform_12_8,0);
|
|
Initialiser_operation(OPERATION_POLYFORM,2,8,
|
|
Polyform_12_8,0);
|
|
Initialiser_operation(OPERATION_POLYFORM,0,8,
|
|
Polyform_0_8,0);
|
|
|
|
Initialiser_operation(OPERATION_FILLED_POLYFORM,1,0,
|
|
Filled_polyform_12_0,1);
|
|
Initialiser_operation(OPERATION_FILLED_POLYFORM,2,0,
|
|
Filled_polyform_12_0,1);
|
|
Initialiser_operation(OPERATION_FILLED_POLYFORM,1,8,
|
|
Filled_polyform_12_8,0);
|
|
Initialiser_operation(OPERATION_FILLED_POLYFORM,2,8,
|
|
Filled_polyform_12_8,0);
|
|
Initialiser_operation(OPERATION_FILLED_POLYFORM,0,8,
|
|
Filled_polyform_0_8,0);
|
|
|
|
Initialiser_operation(OPERATION_SCROLL,1,0,
|
|
Scroll_12_0,1);
|
|
Initialiser_operation(OPERATION_SCROLL,2,0,
|
|
Scroll_12_0,1);
|
|
Initialiser_operation(OPERATION_SCROLL,1,4,
|
|
Scroll_12_4,0);
|
|
Initialiser_operation(OPERATION_SCROLL,2,4,
|
|
Scroll_12_4,0);
|
|
Initialiser_operation(OPERATION_SCROLL,0,4,
|
|
Scroll_0_4,1);
|
|
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,1,0,
|
|
Cercle_degrade_12_0,1);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,2,0,
|
|
Cercle_degrade_12_0,1);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,1,6,
|
|
Cercle_degrade_12_6,0);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,2,6,
|
|
Cercle_degrade_12_6,0);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,0,6,
|
|
Cercle_degrade_0_6,1);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,1,8,
|
|
Cercle_degrade_12_8,1);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,2,8,
|
|
Cercle_degrade_12_8,1);
|
|
Initialiser_operation(OPERATION_CERCLE_DEGRADE,0,8,
|
|
Cercle_ou_ellipse_degrade_0_8,0);
|
|
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,0,8,
|
|
Cercle_ou_ellipse_degrade_0_8,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,1,0,
|
|
Ellipse_degradee_12_0,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,2,0,
|
|
Ellipse_degradee_12_0,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,1,6,
|
|
Ellipse_degradee_12_6,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,2,6,
|
|
Ellipse_degradee_12_6,0);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,0,6,
|
|
Ellipse_degradee_0_6,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,1,8,
|
|
Ellipse_degradee_12_8,1);
|
|
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,2,8,
|
|
Ellipse_degradee_12_8,1);
|
|
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,0,Rectangle_Degrade_12_0,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,5,Rectangle_Degrade_12_5,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,5,Rectangle_Degrade_0_5,1);
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,7,Rectangle_Degrade_0_7,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,7,Rectangle_Degrade_12_7,1);
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,9,Rectangle_Degrade_12_9,0);
|
|
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,9,Rectangle_Degrade_0_9,1);
|
|
|
|
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,1,0,
|
|
Lignes_centrees_12_0,1);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,2,0,
|
|
Lignes_centrees_12_0,1);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,1,3,
|
|
Lignes_centrees_12_3,0);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,2,3,
|
|
Lignes_centrees_12_3,0);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,0,3,
|
|
Lignes_centrees_0_3,1);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,1,7,
|
|
Lignes_centrees_12_7,0);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,2,7,
|
|
Lignes_centrees_12_7,0);
|
|
Initialiser_operation(OPERATION_LIGNES_CENTREES,0,7,
|
|
Lignes_centrees_0_7,0);
|
|
}
|
|
|
|
|
|
|
|
//-- Définition des modes vidéo: --------------------------------------------
|
|
|
|
// Définition d'un mode:
|
|
|
|
void Definir_mode_video(short Largeur,
|
|
short Hauteur,
|
|
byte Mode,
|
|
word Fullscreen)
|
|
{
|
|
byte Supporte = 0;
|
|
|
|
if (Nb_modes_video >= 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<(long)sizeof(CFG_Header))
|
|
|| (!read_bytes(Handle, &CFG_Header.Signature, 3))
|
|
|| memcmp(CFG_Header.Signature,"CFG",3)
|
|
|| (!read_byte(Handle, &CFG_Header.Version1))
|
|
|| (!read_byte(Handle, &CFG_Header.Version2))
|
|
|| (!read_byte(Handle, &CFG_Header.Beta1))
|
|
|| (!read_byte(Handle, &CFG_Header.Beta2)) )
|
|
goto Erreur_lecture_config;
|
|
|
|
// Version DOS de Robinson et X-Man
|
|
if ( (CFG_Header.Version1== 2)
|
|
&& (CFG_Header.Version2== 0)
|
|
&& (CFG_Header.Beta1== 96))
|
|
{
|
|
// Les touches (scancodes) sont à convertir)
|
|
Conversion_touches = 1;
|
|
}
|
|
// Version SDL
|
|
else if ( (CFG_Header.Version1!=VERSION1)
|
|
|| (CFG_Header.Version2!=VERSION2)
|
|
|| (CFG_Header.Beta1!=BETA1)
|
|
|| (CFG_Header.Beta2!=BETA2) )
|
|
goto Erreur_config_ancienne;
|
|
|
|
// - Lecture des infos contenues dans le fichier de config -
|
|
while (read_byte(Handle, &Chunk.Numero))
|
|
{
|
|
read_word_le(Handle, &Chunk.Taille);
|
|
switch (Chunk.Numero)
|
|
{
|
|
case CHUNK_TOUCHES: // Touches
|
|
if (Tout_charger)
|
|
{
|
|
for (Indice=0; Indice<(long)(Chunk.Taille/sizeof(CFG_Infos_touche)); Indice++)
|
|
{
|
|
if (!read_word_le(Handle, &CFG_Infos_touche.Numero) ||
|
|
!read_word_le(Handle, &CFG_Infos_touche.Touche) ||
|
|
!read_word_le(Handle, &CFG_Infos_touche.Touche2) )
|
|
goto Erreur_lecture_config;
|
|
else
|
|
{
|
|
if (Conversion_touches)
|
|
{
|
|
CFG_Infos_touche.Touche = Touche_pour_scancode(CFG_Infos_touche.Touche);
|
|
}
|
|
for (Indice2=0;
|
|
((Indice2<NB_TOUCHES) && (ConfigTouche[Indice2].Numero!=CFG_Infos_touche.Numero));
|
|
Indice2++);
|
|
if (Indice2<NB_TOUCHES)
|
|
{
|
|
switch(Ordonnancement[Indice2]>>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<(long)(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<Nb_modes_video; Indice2++)
|
|
{
|
|
if (Mode_video[Indice2].Largeur==CFG_Mode_video.Largeur &&
|
|
Mode_video[Indice2].Hauteur==CFG_Mode_video.Hauteur)
|
|
{
|
|
// On ne prend le paramètre utilisateur que si la résolution
|
|
// est effectivement supportée par SDL
|
|
// Seules les deux petits bits sont récupérés, car les anciens fichiers
|
|
// de configuration (DOS 96.5%) utilisaient d'autres bits.
|
|
if (! (Mode_video[Indice2].Etat & 128))
|
|
Mode_video[Indice2].Etat=CFG_Mode_video.Etat&3;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
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)
|
|
{
|
|
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;
|
|
int Modes_a_sauver;
|
|
//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<NB_TOUCHES; Indice++)
|
|
{
|
|
CFG_Infos_touche.Numero = ConfigTouche[Indice].Numero;
|
|
switch(Ordonnancement[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;
|
|
}
|
|
|
|
// D'abord compter les modes pour lesquels l'utilisateur a mis une préférence
|
|
Modes_a_sauver=0;
|
|
for (Indice=1; Indice<Nb_modes_video; Indice++)
|
|
if (Mode_video[Indice].Etat==0 || Mode_video[Indice].Etat==2 || Mode_video[Indice].Etat==3)
|
|
Modes_a_sauver++;
|
|
|
|
// Sauvegarde de l'état de chaque mode vidéo
|
|
Chunk.Numero=CHUNK_MODES_VIDEO;
|
|
Chunk.Taille=Modes_a_sauver * sizeof(CFG_Mode_video);
|
|
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
for (Indice=1; Indice<Nb_modes_video; Indice++)
|
|
if (Mode_video[Indice].Etat==0 || Mode_video[Indice].Etat==2 || Mode_video[Indice].Etat==3)
|
|
{
|
|
CFG_Mode_video.Etat =Mode_video[Indice].Etat;
|
|
CFG_Mode_video.Largeur=Mode_video[Indice].Largeur;
|
|
CFG_Mode_video.Hauteur=Mode_video[Indice].Hauteur;
|
|
|
|
if (!write_byte(Handle, CFG_Mode_video.Etat) ||
|
|
!write_word_le(Handle, CFG_Mode_video.Largeur) ||
|
|
!write_word_le(Handle, CFG_Mode_video.Hauteur) )
|
|
goto Erreur_sauvegarde_config;
|
|
}
|
|
|
|
// Ecriture des données du Shade (précédées du shade en cours)
|
|
Chunk.Numero=CHUNK_SHADE;
|
|
Chunk.Taille=sizeof(Shade_Liste)+sizeof(Shade_Actuel);
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_byte(Handle, Shade_Actuel))
|
|
goto Erreur_sauvegarde_config;
|
|
for (Indice=0; Indice<8; Indice++)
|
|
{
|
|
for (Indice2=0; Indice2<512; Indice2++)
|
|
{
|
|
if (! write_word_le(Handle, Shade_Liste[Indice].Liste[Indice2]))
|
|
goto Erreur_sauvegarde_config;
|
|
}
|
|
if (! write_byte(Handle, Shade_Liste[Indice].Pas) ||
|
|
! write_byte(Handle, Shade_Liste[Indice].Mode) )
|
|
goto Erreur_sauvegarde_config;
|
|
}
|
|
|
|
// Sauvegarde des informations du Masque
|
|
Chunk.Numero=CHUNK_MASQUE;
|
|
Chunk.Taille=sizeof(Mask);
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_bytes(Handle, Mask,256))
|
|
goto Erreur_sauvegarde_config;
|
|
|
|
// Sauvegarde des informations du Stencil
|
|
Chunk.Numero=CHUNK_STENCIL;
|
|
Chunk.Taille=sizeof(Stencil);
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_bytes(Handle, Stencil,256))
|
|
goto Erreur_sauvegarde_config;
|
|
|
|
// Sauvegarde des informations des dégradés
|
|
Chunk.Numero=CHUNK_DEGRADES;
|
|
Chunk.Taille=sizeof(Degrade_Tableau)+1;
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_byte(Handle, Degrade_Courant))
|
|
goto Erreur_sauvegarde_config;
|
|
for(Indice=0;Indice<16;Indice++)
|
|
{
|
|
if (!write_byte(Handle,Degrade_Tableau[Indice].Debut) ||
|
|
!write_byte(Handle,Degrade_Tableau[Indice].Fin) ||
|
|
!write_dword_le(Handle, Degrade_Tableau[Indice].Inverse) ||
|
|
!write_dword_le(Handle, Degrade_Tableau[Indice].Melange) ||
|
|
!write_dword_le(Handle, Degrade_Tableau[Indice].Technique) )
|
|
goto Erreur_sauvegarde_config;
|
|
}
|
|
|
|
// Sauvegarde de la matrice du Smooth
|
|
Chunk.Numero=CHUNK_SMOOTH;
|
|
Chunk.Taille=sizeof(Smooth_Matrice);
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
for (Indice=0; Indice<3; Indice++)
|
|
for (Indice2=0; Indice2<3; Indice2++)
|
|
if (!write_byte(Handle, Smooth_Matrice[Indice][Indice2]))
|
|
goto Erreur_sauvegarde_config;
|
|
|
|
// Sauvegarde des couleurs à exclure
|
|
Chunk.Numero=CHUNK_EXCLUDE_COLORS;
|
|
Chunk.Taille=sizeof(Exclude_color);
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_bytes(Handle, Exclude_color, 256))
|
|
goto Erreur_sauvegarde_config;
|
|
|
|
// Sauvegarde des informations du Quick-shade
|
|
Chunk.Numero=CHUNK_QUICK_SHADE;
|
|
Chunk.Taille=sizeof(Quick_shade_Step)+sizeof(Quick_shade_Loop);
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_byte(Handle, Quick_shade_Step))
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_byte(Handle, Quick_shade_Loop))
|
|
goto Erreur_sauvegarde_config;
|
|
|
|
// Sauvegarde des informations de la grille
|
|
Chunk.Numero=CHUNK_GRILLE;
|
|
Chunk.Taille=8;
|
|
if (!write_byte(Handle, Chunk.Numero) ||
|
|
!write_word_le(Handle, Chunk.Taille) )
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_word_le(Handle, Snap_Largeur))
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_word_le(Handle, Snap_Hauteur))
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_word_le(Handle, Snap_Decalage_X))
|
|
goto Erreur_sauvegarde_config;
|
|
if (!write_word_le(Handle, Snap_Decalage_Y))
|
|
goto Erreur_sauvegarde_config;
|
|
|
|
|
|
if (fclose(Handle))
|
|
return ERREUR_SAUVEGARDE_CFG;
|
|
|
|
return 0;
|
|
|
|
Erreur_sauvegarde_config:
|
|
fclose(Handle);
|
|
return ERREUR_SAUVEGARDE_CFG;
|
|
}
|
|
|
|
|
|
void Initialiser_les_tables_de_multiplication(void)
|
|
{
|
|
word Indice_de_facteur;
|
|
word Facteur_de_zoom;
|
|
word Indice_de_multiplication;
|
|
|
|
for (Indice_de_facteur=0;Indice_de_facteur<NB_FACTEURS_DE_ZOOM;Indice_de_facteur++)
|
|
{
|
|
Facteur_de_zoom=FACTEUR_ZOOM[Indice_de_facteur];
|
|
|
|
for (Indice_de_multiplication=0;Indice_de_multiplication<512;Indice_de_multiplication++)
|
|
{
|
|
TABLE_ZOOM[Indice_de_facteur][Indice_de_multiplication]=Facteur_de_zoom*Indice_de_multiplication;
|
|
}
|
|
}
|
|
}
|
|
|
|
// (Ré)assigne toutes les valeurs de configuration par défaut
|
|
void Config_par_defaut(void)
|
|
{
|
|
int Indice, Indice2;
|
|
|
|
// Raccourcis clavier
|
|
for (Indice=0; Indice<NB_TOUCHES; Indice++)
|
|
{
|
|
switch(Ordonnancement[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;
|
|
|
|
}
|