/* Grafx2 - The Ultimate 256-color bitmap paint program Copyright 2008 Peter Gordon 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 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 #include "pages.h" #include "files.h" #include "loadsave.h" #include "sdlscreen.h" #include "erreurs.h" #include "readini.h" #include "saveini.h" #include "io.h" #include "texte.h" #if defined(__WIN32__) #include #include #define chdir(dir) SetCurrentDirectory(dir) #elif defined(__macosx__) #import #import #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_modepixels))[(y*32+x)] != 255) Masque_icone[(y*32+x)/8] |=0x80>>(x&7); SDL_WM_SetIcon(Icone,Masque_icone); } } // Texte Initialisation_Texte(); // On initialise tous les modes vidéo Definition_des_modes_video(); // On initialise les données sur l'état du programme: // Donnée sur la sortie du programme: Quit_demande=0; Sortir_du_programme=0; // Données sur l'état du menu: Pixel_dans_menu=Pixel_dans_barre_d_outil; Menu_visible=1; // Données sur les couleurs et la palette: Fore_color=15; Back_color=0; Couleur_debut_palette=0; // Données sur le curseur: Forme_curseur=FORME_CURSEUR_CIBLE; Cacher_curseur=0; // Données sur le pinceau: Pinceau_X=0; Pinceau_Y=0; Pinceau_Forme=FORME_PINCEAU_ROND; Cacher_pinceau=0; Pixel_de_chargement=Pixel_Chargement_dans_ecran_courant; Forcer_affichage_curseur=0; // On initialise tout ce qui concerne les opérations et les effets Operation_Taille_pile=0; Mode_de_dessin_en_cours=OPERATION_DESSIN_CONTINU; Ligne_en_cours =OPERATION_LIGNE; Courbe_en_cours =OPERATION_COURBE_3_POINTS; Fonction_effet=Aucun_effet; // On initialise les infos de la loupe: Loupe_Mode=0; Loupe_Facteur=FACTEUR_DE_ZOOM_PAR_DEFAUT; Initialiser_les_tables_de_multiplication(); Table_mul_facteur_zoom=TABLE_ZOOM[2]; Principal_Proportion_split=PROPORTION_SPLIT; Brouillon_Proportion_split=PROPORTION_SPLIT; // On initialise les infos du mode smear: Smear_Mode=0; Smear_Brosse_Largeur=LARGEUR_PINCEAU; Smear_Brosse_Hauteur=HAUTEUR_PINCEAU; // On initialise les infos du mode smooth: Smooth_Mode=0; // On initialise les infos du mode shade: Shade_Mode=0; // Les autres infos du Shade sont chargées avec la config Quick_shade_Mode=0; // idem // On initialise les infos sur les dégradés: Traiter_pixel_de_degrade =Afficher_pixel; // Les autres infos sont chargées avec la config // On initialise les infos de la grille: Snap_Mode=0; Snap_Largeur=8; Snap_Hauteur=8; Snap_Decalage_X=0; Snap_Decalage_Y=0; // On initialise les infos du mode Colorize: Colorize_Mode=0; // Mode colorize inactif par défaut Colorize_Opacite=50; // Une interpolation de 50% par défaut Colorize_Mode_en_cours=0; // Par défaut, la méthode par interpolation Calculer_les_tables_de_Colorize(); // On initialise les infos du mode Tiling: Tiling_Mode=0; // Pas besoin d'initialiser les décalages car ça se fait // en prenant une brosse (toujours mis à 0). // On initialise les infos du mode Mask: Mask_Mode=0; // Infos du Spray Spray_Mode=1; // Mode Mono Spray_Size=31; Spray_Delay=1; Spray_Mono_flow=10; memset(Spray_Multi_flow,0,256); srand(time(NULL)); // On randomize un peu tout ça... // Initialisation des boutons Initialisation_des_boutons(); // Initialisation des opérations Initialisation_des_operations(); Fenetre=0; // Charger les sprites et la palette Charger_DAT(); // Charger la configuration des touches Config_par_defaut(); switch(Charger_CFG(1)) { case ERREUR_CFG_ABSENT: // Pas un problème, on a les valeurs par défaut. break; case ERREUR_CFG_CORROMPU: DEBUG("Corrupted CFG file.",0); break; case ERREUR_CFG_ANCIEN: DEBUG("Unknown CFG file version, not loaded.",0); break; } // Charger la configuration du .INI Temp=Charger_INI(&Config); if (Temp) Erreur(Temp); // Transfert des valeurs du .INI qui ne changent pas dans des variables // plus accessibles: Palette_defaut[252]=Coul_menu_pref[0]=Config.Coul_menu_pref[0]; Palette_defaut[253]=Coul_menu_pref[1]=Config.Coul_menu_pref[1]; Palette_defaut[254]=Coul_menu_pref[2]=Config.Coul_menu_pref[2]; Palette_defaut[255]=Coul_menu_pref[3]=Config.Coul_menu_pref[3]; memcpy(Principal_Palette,Palette_defaut,sizeof(T_Palette)); CM_Noir =0; CM_Fonce=25; CM_Clair=7; CM_Blanc=15; CM_Trans=1; Calculer_couleurs_menu_optimales(Palette_defaut); // Infos sur les trames (Sieve) Trame_Mode=0; Copier_trame_predefinie(0); // On sélectionne toutes les couleurs pour le masque de copie de couleurs vers le brouillon memset(Masque_copie_couleurs,1,256); // Prise en compte de la fonte if (Config.Fonte) Fonte=Fonte_fun; else Fonte=Fonte_systeme; // Allocation de mémoire pour la brosse if (!(Brosse =(byte *)malloc( 1* 1))) Erreur(ERREUR_MEMOIRE); if (!(Smear_Brosse =(byte *)malloc(TAILLE_MAXI_PINCEAU*TAILLE_MAXI_PINCEAU))) Erreur(ERREUR_MEMOIRE); // Pinceau if (!(Pinceau_Sprite=(byte *)malloc(TAILLE_MAXI_PINCEAU*TAILLE_MAXI_PINCEAU))) Erreur(ERREUR_MEMOIRE); *Pinceau_Sprite=1; Pinceau_Largeur=1; Pinceau_Hauteur=1; Analyse_de_la_ligne_de_commande(argc,argv); Mode_dans_lequel_on_demarre=Resolution_actuelle; Buffer_de_ligne_horizontale=NULL; Resolution_actuelle=-1; // On n'était pas dans un mode graphique Initialiser_mode_video( Mode_video[Mode_dans_lequel_on_demarre].Largeur, Mode_video[Mode_dans_lequel_on_demarre].Hauteur, Mode_video[Mode_dans_lequel_on_demarre].Fullscreen); Principal_Largeur_image=Largeur_ecran; Principal_Hauteur_image=Hauteur_ecran; Brouillon_Largeur_image=Largeur_ecran; Brouillon_Hauteur_image=Hauteur_ecran; // Allocation de mémoire pour les différents écrans virtuels (et brosse) if (Initialiser_les_listes_de_backups_en_debut_de_programme(Config.Nb_pages_Undo+1,Largeur_ecran,Hauteur_ecran)==0) Erreur(ERREUR_MEMOIRE); // On remet le nom par défaut pour la page de brouillon car il été modifié // par le passage d'un fichier en paramètre lors du traitement précédent. // Note: le fait que l'on ne modifie que les variables globales // Brouillon_* et pas les infos contenues dans la page de brouillon // elle-même ne m'inspire pas confiance mais ça a l'air de marcher sans // poser de problèmes, alors... if (Un_fichier_a_ete_passe_en_parametre) { strcpy(Brouillon_Repertoire_fichier,Brouillon_Repertoire_courant); strcpy(Brouillon_Nom_fichier,"NO_NAME.PKM"); Brouillon_Format_fichier=FORMAT_PAR_DEFAUT; } // Nettoyage de l'écran virtuel (les autres recevront celui-ci par copie) memset(Principal_Ecran,0,Principal_Largeur_image*Principal_Hauteur_image); // Initialisation de diverses variables par calcul: Calculer_donnees_loupe(); Calculer_limites(); Calculer_coordonnees_pinceau(); // On affiche le menu: Afficher_menu(); Afficher_pinceau_dans_menu(); // On affiche le curseur pour débutter correctement l'état du programme: Afficher_curseur(); Brouillon_Image_modifiee=0; Principal_Image_modifiee=0; // Le programme débute en mode de dessin à la main Enclencher_bouton(BOUTON_DESSIN,A_GAUCHE); // On initialise la brosse initiale à 1 pixel blanc: Brosse_Largeur=1; Brosse_Hauteur=1; Capturer_brosse(0,0,0,0,0); *Brosse=CM_Blanc; } // ------------------------- Fermeture du programme -------------------------- void Fermeture_du_programme(void) { int Retour; // On libère le buffer de gestion de lignes free(Buffer_de_ligne_horizontale); // On libère le pinceau spécial free(Pinceau_Sprite); // On libère les différents écrans virtuels et brosse: free(Brosse); Nouveau_nombre_de_backups(0); free(Brouillon_Ecran); free(Principal_Ecran); // On prend bien soin de passer dans le répertoire initial: if (chdir(Repertoire_initial)!=-1) { // On sauvegarde les données dans le .CFG et dans le .INI if (Config.Auto_save) { Retour=Sauver_CFG(); if (Retour) Erreur(Retour); Retour=Sauver_INI(&Config); if (Retour) Erreur(Retour); } } else Erreur(ERREUR_REPERTOIRE_DISPARU); SDL_Quit(); } // -------------------------- Procédure principale --------------------------- int main(int argc,char * argv[]) { Initialisation_du_programme(argc,argv); if (Config.Opening_message && (!Un_fichier_a_ete_passe_en_parametre)) Bouton_Message_initial(); //free(Logo_GrafX2); // Utilisé dans le About if (Un_fichier_a_ete_passe_en_parametre) { Bouton_Reload(); Une_resolution_a_ete_passee_en_parametre=0; } Gestion_principale(); Fermeture_du_programme(); return 0; }