diff --git a/boutons.c b/boutons.c index 712a5fd8..1126978c 100644 --- a/boutons.c +++ b/boutons.c @@ -1,14 +1,14 @@ -#include "const.h" -#include "struct.h" -#include "global.h" -#include "divers.h" -#include "graph.h" -#include "moteur.h" -#include "readline.h" -#include "files.h" -#include "loadsave.h" -#include "init.h" -#include +#include "const.h" +#include "struct.h" +#include "global.h" +#include "divers.h" +#include "graph.h" +#include "moteur.h" +#include "readline.h" +#include "files.h" +#include "loadsave.h" +#include "init.h" +#include #include #include @@ -17,5472 +17,5472 @@ #include #include #include "boutons.h" -#include "operatio.h" +#include "operatio.h" // On d‚clare m‚chamment le prototype de Erreur pour ‚viter de faire un // fichier "main.h": void Erreur(int Code); - -//-- MODELE DE BOUTON DE MENU ------------------------------------------------ -/* -void Bouton_***(void) -{ - short Bouton_clicke; - - Ouvrir_fenetre(310,190,"***"); - - Fenetre_Definir_bouton_normal(103,137,80,14,"OK",0,1,0x001C); // 1 - Fenetre_Definir_bouton_scroller(18,44,88,16,4,0); // 2 - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while (Bouton_clicke!=1); - - Fermer_fenetre(); - Desenclencher_bouton(BOUTON_***); - Afficher_curseur(); -} -*/ - - -void Message_Non_disponible(void) -{ - short Bouton_clicke; - - Ouvrir_fenetre(160,76,"Not available yet!"); - - Print_dans_fenetre(8,20,"This function will",CM_Noir,CM_Clair); - Print_dans_fenetre(12,28,"be implemented in",CM_Noir,CM_Clair); - Print_dans_fenetre(16,36,"a later version.",CM_Noir,CM_Clair); - Fenetre_Definir_bouton_normal(60,53,40,14,"OK",1,1,0x001C); // 1 - Afficher_curseur(); - - do - Bouton_clicke=Fenetre_Bouton_clicke(); - while ((Bouton_clicke<=0) && (Touche!=0x0001) && (Touche!=0x0018)); - - Fermer_fenetre(); - - // Puisque cette fonction peut ˆtre appel‚e par plusieurs boutons et qu'on - // ne sait pas lequel c'est, on les d‚senclenche tous. De toutes fa‡ons, ‡a - // ne sert … rien d'essayer d'optimiser ‡a puisque l'utilisateur ne devrait - // pas souvent l'appeler, et en plus y'en a pas beaucoup … d‚senclencher. ;) - Desenclencher_bouton(BOUTON_GRADRECT); - Desenclencher_bouton(BOUTON_TEXTE); - - Afficher_curseur(); -} - - -void Message_Memoire_insuffisante(void) -{ - short Bouton_clicke; - - Ouvrir_fenetre(216,76,"Not enough memory!"); - - Print_dans_fenetre(8,20,"Please consult the manual",CM_Noir,CM_Clair); - Print_dans_fenetre(24,28,"to know how to obtain",CM_Noir,CM_Clair); - Print_dans_fenetre(36,36,"more memory space.",CM_Noir,CM_Clair); - Fenetre_Definir_bouton_normal(60,53,40,14,"OK",1,1,0x001C); // 1 - Afficher_curseur(); - - do - Bouton_clicke=Fenetre_Bouton_clicke(); - while ((Bouton_clicke<=0) && (Touche!=0x0001) && (Touche!=0x0018)); - - Fermer_fenetre(); - Afficher_curseur(); -} - - -void Bouton_Message_initial(void) -{ - short Bouton_clicke; - char Chaine[21]; - int Pos_X,Offs_Y,X,Y; - - sprintf(Chaine,"GrafX 2.00 %s%s",ALPHA_BETA,POURCENTAGE_VERSION); - Ouvrir_fenetre(260,172,Chaine); - - Fenetre_Afficher_cadre_creux(10,20,239,62); - Block(Fenetre_Pos_X+(Menu_Facteur_X*11), - Fenetre_Pos_Y+(Menu_Facteur_Y*21), - Menu_Facteur_X*237,Menu_Facteur_Y*60,CM_Noir); - for (Y=23,Offs_Y=0; Y<79; Offs_Y+=231,Y++) - for (X=14,Pos_X=0; Pos_X<231; Pos_X++,X++) - Pixel_dans_fenetre(X,Y,Logo_GrafX2[Offs_Y+Pos_X]); - - Print_dans_fenetre(27, 88,"Copyright (c) 1996-1999 by",CM_Fonce,CM_Clair); - Print_dans_fenetre(79, 96,"Sunset Design",CM_Noir,CM_Clair); - Print_dans_fenetre(55,104,"All rights reserved",CM_Fonce,CM_Clair); - - Print_dans_fenetre( 7,120,"You should read the README!.1ST",CM_Fonce,CM_Clair); - Print_dans_fenetre( 7,128,"file before using this program",CM_Fonce,CM_Clair); - Print_dans_fenetre( 7,136,"for the first time.",CM_Fonce,CM_Clair); - - if ((*ALPHA_BETA)=='à') - { - Print_char_transparent_dans_fenetre(43,119,'M',CM_Noir); - Print_char_transparent_dans_fenetre(53,121,'U',CM_Noir); - Print_char_transparent_dans_fenetre(63,119,'S',CM_Noir); - Print_char_transparent_dans_fenetre(74,120,'T',CM_Noir); - } - - Fenetre_Definir_bouton_normal(90,151,80,14,"OK",0,1,0x001C); // 1 - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while ((Bouton_clicke!=1) && (Touche!=0x0001) && (Touche!=0x0018)); - - Fermer_fenetre(); - Afficher_curseur(); -} - - - -void Changer_la_forme_du_pinceau(byte Forme) -{ - Pinceau_Forme=Forme; - Afficher_pinceau_dans_menu(); - - switch (Operation_en_cours) - { - case OPERATION_FILL : - Pinceau_Forme_avant_fill=Forme; - Pinceau_Forme=FORME_PINCEAU_POINT; - break; - case OPERATION_PIPETTE : - Pinceau_Forme_avant_pipette=Forme; - Pinceau_Forme=FORME_PINCEAU_POINT; - break; - // Note: Il existe un Pinceau_Forme_avant_lasso, mais comme le lasso aura - // ‚t‚ automatiquement d‚sactiv‚ avant d'arriver ici, y'a pas de problŠme. - } -} - - -//-------------------------------- UNDO/REDO --------------------------------- -void Bouton_Undo(void) -{ - Effacer_curseur(); - Undo(); - - Set_palette(Principal_Palette); - Calculer_couleurs_menu_optimales(Principal_Palette); - - Afficher_ecran(); - Desenclencher_bouton(BOUTON_UNDO); - Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); - Afficher_menu(); - Afficher_curseur(); -} - -void Bouton_Redo(void) -{ - Effacer_curseur(); - Redo(); - - Set_palette(Principal_Palette); - Calculer_couleurs_menu_optimales(Principal_Palette); - - Afficher_ecran(); - Desenclencher_bouton(BOUTON_UNDO); - Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); - Afficher_menu(); - Afficher_curseur(); -} - - -//---------------------------- SCROLL PALETTE LEFT --------------------------- -void Bouton_Pal_left(void) -{ - Effacer_curseur(); - if (Couleur_debut_palette) - { - Couleur_debut_palette-=8; - Afficher_palette_du_menu(); - } - Desenclencher_bouton(BOUTON_PAL_LEFT); - Afficher_curseur(); -} - -void Bouton_Pal_left_fast(void) -{ - Effacer_curseur(); - if (Couleur_debut_palette) - { - Couleur_debut_palette=(Couleur_debut_palette>=64)? Couleur_debut_palette-64 : 0; - Afficher_palette_du_menu(); - } - Desenclencher_bouton(BOUTON_PAL_LEFT); - Afficher_curseur(); -} - - -//--------------------------- SCROLL PALETTE RIGHT --------------------------- -void Bouton_Pal_right(void) -{ - Effacer_curseur(); - if (Couleur_debut_palette<=184) - { - Couleur_debut_palette+=8; - Afficher_palette_du_menu(); - } - Desenclencher_bouton(BOUTON_PAL_RIGHT); - Afficher_curseur(); -} - -void Bouton_Pal_right_fast(void) -{ - Effacer_curseur(); - if (Couleur_debut_palette<=184) - { - Couleur_debut_palette=(Couleur_debut_palette<=120)? Couleur_debut_palette+64 : 192; - Afficher_palette_du_menu(); - } - Desenclencher_bouton(BOUTON_PAL_RIGHT); - Afficher_curseur(); -} - -//-------------------- Choix de la forecolor dans le menu -------------------- -void Bouton_Choix_forecolor(void) -{ - word Pos_X, Pos_Y; - - Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); - Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; - - if ((!Config.Couleurs_separees) - || ((Pos_X%Menu_Taille_couleur!=Menu_Taille_couleur-1) && ((Pos_Y&3)!=3))) - { - Effacer_curseur(); - Encadrer_couleur_menu(CM_Noir); - Fore_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)<<3)+(Pos_Y>>2); - Encadrer_couleur_menu(CM_Blanc); - Afficher_foreback(); - Afficher_curseur(); - } -} - -//-------------------- Choix de la backcolor dans le menu -------------------- -void Bouton_Choix_backcolor(void) -{ - word Pos_X, Pos_Y; - - Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); - Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; - - if ((!Config.Couleurs_separees) - || ((Pos_X%Menu_Taille_couleur!=Menu_Taille_couleur-1) && ((Pos_Y&3)!=3))) - { - Effacer_curseur(); - Back_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)<<3)+(Pos_Y>>2); - Afficher_foreback(); - Afficher_curseur(); - } -} - - -//---------------------- Cacher ou r‚afficher le menu ------------------------ -void Pixel_dans_barre_d_outil_cachee(word X,word Y,byte Couleur) -{ - // C'est fait exprŠs que ce soit vide... - // C'est parce que y'a rien du tout … afficher vu que la barre d'outil est - // cach‚e... C'est simple non? -} - - -void Bouton_Cacher_menu(void) -{ - Effacer_curseur(); - if (Menu_visible) - { - Menu_visible=0; - Pixel_dans_menu=Pixel_dans_barre_d_outil_cachee; - Menu_Ordonnee=Hauteur_ecran; - - if (Loupe_Mode) - { - Calculer_donnees_loupe(); + +//-- MODELE DE BOUTON DE MENU ------------------------------------------------ +/* +void Bouton_***(void) +{ + short Bouton_clicke; + + Ouvrir_fenetre(310,190,"***"); + + Fenetre_Definir_bouton_normal(103,137,80,14,"OK",0,1,0x001C); // 1 + Fenetre_Definir_bouton_scroller(18,44,88,16,4,0); // 2 + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while (Bouton_clicke!=1); + + Fermer_fenetre(); + Desenclencher_bouton(BOUTON_***); + Afficher_curseur(); +} +*/ + + +void Message_Non_disponible(void) +{ + short Bouton_clicke; + + Ouvrir_fenetre(160,76,"Not available yet!"); + + Print_dans_fenetre(8,20,"This function will",CM_Noir,CM_Clair); + Print_dans_fenetre(12,28,"be implemented in",CM_Noir,CM_Clair); + Print_dans_fenetre(16,36,"a later version.",CM_Noir,CM_Clair); + Fenetre_Definir_bouton_normal(60,53,40,14,"OK",1,1,0x001C); // 1 + Afficher_curseur(); + + do + Bouton_clicke=Fenetre_Bouton_clicke(); + while ((Bouton_clicke<=0) && (Touche!=0x0001) && (Touche!=0x0018)); + + Fermer_fenetre(); + + // Puisque cette fonction peut ˆtre appel‚e par plusieurs boutons et qu'on + // ne sait pas lequel c'est, on les d‚senclenche tous. De toutes fa‡ons, ‡a + // ne sert … rien d'essayer d'optimiser ‡a puisque l'utilisateur ne devrait + // pas souvent l'appeler, et en plus y'en a pas beaucoup … d‚senclencher. ;) + Desenclencher_bouton(BOUTON_GRADRECT); + Desenclencher_bouton(BOUTON_TEXTE); + + Afficher_curseur(); +} + + +void Message_Memoire_insuffisante(void) +{ + short Bouton_clicke; + + Ouvrir_fenetre(216,76,"Not enough memory!"); + + Print_dans_fenetre(8,20,"Please consult the manual",CM_Noir,CM_Clair); + Print_dans_fenetre(24,28,"to know how to obtain",CM_Noir,CM_Clair); + Print_dans_fenetre(36,36,"more memory space.",CM_Noir,CM_Clair); + Fenetre_Definir_bouton_normal(60,53,40,14,"OK",1,1,0x001C); // 1 + Afficher_curseur(); + + do + Bouton_clicke=Fenetre_Bouton_clicke(); + while ((Bouton_clicke<=0) && (Touche!=0x0001) && (Touche!=0x0018)); + + Fermer_fenetre(); + Afficher_curseur(); +} + + +void Bouton_Message_initial(void) +{ + short Bouton_clicke; + char Chaine[21]; + int Pos_X,Offs_Y,X,Y; + + sprintf(Chaine,"GrafX 2.00 %s%s",ALPHA_BETA,POURCENTAGE_VERSION); + Ouvrir_fenetre(260,172,Chaine); + + Fenetre_Afficher_cadre_creux(10,20,239,62); + Block(Fenetre_Pos_X+(Menu_Facteur_X*11), + Fenetre_Pos_Y+(Menu_Facteur_Y*21), + Menu_Facteur_X*237,Menu_Facteur_Y*60,CM_Noir); + for (Y=23,Offs_Y=0; Y<79; Offs_Y+=231,Y++) + for (X=14,Pos_X=0; Pos_X<231; Pos_X++,X++) + Pixel_dans_fenetre(X,Y,Logo_GrafX2[Offs_Y+Pos_X]); + + Print_dans_fenetre(27, 88,"Copyright (c) 1996-1999 by",CM_Fonce,CM_Clair); + Print_dans_fenetre(79, 96,"Sunset Design",CM_Noir,CM_Clair); + Print_dans_fenetre(55,104,"All rights reserved",CM_Fonce,CM_Clair); + + Print_dans_fenetre( 7,120,"You should read the README!.1ST",CM_Fonce,CM_Clair); + Print_dans_fenetre( 7,128,"file before using this program",CM_Fonce,CM_Clair); + Print_dans_fenetre( 7,136,"for the first time.",CM_Fonce,CM_Clair); + + if ((*ALPHA_BETA)=='à') + { + Print_char_transparent_dans_fenetre(43,119,'M',CM_Noir); + Print_char_transparent_dans_fenetre(53,121,'U',CM_Noir); + Print_char_transparent_dans_fenetre(63,119,'S',CM_Noir); + Print_char_transparent_dans_fenetre(74,120,'T',CM_Noir); + } + + Fenetre_Definir_bouton_normal(90,151,80,14,"OK",0,1,0x001C); // 1 + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while ((Bouton_clicke!=1) && (Touche!=0x0001) && (Touche!=0x0018)); + + Fermer_fenetre(); + Afficher_curseur(); +} + + + +void Changer_la_forme_du_pinceau(byte Forme) +{ + Pinceau_Forme=Forme; + Afficher_pinceau_dans_menu(); + + switch (Operation_en_cours) + { + case OPERATION_FILL : + Pinceau_Forme_avant_fill=Forme; + Pinceau_Forme=FORME_PINCEAU_POINT; + break; + case OPERATION_PIPETTE : + Pinceau_Forme_avant_pipette=Forme; + Pinceau_Forme=FORME_PINCEAU_POINT; + break; + // Note: Il existe un Pinceau_Forme_avant_lasso, mais comme le lasso aura + // ‚t‚ automatiquement d‚sactiv‚ avant d'arriver ici, y'a pas de problŠme. + } +} + + +//-------------------------------- UNDO/REDO --------------------------------- +void Bouton_Undo(void) +{ + Effacer_curseur(); + Undo(); + + Set_palette(Principal_Palette); + Calculer_couleurs_menu_optimales(Principal_Palette); + + Afficher_ecran(); + Desenclencher_bouton(BOUTON_UNDO); + Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); + Afficher_menu(); + Afficher_curseur(); +} + +void Bouton_Redo(void) +{ + Effacer_curseur(); + Redo(); + + Set_palette(Principal_Palette); + Calculer_couleurs_menu_optimales(Principal_Palette); + + Afficher_ecran(); + Desenclencher_bouton(BOUTON_UNDO); + Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); + Afficher_menu(); + Afficher_curseur(); +} + + +//---------------------------- SCROLL PALETTE LEFT --------------------------- +void Bouton_Pal_left(void) +{ + Effacer_curseur(); + if (Couleur_debut_palette) + { + Couleur_debut_palette-=8; + Afficher_palette_du_menu(); + } + Desenclencher_bouton(BOUTON_PAL_LEFT); + Afficher_curseur(); +} + +void Bouton_Pal_left_fast(void) +{ + Effacer_curseur(); + if (Couleur_debut_palette) + { + Couleur_debut_palette=(Couleur_debut_palette>=64)? Couleur_debut_palette-64 : 0; + Afficher_palette_du_menu(); + } + Desenclencher_bouton(BOUTON_PAL_LEFT); + Afficher_curseur(); +} + + +//--------------------------- SCROLL PALETTE RIGHT --------------------------- +void Bouton_Pal_right(void) +{ + Effacer_curseur(); + if (Couleur_debut_palette<=184) + { + Couleur_debut_palette+=8; + Afficher_palette_du_menu(); + } + Desenclencher_bouton(BOUTON_PAL_RIGHT); + Afficher_curseur(); +} + +void Bouton_Pal_right_fast(void) +{ + Effacer_curseur(); + if (Couleur_debut_palette<=184) + { + Couleur_debut_palette=(Couleur_debut_palette<=120)? Couleur_debut_palette+64 : 192; + Afficher_palette_du_menu(); + } + Desenclencher_bouton(BOUTON_PAL_RIGHT); + Afficher_curseur(); +} + +//-------------------- Choix de la forecolor dans le menu -------------------- +void Bouton_Choix_forecolor(void) +{ + word Pos_X, Pos_Y; + + Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); + Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; + + if ((!Config.Couleurs_separees) + || ((Pos_X%Menu_Taille_couleur!=Menu_Taille_couleur-1) && ((Pos_Y&3)!=3))) + { + Effacer_curseur(); + Encadrer_couleur_menu(CM_Noir); + Fore_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)<<3)+(Pos_Y>>2); + Encadrer_couleur_menu(CM_Blanc); + Afficher_foreback(); + Afficher_curseur(); + } +} + +//-------------------- Choix de la backcolor dans le menu -------------------- +void Bouton_Choix_backcolor(void) +{ + word Pos_X, Pos_Y; + + Pos_X=(Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1); + Pos_Y=((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2; + + if ((!Config.Couleurs_separees) + || ((Pos_X%Menu_Taille_couleur!=Menu_Taille_couleur-1) && ((Pos_Y&3)!=3))) + { + Effacer_curseur(); + Back_color=Couleur_debut_palette+((Pos_X/Menu_Taille_couleur)<<3)+(Pos_Y>>2); + Afficher_foreback(); + Afficher_curseur(); + } +} + + +//---------------------- Cacher ou r‚afficher le menu ------------------------ +void Pixel_dans_barre_d_outil_cachee(word X,word Y,byte Couleur) +{ + // C'est fait exprŠs que ce soit vide... + // C'est parce que y'a rien du tout … afficher vu que la barre d'outil est + // cach‚e... C'est simple non? +} + + +void Bouton_Cacher_menu(void) +{ + Effacer_curseur(); + if (Menu_visible) + { + Menu_visible=0; + Pixel_dans_menu=Pixel_dans_barre_d_outil_cachee; + Menu_Ordonnee=Hauteur_ecran; + + if (Loupe_Mode) + { + Calculer_donnees_loupe(); if (Loupe_Decalage_Y+Loupe_Hauteur>Principal_Hauteur_image) - { - if (Loupe_Hauteur>Principal_Hauteur_image) - Loupe_Decalage_Y=0; - else + { + if (Loupe_Hauteur>Principal_Hauteur_image) + Loupe_Decalage_Y=0; + else Loupe_Decalage_Y=Principal_Hauteur_image-Loupe_Hauteur; - } - } - - // On repositionne le d‚calage de l'image pour qu'il n'y ait pas d'in- - // -coh‚rences lorsqu'on sortira du mode Loupe. + } + } + + // On repositionne le d‚calage de l'image pour qu'il n'y ait pas d'in- + // -coh‚rences lorsqu'on sortira du mode Loupe. if (Principal_Decalage_Y+Hauteur_ecran>Principal_Hauteur_image) - { - if (Hauteur_ecran>Principal_Hauteur_image) - Principal_Decalage_Y=0; - else + { + if (Hauteur_ecran>Principal_Hauteur_image) + Principal_Decalage_Y=0; + else Principal_Decalage_Y=Principal_Hauteur_image-Hauteur_ecran; - } - // On fait pareil pour le brouillon + } + // On fait pareil pour le brouillon if (Brouillon_Decalage_Y+Hauteur_ecran>Brouillon_Hauteur_image) - { - if (Hauteur_ecran>Brouillon_Hauteur_image) - Brouillon_Decalage_Y=0; - else + { + if (Hauteur_ecran>Brouillon_Hauteur_image) + Brouillon_Decalage_Y=0; + else Brouillon_Decalage_Y=Brouillon_Hauteur_image-Hauteur_ecran; - } - - Calculer_donnees_loupe(); - if (Loupe_Mode) - Recadrer_ecran_par_rapport_au_zoom(); - Calculer_limites(); - Calculer_coordonnees_pinceau(); - Afficher_ecran(); - } - else - { - Menu_visible=1; - Pixel_dans_menu=Pixel_dans_barre_d_outil; - Menu_Ordonnee=Hauteur_ecran-(HAUTEUR_MENU*Menu_Facteur_Y); - - Calculer_donnees_loupe(); - if (Loupe_Mode) - Recadrer_ecran_par_rapport_au_zoom(); - Calculer_limites(); - Calculer_coordonnees_pinceau(); - Afficher_menu(); - if (Loupe_Mode) - Afficher_ecran(); - } - Desenclencher_bouton(BOUTON_CACHER); - Afficher_curseur(); -} - - -//--------------------------- Quitter le programme --------------------------- -byte Bouton_Quitter_Routine_locale(void) -{ - short Bouton_clicke; - //byte Enregistrer; - char Nom_du_fichier[256]; - byte Ancienne_forme_curseur; - - if (!Principal_Image_modifiee) - return 1; - - // On commence par afficher la fenˆtre de QUIT - Ouvrir_fenetre(160,84,"Quit ?"); - Fenetre_Definir_bouton_normal(20,20,120,14,"Stay",0,1,0x0001); // 1 - Fenetre_Definir_bouton_normal(20,40,120,14,"Save & quit",1,1,0x001F); // 2 - Fenetre_Definir_bouton_normal(20,60,120,14,"Discard (Quit)",1,1,0x0020);// 3 - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while (Bouton_clicke<=0); - Attendre_fin_de_click(); - - Fermer_fenetre(); - Afficher_curseur(); - - switch(Bouton_clicke) - { - case 1 : return 0; // Rester - case 2 : // Sauver et enregistrer - Nom_fichier_complet(Nom_du_fichier,0); - if ( (!Fichier_existe(Nom_du_fichier)) || Demande_de_confirmation("Erase old file ?") ) - { - Effacer_curseur(); - Ancienne_forme_curseur=Forme_curseur; - Forme_curseur=FORME_CURSEUR_SABLIER; - Afficher_curseur(); - - Sauver_image(1); - - Effacer_curseur(); - Forme_curseur=Ancienne_forme_curseur; - Afficher_curseur(); - - if (!Erreur_fichier) - // L'ayant sauv‚e avec succŠs, - return 1; // On peut quitter - else - // Il y a eu une erreur lors de la sauvegarde, - return 0; // On ne peut donc pas quitter - } - else - // L'utilisateur ne veut pas ‚craser l'ancien fichier, - return 0; // On doit donc rester - case 3 : return 1; // Quitter - } - return 0; -} - - -void Bouton_Quit(void) -{ - //short Bouton_clicke; - + } + + Calculer_donnees_loupe(); + if (Loupe_Mode) + Recadrer_ecran_par_rapport_au_zoom(); + Calculer_limites(); + Calculer_coordonnees_pinceau(); + Afficher_ecran(); + } + else + { + Menu_visible=1; + Pixel_dans_menu=Pixel_dans_barre_d_outil; + Menu_Ordonnee=Hauteur_ecran-(HAUTEUR_MENU*Menu_Facteur_Y); + + Calculer_donnees_loupe(); + if (Loupe_Mode) + Recadrer_ecran_par_rapport_au_zoom(); + Calculer_limites(); + Calculer_coordonnees_pinceau(); + Afficher_menu(); + if (Loupe_Mode) + Afficher_ecran(); + } + Desenclencher_bouton(BOUTON_CACHER); + Afficher_curseur(); +} + + +//--------------------------- Quitter le programme --------------------------- +byte Bouton_Quitter_Routine_locale(void) +{ + short Bouton_clicke; + //byte Enregistrer; + char Nom_du_fichier[256]; + byte Ancienne_forme_curseur; + + if (!Principal_Image_modifiee) + return 1; + + // On commence par afficher la fenˆtre de QUIT + Ouvrir_fenetre(160,84,"Quit ?"); + Fenetre_Definir_bouton_normal(20,20,120,14,"Stay",0,1,0x0001); // 1 + Fenetre_Definir_bouton_normal(20,40,120,14,"Save & quit",1,1,0x001F); // 2 + Fenetre_Definir_bouton_normal(20,60,120,14,"Discard (Quit)",1,1,0x0020);// 3 + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while (Bouton_clicke<=0); + Attendre_fin_de_click(); + + Fermer_fenetre(); + Afficher_curseur(); + + switch(Bouton_clicke) + { + case 1 : return 0; // Rester + case 2 : // Sauver et enregistrer + Nom_fichier_complet(Nom_du_fichier,0); + if ( (!Fichier_existe(Nom_du_fichier)) || Demande_de_confirmation("Erase old file ?") ) + { + Effacer_curseur(); + Ancienne_forme_curseur=Forme_curseur; + Forme_curseur=FORME_CURSEUR_SABLIER; + Afficher_curseur(); + + Sauver_image(1); + + Effacer_curseur(); + Forme_curseur=Ancienne_forme_curseur; + Afficher_curseur(); + + if (!Erreur_fichier) + // L'ayant sauv‚e avec succŠs, + return 1; // On peut quitter + else + // Il y a eu une erreur lors de la sauvegarde, + return 0; // On ne peut donc pas quitter + } + else + // L'utilisateur ne veut pas ‚craser l'ancien fichier, + return 0; // On doit donc rester + case 3 : return 1; // Quitter + } + return 0; +} + + +void Bouton_Quit(void) +{ + //short Bouton_clicke; + if (Bouton_Quitter_Routine_locale()) - { - if (Brouillon_Image_modifiee) - { - Bouton_Page(); // On passe sur le brouillon - // Si l'utilisateur pr‚sente les derniers symptomes de l'abandon - if (Bouton_Quitter_Routine_locale()) - Sortir_du_programme=1; - } - else + { + if (Brouillon_Image_modifiee) + { + Bouton_Page(); // On passe sur le brouillon + // Si l'utilisateur pr‚sente les derniers symptomes de l'abandon + if (Bouton_Quitter_Routine_locale()) + Sortir_du_programme=1; + } + else Sortir_du_programme=1; - } - - if ( (Menu_visible) && (Mouse_Y+8>Menu_Ordonnee) ) - Effacer_curseur(); - - Desenclencher_bouton(BOUTON_QUIT); - - if ( (Menu_visible) && (Mouse_Y+8>Menu_Ordonnee) ) - Afficher_curseur(); -} - - -//---------------------------- Effacer l'‚cran ------------------------------- -void Bouton_Clear(void) -{ - Effacer_curseur(); - Backup(); - if (Stencil_Mode && Config.Clear_with_stencil) - Effacer_image_courante_Stencil(0,Stencil); - else - Effacer_image_courante(0); - Afficher_ecran(); - Desenclencher_bouton(BOUTON_CLEAR); - Afficher_curseur(); -} - -void Bouton_Clear_colore(void) -{ - Effacer_curseur(); - Backup(); - if (Stencil_Mode && Config.Clear_with_stencil) - Effacer_image_courante_Stencil(Back_color,Stencil); - else - Effacer_image_courante(Back_color); - Afficher_ecran(); - Desenclencher_bouton(BOUTON_CLEAR); - Afficher_curseur(); -} - - -//---------- Menu dans lequel on tagge des couleurs (genre Stencil) ---------- -void Menu_Tag_couleurs(char * En_tete, byte * Table, byte * Mode, byte Cancel) -{ - short Bouton_clicke; - byte Backup_table[256]; - word Indice; - word Ancien_Mouse_X; - word Ancien_Mouse_Y; - byte Ancien_Mouse_K; - byte Couleur_taggee; - byte Couleur; - byte Click; - - - Ouvrir_fenetre(176,150,En_tete); - - Fenetre_Definir_bouton_palette(6,38); // 1 - Fenetre_Definir_bouton_normal( 7, 19,78,14,"Clear" ,1,1,0x002E); // 2 - Fenetre_Definir_bouton_normal(91, 19,78,14,"Invert",1,1,0x0017); // 3 - if (Cancel) - { - Fenetre_Definir_bouton_normal(91,129,78,14,"OK" ,0,1,0x001C); // 4 - Fenetre_Definir_bouton_normal( 7,129,78,14,"Cancel",0,1,0x0001); // 5 - // On enregistre la table dans un backup au cas o— on ferait Cancel - memcpy(Backup_table,Table,256); - } - else - Fenetre_Definir_bouton_normal(49,129,78,14,"OK" ,0,1,0x001C); // 4 - - // On affiche l'‚tat actuel de la table - for (Indice=0; Indice<=255; Indice++) - Stencil_Tagger_couleur(Indice, (Table[Indice])?CM_Noir:CM_Clair); - - Afficher_curseur(); - - do - { - Ancien_Mouse_X=Mouse_X; - Ancien_Mouse_Y=Mouse_Y; - Ancien_Mouse_K=Mouse_K; - - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch (Bouton_clicke) - { - case 0 : - break; - case -1 : - case 1 : // Palette - if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) ) - { - Effacer_curseur(); - Couleur_taggee=Lit_pixel(Mouse_X,Mouse_Y); - Table[Couleur_taggee]=(Mouse_K==A_GAUCHE); - Stencil_Tagger_couleur(Couleur_taggee,(Mouse_K==A_GAUCHE)?CM_Noir:CM_Clair); - Afficher_curseur(); - } - break; - case 2 : // Clear - memset(Table,0,256); - Effacer_curseur(); - for (Indice=0; Indice<=255; Indice++) - Stencil_Tagger_couleur(Indice,CM_Clair); - Afficher_curseur(); - break; - case 3 : // Invert - Effacer_curseur(); - for (Indice=0; Indice<=255; Indice++) - Stencil_Tagger_couleur(Indice,(Table[Indice]^=1)?CM_Noir:CM_Clair); - Afficher_curseur(); - } - - if (!Mouse_K) - switch (Touche) - { - case 0x0029 : // R‚cup‚ration d'une couleur derriŠre le menu - case 0x0033 : - Recuperer_couleur_derriere_fenetre(&Couleur,&Click); - if (Click) - { - Effacer_curseur(); - Couleur_taggee=Couleur; - Table[Couleur_taggee]=(Click==A_GAUCHE); - Stencil_Tagger_couleur(Couleur_taggee,(Click==A_GAUCHE)?CM_Noir:CM_Clair); - Afficher_curseur(); - } - } - } - while (Bouton_clicke<4); - - Fermer_fenetre(); - - if (Bouton_clicke==5) // Cancel - memcpy(Table,Backup_table,256); - else // OK - *Mode=1; - - Afficher_curseur(); -} - - -//--------------------------------- Stencil ---------------------------------- -void Bouton_Stencil_Mode(void) -{ - Stencil_Mode=!Stencil_Mode; -} - - -void Stencil_Tagger_couleur(byte Couleur, byte Couleur_de_taggage) -{ - Block(Fenetre_Pos_X+(Menu_Facteur_X*(Fenetre_Liste_boutons_palette->Pos_X+4+(Couleur >> 4)*10)), - Fenetre_Pos_Y+(Menu_Facteur_Y*(Fenetre_Liste_boutons_palette->Pos_Y+3+(Couleur & 15)* 5)), - Menu_Facteur_X<<1,Menu_Facteur_Y*5,Couleur_de_taggage); -} - - -void Bouton_Menu_Stencil(void) -{ - Menu_Tag_couleurs("Stencil",Stencil,&Stencil_Mode,1); -} - - -//--------------------------------- Masque ----------------------------------- -void Bouton_Mask_Mode(void) -{ - Mask_Mode=!Mask_Mode; -} - - -void Bouton_Mask_Menu(void) -{ - Menu_Tag_couleurs("Mask",Mask,&Mask_Mode,1); -} - - -//------------------------------- ParamŠtres --------------------------------- - -void Settings_Afficher_config(struct S_Config * Conf) -#define YES "YES" -#define NO " NO" -{ - struct Fenetre_Bouton_scroller * Jauge=Fenetre_Liste_boutons_scroller; - char Chaine[4]; - - Effacer_curseur(); - - // Jauge = Jauge de sensibilit‚ Y - Jauge->Position=Conf->Indice_Sensibilite_souris_Y-1; - Fenetre_Dessiner_jauge(Jauge); - - Jauge=Jauge->Next; - // Jauge = Jauge de sensibilit‚ X - Jauge->Position=Conf->Indice_Sensibilite_souris_X-1; - Fenetre_Dessiner_jauge(Jauge); - - Print_dans_fenetre(273, 31,(Conf->Lire_les_fichiers_caches)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre(273, 46,(Conf->Lire_les_repertoires_caches)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre(273, 61,(Conf->Lire_les_repertoires_systemes)?YES:NO,CM_Noir,CM_Clair); - - Print_dans_fenetre(223, 84,(Conf->Safety_colors)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre(223, 99,(Conf->Adjust_brush_pick)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre(223,114,(Conf->Couleurs_separees)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre(223,129,(Conf->Auto_set_res)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre(183,144,(Conf->Coords_rel)?"Relative":"Absolute",CM_Noir,CM_Clair); - - Print_dans_fenetre( 91, 84,(Conf->Afficher_limites_image)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre( 91, 99,(Conf->Clear_palette)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre( 91,114,(Conf->Maximize_preview)?YES:NO,CM_Noir,CM_Clair); - Print_dans_fenetre( 91,129,(Conf->Backup)?YES:NO,CM_Noir,CM_Clair); - switch (Conf->Curseur) - { - case 0 : Print_dans_fenetre(67,144," Solid",CM_Noir,CM_Clair); break; - case 1 : Print_dans_fenetre(67,144,"Transp",CM_Noir,CM_Clair); break; - default: Print_dans_fenetre(67,144," Thin",CM_Noir,CM_Clair); - } - - if (Conf->Fonte) - { // Fun - Print_dans_fenetre( 8,31," ",CM_Noir,CM_Clair); - Print_dans_fenetre( 78,31," ",CM_Noir,CM_Clair); - Print_dans_fenetre( 82,31,"\020",CM_Noir,CM_Clair); - Print_dans_fenetre(152,31,"\021",CM_Noir,CM_Clair); - } - else - { // Classic - Print_dans_fenetre( 82,31," ",CM_Noir,CM_Clair); - Print_dans_fenetre(152,31," ",CM_Noir,CM_Clair); - Print_dans_fenetre( 8,31,"\020",CM_Noir,CM_Clair); - Print_dans_fenetre( 78,31,"\021",CM_Noir,CM_Clair); - } - - Print_dans_fenetre(155,166,(Conf->Auto_save)?YES:NO,CM_Noir,CM_Clair); - - Num2str(Conf->Nb_pages_Undo,Chaine,2); - Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); - - Afficher_curseur(); -} - -void Settings_Sauver_config(struct S_Config * Conf) -{ - if (Sauver_CFG()) - Erreur(0); - else - if (Sauver_INI(Conf)) - Erreur(0); -} - -void Settings_Charger_config(struct S_Config * Conf) -{ - if (Charger_CFG(0)) - Erreur(0); - else - if (Charger_INI(Conf)) - Erreur(0); -} - -void Bouton_Settings(void) -{ - int Sensibilite_X; - int Sensibilite_Y; - short Bouton_clicke; - struct S_Config Config_choisie; - char Chaine[3]; - byte On_a_recharge_la_config=0; - - Config_choisie=Config; - - Ouvrir_fenetre(307,182,"Settings"); - - // On commence par dessiner tous les cƒdres - Fenetre_Afficher_cadre( 5, 16,157,30); - Fenetre_Afficher_cadre( 5, 47,157,17); - Fenetre_Afficher_cadre(163, 16,139,60); - Fenetre_Afficher_cadre(253, 77, 49,82); - Fenetre_Afficher_cadre( 5, 77,247,82); // |_ Misc. - Fenetre_Afficher_cadre( 5, 65,157,14); // | - // On d‚coupe le cƒdre bizarre des "Miscellaneous" - Pixel_dans_fenetre(6,77,CM_Blanc); - Pixel_dans_fenetre(5,78,CM_Fonce); - Block(Fenetre_Pos_X+(7*Menu_Facteur_X),Fenetre_Pos_Y+(77*Menu_Facteur_Y), - Menu_Facteur_X*154,Menu_Facteur_Y<<1,CM_Clair); - Pixel_dans_fenetre(161,77,CM_Clair); - Pixel_dans_fenetre(160,77,CM_Fonce); - - // On affiche maintenant tout le blabla - Print_dans_fenetre( 69, 19,"Font" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(169, 19,"Show in filelist",CM_Fonce,CM_Clair); - Print_dans_fenetre( 9, 52,"Nb of UNDO pages",CM_Fonce,CM_Clair); - Print_dans_fenetre( 32, 70,"Miscellaneous" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(258, 80,"Mouse" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(258, 88,"Sens." ,CM_Fonce,CM_Clair); - Print_dans_fenetre(256,123,"X" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(292,123,"Y" ,CM_Fonce,CM_Clair); - - // Boutons de fontes - Fenetre_Definir_bouton_normal(17,28,59,14,"Classic",0,1,0xFFFF); // 1 - Fenetre_Definir_bouton_normal(91,28,59,14,"Fun" ,0,1,0xFFFF); // 2 - - // Bouton Show/Hide dans le fileselect - Fenetre_Definir_bouton_normal(167, 28,131,14,"Hidden files: ",0,1,0xFFFF); // 3 - Fenetre_Definir_bouton_normal(167, 43,131,14,"Hidden dir. : ",0,1,0xFFFF); // 4 - Fenetre_Definir_bouton_normal(167, 58,131,14,"System dir. : ",0,1,0xFFFF); // 5 - - // Bouton Show/Hide Picture limits - Fenetre_Definir_bouton_normal( 9, 81,107,14,"Limits : ",0,1,0xFFFF); // 6 - // Bouton Show/Hide Picture limits - Fenetre_Definir_bouton_normal( 9, 96,107,14,"Clear pal: ",0,1,0xFFFF); // 7 - // Bouton Show/Hide Picture limits - Fenetre_Definir_bouton_normal( 9,111,107,14,"Max prev.: ",0,1,0xFFFF); // 8 - // Bouton Effectuer des backups … chaque sauvegarde - Fenetre_Definir_bouton_normal( 9,126,107,14,"Backup : ",0,1,0xFFFF); // 9 - // Bouton Choix du curseur - Fenetre_Definir_bouton_normal( 9,141,107,14,"Cursor: ",0,1,0xFFFF); // 10 - - // Bouton Safety colors - Fenetre_Definir_bouton_normal(117, 81,131,14,"Safe. colors: ",0,1,0xFFFF); // 11 - // Bouton Adjust Brush Pick - Fenetre_Definir_bouton_normal(117, 96,131,14,"AdjBrushPick: ",0,1,0xFFFF); // 12 - // Bouton Separate colors - Fenetre_Definir_bouton_normal(117,111,131,14,"Separate col: ",0,1,0xFFFF); // 13 - // Bouton Passer dans la r‚solution appropri‚e aprŠs un chargement - Fenetre_Definir_bouton_normal(117,126,131,14,"Auto-set res: ",0,1,0xFFFF); // 14 - // Bouton Adapter la palette aprŠs un chargement (<=> Shift+BkSpc) - Fenetre_Definir_bouton_normal(117,141,131,14,"Coords: ",0,1,0xFFFF); // 15 - - // Bouton Reload - Fenetre_Definir_bouton_normal( 6,163, 51,14,"Reload" ,0,1,0xFFFF); // 16 - // Bouton Auto-save - Fenetre_Definir_bouton_normal( 73,163,107,14,"Auto-save: ",0,1,0xFFFF); // 17 - // Bouton Save - Fenetre_Definir_bouton_normal(183,163, 51,14,"Save" ,0,1,0xFFFF); // 18 - // Bouton Close - Fenetre_Definir_bouton_normal(250,163, 51,14,"Close" ,0,1,0x0001); // 19 - - // Jauges de sensibilit‚ de la souris (X puis Y) - Fenetre_Definir_bouton_scroller(265,99,56,255,1,0); // 20 - Fenetre_Definir_bouton_scroller(279,99,56,255,1,0); // 21 - - // Zone de saisie du nb de pages de Undo - Fenetre_Definir_bouton_saisie(140,50,2); // 22 - - Afficher_curseur(); - - Settings_Afficher_config(&Config_choisie); - - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch(Bouton_clicke) - { - case 1 : // Classic - Config_choisie.Fonte=0; - break; - case 2 : // Fun - Config_choisie.Fonte=1; - break; - case 3 : // Hidden files - Config_choisie.Lire_les_fichiers_caches=(Config_choisie.Lire_les_fichiers_caches)?0:-1; - break; - case 4 : // Hidden dir. - Config_choisie.Lire_les_repertoires_caches=(Config_choisie.Lire_les_repertoires_caches)?0:-1; - break; - case 5 : // System dir. - Config_choisie.Lire_les_repertoires_systemes=(Config_choisie.Lire_les_repertoires_systemes)?0:-1; - break; - case 6 : // Draw limits - Config_choisie.Afficher_limites_image=!Config_choisie.Afficher_limites_image; - break; - case 7 : // Clear palette - Config_choisie.Clear_palette=!Config_choisie.Clear_palette; - break; - case 8 : // Maximize preview - Config_choisie.Maximize_preview=!Config_choisie.Maximize_preview; - break; - case 9 : // Backup - Config_choisie.Backup=!Config_choisie.Backup; - break; - case 10 : // Curseur - Config_choisie.Curseur=(Config_choisie.Curseur+1)%3; - break; - case 11 : // Safety colors - Config_choisie.Safety_colors=!Config_choisie.Safety_colors; - break; - case 12 : // Adjust brush pick - Config_choisie.Adjust_brush_pick=!Config_choisie.Adjust_brush_pick; - break; - case 13 : // Separate colors - Config_choisie.Couleurs_separees=!Config_choisie.Couleurs_separees; - break; - case 14 : // Auto-set resolution - Config_choisie.Auto_set_res=!Config_choisie.Auto_set_res; - break; - case 15 : // Coordonn‚es - Config_choisie.Coords_rel=!Config_choisie.Coords_rel; - break; - case 16 : // Reload - Settings_Charger_config(&Config_choisie); - On_a_recharge_la_config=1; - break; - case 17 : // Auto-save - Config_choisie.Auto_save=!Config_choisie.Auto_save; - break; - case 18 : // Save - Settings_Sauver_config(&Config_choisie); - break; - case 20 : // X Sensib. - Config_choisie.Indice_Sensibilite_souris_X=Fenetre_Attribut2+1; - break; - case 21 : // Y Sensib. - Config_choisie.Indice_Sensibilite_souris_Y=Fenetre_Attribut2+1; - break; - case 22 : // Nb pages Undo - Effacer_curseur(); - Num2str(Config_choisie.Nb_pages_Undo,Chaine,2); - Readline(142,52,Chaine,2,1); - Config_choisie.Nb_pages_Undo=atoi(Chaine); - // On corrige la valeur - if (Config_choisie.Nb_pages_Undo>NB_PAGES_UNDO_MAX) - { - Config_choisie.Nb_pages_Undo=NB_PAGES_UNDO_MAX; - Num2str(Config_choisie.Nb_pages_Undo,Chaine,2); - Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); - } - else if (!Config_choisie.Nb_pages_Undo) - { - Config_choisie.Nb_pages_Undo=1; - Num2str(Config_choisie.Nb_pages_Undo,Chaine,2); - Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); - } - Afficher_curseur(); - } - - if ((Bouton_clicke>=3) && (Bouton_clicke<=5)) - { - Principal_File_list_Position=0; - Principal_File_list_Decalage=0; - Brouillon_File_list_Position=0; - Brouillon_File_list_Decalage=0; - } - - if ((Bouton_clicke>=1) && (Bouton_clicke<=17)) - Settings_Afficher_config(&Config_choisie); - } - while ( (Bouton_clicke!=19) && (Touche!=0x001C) ); - - Config=Config_choisie; - - // Prise en compte de la nouvelle config - // Gestion de la sensibilit‚ - Sensibilite_X=(Config.Indice_Sensibilite_souris_X/Menu_Facteur_X); - Sensibilite_Y=(Config.Indice_Sensibilite_souris_Y/Menu_Facteur_Y); - Sensibilite_X>>=Mouse_Facteur_de_correction_X; - Sensibilite_Y>>=Mouse_Facteur_de_correction_Y; - - Sensibilite_souris(Sensibilite_X?Sensibilite_X:1, - Sensibilite_Y?Sensibilite_Y:1); - // Gestion des fontes - if (Config.Fonte) - Fonte=Fonte_fun; - else - Fonte=Fonte_systeme; - - if (On_a_recharge_la_config) - Calculer_couleurs_menu_optimales(Principal_Palette); - - Fermer_fenetre(); - Desenclencher_bouton(BOUTON_PARAMETRES); - // Raffichage du menu pour que les inscriptions qui y figurent soient retrac‚es avec la nouvelle fonte - Afficher_menu(); - Afficher_curseur(); - - // On v‚rifie qu'on peut bien allouer le nombre de pages Undo. - Nouveau_nombre_de_backups(Config.Nb_pages_Undo); -} - - -//---------------------------- Changement de page ---------------------------- -void Bouton_Page(void) -{ - byte Octet_temporaire; - word Mot_temporaire; - short Short_temporaire; - float Float_temporaire; - char Zone_temporaire[256]; - - Effacer_curseur(); - - // On d‚grossit le travail avec les infos des listes de pages - Interchanger_image_principale_et_brouillon(); - - // On fait le reste du travail "… la main": - Short_temporaire=Brouillon_Decalage_X; - Brouillon_Decalage_X=Principal_Decalage_X; - Principal_Decalage_X=Short_temporaire; - - Short_temporaire=Brouillon_Decalage_Y; - Brouillon_Decalage_Y=Principal_Decalage_Y; - Principal_Decalage_Y=Short_temporaire; - - Short_temporaire=Ancien_Brouillon_Decalage_X; - Ancien_Brouillon_Decalage_X=Ancien_Principal_Decalage_X; - Ancien_Principal_Decalage_X=Short_temporaire; - - Short_temporaire=Ancien_Brouillon_Decalage_Y; - Ancien_Brouillon_Decalage_Y=Ancien_Principal_Decalage_Y; - Ancien_Principal_Decalage_Y=Short_temporaire; - - Short_temporaire=Brouillon_Split; - Brouillon_Split=Principal_Split; - Principal_Split=Short_temporaire; - - Short_temporaire=Brouillon_X_Zoom; - Brouillon_X_Zoom=Principal_X_Zoom; - Principal_X_Zoom=Short_temporaire; - - Float_temporaire=Brouillon_Proportion_split; - Brouillon_Proportion_split=Principal_Proportion_split; - Principal_Proportion_split=Float_temporaire; - - Octet_temporaire=Brouillon_Loupe_Mode; - Brouillon_Loupe_Mode=Loupe_Mode; - Loupe_Mode=Octet_temporaire; - - Pixel_Preview=(Loupe_Mode)?Pixel_Preview_Loupe:Pixel_Preview_Normal; - - Mot_temporaire=Brouillon_Loupe_Facteur; - Brouillon_Loupe_Facteur=Loupe_Facteur; - Loupe_Facteur=Mot_temporaire; - - Mot_temporaire=Brouillon_Loupe_Hauteur; - Brouillon_Loupe_Hauteur=Loupe_Hauteur; - Loupe_Hauteur=Mot_temporaire; - - Mot_temporaire=Brouillon_Loupe_Largeur; - Brouillon_Loupe_Largeur=Loupe_Largeur; - Loupe_Largeur=Mot_temporaire; - - Short_temporaire=Brouillon_Loupe_Decalage_X; - Brouillon_Loupe_Decalage_X=Loupe_Decalage_X; - Loupe_Decalage_X=Short_temporaire; - - Short_temporaire=Brouillon_Loupe_Decalage_Y; - Brouillon_Loupe_Decalage_Y=Loupe_Decalage_Y; - Loupe_Decalage_Y=Short_temporaire; - - // Swap du bool‚en "Image modifi‚e" - Octet_temporaire =Brouillon_Image_modifiee; - Brouillon_Image_modifiee=Principal_Image_modifiee; - Principal_Image_modifiee=Octet_temporaire; - - // Swap des infos sur les fileselects - strcpy(Zone_temporaire ,Brouillon_Repertoire_courant); - strcpy(Brouillon_Repertoire_courant,Principal_Repertoire_courant); - strcpy(Principal_Repertoire_courant,Zone_temporaire ); - - Octet_temporaire=Brouillon_Format; - Brouillon_Format=Principal_Format; - Principal_Format=Octet_temporaire; - - Mot_temporaire =Brouillon_File_list_Position; - Brouillon_File_list_Position=Principal_File_list_Position; - Principal_File_list_Position=Mot_temporaire; - - Mot_temporaire =Brouillon_File_list_Decalage; - Brouillon_File_list_Decalage=Principal_File_list_Decalage; - Principal_File_list_Decalage=Mot_temporaire; - - // A la fin, on affiche l'‚cran - for (Octet_temporaire=0; FACTEUR_ZOOM[Octet_temporaire]!=Loupe_Facteur; Octet_temporaire++); - Changer_facteur_loupe(Octet_temporaire); - - Set_palette(Principal_Palette); - Calculer_couleurs_menu_optimales(Principal_Palette); - Afficher_ecran(); - Desenclencher_bouton(BOUTON_PAGE); - Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); - Afficher_menu(); - - Afficher_curseur(); -} - - -// -- Copie de page --------------------------------------------------------- - -void Copier_image_seule(void) -{ - if (Backuper_et_redimensionner_brouillon(Principal_Largeur_image,Principal_Hauteur_image)) - { - // copie de l'image - memcpy(Brouillon_Ecran,Principal_Ecran,Principal_Largeur_image*Principal_Hauteur_image); - - // Copie des dimensions de l'image - /* - C'est inutile, le "Backuper et redimensionner brouillon" a d‚j… modifi‚ - ces valeurs pour qu'elles soient correctes. - */ - Brouillon_Largeur_image=Principal_Largeur_image; - Brouillon_Hauteur_image=Principal_Hauteur_image; - - // Copie des d‚calages de la fenˆtre principale (non zoom‚e) de l'image - Brouillon_Decalage_X=Principal_Decalage_X; - Brouillon_Decalage_Y=Principal_Decalage_Y; - - // Copie du bool‚en "Mode loupe" de l'image - Brouillon_Loupe_Mode=Loupe_Mode; - - // Copie du facteur de zoom du brouillon - Brouillon_Loupe_Facteur=Loupe_Facteur; - - // Copie des dimensions de la fenˆtre de zoom - Brouillon_Loupe_Largeur=Loupe_Largeur; - Brouillon_Loupe_Hauteur=Loupe_Hauteur; - - // Copie des d‚calages de la fenˆtre de zoom - Brouillon_Loupe_Decalage_X=Loupe_Decalage_X; - Brouillon_Loupe_Decalage_Y=Loupe_Decalage_Y; - - // Copie des donn‚es du split du zoom - Brouillon_Split=Principal_Split; - Brouillon_X_Zoom=Principal_X_Zoom; - Brouillon_Proportion_split=Principal_Proportion_split; - } - else - Message_Memoire_insuffisante(); -} - - -void Copier_certaines_couleurs(void) -{ - short Indice; - - Menu_Tag_couleurs("Tag colors to copy",Masque_copie_couleurs,NULL,0); - - if ( (!Brouillon_Image_modifiee) - || (Demande_de_confirmation("Spare page was modified. Proceed?")) ) - for (Indice=0; Indice<256; Indice++) - { - if (Masque_copie_couleurs[Indice]) - memcpy(Brouillon_Palette+Indice,Principal_Palette+Indice, - sizeof(struct Composantes)); - } -} - - -void Bouton_Copy_page(void) -{ - short Bouton_clicke; - - - Ouvrir_fenetre(168,137,"Copy to spare page"); - - Fenetre_Definir_bouton_normal(10, 20,148,14,"Pixels + palette" , 0,1,0x001C); // 1 - Fenetre_Definir_bouton_normal(10, 37,148,14,"Pixels only" , 3,1,0x002D); // 2 - Fenetre_Definir_bouton_normal(10, 54,148,14,"Palette only" , 1,1,0x0019); // 3 - Fenetre_Definir_bouton_normal(10, 71,148,14,"Some colors only" , 6,1,0x002E); // 4 - Fenetre_Definir_bouton_normal(10, 88,148,14,"Palette and remap",13,1,0x0013); // 5 - Fenetre_Definir_bouton_normal(44,114, 80,14,"Cancel" , 0,1,0x0001); // 6 - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while (Bouton_clicke<=0); - - Fermer_fenetre(); - Afficher_curseur(); - - if (Bouton_clicke!=6) - { - if (Bouton_clicke==4) - Copier_certaines_couleurs(); - else - { - if ( (!Brouillon_Image_modifiee) - || (Demande_de_confirmation("Spare page was modified. Proceed?")) ) - { - if (Bouton_clicke<=2) - Copier_image_seule(); - - if (Bouton_clicke==5) - Remap_picture(); - - if (Bouton_clicke!=2) // copie de la palette - memcpy(Brouillon_Palette,Principal_Palette,sizeof(T_Palette)); - - Brouillon_Image_modifiee=1; - } - } - } - - Effacer_curseur(); - Desenclencher_bouton(BOUTON_PAGE); - Afficher_curseur(); -} - - -// -- Suppression d'une page ------------------------------------------------- -void Bouton_Kill(void) -{ - if ( (Principal_Backups->Nb_pages_allouees==1) - || (!Demande_de_confirmation("Delete the current page?")) ) - { - if (Principal_Backups->Nb_pages_allouees==1) - Warning_message("You can't delete the last page."); - Effacer_curseur(); - Desenclencher_bouton(BOUTON_KILL); - Afficher_curseur(); - } - else - { - Effacer_curseur(); - Detruire_la_page_courante(); - - Set_palette(Principal_Palette); - Calculer_couleurs_menu_optimales(Principal_Palette); - - Afficher_ecran(); - Desenclencher_bouton(BOUTON_KILL); - Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); - Afficher_menu(); - Afficher_curseur(); - } -} - - -//------------------------- Dimensions Image/Ecran --------------------------- - -void Cocher_bouton_mode(short Pos_X, short Pos_Y, byte Etat) -{ - byte Couleur; - - if (Etat>=128) - Etat-=128; - switch (Etat) - { - case 0 : Couleur=CM_Blanc; break; - case 1 : Couleur=CM_Clair; break; - case 2 : Couleur=CM_Fonce; break; - default: Couleur=CM_Noir; - } - Block(Fenetre_Pos_X+Menu_Facteur_X*Pos_X,Fenetre_Pos_Y+Menu_Facteur_Y*Pos_Y, - Menu_Facteur_X*9,Menu_Facteur_Y*3,Couleur); -} - - -void Afficher_liste_modes(short Debut_liste, short Position_curseur) -{ - short Indice,Mode_courant; - short Pos_Y; - byte Couleur_texte,Couleur_fond; - char Chaine[29]; - - for (Mode_courant=Debut_liste,Indice=0; Indice<12; Indice++,Mode_courant++) - { - Pos_Y=70+(Indice<<3); - Cocher_bouton_mode(19,Pos_Y+2,Mode_video[Mode_courant].Etat); - - if (Position_curseur!=Indice) - { - Couleur_fond =CM_Noir; - if (Mode_video[Mode_courant].Etat<128) - Couleur_texte=CM_Clair; - else - Couleur_texte=CM_Fonce; - } - else - { - Couleur_fond =CM_Fonce; - if (Mode_video[Mode_courant].Etat<128) - Couleur_texte=CM_Blanc; - else - Couleur_texte=CM_Clair; - } - Num2str(Mode_video[Mode_courant].Largeur,Chaine,4); - Num2str(Mode_video[Mode_courant].Hauteur,Chaine+4,4); - switch (Mode_video[Mode_courant].Mode) - { - case MODE_SDL : - memcpy(Chaine+8," SDL ",10); - break; - - } - if (Mode_video[Mode_courant].Refresh>0) - { - Num2str(Mode_video[Mode_courant].Refresh,Chaine+18,2); - Chaine[20]=' '; - } - else - { - if (Mode_video[Mode_courant].Refresh==-1) - memcpy(Chaine+18," ",3); - else - { - Num2str(-Mode_video[Mode_courant].Refresh,Chaine+18,2); - Chaine[20]='i'; - } - } - memcpy(Chaine+21," ",2); - memcpy(Chaine+23,Mode_video[Mode_courant].Ratio,4); - Chaine[27]=' '; - Chaine[28]=0; - - Print_dans_fenetre(39,Pos_Y,Chaine,Couleur_texte,Couleur_fond); - } -} - - -void Scroller_la_liste_des_modes(short Debut_liste, short Position_curseur, int * Mode_choisi) -{ - Effacer_curseur(); - *Mode_choisi=Debut_liste+Position_curseur; - if (Fenetre_Liste_boutons_scroller->Position!=Debut_liste) - { - Fenetre_Liste_boutons_scroller->Position=Debut_liste; - Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); - } - Afficher_liste_modes(Debut_liste,Position_curseur); - Afficher_curseur(); -} - - -void Bouton_Resol(void) -{ - short Bouton_clicke; - int Mode_choisi; - word Largeur_choisie; - word Hauteur_choisie; - short Debut_liste; - short Position_curseur; - short Temp; - byte Temp2; - char Chaine[5]; - struct Fenetre_Bouton_special * Bouton_saisie_Width, * Bouton_saisie_Height; - - Ouvrir_fenetre(299,190,"Picture & screen sizes"); - - Fenetre_Afficher_cadre ( 8,17,195, 33); - Fenetre_Afficher_cadre ( 8,56,283,126); - Fenetre_Afficher_cadre_creux(37,68,228,100); - Block(Fenetre_Pos_X+Menu_Facteur_X*38,Fenetre_Pos_Y+Menu_Facteur_Y*69, - Menu_Facteur_X*226,Menu_Facteur_Y*98,CM_Noir); - - Print_dans_fenetre( 12, 21,"Picture size:" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 12, 37,"Width:" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(108, 37,"Height:" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 16, 60,"OK" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 55, 60,"X Y" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(131, 60,"Mode" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(183, 60,"Hz" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(219, 60,"Ratio" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 30,170,"\03" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 62,170,"OK" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(102,170,"Imperfect" ,CM_Fonce,CM_Clair); - Print_dans_fenetre(196,170,"Unsupported" ,CM_Fonce,CM_Clair); - - Fenetre_Definir_bouton_normal(223, 18,67,14,"OK" ,0,1,0x001C); // 1 - Fenetre_Definir_bouton_normal(223, 35,67,14,"Cancel" ,0,1,0x0001); // 2 - - Fenetre_Definir_bouton_saisie( 60, 35,4); // 3 - Bouton_saisie_Width=Fenetre_Liste_boutons_special; - Fenetre_Definir_bouton_saisie(164, 35,4); // 4 - Bouton_saisie_Height=Fenetre_Liste_boutons_special; - - Fenetre_Definir_bouton_special(38,70,225,96); // 5 - - Mode_choisi=Resolution_actuelle; - - if (Mode_choisi>=6) - { - if (Mode_choisi>3; - if ((Mouse_K==2) || (Temp!=Position_curseur)) - { - Effacer_curseur(); - if (Temp!=Position_curseur) - { - Position_curseur=Temp; - Afficher_liste_modes(Debut_liste,Position_curseur); - } - Mode_choisi=Debut_liste+Position_curseur; - // Si l'utilisateur s'est servi du bouton droit de la souris: - if (Mouse_K==2) - { - // On affecte ‚galement les dimensions de l'image: - Largeur_choisie=Mode_video[Mode_choisi].Largeur; - Num2str(Largeur_choisie,Chaine,4); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Width,Chaine); - - Hauteur_choisie=Mode_video[Mode_choisi].Hauteur; - Num2str(Hauteur_choisie,Chaine,4); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Height,Chaine); - } - Afficher_curseur(); - } - Attendre_fin_de_click(); - break; - - case 6: // Scroller - Debut_liste=Fenetre_Attribut2; - Mode_choisi=Debut_liste+Position_curseur; - Afficher_liste_modes(Debut_liste,Position_curseur); - break; - - default: // Boutons de tag des ‚tats des modes - Temp=Debut_liste+Bouton_clicke-7; - if (Temp) // On n'a pas le droit de cocher le mode 0 (320x200) - { - Temp2=(Mode_video[Temp].Etat & 0x80)?128:0; - - if (Fenetre_Attribut1==A_GAUCHE) - Mode_video[Temp].Etat=Temp2+(((Mode_video[Temp].Etat&0x7F)+1)&3); - else - Mode_video[Temp].Etat=Temp2+(((Mode_video[Temp].Etat&0x7F)+3)&3); - - Effacer_curseur(); - Cocher_bouton_mode(19,16+(Bouton_clicke<<3),Mode_video[Temp].Etat); - Afficher_curseur(); - } - } - - // Gestion des touches de d‚placement dans la liste - switch (Touche) - { - case 0x0048 : // Haut - if (Position_curseur>0) - Position_curseur--; - else - if (Debut_liste>0) - Debut_liste--; - Scroller_la_liste_des_modes(Debut_liste,Position_curseur,&Mode_choisi); - break; - case 0x0050 : // Bas - if (Position_curseur<11) - Position_curseur++; - else - if (Debut_liste0) - Position_curseur=0; - else - { - if (Debut_liste>11) - Debut_liste-=11; - else - Debut_liste=0; - } - Scroller_la_liste_des_modes(Debut_liste,Position_curseur,&Mode_choisi); - break; - case 0x0051 : // PageDown - if (Position_curseur<11) - Position_curseur=11; - else - { - if (Debut_listeOPERATION_DESSIN_POINT) - Mode_de_dessin_en_cours=OPERATION_DESSIN_CONTINU; - - Effacer_curseur(); - Afficher_sprite_dans_menu(BOUTON_DESSIN,Mode_de_dessin_en_cours); - Demarrer_pile_operation(Mode_de_dessin_en_cours); - Afficher_curseur(); -} - - -// -- Gestion des boutons de rectangle vide et plein ------------------------ - -void Bouton_Rectangle_vide(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_RECTANGLE_VIDE); - Afficher_curseur(); -} - - -void Bouton_Rectangle_plein(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_RECTANGLE_PLEIN); - Afficher_curseur(); -} - - -// -- Gestion des boutons de cercle (ellipse) vide et plein(e) -------------- - -void Bouton_Cercle_vide(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_CERCLE_VIDE); - Afficher_curseur(); -} - - -void Bouton_Ellipse_vide(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_ELLIPSE_VIDE); - Afficher_curseur(); -} - - -void Bouton_Cercle_plein(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_CERCLE_PLEIN); - Afficher_curseur(); -} - - -void Bouton_Ellipse_pleine(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_ELLIPSE_PLEINE); - Afficher_curseur(); -} - - -// -- Gestion du menu des d‚grad‚s ------------------------------------------ -void Degrade_Dessiner_bouton_de_technique(short Pos_X,short Pos_Y,int Technique) -{ - short Ligne; - - // On commence par afficher les 2 c“t‚s qui constituent le d‚grad‚ de base: - // C“t‚ gauche (noir) - Block(Fenetre_Pos_X+((Pos_X+2)*Menu_Facteur_X), - Fenetre_Pos_Y+((Pos_Y+2)*Menu_Facteur_Y), - Menu_Facteur_X*6, - Menu_Facteur_Y*10,CM_Noir); - // C“t‚ droit (blanc) - Block(Fenetre_Pos_X+((Pos_X+8)*Menu_Facteur_X), - Fenetre_Pos_Y+((Pos_Y+2)*Menu_Facteur_Y), - Menu_Facteur_X*5, - Menu_Facteur_Y*10,CM_Blanc); - - switch(Technique) - { - case 1 : // D‚grad‚ de trames simples - // Au centre, on place 10 lignes tram‚es simplement - for (Ligne=2;Ligne<2+10;Ligne++) - if (Ligne&1) - { - // Lignes impaires - Pixel_dans_fenetre(Pos_X+ 5,Pos_Y+Ligne,CM_Blanc); - Pixel_dans_fenetre(Pos_X+ 7,Pos_Y+Ligne,CM_Blanc); - Pixel_dans_fenetre(Pos_X+ 8,Pos_Y+Ligne,CM_Noir); - } - else - { - // Lignes paires - Pixel_dans_fenetre(Pos_X+ 6,Pos_Y+Ligne,CM_Blanc); - Pixel_dans_fenetre(Pos_X+ 9,Pos_Y+Ligne,CM_Noir); - } - break; - case 2 : // D‚grad‚ de trames ‚tendues - // Au centre, on place 10 lignes tram‚es de fa‡on compliqu‚e - for (Ligne=2;Ligne<2+10;Ligne++) - if (Ligne&1) - { - // Lignes impaires - Pixel_dans_fenetre(Pos_X+ 7,Pos_Y+Ligne,CM_Blanc); - Pixel_dans_fenetre(Pos_X+ 8,Pos_Y+Ligne,CM_Noir); - Pixel_dans_fenetre(Pos_X+10,Pos_Y+Ligne,CM_Noir); - } - else - { - // Lignes paires - Pixel_dans_fenetre(Pos_X+ 4,Pos_Y+Ligne,CM_Blanc); - Pixel_dans_fenetre(Pos_X+ 6,Pos_Y+Ligne,CM_Blanc); - } - } -} - -void Degrade_Charger_infos_du_tableau(int Indice) -{ - Degrade_Borne_Inferieure =Degrade_Tableau[Indice].Debut; - Degrade_Borne_Superieure =Degrade_Tableau[Indice].Fin; - Degrade_Inverse =Degrade_Tableau[Indice].Inverse; - Degrade_Melange_aleatoire=Degrade_Tableau[Indice].Melange+1; - - Degrade_Intervalle_bornes=(Degrade_Borne_Inferieure indice du d‚grad‚ dans le tableau - Fenetre_Definir_bouton_scroller(218,22,75,16,1,Degrade_Courant); // 2 - // D‚finition du scrolleur de m‚lange du d‚grad‚ - Fenetre_Definir_bouton_scroller(31,22,84,256,1,Degrade_Tableau[Degrade_Courant].Melange); // 3 - Scroller_de_melange=Fenetre_Liste_boutons_scroller; - // D‚finition du bouton de sens - Fenetre_Definir_bouton_normal(8,22,15,14, - (Degrade_Tableau[Degrade_Courant].Inverse)?"\033":"\032",0,1,0x000F); // 4 - // D‚finition du bouton de technique - Fenetre_Definir_bouton_normal(8,92,15,14,"",0,1,0x010F); // 5 - Degrade_Dessiner_bouton_de_technique(8,92,Degrade_Tableau[Degrade_Courant].Technique); - - Fenetre_Definir_bouton_normal(178,112,51,14,"OK",0,1,0x001C); // 6 - Fenetre_Definir_bouton_normal(123,112,51,14,"Cancel",0,1,0x0001); // 7 - - Print_dans_fenetre(5,60,"MIX",CM_Fonce,CM_Clair); - - // On tagge les couleurs qui vont avec - Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); - - Num2str(Degrade_Courant+1,Chaine,2); - Print_dans_fenetre(215,100,Chaine,CM_Noir,CM_Clair); - - // On affiche le cadre autour de la pr‚view - Fenetre_Afficher_cadre_creux(7,111,110,16); - // On affiche la preview - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - - Premiere_couleur=Derniere_couleur=(Degrade_Tableau[Degrade_Courant].Inverse)?Degrade_Tableau[Degrade_Courant].Fin:Degrade_Tableau[Degrade_Courant].Debut; - - Afficher_curseur(); - - do - { - Ancien_Mouse_X=Mouse_X; - Ancien_Mouse_Y=Mouse_Y; - Ancien_Mouse_K=Mouse_K; - - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch(Bouton_clicke) - { - case -1 : - case 1 : // Palette - if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) ) - { - Effacer_curseur(); - Couleur_temporaire=Lit_pixel(Mouse_X,Mouse_Y); - - if (!Ancien_Mouse_K) - { - // On vient de clicker - - // On met … jour l'intervalle du d‚grad‚ - Premiere_couleur=Derniere_couleur=Degrade_Tableau[Degrade_Courant].Debut=Degrade_Tableau[Degrade_Courant].Fin=Couleur_temporaire; - // On tagge le bloc - Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); - // Trac‚ de la preview: - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - } - else - { - // On maintient le click, on va donc tester si le curseur bouge - if (Couleur_temporaire!=Derniere_couleur) - { - // On commence par ordonner la 1Šre et derniŠre couleur du bloc - if (Premiere_couleurCouleur_temporaire) - { - Degrade_Tableau[Degrade_Courant].Debut=Couleur_temporaire; - Degrade_Tableau[Degrade_Courant].Fin =Premiere_couleur; - } - else - Degrade_Tableau[Degrade_Courant].Debut=Degrade_Tableau[Degrade_Courant].Fin=Premiere_couleur; - // On tagge le bloc - Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); - // Trac‚ de la preview: - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - Derniere_couleur=Couleur_temporaire; - } - } - Afficher_curseur(); - } - break; - case 2 : // Nouvel indice de d‚grad‚ - Effacer_curseur(); - // Nouvel indice dans Fenetre_Attribut2 - Degrade_Courant=Fenetre_Attribut2; - - // On affiche la valeur sous la jauge - Num2str(Degrade_Courant+1,Chaine,2); - Print_dans_fenetre(215,100,Chaine,CM_Noir,CM_Clair); - - // On tagge les couleurs qui vont avec - Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); - - // On affiche le sens qui va avec - Print_dans_fenetre(12,25,(Degrade_Tableau[Degrade_Courant].Inverse)?"\033":"\032",CM_Noir,CM_Clair); - - // On raffiche le m‚lange (jauge) qui va avec - Scroller_de_melange->Position=Degrade_Tableau[Degrade_Courant].Melange; - Fenetre_Dessiner_jauge(Scroller_de_melange); - - // On raffiche la technique qui va avec - Degrade_Dessiner_bouton_de_technique(8,92,Degrade_Tableau[Degrade_Courant].Technique); - - // On affiche la nouvelle preview - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - - Afficher_curseur(); - break; - case 3 : // Nouveau m‚lange de d‚grad‚ - Effacer_curseur(); - // Nouvel m‚lange dans Fenetre_Attribut2 - Degrade_Tableau[Degrade_Courant].Melange=Fenetre_Attribut2; - // On affiche la nouvelle preview - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - Afficher_curseur(); - break; - case 4 : // Changement de sens - Effacer_curseur(); - // On inverse le sens (par un XOR de 1) - Degrade_Tableau[Degrade_Courant].Inverse^=1; - Print_dans_fenetre(12,25,(Degrade_Tableau[Degrade_Courant].Inverse)?"\033":"\032",CM_Noir,CM_Clair); - // On affiche la nouvelle preview - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - Afficher_curseur(); - break; - case 5 : // Changement de technique - Effacer_curseur(); - // On change la technique par (+1)%3 - Degrade_Tableau[Degrade_Courant].Technique=(Degrade_Tableau[Degrade_Courant].Technique+1)%3; - Degrade_Dessiner_bouton_de_technique(8,92,Degrade_Tableau[Degrade_Courant].Technique); - // On affiche la nouvelle preview - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - Afficher_curseur(); - } - - if (!Mouse_K) - switch (Touche) - { - case 0x0029 : // R‚cup‚ration d'une couleur derriŠre le menu - case 0x0033 : - Recuperer_couleur_derriere_fenetre(&Couleur,&Click); - if (Click) - { - Effacer_curseur(); - Couleur_temporaire=Couleur; - - // On met … jour l'intervalle du d‚grad‚ - Premiere_couleur=Derniere_couleur=Degrade_Tableau[Degrade_Courant].Debut=Degrade_Tableau[Degrade_Courant].Fin=Couleur_temporaire; - // On tagge le bloc - Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); - // Trac‚ de la preview: - Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); - - Afficher_curseur(); - } - } - } - while (Bouton_clicke<6); - - Fermer_fenetre(); - Desenclencher_bouton(BOUTON_GRADMENU); - Afficher_curseur(); - - Traiter_pixel_de_degrade=Afficher_pixel; - if (Bouton_clicke==7) // Cancel - { - Degrade_Courant=Ancien_Degrade_Courant; - memcpy(Degrade_Tableau,Backup_Degrade_Tableau,sizeof(struct T_Degrade_Tableau)*16); - Degrade_Charger_infos_du_tableau(Degrade_Courant); - } -} - - -// -- Gestion des boutons de cercle (ellipse) d‚grad‚(e) -------------------- - -void Bouton_Cercle_degrade(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_CERCLE_DEGRADE); - Afficher_curseur(); -} - - -void Bouton_Ellipse_degrade(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_ELLIPSE_DEGRADEE); - Afficher_curseur(); -} - - -// -- Gestion du bouton de remplissage --------------------------------------- - -void Bouton_Fill(void) -{ - if (Operation_en_cours!=OPERATION_FILL) - { - Effacer_curseur(); - if (Operation_en_cours!=OPERATION_REMPLACER) - { - Pinceau_Forme_avant_fill=Pinceau_Forme; - Pinceau_Forme=FORME_PINCEAU_POINT; - } - else - if ( (Mouse_Y=Principal_X_Zoom) ) ) - Print_dans_menu("X: Y: ",0); - Demarrer_pile_operation(OPERATION_FILL); - Afficher_curseur(); - } -} - - -void Bouton_Remplacer(void) -{ - if (Operation_en_cours!=OPERATION_REMPLACER) - { - Effacer_curseur(); - if (Operation_en_cours!=OPERATION_FILL) - { - Pinceau_Forme_avant_fill=Pinceau_Forme; - Pinceau_Forme=FORME_PINCEAU_POINT; - } - if ( (Mouse_Y=Principal_X_Zoom) ) ) - Print_dans_menu("X: Y: ( )",0); - Demarrer_pile_operation(OPERATION_REMPLACER); - Afficher_curseur(); - } -} - - -void Bouton_desenclencher_Fill(void) -{ - Pinceau_Forme=Pinceau_Forme_avant_fill; - - if (Operation_en_cours==OPERATION_REMPLACER) - if ( (Mouse_Y=Principal_X_Zoom) ) ) - Print_dans_menu("X: Y: ",0); -} - - -//---------------------------- Menu des pinceaux ----------------------------- - -void Bouton_Menu_pinceaux(void) -{ - short Bouton_clicke; - short Pos_X,Pos_Y; - byte Indice; - - Ouvrir_fenetre(310,155,"Paintbrush menu"); - - Fenetre_Afficher_cadre(8,21,294,107); - - Fenetre_Definir_bouton_normal(122,133,67,14,"Cancel",0,1,0x0001); // 1 - - for (Indice=0; IndiceTAILLE_MAXI_PATH) - { // Doh! il va falloir tronquer le r‚pertoire (bouh !) - - // On commence par copier bˆtement les 3 premiers caractŠres (e.g. "C:\") - for (Indice=0;Indice<3;Indice++) - Nom_temporaire[Indice]=Principal_Repertoire_courant[Indice]; - - // On y rajoute 3 petits points: - strcpy(Nom_temporaire+3,"..."); - - // Ensuite, on cherche un endroit … partir duquel on pourrait loger tout - // le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!) - for (Indice++;IndiceNb_elements=Liste_Nb_elements; - Enreg->Position=Position; - Calculer_hauteur_curseur_jauge(Enreg); - Fenetre_Dessiner_jauge(Enreg); - // On efface les anciens noms de fichier: - Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*89),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir); - // On affiche les nouveaux: - Afficher_la_liste_des_fichiers(Position,Decalage); - - // On r‚cupŠre le nom du schmilblick … "acc‚der" - Determiner_element_de_la_liste(Position,Decalage,Principal_Nom_fichier); - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - // On affiche le nom du r‚pertoire courant - Print_repertoire_courant(); -} - - -void Relire_liste_fichiers(byte Filtre, short Position, short Decalage, - struct Fenetre_Bouton_scroller * Enreg) -{ - Lire_liste_des_fichiers(Filtre); - Trier_la_liste_des_fichiers(); - Preparer_et_afficher_liste_fichiers(Position,Decalage,Enreg); -} - - // -- Gestion du chrono -- - byte Etat_chrono; // Etat du chrono: 0=Attente d'un XŠme de seconde - // 1=Il faut afficher la preview - // 2=Plus de chrono … gerer pour l'instant - long Chrono_delay; // Nombre de 18.2Šme de secondes demand‚s - long Chrono_cmp; // Heure de d‚part du chrono - byte Nouvelle_preview; // Bool‚en "Il faut relancer le chrono de preview" - // Les fonctions de manipulation du chrono se trouvent dans DIVERS.ASM - - -void On_vient_de_scroller_dans_le_fileselect(struct Fenetre_Bouton_scroller * Scroller_de_fichiers) -{ - char Ancien_nom_de_fichier[13]; - - strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier); - - // On regarde si la liste a boug‚ - if (Scroller_de_fichiers->Position!=Principal_File_list_Position) - { - // Si c'est le cas, il faut mettre … jour la jauge - Scroller_de_fichiers->Position=Principal_File_list_Position; - Fenetre_Dessiner_jauge(Scroller_de_fichiers); - } - // On r‚cup‚re le nom du schmilblick … "acc‚der" - Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier); - if (strcmp(Ancien_nom_de_fichier,Principal_Nom_fichier)) - Nouvelle_preview=1; - - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - Afficher_curseur(); -} - - -short Position_fichier_dans_liste(char * Nom) -{ - struct Element_de_liste_de_fileselect * Element_courant; - short Indice; - - for (Indice=0, Element_courant=Liste_du_fileselect; - ((Element_courant!=NULL) && (strcmp(Element_courant->Nom,Nom))); - Indice++,Element_courant=Element_courant->Suivant); - - return (Element_courant!=NULL)?Indice:0; -} - - -void Placer_barre_de_selection_sur(char * Nom) -{ - short Indice; - - Indice=Position_fichier_dans_liste(Nom); - - if ((Liste_Nb_elements<=10) || (Indice<5)) - { - Principal_File_list_Position=0; - Principal_File_list_Decalage=Indice; - } - else - { - if (Indice>=Liste_Nb_elements-5) - { - Principal_File_list_Position=Liste_Nb_elements-10; - Principal_File_list_Decalage=Indice-Principal_File_list_Position; - } - else - { - Principal_File_list_Position=Indice-4; - Principal_File_list_Decalage=4; - } - } -} - - -char FFF_Meilleur_nom[13]; -char * Nom_correspondant_le_mieux_a(char * Nom) -{ - char Nom_courant[13]; - char * Pointeur1; - char * Pointeur2; - char * Pointeur_Meilleur_nom; - struct Element_de_liste_de_fileselect * Element_courant; - byte Lettres_identiques=0; - byte Compteur; - - strcpy(FFF_Meilleur_nom,Principal_Nom_fichier); - Pointeur_Meilleur_nom=NULL; - - for (Element_courant=Liste_du_fileselect; Element_courant!=NULL; Element_courant=Element_courant->Suivant) - { - if ( (!Config.Find_file_fast) - || (Config.Find_file_fast==(Element_courant->Type+1)) ) - { - // On copie le nom de la liste en cours de traitement dans Nom_courant - // tout en le remettant sous forme normale. - for (Pointeur1=Element_courant->Nom,Pointeur2=Nom_courant;*Pointeur1;Pointeur1++) - if (*Pointeur1!=' ') - *(Pointeur2++)=*Pointeur1; - *Pointeur2=0; - // On compare et si c'est mieux, on stocke dans Meilleur_nom - for (Compteur=0; Nom_courant[Compteur]==Nom[Compteur]; Compteur++); - if (Compteur>Lettres_identiques) - { - Lettres_identiques=Compteur; - strcpy(FFF_Meilleur_nom,Nom_courant); - Pointeur_Meilleur_nom=Element_courant->Nom; - } - } - } - - return Pointeur_Meilleur_nom; -} - - -byte Bouton_Load_ou_Save(byte Load, byte Image) - // Load=1 => On affiche le menu du bouton LOAD - // Load=0 => On affiche le menu du bouton SAVE -{ - short Bouton_clicke; - struct Fenetre_Bouton_scroller * Scroller_de_fichiers; - short Temp; - unsigned Bidon=0; // Sert … appeler _dos_setdrive - word Drives_Debut_Y; - byte Charger_ou_sauver_l_image=0; - char Nom_drive[3]=" "; - byte On_a_clicke_sur_OK=0;// Indique si on a click‚ sur Load ou Save ou sur - //un bouton enclenchant Load ou Save juste aprŠs. - struct Composantes * Palette_initiale; // | Donn‚es concernant l'image qui - byte Image_modifiee_initiale; // | sont m‚moris‚es pour pouvoir - short Largeur_image_initiale; // |- ˆtre restaur‚es en sortant, - short Hauteur_image_initiale; // | parce que la preview elle les - byte Back_color_initiale; // | fout en l'air (c'te conne). - char Nom_fichier_initial[13]; // Sert … laisser le nom courant du fichier en cas de sauvegarde - char Repertoire_precedent[13]; // R‚pertoire d'o— l'on vient aprŠs un CHDIR - char Commentaire_initial[TAILLE_COMMENTAIRE+1]; - char Fichier_recherche[13]=""; - char * Fichier_le_plus_ressemblant; - - Palette_initiale=(struct Composantes *)malloc(sizeof(T_Palette)); - memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette)); - - Back_color_initiale=Back_color; - Image_modifiee_initiale=Principal_Image_modifiee; - Largeur_image_initiale=Principal_Largeur_image; - Hauteur_image_initiale=Principal_Hauteur_image; - strcpy(Nom_fichier_initial,Principal_Nom_fichier); - strcpy(Commentaire_initial,Principal_Commentaire); - if (Load) - { - if (Image) - Ouvrir_fenetre(310,190,"Load picture"); - else - Ouvrir_fenetre(310,190,"Load brush"); - Fenetre_Definir_bouton_normal(125,157,51,14,"Load",0,1,0x001C); // 1 - } - else - { - if (Image) - Ouvrir_fenetre(310,190,"Save picture"); - else - Ouvrir_fenetre(310,190,"Save brush"); - Fenetre_Definir_bouton_normal(125,157,51,14,"Save",0,1,0x001C); // 1 - if (Principal_Format==0) // Correction du *.* - { - Principal_Format=Principal_Format_fichier; - Principal_File_list_Position=0; - Principal_File_list_Decalage=0; - } - - if (Principal_Format>NB_FORMATS_SAVE) // Correction d'un format insauvable - { - Principal_Format=FORMAT_PAR_DEFAUT; - Principal_File_list_Position=0; - Principal_File_list_Decalage=0; - } - // Affichage du commentaire - if (Format_Commentaire[Principal_Format-1]) - Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); - } - - Fenetre_Definir_bouton_normal(125,139,51,14,"Cancel",0,1,0x0001); // 2 - Fenetre_Definir_bouton_normal(125, 89,51,14,"Delete",0,1,0x0053); // 3 - - // Cƒdre autour des formats - Fenetre_Afficher_cadre( 7, 51,103, 35); - // Cƒdre autour des infos sur le fichier de dessin - Fenetre_Afficher_cadre(116, 51,187, 35); - // Cƒdre autour de la preview - Fenetre_Afficher_cadre_creux(179,88,124,84); - // Cƒdre autour du fileselector - Fenetre_Afficher_cadre_creux( 7,88,100,84); - - Fenetre_Definir_bouton_special(9,90,96,80); // 4 - - // Scroller du fileselector - Fenetre_Definir_bouton_scroller(110,89,82,1,10,0); // 5 - Scroller_de_fichiers=Fenetre_Liste_boutons_scroller; - - // Scroller des formats - Fenetre_Definir_bouton_scroller(12,55,27,(Load)?NB_FORMATS_LOAD+1:NB_FORMATS_SAVE,1,(Load)?Principal_Format:Principal_Format-1); // 6 - - // Texte de commentaire des dessins - Print_dans_fenetre(7,176,"Txt:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(44,174,TAILLE_COMMENTAIRE); // 7 - - // Saisie du nom de fichier - Fenetre_Definir_bouton_saisie(200,71,12); // 8 - - Print_dans_fenetre( 27,65,"Format:",CM_Fonce,CM_Clair); - Print_dans_fenetre(120,55,"Image size :",CM_Fonce,CM_Clair); - Print_dans_fenetre(120,63,"File size :",CM_Fonce,CM_Clair); - Print_dans_fenetre(120,73,"File name:",CM_Fonce,CM_Clair); - - Print_Format(); - - // D‚finition des boutons repr‚sentant les lecteurs - Drives_Debut_Y=(Nb_drives<=13)? 23 : 18; - for (Temp=0; Temp=Liste_Nb_repertoires) - { - Print_dans_fenetre(127,107,"Delete",CM_Fonce,CM_Clair); - Print_dans_fenetre(127,115,"file ?",CM_Fonce,CM_Clair); - } - else - { - Print_dans_fenetre(127,107,"Remove",CM_Fonce,CM_Clair); - Print_dans_fenetre(127,115,"dir. ?",CM_Fonce,CM_Clair); - } - Print_dans_fenetre(127,123,"Yes/No",CM_Fonce,CM_Clair); - - do + } + + if ( (Menu_visible) && (Mouse_Y+8>Menu_Ordonnee) ) + Effacer_curseur(); + + Desenclencher_bouton(BOUTON_QUIT); + + if ( (Menu_visible) && (Mouse_Y+8>Menu_Ordonnee) ) + Afficher_curseur(); +} + + +//---------------------------- Effacer l'‚cran ------------------------------- +void Bouton_Clear(void) +{ + Effacer_curseur(); + Backup(); + if (Stencil_Mode && Config.Clear_with_stencil) + Effacer_image_courante_Stencil(0,Stencil); + else + Effacer_image_courante(0); + Afficher_ecran(); + Desenclencher_bouton(BOUTON_CLEAR); + Afficher_curseur(); +} + +void Bouton_Clear_colore(void) +{ + Effacer_curseur(); + Backup(); + if (Stencil_Mode && Config.Clear_with_stencil) + Effacer_image_courante_Stencil(Back_color,Stencil); + else + Effacer_image_courante(Back_color); + Afficher_ecran(); + Desenclencher_bouton(BOUTON_CLEAR); + Afficher_curseur(); +} + + +//---------- Menu dans lequel on tagge des couleurs (genre Stencil) ---------- +void Menu_Tag_couleurs(char * En_tete, byte * Table, byte * Mode, byte Cancel) +{ + short Bouton_clicke; + byte Backup_table[256]; + word Indice; + word Ancien_Mouse_X; + word Ancien_Mouse_Y; + byte Ancien_Mouse_K; + byte Couleur_taggee; + byte Couleur; + byte Click; + + + Ouvrir_fenetre(176,150,En_tete); + + Fenetre_Definir_bouton_palette(6,38); // 1 + Fenetre_Definir_bouton_normal( 7, 19,78,14,"Clear" ,1,1,0x002E); // 2 + Fenetre_Definir_bouton_normal(91, 19,78,14,"Invert",1,1,0x0017); // 3 + if (Cancel) + { + Fenetre_Definir_bouton_normal(91,129,78,14,"OK" ,0,1,0x001C); // 4 + Fenetre_Definir_bouton_normal( 7,129,78,14,"Cancel",0,1,0x0001); // 5 + // On enregistre la table dans un backup au cas o— on ferait Cancel + memcpy(Backup_table,Table,256); + } + else + Fenetre_Definir_bouton_normal(49,129,78,14,"OK" ,0,1,0x001C); // 4 + + // On affiche l'‚tat actuel de la table + for (Indice=0; Indice<=255; Indice++) + Stencil_Tagger_couleur(Indice, (Table[Indice])?CM_Noir:CM_Clair); + + Afficher_curseur(); + + do + { + Ancien_Mouse_X=Mouse_X; + Ancien_Mouse_Y=Mouse_Y; + Ancien_Mouse_K=Mouse_K; + + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch (Bouton_clicke) + { + case 0 : + break; + case -1 : + case 1 : // Palette + if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) ) + { + Effacer_curseur(); + Couleur_taggee=Lit_pixel(Mouse_X,Mouse_Y); + Table[Couleur_taggee]=(Mouse_K==A_GAUCHE); + Stencil_Tagger_couleur(Couleur_taggee,(Mouse_K==A_GAUCHE)?CM_Noir:CM_Clair); + Afficher_curseur(); + } + break; + case 2 : // Clear + memset(Table,0,256); + Effacer_curseur(); + for (Indice=0; Indice<=255; Indice++) + Stencil_Tagger_couleur(Indice,CM_Clair); + Afficher_curseur(); + break; + case 3 : // Invert + Effacer_curseur(); + for (Indice=0; Indice<=255; Indice++) + Stencil_Tagger_couleur(Indice,(Table[Indice]^=1)?CM_Noir:CM_Clair); + Afficher_curseur(); + } + + if (!Mouse_K) + switch (Touche) + { + case 0x0029 : // R‚cup‚ration d'une couleur derriŠre le menu + case 0x0033 : + Recuperer_couleur_derriere_fenetre(&Couleur,&Click); + if (Click) + { + Effacer_curseur(); + Couleur_taggee=Couleur; + Table[Couleur_taggee]=(Click==A_GAUCHE); + Stencil_Tagger_couleur(Couleur_taggee,(Click==A_GAUCHE)?CM_Noir:CM_Clair); + Afficher_curseur(); + } + } + } + while (Bouton_clicke<4); + + Fermer_fenetre(); + + if (Bouton_clicke==5) // Cancel + memcpy(Table,Backup_table,256); + else // OK + *Mode=1; + + Afficher_curseur(); +} + + +//--------------------------------- Stencil ---------------------------------- +void Bouton_Stencil_Mode(void) +{ + Stencil_Mode=!Stencil_Mode; +} + + +void Stencil_Tagger_couleur(byte Couleur, byte Couleur_de_taggage) +{ + Block(Fenetre_Pos_X+(Menu_Facteur_X*(Fenetre_Liste_boutons_palette->Pos_X+4+(Couleur >> 4)*10)), + Fenetre_Pos_Y+(Menu_Facteur_Y*(Fenetre_Liste_boutons_palette->Pos_Y+3+(Couleur & 15)* 5)), + Menu_Facteur_X<<1,Menu_Facteur_Y*5,Couleur_de_taggage); +} + + +void Bouton_Menu_Stencil(void) +{ + Menu_Tag_couleurs("Stencil",Stencil,&Stencil_Mode,1); +} + + +//--------------------------------- Masque ----------------------------------- +void Bouton_Mask_Mode(void) +{ + Mask_Mode=!Mask_Mode; +} + + +void Bouton_Mask_Menu(void) +{ + Menu_Tag_couleurs("Mask",Mask,&Mask_Mode,1); +} + + +//------------------------------- ParamŠtres --------------------------------- + +void Settings_Afficher_config(struct S_Config * Conf) +#define YES "YES" +#define NO " NO" +{ + struct Fenetre_Bouton_scroller * Jauge=Fenetre_Liste_boutons_scroller; + char Chaine[4]; + + Effacer_curseur(); + + // Jauge = Jauge de sensibilit‚ Y + Jauge->Position=Conf->Indice_Sensibilite_souris_Y-1; + Fenetre_Dessiner_jauge(Jauge); + + Jauge=Jauge->Next; + // Jauge = Jauge de sensibilit‚ X + Jauge->Position=Conf->Indice_Sensibilite_souris_X-1; + Fenetre_Dessiner_jauge(Jauge); + + Print_dans_fenetre(273, 31,(Conf->Lire_les_fichiers_caches)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre(273, 46,(Conf->Lire_les_repertoires_caches)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre(273, 61,(Conf->Lire_les_repertoires_systemes)?YES:NO,CM_Noir,CM_Clair); + + Print_dans_fenetre(223, 84,(Conf->Safety_colors)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre(223, 99,(Conf->Adjust_brush_pick)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre(223,114,(Conf->Couleurs_separees)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre(223,129,(Conf->Auto_set_res)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre(183,144,(Conf->Coords_rel)?"Relative":"Absolute",CM_Noir,CM_Clair); + + Print_dans_fenetre( 91, 84,(Conf->Afficher_limites_image)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre( 91, 99,(Conf->Clear_palette)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre( 91,114,(Conf->Maximize_preview)?YES:NO,CM_Noir,CM_Clair); + Print_dans_fenetre( 91,129,(Conf->Backup)?YES:NO,CM_Noir,CM_Clair); + switch (Conf->Curseur) + { + case 0 : Print_dans_fenetre(67,144," Solid",CM_Noir,CM_Clair); break; + case 1 : Print_dans_fenetre(67,144,"Transp",CM_Noir,CM_Clair); break; + default: Print_dans_fenetre(67,144," Thin",CM_Noir,CM_Clair); + } + + if (Conf->Fonte) + { // Fun + Print_dans_fenetre( 8,31," ",CM_Noir,CM_Clair); + Print_dans_fenetre( 78,31," ",CM_Noir,CM_Clair); + Print_dans_fenetre( 82,31,"\020",CM_Noir,CM_Clair); + Print_dans_fenetre(152,31,"\021",CM_Noir,CM_Clair); + } + else + { // Classic + Print_dans_fenetre( 82,31," ",CM_Noir,CM_Clair); + Print_dans_fenetre(152,31," ",CM_Noir,CM_Clair); + Print_dans_fenetre( 8,31,"\020",CM_Noir,CM_Clair); + Print_dans_fenetre( 78,31,"\021",CM_Noir,CM_Clair); + } + + Print_dans_fenetre(155,166,(Conf->Auto_save)?YES:NO,CM_Noir,CM_Clair); + + Num2str(Conf->Nb_pages_Undo,Chaine,2); + Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); + + Afficher_curseur(); +} + +void Settings_Sauver_config(struct S_Config * Conf) +{ + if (Sauver_CFG()) + Erreur(0); + else + if (Sauver_INI(Conf)) + Erreur(0); +} + +void Settings_Charger_config(struct S_Config * Conf) +{ + if (Charger_CFG(0)) + Erreur(0); + else + if (Charger_INI(Conf)) + Erreur(0); +} + +void Bouton_Settings(void) +{ + int Sensibilite_X; + int Sensibilite_Y; + short Bouton_clicke; + struct S_Config Config_choisie; + char Chaine[3]; + byte On_a_recharge_la_config=0; + + Config_choisie=Config; + + Ouvrir_fenetre(307,182,"Settings"); + + // On commence par dessiner tous les cƒdres + Fenetre_Afficher_cadre( 5, 16,157,30); + Fenetre_Afficher_cadre( 5, 47,157,17); + Fenetre_Afficher_cadre(163, 16,139,60); + Fenetre_Afficher_cadre(253, 77, 49,82); + Fenetre_Afficher_cadre( 5, 77,247,82); // |_ Misc. + Fenetre_Afficher_cadre( 5, 65,157,14); // | + // On d‚coupe le cƒdre bizarre des "Miscellaneous" + Pixel_dans_fenetre(6,77,CM_Blanc); + Pixel_dans_fenetre(5,78,CM_Fonce); + Block(Fenetre_Pos_X+(7*Menu_Facteur_X),Fenetre_Pos_Y+(77*Menu_Facteur_Y), + Menu_Facteur_X*154,Menu_Facteur_Y<<1,CM_Clair); + Pixel_dans_fenetre(161,77,CM_Clair); + Pixel_dans_fenetre(160,77,CM_Fonce); + + // On affiche maintenant tout le blabla + Print_dans_fenetre( 69, 19,"Font" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(169, 19,"Show in filelist",CM_Fonce,CM_Clair); + Print_dans_fenetre( 9, 52,"Nb of UNDO pages",CM_Fonce,CM_Clair); + Print_dans_fenetre( 32, 70,"Miscellaneous" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(258, 80,"Mouse" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(258, 88,"Sens." ,CM_Fonce,CM_Clair); + Print_dans_fenetre(256,123,"X" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(292,123,"Y" ,CM_Fonce,CM_Clair); + + // Boutons de fontes + Fenetre_Definir_bouton_normal(17,28,59,14,"Classic",0,1,0xFFFF); // 1 + Fenetre_Definir_bouton_normal(91,28,59,14,"Fun" ,0,1,0xFFFF); // 2 + + // Bouton Show/Hide dans le fileselect + Fenetre_Definir_bouton_normal(167, 28,131,14,"Hidden files: ",0,1,0xFFFF); // 3 + Fenetre_Definir_bouton_normal(167, 43,131,14,"Hidden dir. : ",0,1,0xFFFF); // 4 + Fenetre_Definir_bouton_normal(167, 58,131,14,"System dir. : ",0,1,0xFFFF); // 5 + + // Bouton Show/Hide Picture limits + Fenetre_Definir_bouton_normal( 9, 81,107,14,"Limits : ",0,1,0xFFFF); // 6 + // Bouton Show/Hide Picture limits + Fenetre_Definir_bouton_normal( 9, 96,107,14,"Clear pal: ",0,1,0xFFFF); // 7 + // Bouton Show/Hide Picture limits + Fenetre_Definir_bouton_normal( 9,111,107,14,"Max prev.: ",0,1,0xFFFF); // 8 + // Bouton Effectuer des backups … chaque sauvegarde + Fenetre_Definir_bouton_normal( 9,126,107,14,"Backup : ",0,1,0xFFFF); // 9 + // Bouton Choix du curseur + Fenetre_Definir_bouton_normal( 9,141,107,14,"Cursor: ",0,1,0xFFFF); // 10 + + // Bouton Safety colors + Fenetre_Definir_bouton_normal(117, 81,131,14,"Safe. colors: ",0,1,0xFFFF); // 11 + // Bouton Adjust Brush Pick + Fenetre_Definir_bouton_normal(117, 96,131,14,"AdjBrushPick: ",0,1,0xFFFF); // 12 + // Bouton Separate colors + Fenetre_Definir_bouton_normal(117,111,131,14,"Separate col: ",0,1,0xFFFF); // 13 + // Bouton Passer dans la r‚solution appropri‚e aprŠs un chargement + Fenetre_Definir_bouton_normal(117,126,131,14,"Auto-set res: ",0,1,0xFFFF); // 14 + // Bouton Adapter la palette aprŠs un chargement (<=> Shift+BkSpc) + Fenetre_Definir_bouton_normal(117,141,131,14,"Coords: ",0,1,0xFFFF); // 15 + + // Bouton Reload + Fenetre_Definir_bouton_normal( 6,163, 51,14,"Reload" ,0,1,0xFFFF); // 16 + // Bouton Auto-save + Fenetre_Definir_bouton_normal( 73,163,107,14,"Auto-save: ",0,1,0xFFFF); // 17 + // Bouton Save + Fenetre_Definir_bouton_normal(183,163, 51,14,"Save" ,0,1,0xFFFF); // 18 + // Bouton Close + Fenetre_Definir_bouton_normal(250,163, 51,14,"Close" ,0,1,0x0001); // 19 + + // Jauges de sensibilit‚ de la souris (X puis Y) + Fenetre_Definir_bouton_scroller(265,99,56,255,1,0); // 20 + Fenetre_Definir_bouton_scroller(279,99,56,255,1,0); // 21 + + // Zone de saisie du nb de pages de Undo + Fenetre_Definir_bouton_saisie(140,50,2); // 22 + + Afficher_curseur(); + + Settings_Afficher_config(&Config_choisie); + + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch(Bouton_clicke) + { + case 1 : // Classic + Config_choisie.Fonte=0; + break; + case 2 : // Fun + Config_choisie.Fonte=1; + break; + case 3 : // Hidden files + Config_choisie.Lire_les_fichiers_caches=(Config_choisie.Lire_les_fichiers_caches)?0:-1; + break; + case 4 : // Hidden dir. + Config_choisie.Lire_les_repertoires_caches=(Config_choisie.Lire_les_repertoires_caches)?0:-1; + break; + case 5 : // System dir. + Config_choisie.Lire_les_repertoires_systemes=(Config_choisie.Lire_les_repertoires_systemes)?0:-1; + break; + case 6 : // Draw limits + Config_choisie.Afficher_limites_image=!Config_choisie.Afficher_limites_image; + break; + case 7 : // Clear palette + Config_choisie.Clear_palette=!Config_choisie.Clear_palette; + break; + case 8 : // Maximize preview + Config_choisie.Maximize_preview=!Config_choisie.Maximize_preview; + break; + case 9 : // Backup + Config_choisie.Backup=!Config_choisie.Backup; + break; + case 10 : // Curseur + Config_choisie.Curseur=(Config_choisie.Curseur+1)%3; + break; + case 11 : // Safety colors + Config_choisie.Safety_colors=!Config_choisie.Safety_colors; + break; + case 12 : // Adjust brush pick + Config_choisie.Adjust_brush_pick=!Config_choisie.Adjust_brush_pick; + break; + case 13 : // Separate colors + Config_choisie.Couleurs_separees=!Config_choisie.Couleurs_separees; + break; + case 14 : // Auto-set resolution + Config_choisie.Auto_set_res=!Config_choisie.Auto_set_res; + break; + case 15 : // Coordonn‚es + Config_choisie.Coords_rel=!Config_choisie.Coords_rel; + break; + case 16 : // Reload + Settings_Charger_config(&Config_choisie); + On_a_recharge_la_config=1; + break; + case 17 : // Auto-save + Config_choisie.Auto_save=!Config_choisie.Auto_save; + break; + case 18 : // Save + Settings_Sauver_config(&Config_choisie); + break; + case 20 : // X Sensib. + Config_choisie.Indice_Sensibilite_souris_X=Fenetre_Attribut2+1; + break; + case 21 : // Y Sensib. + Config_choisie.Indice_Sensibilite_souris_Y=Fenetre_Attribut2+1; + break; + case 22 : // Nb pages Undo + Effacer_curseur(); + Num2str(Config_choisie.Nb_pages_Undo,Chaine,2); + Readline(142,52,Chaine,2,1); + Config_choisie.Nb_pages_Undo=atoi(Chaine); + // On corrige la valeur + if (Config_choisie.Nb_pages_Undo>NB_PAGES_UNDO_MAX) + { + Config_choisie.Nb_pages_Undo=NB_PAGES_UNDO_MAX; + Num2str(Config_choisie.Nb_pages_Undo,Chaine,2); + Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); + } + else if (!Config_choisie.Nb_pages_Undo) + { + Config_choisie.Nb_pages_Undo=1; + Num2str(Config_choisie.Nb_pages_Undo,Chaine,2); + Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); + } + Afficher_curseur(); + } + + if ((Bouton_clicke>=3) && (Bouton_clicke<=5)) + { + Principal_File_list_Position=0; + Principal_File_list_Decalage=0; + Brouillon_File_list_Position=0; + Brouillon_File_list_Decalage=0; + } + + if ((Bouton_clicke>=1) && (Bouton_clicke<=17)) + Settings_Afficher_config(&Config_choisie); + } + while ( (Bouton_clicke!=19) && (Touche!=0x001C) ); + + Config=Config_choisie; + + // Prise en compte de la nouvelle config + // Gestion de la sensibilit‚ + Sensibilite_X=(Config.Indice_Sensibilite_souris_X/Menu_Facteur_X); + Sensibilite_Y=(Config.Indice_Sensibilite_souris_Y/Menu_Facteur_Y); + Sensibilite_X>>=Mouse_Facteur_de_correction_X; + Sensibilite_Y>>=Mouse_Facteur_de_correction_Y; + + Sensibilite_souris(Sensibilite_X?Sensibilite_X:1, + Sensibilite_Y?Sensibilite_Y:1); + // Gestion des fontes + if (Config.Fonte) + Fonte=Fonte_fun; + else + Fonte=Fonte_systeme; + + if (On_a_recharge_la_config) + Calculer_couleurs_menu_optimales(Principal_Palette); + + Fermer_fenetre(); + Desenclencher_bouton(BOUTON_PARAMETRES); + // Raffichage du menu pour que les inscriptions qui y figurent soient retrac‚es avec la nouvelle fonte + Afficher_menu(); + Afficher_curseur(); + + // On v‚rifie qu'on peut bien allouer le nombre de pages Undo. + Nouveau_nombre_de_backups(Config.Nb_pages_Undo); +} + + +//---------------------------- Changement de page ---------------------------- +void Bouton_Page(void) +{ + byte Octet_temporaire; + word Mot_temporaire; + short Short_temporaire; + float Float_temporaire; + char Zone_temporaire[256]; + + Effacer_curseur(); + + // On d‚grossit le travail avec les infos des listes de pages + Interchanger_image_principale_et_brouillon(); + + // On fait le reste du travail "… la main": + Short_temporaire=Brouillon_Decalage_X; + Brouillon_Decalage_X=Principal_Decalage_X; + Principal_Decalage_X=Short_temporaire; + + Short_temporaire=Brouillon_Decalage_Y; + Brouillon_Decalage_Y=Principal_Decalage_Y; + Principal_Decalage_Y=Short_temporaire; + + Short_temporaire=Ancien_Brouillon_Decalage_X; + Ancien_Brouillon_Decalage_X=Ancien_Principal_Decalage_X; + Ancien_Principal_Decalage_X=Short_temporaire; + + Short_temporaire=Ancien_Brouillon_Decalage_Y; + Ancien_Brouillon_Decalage_Y=Ancien_Principal_Decalage_Y; + Ancien_Principal_Decalage_Y=Short_temporaire; + + Short_temporaire=Brouillon_Split; + Brouillon_Split=Principal_Split; + Principal_Split=Short_temporaire; + + Short_temporaire=Brouillon_X_Zoom; + Brouillon_X_Zoom=Principal_X_Zoom; + Principal_X_Zoom=Short_temporaire; + + Float_temporaire=Brouillon_Proportion_split; + Brouillon_Proportion_split=Principal_Proportion_split; + Principal_Proportion_split=Float_temporaire; + + Octet_temporaire=Brouillon_Loupe_Mode; + Brouillon_Loupe_Mode=Loupe_Mode; + Loupe_Mode=Octet_temporaire; + + Pixel_Preview=(Loupe_Mode)?Pixel_Preview_Loupe:Pixel_Preview_Normal; + + Mot_temporaire=Brouillon_Loupe_Facteur; + Brouillon_Loupe_Facteur=Loupe_Facteur; + Loupe_Facteur=Mot_temporaire; + + Mot_temporaire=Brouillon_Loupe_Hauteur; + Brouillon_Loupe_Hauteur=Loupe_Hauteur; + Loupe_Hauteur=Mot_temporaire; + + Mot_temporaire=Brouillon_Loupe_Largeur; + Brouillon_Loupe_Largeur=Loupe_Largeur; + Loupe_Largeur=Mot_temporaire; + + Short_temporaire=Brouillon_Loupe_Decalage_X; + Brouillon_Loupe_Decalage_X=Loupe_Decalage_X; + Loupe_Decalage_X=Short_temporaire; + + Short_temporaire=Brouillon_Loupe_Decalage_Y; + Brouillon_Loupe_Decalage_Y=Loupe_Decalage_Y; + Loupe_Decalage_Y=Short_temporaire; + + // Swap du bool‚en "Image modifi‚e" + Octet_temporaire =Brouillon_Image_modifiee; + Brouillon_Image_modifiee=Principal_Image_modifiee; + Principal_Image_modifiee=Octet_temporaire; + + // Swap des infos sur les fileselects + strcpy(Zone_temporaire ,Brouillon_Repertoire_courant); + strcpy(Brouillon_Repertoire_courant,Principal_Repertoire_courant); + strcpy(Principal_Repertoire_courant,Zone_temporaire ); + + Octet_temporaire=Brouillon_Format; + Brouillon_Format=Principal_Format; + Principal_Format=Octet_temporaire; + + Mot_temporaire =Brouillon_File_list_Position; + Brouillon_File_list_Position=Principal_File_list_Position; + Principal_File_list_Position=Mot_temporaire; + + Mot_temporaire =Brouillon_File_list_Decalage; + Brouillon_File_list_Decalage=Principal_File_list_Decalage; + Principal_File_list_Decalage=Mot_temporaire; + + // A la fin, on affiche l'‚cran + for (Octet_temporaire=0; FACTEUR_ZOOM[Octet_temporaire]!=Loupe_Facteur; Octet_temporaire++); + Changer_facteur_loupe(Octet_temporaire); + + Set_palette(Principal_Palette); + Calculer_couleurs_menu_optimales(Principal_Palette); + Afficher_ecran(); + Desenclencher_bouton(BOUTON_PAGE); + Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); + Afficher_menu(); + + Afficher_curseur(); +} + + +// -- Copie de page --------------------------------------------------------- + +void Copier_image_seule(void) +{ + if (Backuper_et_redimensionner_brouillon(Principal_Largeur_image,Principal_Hauteur_image)) + { + // copie de l'image + memcpy(Brouillon_Ecran,Principal_Ecran,Principal_Largeur_image*Principal_Hauteur_image); + + // Copie des dimensions de l'image + /* + C'est inutile, le "Backuper et redimensionner brouillon" a d‚j… modifi‚ + ces valeurs pour qu'elles soient correctes. + */ + Brouillon_Largeur_image=Principal_Largeur_image; + Brouillon_Hauteur_image=Principal_Hauteur_image; + + // Copie des d‚calages de la fenˆtre principale (non zoom‚e) de l'image + Brouillon_Decalage_X=Principal_Decalage_X; + Brouillon_Decalage_Y=Principal_Decalage_Y; + + // Copie du bool‚en "Mode loupe" de l'image + Brouillon_Loupe_Mode=Loupe_Mode; + + // Copie du facteur de zoom du brouillon + Brouillon_Loupe_Facteur=Loupe_Facteur; + + // Copie des dimensions de la fenˆtre de zoom + Brouillon_Loupe_Largeur=Loupe_Largeur; + Brouillon_Loupe_Hauteur=Loupe_Hauteur; + + // Copie des d‚calages de la fenˆtre de zoom + Brouillon_Loupe_Decalage_X=Loupe_Decalage_X; + Brouillon_Loupe_Decalage_Y=Loupe_Decalage_Y; + + // Copie des donn‚es du split du zoom + Brouillon_Split=Principal_Split; + Brouillon_X_Zoom=Principal_X_Zoom; + Brouillon_Proportion_split=Principal_Proportion_split; + } + else + Message_Memoire_insuffisante(); +} + + +void Copier_certaines_couleurs(void) +{ + short Indice; + + Menu_Tag_couleurs("Tag colors to copy",Masque_copie_couleurs,NULL,0); + + if ( (!Brouillon_Image_modifiee) + || (Demande_de_confirmation("Spare page was modified. Proceed?")) ) + for (Indice=0; Indice<256; Indice++) + { + if (Masque_copie_couleurs[Indice]) + memcpy(Brouillon_Palette+Indice,Principal_Palette+Indice, + sizeof(struct Composantes)); + } +} + + +void Bouton_Copy_page(void) +{ + short Bouton_clicke; + + + Ouvrir_fenetre(168,137,"Copy to spare page"); + + Fenetre_Definir_bouton_normal(10, 20,148,14,"Pixels + palette" , 0,1,0x001C); // 1 + Fenetre_Definir_bouton_normal(10, 37,148,14,"Pixels only" , 3,1,0x002D); // 2 + Fenetre_Definir_bouton_normal(10, 54,148,14,"Palette only" , 1,1,0x0019); // 3 + Fenetre_Definir_bouton_normal(10, 71,148,14,"Some colors only" , 6,1,0x002E); // 4 + Fenetre_Definir_bouton_normal(10, 88,148,14,"Palette and remap",13,1,0x0013); // 5 + Fenetre_Definir_bouton_normal(44,114, 80,14,"Cancel" , 0,1,0x0001); // 6 + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while (Bouton_clicke<=0); + + Fermer_fenetre(); + Afficher_curseur(); + + if (Bouton_clicke!=6) + { + if (Bouton_clicke==4) + Copier_certaines_couleurs(); + else + { + if ( (!Brouillon_Image_modifiee) + || (Demande_de_confirmation("Spare page was modified. Proceed?")) ) + { + if (Bouton_clicke<=2) + Copier_image_seule(); + + if (Bouton_clicke==5) + Remap_picture(); + + if (Bouton_clicke!=2) // copie de la palette + memcpy(Brouillon_Palette,Principal_Palette,sizeof(T_Palette)); + + Brouillon_Image_modifiee=1; + } + } + } + + Effacer_curseur(); + Desenclencher_bouton(BOUTON_PAGE); + Afficher_curseur(); +} + + +// -- Suppression d'une page ------------------------------------------------- +void Bouton_Kill(void) +{ + if ( (Principal_Backups->Nb_pages_allouees==1) + || (!Demande_de_confirmation("Delete the current page?")) ) + { + if (Principal_Backups->Nb_pages_allouees==1) + Warning_message("You can't delete the last page."); + Effacer_curseur(); + Desenclencher_bouton(BOUTON_KILL); + Afficher_curseur(); + } + else + { + Effacer_curseur(); + Detruire_la_page_courante(); + + Set_palette(Principal_Palette); + Calculer_couleurs_menu_optimales(Principal_Palette); + + Afficher_ecran(); + Desenclencher_bouton(BOUTON_KILL); + Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,Loupe_Mode); + Afficher_menu(); + Afficher_curseur(); + } +} + + +//------------------------- Dimensions Image/Ecran --------------------------- + +void Cocher_bouton_mode(short Pos_X, short Pos_Y, byte Etat) +{ + byte Couleur; + + if (Etat>=128) + Etat-=128; + switch (Etat) + { + case 0 : Couleur=CM_Blanc; break; + case 1 : Couleur=CM_Clair; break; + case 2 : Couleur=CM_Fonce; break; + default: Couleur=CM_Noir; + } + Block(Fenetre_Pos_X+Menu_Facteur_X*Pos_X,Fenetre_Pos_Y+Menu_Facteur_Y*Pos_Y, + Menu_Facteur_X*9,Menu_Facteur_Y*3,Couleur); +} + + +void Afficher_liste_modes(short Debut_liste, short Position_curseur) +{ + short Indice,Mode_courant; + short Pos_Y; + byte Couleur_texte,Couleur_fond; + char Chaine[29]; + + for (Mode_courant=Debut_liste,Indice=0; Indice<12; Indice++,Mode_courant++) + { + Pos_Y=70+(Indice<<3); + Cocher_bouton_mode(19,Pos_Y+2,Mode_video[Mode_courant].Etat); + + if (Position_curseur!=Indice) + { + Couleur_fond =CM_Noir; + if (Mode_video[Mode_courant].Etat<128) + Couleur_texte=CM_Clair; + else + Couleur_texte=CM_Fonce; + } + else + { + Couleur_fond =CM_Fonce; + if (Mode_video[Mode_courant].Etat<128) + Couleur_texte=CM_Blanc; + else + Couleur_texte=CM_Clair; + } + Num2str(Mode_video[Mode_courant].Largeur,Chaine,4); + Num2str(Mode_video[Mode_courant].Hauteur,Chaine+4,4); + switch (Mode_video[Mode_courant].Mode) + { + case MODE_SDL : + memcpy(Chaine+8," SDL ",10); + break; + + } + if (Mode_video[Mode_courant].Refresh>0) + { + Num2str(Mode_video[Mode_courant].Refresh,Chaine+18,2); + Chaine[20]=' '; + } + else + { + if (Mode_video[Mode_courant].Refresh==-1) + memcpy(Chaine+18," ",3); + else + { + Num2str(-Mode_video[Mode_courant].Refresh,Chaine+18,2); + Chaine[20]='i'; + } + } + memcpy(Chaine+21," ",2); + memcpy(Chaine+23,Mode_video[Mode_courant].Ratio,4); + Chaine[27]=' '; + Chaine[28]=0; + + Print_dans_fenetre(39,Pos_Y,Chaine,Couleur_texte,Couleur_fond); + } +} + + +void Scroller_la_liste_des_modes(short Debut_liste, short Position_curseur, int * Mode_choisi) +{ + Effacer_curseur(); + *Mode_choisi=Debut_liste+Position_curseur; + if (Fenetre_Liste_boutons_scroller->Position!=Debut_liste) + { + Fenetre_Liste_boutons_scroller->Position=Debut_liste; + Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); + } + Afficher_liste_modes(Debut_liste,Position_curseur); + Afficher_curseur(); +} + + +void Bouton_Resol(void) +{ + short Bouton_clicke; + int Mode_choisi; + word Largeur_choisie; + word Hauteur_choisie; + short Debut_liste; + short Position_curseur; + short Temp; + byte Temp2; + char Chaine[5]; + struct Fenetre_Bouton_special * Bouton_saisie_Width, * Bouton_saisie_Height; + + Ouvrir_fenetre(299,190,"Picture & screen sizes"); + + Fenetre_Afficher_cadre ( 8,17,195, 33); + Fenetre_Afficher_cadre ( 8,56,283,126); + Fenetre_Afficher_cadre_creux(37,68,228,100); + Block(Fenetre_Pos_X+Menu_Facteur_X*38,Fenetre_Pos_Y+Menu_Facteur_Y*69, + Menu_Facteur_X*226,Menu_Facteur_Y*98,CM_Noir); + + Print_dans_fenetre( 12, 21,"Picture size:" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 12, 37,"Width:" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(108, 37,"Height:" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 16, 60,"OK" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 55, 60,"X Y" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(131, 60,"Mode" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(183, 60,"Hz" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(219, 60,"Ratio" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 30,170,"\03" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 62,170,"OK" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(102,170,"Imperfect" ,CM_Fonce,CM_Clair); + Print_dans_fenetre(196,170,"Unsupported" ,CM_Fonce,CM_Clair); + + Fenetre_Definir_bouton_normal(223, 18,67,14,"OK" ,0,1,0x001C); // 1 + Fenetre_Definir_bouton_normal(223, 35,67,14,"Cancel" ,0,1,0x0001); // 2 + + Fenetre_Definir_bouton_saisie( 60, 35,4); // 3 + Bouton_saisie_Width=Fenetre_Liste_boutons_special; + Fenetre_Definir_bouton_saisie(164, 35,4); // 4 + Bouton_saisie_Height=Fenetre_Liste_boutons_special; + + Fenetre_Definir_bouton_special(38,70,225,96); // 5 + + Mode_choisi=Resolution_actuelle; + + if (Mode_choisi>=6) + { + if (Mode_choisi>3; + if ((Mouse_K==2) || (Temp!=Position_curseur)) + { + Effacer_curseur(); + if (Temp!=Position_curseur) { - puts("boutons.c 2454\n"); - //Etat_Du_Clavier=SDL_GetKeyState(Bidon); - } while ((Etat_Du_Clavier[SDLK_y]==0) && (Etat_Du_Clavier[SDLK_n]==0) && (Etat_Du_Clavier[SDLK_ESCAPE]==0)); - - // On efface la demande de confirmation - Block(Fenetre_Pos_X+127*Menu_Facteur_X,Fenetre_Pos_Y+107*Menu_Facteur_Y, - Menu_Facteur_X*48,Menu_Facteur_Y*24,CM_Clair); - - // Si l'utilisateur confirme, - if (Touche=='Y') - { - // Si c'est un fichier - if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) - // On efface le fichier (si on peut) - Temp=(!remove(Principal_Nom_fichier)); - else // Si c'est un repertoire - // On efface le repertoire (si on peut) - Temp=(!rmdir(Principal_Nom_fichier)); - - if (Temp) // Temp indique si l'effacement s'est bien pass‚ - { - // On remonte si c'‚tait le dernier ‚l‚ment de la liste - if (Principal_File_list_Position+Principal_File_list_Decalage==Liste_Nb_elements-1) - { - if (Principal_File_list_Position) - Principal_File_list_Position--; - else - if (Principal_File_list_Decalage) - Principal_File_list_Decalage--; - } - else // Si ce n'‚tait pas le dernier, il faut faire gaffe … ce - { // que ses copains d'en dessous ne remontent pas trop. - if ( (Principal_File_list_Position) - && (Principal_File_list_Position+10==Liste_Nb_elements) ) - { - Principal_File_list_Position--; - Principal_File_list_Decalage++; - } - } - // On relit les informations - Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - // On demande la preview du nouveau fichier sur lequel on se trouve - Nouvelle_preview=1; - } - else - Erreur(0); - - // On place la barre de s‚lection du brouillon au d‚but s'il a le - // mˆme r‚pertoire que l'image principale. - if (!strcmp(Principal_Repertoire_courant,Brouillon_Repertoire_courant)) - { - Brouillon_File_list_Position=0; - Brouillon_File_list_Decalage=0; - } - } - Afficher_curseur(); - } - break; - - case 4 : // Zone d'affichage de la liste de fichiers - Effacer_curseur(); - - Temp=Calculer_decalage_click_dans_fileselector(); - if (Temp>=0) - { - if (Temp!=Principal_File_list_Decalage) - { - // On met … jour le d‚calage - Principal_File_list_Decalage=Temp; - - // On r‚cup‚re le nom du schmilblick … "acc‚der" - Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier); - // On affiche le nouveau nom de fichier - Print_Nom_fichier_dans_selecteur(); - // On affiche … nouveau la liste - Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage); - - // On vient de changer de nom de fichier, donc on doit s'appreter - // a rafficher une preview - Nouvelle_preview=1; - } - else - { - // En sauvegarde, si on a double-click‚ sur un r‚pertoire, il - // faut mettre le nom de fichier au nom du r‚pertoire. Sinon, dans - // certains cas, on risque de sauvegarder avec le nom du fichier - // actuel au lieu de changer de r‚pertoire. - if (Principal_File_list_Position+Principal_File_list_Decalage0) + Position_curseur--; + else + if (Debut_liste>0) + Debut_liste--; + Scroller_la_liste_des_modes(Debut_liste,Position_curseur,&Mode_choisi); + break; + case 0x0050 : // Bas + if (Position_curseur<11) + Position_curseur++; + else + if (Debut_liste0) + Position_curseur=0; + else + { + if (Debut_liste>11) + Debut_liste-=11; + else + Debut_liste=0; + } + Scroller_la_liste_des_modes(Debut_liste,Position_curseur,&Mode_choisi); + break; + case 0x0051 : // PageDown + if (Position_curseur<11) + Position_curseur=11; + else + { + if (Debut_listeOPERATION_DESSIN_POINT) + Mode_de_dessin_en_cours=OPERATION_DESSIN_CONTINU; + + Effacer_curseur(); + Afficher_sprite_dans_menu(BOUTON_DESSIN,Mode_de_dessin_en_cours); + Demarrer_pile_operation(Mode_de_dessin_en_cours); + Afficher_curseur(); +} + + +// -- Gestion des boutons de rectangle vide et plein ------------------------ + +void Bouton_Rectangle_vide(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_RECTANGLE_VIDE); + Afficher_curseur(); +} + + +void Bouton_Rectangle_plein(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_RECTANGLE_PLEIN); + Afficher_curseur(); +} + + +// -- Gestion des boutons de cercle (ellipse) vide et plein(e) -------------- + +void Bouton_Cercle_vide(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_CERCLE_VIDE); + Afficher_curseur(); +} + + +void Bouton_Ellipse_vide(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_ELLIPSE_VIDE); + Afficher_curseur(); +} + + +void Bouton_Cercle_plein(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_CERCLE_PLEIN); + Afficher_curseur(); +} + + +void Bouton_Ellipse_pleine(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_ELLIPSE_PLEINE); + Afficher_curseur(); +} + + +// -- Gestion du menu des d‚grad‚s ------------------------------------------ +void Degrade_Dessiner_bouton_de_technique(short Pos_X,short Pos_Y,int Technique) +{ + short Ligne; + + // On commence par afficher les 2 c“t‚s qui constituent le d‚grad‚ de base: + // C“t‚ gauche (noir) + Block(Fenetre_Pos_X+((Pos_X+2)*Menu_Facteur_X), + Fenetre_Pos_Y+((Pos_Y+2)*Menu_Facteur_Y), + Menu_Facteur_X*6, + Menu_Facteur_Y*10,CM_Noir); + // C“t‚ droit (blanc) + Block(Fenetre_Pos_X+((Pos_X+8)*Menu_Facteur_X), + Fenetre_Pos_Y+((Pos_Y+2)*Menu_Facteur_Y), + Menu_Facteur_X*5, + Menu_Facteur_Y*10,CM_Blanc); + + switch(Technique) + { + case 1 : // D‚grad‚ de trames simples + // Au centre, on place 10 lignes tram‚es simplement + for (Ligne=2;Ligne<2+10;Ligne++) + if (Ligne&1) + { + // Lignes impaires + Pixel_dans_fenetre(Pos_X+ 5,Pos_Y+Ligne,CM_Blanc); + Pixel_dans_fenetre(Pos_X+ 7,Pos_Y+Ligne,CM_Blanc); + Pixel_dans_fenetre(Pos_X+ 8,Pos_Y+Ligne,CM_Noir); + } + else + { + // Lignes paires + Pixel_dans_fenetre(Pos_X+ 6,Pos_Y+Ligne,CM_Blanc); + Pixel_dans_fenetre(Pos_X+ 9,Pos_Y+Ligne,CM_Noir); + } + break; + case 2 : // D‚grad‚ de trames ‚tendues + // Au centre, on place 10 lignes tram‚es de fa‡on compliqu‚e + for (Ligne=2;Ligne<2+10;Ligne++) + if (Ligne&1) + { + // Lignes impaires + Pixel_dans_fenetre(Pos_X+ 7,Pos_Y+Ligne,CM_Blanc); + Pixel_dans_fenetre(Pos_X+ 8,Pos_Y+Ligne,CM_Noir); + Pixel_dans_fenetre(Pos_X+10,Pos_Y+Ligne,CM_Noir); + } + else + { + // Lignes paires + Pixel_dans_fenetre(Pos_X+ 4,Pos_Y+Ligne,CM_Blanc); + Pixel_dans_fenetre(Pos_X+ 6,Pos_Y+Ligne,CM_Blanc); + } + } +} + +void Degrade_Charger_infos_du_tableau(int Indice) +{ + Degrade_Borne_Inferieure =Degrade_Tableau[Indice].Debut; + Degrade_Borne_Superieure =Degrade_Tableau[Indice].Fin; + Degrade_Inverse =Degrade_Tableau[Indice].Inverse; + Degrade_Melange_aleatoire=Degrade_Tableau[Indice].Melange+1; + + Degrade_Intervalle_bornes=(Degrade_Borne_Inferieure indice du d‚grad‚ dans le tableau + Fenetre_Definir_bouton_scroller(218,22,75,16,1,Degrade_Courant); // 2 + // D‚finition du scrolleur de m‚lange du d‚grad‚ + Fenetre_Definir_bouton_scroller(31,22,84,256,1,Degrade_Tableau[Degrade_Courant].Melange); // 3 + Scroller_de_melange=Fenetre_Liste_boutons_scroller; + // D‚finition du bouton de sens + Fenetre_Definir_bouton_normal(8,22,15,14, + (Degrade_Tableau[Degrade_Courant].Inverse)?"\033":"\032",0,1,0x000F); // 4 + // D‚finition du bouton de technique + Fenetre_Definir_bouton_normal(8,92,15,14,"",0,1,0x010F); // 5 + Degrade_Dessiner_bouton_de_technique(8,92,Degrade_Tableau[Degrade_Courant].Technique); + + Fenetre_Definir_bouton_normal(178,112,51,14,"OK",0,1,0x001C); // 6 + Fenetre_Definir_bouton_normal(123,112,51,14,"Cancel",0,1,0x0001); // 7 + + Print_dans_fenetre(5,60,"MIX",CM_Fonce,CM_Clair); + + // On tagge les couleurs qui vont avec + Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); + + Num2str(Degrade_Courant+1,Chaine,2); + Print_dans_fenetre(215,100,Chaine,CM_Noir,CM_Clair); + + // On affiche le cadre autour de la pr‚view + Fenetre_Afficher_cadre_creux(7,111,110,16); + // On affiche la preview + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + + Premiere_couleur=Derniere_couleur=(Degrade_Tableau[Degrade_Courant].Inverse)?Degrade_Tableau[Degrade_Courant].Fin:Degrade_Tableau[Degrade_Courant].Debut; + + Afficher_curseur(); + + do + { + Ancien_Mouse_X=Mouse_X; + Ancien_Mouse_Y=Mouse_Y; + Ancien_Mouse_K=Mouse_K; + + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch(Bouton_clicke) + { + case -1 : + case 1 : // Palette + if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) ) + { + Effacer_curseur(); + Couleur_temporaire=Lit_pixel(Mouse_X,Mouse_Y); + + if (!Ancien_Mouse_K) + { + // On vient de clicker + + // On met … jour l'intervalle du d‚grad‚ + Premiere_couleur=Derniere_couleur=Degrade_Tableau[Degrade_Courant].Debut=Degrade_Tableau[Degrade_Courant].Fin=Couleur_temporaire; + // On tagge le bloc + Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); + // Trac‚ de la preview: + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + } + else + { + // On maintient le click, on va donc tester si le curseur bouge + if (Couleur_temporaire!=Derniere_couleur) + { + // On commence par ordonner la 1Šre et derniŠre couleur du bloc + if (Premiere_couleurCouleur_temporaire) + { + Degrade_Tableau[Degrade_Courant].Debut=Couleur_temporaire; + Degrade_Tableau[Degrade_Courant].Fin =Premiere_couleur; + } + else + Degrade_Tableau[Degrade_Courant].Debut=Degrade_Tableau[Degrade_Courant].Fin=Premiere_couleur; + // On tagge le bloc + Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); + // Trac‚ de la preview: + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + Derniere_couleur=Couleur_temporaire; + } + } + Afficher_curseur(); + } + break; + case 2 : // Nouvel indice de d‚grad‚ + Effacer_curseur(); + // Nouvel indice dans Fenetre_Attribut2 + Degrade_Courant=Fenetre_Attribut2; + + // On affiche la valeur sous la jauge + Num2str(Degrade_Courant+1,Chaine,2); + Print_dans_fenetre(215,100,Chaine,CM_Noir,CM_Clair); + + // On tagge les couleurs qui vont avec + Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); + + // On affiche le sens qui va avec + Print_dans_fenetre(12,25,(Degrade_Tableau[Degrade_Courant].Inverse)?"\033":"\032",CM_Noir,CM_Clair); + + // On raffiche le m‚lange (jauge) qui va avec + Scroller_de_melange->Position=Degrade_Tableau[Degrade_Courant].Melange; + Fenetre_Dessiner_jauge(Scroller_de_melange); + + // On raffiche la technique qui va avec + Degrade_Dessiner_bouton_de_technique(8,92,Degrade_Tableau[Degrade_Courant].Technique); + + // On affiche la nouvelle preview + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + + Afficher_curseur(); + break; + case 3 : // Nouveau m‚lange de d‚grad‚ + Effacer_curseur(); + // Nouvel m‚lange dans Fenetre_Attribut2 + Degrade_Tableau[Degrade_Courant].Melange=Fenetre_Attribut2; + // On affiche la nouvelle preview + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + Afficher_curseur(); + break; + case 4 : // Changement de sens + Effacer_curseur(); + // On inverse le sens (par un XOR de 1) + Degrade_Tableau[Degrade_Courant].Inverse^=1; + Print_dans_fenetre(12,25,(Degrade_Tableau[Degrade_Courant].Inverse)?"\033":"\032",CM_Noir,CM_Clair); + // On affiche la nouvelle preview + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + Afficher_curseur(); + break; + case 5 : // Changement de technique + Effacer_curseur(); + // On change la technique par (+1)%3 + Degrade_Tableau[Degrade_Courant].Technique=(Degrade_Tableau[Degrade_Courant].Technique+1)%3; + Degrade_Dessiner_bouton_de_technique(8,92,Degrade_Tableau[Degrade_Courant].Technique); + // On affiche la nouvelle preview + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + Afficher_curseur(); + } + + if (!Mouse_K) + switch (Touche) + { + case 0x0029 : // R‚cup‚ration d'une couleur derriŠre le menu + case 0x0033 : + Recuperer_couleur_derriere_fenetre(&Couleur,&Click); + if (Click) + { + Effacer_curseur(); + Couleur_temporaire=Couleur; + + // On met … jour l'intervalle du d‚grad‚ + Premiere_couleur=Derniere_couleur=Degrade_Tableau[Degrade_Courant].Debut=Degrade_Tableau[Degrade_Courant].Fin=Couleur_temporaire; + // On tagge le bloc + Tagger_intervalle_palette(Degrade_Tableau[Degrade_Courant].Debut,Degrade_Tableau[Degrade_Courant].Fin); + // Trac‚ de la preview: + Degrade_Dessiner_preview(8,112,108,14,Degrade_Courant); + + Afficher_curseur(); + } + } + } + while (Bouton_clicke<6); + + Fermer_fenetre(); + Desenclencher_bouton(BOUTON_GRADMENU); + Afficher_curseur(); + + Traiter_pixel_de_degrade=Afficher_pixel; + if (Bouton_clicke==7) // Cancel + { + Degrade_Courant=Ancien_Degrade_Courant; + memcpy(Degrade_Tableau,Backup_Degrade_Tableau,sizeof(struct T_Degrade_Tableau)*16); + Degrade_Charger_infos_du_tableau(Degrade_Courant); + } +} + + +// -- Gestion des boutons de cercle (ellipse) d‚grad‚(e) -------------------- + +void Bouton_Cercle_degrade(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_CERCLE_DEGRADE); + Afficher_curseur(); +} + + +void Bouton_Ellipse_degrade(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_ELLIPSE_DEGRADEE); + Afficher_curseur(); +} + + +// -- Gestion du bouton de remplissage --------------------------------------- + +void Bouton_Fill(void) +{ + if (Operation_en_cours!=OPERATION_FILL) + { + Effacer_curseur(); + if (Operation_en_cours!=OPERATION_REMPLACER) + { + Pinceau_Forme_avant_fill=Pinceau_Forme; + Pinceau_Forme=FORME_PINCEAU_POINT; + } + else + if ( (Mouse_Y=Principal_X_Zoom) ) ) + Print_dans_menu("X: Y: ",0); + Demarrer_pile_operation(OPERATION_FILL); + Afficher_curseur(); + } +} + + +void Bouton_Remplacer(void) +{ + if (Operation_en_cours!=OPERATION_REMPLACER) + { + Effacer_curseur(); + if (Operation_en_cours!=OPERATION_FILL) + { + Pinceau_Forme_avant_fill=Pinceau_Forme; + Pinceau_Forme=FORME_PINCEAU_POINT; + } + if ( (Mouse_Y=Principal_X_Zoom) ) ) + Print_dans_menu("X: Y: ( )",0); + Demarrer_pile_operation(OPERATION_REMPLACER); + Afficher_curseur(); + } +} + + +void Bouton_desenclencher_Fill(void) +{ + Pinceau_Forme=Pinceau_Forme_avant_fill; + + if (Operation_en_cours==OPERATION_REMPLACER) + if ( (Mouse_Y=Principal_X_Zoom) ) ) + Print_dans_menu("X: Y: ",0); +} + + +//---------------------------- Menu des pinceaux ----------------------------- + +void Bouton_Menu_pinceaux(void) +{ + short Bouton_clicke; + short Pos_X,Pos_Y; + byte Indice; + + Ouvrir_fenetre(310,155,"Paintbrush menu"); + + Fenetre_Afficher_cadre(8,21,294,107); + + Fenetre_Definir_bouton_normal(122,133,67,14,"Cancel",0,1,0x0001); // 1 + + for (Indice=0; IndiceTAILLE_MAXI_PATH) + { // Doh! il va falloir tronquer le r‚pertoire (bouh !) + + // On commence par copier bˆtement les 3 premiers caractŠres (e.g. "C:\") + for (Indice=0;Indice<3;Indice++) + Nom_temporaire[Indice]=Principal_Repertoire_courant[Indice]; + + // On y rajoute 3 petits points: + strcpy(Nom_temporaire+3,"..."); + + // Ensuite, on cherche un endroit … partir duquel on pourrait loger tout + // le reste de la chaine (Ouaaaaaah!!! Vachement fort le mec!!) + for (Indice++;IndiceNb_elements=Liste_Nb_elements; + Enreg->Position=Position; + Calculer_hauteur_curseur_jauge(Enreg); + Fenetre_Dessiner_jauge(Enreg); + // On efface les anciens noms de fichier: + Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*89),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir); + // On affiche les nouveaux: + Afficher_la_liste_des_fichiers(Position,Decalage); + + // On r‚cupŠre le nom du schmilblick … "acc‚der" + Determiner_element_de_la_liste(Position,Decalage,Principal_Nom_fichier); + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + // On affiche le nom du r‚pertoire courant + Print_repertoire_courant(); +} + + +void Relire_liste_fichiers(byte Filtre, short Position, short Decalage, + struct Fenetre_Bouton_scroller * Enreg) +{ + Lire_liste_des_fichiers(Filtre); + Trier_la_liste_des_fichiers(); + Preparer_et_afficher_liste_fichiers(Position,Decalage,Enreg); +} + + // -- Gestion du chrono -- + byte Etat_chrono; // Etat du chrono: 0=Attente d'un XŠme de seconde + // 1=Il faut afficher la preview + // 2=Plus de chrono … gerer pour l'instant + long Chrono_delay; // Nombre de 18.2Šme de secondes demand‚s + long Chrono_cmp; // Heure de d‚part du chrono + byte Nouvelle_preview; // Bool‚en "Il faut relancer le chrono de preview" + // Les fonctions de manipulation du chrono se trouvent dans DIVERS.ASM + + +void On_vient_de_scroller_dans_le_fileselect(struct Fenetre_Bouton_scroller * Scroller_de_fichiers) +{ + char Ancien_nom_de_fichier[13]; + + strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier); + + // On regarde si la liste a boug‚ + if (Scroller_de_fichiers->Position!=Principal_File_list_Position) + { + // Si c'est le cas, il faut mettre … jour la jauge + Scroller_de_fichiers->Position=Principal_File_list_Position; + Fenetre_Dessiner_jauge(Scroller_de_fichiers); + } + // On r‚cup‚re le nom du schmilblick … "acc‚der" + Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier); + if (strcmp(Ancien_nom_de_fichier,Principal_Nom_fichier)) + Nouvelle_preview=1; + + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + Afficher_curseur(); +} + + +short Position_fichier_dans_liste(char * Nom) +{ + struct Element_de_liste_de_fileselect * Element_courant; + short Indice; + + for (Indice=0, Element_courant=Liste_du_fileselect; + ((Element_courant!=NULL) && (strcmp(Element_courant->Nom,Nom))); + Indice++,Element_courant=Element_courant->Suivant); + + return (Element_courant!=NULL)?Indice:0; +} + + +void Placer_barre_de_selection_sur(char * Nom) +{ + short Indice; + + Indice=Position_fichier_dans_liste(Nom); + + if ((Liste_Nb_elements<=10) || (Indice<5)) + { + Principal_File_list_Position=0; + Principal_File_list_Decalage=Indice; + } + else + { + if (Indice>=Liste_Nb_elements-5) + { + Principal_File_list_Position=Liste_Nb_elements-10; + Principal_File_list_Decalage=Indice-Principal_File_list_Position; + } + else + { + Principal_File_list_Position=Indice-4; + Principal_File_list_Decalage=4; + } + } +} + + +char FFF_Meilleur_nom[13]; +char * Nom_correspondant_le_mieux_a(char * Nom) +{ + char Nom_courant[13]; + char * Pointeur1; + char * Pointeur2; + char * Pointeur_Meilleur_nom; + struct Element_de_liste_de_fileselect * Element_courant; + byte Lettres_identiques=0; + byte Compteur; + + strcpy(FFF_Meilleur_nom,Principal_Nom_fichier); + Pointeur_Meilleur_nom=NULL; + + for (Element_courant=Liste_du_fileselect; Element_courant!=NULL; Element_courant=Element_courant->Suivant) + { + if ( (!Config.Find_file_fast) + || (Config.Find_file_fast==(Element_courant->Type+1)) ) + { + // On copie le nom de la liste en cours de traitement dans Nom_courant + // tout en le remettant sous forme normale. + for (Pointeur1=Element_courant->Nom,Pointeur2=Nom_courant;*Pointeur1;Pointeur1++) + if (*Pointeur1!=' ') + *(Pointeur2++)=*Pointeur1; + *Pointeur2=0; + // On compare et si c'est mieux, on stocke dans Meilleur_nom + for (Compteur=0; Nom_courant[Compteur]==Nom[Compteur]; Compteur++); + if (Compteur>Lettres_identiques) + { + Lettres_identiques=Compteur; + strcpy(FFF_Meilleur_nom,Nom_courant); + Pointeur_Meilleur_nom=Element_courant->Nom; + } + } + } + + return Pointeur_Meilleur_nom; +} + + +byte Bouton_Load_ou_Save(byte Load, byte Image) + // Load=1 => On affiche le menu du bouton LOAD + // Load=0 => On affiche le menu du bouton SAVE +{ + short Bouton_clicke; + struct Fenetre_Bouton_scroller * Scroller_de_fichiers; + short Temp; + unsigned Bidon=0; // Sert … appeler _dos_setdrive + word Drives_Debut_Y; + byte Charger_ou_sauver_l_image=0; + char Nom_drive[3]=" "; + byte On_a_clicke_sur_OK=0;// Indique si on a click‚ sur Load ou Save ou sur + //un bouton enclenchant Load ou Save juste aprŠs. + struct Composantes * Palette_initiale; // | Donn‚es concernant l'image qui + byte Image_modifiee_initiale; // | sont m‚moris‚es pour pouvoir + short Largeur_image_initiale; // |- ˆtre restaur‚es en sortant, + short Hauteur_image_initiale; // | parce que la preview elle les + byte Back_color_initiale; // | fout en l'air (c'te conne). + char Nom_fichier_initial[13]; // Sert … laisser le nom courant du fichier en cas de sauvegarde + char Repertoire_precedent[13]; // R‚pertoire d'o— l'on vient aprŠs un CHDIR + char Commentaire_initial[TAILLE_COMMENTAIRE+1]; + char Fichier_recherche[13]=""; + char * Fichier_le_plus_ressemblant; + + Palette_initiale=(struct Composantes *)malloc(sizeof(T_Palette)); + memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette)); + + Back_color_initiale=Back_color; + Image_modifiee_initiale=Principal_Image_modifiee; + Largeur_image_initiale=Principal_Largeur_image; + Hauteur_image_initiale=Principal_Hauteur_image; + strcpy(Nom_fichier_initial,Principal_Nom_fichier); + strcpy(Commentaire_initial,Principal_Commentaire); + if (Load) + { + if (Image) + Ouvrir_fenetre(310,190,"Load picture"); + else + Ouvrir_fenetre(310,190,"Load brush"); + Fenetre_Definir_bouton_normal(125,157,51,14,"Load",0,1,0x001C); // 1 + } + else + { + if (Image) + Ouvrir_fenetre(310,190,"Save picture"); + else + Ouvrir_fenetre(310,190,"Save brush"); + Fenetre_Definir_bouton_normal(125,157,51,14,"Save",0,1,0x001C); // 1 + if (Principal_Format==0) // Correction du *.* + { + Principal_Format=Principal_Format_fichier; + Principal_File_list_Position=0; + Principal_File_list_Decalage=0; + } + + if (Principal_Format>NB_FORMATS_SAVE) // Correction d'un format insauvable + { + Principal_Format=FORMAT_PAR_DEFAUT; + Principal_File_list_Position=0; + Principal_File_list_Decalage=0; + } + // Affichage du commentaire + if (Format_Commentaire[Principal_Format-1]) + Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); + } + + Fenetre_Definir_bouton_normal(125,139,51,14,"Cancel",0,1,0x0001); // 2 + Fenetre_Definir_bouton_normal(125, 89,51,14,"Delete",0,1,0x0053); // 3 + + // Cƒdre autour des formats + Fenetre_Afficher_cadre( 7, 51,103, 35); + // Cƒdre autour des infos sur le fichier de dessin + Fenetre_Afficher_cadre(116, 51,187, 35); + // Cƒdre autour de la preview + Fenetre_Afficher_cadre_creux(179,88,124,84); + // Cƒdre autour du fileselector + Fenetre_Afficher_cadre_creux( 7,88,100,84); + + Fenetre_Definir_bouton_special(9,90,96,80); // 4 + + // Scroller du fileselector + Fenetre_Definir_bouton_scroller(110,89,82,1,10,0); // 5 + Scroller_de_fichiers=Fenetre_Liste_boutons_scroller; + + // Scroller des formats + Fenetre_Definir_bouton_scroller(12,55,27,(Load)?NB_FORMATS_LOAD+1:NB_FORMATS_SAVE,1,(Load)?Principal_Format:Principal_Format-1); // 6 + + // Texte de commentaire des dessins + Print_dans_fenetre(7,176,"Txt:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(44,174,TAILLE_COMMENTAIRE); // 7 + + // Saisie du nom de fichier + Fenetre_Definir_bouton_saisie(200,71,12); // 8 + + Print_dans_fenetre( 27,65,"Format:",CM_Fonce,CM_Clair); + Print_dans_fenetre(120,55,"Image size :",CM_Fonce,CM_Clair); + Print_dans_fenetre(120,63,"File size :",CM_Fonce,CM_Clair); + Print_dans_fenetre(120,73,"File name:",CM_Fonce,CM_Clair); + + Print_Format(); + + // D‚finition des boutons repr‚sentant les lecteurs + Drives_Debut_Y=(Nb_drives<=13)? 23 : 18; + for (Temp=0; Temp=Liste_Nb_repertoires) + { + Print_dans_fenetre(127,107,"Delete",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,115,"file ?",CM_Fonce,CM_Clair); + } + else + { + Print_dans_fenetre(127,107,"Remove",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,115,"dir. ?",CM_Fonce,CM_Clair); + } + Print_dans_fenetre(127,123,"Yes/No",CM_Fonce,CM_Clair); + + do + { + puts("boutons.c 2454\n"); + //Etat_Du_Clavier=SDL_GetKeyState(Bidon); + } while ((Etat_Du_Clavier[SDLK_y]==0) && (Etat_Du_Clavier[SDLK_n]==0) && (Etat_Du_Clavier[SDLK_ESCAPE]==0)); + + // On efface la demande de confirmation + Block(Fenetre_Pos_X+127*Menu_Facteur_X,Fenetre_Pos_Y+107*Menu_Facteur_Y, + Menu_Facteur_X*48,Menu_Facteur_Y*24,CM_Clair); + + // Si l'utilisateur confirme, + if (Touche=='Y') + { + // Si c'est un fichier + if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) + // On efface le fichier (si on peut) + Temp=(!remove(Principal_Nom_fichier)); + else // Si c'est un repertoire + // On efface le repertoire (si on peut) + Temp=(!rmdir(Principal_Nom_fichier)); + + if (Temp) // Temp indique si l'effacement s'est bien pass‚ + { + // On remonte si c'‚tait le dernier ‚l‚ment de la liste + if (Principal_File_list_Position+Principal_File_list_Decalage==Liste_Nb_elements-1) + { + if (Principal_File_list_Position) + Principal_File_list_Position--; + else + if (Principal_File_list_Decalage) + Principal_File_list_Decalage--; + } + else // Si ce n'‚tait pas le dernier, il faut faire gaffe … ce + { // que ses copains d'en dessous ne remontent pas trop. + if ( (Principal_File_list_Position) + && (Principal_File_list_Position+10==Liste_Nb_elements) ) + { + Principal_File_list_Position--; + Principal_File_list_Decalage++; + } + } + // On relit les informations + Relire_liste_fichiers(Principal_Format,Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + // On demande la preview du nouveau fichier sur lequel on se trouve + Nouvelle_preview=1; + } + else + Erreur(0); + + // On place la barre de s‚lection du brouillon au d‚but s'il a le + // mˆme r‚pertoire que l'image principale. + if (!strcmp(Principal_Repertoire_courant,Brouillon_Repertoire_courant)) + { + Brouillon_File_list_Position=0; + Brouillon_File_list_Decalage=0; + } + } + Afficher_curseur(); + } + break; + + case 4 : // Zone d'affichage de la liste de fichiers + Effacer_curseur(); + + Temp=Calculer_decalage_click_dans_fileselector(); + if (Temp>=0) + { + if (Temp!=Principal_File_list_Decalage) + { + // On met … jour le d‚calage + Principal_File_list_Decalage=Temp; + + // On r‚cup‚re le nom du schmilblick … "acc‚der" + Determiner_element_de_la_liste(Principal_File_list_Position,Principal_File_list_Decalage,Principal_Nom_fichier); + // On affiche le nouveau nom de fichier + Print_Nom_fichier_dans_selecteur(); + // On affiche … nouveau la liste + Afficher_la_liste_des_fichiers(Principal_File_list_Position,Principal_File_list_Decalage); + + // On vient de changer de nom de fichier, donc on doit s'appreter + // a rafficher une preview + Nouvelle_preview=1; + } + else + { + // En sauvegarde, si on a double-click‚ sur un r‚pertoire, il + // faut mettre le nom de fichier au nom du r‚pertoire. Sinon, dans + // certains cas, on risque de sauvegarder avec le nom du fichier + // actuel au lieu de changer de r‚pertoire. + if (Principal_File_list_Position+Principal_File_list_Decalage On se place sur le nom de fichier qui correspond - if (Bouton_clicke<=0) - { - Temp=strlen(Fichier_recherche); - if (Temp<12) - { - Fichier_recherche[Temp]=toupper(Touche_ASCII); - Fichier_recherche[Temp+1]=0; - Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche); - if ( (Fichier_le_plus_ressemblant) - && (!memcmp(Fichier_recherche,FFF_Meilleur_nom,Temp+1)) ) - { - Temp=Principal_File_list_Position+Principal_File_list_Decalage; - Effacer_curseur(); - Placer_barre_de_selection_sur(Fichier_le_plus_ressemblant); - Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - Afficher_curseur(); - if (Temp!=Principal_File_list_Position+Principal_File_list_Decalage) - Nouvelle_preview=1; - } - else - Fichier_recherche[Temp]=0; - } - } - else - *Fichier_recherche=0; - } - - if (On_a_clicke_sur_OK) - { - // Si c'est un r‚pertoire, on annule "On_a_clicke_sur_OK" et on passe - // dedans. - if (Repertoire_existe(Principal_Nom_fichier)) - { - Effacer_curseur(); - On_a_clicke_sur_OK=0; - - // On m‚morise le r‚pertoire dans lequel on ‚tait - if (strcmp(Principal_Nom_fichier,"..")) - strcpy(Repertoire_precedent,Nom_formate("..")); - else - { - for (Temp=strlen(Principal_Repertoire_courant); - (Temp>0) && (Principal_Repertoire_courant[Temp-1]!='\\'); - Temp--); - strcpy(Repertoire_precedent,Nom_formate(Principal_Repertoire_courant+Temp)); - } - - // On doit rentrer dans le r‚pertoire: - chdir(Principal_Nom_fichier); - Determiner_repertoire_courant(); - - // On lit le nouveau r‚pertoire - Lire_liste_des_fichiers(Principal_Format); - Trier_la_liste_des_fichiers(); - // On place la barre de s‚lection sur le r‚pertoire d'o— l'on vient - Placer_barre_de_selection_sur(Repertoire_precedent); - // Affichage des premiers fichiers visibles: - Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); - Afficher_curseur(); - Nouvelle_preview=1; - } - else // Sinon on essaye de charger ou sauver le fichier - { - strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); - if (!Load) - Principal_Format_fichier=Principal_Format; - Charger_ou_sauver_l_image=1; - } - } - - // Gestion du chrono et des previews - if (Nouvelle_preview) - { - // On efface les infos de la preview pr‚c‚dente s'il y en a une - // d'affich‚e - if (Etat_chrono==2) - { - Effacer_curseur(); - // On efface le "but is:" - Block(Fenetre_Pos_X+27*Menu_Facteur_X,Fenetre_Pos_Y+74*Menu_Facteur_Y, - Menu_Facteur_X*80,Menu_Facteur_Y<<3,CM_Clair); - // On efface le commentaire pr‚c‚dent - Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+176*Menu_Facteur_Y, - Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair); - // On n‚ttoie la zone o— va s'afficher la preview: - Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ 89*Menu_Facteur_Y, - Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair); - // On efface les dimensions de l'image - Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y, - Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); - // On efface la taille du fichier - Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y, - Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); - // Affichage du commentaire - if ( (!Load) && (Format_Commentaire[Principal_Format-1]) ) - Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); - Afficher_curseur(); - } - - Nouvelle_preview=0; - Etat_chrono=0; // Etat du chrono = Attente d'un XŠme de seconde - // On lit le temps de d‚part du chrono - Initialiser_chrono(Config.Chrono_delay); - } - - if (!Etat_chrono) // Prendre une nouvelle mesure du chrono et regarder - Tester_chrono(); // s'il ne faut pas afficher la preview - - if (Etat_chrono==1) // Il faut afficher la preview - { - if ( (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) && (Liste_Nb_elements) ) - { - strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); - - Effacer_curseur(); - Charger_image(Image); - Afficher_curseur(); - - // AprŠs le chargement de la preview, on restaure tout ce qui aurait - // pu ˆtre modifi‚ par le chargement de l'image: - memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); - Principal_Image_modifiee=Image_modifiee_initiale; - Principal_Largeur_image=Largeur_image_initiale; - Principal_Hauteur_image=Hauteur_image_initiale; - } - - Etat_chrono=2; // On arrˆte le chrono - } - } - while ( (!On_a_clicke_sur_OK) && (Bouton_clicke!=2) ); - - // Si on annule, on restaure l'ancien commentaire - if (Bouton_clicke==2) - strcpy(Principal_Commentaire,Commentaire_initial); - - // On restaure les donn‚es de l'image qui ont certainement ‚t‚ modifi‚es - // par la preview. - memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); - Back_color=Back_color_initiale; - Principal_Image_modifiee=Image_modifiee_initiale; - Principal_Largeur_image=Largeur_image_initiale; - Principal_Hauteur_image=Hauteur_image_initiale; - Set_palette(Principal_Palette); - - Calculer_couleurs_menu_optimales(Principal_Palette); - Temp=(Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y)1024) || (Ecran_original_Y>768)) - { - Ecran_original_X=1024; - Ecran_original_Y=768; - } - - // Maintenant on peut chercher le mode qui correspond le mieux - Meilleur_mode=Resolution_actuelle; - Meilleure_largeur=0; - Meilleure_hauteur=0; - - - for (Mode=MODE_320_200; Mode<=MODE_1024_768; Mode++) - { - if (Mode_video[Mode].Etat<2) - { - Temp_X=Mode_video[Mode].Largeur; - Temp_Y=Mode_video[Mode].Hauteur; - - if ( (Ecran_original_X-TOLERANCE_X<=Temp_X) - && (Ecran_original_Y-TOLERANCE_Y<=Temp_Y) ) - return Mode; - else - { - if ( (Meilleure_largeur<=Temp_X) - && (Meilleure_hauteur<=Temp_Y) - && (Temp_X-TOLERANCE_X<=Ecran_original_X) - && (Temp_Y-TOLERANCE_Y<=Ecran_original_Y) ) - { - Meilleure_largeur=Temp_X; - Meilleure_hauteur=Temp_Y; - Meilleur_mode=Mode; - } - } - } - } - - return Meilleur_mode; -} - - -void Swapper_infos_selecteurs_image_et_brosse(void) -{ - char Chaine_temporaire[256]; - byte Octet_temporaire; - short Entier_temporaire; - - - strcpy(Chaine_temporaire ,Brosse_Repertoire_fichier); - strcpy(Brosse_Repertoire_fichier ,Principal_Repertoire_fichier); - strcpy(Principal_Repertoire_fichier,Chaine_temporaire); - - strcpy(Chaine_temporaire ,Brosse_Nom_fichier); - strcpy(Brosse_Nom_fichier ,Principal_Nom_fichier); - strcpy(Principal_Nom_fichier,Chaine_temporaire); - - Octet_temporaire =Brosse_Format_fichier; - Brosse_Format_fichier =Principal_Format_fichier; - Principal_Format_fichier=Octet_temporaire; - - Octet_temporaire=Brosse_Format; - Brosse_Format =Principal_Format; - Principal_Format=Octet_temporaire; - - Entier_temporaire =Brosse_File_list_Position; - Brosse_File_list_Position =Principal_File_list_Position; - Principal_File_list_Position=Entier_temporaire; - - Entier_temporaire =Brosse_File_list_Decalage; - Brosse_File_list_Decalage =Principal_File_list_Decalage; - Principal_File_list_Decalage=Entier_temporaire; - - strcpy(Chaine_temporaire ,Brosse_Repertoire_courant); - strcpy(Brosse_Repertoire_courant ,Principal_Repertoire_courant); - strcpy(Principal_Repertoire_courant,Chaine_temporaire); - - strcpy(Chaine_temporaire ,Brosse_Commentaire); - strcpy(Brosse_Commentaire ,Principal_Commentaire); - strcpy(Principal_Commentaire,Chaine_temporaire); -} - - -void Load_picture(byte Image) - // Image=1 => On charge/sauve une image - // Image=0 => On charge/sauve une brosse -{ - // Donn‚es initiales du fichier (au cas o— on voudrait annuler) - char Repertoire_fichier_initial[256]; - char Nom_fichier_initial[13]; - byte Format_fichier_initial; - byte Ne_pas_restaurer; - byte Utiliser_palette_brosse; - struct Composantes * Palette_initiale=NULL; - byte Ancienne_forme_curseur; - short Principal_Largeur_image_initiale=Principal_Largeur_image; - short Principal_Hauteur_image_initiale=Principal_Hauteur_image; - //char Commentaire_initial[TAILLE_COMMENTAIRE+1]; - int Nouveau_mode; - - - if (!Image) - Swapper_infos_selecteurs_image_et_brosse(); - - strcpy(Repertoire_fichier_initial,Principal_Repertoire_fichier); - strcpy(Nom_fichier_initial ,Principal_Nom_fichier); - Format_fichier_initial=Principal_Format_fichier; - - if (!Image) - { - Palette_initiale=(struct Composantes *)malloc(sizeof(T_Palette)); - memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette)); - } - - Ne_pas_restaurer=Bouton_Load_ou_Save(1,Image); - - if (Ne_pas_restaurer) - { - if (Image) - { - if (Principal_Image_modifiee) - Ne_pas_restaurer=Demande_de_confirmation("Discard unsaved changes?"); - } - else - Utiliser_palette_brosse=Demande_de_confirmation("Use the palette of the brush?"); - } - - if (Ne_pas_restaurer) - { - Ancienne_forme_curseur=Forme_curseur; - Effacer_curseur(); - Forme_curseur=FORME_CURSEUR_SABLIER; - Afficher_curseur(); - - if (Image) - { - // Si c'est une image qu'on charge, on efface l'ancien commentaire - // C'est loin d'ˆtre indispensable, m'enfin bon... - if (Format_Backup_done[Principal_Format_fichier-1]) - Principal_Commentaire[0]='\0'; - - Ecran_original_X=0; - Ecran_original_Y=0; - } - else - Pixel_de_chargement=Pixel_Chargement_dans_brosse; - - Charger_image(Image); - - if (!Image) - { - if (!Utiliser_palette_brosse) - memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); - - if (Erreur_fichier==3) // On ne peut pas allouer la brosse - { - if (Brosse) free(Brosse); - Brosse=(byte *)malloc(1*1); - Brosse_Hauteur=1; - Brosse_Largeur=1; - *Brosse=Fore_color; - - if (Smear_Brosse) free(Smear_Brosse); - Smear_Brosse=(byte *)malloc(TAILLE_MAXI_PINCEAU*TAILLE_MAXI_PINCEAU); - Smear_Brosse_Hauteur=TAILLE_MAXI_PINCEAU; - Smear_Brosse_Largeur=TAILLE_MAXI_PINCEAU; - } - else - { - Brosse_Largeur=Principal_Largeur_image; - Brosse_Hauteur=Principal_Hauteur_image; - Smear_Brosse_Largeur=(Brosse_Largeur>TAILLE_MAXI_PINCEAU)?Brosse_Largeur:TAILLE_MAXI_PINCEAU; - Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; - } - - Tiling_Decalage_X=0; - Tiling_Decalage_Y=0; - - Brosse_Decalage_X=(Brosse_Largeur>>1); - Brosse_Decalage_Y=(Brosse_Hauteur>>1); - - Principal_Largeur_image=Principal_Largeur_image_initiale; - Principal_Hauteur_image=Principal_Hauteur_image_initiale; - Pixel_de_chargement=Pixel_Chargement_dans_ecran_courant; - - Enclencher_bouton(BOUTON_DESSIN,A_GAUCHE); - if (Config.Auto_discontinuous) - { - // On se place en mode Dessin discontinu … la main - while (Operation_en_cours!=OPERATION_DESSIN_DISCONTINU) - Enclencher_bouton(BOUTON_DESSIN,A_DROITE); - } - Effacer_curseur(); - // On passe en brosse couleur: - Changer_la_forme_du_pinceau(FORME_PINCEAU_BROSSE_COULEUR); - } - else - { - Effacer_curseur(); - Forme_curseur=Ancienne_forme_curseur; - } - - if ( (Erreur_fichier==1) || (!Format_Backup_done[Principal_Format_fichier-1]) ) - { - Ne_pas_restaurer=0; - if (Erreur_fichier!=1) - Calculer_couleurs_menu_optimales(Principal_Palette); - } - else - { - if (Image) - { - if (Loupe_Mode) - { - Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,0); - Pixel_Preview=Pixel_Preview_Normal; - Loupe_Mode=0; - } - - Nouveau_mode=Meilleur_mode_video(); - if ((Config.Auto_set_res) && (Nouveau_mode!=Resolution_actuelle)) - { - Initialiser_mode_video(Nouveau_mode); - Afficher_menu(); - } - else - { - Principal_Decalage_X=0; - Principal_Decalage_Y=0; - Calculer_limites(); - Calculer_coordonnees_pinceau(); - } - } - - Calculer_couleurs_menu_optimales(Principal_Palette); - Afficher_ecran(); - - if (Image) - Principal_Image_modifiee=0; - } - Afficher_menu(); - Afficher_curseur(); - } - - if (!Image) - free(Palette_initiale); - - if (!Ne_pas_restaurer) - { - strcpy(Principal_Nom_fichier ,Nom_fichier_initial); - strcpy(Principal_Repertoire_fichier,Repertoire_fichier_initial); - Principal_Format_fichier =Format_fichier_initial; - } - - if (!Image) - Swapper_infos_selecteurs_image_et_brosse(); - - Print_nom_fichier(); - Set_palette(Principal_Palette); -} - - -void Bouton_Load(void) -{ - // On sauve l'‚tat actuel des paramŠtres de l'image pour pouvoir les - // restituer en cas d'erreur n'affectant pas l'image - Upload_infos_page_principal(Principal_Backups->Pages); - - Load_picture(1); -} - - -void Bouton_Reload(void) -{ - byte Ancienne_forme_curseur; - int Nouveau_mode; - - // On sauve l'‚tat actuel des paramŠtres de l'image pour pouvoir les - // restituer en cas d'erreur n'affectant pas l'image - Upload_infos_page_principal(Principal_Backups->Pages); - - if ( (!Principal_Image_modifiee) || Demande_de_confirmation("Discard unsaved changes ?") ) - { - Effacer_curseur(); - Ancienne_forme_curseur=Forme_curseur; - Forme_curseur=FORME_CURSEUR_SABLIER; - Afficher_curseur(); - - Ecran_original_X=0; - Ecran_original_Y=0; - Charger_image(1); - - Effacer_curseur(); - Forme_curseur=Ancienne_forme_curseur; - - if (Erreur_fichier!=1) - { - if (Loupe_Mode) - { - Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,0); - Pixel_Preview=Pixel_Preview_Normal; - Loupe_Mode=0; - } - - Nouveau_mode=Meilleur_mode_video(); - if ( ((Config.Auto_set_res) && (Nouveau_mode!=Resolution_actuelle)) && - (!Une_resolution_a_ete_passee_en_parametre) ) - { - Initialiser_mode_video(Nouveau_mode); - Afficher_menu(); - } - else - { - Principal_Decalage_X=0; - Principal_Decalage_Y=0; - Calculer_limites(); - Calculer_coordonnees_pinceau(); - } - - Afficher_ecran(); - - Principal_Image_modifiee=0; - } - } - else - Effacer_curseur(); - - Calculer_couleurs_menu_optimales(Principal_Palette); - Afficher_menu(); - if (Config.Afficher_limites_image) - Afficher_limites_de_l_image(); - - Desenclencher_bouton(BOUTON_CHARGER); - - Afficher_curseur(); -} - - -void Nom_fichier_backup(char * Nom, char * Nom_backup) -{ - short Curseur; - - strcpy(Nom_backup,Nom); - for (Curseur=strlen(Nom)-strlen(Principal_Nom_fichier); Nom_backup[Curseur]!='.'; Curseur++); - Nom_backup[Curseur+1]='\0'; - strcat(Nom_backup,"BAK"); -} - - -void Backup_du_fichier_sauvegarde(void) -{ - char Nom_du_fichier[256]; // Nom complet du fichier - char Nouveau_nom_du_fichier[256]; // Nom complet du fichier backup - - Nom_fichier_complet(Nom_du_fichier,0); - // Calcul du nom complet du fichier backup - Nom_fichier_backup(Nom_du_fichier,Nouveau_nom_du_fichier); - - Erreur_fichier=0; - - // On fait un backup si le nom du fichier n'est pas celui qu'on a choisi - // pour nommer les backups (c'est ‚vident!). - if (strcmp(Nouveau_nom_du_fichier,Nom_du_fichier)) - { - // S'il y avait d‚j… un fichier Backup, on l'efface - if ((Fichier_existe(Nouveau_nom_du_fichier)) - && (remove(Nouveau_nom_du_fichier)!=0)) - Erreur_fichier=1; - - if ((!Erreur_fichier) - && (rename(Nom_du_fichier,Nouveau_nom_du_fichier)!=0)) - Erreur_fichier=1; - } -} - - -void Save_picture(byte Image) - // Image=1 => On charge/sauve une image - // Image=0 => On charge/sauve une brosse -{ - // Donn‚es initiales du fichier (au cas o— on voudrait annuler) - char Repertoire_fichier_initial[256]; - char Nom_fichier_initial[13]; - byte Format_fichier_initial; - byte Ne_pas_restaurer; - byte Ancienne_forme_curseur; - short Principal_Largeur_image_Backup=Principal_Largeur_image; - short Principal_Hauteur_image_Backup=Principal_Hauteur_image; - //char Commentaire_initial[TAILLE_COMMENTAIRE+1]; - - - if (!Image) - Swapper_infos_selecteurs_image_et_brosse(); - - strcpy(Repertoire_fichier_initial,Principal_Repertoire_fichier); - strcpy(Nom_fichier_initial ,Principal_Nom_fichier); - Format_fichier_initial=Principal_Format_fichier; - - Ne_pas_restaurer=Bouton_Load_ou_Save(0,Image); - - if (Ne_pas_restaurer && Fichier_existe(Principal_Nom_fichier)) - { - Ne_pas_restaurer=Demande_de_confirmation("Erase old file ?"); - if ((Ne_pas_restaurer) && (Config.Backup)) - { - Backup_du_fichier_sauvegarde(); - if (Erreur_fichier) - { - Ne_pas_restaurer=0; - Erreur(0); - } - } - } - - if (Ne_pas_restaurer) - { - Ancienne_forme_curseur=Forme_curseur; - Effacer_curseur(); - Forme_curseur=FORME_CURSEUR_SABLIER; - Afficher_curseur(); - - if (Image) - Sauver_image(Image); - else - { - Principal_Largeur_image=Brosse_Largeur; - Principal_Hauteur_image=Brosse_Hauteur; - Sauver_image(Image); - Principal_Largeur_image=Principal_Largeur_image_Backup; - Principal_Hauteur_image=Principal_Hauteur_image_Backup; - } - - Effacer_curseur(); - Forme_curseur=Ancienne_forme_curseur; - - if ((Erreur_fichier==1) || (!Format_Backup_done[Principal_Format_fichier-1])) - Ne_pas_restaurer=0; - - Afficher_curseur(); - } - - if (!Ne_pas_restaurer) - { - strcpy(Principal_Nom_fichier ,Nom_fichier_initial); - strcpy(Principal_Repertoire_fichier,Repertoire_fichier_initial); - Principal_Format_fichier =Format_fichier_initial; - } - - if (!Image) - Swapper_infos_selecteurs_image_et_brosse(); - - Print_nom_fichier(); - Set_palette(Principal_Palette); -} - - -void Bouton_Save(void) -{ - Save_picture(1); -} - - -void Bouton_Autosave(void) -{ - byte Ancienne_forme_curseur; - char Nom_du_fichier[256]; - byte Le_fichier_existe; - - - Nom_fichier_complet(Nom_du_fichier,0); - Le_fichier_existe=Fichier_existe(Nom_du_fichier); - - if ( (!Le_fichier_existe) || Demande_de_confirmation("Erase old file ?") ) - { - if ((Le_fichier_existe) && (Config.Backup)) - Backup_du_fichier_sauvegarde(); - else - Erreur_fichier=0; - - Effacer_curseur(); - - if (!Erreur_fichier) - { - Ancienne_forme_curseur=Forme_curseur; - Forme_curseur=FORME_CURSEUR_SABLIER; - Afficher_curseur(); - - Sauver_image(1); - - Effacer_curseur(); - Forme_curseur=Ancienne_forme_curseur; - } - else - Erreur(0); - } - else - Effacer_curseur(); - - Desenclencher_bouton(BOUTON_SAUVER); - - Afficher_curseur(); -} - - -// -- Gestion des boutons de ligne ------------------------------------------ - -void Bouton_Lignes(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(Ligne_en_cours); - Afficher_curseur(); -} - - -void Bouton_Lignes_Switch_mode(void) -{ - if (Ligne_en_cours==OPERATION_LIGNE) - Ligne_en_cours=OPERATION_K_LIGNE; - else - { - if (Ligne_en_cours==OPERATION_K_LIGNE) - Ligne_en_cours=OPERATION_LIGNES_CENTREES; - else - Ligne_en_cours=OPERATION_LIGNE; - } - - Effacer_curseur(); - Afficher_sprite_dans_menu(BOUTON_LIGNES,Ligne_en_cours-OPERATION_LIGNE+6); - Demarrer_pile_operation(Ligne_en_cours); - Afficher_curseur(); -} - - -// -- Bouton de brosse ------------------------------------------------------ - -void Bouton_Brosse(void) -{ - Effacer_curseur(); - - if (Operation_en_cours!=OPERATION_PRISE_BROSSE) - Demarrer_pile_operation(OPERATION_PRISE_BROSSE); - else - Desenclencher_bouton(BOUTON_BROSSE); - - Afficher_curseur(); -} - - -void Bouton_desenclencher_Brosse(void) -{ - // On fait de notre mieux pour restaurer l'ancienne op‚ration: - Demarrer_pile_operation(Operation_avant_interruption); -} - - -void Bouton_Restaurer_brosse(void) -{ - Effacer_curseur(); - // On passe en brosse couleur: - Changer_la_forme_du_pinceau(FORME_PINCEAU_BROSSE_COULEUR); - - Desenclencher_bouton(BOUTON_BROSSE); - Desenclencher_bouton(BOUTON_POLYBROSSE); - - Afficher_curseur(); -} - - -// -- Bouton de prise de brosse au lasso ------------------------------------ - -void Bouton_Lasso(void) -{ - Effacer_curseur(); - - if (Operation_en_cours!=OPERATION_POLYBROSSE) - { - Pinceau_Forme_avant_lasso=Pinceau_Forme; - Pinceau_Forme=FORME_PINCEAU_POINT; - Demarrer_pile_operation(OPERATION_POLYBROSSE); - } - else - Desenclencher_bouton(BOUTON_POLYBROSSE); - - Afficher_curseur(); -} - - -void Bouton_desenclencher_Lasso(void) -{ - // On fait de notre mieux pour restaurer l'ancienne op‚ration: - Demarrer_pile_operation(Operation_avant_interruption); - Pinceau_Forme=Pinceau_Forme_avant_lasso; -} - - -// -- Bouton de pipette ----------------------------------------------------- - -void Bouton_Pipette(void) -{ - Effacer_curseur(); - - if (Operation_en_cours!=OPERATION_PIPETTE) - { - Pipette_Couleur=-1; - Demarrer_pile_operation(OPERATION_PIPETTE); - Pinceau_Forme_avant_pipette=Pinceau_Forme; - Pinceau_Forme=FORME_PINCEAU_POINT; - if (Operation_avant_interruption!=OPERATION_REMPLACER) - if ( (Mouse_Y=Principal_X_Zoom) ) ) - Print_dans_menu("X: Y: ( )",0); - } - else - Desenclencher_bouton(BOUTON_PIPETTE); - - Afficher_curseur(); -} - - -void Bouton_desenclencher_Pipette(void) -{ - if (Operation_avant_interruption!=OPERATION_REMPLACER) - if ( (Mouse_Y=Principal_X_Zoom) ) ) - Print_dans_menu("X: Y: ",0); - - // On fait de notre mieux pour restaurer l'ancienne op‚ration: - if (Operation_en_cours==OPERATION_PIPETTE) - { - Demarrer_pile_operation(Operation_avant_interruption); - Pinceau_Forme=Pinceau_Forme_avant_pipette; - } -} - - - // -- Inversion de la couleur Fore et de la couleur Back -- -void Bouton_Inverser_foreback(void) -{ - byte Couleur_temporaire; - - Effacer_curseur(); - - Encadrer_couleur_menu(CM_Noir); - - Couleur_temporaire=Fore_color; - Fore_color =Back_color; - Back_color =Couleur_temporaire; - - Recadrer_palette(); - - Encadrer_couleur_menu(CM_Blanc); - - Afficher_foreback(); - Desenclencher_bouton(BOUTON_PIPETTE); - - Afficher_curseur(); -} - - -// -- Gestion du bouton Loupe ----------------------------------------------- - -byte On_vient_du_menu_de_facteurs_de_zoom=0; - -void Bouton_Loupe(void) -{ - Effacer_curseur(); - if ( (Operation_en_cours==OPERATION_LOUPE) || (Loupe_Mode) ) - { - Desenclencher_bouton(BOUTON_LOUPE); - } - else - { - Ancien_Principal_Decalage_X=Principal_Decalage_X; - Ancien_Principal_Decalage_Y=Principal_Decalage_Y; - Calculer_donnees_loupe(); - if ((!Config.Fast_zoom) || (Mouse_Y>=Menu_Ordonnee) || On_vient_du_menu_de_facteurs_de_zoom) - { - On_vient_du_menu_de_facteurs_de_zoom=0; - Demarrer_pile_operation(OPERATION_LOUPE); - } - else - { /* Ceci est de la duplication de code de presque toute l'op‚ration de */ - /* la loupe... Il serait peut-ˆtre plus propre de faire une proc‚dure */ - /* qui s'en charge... */ - // On passe en mode loupe - Loupe_Mode=1; - - // La fonction d'affichage dans la partie image est d‚sormais un affichage - // sp‚cial loupe. - Pixel_Preview=Pixel_Preview_Loupe; - - // On calcule l'origine de la loupe - Loupe_Decalage_X=Mouse_X-(Loupe_Largeur>>1); - Loupe_Decalage_Y=Mouse_Y-(Loupe_Hauteur>>1); - - // Calcul du coin haut_gauche de la fenˆtre devant ˆtre zoom‚e DANS L'ECRAN - if (Loupe_Decalage_X+Loupe_Largeur>=Limite_Droite-Principal_Decalage_X) - Loupe_Decalage_X=Limite_Droite-Loupe_Largeur-Principal_Decalage_X+1; - if (Loupe_Decalage_Y+Loupe_Hauteur>=Limite_Bas-Principal_Decalage_Y) - Loupe_Decalage_Y=Limite_Bas-Loupe_Hauteur-Principal_Decalage_Y+1; - - // Calcul des coordonn‚es absolues de ce coin DANS L'IMAGE - Loupe_Decalage_X+=Principal_Decalage_X; - Loupe_Decalage_Y+=Principal_Decalage_Y; - - if (Loupe_Decalage_X<0) - Loupe_Decalage_X=0; - if (Loupe_Decalage_Y<0) - Loupe_Decalage_Y=0; - - // On calcule les bornes visibles dans l'‚cran - Recadrer_ecran_par_rapport_au_zoom(); - Calculer_limites(); - Afficher_ecran(); - - // Repositionner le curseur en fonction des coordonn‚es visibles - Calculer_coordonnees_pinceau(); - } - } - Afficher_curseur(); -} - - -void Bouton_Menu_Loupe(void) -{ - short Bouton_clicke; - - Ouvrir_fenetre(141,114,"Zoom factors"); - - Fenetre_Definir_bouton_normal(45,88,51,14,"Cancel",0,1,0x0001); // 1 - - Fenetre_Definir_bouton_normal( 9,25,27,14, "x2",0,Loupe_Facteur!= 2,0x003B); // 2 - Fenetre_Definir_bouton_normal( 41,25,27,14, "x3",0,Loupe_Facteur!= 3,0x003C); // 3 - Fenetre_Definir_bouton_normal( 73,25,27,14, "x4",0,Loupe_Facteur!= 4,0x003D); // 4 - Fenetre_Definir_bouton_normal(105,25,27,14, "x5",0,Loupe_Facteur!= 5,0x003E); // 5 - Fenetre_Definir_bouton_normal( 9,45,27,14, "x6",0,Loupe_Facteur!= 6,0x003F); // 6 - Fenetre_Definir_bouton_normal( 41,45,27,14, "x8",0,Loupe_Facteur!= 8,0x0040); // 7 - Fenetre_Definir_bouton_normal( 73,45,27,14,"x10",0,Loupe_Facteur!=10,0x0041); // 8 - Fenetre_Definir_bouton_normal(105,45,27,14,"x12",0,Loupe_Facteur!=12,0x0042); // 9 - Fenetre_Definir_bouton_normal( 9,65,27,14,"x14",0,Loupe_Facteur!=14,0x0043); // 10 - Fenetre_Definir_bouton_normal( 41,65,27,14,"x16",0,Loupe_Facteur!=16,0x0044); // 11 - Fenetre_Definir_bouton_normal( 73,65,27,14,"x18",0,Loupe_Facteur!=18,0x0085); // 12 - Fenetre_Definir_bouton_normal(105,65,27,14,"x20",0,Loupe_Facteur!=20,0x0086); // 13 - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while (Bouton_clicke<=0); - - if (Bouton_clicke>1) - { - Menu_Ordonnee=Menu_Ordonnee_avant_fenetre; - Changer_facteur_loupe(Bouton_clicke-2); - } - - Fermer_fenetre(); - - if ( (Bouton_clicke==1) && (!Loupe_Mode) && (Operation_en_cours!=OPERATION_LOUPE) ) - Desenclencher_bouton(BOUTON_LOUPE); - - Afficher_curseur(); - - if ( (Bouton_clicke>1) && (!Loupe_Mode) && (Operation_en_cours!=OPERATION_LOUPE) ) - { - On_vient_du_menu_de_facteurs_de_zoom=1; - Enclencher_bouton(BOUTON_LOUPE,A_GAUCHE); - } -} - - -void Bouton_desenclencher_Loupe(void) -{ - if (Loupe_Mode) - { - // On sort du mode loupe - Loupe_Mode=0; - - /* - // --> Recalculer le d‚calage de l'‚cran lorsqu'on sort de la loupe <-- - // Centrage "brut" de l‚cran par rapport … la loupe - Principal_Decalage_X=Loupe_Decalage_X-((Largeur_ecran-Loupe_Largeur)>>1); - Principal_Decalage_Y=Loupe_Decalage_Y-((Menu_Ordonnee-Loupe_Hauteur)>>1); - */ - // Correction en cas de d‚bordement de l'image - if (Ancien_Principal_Decalage_X+Largeur_ecran>Principal_Largeur_image) - Principal_Decalage_X=Principal_Largeur_image-Largeur_ecran; - else - Principal_Decalage_X=Ancien_Principal_Decalage_X; - if (Principal_Decalage_X<0) - Principal_Decalage_X=0; - - if (Ancien_Principal_Decalage_Y+Menu_Ordonnee>Principal_Hauteur_image) - Principal_Decalage_Y=Principal_Hauteur_image-Menu_Ordonnee; - else - Principal_Decalage_Y=Ancien_Principal_Decalage_Y; - if (Principal_Decalage_Y<0) - Principal_Decalage_Y=0; - - // La fonction d'affichage dans l'image est d‚sormais un affichage normal. - Pixel_Preview=Pixel_Preview_Normal; - - // Calculer les bornes visibles dans l'‚cran - Calculer_limites(); - Afficher_ecran(); // <=> Display_screen(); - // Repositionner le curseur en fonction des coordonn‚es visibles - Calculer_coordonnees_pinceau(); - } - else // On fait de notre mieux pour restaurer l'ancienne op‚ration: - Demarrer_pile_operation(Operation_avant_interruption); -} - - -// -------------------------------- Grille ----------------------------------- - -void Bouton_Snap_Mode(void) -{ - Effacer_curseur(); - Snap_Mode=!Snap_Mode; - Calculer_coordonnees_pinceau(); - Afficher_curseur(); -} - - -void Bouton_Menu_Grille(void) -{ - short Bouton_clicke; - word X_choisi =Snap_Largeur; - word Y_choisi =Snap_Hauteur; - short dX_choisi=Snap_Decalage_X; - short dY_choisi=Snap_Decalage_Y; - - struct Fenetre_Bouton_special * Bouton_saisie_X; - struct Fenetre_Bouton_special * Bouton_saisie_Y; - struct Fenetre_Bouton_special * Bouton_saisie_dX; - struct Fenetre_Bouton_special * Bouton_saisie_dY; - - char Chaine[3]; - - - Ouvrir_fenetre(133,98,"Grid"); - - Fenetre_Definir_bouton_normal(12,72,51,14,"Cancel",0,1,0x0001); // 1 - Fenetre_Definir_bouton_normal(70,72,51,14,"OK" ,0,1,0x001C); // 2 - - Print_dans_fenetre(19,26, "X:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(37,24,2); // 3 - Bouton_saisie_X=Fenetre_Liste_boutons_special; - Num2str(X_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_X,Chaine); - - Print_dans_fenetre(19,47, "Y:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(37,45,2); // 4 - Bouton_saisie_Y=Fenetre_Liste_boutons_special; - Num2str(Y_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Y,Chaine); - - Print_dans_fenetre(69,26,"dX:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(95,24,2); // 5 - Bouton_saisie_dX=Fenetre_Liste_boutons_special; - Num2str(dX_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_dX,Chaine); - - Print_dans_fenetre(69,47,"dY:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(95,45,2); // 6 - Bouton_saisie_dY=Fenetre_Liste_boutons_special; - Num2str(dY_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_dY,Chaine); - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch (Bouton_clicke) - { - case 3 : - Effacer_curseur(); - Num2str(X_choisi,Chaine,2); - Readline(39,26,Chaine,2,1); - X_choisi=atoi(Chaine); - // On corrige les dimensions - if ((!X_choisi) || (X_choisi>80)) - { - if (!X_choisi) - X_choisi=1; - else - X_choisi=80; - Num2str(X_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_X,Chaine); - } - if (dX_choisi>=X_choisi) - { - dX_choisi=X_choisi-1; - Num2str(dX_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_dX,Chaine); - } - Afficher_curseur(); - break; - case 4 : - Effacer_curseur(); - Num2str(Y_choisi,Chaine,2); - Readline(39,47,Chaine,2,1); - Y_choisi=atoi(Chaine); - // On corrige les dimensions - if ((!Y_choisi) || (Y_choisi>80)) - { - if (!Y_choisi) - Y_choisi=1; - else - Y_choisi=80; - Num2str(Y_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Y,Chaine); - } - if (dY_choisi>=Y_choisi) - { - dY_choisi=Y_choisi-1; - Num2str(dY_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_dY,Chaine); - } - Afficher_curseur(); - break; - case 5 : - Effacer_curseur(); - Num2str(dX_choisi,Chaine,2); - Readline(97,26,Chaine,2,1); - dX_choisi=atoi(Chaine); - // On corrige les dimensions - if (dX_choisi>79) - dX_choisi=79; - if (dX_choisi>=X_choisi) - dX_choisi=X_choisi-1; - - Num2str(dX_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_dX,Chaine); - - Afficher_curseur(); - break; - case 6 : - Effacer_curseur(); - Num2str(dY_choisi,Chaine,2); - Readline(97,47,Chaine,2,1); - dY_choisi=atoi(Chaine); - // On corrige les dimensions - if (dY_choisi>79) - dY_choisi=79; - if (dY_choisi>=Y_choisi) - dY_choisi=Y_choisi-1; - - Num2str(dY_choisi,Chaine,2); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_dY,Chaine); - - Afficher_curseur(); - } - } - while ( (Bouton_clicke!=1) && (Bouton_clicke!=2) ); - - if (Bouton_clicke==2) // OK - { - Snap_Largeur=X_choisi; - Snap_Hauteur=Y_choisi; - Snap_Decalage_X=dX_choisi; - Snap_Decalage_Y=dY_choisi; - Snap_Mode=1; - } - - Fermer_fenetre(); - - if ( (Bouton_clicke==2) && (!Snap_Mode) ) - Bouton_Snap_Mode(); - - Afficher_curseur(); -} - - -// ----------------------- Modifications de brosse --------------------------- - -void Bouton_Brush_FX(void) -{ - short Bouton_clicke; - short Indice; - - Ouvrir_fenetre(310,162,"Brush effects"); - - Fenetre_Afficher_cadre( 6,19,298,61); - Fenetre_Afficher_cadre( 6,83,122,53); - Fenetre_Afficher_cadre(137,83,167,53); - - Fenetre_Definir_bouton_normal(236,141, 67,14,"Cancel" ,0,1,0x0001); // 1 - Fenetre_Definir_bouton_normal( 19, 46, 27,14,"X\035" ,1,1,0x002D); // 2 - Fenetre_Definir_bouton_normal( 19, 61, 27,14,"Y\022" ,1,1,0x0015); // 3 - Fenetre_Definir_bouton_normal( 58, 46, 37,14,"90ø" ,0,1,0xFFFF); // 4 - Fenetre_Definir_bouton_normal( 96, 46, 37,14,"180ø" ,0,1,0xFFFF); // 5 - Fenetre_Definir_bouton_normal( 58, 61, 75,14,"any angle" ,0,1,0xFFFF); // 6 - Fenetre_Definir_bouton_normal(145, 46, 67,14,"Stretch" ,2,1,0x0014); // 7 - Fenetre_Definir_bouton_normal(145, 61, 67,14,"Distort" ,1,1,0x0020); // 8 - Fenetre_Definir_bouton_normal(155, 99,131,14,"Recolorize" ,1,1,0x0013); // 9 - Fenetre_Definir_bouton_normal(155,117,131,14,"Get brush colors",1,1,0x0022); // 10 - - // Boutons repr‚sentant les coins du brush handle: (HG,HD,C,BG,BD) - Fenetre_Definir_bouton_normal( 75, 90,11,11,"",0,1,0x0047); // 11 - Fenetre_Definir_bouton_normal(103, 90,11,11,"",0,1,0x0049); // 12 - Fenetre_Definir_bouton_normal( 89,104,11,11,"",0,1,0x004C); // 13 - Fenetre_Definir_bouton_normal( 75,118,11,11,"",0,1,0x004F); // 14 - Fenetre_Definir_bouton_normal(103,118,11,11,"",0,1,0x0051); // 15 - - Fenetre_Definir_bouton_normal(224,46,67,14,"Outline",1,1,0x0018); // 16 - Fenetre_Definir_bouton_normal(224,61,67,14,"Nibble" ,1,1,0x0031); // 17 - - Fenetre_Definir_bouton_normal( 7,141, 60,14,"Load",1,1,0x0026); // 18 - Fenetre_Definir_bouton_normal( 70,141, 60,14,"Save",1,1,0x001F); // 19 - - Print_dans_fenetre( 80, 24,"Shape modifications",CM_Fonce,CM_Clair); - Print_dans_fenetre( 10, 36,"Mirror",CM_Fonce,CM_Clair); - Print_dans_fenetre( 72, 36,"Rotate",CM_Fonce,CM_Clair); - Print_dans_fenetre(155, 36,"Deform",CM_Fonce,CM_Clair); - Print_dans_fenetre(230, 36,"Borders",CM_Fonce,CM_Clair); - Print_dans_fenetre(141, 88,"Colors modifications",CM_Fonce,CM_Clair); - Print_dans_fenetre( 20,102,"Brush",CM_Fonce,CM_Clair); - Print_dans_fenetre( 16,110,"handle",CM_Fonce,CM_Clair); - - // Dessin des pointill‚s pour le "brush handle" - for (Indice=0; Indice<13; Indice+=2) - { - Pixel_dans_fenetre( 88+Indice, 92,CM_Fonce); - Pixel_dans_fenetre( 88+Indice,126,CM_Fonce); - Pixel_dans_fenetre( 77,103+Indice,CM_Fonce); - Pixel_dans_fenetre(111,103+Indice,CM_Fonce); - } - // Dessin des coins et du centre pour les boutons du "brush handle" - // Coin HG - Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); - Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); - // Coin HD - Block(Fenetre_Pos_X+(Menu_Facteur_X*105),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); - Block(Fenetre_Pos_X+(Menu_Facteur_X*111),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); - // Centre - Block(Fenetre_Pos_X+(Menu_Facteur_X* 91),Fenetre_Pos_Y+(Menu_Facteur_Y*109),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); - Block(Fenetre_Pos_X+(Menu_Facteur_X* 94),Fenetre_Pos_Y+(Menu_Facteur_Y*106),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); - // Coin BG - Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y*126),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); - Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y*120),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); - // Coin BD - Block(Fenetre_Pos_X+(Menu_Facteur_X*105),Fenetre_Pos_Y+(Menu_Facteur_Y*126),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); - Block(Fenetre_Pos_X+(Menu_Facteur_X*111),Fenetre_Pos_Y+(Menu_Facteur_Y*120),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - } - while (Bouton_clicke<=0); - - Fermer_fenetre(); - Desenclencher_bouton(BOUTON_EFFETS_BROSSE); - - // Gestion du bouton click‚ - switch (Bouton_clicke) - { - case 2 : // Flip X - Flip_X_LOWLEVEL(); - break; - case 3 : // Flip Y - Flip_Y_LOWLEVEL(); - break; - case 4 : // 90ø Rotation - Rotate_90_deg(); - break; - case 5 : // 180ø Rotation - if (Brosse_Hauteur&1) - { // Brosse de hauteur impaire - Flip_X_LOWLEVEL(); - Flip_Y_LOWLEVEL(); - } - else - Rotate_180_deg_LOWLEVEL(); - Brosse_Decalage_X=(Brosse_Largeur>>1); - Brosse_Decalage_Y=(Brosse_Hauteur>>1); - break; - case 6 : // Any angle rotation - Demarrer_pile_operation(OPERATION_TOURNER_BROSSE); - break; - case 7 : // Stretch - Demarrer_pile_operation(OPERATION_ETIRER_BROSSE); - break; - case 8 : // Distort - Afficher_curseur(); - Message_Non_disponible(); // !!! TEMPORAIRE !!! - Effacer_curseur(); - break; - case 9 : // Recolorize - Remap_brosse(); - break; - case 10 : // Get brush colors - Afficher_curseur(); - Get_colors_from_brush(); - Effacer_curseur(); - break; - case 11 : // Brush Attachment: Top-Left - Brosse_Decalage_X=0; - Brosse_Decalage_Y=0; - break; - case 12 : // Brush Attachment: Top-Right - Brosse_Decalage_X=(Brosse_Largeur-1); - Brosse_Decalage_Y=0; - break; - case 13 : // Brush Attachment: Center - Brosse_Decalage_X=(Brosse_Largeur>>1); - Brosse_Decalage_Y=(Brosse_Hauteur>>1); - break; - case 14 : // Brush Attachment: Bottom-Left - Brosse_Decalage_X=0; - Brosse_Decalage_Y=(Brosse_Hauteur-1); - break; - case 15 : // Brush Attachment: Bottom-Right - Brosse_Decalage_X=(Brosse_Largeur-1); - Brosse_Decalage_Y=(Brosse_Hauteur-1); - break; - case 16 : // Outline - Outline_brush(); - break; - case 17 : // Nibble - Nibble_brush(); - break; - case 18 : // Load - Afficher_curseur(); - Load_picture(0); - Effacer_curseur(); - break; - case 19 : // Save - Afficher_curseur(); - Save_picture(0); - Effacer_curseur(); - break; - } - - Afficher_curseur(); -} - - -// -- Mode Smooth ----------------------------------------------------------- -void Bouton_Smooth_Mode(void) -{ - if (Smooth_Mode) - Fonction_effet=Aucun_effet; - else - { - Fonction_effet=Effet_Smooth; - Shade_Mode=0; - Quick_shade_Mode=0; - Colorize_Mode=0; - Tiling_Mode=0; - Smear_Mode=0; - } - Smooth_Mode=!Smooth_Mode; -} - - -byte Smooth_Matrice_defaut[4][3][3]= -{ - { {1,2,1}, {2,4,2}, {1,2,1} }, - { {1,3,1}, {3,9,3}, {1,3,1} }, - { {0,1,0}, {1,2,1}, {0,1,0} }, - { {2,3,2}, {3,1,3}, {2,3,2} } -}; - -void Bouton_Smooth_Menu(void) -{ - short Bouton_clicke; - short X,Y,I,J; - byte Matrice_choisie[3][3]; - struct Fenetre_Bouton_special * Matrice_Zone_saisie[3][3]; - char Chaine[3]; - - Ouvrir_fenetre(142,109,"Smooth"); - - Fenetre_Definir_bouton_normal(82,59,53,14,"Cancel",0,1,0x0001); // 1 - Fenetre_Definir_bouton_normal(82,88,53,14,"OK" ,0,1,0x001C); // 2 - - Fenetre_Afficher_cadre(6,17,130,37); - for (X=11,Y=0; Y<4; X+=31,Y++) - { - Fenetre_Definir_bouton_normal(X,22,27,27,"",0,1,0xFFFF); // 3,4,5,6 - for (J=0; J<3; J++) - for (I=0; I<3; I++) - Print_char_dans_fenetre(X+2+(I<<3),24+(J<<3),'0'+Smooth_Matrice_defaut[Y][I][J],CM_Noir,CM_Clair); - } - - Fenetre_Afficher_cadre(6,58, 69,45); - for (J=0; J<3; J++) - for (I=0; I<3; I++) - { - Fenetre_Definir_bouton_saisie(10+(I*21),62+(J*13),2); // 7..15 - Matrice_Zone_saisie[I][J]=Fenetre_Liste_boutons_special; - Num2str(Matrice_choisie[I][J]=Smooth_Matrice[I][J],Chaine,2); - Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); - } - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - if (Bouton_clicke>2) - { - if (Bouton_clicke<=6) - { - memcpy(Matrice_choisie,Smooth_Matrice_defaut[Bouton_clicke-3],sizeof(Matrice_choisie)); - Effacer_curseur(); - for (J=0; J<3; J++) - for (I=0; I<3; I++) - { - Num2str(Matrice_choisie[I][J],Chaine,2); - Fenetre_Contenu_bouton_saisie(Matrice_Zone_saisie[I][J],Chaine); - } - Afficher_curseur(); - } - else - { - Effacer_curseur(); - I=Bouton_clicke-7; X=I%3; Y=I/3; - Num2str(Matrice_choisie[X][Y],Chaine,2); - Readline(Matrice_Zone_saisie[X][Y]->Pos_X+2, - Matrice_Zone_saisie[X][Y]->Pos_Y+2, - Chaine,2,1); - Matrice_choisie[X][Y]=atoi(Chaine); - Afficher_curseur(); - } - } - } - while ((Bouton_clicke!=1) && (Bouton_clicke!=2)); - - Fermer_fenetre(); - - if (Bouton_clicke==2) // OK - { - memcpy(Smooth_Matrice,Matrice_choisie,sizeof(Smooth_Matrice)); - Smooth_Mode=0; // On le met … 0 car la fonctø suivante va le passer … 1 - Bouton_Smooth_Mode(); - } - - Afficher_curseur(); -} - - -// -- Mode Smear ------------------------------------------------------------ -void Bouton_Smear_Mode(void) -{ - if (!Smear_Mode) - { - if (!Colorize_Mode) - Fonction_effet=Aucun_effet; - Shade_Mode=0; - Quick_shade_Mode=0; - Smooth_Mode=0; - Tiling_Mode=0; - } - Smear_Mode=!Smear_Mode; -} - - -// -- Mode Colorize --------------------------------------------------------- -void Calculer_les_tables_de_Colorize(void) -{ - word Indice; - word Facteur_A; - word Facteur_B; - - Facteur_A=256*(100-Colorize_Opacite)/100; - Facteur_B=256*( Colorize_Opacite)/100; - - for (Indice=0;Indice<64;Indice++) - { - Table_de_multiplication_par_Facteur_A[Indice]=Indice*Facteur_A; - Table_de_multiplication_par_Facteur_B[Indice]=Indice*Facteur_B; - } -} - - -void Bouton_Colorize_Mode(void) -{ - if (Colorize_Mode) - Fonction_effet=Aucun_effet; - else - { - switch(Colorize_Mode_en_cours) - { - case 0 : - Fonction_effet=Effet_Colorize_interpole; - break; - case 1 : - Fonction_effet=Effet_Colorize_additif; - break; - case 2 : - Fonction_effet=Effet_Colorize_soustractif; - } - Shade_Mode=0; - Quick_shade_Mode=0; - Smooth_Mode=0; - Tiling_Mode=0; - } - Colorize_Mode=!Colorize_Mode; -} - - -void Bouton_Colorize_Afficher_la_selection(int Numero) -{ - short Pos_Y=0; // Ligne o— afficher les flŠches de s‚lection - - // On commence par effacer les anciennes s‚lections: - // Partie gauche - Print_dans_fenetre(4,37," ",CM_Noir,CM_Clair); - Print_dans_fenetre(4,57," ",CM_Noir,CM_Clair); - Print_dans_fenetre(4,74," ",CM_Noir,CM_Clair); - // Partie droite - Print_dans_fenetre(129,37," ",CM_Noir,CM_Clair); - Print_dans_fenetre(129,57," ",CM_Noir,CM_Clair); - Print_dans_fenetre(129,74," ",CM_Noir,CM_Clair); - - // Ensuite, on affiche la flŠche l… o— il le faut: - switch(Numero) - { - case 0 : // M‚thode interpol‚e - Pos_Y=37; - break; - case 1 : // M‚thode additive - Pos_Y=57; - break; - case 2 : // M‚thode soustractive - Pos_Y=74; - } - Print_dans_fenetre(4,Pos_Y,"\020",CM_Noir,CM_Clair); - Print_dans_fenetre(129,Pos_Y,"\021",CM_Noir,CM_Clair); -} - -void Bouton_Colorize_Menu(void) -{ - short Opacite_choisie; - short Mode_choisi; - short Bouton_clicke; - char Chaine[4]; - - Ouvrir_fenetre(140,118,"Transparency"); - - Print_dans_fenetre(16,23,"Opacity:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(87,21,3); // 1 - Print_dans_fenetre(117,23,"%",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_normal(16,34,108,14,"Interpolate",1,1,0x0017); // 2 - Fenetre_Afficher_cadre(12,18,116,34); - - Fenetre_Definir_bouton_normal(16,54,108,14,"Additive" ,2,1,0x0020); // 3 - Fenetre_Definir_bouton_normal(16,71,108,14,"Subtractive",1,1,0x001F); // 4 - - Fenetre_Definir_bouton_normal(16,94, 51,14,"Cancel" ,0,1,0x0001); // 5 - Fenetre_Definir_bouton_normal(73,94, 51,14,"OK" ,0,1,0x001C); // 6 - - Num2str(Colorize_Opacite,Chaine,3); - Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); - Bouton_Colorize_Afficher_la_selection(Colorize_Mode_en_cours); - - Opacite_choisie=Colorize_Opacite; - Mode_choisi =Colorize_Mode_en_cours; - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch(Bouton_clicke) - { - case 1: // Zone de saisie de l'opacit‚ - Effacer_curseur(); - Num2str(Opacite_choisie,Chaine,3); - Readline(89,23,Chaine,3,1); - Opacite_choisie=atoi(Chaine); - // On corrige le pourcentage - if (Opacite_choisie>100) - { - Opacite_choisie=100; - Num2str(Opacite_choisie,Chaine,3); - Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); - } - Afficher_curseur(); - break; - case 2: // M‚thode interpol‚e - case 3: // M‚thode additive - case 4: // M‚thode soustractive - Mode_choisi=Bouton_clicke-2; - Effacer_curseur(); - Bouton_Colorize_Afficher_la_selection(Mode_choisi); - Afficher_curseur(); - } - } - while (Bouton_clicke<5); - - Fermer_fenetre(); - - if (Bouton_clicke==6) // OK - { - Colorize_Opacite =Opacite_choisie; - Colorize_Mode_en_cours=Mode_choisi; - Calculer_les_tables_de_Colorize(); - Colorize_Mode=0; // On le met … 0 car la fonctø suivante va le passer … 1 - Bouton_Colorize_Mode(); - } - - Afficher_curseur(); -} - - -// -- Mode Tiling ----------------------------------------------------------- -void Bouton_Tiling_Mode(void) -{ - if (Tiling_Mode) - Fonction_effet=Aucun_effet; - else - { - Fonction_effet=Effet_Tiling; - Shade_Mode=0; - Quick_shade_Mode=0; - Colorize_Mode=0; - Smooth_Mode=0; - Smear_Mode=0; - } - Tiling_Mode=!Tiling_Mode; -} - - -void Bouton_Tiling_Menu(void) -{ - short Bouton_clicke; - short Offset_X_choisi=Tiling_Decalage_X; - short Offset_Y_choisi=Tiling_Decalage_Y; - char Chaine[5]; - struct Fenetre_Bouton_special * Bouton_saisie_Decalage_X; - struct Fenetre_Bouton_special * Bouton_saisie_Decalage_Y; - - Ouvrir_fenetre(138,79,"Tiling"); - - Fenetre_Definir_bouton_normal(13,55,51,14,"Cancel",0,1,0x0001); // 1 - Fenetre_Definir_bouton_normal(74,55,51,14,"OK" ,0,1,0x001C); // 2 - Fenetre_Definir_bouton_saisie(91,21,4); // 3 - Bouton_saisie_Decalage_X=Fenetre_Liste_boutons_special; - Fenetre_Definir_bouton_saisie(91,35,4); // 4 - Bouton_saisie_Decalage_Y=Fenetre_Liste_boutons_special; - Print_dans_fenetre(12,23,"Offset X:",CM_Fonce,CM_Clair); - Print_dans_fenetre(12,37,"Offset Y:",CM_Fonce,CM_Clair); - - Num2str(Tiling_Decalage_X,Chaine,4); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_X,Chaine); - Num2str(Tiling_Decalage_Y,Chaine,4); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_Y,Chaine); - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - if (Bouton_clicke==3) // Zone de saisie du d‚calage X - { - Effacer_curseur(); - Num2str(Offset_X_choisi,Chaine,4); - Readline(93,23,Chaine,4,1); - Offset_X_choisi=atoi(Chaine); - // On corrige le d‚calage en X - if (Offset_X_choisi>=Brosse_Largeur) - { - Offset_X_choisi=Brosse_Largeur-1; - Num2str(Offset_X_choisi,Chaine,4); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_X,Chaine); - } - Afficher_curseur(); - } - else - if (Bouton_clicke==4) // Zone de saisie du d‚calage Y - { - Effacer_curseur(); - Num2str(Offset_Y_choisi,Chaine,4); - Readline(93,37,Chaine,4,1); - Offset_Y_choisi=atoi(Chaine); - // On corrige le d‚calage en Y - if (Offset_Y_choisi>=Brosse_Hauteur) - { - Offset_Y_choisi=Brosse_Hauteur-1; - Num2str(Offset_Y_choisi,Chaine,4); - Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_Y,Chaine); - } - Afficher_curseur(); - } - } - while ( (Bouton_clicke!=1) && (Bouton_clicke!=2) ); - - Fermer_fenetre(); - - if (Bouton_clicke==2) // OK - { - Tiling_Decalage_X=Offset_X_choisi; - Tiling_Decalage_Y=Offset_Y_choisi; - if (!Tiling_Mode) - Bouton_Tiling_Mode(); - } - - Afficher_curseur(); -} - - -//---------------------------- Courbes de B‚zier ---------------------------- - -void Bouton_Courbes(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(Courbe_en_cours); - Afficher_curseur(); -} - - -void Bouton_Courbes_Switch_mode(void) -{ - if (Courbe_en_cours==OPERATION_COURBE_4_POINTS) - Courbe_en_cours=OPERATION_COURBE_3_POINTS; - else - Courbe_en_cours=OPERATION_COURBE_4_POINTS; - - Effacer_curseur(); - Afficher_sprite_dans_menu(BOUTON_COURBES,Courbe_en_cours-OPERATION_COURBE_3_POINTS+4); - Demarrer_pile_operation(Courbe_en_cours); - Afficher_curseur(); -} - - -//--------------------------------- Spray ----------------------------------- - -void Bouton_Spray(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_SPRAY); - Afficher_curseur(); -} - - -void Spray_Rafficher_infos(byte Couleur_selectionnee, byte Rafficher_jauge) -{ - char Chaine[3]; - - if (Rafficher_jauge) - { - Fenetre_Liste_boutons_scroller->Position=49-Spray_Multi_flow[Couleur_selectionnee]; - Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); - } - Num2str(Spray_Multi_flow[Couleur_selectionnee],Chaine,2); - Print_dans_fenetre(196,130,Chaine,CM_Noir,CM_Clair); -} - - -void Bouton_Spray_Menu(void) -{ - static byte Spray_Init=0; - short Bouton_clicke; - char Chaine[4]; - word Indice; - byte Couleur_selectionnee=Fore_color; - byte Old_Spray_Mode =Spray_Mode; - short Old_Spray_Size =Spray_Size; - byte Old_Spray_Delay =Spray_Delay; - byte Old_Spray_Mono_flow=Spray_Mono_flow; - byte Old_Spray_Multi_flow[256]; - struct Fenetre_Bouton_special * Saisie_Size; - struct Fenetre_Bouton_special * Saisie_Delay; - struct Fenetre_Bouton_special * Saisie_Mono_flow; - struct Fenetre_Bouton_special * Saisie_Init; - word Ancien_Mouse_X; - word Ancien_Mouse_Y; - byte Ancien_Mouse_K; - byte Couleur; - byte Click; - - - memcpy(Old_Spray_Multi_flow,Spray_Multi_flow,256); - - - Ouvrir_fenetre(226,170,"Spray"); - - Fenetre_Definir_bouton_normal(110,148,51,14,"Cancel" ,0,1,0x0001); // 1 - Fenetre_Definir_bouton_normal(166,148,51,14,"OK" ,0,1,0x001C); // 2 - - Fenetre_Definir_bouton_scroller(178,62,74,50,1,49-Spray_Multi_flow[Couleur_selectionnee]); // 3 - - Fenetre_Definir_bouton_palette(7,56); // 4 - - Fenetre_Definir_bouton_normal( 8,148,83,14,"Mode: ",0,1,0x000F); // 5 - if (Spray_Mode) - Print_dans_fenetre(50,151," Mono",CM_Noir,CM_Clair); - else - Print_dans_fenetre(50,151,"Multi",CM_Noir,CM_Clair); - - Fenetre_Definir_bouton_normal(194, 62,19,14,"+1" ,0,1,0x004E); // 6 - Fenetre_Definir_bouton_normal(194, 79,19,14,"-1" ,0,1,0x004A); // 7 - Fenetre_Definir_bouton_normal(194, 96,19,14,"x2" ,0,1,0x0037); // 8 - Fenetre_Definir_bouton_normal(194,113,19,14,"ö2" ,0,1,0x00E0); // 9 - - Fenetre_Definir_bouton_normal( 8, 37,43,14,"Clear" ,1,1,0x002E); // 10 - - Print_dans_fenetre(142,25,"Size:" ,CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(186,23,3); // 11 - Saisie_Size=Fenetre_Liste_boutons_special; - Num2str(Spray_Size,Chaine,3); - Fenetre_Contenu_bouton_saisie(Saisie_Size,Chaine); - - Print_dans_fenetre(142,39,"Delay:" ,CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(194,37,2); // 12 - Saisie_Delay=Fenetre_Liste_boutons_special; - Num2str(Spray_Delay,Chaine,2); - Fenetre_Contenu_bouton_saisie(Saisie_Delay,Chaine); - - Print_dans_fenetre( 27,24,"Mono-Flow:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(111,22,2); // 13 - Saisie_Mono_flow=Fenetre_Liste_boutons_special; - Num2str(Spray_Mono_flow,Chaine,2); - Fenetre_Contenu_bouton_saisie(Saisie_Mono_flow,Chaine); - - Print_dans_fenetre( 67,40,"Init:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(111,38,2); // 14 - Saisie_Init=Fenetre_Liste_boutons_special; - Num2str(Spray_Init,Chaine,2); - Fenetre_Contenu_bouton_saisie(Saisie_Init,Chaine); - - Fenetre_Afficher_cadre(173,56,45,86); - Fenetre_Afficher_cadre(137,19,81,33); - - // On tagge toutes les couleurs utilis‚es - for (Indice=0; Indice<256; Indice++) - if (Spray_Multi_flow[Indice]) - Stencil_Tagger_couleur(Indice,CM_Noir); - // Et enfin, on tagge la couleur s‚lectionn‚e - Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); - Spray_Rafficher_infos(Couleur_selectionnee,0); - - Afficher_curseur(); - - - do - { - Ancien_Mouse_X=Mouse_X; - Ancien_Mouse_Y=Mouse_Y; - Ancien_Mouse_K=Mouse_K; - - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch (Bouton_clicke) - { - case 0 : - case 2 : // OK - break; - - case 1 : // Cancel - Spray_Mode =Old_Spray_Mode; - Spray_Size =Old_Spray_Size; - Spray_Delay =Old_Spray_Delay; - Spray_Mono_flow=Old_Spray_Mono_flow; - memcpy(Spray_Multi_flow,Old_Spray_Multi_flow,256); - break; - - case 3 : // Scroller - Effacer_curseur(); - Spray_Multi_flow[Couleur_selectionnee]=49-Fenetre_Attribut2; - Spray_Rafficher_infos(Couleur_selectionnee,0); - Afficher_curseur(); - break; - - case -1 : - case 4 : // Palette - if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) ) - { - Effacer_curseur(); - Stencil_Tagger_couleur(Couleur_selectionnee,(Spray_Multi_flow[Couleur_selectionnee])?CM_Noir:CM_Clair); - - // Mettre la couleur s‚lectionn‚e … jour suivant le click - Couleur_selectionnee=Lit_pixel(Mouse_X,Mouse_Y); - if (Mouse_K==2) - Spray_Multi_flow[Couleur_selectionnee]=0; - else - if (Spray_Multi_flow[Couleur_selectionnee]==0) - Spray_Multi_flow[Couleur_selectionnee]=Spray_Init; - - // Tagger la couleur s‚lectionn‚e en blanc - Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); - Spray_Rafficher_infos(Couleur_selectionnee,1); - Afficher_curseur(); - } - break; - - case 5 : // Toggle Mode - Spray_Mode=(Spray_Mode+1)&1; - Effacer_curseur(); - if (Spray_Mode) - Print_dans_fenetre(50,151," Mono",CM_Noir,CM_Clair); - else - Print_dans_fenetre(50,151,"Multi",CM_Noir,CM_Clair); - Afficher_curseur(); - break; - - case 6 : // +1 - for (Indice=0; Indice<256; Indice++) - { - if ( (Spray_Multi_flow[Indice]) && (Spray_Multi_flow[Indice]<49) ) - Spray_Multi_flow[Indice]++; - } - Effacer_curseur(); - Spray_Rafficher_infos(Couleur_selectionnee,1); - Afficher_curseur(); - break; - - case 7 : // -1 - for (Indice=0; Indice<256; Indice++) - { - if (Spray_Multi_flow[Indice]>1) - Spray_Multi_flow[Indice]--; - } - Effacer_curseur(); - Spray_Rafficher_infos(Couleur_selectionnee,1); - Afficher_curseur(); - break; - - case 8 : // x2 - for (Indice=0; Indice<256; Indice++) - { - if (Spray_Multi_flow[Indice]) - { - Spray_Multi_flow[Indice]<<=1; - if (Spray_Multi_flow[Indice]>49) - Spray_Multi_flow[Indice]=49; - } - } - Effacer_curseur(); - Spray_Rafficher_infos(Couleur_selectionnee,1); - Afficher_curseur(); - break; - - case 9 : // ö2 - for (Indice=0; Indice<256; Indice++) - { - if (Spray_Multi_flow[Indice]>1) - Spray_Multi_flow[Indice]>>=1; - } - Effacer_curseur(); - Spray_Rafficher_infos(Couleur_selectionnee,1); - Afficher_curseur(); - break; - - case 10 : // Clear - memset(Spray_Multi_flow,0,256); - // On raffiche les infos de la couleur s‚lectionn‚e - Spray_Rafficher_infos(Couleur_selectionnee,1); - // On efface les anciens TAGs - Fenetre_Effacer_tags(); - // Tagger la couleur s‚lectionn‚e en blanc - Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); - break; - - case 11 : // Size - Effacer_curseur(); - Num2str(Spray_Size,Chaine,3); - Readline(188,25,Chaine,3,1); - Spray_Size=atoi(Chaine); - // On corrige les dimensions - if (Spray_Size>256) - { - Spray_Size=256; - Num2str(Spray_Size,Chaine,3); - Fenetre_Contenu_bouton_saisie(Saisie_Size,Chaine); - } - else if (!Spray_Size) - { - Spray_Size=1; - Num2str(Spray_Size,Chaine,3); - Fenetre_Contenu_bouton_saisie(Saisie_Size,Chaine); - } - Afficher_curseur(); - break; - - case 12 : // Delay - Effacer_curseur(); - Num2str(Spray_Delay,Chaine,2); - Readline(196,39,Chaine,2,1); - Spray_Delay=atoi(Chaine); - // On corrige le delai - if (Spray_Delay>10) - { - Spray_Delay=10; - Num2str(Spray_Delay,Chaine,2); - Fenetre_Contenu_bouton_saisie(Saisie_Delay,Chaine); - } - Afficher_curseur(); - break; - - case 13 : // Mono-Flow - Effacer_curseur(); - Num2str(Spray_Mono_flow,Chaine,2); - Readline(113,24,Chaine,2,1); - Spray_Mono_flow=atoi(Chaine); - // On corrige le flux - if (!Spray_Mono_flow) - { - Spray_Mono_flow=1; - Num2str(Spray_Mono_flow,Chaine,2); - Fenetre_Contenu_bouton_saisie(Saisie_Mono_flow,Chaine); - } - Afficher_curseur(); - break; - - case 14 : // Init - Effacer_curseur(); - Num2str(Spray_Init,Chaine,2); - Readline(113,40,Chaine,2,1); - Spray_Init=atoi(Chaine); - // On corrige la valeur - if (Spray_Init>=50) - { - Spray_Init=49; - Num2str(Spray_Init,Chaine,2); - Fenetre_Contenu_bouton_saisie(Saisie_Init,Chaine); - } - Afficher_curseur(); - break; - } - - if (!Mouse_K) - switch (Touche) - { - case 0x0029 : // R‚cup‚ration d'une couleur derriŠre le menu - case 0x0033 : - Recuperer_couleur_derriere_fenetre(&Couleur,&Click); - if (Click) - { - Effacer_curseur(); - Stencil_Tagger_couleur(Couleur_selectionnee,(Spray_Multi_flow[Couleur_selectionnee])?CM_Noir:CM_Clair); - - // Mettre la couleur s‚lectionn‚e … jour suivant le click - Couleur_selectionnee=Couleur; - if (Click==2) - Spray_Multi_flow[Couleur_selectionnee]=0; - else - if (Spray_Multi_flow[Couleur_selectionnee]==0) - Spray_Multi_flow[Couleur_selectionnee]=Spray_Init; - - // Tagger la couleur s‚lectionn‚e en blanc - Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); - Spray_Rafficher_infos(Couleur_selectionnee,1); - Afficher_curseur(); - } - } - } - while ( (Bouton_clicke!=1) && (Bouton_clicke!=2) ); - - Fermer_fenetre(); - -/* - // Tant que l'on aura pas r‚solu le problŠme du d‚senclenchement du mode - // de dessin pr‚cedent, il faudra laisser ‡a en remarque et donc passer en - // spray mˆme si on a click‚ sur Cancel (idem pour OK (un peu plus bas)). - if (Bouton_clicke==1) // Cancel - { - if (Operation_en_cours!=OPERATION_SPRAY) - Desenclencher_bouton(BOUTON_SPRAY); - } -*/ - - Afficher_curseur(); - -/* - if (Bouton_clicke==2) // OK -*/ - if (Operation_en_cours!=OPERATION_SPRAY) - Enclencher_bouton(BOUTON_SPRAY,A_GAUCHE); -} - - - -// -- Mode Trame (Sieve) ---------------------------------------------------- - -void Bouton_Trame_Mode(void) -{ - Trame_Mode=!Trame_Mode; -} - - -void Dessiner_trame_zoomee(short Orig_X, short Orig_Y) -{ - short Pos_X; - short Pos_Y; - short Taille_X; - short Taille_Y; - short Debut_X=Fenetre_Pos_X+(Menu_Facteur_X*230); - short Debut_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*78); - - Taille_X=Menu_Facteur_X*5; // |_ Taille d'une case - Taille_Y=Menu_Facteur_Y*5; // | de la trame zoom‚e - - // On efface de contenu pr‚c‚dent - Block(Orig_X,Orig_Y, - Menu_Facteur_X*Fenetre_Liste_boutons_special->Largeur, - Menu_Facteur_Y*Fenetre_Liste_boutons_special->Hauteur,CM_Clair); - - for (Pos_Y=0; Pos_Y>(15-i))&1)?CM_Blanc:CM_Noir); -} - - -void Copier_trame_predefinie(byte Indice) -{ - short i,j; - - for (j=0; j<16; j++) - for (i=0; i<16; i++) - Trame[i][j]=(TRAME_PREDEFINIE[Indice][j]>>(15-i))&1; - Trame_Largeur=16; - Trame_Hauteur=16; -} - - -void Inverser_trame(void) -{ - byte Pos_X,Pos_Y; - - for (Pos_Y=0; Pos_Y plus grande - short Preview_Fin_Y; // | rapidit‚. - - - memcpy(Old_Trame,Trame,256); - - Ouvrir_fenetre(290,179,"Sieve"); - - Preview_Debut_X=Fenetre_Pos_X+(Menu_Facteur_X*230); - Preview_Debut_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*78); - Preview_Fin_X=Preview_Debut_X+(Menu_Facteur_X*51); - Preview_Fin_Y=Preview_Debut_Y+(Menu_Facteur_Y*71); - - Fenetre_Afficher_cadre ( 7, 65,130,43); - Fenetre_Afficher_cadre ( 7,110,130,43); - Fenetre_Afficher_cadre_creux(142, 68, 82,82); - Fenetre_Afficher_cadre_creux(229, 77, 53,73); - - Print_dans_fenetre(228, 68,"Preview",CM_Fonce,CM_Clair); - Print_dans_fenetre( 27, 83,"Scroll" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 23,120,"Width:" ,CM_Fonce,CM_Clair); - Print_dans_fenetre( 15,136,"Height:",CM_Fonce,CM_Clair); - - Fenetre_Definir_bouton_special(143,69,80,80); // 1 - - Fenetre_Definir_bouton_normal(175,157,51,14,"Cancel",0,1,0x0001); // 2 - Fenetre_Definir_bouton_normal(230,157,51,14,"OK" ,0,1,0x001C); // 3 - - Fenetre_Definir_bouton_normal( 8,157,51,14,"Clear" ,1,1,0x002E); // 4 - Fenetre_Definir_bouton_normal( 63,157,51,14,"Invert",1,1,0x0017); // 5 - - Fenetre_Definir_bouton_normal( 8,46,131,14,"Get from brush" ,1,1,0x0022); // 6 - Fenetre_Definir_bouton_normal(142,46,139,14,"Transfer to brush",1,1,0x0014); // 7 - - Fenetre_Definir_bouton_normal(109,114,11,11,"\030",0,1,0x0148); // 8 - Fenetre_Definir_bouton_normal(109,138,11,11,"\031",0,1,0x0150); // 9 - Fenetre_Definir_bouton_normal( 97,126,11,11,"\033",0,1,0x014B); // 10 - Fenetre_Definir_bouton_normal(121,126,11,11,"\032",0,1,0x014D); // 11 - Fenetre_Definir_bouton_normal(109,126,11,11,"" ,0,1,0x0052); // 12 - Bouton_Octet_insere=Fenetre_Liste_boutons_normal; - Block(Fenetre_Pos_X+(Menu_Facteur_X*(Bouton_Octet_insere->Pos_X+2)), - Fenetre_Pos_Y+(Menu_Facteur_Y*(Bouton_Octet_insere->Pos_Y+2)), - Menu_Facteur_X*7, Menu_Facteur_Y*7, (Octet_insere)?CM_Blanc:CM_Noir); - - Fenetre_Definir_bouton_normal(109, 69,11,11,"\030",0,1,0x0048); // 13 - Fenetre_Definir_bouton_normal(109, 93,11,11,"\031",0,1,0x0050); // 14 - Fenetre_Definir_bouton_normal( 97, 81,11,11,"\033",0,1,0x004B); // 15 - Fenetre_Definir_bouton_normal(121, 81,11,11,"\032",0,1,0x004D); // 16 - - for (Indice=0; Indice<10; Indice++) - Fenetre_Definir_bouton_normal((Indice*23)+8,20,20,20,"",0,1,0x003B+Indice); // 17 -> 26 - Fenetre_Definir_bouton_normal(238,20,20,20,"",0,1,0x0085); // 27 - Fenetre_Definir_bouton_normal(261,20,20,20,"",0,1,0x0086); // 28 - Dessiner_trames_predefinies(); - - Orig_X=Fenetre_Pos_X+(Menu_Facteur_X*Fenetre_Liste_boutons_special->Pos_X); - Orig_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*Fenetre_Liste_boutons_special->Pos_Y); - - Num2str(Trame_Largeur,Chaine,2); - Print_dans_fenetre(71,120,Chaine,CM_Noir,CM_Clair); - Num2str(Trame_Hauteur,Chaine,2); - Print_dans_fenetre(71,136,Chaine,CM_Noir,CM_Clair); - Dessiner_trame_zoomee(Orig_X,Orig_Y); - - - Afficher_curseur(); - - do - { - Bouton_clicke=Fenetre_Bouton_clicke(); - - switch (Bouton_clicke) - { - case -1 : - case 0 : - break; - - case 1 : // Zone de dessin de la trame - /* // Version qui n'accepte pas les clicks sur la grille - Pos_X=(Mouse_X-Orig_X)/Menu_Facteur_X; - Pos_Y=(Mouse_Y-Orig_Y)/Menu_Facteur_Y; - if ( (Pos_X%5<4) && (Pos_Y%5<4) ) - { - Pos_X/=5; - Pos_Y/=5; - if ( (Pos_X16)?16:Brosse_Largeur; - Trame_Hauteur=(Brosse_Hauteur>16)?16:Brosse_Hauteur; - for (Pos_Y=0; Pos_Y>1); - Brosse_Decalage_Y=(Brosse_Hauteur>>1); - break; - - case 8 : // R‚duire hauteur - if (Trame_Hauteur>1) - { - Effacer_curseur(); - Trame_Hauteur--; - Num2str(Trame_Hauteur,Chaine,2); - Print_dans_fenetre(71,136,Chaine,CM_Noir,CM_Clair); - Dessiner_trame_zoomee(Orig_X,Orig_Y); - Afficher_curseur(); - } - break; - - case 9 : // Agrandir hauteur - if (Trame_Hauteur<16) - { - Effacer_curseur(); - for (Indice=0; Indice1) - { - Effacer_curseur(); - Trame_Largeur--; - Num2str(Trame_Largeur,Chaine,2); - Print_dans_fenetre(71,120,Chaine,CM_Noir,CM_Clair); - Dessiner_trame_zoomee(Orig_X,Orig_Y); - Afficher_curseur(); - } - break; - - case 11 : // Agrandir largeur - if (Trame_Largeur<16) - { - Effacer_curseur(); - for (Indice=0; IndicePos_X+2)), - Fenetre_Pos_Y+(Menu_Facteur_Y*(Bouton_Octet_insere->Pos_Y+2)), - Menu_Facteur_X*7, Menu_Facteur_Y*7, (Octet_insere)?CM_Blanc:CM_Noir); - Afficher_curseur(); - break; - - case 13 : // Scroll vers le haut - Effacer_curseur(); - for (Pos_X=0; Pos_X0; Pos_Y--) - Trame[Pos_X][Pos_Y]=Trame[Pos_X][Pos_Y-1]; - Trame[Pos_X][0]=Temp; - } - Dessiner_trame_zoomee(Orig_X,Orig_Y); - Afficher_curseur(); - break; - - case 15 : // Scroll vers la gauche - Effacer_curseur(); - for (Pos_Y=0; Pos_Y0; Pos_X--) - Trame[Pos_X][Pos_Y]=Trame[Pos_X-1][Pos_Y]; - Trame[0][Pos_Y]=Temp; - } - Dessiner_trame_zoomee(Orig_X,Orig_Y); - Afficher_curseur(); - break; - - default : // Boutons de trames pr‚d‚finies - Effacer_curseur(); - Copier_trame_predefinie(Bouton_clicke-17); - Dessiner_trame_zoomee(Orig_X,Orig_Y); - Num2str(Trame_Largeur,Chaine,2); - Print_dans_fenetre(71,120,Chaine,CM_Noir,CM_Clair); - Num2str(Trame_Hauteur,Chaine,2); - Print_dans_fenetre(71,136,Chaine,CM_Noir,CM_Clair); - Dessiner_trame_zoomee(Orig_X,Orig_Y); - Afficher_curseur(); - } - } - while ( (Bouton_clicke!=2) && (Bouton_clicke!=3) ); - - - Fermer_fenetre(); - - if (Bouton_clicke==2) // Cancel - { - Trame_Largeur=Old_Trame_Largeur; - Trame_Hauteur=Old_Trame_Hauteur; - memcpy(Trame,Old_Trame,256); - } - - if ( (Bouton_clicke==3) && (!Trame_Mode) ) // OK - Bouton_Trame_Mode(); - - Afficher_curseur(); -} - - -// -- Gestion des boutons de polygone vide et plein ------------------------- - -void Bouton_Polygone(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_POLYGONE); - Afficher_curseur(); -} - - -void Bouton_Polyform(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_POLYFORM); - Afficher_curseur(); -} - - -void Bouton_Polyfill(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_POLYFILL); - Afficher_curseur(); -} - - -void Bouton_Filled_polyform(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_FILLED_POLYFORM); - Afficher_curseur(); -} - - -// -- Boutons d'ajustement de l'image --------------------------------------- - -void Bouton_Ajuster(void) -{ - Effacer_curseur(); - Demarrer_pile_operation(OPERATION_SCROLL); - Afficher_curseur(); -} - - - -// -- Menu des effets (Shade, Stencil, etc...) ------------------------------ - -void Afficher_sprite_effet(short Numero_sprite, short Debut_X, short Debut_Y) -{ - short X,Y,Pos_X,Pos_Y; - - for (Y=0,Pos_Y=Debut_Y;Y On se place sur le nom de fichier qui correspond + if (Bouton_clicke<=0) + { + Temp=strlen(Fichier_recherche); + if (Temp<12) + { + Fichier_recherche[Temp]=toupper(Touche_ASCII); + Fichier_recherche[Temp+1]=0; + Fichier_le_plus_ressemblant=Nom_correspondant_le_mieux_a(Fichier_recherche); + if ( (Fichier_le_plus_ressemblant) + && (!memcmp(Fichier_recherche,FFF_Meilleur_nom,Temp+1)) ) + { + Temp=Principal_File_list_Position+Principal_File_list_Decalage; + Effacer_curseur(); + Placer_barre_de_selection_sur(Fichier_le_plus_ressemblant); + Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + Afficher_curseur(); + if (Temp!=Principal_File_list_Position+Principal_File_list_Decalage) + Nouvelle_preview=1; + } + else + Fichier_recherche[Temp]=0; + } + } + else + *Fichier_recherche=0; + } + + if (On_a_clicke_sur_OK) + { + // Si c'est un r‚pertoire, on annule "On_a_clicke_sur_OK" et on passe + // dedans. + if (Repertoire_existe(Principal_Nom_fichier)) + { + Effacer_curseur(); + On_a_clicke_sur_OK=0; + + // On m‚morise le r‚pertoire dans lequel on ‚tait + if (strcmp(Principal_Nom_fichier,"..")) + strcpy(Repertoire_precedent,Nom_formate("..")); + else + { + for (Temp=strlen(Principal_Repertoire_courant); + (Temp>0) && (Principal_Repertoire_courant[Temp-1]!='\\'); + Temp--); + strcpy(Repertoire_precedent,Nom_formate(Principal_Repertoire_courant+Temp)); + } + + // On doit rentrer dans le r‚pertoire: + chdir(Principal_Nom_fichier); + Determiner_repertoire_courant(); + + // On lit le nouveau r‚pertoire + Lire_liste_des_fichiers(Principal_Format); + Trier_la_liste_des_fichiers(); + // On place la barre de s‚lection sur le r‚pertoire d'o— l'on vient + Placer_barre_de_selection_sur(Repertoire_precedent); + // Affichage des premiers fichiers visibles: + Preparer_et_afficher_liste_fichiers(Principal_File_list_Position,Principal_File_list_Decalage,Scroller_de_fichiers); + Afficher_curseur(); + Nouvelle_preview=1; + } + else // Sinon on essaye de charger ou sauver le fichier + { + strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); + if (!Load) + Principal_Format_fichier=Principal_Format; + Charger_ou_sauver_l_image=1; + } + } + + // Gestion du chrono et des previews + if (Nouvelle_preview) + { + // On efface les infos de la preview pr‚c‚dente s'il y en a une + // d'affich‚e + if (Etat_chrono==2) + { + Effacer_curseur(); + // On efface le "but is:" + Block(Fenetre_Pos_X+27*Menu_Facteur_X,Fenetre_Pos_Y+74*Menu_Facteur_Y, + Menu_Facteur_X*80,Menu_Facteur_Y<<3,CM_Clair); + // On efface le commentaire pr‚c‚dent + Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+176*Menu_Facteur_Y, + Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair); + // On n‚ttoie la zone o— va s'afficher la preview: + Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ 89*Menu_Facteur_Y, + Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair); + // On efface les dimensions de l'image + Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y, + Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); + // On efface la taille du fichier + Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y, + Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); + // Affichage du commentaire + if ( (!Load) && (Format_Commentaire[Principal_Format-1]) ) + Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); + Afficher_curseur(); + } + + Nouvelle_preview=0; + Etat_chrono=0; // Etat du chrono = Attente d'un XŠme de seconde + // On lit le temps de d‚part du chrono + Initialiser_chrono(Config.Chrono_delay); + } + + if (!Etat_chrono) // Prendre une nouvelle mesure du chrono et regarder + Tester_chrono(); // s'il ne faut pas afficher la preview + + if (Etat_chrono==1) // Il faut afficher la preview + { + if ( (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) && (Liste_Nb_elements) ) + { + strcpy(Principal_Repertoire_fichier,Principal_Repertoire_courant); + + Effacer_curseur(); + Charger_image(Image); + Afficher_curseur(); + + // AprŠs le chargement de la preview, on restaure tout ce qui aurait + // pu ˆtre modifi‚ par le chargement de l'image: + memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); + Principal_Image_modifiee=Image_modifiee_initiale; + Principal_Largeur_image=Largeur_image_initiale; + Principal_Hauteur_image=Hauteur_image_initiale; + } + + Etat_chrono=2; // On arrˆte le chrono + } + } + while ( (!On_a_clicke_sur_OK) && (Bouton_clicke!=2) ); + + // Si on annule, on restaure l'ancien commentaire + if (Bouton_clicke==2) + strcpy(Principal_Commentaire,Commentaire_initial); + + // On restaure les donn‚es de l'image qui ont certainement ‚t‚ modifi‚es + // par la preview. + memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); + Back_color=Back_color_initiale; + Principal_Image_modifiee=Image_modifiee_initiale; + Principal_Largeur_image=Largeur_image_initiale; + Principal_Hauteur_image=Hauteur_image_initiale; + Set_palette(Principal_Palette); + + Calculer_couleurs_menu_optimales(Principal_Palette); + Temp=(Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y)1024) || (Ecran_original_Y>768)) + { + Ecran_original_X=1024; + Ecran_original_Y=768; + } + + // Maintenant on peut chercher le mode qui correspond le mieux + Meilleur_mode=Resolution_actuelle; + Meilleure_largeur=0; + Meilleure_hauteur=0; + + + for (Mode=MODE_320_200; Mode<=MODE_1024_768; Mode++) + { + if (Mode_video[Mode].Etat<2) + { + Temp_X=Mode_video[Mode].Largeur; + Temp_Y=Mode_video[Mode].Hauteur; + + if ( (Ecran_original_X-TOLERANCE_X<=Temp_X) + && (Ecran_original_Y-TOLERANCE_Y<=Temp_Y) ) + return Mode; + else + { + if ( (Meilleure_largeur<=Temp_X) + && (Meilleure_hauteur<=Temp_Y) + && (Temp_X-TOLERANCE_X<=Ecran_original_X) + && (Temp_Y-TOLERANCE_Y<=Ecran_original_Y) ) + { + Meilleure_largeur=Temp_X; + Meilleure_hauteur=Temp_Y; + Meilleur_mode=Mode; + } + } + } + } + + return Meilleur_mode; +} + + +void Swapper_infos_selecteurs_image_et_brosse(void) +{ + char Chaine_temporaire[256]; + byte Octet_temporaire; + short Entier_temporaire; + + + strcpy(Chaine_temporaire ,Brosse_Repertoire_fichier); + strcpy(Brosse_Repertoire_fichier ,Principal_Repertoire_fichier); + strcpy(Principal_Repertoire_fichier,Chaine_temporaire); + + strcpy(Chaine_temporaire ,Brosse_Nom_fichier); + strcpy(Brosse_Nom_fichier ,Principal_Nom_fichier); + strcpy(Principal_Nom_fichier,Chaine_temporaire); + + Octet_temporaire =Brosse_Format_fichier; + Brosse_Format_fichier =Principal_Format_fichier; + Principal_Format_fichier=Octet_temporaire; + + Octet_temporaire=Brosse_Format; + Brosse_Format =Principal_Format; + Principal_Format=Octet_temporaire; + + Entier_temporaire =Brosse_File_list_Position; + Brosse_File_list_Position =Principal_File_list_Position; + Principal_File_list_Position=Entier_temporaire; + + Entier_temporaire =Brosse_File_list_Decalage; + Brosse_File_list_Decalage =Principal_File_list_Decalage; + Principal_File_list_Decalage=Entier_temporaire; + + strcpy(Chaine_temporaire ,Brosse_Repertoire_courant); + strcpy(Brosse_Repertoire_courant ,Principal_Repertoire_courant); + strcpy(Principal_Repertoire_courant,Chaine_temporaire); + + strcpy(Chaine_temporaire ,Brosse_Commentaire); + strcpy(Brosse_Commentaire ,Principal_Commentaire); + strcpy(Principal_Commentaire,Chaine_temporaire); +} + + +void Load_picture(byte Image) + // Image=1 => On charge/sauve une image + // Image=0 => On charge/sauve une brosse +{ + // Donn‚es initiales du fichier (au cas o— on voudrait annuler) + char Repertoire_fichier_initial[256]; + char Nom_fichier_initial[13]; + byte Format_fichier_initial; + byte Ne_pas_restaurer; + byte Utiliser_palette_brosse; + struct Composantes * Palette_initiale=NULL; + byte Ancienne_forme_curseur; + short Principal_Largeur_image_initiale=Principal_Largeur_image; + short Principal_Hauteur_image_initiale=Principal_Hauteur_image; + //char Commentaire_initial[TAILLE_COMMENTAIRE+1]; + int Nouveau_mode; + + + if (!Image) + Swapper_infos_selecteurs_image_et_brosse(); + + strcpy(Repertoire_fichier_initial,Principal_Repertoire_fichier); + strcpy(Nom_fichier_initial ,Principal_Nom_fichier); + Format_fichier_initial=Principal_Format_fichier; + + if (!Image) + { + Palette_initiale=(struct Composantes *)malloc(sizeof(T_Palette)); + memcpy(Palette_initiale,Principal_Palette,sizeof(T_Palette)); + } + + Ne_pas_restaurer=Bouton_Load_ou_Save(1,Image); + + if (Ne_pas_restaurer) + { + if (Image) + { + if (Principal_Image_modifiee) + Ne_pas_restaurer=Demande_de_confirmation("Discard unsaved changes?"); + } + else + Utiliser_palette_brosse=Demande_de_confirmation("Use the palette of the brush?"); + } + + if (Ne_pas_restaurer) + { + Ancienne_forme_curseur=Forme_curseur; + Effacer_curseur(); + Forme_curseur=FORME_CURSEUR_SABLIER; + Afficher_curseur(); + + if (Image) + { + // Si c'est une image qu'on charge, on efface l'ancien commentaire + // C'est loin d'ˆtre indispensable, m'enfin bon... + if (Format_Backup_done[Principal_Format_fichier-1]) + Principal_Commentaire[0]='\0'; + + Ecran_original_X=0; + Ecran_original_Y=0; + } + else + Pixel_de_chargement=Pixel_Chargement_dans_brosse; + + Charger_image(Image); + + if (!Image) + { + if (!Utiliser_palette_brosse) + memcpy(Principal_Palette,Palette_initiale,sizeof(T_Palette)); + + if (Erreur_fichier==3) // On ne peut pas allouer la brosse + { + if (Brosse) free(Brosse); + Brosse=(byte *)malloc(1*1); + Brosse_Hauteur=1; + Brosse_Largeur=1; + *Brosse=Fore_color; + + if (Smear_Brosse) free(Smear_Brosse); + Smear_Brosse=(byte *)malloc(TAILLE_MAXI_PINCEAU*TAILLE_MAXI_PINCEAU); + Smear_Brosse_Hauteur=TAILLE_MAXI_PINCEAU; + Smear_Brosse_Largeur=TAILLE_MAXI_PINCEAU; + } + else + { + Brosse_Largeur=Principal_Largeur_image; + Brosse_Hauteur=Principal_Hauteur_image; + Smear_Brosse_Largeur=(Brosse_Largeur>TAILLE_MAXI_PINCEAU)?Brosse_Largeur:TAILLE_MAXI_PINCEAU; + Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; + } + + Tiling_Decalage_X=0; + Tiling_Decalage_Y=0; + + Brosse_Decalage_X=(Brosse_Largeur>>1); + Brosse_Decalage_Y=(Brosse_Hauteur>>1); + + Principal_Largeur_image=Principal_Largeur_image_initiale; + Principal_Hauteur_image=Principal_Hauteur_image_initiale; + Pixel_de_chargement=Pixel_Chargement_dans_ecran_courant; + + Enclencher_bouton(BOUTON_DESSIN,A_GAUCHE); + if (Config.Auto_discontinuous) + { + // On se place en mode Dessin discontinu … la main + while (Operation_en_cours!=OPERATION_DESSIN_DISCONTINU) + Enclencher_bouton(BOUTON_DESSIN,A_DROITE); + } + Effacer_curseur(); + // On passe en brosse couleur: + Changer_la_forme_du_pinceau(FORME_PINCEAU_BROSSE_COULEUR); + } + else + { + Effacer_curseur(); + Forme_curseur=Ancienne_forme_curseur; + } + + if ( (Erreur_fichier==1) || (!Format_Backup_done[Principal_Format_fichier-1]) ) + { + Ne_pas_restaurer=0; + if (Erreur_fichier!=1) + Calculer_couleurs_menu_optimales(Principal_Palette); + } + else + { + if (Image) + { + if (Loupe_Mode) + { + Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,0); + Pixel_Preview=Pixel_Preview_Normal; + Loupe_Mode=0; + } + + Nouveau_mode=Meilleur_mode_video(); + if ((Config.Auto_set_res) && (Nouveau_mode!=Resolution_actuelle)) + { + Initialiser_mode_video(Nouveau_mode); + Afficher_menu(); + } + else + { + Principal_Decalage_X=0; + Principal_Decalage_Y=0; + Calculer_limites(); + Calculer_coordonnees_pinceau(); + } + } + + Calculer_couleurs_menu_optimales(Principal_Palette); + Afficher_ecran(); + + if (Image) + Principal_Image_modifiee=0; + } + Afficher_menu(); + Afficher_curseur(); + } + + if (!Image) + free(Palette_initiale); + + if (!Ne_pas_restaurer) + { + strcpy(Principal_Nom_fichier ,Nom_fichier_initial); + strcpy(Principal_Repertoire_fichier,Repertoire_fichier_initial); + Principal_Format_fichier =Format_fichier_initial; + } + + if (!Image) + Swapper_infos_selecteurs_image_et_brosse(); + + Print_nom_fichier(); + Set_palette(Principal_Palette); +} + + +void Bouton_Load(void) +{ + // On sauve l'‚tat actuel des paramŠtres de l'image pour pouvoir les + // restituer en cas d'erreur n'affectant pas l'image + Upload_infos_page_principal(Principal_Backups->Pages); + + Load_picture(1); +} + + +void Bouton_Reload(void) +{ + byte Ancienne_forme_curseur; + int Nouveau_mode; + + // On sauve l'‚tat actuel des paramŠtres de l'image pour pouvoir les + // restituer en cas d'erreur n'affectant pas l'image + Upload_infos_page_principal(Principal_Backups->Pages); + + if ( (!Principal_Image_modifiee) || Demande_de_confirmation("Discard unsaved changes ?") ) + { + Effacer_curseur(); + Ancienne_forme_curseur=Forme_curseur; + Forme_curseur=FORME_CURSEUR_SABLIER; + Afficher_curseur(); + + Ecran_original_X=0; + Ecran_original_Y=0; + Charger_image(1); + + Effacer_curseur(); + Forme_curseur=Ancienne_forme_curseur; + + if (Erreur_fichier!=1) + { + if (Loupe_Mode) + { + Tracer_cadre_de_bouton_du_menu(BOUTON_LOUPE,0); + Pixel_Preview=Pixel_Preview_Normal; + Loupe_Mode=0; + } + + Nouveau_mode=Meilleur_mode_video(); + if ( ((Config.Auto_set_res) && (Nouveau_mode!=Resolution_actuelle)) && + (!Une_resolution_a_ete_passee_en_parametre) ) + { + Initialiser_mode_video(Nouveau_mode); + Afficher_menu(); + } + else + { + Principal_Decalage_X=0; + Principal_Decalage_Y=0; + Calculer_limites(); + Calculer_coordonnees_pinceau(); + } + + Afficher_ecran(); + + Principal_Image_modifiee=0; + } + } + else + Effacer_curseur(); + + Calculer_couleurs_menu_optimales(Principal_Palette); + Afficher_menu(); + if (Config.Afficher_limites_image) + Afficher_limites_de_l_image(); + + Desenclencher_bouton(BOUTON_CHARGER); + + Afficher_curseur(); +} + + +void Nom_fichier_backup(char * Nom, char * Nom_backup) +{ + short Curseur; + + strcpy(Nom_backup,Nom); + for (Curseur=strlen(Nom)-strlen(Principal_Nom_fichier); Nom_backup[Curseur]!='.'; Curseur++); + Nom_backup[Curseur+1]='\0'; + strcat(Nom_backup,"BAK"); +} + + +void Backup_du_fichier_sauvegarde(void) +{ + char Nom_du_fichier[256]; // Nom complet du fichier + char Nouveau_nom_du_fichier[256]; // Nom complet du fichier backup + + Nom_fichier_complet(Nom_du_fichier,0); + // Calcul du nom complet du fichier backup + Nom_fichier_backup(Nom_du_fichier,Nouveau_nom_du_fichier); + + Erreur_fichier=0; + + // On fait un backup si le nom du fichier n'est pas celui qu'on a choisi + // pour nommer les backups (c'est ‚vident!). + if (strcmp(Nouveau_nom_du_fichier,Nom_du_fichier)) + { + // S'il y avait d‚j… un fichier Backup, on l'efface + if ((Fichier_existe(Nouveau_nom_du_fichier)) + && (remove(Nouveau_nom_du_fichier)!=0)) + Erreur_fichier=1; + + if ((!Erreur_fichier) + && (rename(Nom_du_fichier,Nouveau_nom_du_fichier)!=0)) + Erreur_fichier=1; + } +} + + +void Save_picture(byte Image) + // Image=1 => On charge/sauve une image + // Image=0 => On charge/sauve une brosse +{ + // Donn‚es initiales du fichier (au cas o— on voudrait annuler) + char Repertoire_fichier_initial[256]; + char Nom_fichier_initial[13]; + byte Format_fichier_initial; + byte Ne_pas_restaurer; + byte Ancienne_forme_curseur; + short Principal_Largeur_image_Backup=Principal_Largeur_image; + short Principal_Hauteur_image_Backup=Principal_Hauteur_image; + //char Commentaire_initial[TAILLE_COMMENTAIRE+1]; + + + if (!Image) + Swapper_infos_selecteurs_image_et_brosse(); + + strcpy(Repertoire_fichier_initial,Principal_Repertoire_fichier); + strcpy(Nom_fichier_initial ,Principal_Nom_fichier); + Format_fichier_initial=Principal_Format_fichier; + + Ne_pas_restaurer=Bouton_Load_ou_Save(0,Image); + + if (Ne_pas_restaurer && Fichier_existe(Principal_Nom_fichier)) + { + Ne_pas_restaurer=Demande_de_confirmation("Erase old file ?"); + if ((Ne_pas_restaurer) && (Config.Backup)) + { + Backup_du_fichier_sauvegarde(); + if (Erreur_fichier) + { + Ne_pas_restaurer=0; + Erreur(0); + } + } + } + + if (Ne_pas_restaurer) + { + Ancienne_forme_curseur=Forme_curseur; + Effacer_curseur(); + Forme_curseur=FORME_CURSEUR_SABLIER; + Afficher_curseur(); + + if (Image) + Sauver_image(Image); + else + { + Principal_Largeur_image=Brosse_Largeur; + Principal_Hauteur_image=Brosse_Hauteur; + Sauver_image(Image); + Principal_Largeur_image=Principal_Largeur_image_Backup; + Principal_Hauteur_image=Principal_Hauteur_image_Backup; + } + + Effacer_curseur(); + Forme_curseur=Ancienne_forme_curseur; + + if ((Erreur_fichier==1) || (!Format_Backup_done[Principal_Format_fichier-1])) + Ne_pas_restaurer=0; + + Afficher_curseur(); + } + + if (!Ne_pas_restaurer) + { + strcpy(Principal_Nom_fichier ,Nom_fichier_initial); + strcpy(Principal_Repertoire_fichier,Repertoire_fichier_initial); + Principal_Format_fichier =Format_fichier_initial; + } + + if (!Image) + Swapper_infos_selecteurs_image_et_brosse(); + + Print_nom_fichier(); + Set_palette(Principal_Palette); +} + + +void Bouton_Save(void) +{ + Save_picture(1); +} + + +void Bouton_Autosave(void) +{ + byte Ancienne_forme_curseur; + char Nom_du_fichier[256]; + byte Le_fichier_existe; + + + Nom_fichier_complet(Nom_du_fichier,0); + Le_fichier_existe=Fichier_existe(Nom_du_fichier); + + if ( (!Le_fichier_existe) || Demande_de_confirmation("Erase old file ?") ) + { + if ((Le_fichier_existe) && (Config.Backup)) + Backup_du_fichier_sauvegarde(); + else + Erreur_fichier=0; + + Effacer_curseur(); + + if (!Erreur_fichier) + { + Ancienne_forme_curseur=Forme_curseur; + Forme_curseur=FORME_CURSEUR_SABLIER; + Afficher_curseur(); + + Sauver_image(1); + + Effacer_curseur(); + Forme_curseur=Ancienne_forme_curseur; + } + else + Erreur(0); + } + else + Effacer_curseur(); + + Desenclencher_bouton(BOUTON_SAUVER); + + Afficher_curseur(); +} + + +// -- Gestion des boutons de ligne ------------------------------------------ + +void Bouton_Lignes(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(Ligne_en_cours); + Afficher_curseur(); +} + + +void Bouton_Lignes_Switch_mode(void) +{ + if (Ligne_en_cours==OPERATION_LIGNE) + Ligne_en_cours=OPERATION_K_LIGNE; + else + { + if (Ligne_en_cours==OPERATION_K_LIGNE) + Ligne_en_cours=OPERATION_LIGNES_CENTREES; + else + Ligne_en_cours=OPERATION_LIGNE; + } + + Effacer_curseur(); + Afficher_sprite_dans_menu(BOUTON_LIGNES,Ligne_en_cours-OPERATION_LIGNE+6); + Demarrer_pile_operation(Ligne_en_cours); + Afficher_curseur(); +} + + +// -- Bouton de brosse ------------------------------------------------------ + +void Bouton_Brosse(void) +{ + Effacer_curseur(); + + if (Operation_en_cours!=OPERATION_PRISE_BROSSE) + Demarrer_pile_operation(OPERATION_PRISE_BROSSE); + else + Desenclencher_bouton(BOUTON_BROSSE); + + Afficher_curseur(); +} + + +void Bouton_desenclencher_Brosse(void) +{ + // On fait de notre mieux pour restaurer l'ancienne op‚ration: + Demarrer_pile_operation(Operation_avant_interruption); +} + + +void Bouton_Restaurer_brosse(void) +{ + Effacer_curseur(); + // On passe en brosse couleur: + Changer_la_forme_du_pinceau(FORME_PINCEAU_BROSSE_COULEUR); + + Desenclencher_bouton(BOUTON_BROSSE); + Desenclencher_bouton(BOUTON_POLYBROSSE); + + Afficher_curseur(); +} + + +// -- Bouton de prise de brosse au lasso ------------------------------------ + +void Bouton_Lasso(void) +{ + Effacer_curseur(); + + if (Operation_en_cours!=OPERATION_POLYBROSSE) + { + Pinceau_Forme_avant_lasso=Pinceau_Forme; + Pinceau_Forme=FORME_PINCEAU_POINT; + Demarrer_pile_operation(OPERATION_POLYBROSSE); + } + else + Desenclencher_bouton(BOUTON_POLYBROSSE); + + Afficher_curseur(); +} + + +void Bouton_desenclencher_Lasso(void) +{ + // On fait de notre mieux pour restaurer l'ancienne op‚ration: + Demarrer_pile_operation(Operation_avant_interruption); + Pinceau_Forme=Pinceau_Forme_avant_lasso; +} + + +// -- Bouton de pipette ----------------------------------------------------- + +void Bouton_Pipette(void) +{ + Effacer_curseur(); + + if (Operation_en_cours!=OPERATION_PIPETTE) + { + Pipette_Couleur=-1; + Demarrer_pile_operation(OPERATION_PIPETTE); + Pinceau_Forme_avant_pipette=Pinceau_Forme; + Pinceau_Forme=FORME_PINCEAU_POINT; + if (Operation_avant_interruption!=OPERATION_REMPLACER) + if ( (Mouse_Y=Principal_X_Zoom) ) ) + Print_dans_menu("X: Y: ( )",0); + } + else + Desenclencher_bouton(BOUTON_PIPETTE); + + Afficher_curseur(); +} + + +void Bouton_desenclencher_Pipette(void) +{ + if (Operation_avant_interruption!=OPERATION_REMPLACER) + if ( (Mouse_Y=Principal_X_Zoom) ) ) + Print_dans_menu("X: Y: ",0); + + // On fait de notre mieux pour restaurer l'ancienne op‚ration: + if (Operation_en_cours==OPERATION_PIPETTE) + { + Demarrer_pile_operation(Operation_avant_interruption); + Pinceau_Forme=Pinceau_Forme_avant_pipette; + } +} + + + // -- Inversion de la couleur Fore et de la couleur Back -- +void Bouton_Inverser_foreback(void) +{ + byte Couleur_temporaire; + + Effacer_curseur(); + + Encadrer_couleur_menu(CM_Noir); + + Couleur_temporaire=Fore_color; + Fore_color =Back_color; + Back_color =Couleur_temporaire; + + Recadrer_palette(); + + Encadrer_couleur_menu(CM_Blanc); + + Afficher_foreback(); + Desenclencher_bouton(BOUTON_PIPETTE); + + Afficher_curseur(); +} + + +// -- Gestion du bouton Loupe ----------------------------------------------- + +byte On_vient_du_menu_de_facteurs_de_zoom=0; + +void Bouton_Loupe(void) +{ + Effacer_curseur(); + if ( (Operation_en_cours==OPERATION_LOUPE) || (Loupe_Mode) ) + { + Desenclencher_bouton(BOUTON_LOUPE); + } + else + { + Ancien_Principal_Decalage_X=Principal_Decalage_X; + Ancien_Principal_Decalage_Y=Principal_Decalage_Y; + Calculer_donnees_loupe(); + if ((!Config.Fast_zoom) || (Mouse_Y>=Menu_Ordonnee) || On_vient_du_menu_de_facteurs_de_zoom) + { + On_vient_du_menu_de_facteurs_de_zoom=0; + Demarrer_pile_operation(OPERATION_LOUPE); + } + else + { /* Ceci est de la duplication de code de presque toute l'op‚ration de */ + /* la loupe... Il serait peut-ˆtre plus propre de faire une proc‚dure */ + /* qui s'en charge... */ + // On passe en mode loupe + Loupe_Mode=1; + + // La fonction d'affichage dans la partie image est d‚sormais un affichage + // sp‚cial loupe. + Pixel_Preview=Pixel_Preview_Loupe; + + // On calcule l'origine de la loupe + Loupe_Decalage_X=Mouse_X-(Loupe_Largeur>>1); + Loupe_Decalage_Y=Mouse_Y-(Loupe_Hauteur>>1); + + // Calcul du coin haut_gauche de la fenˆtre devant ˆtre zoom‚e DANS L'ECRAN + if (Loupe_Decalage_X+Loupe_Largeur>=Limite_Droite-Principal_Decalage_X) + Loupe_Decalage_X=Limite_Droite-Loupe_Largeur-Principal_Decalage_X+1; + if (Loupe_Decalage_Y+Loupe_Hauteur>=Limite_Bas-Principal_Decalage_Y) + Loupe_Decalage_Y=Limite_Bas-Loupe_Hauteur-Principal_Decalage_Y+1; + + // Calcul des coordonn‚es absolues de ce coin DANS L'IMAGE + Loupe_Decalage_X+=Principal_Decalage_X; + Loupe_Decalage_Y+=Principal_Decalage_Y; + + if (Loupe_Decalage_X<0) + Loupe_Decalage_X=0; + if (Loupe_Decalage_Y<0) + Loupe_Decalage_Y=0; + + // On calcule les bornes visibles dans l'‚cran + Recadrer_ecran_par_rapport_au_zoom(); + Calculer_limites(); + Afficher_ecran(); + + // Repositionner le curseur en fonction des coordonn‚es visibles + Calculer_coordonnees_pinceau(); + } + } + Afficher_curseur(); +} + + +void Bouton_Menu_Loupe(void) +{ + short Bouton_clicke; + + Ouvrir_fenetre(141,114,"Zoom factors"); + + Fenetre_Definir_bouton_normal(45,88,51,14,"Cancel",0,1,0x0001); // 1 + + Fenetre_Definir_bouton_normal( 9,25,27,14, "x2",0,Loupe_Facteur!= 2,0x003B); // 2 + Fenetre_Definir_bouton_normal( 41,25,27,14, "x3",0,Loupe_Facteur!= 3,0x003C); // 3 + Fenetre_Definir_bouton_normal( 73,25,27,14, "x4",0,Loupe_Facteur!= 4,0x003D); // 4 + Fenetre_Definir_bouton_normal(105,25,27,14, "x5",0,Loupe_Facteur!= 5,0x003E); // 5 + Fenetre_Definir_bouton_normal( 9,45,27,14, "x6",0,Loupe_Facteur!= 6,0x003F); // 6 + Fenetre_Definir_bouton_normal( 41,45,27,14, "x8",0,Loupe_Facteur!= 8,0x0040); // 7 + Fenetre_Definir_bouton_normal( 73,45,27,14,"x10",0,Loupe_Facteur!=10,0x0041); // 8 + Fenetre_Definir_bouton_normal(105,45,27,14,"x12",0,Loupe_Facteur!=12,0x0042); // 9 + Fenetre_Definir_bouton_normal( 9,65,27,14,"x14",0,Loupe_Facteur!=14,0x0043); // 10 + Fenetre_Definir_bouton_normal( 41,65,27,14,"x16",0,Loupe_Facteur!=16,0x0044); // 11 + Fenetre_Definir_bouton_normal( 73,65,27,14,"x18",0,Loupe_Facteur!=18,0x0085); // 12 + Fenetre_Definir_bouton_normal(105,65,27,14,"x20",0,Loupe_Facteur!=20,0x0086); // 13 + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while (Bouton_clicke<=0); + + if (Bouton_clicke>1) + { + Menu_Ordonnee=Menu_Ordonnee_avant_fenetre; + Changer_facteur_loupe(Bouton_clicke-2); + } + + Fermer_fenetre(); + + if ( (Bouton_clicke==1) && (!Loupe_Mode) && (Operation_en_cours!=OPERATION_LOUPE) ) + Desenclencher_bouton(BOUTON_LOUPE); + + Afficher_curseur(); + + if ( (Bouton_clicke>1) && (!Loupe_Mode) && (Operation_en_cours!=OPERATION_LOUPE) ) + { + On_vient_du_menu_de_facteurs_de_zoom=1; + Enclencher_bouton(BOUTON_LOUPE,A_GAUCHE); + } +} + + +void Bouton_desenclencher_Loupe(void) +{ + if (Loupe_Mode) + { + // On sort du mode loupe + Loupe_Mode=0; + + /* + // --> Recalculer le d‚calage de l'‚cran lorsqu'on sort de la loupe <-- + // Centrage "brut" de l‚cran par rapport … la loupe + Principal_Decalage_X=Loupe_Decalage_X-((Largeur_ecran-Loupe_Largeur)>>1); + Principal_Decalage_Y=Loupe_Decalage_Y-((Menu_Ordonnee-Loupe_Hauteur)>>1); + */ + // Correction en cas de d‚bordement de l'image + if (Ancien_Principal_Decalage_X+Largeur_ecran>Principal_Largeur_image) + Principal_Decalage_X=Principal_Largeur_image-Largeur_ecran; + else + Principal_Decalage_X=Ancien_Principal_Decalage_X; + if (Principal_Decalage_X<0) + Principal_Decalage_X=0; + + if (Ancien_Principal_Decalage_Y+Menu_Ordonnee>Principal_Hauteur_image) + Principal_Decalage_Y=Principal_Hauteur_image-Menu_Ordonnee; + else + Principal_Decalage_Y=Ancien_Principal_Decalage_Y; + if (Principal_Decalage_Y<0) + Principal_Decalage_Y=0; + + // La fonction d'affichage dans l'image est d‚sormais un affichage normal. + Pixel_Preview=Pixel_Preview_Normal; + + // Calculer les bornes visibles dans l'‚cran + Calculer_limites(); + Afficher_ecran(); // <=> Display_screen(); + // Repositionner le curseur en fonction des coordonn‚es visibles + Calculer_coordonnees_pinceau(); + } + else // On fait de notre mieux pour restaurer l'ancienne op‚ration: + Demarrer_pile_operation(Operation_avant_interruption); +} + + +// -------------------------------- Grille ----------------------------------- + +void Bouton_Snap_Mode(void) +{ + Effacer_curseur(); + Snap_Mode=!Snap_Mode; + Calculer_coordonnees_pinceau(); + Afficher_curseur(); +} + + +void Bouton_Menu_Grille(void) +{ + short Bouton_clicke; + word X_choisi =Snap_Largeur; + word Y_choisi =Snap_Hauteur; + short dX_choisi=Snap_Decalage_X; + short dY_choisi=Snap_Decalage_Y; + + struct Fenetre_Bouton_special * Bouton_saisie_X; + struct Fenetre_Bouton_special * Bouton_saisie_Y; + struct Fenetre_Bouton_special * Bouton_saisie_dX; + struct Fenetre_Bouton_special * Bouton_saisie_dY; + + char Chaine[3]; + + + Ouvrir_fenetre(133,98,"Grid"); + + Fenetre_Definir_bouton_normal(12,72,51,14,"Cancel",0,1,0x0001); // 1 + Fenetre_Definir_bouton_normal(70,72,51,14,"OK" ,0,1,0x001C); // 2 + + Print_dans_fenetre(19,26, "X:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(37,24,2); // 3 + Bouton_saisie_X=Fenetre_Liste_boutons_special; + Num2str(X_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_X,Chaine); + + Print_dans_fenetre(19,47, "Y:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(37,45,2); // 4 + Bouton_saisie_Y=Fenetre_Liste_boutons_special; + Num2str(Y_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_Y,Chaine); + + Print_dans_fenetre(69,26,"dX:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(95,24,2); // 5 + Bouton_saisie_dX=Fenetre_Liste_boutons_special; + Num2str(dX_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_dX,Chaine); + + Print_dans_fenetre(69,47,"dY:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(95,45,2); // 6 + Bouton_saisie_dY=Fenetre_Liste_boutons_special; + Num2str(dY_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_dY,Chaine); + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch (Bouton_clicke) + { + case 3 : + Effacer_curseur(); + Num2str(X_choisi,Chaine,2); + Readline(39,26,Chaine,2,1); + X_choisi=atoi(Chaine); + // On corrige les dimensions + if ((!X_choisi) || (X_choisi>80)) + { + if (!X_choisi) + X_choisi=1; + else + X_choisi=80; + Num2str(X_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_X,Chaine); + } + if (dX_choisi>=X_choisi) + { + dX_choisi=X_choisi-1; + Num2str(dX_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_dX,Chaine); + } + Afficher_curseur(); + break; + case 4 : + Effacer_curseur(); + Num2str(Y_choisi,Chaine,2); + Readline(39,47,Chaine,2,1); + Y_choisi=atoi(Chaine); + // On corrige les dimensions + if ((!Y_choisi) || (Y_choisi>80)) + { + if (!Y_choisi) + Y_choisi=1; + else + Y_choisi=80; + Num2str(Y_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_Y,Chaine); + } + if (dY_choisi>=Y_choisi) + { + dY_choisi=Y_choisi-1; + Num2str(dY_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_dY,Chaine); + } + Afficher_curseur(); + break; + case 5 : + Effacer_curseur(); + Num2str(dX_choisi,Chaine,2); + Readline(97,26,Chaine,2,1); + dX_choisi=atoi(Chaine); + // On corrige les dimensions + if (dX_choisi>79) + dX_choisi=79; + if (dX_choisi>=X_choisi) + dX_choisi=X_choisi-1; + + Num2str(dX_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_dX,Chaine); + + Afficher_curseur(); + break; + case 6 : + Effacer_curseur(); + Num2str(dY_choisi,Chaine,2); + Readline(97,47,Chaine,2,1); + dY_choisi=atoi(Chaine); + // On corrige les dimensions + if (dY_choisi>79) + dY_choisi=79; + if (dY_choisi>=Y_choisi) + dY_choisi=Y_choisi-1; + + Num2str(dY_choisi,Chaine,2); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_dY,Chaine); + + Afficher_curseur(); + } + } + while ( (Bouton_clicke!=1) && (Bouton_clicke!=2) ); + + if (Bouton_clicke==2) // OK + { + Snap_Largeur=X_choisi; + Snap_Hauteur=Y_choisi; + Snap_Decalage_X=dX_choisi; + Snap_Decalage_Y=dY_choisi; + Snap_Mode=1; + } + + Fermer_fenetre(); + + if ( (Bouton_clicke==2) && (!Snap_Mode) ) + Bouton_Snap_Mode(); + + Afficher_curseur(); +} + + +// ----------------------- Modifications de brosse --------------------------- + +void Bouton_Brush_FX(void) +{ + short Bouton_clicke; + short Indice; + + Ouvrir_fenetre(310,162,"Brush effects"); + + Fenetre_Afficher_cadre( 6,19,298,61); + Fenetre_Afficher_cadre( 6,83,122,53); + Fenetre_Afficher_cadre(137,83,167,53); + + Fenetre_Definir_bouton_normal(236,141, 67,14,"Cancel" ,0,1,0x0001); // 1 + Fenetre_Definir_bouton_normal( 19, 46, 27,14,"X\035" ,1,1,0x002D); // 2 + Fenetre_Definir_bouton_normal( 19, 61, 27,14,"Y\022" ,1,1,0x0015); // 3 + Fenetre_Definir_bouton_normal( 58, 46, 37,14,"90ø" ,0,1,0xFFFF); // 4 + Fenetre_Definir_bouton_normal( 96, 46, 37,14,"180ø" ,0,1,0xFFFF); // 5 + Fenetre_Definir_bouton_normal( 58, 61, 75,14,"any angle" ,0,1,0xFFFF); // 6 + Fenetre_Definir_bouton_normal(145, 46, 67,14,"Stretch" ,2,1,0x0014); // 7 + Fenetre_Definir_bouton_normal(145, 61, 67,14,"Distort" ,1,1,0x0020); // 8 + Fenetre_Definir_bouton_normal(155, 99,131,14,"Recolorize" ,1,1,0x0013); // 9 + Fenetre_Definir_bouton_normal(155,117,131,14,"Get brush colors",1,1,0x0022); // 10 + + // Boutons repr‚sentant les coins du brush handle: (HG,HD,C,BG,BD) + Fenetre_Definir_bouton_normal( 75, 90,11,11,"",0,1,0x0047); // 11 + Fenetre_Definir_bouton_normal(103, 90,11,11,"",0,1,0x0049); // 12 + Fenetre_Definir_bouton_normal( 89,104,11,11,"",0,1,0x004C); // 13 + Fenetre_Definir_bouton_normal( 75,118,11,11,"",0,1,0x004F); // 14 + Fenetre_Definir_bouton_normal(103,118,11,11,"",0,1,0x0051); // 15 + + Fenetre_Definir_bouton_normal(224,46,67,14,"Outline",1,1,0x0018); // 16 + Fenetre_Definir_bouton_normal(224,61,67,14,"Nibble" ,1,1,0x0031); // 17 + + Fenetre_Definir_bouton_normal( 7,141, 60,14,"Load",1,1,0x0026); // 18 + Fenetre_Definir_bouton_normal( 70,141, 60,14,"Save",1,1,0x001F); // 19 + + Print_dans_fenetre( 80, 24,"Shape modifications",CM_Fonce,CM_Clair); + Print_dans_fenetre( 10, 36,"Mirror",CM_Fonce,CM_Clair); + Print_dans_fenetre( 72, 36,"Rotate",CM_Fonce,CM_Clair); + Print_dans_fenetre(155, 36,"Deform",CM_Fonce,CM_Clair); + Print_dans_fenetre(230, 36,"Borders",CM_Fonce,CM_Clair); + Print_dans_fenetre(141, 88,"Colors modifications",CM_Fonce,CM_Clair); + Print_dans_fenetre( 20,102,"Brush",CM_Fonce,CM_Clair); + Print_dans_fenetre( 16,110,"handle",CM_Fonce,CM_Clair); + + // Dessin des pointill‚s pour le "brush handle" + for (Indice=0; Indice<13; Indice+=2) + { + Pixel_dans_fenetre( 88+Indice, 92,CM_Fonce); + Pixel_dans_fenetre( 88+Indice,126,CM_Fonce); + Pixel_dans_fenetre( 77,103+Indice,CM_Fonce); + Pixel_dans_fenetre(111,103+Indice,CM_Fonce); + } + // Dessin des coins et du centre pour les boutons du "brush handle" + // Coin HG + Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); + Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); + // Coin HD + Block(Fenetre_Pos_X+(Menu_Facteur_X*105),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); + Block(Fenetre_Pos_X+(Menu_Facteur_X*111),Fenetre_Pos_Y+(Menu_Facteur_Y* 92),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); + // Centre + Block(Fenetre_Pos_X+(Menu_Facteur_X* 91),Fenetre_Pos_Y+(Menu_Facteur_Y*109),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); + Block(Fenetre_Pos_X+(Menu_Facteur_X* 94),Fenetre_Pos_Y+(Menu_Facteur_Y*106),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); + // Coin BG + Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y*126),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); + Block(Fenetre_Pos_X+(Menu_Facteur_X* 77),Fenetre_Pos_Y+(Menu_Facteur_Y*120),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); + // Coin BD + Block(Fenetre_Pos_X+(Menu_Facteur_X*105),Fenetre_Pos_Y+(Menu_Facteur_Y*126),Menu_Facteur_X*7,Menu_Facteur_Y,CM_Noir); + Block(Fenetre_Pos_X+(Menu_Facteur_X*111),Fenetre_Pos_Y+(Menu_Facteur_Y*120),Menu_Facteur_X,Menu_Facteur_Y*7,CM_Noir); + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + } + while (Bouton_clicke<=0); + + Fermer_fenetre(); + Desenclencher_bouton(BOUTON_EFFETS_BROSSE); + + // Gestion du bouton click‚ + switch (Bouton_clicke) + { + case 2 : // Flip X + Flip_X_LOWLEVEL(); + break; + case 3 : // Flip Y + Flip_Y_LOWLEVEL(); + break; + case 4 : // 90ø Rotation + Rotate_90_deg(); + break; + case 5 : // 180ø Rotation + if (Brosse_Hauteur&1) + { // Brosse de hauteur impaire + Flip_X_LOWLEVEL(); + Flip_Y_LOWLEVEL(); + } + else + Rotate_180_deg_LOWLEVEL(); + Brosse_Decalage_X=(Brosse_Largeur>>1); + Brosse_Decalage_Y=(Brosse_Hauteur>>1); + break; + case 6 : // Any angle rotation + Demarrer_pile_operation(OPERATION_TOURNER_BROSSE); + break; + case 7 : // Stretch + Demarrer_pile_operation(OPERATION_ETIRER_BROSSE); + break; + case 8 : // Distort + Afficher_curseur(); + Message_Non_disponible(); // !!! TEMPORAIRE !!! + Effacer_curseur(); + break; + case 9 : // Recolorize + Remap_brosse(); + break; + case 10 : // Get brush colors + Afficher_curseur(); + Get_colors_from_brush(); + Effacer_curseur(); + break; + case 11 : // Brush Attachment: Top-Left + Brosse_Decalage_X=0; + Brosse_Decalage_Y=0; + break; + case 12 : // Brush Attachment: Top-Right + Brosse_Decalage_X=(Brosse_Largeur-1); + Brosse_Decalage_Y=0; + break; + case 13 : // Brush Attachment: Center + Brosse_Decalage_X=(Brosse_Largeur>>1); + Brosse_Decalage_Y=(Brosse_Hauteur>>1); + break; + case 14 : // Brush Attachment: Bottom-Left + Brosse_Decalage_X=0; + Brosse_Decalage_Y=(Brosse_Hauteur-1); + break; + case 15 : // Brush Attachment: Bottom-Right + Brosse_Decalage_X=(Brosse_Largeur-1); + Brosse_Decalage_Y=(Brosse_Hauteur-1); + break; + case 16 : // Outline + Outline_brush(); + break; + case 17 : // Nibble + Nibble_brush(); + break; + case 18 : // Load + Afficher_curseur(); + Load_picture(0); + Effacer_curseur(); + break; + case 19 : // Save + Afficher_curseur(); + Save_picture(0); + Effacer_curseur(); + break; + } + + Afficher_curseur(); +} + + +// -- Mode Smooth ----------------------------------------------------------- +void Bouton_Smooth_Mode(void) +{ + if (Smooth_Mode) + Fonction_effet=Aucun_effet; + else + { + Fonction_effet=Effet_Smooth; + Shade_Mode=0; + Quick_shade_Mode=0; + Colorize_Mode=0; + Tiling_Mode=0; + Smear_Mode=0; + } + Smooth_Mode=!Smooth_Mode; +} + + +byte Smooth_Matrice_defaut[4][3][3]= +{ + { {1,2,1}, {2,4,2}, {1,2,1} }, + { {1,3,1}, {3,9,3}, {1,3,1} }, + { {0,1,0}, {1,2,1}, {0,1,0} }, + { {2,3,2}, {3,1,3}, {2,3,2} } +}; + +void Bouton_Smooth_Menu(void) +{ + short Bouton_clicke; + short X,Y,I,J; + byte Matrice_choisie[3][3]; + struct Fenetre_Bouton_special * Matrice_Zone_saisie[3][3]; + char Chaine[3]; + + Ouvrir_fenetre(142,109,"Smooth"); + + Fenetre_Definir_bouton_normal(82,59,53,14,"Cancel",0,1,0x0001); // 1 + Fenetre_Definir_bouton_normal(82,88,53,14,"OK" ,0,1,0x001C); // 2 + + Fenetre_Afficher_cadre(6,17,130,37); + for (X=11,Y=0; Y<4; X+=31,Y++) + { + Fenetre_Definir_bouton_normal(X,22,27,27,"",0,1,0xFFFF); // 3,4,5,6 + for (J=0; J<3; J++) + for (I=0; I<3; I++) + Print_char_dans_fenetre(X+2+(I<<3),24+(J<<3),'0'+Smooth_Matrice_defaut[Y][I][J],CM_Noir,CM_Clair); + } + + Fenetre_Afficher_cadre(6,58, 69,45); + for (J=0; J<3; J++) + for (I=0; I<3; I++) + { + Fenetre_Definir_bouton_saisie(10+(I*21),62+(J*13),2); // 7..15 + Matrice_Zone_saisie[I][J]=Fenetre_Liste_boutons_special; + Num2str(Matrice_choisie[I][J]=Smooth_Matrice[I][J],Chaine,2); + Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); + } + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + if (Bouton_clicke>2) + { + if (Bouton_clicke<=6) + { + memcpy(Matrice_choisie,Smooth_Matrice_defaut[Bouton_clicke-3],sizeof(Matrice_choisie)); + Effacer_curseur(); + for (J=0; J<3; J++) + for (I=0; I<3; I++) + { + Num2str(Matrice_choisie[I][J],Chaine,2); + Fenetre_Contenu_bouton_saisie(Matrice_Zone_saisie[I][J],Chaine); + } + Afficher_curseur(); + } + else + { + Effacer_curseur(); + I=Bouton_clicke-7; X=I%3; Y=I/3; + Num2str(Matrice_choisie[X][Y],Chaine,2); + Readline(Matrice_Zone_saisie[X][Y]->Pos_X+2, + Matrice_Zone_saisie[X][Y]->Pos_Y+2, + Chaine,2,1); + Matrice_choisie[X][Y]=atoi(Chaine); + Afficher_curseur(); + } + } + } + while ((Bouton_clicke!=1) && (Bouton_clicke!=2)); + + Fermer_fenetre(); + + if (Bouton_clicke==2) // OK + { + memcpy(Smooth_Matrice,Matrice_choisie,sizeof(Smooth_Matrice)); + Smooth_Mode=0; // On le met … 0 car la fonctø suivante va le passer … 1 + Bouton_Smooth_Mode(); + } + + Afficher_curseur(); +} + + +// -- Mode Smear ------------------------------------------------------------ +void Bouton_Smear_Mode(void) +{ + if (!Smear_Mode) + { + if (!Colorize_Mode) + Fonction_effet=Aucun_effet; + Shade_Mode=0; + Quick_shade_Mode=0; + Smooth_Mode=0; + Tiling_Mode=0; + } + Smear_Mode=!Smear_Mode; +} + + +// -- Mode Colorize --------------------------------------------------------- +void Calculer_les_tables_de_Colorize(void) +{ + word Indice; + word Facteur_A; + word Facteur_B; + + Facteur_A=256*(100-Colorize_Opacite)/100; + Facteur_B=256*( Colorize_Opacite)/100; + + for (Indice=0;Indice<64;Indice++) + { + Table_de_multiplication_par_Facteur_A[Indice]=Indice*Facteur_A; + Table_de_multiplication_par_Facteur_B[Indice]=Indice*Facteur_B; + } +} + + +void Bouton_Colorize_Mode(void) +{ + if (Colorize_Mode) + Fonction_effet=Aucun_effet; + else + { + switch(Colorize_Mode_en_cours) + { + case 0 : + Fonction_effet=Effet_Colorize_interpole; + break; + case 1 : + Fonction_effet=Effet_Colorize_additif; + break; + case 2 : + Fonction_effet=Effet_Colorize_soustractif; + } + Shade_Mode=0; + Quick_shade_Mode=0; + Smooth_Mode=0; + Tiling_Mode=0; + } + Colorize_Mode=!Colorize_Mode; +} + + +void Bouton_Colorize_Afficher_la_selection(int Numero) +{ + short Pos_Y=0; // Ligne o— afficher les flŠches de s‚lection + + // On commence par effacer les anciennes s‚lections: + // Partie gauche + Print_dans_fenetre(4,37," ",CM_Noir,CM_Clair); + Print_dans_fenetre(4,57," ",CM_Noir,CM_Clair); + Print_dans_fenetre(4,74," ",CM_Noir,CM_Clair); + // Partie droite + Print_dans_fenetre(129,37," ",CM_Noir,CM_Clair); + Print_dans_fenetre(129,57," ",CM_Noir,CM_Clair); + Print_dans_fenetre(129,74," ",CM_Noir,CM_Clair); + + // Ensuite, on affiche la flŠche l… o— il le faut: + switch(Numero) + { + case 0 : // M‚thode interpol‚e + Pos_Y=37; + break; + case 1 : // M‚thode additive + Pos_Y=57; + break; + case 2 : // M‚thode soustractive + Pos_Y=74; + } + Print_dans_fenetre(4,Pos_Y,"\020",CM_Noir,CM_Clair); + Print_dans_fenetre(129,Pos_Y,"\021",CM_Noir,CM_Clair); +} + +void Bouton_Colorize_Menu(void) +{ + short Opacite_choisie; + short Mode_choisi; + short Bouton_clicke; + char Chaine[4]; + + Ouvrir_fenetre(140,118,"Transparency"); + + Print_dans_fenetre(16,23,"Opacity:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(87,21,3); // 1 + Print_dans_fenetre(117,23,"%",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_normal(16,34,108,14,"Interpolate",1,1,0x0017); // 2 + Fenetre_Afficher_cadre(12,18,116,34); + + Fenetre_Definir_bouton_normal(16,54,108,14,"Additive" ,2,1,0x0020); // 3 + Fenetre_Definir_bouton_normal(16,71,108,14,"Subtractive",1,1,0x001F); // 4 + + Fenetre_Definir_bouton_normal(16,94, 51,14,"Cancel" ,0,1,0x0001); // 5 + Fenetre_Definir_bouton_normal(73,94, 51,14,"OK" ,0,1,0x001C); // 6 + + Num2str(Colorize_Opacite,Chaine,3); + Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); + Bouton_Colorize_Afficher_la_selection(Colorize_Mode_en_cours); + + Opacite_choisie=Colorize_Opacite; + Mode_choisi =Colorize_Mode_en_cours; + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch(Bouton_clicke) + { + case 1: // Zone de saisie de l'opacit‚ + Effacer_curseur(); + Num2str(Opacite_choisie,Chaine,3); + Readline(89,23,Chaine,3,1); + Opacite_choisie=atoi(Chaine); + // On corrige le pourcentage + if (Opacite_choisie>100) + { + Opacite_choisie=100; + Num2str(Opacite_choisie,Chaine,3); + Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine); + } + Afficher_curseur(); + break; + case 2: // M‚thode interpol‚e + case 3: // M‚thode additive + case 4: // M‚thode soustractive + Mode_choisi=Bouton_clicke-2; + Effacer_curseur(); + Bouton_Colorize_Afficher_la_selection(Mode_choisi); + Afficher_curseur(); + } + } + while (Bouton_clicke<5); + + Fermer_fenetre(); + + if (Bouton_clicke==6) // OK + { + Colorize_Opacite =Opacite_choisie; + Colorize_Mode_en_cours=Mode_choisi; + Calculer_les_tables_de_Colorize(); + Colorize_Mode=0; // On le met … 0 car la fonctø suivante va le passer … 1 + Bouton_Colorize_Mode(); + } + + Afficher_curseur(); +} + + +// -- Mode Tiling ----------------------------------------------------------- +void Bouton_Tiling_Mode(void) +{ + if (Tiling_Mode) + Fonction_effet=Aucun_effet; + else + { + Fonction_effet=Effet_Tiling; + Shade_Mode=0; + Quick_shade_Mode=0; + Colorize_Mode=0; + Smooth_Mode=0; + Smear_Mode=0; + } + Tiling_Mode=!Tiling_Mode; +} + + +void Bouton_Tiling_Menu(void) +{ + short Bouton_clicke; + short Offset_X_choisi=Tiling_Decalage_X; + short Offset_Y_choisi=Tiling_Decalage_Y; + char Chaine[5]; + struct Fenetre_Bouton_special * Bouton_saisie_Decalage_X; + struct Fenetre_Bouton_special * Bouton_saisie_Decalage_Y; + + Ouvrir_fenetre(138,79,"Tiling"); + + Fenetre_Definir_bouton_normal(13,55,51,14,"Cancel",0,1,0x0001); // 1 + Fenetre_Definir_bouton_normal(74,55,51,14,"OK" ,0,1,0x001C); // 2 + Fenetre_Definir_bouton_saisie(91,21,4); // 3 + Bouton_saisie_Decalage_X=Fenetre_Liste_boutons_special; + Fenetre_Definir_bouton_saisie(91,35,4); // 4 + Bouton_saisie_Decalage_Y=Fenetre_Liste_boutons_special; + Print_dans_fenetre(12,23,"Offset X:",CM_Fonce,CM_Clair); + Print_dans_fenetre(12,37,"Offset Y:",CM_Fonce,CM_Clair); + + Num2str(Tiling_Decalage_X,Chaine,4); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_X,Chaine); + Num2str(Tiling_Decalage_Y,Chaine,4); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_Y,Chaine); + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + if (Bouton_clicke==3) // Zone de saisie du d‚calage X + { + Effacer_curseur(); + Num2str(Offset_X_choisi,Chaine,4); + Readline(93,23,Chaine,4,1); + Offset_X_choisi=atoi(Chaine); + // On corrige le d‚calage en X + if (Offset_X_choisi>=Brosse_Largeur) + { + Offset_X_choisi=Brosse_Largeur-1; + Num2str(Offset_X_choisi,Chaine,4); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_X,Chaine); + } + Afficher_curseur(); + } + else + if (Bouton_clicke==4) // Zone de saisie du d‚calage Y + { + Effacer_curseur(); + Num2str(Offset_Y_choisi,Chaine,4); + Readline(93,37,Chaine,4,1); + Offset_Y_choisi=atoi(Chaine); + // On corrige le d‚calage en Y + if (Offset_Y_choisi>=Brosse_Hauteur) + { + Offset_Y_choisi=Brosse_Hauteur-1; + Num2str(Offset_Y_choisi,Chaine,4); + Fenetre_Contenu_bouton_saisie(Bouton_saisie_Decalage_Y,Chaine); + } + Afficher_curseur(); + } + } + while ( (Bouton_clicke!=1) && (Bouton_clicke!=2) ); + + Fermer_fenetre(); + + if (Bouton_clicke==2) // OK + { + Tiling_Decalage_X=Offset_X_choisi; + Tiling_Decalage_Y=Offset_Y_choisi; + if (!Tiling_Mode) + Bouton_Tiling_Mode(); + } + + Afficher_curseur(); +} + + +//---------------------------- Courbes de B‚zier ---------------------------- + +void Bouton_Courbes(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(Courbe_en_cours); + Afficher_curseur(); +} + + +void Bouton_Courbes_Switch_mode(void) +{ + if (Courbe_en_cours==OPERATION_COURBE_4_POINTS) + Courbe_en_cours=OPERATION_COURBE_3_POINTS; + else + Courbe_en_cours=OPERATION_COURBE_4_POINTS; + + Effacer_curseur(); + Afficher_sprite_dans_menu(BOUTON_COURBES,Courbe_en_cours-OPERATION_COURBE_3_POINTS+4); + Demarrer_pile_operation(Courbe_en_cours); + Afficher_curseur(); +} + + +//--------------------------------- Spray ----------------------------------- + +void Bouton_Spray(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_SPRAY); + Afficher_curseur(); +} + + +void Spray_Rafficher_infos(byte Couleur_selectionnee, byte Rafficher_jauge) +{ + char Chaine[3]; + + if (Rafficher_jauge) + { + Fenetre_Liste_boutons_scroller->Position=49-Spray_Multi_flow[Couleur_selectionnee]; + Fenetre_Dessiner_jauge(Fenetre_Liste_boutons_scroller); + } + Num2str(Spray_Multi_flow[Couleur_selectionnee],Chaine,2); + Print_dans_fenetre(196,130,Chaine,CM_Noir,CM_Clair); +} + + +void Bouton_Spray_Menu(void) +{ + static byte Spray_Init=0; + short Bouton_clicke; + char Chaine[4]; + word Indice; + byte Couleur_selectionnee=Fore_color; + byte Old_Spray_Mode =Spray_Mode; + short Old_Spray_Size =Spray_Size; + byte Old_Spray_Delay =Spray_Delay; + byte Old_Spray_Mono_flow=Spray_Mono_flow; + byte Old_Spray_Multi_flow[256]; + struct Fenetre_Bouton_special * Saisie_Size; + struct Fenetre_Bouton_special * Saisie_Delay; + struct Fenetre_Bouton_special * Saisie_Mono_flow; + struct Fenetre_Bouton_special * Saisie_Init; + word Ancien_Mouse_X; + word Ancien_Mouse_Y; + byte Ancien_Mouse_K; + byte Couleur; + byte Click; + + + memcpy(Old_Spray_Multi_flow,Spray_Multi_flow,256); + + + Ouvrir_fenetre(226,170,"Spray"); + + Fenetre_Definir_bouton_normal(110,148,51,14,"Cancel" ,0,1,0x0001); // 1 + Fenetre_Definir_bouton_normal(166,148,51,14,"OK" ,0,1,0x001C); // 2 + + Fenetre_Definir_bouton_scroller(178,62,74,50,1,49-Spray_Multi_flow[Couleur_selectionnee]); // 3 + + Fenetre_Definir_bouton_palette(7,56); // 4 + + Fenetre_Definir_bouton_normal( 8,148,83,14,"Mode: ",0,1,0x000F); // 5 + if (Spray_Mode) + Print_dans_fenetre(50,151," Mono",CM_Noir,CM_Clair); + else + Print_dans_fenetre(50,151,"Multi",CM_Noir,CM_Clair); + + Fenetre_Definir_bouton_normal(194, 62,19,14,"+1" ,0,1,0x004E); // 6 + Fenetre_Definir_bouton_normal(194, 79,19,14,"-1" ,0,1,0x004A); // 7 + Fenetre_Definir_bouton_normal(194, 96,19,14,"x2" ,0,1,0x0037); // 8 + Fenetre_Definir_bouton_normal(194,113,19,14,"ö2" ,0,1,0x00E0); // 9 + + Fenetre_Definir_bouton_normal( 8, 37,43,14,"Clear" ,1,1,0x002E); // 10 + + Print_dans_fenetre(142,25,"Size:" ,CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(186,23,3); // 11 + Saisie_Size=Fenetre_Liste_boutons_special; + Num2str(Spray_Size,Chaine,3); + Fenetre_Contenu_bouton_saisie(Saisie_Size,Chaine); + + Print_dans_fenetre(142,39,"Delay:" ,CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(194,37,2); // 12 + Saisie_Delay=Fenetre_Liste_boutons_special; + Num2str(Spray_Delay,Chaine,2); + Fenetre_Contenu_bouton_saisie(Saisie_Delay,Chaine); + + Print_dans_fenetre( 27,24,"Mono-Flow:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(111,22,2); // 13 + Saisie_Mono_flow=Fenetre_Liste_boutons_special; + Num2str(Spray_Mono_flow,Chaine,2); + Fenetre_Contenu_bouton_saisie(Saisie_Mono_flow,Chaine); + + Print_dans_fenetre( 67,40,"Init:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(111,38,2); // 14 + Saisie_Init=Fenetre_Liste_boutons_special; + Num2str(Spray_Init,Chaine,2); + Fenetre_Contenu_bouton_saisie(Saisie_Init,Chaine); + + Fenetre_Afficher_cadre(173,56,45,86); + Fenetre_Afficher_cadre(137,19,81,33); + + // On tagge toutes les couleurs utilis‚es + for (Indice=0; Indice<256; Indice++) + if (Spray_Multi_flow[Indice]) + Stencil_Tagger_couleur(Indice,CM_Noir); + // Et enfin, on tagge la couleur s‚lectionn‚e + Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); + Spray_Rafficher_infos(Couleur_selectionnee,0); + + Afficher_curseur(); + + + do + { + Ancien_Mouse_X=Mouse_X; + Ancien_Mouse_Y=Mouse_Y; + Ancien_Mouse_K=Mouse_K; + + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch (Bouton_clicke) + { + case 0 : + case 2 : // OK + break; + + case 1 : // Cancel + Spray_Mode =Old_Spray_Mode; + Spray_Size =Old_Spray_Size; + Spray_Delay =Old_Spray_Delay; + Spray_Mono_flow=Old_Spray_Mono_flow; + memcpy(Spray_Multi_flow,Old_Spray_Multi_flow,256); + break; + + case 3 : // Scroller + Effacer_curseur(); + Spray_Multi_flow[Couleur_selectionnee]=49-Fenetre_Attribut2; + Spray_Rafficher_infos(Couleur_selectionnee,0); + Afficher_curseur(); + break; + + case -1 : + case 4 : // Palette + if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) ) + { + Effacer_curseur(); + Stencil_Tagger_couleur(Couleur_selectionnee,(Spray_Multi_flow[Couleur_selectionnee])?CM_Noir:CM_Clair); + + // Mettre la couleur s‚lectionn‚e … jour suivant le click + Couleur_selectionnee=Lit_pixel(Mouse_X,Mouse_Y); + if (Mouse_K==2) + Spray_Multi_flow[Couleur_selectionnee]=0; + else + if (Spray_Multi_flow[Couleur_selectionnee]==0) + Spray_Multi_flow[Couleur_selectionnee]=Spray_Init; + + // Tagger la couleur s‚lectionn‚e en blanc + Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); + Spray_Rafficher_infos(Couleur_selectionnee,1); + Afficher_curseur(); + } + break; + + case 5 : // Toggle Mode + Spray_Mode=(Spray_Mode+1)&1; + Effacer_curseur(); + if (Spray_Mode) + Print_dans_fenetre(50,151," Mono",CM_Noir,CM_Clair); + else + Print_dans_fenetre(50,151,"Multi",CM_Noir,CM_Clair); + Afficher_curseur(); + break; + + case 6 : // +1 + for (Indice=0; Indice<256; Indice++) + { + if ( (Spray_Multi_flow[Indice]) && (Spray_Multi_flow[Indice]<49) ) + Spray_Multi_flow[Indice]++; + } + Effacer_curseur(); + Spray_Rafficher_infos(Couleur_selectionnee,1); + Afficher_curseur(); + break; + + case 7 : // -1 + for (Indice=0; Indice<256; Indice++) + { + if (Spray_Multi_flow[Indice]>1) + Spray_Multi_flow[Indice]--; + } + Effacer_curseur(); + Spray_Rafficher_infos(Couleur_selectionnee,1); + Afficher_curseur(); + break; + + case 8 : // x2 + for (Indice=0; Indice<256; Indice++) + { + if (Spray_Multi_flow[Indice]) + { + Spray_Multi_flow[Indice]<<=1; + if (Spray_Multi_flow[Indice]>49) + Spray_Multi_flow[Indice]=49; + } + } + Effacer_curseur(); + Spray_Rafficher_infos(Couleur_selectionnee,1); + Afficher_curseur(); + break; + + case 9 : // ö2 + for (Indice=0; Indice<256; Indice++) + { + if (Spray_Multi_flow[Indice]>1) + Spray_Multi_flow[Indice]>>=1; + } + Effacer_curseur(); + Spray_Rafficher_infos(Couleur_selectionnee,1); + Afficher_curseur(); + break; + + case 10 : // Clear + memset(Spray_Multi_flow,0,256); + // On raffiche les infos de la couleur s‚lectionn‚e + Spray_Rafficher_infos(Couleur_selectionnee,1); + // On efface les anciens TAGs + Fenetre_Effacer_tags(); + // Tagger la couleur s‚lectionn‚e en blanc + Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); + break; + + case 11 : // Size + Effacer_curseur(); + Num2str(Spray_Size,Chaine,3); + Readline(188,25,Chaine,3,1); + Spray_Size=atoi(Chaine); + // On corrige les dimensions + if (Spray_Size>256) + { + Spray_Size=256; + Num2str(Spray_Size,Chaine,3); + Fenetre_Contenu_bouton_saisie(Saisie_Size,Chaine); + } + else if (!Spray_Size) + { + Spray_Size=1; + Num2str(Spray_Size,Chaine,3); + Fenetre_Contenu_bouton_saisie(Saisie_Size,Chaine); + } + Afficher_curseur(); + break; + + case 12 : // Delay + Effacer_curseur(); + Num2str(Spray_Delay,Chaine,2); + Readline(196,39,Chaine,2,1); + Spray_Delay=atoi(Chaine); + // On corrige le delai + if (Spray_Delay>10) + { + Spray_Delay=10; + Num2str(Spray_Delay,Chaine,2); + Fenetre_Contenu_bouton_saisie(Saisie_Delay,Chaine); + } + Afficher_curseur(); + break; + + case 13 : // Mono-Flow + Effacer_curseur(); + Num2str(Spray_Mono_flow,Chaine,2); + Readline(113,24,Chaine,2,1); + Spray_Mono_flow=atoi(Chaine); + // On corrige le flux + if (!Spray_Mono_flow) + { + Spray_Mono_flow=1; + Num2str(Spray_Mono_flow,Chaine,2); + Fenetre_Contenu_bouton_saisie(Saisie_Mono_flow,Chaine); + } + Afficher_curseur(); + break; + + case 14 : // Init + Effacer_curseur(); + Num2str(Spray_Init,Chaine,2); + Readline(113,40,Chaine,2,1); + Spray_Init=atoi(Chaine); + // On corrige la valeur + if (Spray_Init>=50) + { + Spray_Init=49; + Num2str(Spray_Init,Chaine,2); + Fenetre_Contenu_bouton_saisie(Saisie_Init,Chaine); + } + Afficher_curseur(); + break; + } + + if (!Mouse_K) + switch (Touche) + { + case 0x0029 : // R‚cup‚ration d'une couleur derriŠre le menu + case 0x0033 : + Recuperer_couleur_derriere_fenetre(&Couleur,&Click); + if (Click) + { + Effacer_curseur(); + Stencil_Tagger_couleur(Couleur_selectionnee,(Spray_Multi_flow[Couleur_selectionnee])?CM_Noir:CM_Clair); + + // Mettre la couleur s‚lectionn‚e … jour suivant le click + Couleur_selectionnee=Couleur; + if (Click==2) + Spray_Multi_flow[Couleur_selectionnee]=0; + else + if (Spray_Multi_flow[Couleur_selectionnee]==0) + Spray_Multi_flow[Couleur_selectionnee]=Spray_Init; + + // Tagger la couleur s‚lectionn‚e en blanc + Stencil_Tagger_couleur(Couleur_selectionnee,CM_Blanc); + Spray_Rafficher_infos(Couleur_selectionnee,1); + Afficher_curseur(); + } + } + } + while ( (Bouton_clicke!=1) && (Bouton_clicke!=2) ); + + Fermer_fenetre(); + +/* + // Tant que l'on aura pas r‚solu le problŠme du d‚senclenchement du mode + // de dessin pr‚cedent, il faudra laisser ‡a en remarque et donc passer en + // spray mˆme si on a click‚ sur Cancel (idem pour OK (un peu plus bas)). + if (Bouton_clicke==1) // Cancel + { + if (Operation_en_cours!=OPERATION_SPRAY) + Desenclencher_bouton(BOUTON_SPRAY); + } +*/ + + Afficher_curseur(); + +/* + if (Bouton_clicke==2) // OK +*/ + if (Operation_en_cours!=OPERATION_SPRAY) + Enclencher_bouton(BOUTON_SPRAY,A_GAUCHE); +} + + + +// -- Mode Trame (Sieve) ---------------------------------------------------- + +void Bouton_Trame_Mode(void) +{ + Trame_Mode=!Trame_Mode; +} + + +void Dessiner_trame_zoomee(short Orig_X, short Orig_Y) +{ + short Pos_X; + short Pos_Y; + short Taille_X; + short Taille_Y; + short Debut_X=Fenetre_Pos_X+(Menu_Facteur_X*230); + short Debut_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*78); + + Taille_X=Menu_Facteur_X*5; // |_ Taille d'une case + Taille_Y=Menu_Facteur_Y*5; // | de la trame zoom‚e + + // On efface de contenu pr‚c‚dent + Block(Orig_X,Orig_Y, + Menu_Facteur_X*Fenetre_Liste_boutons_special->Largeur, + Menu_Facteur_Y*Fenetre_Liste_boutons_special->Hauteur,CM_Clair); + + for (Pos_Y=0; Pos_Y>(15-i))&1)?CM_Blanc:CM_Noir); +} + + +void Copier_trame_predefinie(byte Indice) +{ + short i,j; + + for (j=0; j<16; j++) + for (i=0; i<16; i++) + Trame[i][j]=(TRAME_PREDEFINIE[Indice][j]>>(15-i))&1; + Trame_Largeur=16; + Trame_Hauteur=16; +} + + +void Inverser_trame(void) +{ + byte Pos_X,Pos_Y; + + for (Pos_Y=0; Pos_Y plus grande + short Preview_Fin_Y; // | rapidit‚. + + + memcpy(Old_Trame,Trame,256); + + Ouvrir_fenetre(290,179,"Sieve"); + + Preview_Debut_X=Fenetre_Pos_X+(Menu_Facteur_X*230); + Preview_Debut_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*78); + Preview_Fin_X=Preview_Debut_X+(Menu_Facteur_X*51); + Preview_Fin_Y=Preview_Debut_Y+(Menu_Facteur_Y*71); + + Fenetre_Afficher_cadre ( 7, 65,130,43); + Fenetre_Afficher_cadre ( 7,110,130,43); + Fenetre_Afficher_cadre_creux(142, 68, 82,82); + Fenetre_Afficher_cadre_creux(229, 77, 53,73); + + Print_dans_fenetre(228, 68,"Preview",CM_Fonce,CM_Clair); + Print_dans_fenetre( 27, 83,"Scroll" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 23,120,"Width:" ,CM_Fonce,CM_Clair); + Print_dans_fenetre( 15,136,"Height:",CM_Fonce,CM_Clair); + + Fenetre_Definir_bouton_special(143,69,80,80); // 1 + + Fenetre_Definir_bouton_normal(175,157,51,14,"Cancel",0,1,0x0001); // 2 + Fenetre_Definir_bouton_normal(230,157,51,14,"OK" ,0,1,0x001C); // 3 + + Fenetre_Definir_bouton_normal( 8,157,51,14,"Clear" ,1,1,0x002E); // 4 + Fenetre_Definir_bouton_normal( 63,157,51,14,"Invert",1,1,0x0017); // 5 + + Fenetre_Definir_bouton_normal( 8,46,131,14,"Get from brush" ,1,1,0x0022); // 6 + Fenetre_Definir_bouton_normal(142,46,139,14,"Transfer to brush",1,1,0x0014); // 7 + + Fenetre_Definir_bouton_normal(109,114,11,11,"\030",0,1,0x0148); // 8 + Fenetre_Definir_bouton_normal(109,138,11,11,"\031",0,1,0x0150); // 9 + Fenetre_Definir_bouton_normal( 97,126,11,11,"\033",0,1,0x014B); // 10 + Fenetre_Definir_bouton_normal(121,126,11,11,"\032",0,1,0x014D); // 11 + Fenetre_Definir_bouton_normal(109,126,11,11,"" ,0,1,0x0052); // 12 + Bouton_Octet_insere=Fenetre_Liste_boutons_normal; + Block(Fenetre_Pos_X+(Menu_Facteur_X*(Bouton_Octet_insere->Pos_X+2)), + Fenetre_Pos_Y+(Menu_Facteur_Y*(Bouton_Octet_insere->Pos_Y+2)), + Menu_Facteur_X*7, Menu_Facteur_Y*7, (Octet_insere)?CM_Blanc:CM_Noir); + + Fenetre_Definir_bouton_normal(109, 69,11,11,"\030",0,1,0x0048); // 13 + Fenetre_Definir_bouton_normal(109, 93,11,11,"\031",0,1,0x0050); // 14 + Fenetre_Definir_bouton_normal( 97, 81,11,11,"\033",0,1,0x004B); // 15 + Fenetre_Definir_bouton_normal(121, 81,11,11,"\032",0,1,0x004D); // 16 + + for (Indice=0; Indice<10; Indice++) + Fenetre_Definir_bouton_normal((Indice*23)+8,20,20,20,"",0,1,0x003B+Indice); // 17 -> 26 + Fenetre_Definir_bouton_normal(238,20,20,20,"",0,1,0x0085); // 27 + Fenetre_Definir_bouton_normal(261,20,20,20,"",0,1,0x0086); // 28 + Dessiner_trames_predefinies(); + + Orig_X=Fenetre_Pos_X+(Menu_Facteur_X*Fenetre_Liste_boutons_special->Pos_X); + Orig_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*Fenetre_Liste_boutons_special->Pos_Y); + + Num2str(Trame_Largeur,Chaine,2); + Print_dans_fenetre(71,120,Chaine,CM_Noir,CM_Clair); + Num2str(Trame_Hauteur,Chaine,2); + Print_dans_fenetre(71,136,Chaine,CM_Noir,CM_Clair); + Dessiner_trame_zoomee(Orig_X,Orig_Y); + + + Afficher_curseur(); + + do + { + Bouton_clicke=Fenetre_Bouton_clicke(); + + switch (Bouton_clicke) + { + case -1 : + case 0 : + break; + + case 1 : // Zone de dessin de la trame + /* // Version qui n'accepte pas les clicks sur la grille + Pos_X=(Mouse_X-Orig_X)/Menu_Facteur_X; + Pos_Y=(Mouse_Y-Orig_Y)/Menu_Facteur_Y; + if ( (Pos_X%5<4) && (Pos_Y%5<4) ) + { + Pos_X/=5; + Pos_Y/=5; + if ( (Pos_X16)?16:Brosse_Largeur; + Trame_Hauteur=(Brosse_Hauteur>16)?16:Brosse_Hauteur; + for (Pos_Y=0; Pos_Y>1); + Brosse_Decalage_Y=(Brosse_Hauteur>>1); + break; + + case 8 : // R‚duire hauteur + if (Trame_Hauteur>1) + { + Effacer_curseur(); + Trame_Hauteur--; + Num2str(Trame_Hauteur,Chaine,2); + Print_dans_fenetre(71,136,Chaine,CM_Noir,CM_Clair); + Dessiner_trame_zoomee(Orig_X,Orig_Y); + Afficher_curseur(); + } + break; + + case 9 : // Agrandir hauteur + if (Trame_Hauteur<16) + { + Effacer_curseur(); + for (Indice=0; Indice1) + { + Effacer_curseur(); + Trame_Largeur--; + Num2str(Trame_Largeur,Chaine,2); + Print_dans_fenetre(71,120,Chaine,CM_Noir,CM_Clair); + Dessiner_trame_zoomee(Orig_X,Orig_Y); + Afficher_curseur(); + } + break; + + case 11 : // Agrandir largeur + if (Trame_Largeur<16) + { + Effacer_curseur(); + for (Indice=0; IndicePos_X+2)), + Fenetre_Pos_Y+(Menu_Facteur_Y*(Bouton_Octet_insere->Pos_Y+2)), + Menu_Facteur_X*7, Menu_Facteur_Y*7, (Octet_insere)?CM_Blanc:CM_Noir); + Afficher_curseur(); + break; + + case 13 : // Scroll vers le haut + Effacer_curseur(); + for (Pos_X=0; Pos_X0; Pos_Y--) + Trame[Pos_X][Pos_Y]=Trame[Pos_X][Pos_Y-1]; + Trame[Pos_X][0]=Temp; + } + Dessiner_trame_zoomee(Orig_X,Orig_Y); + Afficher_curseur(); + break; + + case 15 : // Scroll vers la gauche + Effacer_curseur(); + for (Pos_Y=0; Pos_Y0; Pos_X--) + Trame[Pos_X][Pos_Y]=Trame[Pos_X-1][Pos_Y]; + Trame[0][Pos_Y]=Temp; + } + Dessiner_trame_zoomee(Orig_X,Orig_Y); + Afficher_curseur(); + break; + + default : // Boutons de trames pr‚d‚finies + Effacer_curseur(); + Copier_trame_predefinie(Bouton_clicke-17); + Dessiner_trame_zoomee(Orig_X,Orig_Y); + Num2str(Trame_Largeur,Chaine,2); + Print_dans_fenetre(71,120,Chaine,CM_Noir,CM_Clair); + Num2str(Trame_Hauteur,Chaine,2); + Print_dans_fenetre(71,136,Chaine,CM_Noir,CM_Clair); + Dessiner_trame_zoomee(Orig_X,Orig_Y); + Afficher_curseur(); + } + } + while ( (Bouton_clicke!=2) && (Bouton_clicke!=3) ); + + + Fermer_fenetre(); + + if (Bouton_clicke==2) // Cancel + { + Trame_Largeur=Old_Trame_Largeur; + Trame_Hauteur=Old_Trame_Hauteur; + memcpy(Trame,Old_Trame,256); + } + + if ( (Bouton_clicke==3) && (!Trame_Mode) ) // OK + Bouton_Trame_Mode(); + + Afficher_curseur(); +} + + +// -- Gestion des boutons de polygone vide et plein ------------------------- + +void Bouton_Polygone(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_POLYGONE); + Afficher_curseur(); +} + + +void Bouton_Polyform(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_POLYFORM); + Afficher_curseur(); +} + + +void Bouton_Polyfill(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_POLYFILL); + Afficher_curseur(); +} + + +void Bouton_Filled_polyform(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_FILLED_POLYFORM); + Afficher_curseur(); +} + + +// -- Boutons d'ajustement de l'image --------------------------------------- + +void Bouton_Ajuster(void) +{ + Effacer_curseur(); + Demarrer_pile_operation(OPERATION_SCROLL); + Afficher_curseur(); +} + + + +// -- Menu des effets (Shade, Stencil, etc...) ------------------------------ + +void Afficher_sprite_effet(short Numero_sprite, short Debut_X, short Debut_Y) +{ + short X,Y,Pos_X,Pos_Y; + + for (Y=0,Pos_Y=Debut_Y;Y #include "struct.h" - -GLOBAL struct S_Config -{ - byte Fonte; - int Lire_les_fichiers_caches; - int Lire_les_repertoires_caches; - int Lire_les_repertoires_systemes; - byte Afficher_limites_image; - byte Curseur; - byte Maximize_preview; - byte Auto_set_res; - byte Coords_rel; - byte Backup; - byte Adjust_brush_pick; - byte Auto_save; - byte Nb_pages_Undo; - byte Indice_Sensibilite_souris_X; - byte Indice_Sensibilite_souris_Y; - byte Mouse_Facteur_de_correction_X; - byte Mouse_Facteur_de_correction_Y; - byte Valeur_tempo_jauge_gauche; - byte Valeur_tempo_jauge_droite; - long Chrono_delay; - struct Composantes Coul_menu_pref[4]; - int Nb_max_de_vertex_par_polygon; - byte Clear_palette; - byte Set_resolution_according_to; - byte Ratio; - byte Fast_zoom; - byte Find_file_fast; - byte Couleurs_separees; - byte FX_Feedback; - byte Safety_colors; - byte Opening_message; - byte Clear_with_stencil; - byte Auto_discontinuous; - byte Taille_ecran_dans_GIF; - byte Auto_nb_used; - byte Resolution_par_defaut; -} Config; - - // Tableau des touches spéciales -GLOBAL word Config_Touche[NB_TOUCHES_SPECIALES]; - - -struct S_Mode_video -{ - short Largeur; - short Hauteur; - byte Mode; - word Facteur_X; - word Facteur_Y; - char Ratio[5]; - signed char Refresh; // <0 => entrelacé - word Mode_VESA_de_base; - void * Pointeur; - byte Etat; // 0:Cool 1:OK ; 2:Bof ; 3:Naze ; si on rajoute +128 => incompatible -}; -GLOBAL struct S_Mode_video Mode_video[NB_MODES_VIDEO]; - - -GLOBAL struct -{ - byte Granularite; // Facteur de gestion de la granularité - byte Code_fenetres; // Utilisation des fenˆtres: 0=AA 1=BB 2=AB 3=BA - byte * WinFuncPtr; - byte * Adresse_physique_LFB; // Si = 0 => Pas de LFB - dword Taille_LFB; // Taille de la mémoire LFB -} VESA_Mode_Infos[4]; - - - - // Palette par défaut - -GLOBAL T_Palette Palette_defaut; - - // Couleurs du menu - -GLOBAL byte CM_Noir; -GLOBAL byte CM_Fonce; -GLOBAL byte CM_Clair; -GLOBAL byte CM_Blanc; -GLOBAL byte CM_Trans; -GLOBAL struct Composantes Coul_menu_pref[4]; - - // Etat des entrées - -GLOBAL word Mouse_X; // Abscisse de la souris -GLOBAL word Mouse_Y; // Ordonnée de la souris -GLOBAL byte Mouse_K; // Etat des boutons de la souris -GLOBAL word Touche; -GLOBAL Uint8* Etat_Du_Clavier; // Scancode de la touche en cours et etat des touches de ctrl -GLOBAL byte Touche_ASCII; // Code ASCII de la touche en cours - -GLOBAL byte Mouse_Facteur_de_correction_X; -GLOBAL byte Mouse_Facteur_de_correction_Y; - -GLOBAL byte Autoriser_changement_de_couleur_pendant_operation; - - // Données sur le curseur - -GLOBAL byte Forme_curseur; -GLOBAL byte Forme_curseur_avant_fenetre; // Forme du curseur avant l'ouverture d'une fenˆtre -GLOBAL byte Forcer_affichage_curseur; // Forcer l'affichage du curseur au prochain Get_input(); -GLOBAL byte Cacher_curseur; -GLOBAL byte Curseur_dans_menu; // Booléen "Le curseur se trouve dans le menu" -GLOBAL byte Curseur_dans_menu_precedent; // Booléen "Le curseur se trouvait précédemment dans le menu" -GLOBAL word Curseur_Decalage_X[NB_SPRITES_CURSEUR]; // Coordonnées X du point sensible de curseurs en sprite -GLOBAL word Curseur_Decalage_Y[NB_SPRITES_CURSEUR]; // Coordonnées Y du point sensible de curseurs en sprite -GLOBAL byte SPRITE_CURSEUR[NB_SPRITES_CURSEUR][HAUTEUR_SPRITE_CURSEUR][LARGEUR_SPRITE_CURSEUR]; // Dessins des sprites de curseur -GLOBAL byte FOND_CURSEUR[HAUTEUR_SPRITE_CURSEUR][LARGEUR_SPRITE_CURSEUR]; // Contenu du dessous du curseur - - // Données sur le pinceau - -GLOBAL byte Pinceau_Forme; -GLOBAL byte Pinceau_Forme_avant_fill; -GLOBAL byte Pinceau_Forme_avant_pipette; -GLOBAL byte Pinceau_Forme_avant_lasso; -GLOBAL byte Cacher_pinceau; -GLOBAL short Pinceau_X; -GLOBAL short Pinceau_Y; -GLOBAL byte SPRITE_PINCEAU [NB_SPRITES_PINCEAU][HAUTEUR_PINCEAU][LARGEUR_PINCEAU]; -GLOBAL word Pinceau_predefini_Largeur[NB_SPRITES_PINCEAU]; -GLOBAL word Pinceau_predefini_Hauteur[NB_SPRITES_PINCEAU]; -GLOBAL byte Pinceau_Type[NB_SPRITES_PINCEAU]; -GLOBAL word Pinceau_predefini_Decalage_X[NB_SPRITES_PINCEAU]; -GLOBAL word Pinceau_predefini_Decalage_Y[NB_SPRITES_PINCEAU]; -GLOBAL byte * Pinceau_Sprite; -GLOBAL short Pinceau_Largeur; -GLOBAL short Pinceau_Hauteur; -GLOBAL short Pinceau_Decalage_X; -GLOBAL short Pinceau_Decalage_Y; - - // Commandes graphiques - -GLOBAL fonction_afficheur Pixel; // Affiche un point … l'écran -GLOBAL fonction_afficheur Pixel_dans_menu;// Affiche un point dans le menu (ou pas si le menu est invisible) -GLOBAL fonction_lecteur Lit_pixel; // Teste la couleur d'un pixel dans l'écran -GLOBAL fonction_effaceur Clear_screen; // Efface rapidement tout l'écran (en faisant attention de ne pas effacer le menu) -GLOBAL fonction_display Display_screen; // Affiche rapidement tout l'écran (en faisant attention de ne pas effacer le menu) -GLOBAL fonction_block Block; // Affiche rapidement un bloc … l'écran -GLOBAL fonction_afficheur Pixel_Preview_Normal; // Affiche un point de l'image … l'écran en mode normal (pas en mode loupe) -GLOBAL fonction_afficheur Pixel_Preview_Loupe; // Affiche un point de l'image … l'écran en mode loupe -GLOBAL fonction_afficheur Pixel_Preview; // Affiche un point de l'image … l'écran en fonction de l'état du mode loupe -GLOBAL fonction_Ligne_XOR Ligne_horizontale_XOR;// Affiche une ligne horizontale en XOR (pour placer la loupe) -GLOBAL fonction_Ligne_XOR Ligne_verticale_XOR; // Affiche une ligne verticale en XOR (pour placer la loupe) -GLOBAL fonction_display_brush_Color Display_brush_Color; // Affiche une partie de la brosse en couleur -GLOBAL fonction_display_brush_Mono Display_brush_Mono; // Affiche une partie de la brosse en monochrome -GLOBAL fonction_display_brush_Color Clear_brush; // Efface la partie de la brosse affichée … l'écran -GLOBAL fonction_remap Remap_screen; // Remappe une partie de l'écran avec les nouvelles couleurs du menu -GLOBAL fonction_procsline Afficher_ligne; // Afficher une ligne -GLOBAL fonction_procsline Lire_ligne; // Afficher ou lire une ligne -GLOBAL fonction_display_zoom Display_zoomed_screen; // Affiche rapidement toute la partie zoomée … l'écran (en faisant attention de ne pas effacer le menu) -GLOBAL fonction_display_brush_Color_zoom Display_brush_Color_zoom; -GLOBAL fonction_display_brush_Mono_zoom Display_brush_Mono_zoom; -GLOBAL fonction_display_brush_Color_zoom Clear_brush_zoom; - - // Données sur les dimensions de l'écran - -GLOBAL int Resolution_actuelle; // Résolution graphique courante -GLOBAL short Ecran_original_X; // |_ Dimensions de l'écran d'origine de -GLOBAL short Ecran_original_Y; // | l'image qui vient d'ˆtre chargée. -GLOBAL short Largeur_ecran; // Largeur de l'écran -GLOBAL short Hauteur_ecran; // Hauteur de l'écran -GLOBAL short Limite_Haut; // | -GLOBAL short Limite_Bas; // |_ Limites dans lesquelles -GLOBAL short Limite_Gauche; // | on peut écrire -GLOBAL short Limite_Droite; // | -GLOBAL short Limite_visible_Bas; // |_ Derniers points visibles -GLOBAL short Limite_visible_Droite; // | "… l'image" - -GLOBAL short Limite_Haut_Zoom; // | -GLOBAL short Limite_Bas_Zoom; // |_ Limites dans lesquelles on peut -GLOBAL short Limite_Gauche_Zoom; // | écrire dans la partie zoomée -GLOBAL short Limite_Droite_Zoom; // | -GLOBAL short Limite_visible_Bas_Zoom; // |_ Derniers points visibles "… -GLOBAL short Limite_visible_Droite_Zoom; // | l'image" dans la partie zoomée - -GLOBAL byte * Buffer_de_ligne_horizontale; // Buffer d'affichage de lignes - - // Données sur l'image actuelle: - -GLOBAL byte * Principal_Ecran; // Ecran virtuel courant -GLOBAL T_Palette Principal_Palette; // Palette de l'écran en cours - -GLOBAL byte Principal_Image_modifiee; // L'image courante a été modifiée -GLOBAL short Principal_Largeur_image; // Largeur de l'image dans laquelle l'utilisateur désire travailler -GLOBAL short Principal_Hauteur_image; // Hauteur de l'image dans laquelle l'utilisateur désire travailler -GLOBAL short Principal_Decalage_X; // Décalage en X de l'écran par rapport au début de l'image -GLOBAL short Principal_Decalage_Y; // Décalage en Y de l'écran par rapport au début de l'image -GLOBAL short Ancien_Principal_Decalage_X; -GLOBAL short Ancien_Principal_Decalage_Y; - -GLOBAL char Principal_Repertoire_fichier[256]; // |_ Nom complet = -GLOBAL char Principal_Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier -GLOBAL byte Principal_Format_fichier; // Format auquel il faut lire et écrire le fichier -GLOBAL byte Principal_Format; // Format du fileselect -GLOBAL short Principal_File_list_Position; // Début de la partie affichée dans la liste de fichiers -GLOBAL short Principal_File_list_Decalage; // Décalage de la barre de sélection dans le fileselector -GLOBAL char Principal_Repertoire_courant[256]; // Répertoire actuel sur disque -GLOBAL char Principal_Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image - -GLOBAL short Principal_Split; // Position en X du bord gauche du split de la loupe -GLOBAL short Principal_X_Zoom; // (Menu_Facteur_X) + Position en X du bord droit du split de la loupe -GLOBAL float Principal_Proportion_split; // Proportion de la zone non-zoomée par rapport … l'écran - - // Données sur le brouillon: - -GLOBAL byte * Brouillon_Ecran; // Ecran virtuel brouillon -GLOBAL T_Palette Brouillon_Palette; // Palette de l'écran de brouillon - -GLOBAL byte Brouillon_Image_modifiee; // Le brouillon a été modifié -GLOBAL short Brouillon_Largeur_image; // Largeur du brouillon dans laquelle l'utilisateur désire travailler -GLOBAL short Brouillon_Hauteur_image; // Hauteur du brouillon dans laquelle l'utilisateur désire travailler -GLOBAL short Brouillon_Decalage_X; // Décalage en X du brouillon par rapport au début de l'image -GLOBAL short Brouillon_Decalage_Y; // Décalage en Y du brouillon par rapport au début de l'image -GLOBAL short Ancien_Brouillon_Decalage_X; -GLOBAL short Ancien_Brouillon_Decalage_Y; - -GLOBAL char Brouillon_Repertoire_fichier[256]; // |_ Nom complet = -GLOBAL char Brouillon_Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier -GLOBAL byte Brouillon_Format_fichier; // Format auquel il faut lire et écrire le fichier -GLOBAL byte Brouillon_Format; // Format du fileselect -GLOBAL short Brouillon_File_list_Position; // Début de la partie affichée dans la liste de fichiers -GLOBAL short Brouillon_File_list_Decalage; // Décalage de la barre de sélection dans le fileselector -GLOBAL char Brouillon_Repertoire_courant[256]; // Répertoire actuel sur disque -GLOBAL char Brouillon_Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image - -GLOBAL short Brouillon_Split; // Position en X du bord gauche du split de la loupe -GLOBAL short Brouillon_X_Zoom; // (Menu_Facteur_X) + Position en X du bord droit du split de la loupe -GLOBAL float Brouillon_Proportion_split; // Proportion de la zone non-zoomée par rapport … l'écran - -GLOBAL byte Brouillon_Loupe_Mode; // On est en mode loupe dans le brouillon -GLOBAL word Brouillon_Loupe_Facteur; // Facteur de zoom dans le brouillon -GLOBAL word Brouillon_Loupe_Hauteur; // Largeur de la fenˆtre de zoom dans le brouillon -GLOBAL word Brouillon_Loupe_Largeur; // Hauteur de la fenˆtre de zoom dans le brouillon -GLOBAL short Brouillon_Loupe_Decalage_X;// Decalage horizontal de la fenˆtre de zoom dans le brouillon -GLOBAL short Brouillon_Loupe_Decalage_Y;// Decalage vertical de la fenˆtre de zoom dans le brouillon - -GLOBAL byte Masque_copie_couleurs[256]; // Tableau des couleurs … copier vers le brouillon - - // Sauvegarde de l'image: - -GLOBAL byte * Ecran_backup; // Sauvegarde de l'écran virtuel courant -GLOBAL S_Liste_de_pages * Principal_Backups; // Liste des pages de backup de la page principale -GLOBAL S_Liste_de_pages * Brouillon_Backups; // Liste des pages de backup de la page de brouillon - - - // Données sur la brosse: - -GLOBAL byte * Brosse; // Sprite de la brosse -GLOBAL word Brosse_Decalage_X; // Centre horizontal de la brosse -GLOBAL word Brosse_Decalage_Y; // Centre vertical de la brosse -GLOBAL word Brosse_Largeur; // Largeur de la brosse -GLOBAL word Brosse_Hauteur; // Hauteur de la brosse - -GLOBAL char Brosse_Repertoire_fichier[256]; // | -GLOBAL char Brosse_Nom_fichier[13]; // | -GLOBAL byte Brosse_Format_fichier; // | Infos sur le -GLOBAL byte Brosse_Format; // |_ sélecteur de -GLOBAL short Brosse_File_list_Position; // | fichiers de la -GLOBAL short Brosse_File_list_Decalage; // | brosse. -GLOBAL char Brosse_Repertoire_courant[256]; // | -GLOBAL char Brosse_Commentaire[TAILLE_COMMENTAIRE+1]; // | - -GLOBAL byte Brosse_Centre_rotation_defini; // | Infos sur le -GLOBAL short Brosse_Centre_rotation_X; // |- centre de rotation -GLOBAL short Brosse_Centre_rotation_Y; // | de la brosse - - // Données sur le menu - -GLOBAL byte Menu_visible; // Le menu est actif … l'écran -GLOBAL word Menu_Ordonnee; // Ordonnée o— commence le menu -GLOBAL word Menu_Ordonnee_Texte; // Ordonnée o— commence le texte dans le menu -GLOBAL word Menu_Facteur_X; // Facteur de grossissement du menu en X -GLOBAL word Menu_Facteur_Y; // Facteur de grossissement du menu en Y -GLOBAL word Menu_Taille_couleur; // Taille d'une couleur de la palette du menu - - - // Données sur la fenˆtre de menu - -GLOBAL byte Une_fenetre_est_ouverte; - -GLOBAL word Fenetre_Pos_X; // Position du bord gauche de la fenˆtre dans l'écran -GLOBAL word Fenetre_Pos_Y; // Position du bord haut de la fenˆtre dans l'écran -GLOBAL word Fenetre_Largeur; // Largeur de la fenˆtre -GLOBAL word Fenetre_Hauteur; // Hauteur de la fenˆtre - -GLOBAL byte Menu_visible_avant_fenetre; // Le menu était visible avant d'ouvir une fenˆtre -GLOBAL word Menu_Ordonnee_avant_fenetre; // Ordonnée du menu avant d'ouvrir une fenˆtre -GLOBAL byte Cacher_pinceau_avant_fenetre;// Le pinceau étatit déj… caché avant l'ouverture de la fenetre? - -GLOBAL word Nb_boutons_fenetre; -GLOBAL struct Fenetre_Bouton_normal * Fenetre_Liste_boutons_normal; -GLOBAL struct Fenetre_Bouton_palette * Fenetre_Liste_boutons_palette; -GLOBAL struct Fenetre_Bouton_scroller * Fenetre_Liste_boutons_scroller; -GLOBAL struct Fenetre_Bouton_special * Fenetre_Liste_boutons_special; -GLOBAL int Fenetre_Attribut1; -GLOBAL int Fenetre_Attribut2; - - - - -// Définition des boutons //////////////////////////////////////////////////// - -GLOBAL struct -{ - // Informations sur l'aspect du bouton (graphisme): - word Decalage_X; // Décalage par rapport … la gauche du menu - word Decalage_Y; // Décalage par rapport au haut du menu - word Largeur; // Largeur du bouton - word Hauteur; // Hauteur du bouton - byte Enfonce; // Le bouton est enfoncé - byte Forme; // Forme du bouton - - // Information sur les clicks de la souris: - fonction_action Gauche; // Action déclenchée par un click gauche sur le bouton - fonction_action Droite; // Action déclenchée par un click droit sur le bouton - word Raccourci_gauche; // Raccourci clavier équivalent … un click gauche sur le bouton - word Raccourci_droite; // Raccourci clavier équivalent … un click droit sur le bouton - - // Informations sur le désenclenchement du bouton géré par le moteur: - fonction_action Desenclencher; // Action appelée lors du désenclenchement du bouton - byte Famille; // Ensemble de boutons auquel celui-ci appartient - -} Bouton[NB_BOUTONS]; - - - -// Informations sur les différents modes de dessin - -GLOBAL fonction_effet Fonction_effet; - -GLOBAL byte * FX_Feedback_Ecran; - -GLOBAL byte Exclude_color[256]; // Couleurs … exclure pour Meilleure_couleur - - // Mode smear: - -GLOBAL byte Smear_Mode; // Le mode smear est enclenché -GLOBAL byte Smear_Debut; // On vient juste de commencer une opération en Smear -GLOBAL byte * Smear_Brosse; // Sprite de la brosse de Smear -GLOBAL word Smear_Brosse_Largeur; // Largeur de la brosse de Smear -GLOBAL word Smear_Brosse_Hauteur; // Hauteur de la brosse de Smear -GLOBAL short Smear_Min_X,Smear_Max_X,Smear_Min_Y,Smear_Max_Y; // Bornes de la Brosse du smear - - // Mode shade: - -GLOBAL struct T_Shade Shade_Liste[8]; // Listes de shade -GLOBAL byte Shade_Actuel; // Numéro du shade en cours -GLOBAL byte * Shade_Table; // Table de conversion de shade en cours -GLOBAL byte Shade_Table_gauche[256]; // Table de conversion de shade pour un clic gauche -GLOBAL byte Shade_Table_droite[256]; // Table de conversion de shade pour un clic droit -GLOBAL byte Shade_Mode; // Le mode shade est enclenché - -GLOBAL byte Quick_shade_Mode; // Le mode quick-shade est enclenché -GLOBAL byte Quick_shade_Step; // Pas du mode quick-shade -GLOBAL byte Quick_shade_Loop; // Normal / Loop / No sat. - - // Mode stencil: - -GLOBAL byte Stencil_Mode; // Le mode stencil est enclenché -GLOBAL byte Stencil[256]; // Tableau des couleurs protégées - - // Mode grille: - -GLOBAL byte Snap_Mode; // Le mode grille est enclenché -GLOBAL short Snap_Largeur; // Largeur entre 2 points de la grille -GLOBAL short Snap_Hauteur; // Hauteur entre 2 points de la grille -GLOBAL short Snap_Decalage_X; // Position en X du point le + … gauche -GLOBAL short Snap_Decalage_Y; // Position en Y du point le + en haut - - // Mode trame: - -GLOBAL byte Trame_Mode; // Le mode Trame est enclenché -GLOBAL byte Trame[16][16]; // Sprite de la trame -GLOBAL word TRAME_PREDEFINIE[12][16]; // Trames préséfinies (compactées sur 16*16 bits) -GLOBAL short Trame_Largeur; // Largeur de la trame -GLOBAL short Trame_Hauteur; // Hauteur de la trame - - // Mode colorize: - -GLOBAL byte Colorize_Mode; // Le mode Colorize est enclenché -GLOBAL byte Colorize_Opacite; // Intensité du Colorize -GLOBAL byte Colorize_Mode_en_cours; // Le type de Colorize en cours (0-2) -GLOBAL word Table_de_multiplication_par_Facteur_A[64]; -GLOBAL word Table_de_multiplication_par_Facteur_B[64]; - - // Mode smooth: - -GLOBAL byte Smooth_Mode; // Le mode Smooth est enclenché -GLOBAL byte Smooth_Matrice[3][3]; // La matrice du Smooth actuel - - // Mode Tiling: - -GLOBAL byte Tiling_Mode; // Le mode Tiling est enclenché -GLOBAL short Tiling_Decalage_X; // Décalage du tiling en X -GLOBAL short Tiling_Decalage_Y; // Décalage du tiling en Y - - // Mode Mask - -GLOBAL byte Mask_Mode; // Le mode Masque est enclenché -GLOBAL byte Mask[256]; // Tableau des couleurs constituant le masque - - // Mode loupe: - -GLOBAL byte Loupe_Mode; -GLOBAL word Loupe_Facteur; -GLOBAL word Loupe_Hauteur; -GLOBAL word Loupe_Largeur; -GLOBAL short Loupe_Decalage_X; -GLOBAL short Loupe_Decalage_Y; -GLOBAL word * Table_mul_facteur_zoom; -GLOBAL word TABLE_ZOOM[NB_FACTEURS_DE_ZOOM][512]; - -#ifdef VARIABLES_GLOBALES - word FACTEUR_ZOOM[NB_FACTEURS_DE_ZOOM]={2,3,4,5,6,8,10,12,14,16,18,20}; -#else - extern word FACTEUR_ZOOM[NB_FACTEURS_DE_ZOOM]; -#endif - - // Données sur les ellipses et les cercles: - -GLOBAL dword Table_des_carres[1025]; -GLOBAL long Ellipse_Curseur_X; -GLOBAL long Ellipse_Curseur_Y; -GLOBAL long Ellipse_Rayon_vertical_au_carre; -GLOBAL long Ellipse_Rayon_horizontal_au_carre; -GLOBAL long Ellipse_Limite_High; -GLOBAL long Ellipse_Limite_Low; -GLOBAL long Cercle_Curseur_X; -GLOBAL long Cercle_Curseur_Y; -GLOBAL long Cercle_Limite; - - // Données sur les dégradés: - -GLOBAL short Degrade_Borne_Inferieure; // Plus petite couleur englobée par le dégradé -GLOBAL short Degrade_Borne_Superieure; // Plus grande couleur englobée par le dégradé -GLOBAL int Degrade_Inverse; // Booléen "Le dégradé est en réalité inversé" -GLOBAL long Degrade_Intervalle_bornes; // = Abs(Degrade_Borne_Inferieure-Degrade_Borne_Superieure)+1 -GLOBAL long Degrade_Intervalle_total; // Valeur maximum des indices passés … la fonction de dégradé (!!! >0 !!!) -GLOBAL long Degrade_Melange_aleatoire; // Facteur de mélange (1-256+) du dégradé -GLOBAL fonction_degrade Traiter_degrade; // Fonction de traitement du dégradé, varie selon la méthode choisie par l'utilisateur. -GLOBAL fonction_afficheur Traiter_pixel_de_degrade; // Redirection de l'affichage - -GLOBAL struct T_Degrade_Tableau Degrade_Tableau[16]; // Données de tous les dégradés -GLOBAL int Degrade_Courant; // Indice du tableau correspondant au dégradé courant - - - - // Données sur le Spray: - -GLOBAL byte Spray_Mode; // Mode Mono(1) ou Multicolore(0) -GLOBAL short Spray_Size; // DiamŠtre du spray en pixels -GLOBAL byte Spray_Delay; // Délai en VBLs entre 2 "pschiitt" -GLOBAL byte Spray_Mono_flow; // Nombre de pixels qui sortent en mˆme temps en mono -GLOBAL byte Spray_Multi_flow[256]; // Idem pour chaque couleur - - - // Données diverses sur le programme: - -GLOBAL byte Sortir_du_programme; -GLOBAL char Repertoire_du_programme[256]; // Répertoire dans lequel se trouve le programme -GLOBAL char Repertoire_initial[256]; // Répertoire … partir duquel … été lancé le programme -GLOBAL byte Fore_color; -GLOBAL byte Back_color; -GLOBAL byte Mode_de_dessin_en_cours; -GLOBAL byte Courbe_en_cours; -GLOBAL byte Ligne_en_cours; -GLOBAL byte Couleur_debut_palette; -GLOBAL byte Un_fichier_a_ete_passe_en_parametre; -GLOBAL byte Une_resolution_a_ete_passee_en_parametre; // utilisée uniquement si la variable précédente est … 1 - - // Variables concernant l'OBJ DIVERS - -GLOBAL word INPUT_Nouveau_Mouse_X; -GLOBAL word INPUT_Nouveau_Mouse_Y; -GLOBAL byte INPUT_Nouveau_Mouse_K; -GLOBAL byte INPUT_Keyb_mode; - -GLOBAL int MC_Indice; -GLOBAL int MC_DR; -GLOBAL int MC_DV; -GLOBAL int MC_DB; -GLOBAL int * MC_Table_differences; - - // Variables concernant l'OBJ VIDEO - - // Partie concernant le mode X: -GLOBAL dword MODE_X_Decalage_synchro; -GLOBAL word MODE_X_Largeur_de_ligne; -GLOBAL dword MODE_X_Valeur_initiale_de_esi; -GLOBAL dword MODE_X_Valeur_initiale_de_edi; - // Partie concernant le VESA: -GLOBAL byte Granularite; // Facteur de gestion de la granularité de la carte -GLOBAL byte VESA_Erreur; -GLOBAL byte * VESA_WinFuncPtr; // Handler software de changement de banque -GLOBAL word * VESA_Liste_des_modes; -GLOBAL dword VESA_Decalage_synchro; -GLOBAL word VESA_Largeur_ecran_en_dword; -GLOBAL byte VESA_Banque_en_cours; // Variable normalement locale … VIDEO.ASM -GLOBAL byte VESA_Derniere_banque_Fenetre_A_utilisee; -GLOBAL byte VESA_Derniere_banque_Fenetre_B_utilisee; -GLOBAL fonction_action VESA_Change_banque_lecture; -GLOBAL fonction_action VESA_Change_banque_ecriture; -GLOBAL fonction_action VESA_Change_banque_lect_ecr; -GLOBAL byte VESA_Version_Unite; -GLOBAL byte VESA_Version_Decimale; -GLOBAL char VESA_Constructeur[TAILLE_NOM_CONSTRUCTEUR+1]; -GLOBAL word VESA_Taille_memoire; - - // Les différents sprites: - -GLOBAL byte BLOCK_MENU[HAUTEUR_MENU][LARGEUR_MENU]; -GLOBAL byte SPRITE_MENU[NB_SPRITES_MENU][HAUTEUR_SPRITE_MENU][LARGEUR_SPRITE_MENU]; -GLOBAL byte SPRITE_EFFET[NB_SPRITES_EFFETS][HAUTEUR_SPRITE_MENU][LARGEUR_SPRITE_MENU]; - -GLOBAL byte * Logo_GrafX2; - -GLOBAL byte Fonte_systeme[256*8*8]; -GLOBAL byte Fonte_fun [256*8*8]; -GLOBAL byte Fonte_help [315][6][8]; -GLOBAL byte * Fonte; - - // Les données de l'aide: - -GLOBAL struct Section_d_aide Table_d_aide[NB_SECTIONS_AIDE]; -GLOBAL byte Section_d_aide_en_cours; // Indice de la table d'aide en cours de consultation -GLOBAL word Position_d_aide_en_cours; // Numéro de la ligne d'aide en cours de consultation - - // Données sur les opérations - -GLOBAL word Operation_avant_interruption; // Nø de l'opération en cours avant l'utilisation d'une interruption -GLOBAL word Operation_en_cours; // Nø de l'opération en cours -GLOBAL word Operation_Pile[TAILLE_PILE_OPERATIONS]; // Pile simplifiée -GLOBAL byte Operation_Taille_pile; // Taille effective de la pile (0=vide) -GLOBAL byte Operation_dans_loupe; // Indique si l'opération a commencé dans la partie Zoomée ou non - -GLOBAL short Pipette_Couleur; -GLOBAL short Pipette_X; -GLOBAL short Pipette_Y; - - -#ifdef VARIABLES_GLOBALES - byte CURSEUR_D_OPERATION[NB_OPERATIONS]= - { - FORME_CURSEUR_CIBLE , // Dessin … la main continu - FORME_CURSEUR_CIBLE , // Dessin … la main discontinu - FORME_CURSEUR_CIBLE , // Dessin … la main point par point - FORME_CURSEUR_CIBLE , // Lignes - FORME_CURSEUR_CIBLE , // Lignes reliées - FORME_CURSEUR_CIBLE , // Lignes centrées - FORME_CURSEUR_CIBLE_XOR , // Rectangle vide - FORME_CURSEUR_CIBLE_XOR , // Rectangle plein - FORME_CURSEUR_CIBLE , // Cercles vides - FORME_CURSEUR_CIBLE , // Cercles pleins - FORME_CURSEUR_CIBLE , // Ellipses vides - FORME_CURSEUR_CIBLE , // Ellipses pleines - FORME_CURSEUR_CIBLE , // Fill - FORME_CURSEUR_CIBLE , // Remplacer - FORME_CURSEUR_CIBLE_XOR , // Prise de brosse rectangulaire - FORME_CURSEUR_CIBLE , // Prise d'une brosse multiforme - FORME_CURSEUR_CIBLE_PIPETTE , // Récupération d'une couleur - FORME_CURSEUR_RECTANGLE_XOR , // Positionnement de la fenˆtre de loupe - FORME_CURSEUR_CIBLE , // Courbe … 3 points - FORME_CURSEUR_CIBLE , // Courbe … 4 points - FORME_CURSEUR_CIBLE , // Spray - FORME_CURSEUR_CIBLE , // Polygone - FORME_CURSEUR_CIBLE , // Polyforme - FORME_CURSEUR_CIBLE , // Polyfill - FORME_CURSEUR_CIBLE , // Polyforme rempli - FORME_CURSEUR_MULTIDIRECTIONNEL, // Scroll - FORME_CURSEUR_CIBLE , // Cercles dégradés - FORME_CURSEUR_CIBLE , // Ellipses dégradées - FORME_CURSEUR_ROTATE_XOR , // Faire tourner brosse - FORME_CURSEUR_CIBLE_XOR , // Etirer brosse - FORME_CURSEUR_CIBLE // Deformer brosse - }; -#else - extern byte CURSEUR_D_OPERATION[NB_OPERATIONS]; -#endif - - - // Procédures … appeler: Opération,Mouse_K,Etat de la pile - -GLOBAL struct -{ - byte Effacer_curseur; // Booléen "il faut effacer le curseur pour l'opéra." - fonction_action Action; // Action appelée -} Operation[NB_OPERATIONS][3][TAILLE_PILE_OPERATIONS]; - - - -// Informations sur les lecteurs - -GLOBAL byte Nb_drives; -GLOBAL struct T_Drive Drive[26]; -GLOBAL byte SPRITE_DRIVE[NB_SPRITES_DRIVES][HAUTEUR_SPRITE_DRIVE][LARGEUR_SPRITE_DRIVE]; - - -// -- Section des informations sur les formats de fichiers ------------------ - - // Comptage du nb d'éléments dans la liste: -GLOBAL short Liste_Nb_elements; -GLOBAL short Liste_Nb_fichiers; -GLOBAL short Liste_Nb_repertoires; - // Tˆte de la liste chaŒnée: -GLOBAL struct Element_de_liste_de_fileselect * Liste_du_fileselect; - -// ------------------- Inititialisation des formats connus ------------------- - -#include "loadsave.h" -void Rien_du_tout(void); - -#ifdef VARIABLES_GLOBALES - // Extension du format - char Format_Extension[NB_FORMATS_CONNUS][4]= - { - "PKM", // PKM - "LBM", // LBM - "GIF", // GIF - "BMP", // BMP - "PCX", // PCX - "IMG", // IMG - "SC?", // SCx - "PI1", // PI1 - "PC1", // PC1 - "CEL", // CEL - "KCF", // KCF - "PAL" // PAL - }; - - // Fonction … appeler pour vérifier la signature du fichier - fonction_action Format_Test[NB_FORMATS_LOAD]= - { - Test_PKM, // PKM - Test_LBM, // LBM - Test_GIF, // GIF - Test_BMP, // BMP - Test_PCX, // PCX - Test_IMG, // IMG - Test_SCx, // SCx - Test_PI1, // PI1 - Test_PC1, // PC1 - Test_CEL, // CEL - Test_KCF, // KCF - Test_PAL // PAL - }; - - // Fonction … appeler pour charger l'image - fonction_action Format_Load[NB_FORMATS_LOAD]= - { - Load_PKM, // PKM - Load_LBM, // LBM - Load_GIF, // GIF - Load_BMP, // BMP - Load_PCX, // PCX - Load_IMG, // IMG - Load_SCx, // SCx - Load_PI1, // PI1 - Load_PC1, // PC1 - Load_CEL, // CEL - Load_KCF, // KCF - Load_PAL // PAL - }; - - // Fonction … appeler pour sauvegarder l'image - fonction_action Format_Save[NB_FORMATS_SAVE]= - { - Save_PKM, // PKM - Save_LBM, // LBM - Save_GIF, // GIF - Save_BMP, // BMP - Save_PCX, // PCX - Save_IMG, // IMG - Save_SCx, // SCx - Save_PI1, // PI1 - Save_PC1, // PC1 - Save_CEL, // CEL - Save_KCF, // KCF - Save_PAL // PAL - }; - - // indique si l'on doit considérer que l'image n'est plus modifiée - byte Format_Backup_done[NB_FORMATS_CONNUS]= - { - 1, // PKM - 1, // LBM - 1, // GIF - 1, // BMP - 1, // PCX - 1, // IMG - 1, // SCx - 1, // PI1 - 1, // PC1 - 1, // CEL - 0, // KCF - 0 // PAL - }; - - // Le format de fichier autorise un commentaire - byte Format_Commentaire[NB_FORMATS_CONNUS]= - { - 1, // PKM - 0, // LBM - 0, // GIF - 0, // BMP - 0, // PCX - 0, // IMG - 0, // SCx - 0, // PI1 - 0, // PC1 - 0, // CEL - 0, // KCF - 0 // PAL - }; -#else - extern char Format_Extension[NB_FORMATS_CONNUS][4]; - extern fonction_action Format_Load[NB_FORMATS_LOAD]; - extern fonction_action Format_Save[NB_FORMATS_SAVE]; - extern fonction_action Format_Test[NB_FORMATS_LOAD]; - extern byte Format_Backup_done[NB_FORMATS_CONNUS]; - extern byte Format_Commentaire[NB_FORMATS_CONNUS]; -#endif - -GLOBAL signed char Erreur_fichier; // 0: opération I/O OK - // 1: Erreur dŠs le début de l'opération - // 2: Erreur durant l'opération => données modifiées - //-1: Interruption du chargement d'une preview - -GLOBAL int Ligne_INI; - -GLOBAL fonction_afficheur Pixel_de_chargement; -GLOBAL fonction_lecteur Lit_pixel_de_sauvegarde; +GLOBAL struct S_Config +{ + byte Fonte; + int Lire_les_fichiers_caches; + int Lire_les_repertoires_caches; + int Lire_les_repertoires_systemes; + byte Afficher_limites_image; + byte Curseur; + byte Maximize_preview; + byte Auto_set_res; + byte Coords_rel; + byte Backup; + byte Adjust_brush_pick; + byte Auto_save; + byte Nb_pages_Undo; + byte Indice_Sensibilite_souris_X; + byte Indice_Sensibilite_souris_Y; + byte Mouse_Facteur_de_correction_X; + byte Mouse_Facteur_de_correction_Y; + byte Valeur_tempo_jauge_gauche; + byte Valeur_tempo_jauge_droite; + long Chrono_delay; + struct Composantes Coul_menu_pref[4]; + int Nb_max_de_vertex_par_polygon; + byte Clear_palette; + byte Set_resolution_according_to; + byte Ratio; + byte Fast_zoom; + byte Find_file_fast; + byte Couleurs_separees; + byte FX_Feedback; + byte Safety_colors; + byte Opening_message; + byte Clear_with_stencil; + byte Auto_discontinuous; + byte Taille_ecran_dans_GIF; + byte Auto_nb_used; + byte Resolution_par_defaut; +} Config; + + // Tableau des touches spéciales +GLOBAL word Config_Touche[NB_TOUCHES_SPECIALES]; + + +struct S_Mode_video +{ + short Largeur; + short Hauteur; + byte Mode; + word Facteur_X; + word Facteur_Y; + char Ratio[5]; + signed char Refresh; // <0 => entrelacé + word Mode_VESA_de_base; + void * Pointeur; + byte Etat; // 0:Cool 1:OK ; 2:Bof ; 3:Naze ; si on rajoute +128 => incompatible +}; +GLOBAL struct S_Mode_video Mode_video[NB_MODES_VIDEO]; + + +GLOBAL struct +{ + byte Granularite; // Facteur de gestion de la granularité + byte Code_fenetres; // Utilisation des fenˆtres: 0=AA 1=BB 2=AB 3=BA + byte * WinFuncPtr; + byte * Adresse_physique_LFB; // Si = 0 => Pas de LFB + dword Taille_LFB; // Taille de la mémoire LFB +} VESA_Mode_Infos[4]; + + + + // Palette par défaut + +GLOBAL T_Palette Palette_defaut; + + // Couleurs du menu + +GLOBAL byte CM_Noir; +GLOBAL byte CM_Fonce; +GLOBAL byte CM_Clair; +GLOBAL byte CM_Blanc; +GLOBAL byte CM_Trans; +GLOBAL struct Composantes Coul_menu_pref[4]; + + // Etat des entrées + +GLOBAL word Mouse_X; // Abscisse de la souris +GLOBAL word Mouse_Y; // Ordonnée de la souris +GLOBAL byte Mouse_K; // Etat des boutons de la souris +GLOBAL word Touche; +GLOBAL Uint8* Etat_Du_Clavier; // Scancode de la touche en cours et etat des touches de ctrl +GLOBAL byte Touche_ASCII; // Code ASCII de la touche en cours + +GLOBAL byte Mouse_Facteur_de_correction_X; +GLOBAL byte Mouse_Facteur_de_correction_Y; + +GLOBAL byte Autoriser_changement_de_couleur_pendant_operation; + + // Données sur le curseur + +GLOBAL byte Forme_curseur; +GLOBAL byte Forme_curseur_avant_fenetre; // Forme du curseur avant l'ouverture d'une fenˆtre +GLOBAL byte Forcer_affichage_curseur; // Forcer l'affichage du curseur au prochain Get_input(); +GLOBAL byte Cacher_curseur; +GLOBAL byte Curseur_dans_menu; // Booléen "Le curseur se trouve dans le menu" +GLOBAL byte Curseur_dans_menu_precedent; // Booléen "Le curseur se trouvait précédemment dans le menu" +GLOBAL word Curseur_Decalage_X[NB_SPRITES_CURSEUR]; // Coordonnées X du point sensible de curseurs en sprite +GLOBAL word Curseur_Decalage_Y[NB_SPRITES_CURSEUR]; // Coordonnées Y du point sensible de curseurs en sprite +GLOBAL byte SPRITE_CURSEUR[NB_SPRITES_CURSEUR][HAUTEUR_SPRITE_CURSEUR][LARGEUR_SPRITE_CURSEUR]; // Dessins des sprites de curseur +GLOBAL byte FOND_CURSEUR[HAUTEUR_SPRITE_CURSEUR][LARGEUR_SPRITE_CURSEUR]; // Contenu du dessous du curseur + + // Données sur le pinceau + +GLOBAL byte Pinceau_Forme; +GLOBAL byte Pinceau_Forme_avant_fill; +GLOBAL byte Pinceau_Forme_avant_pipette; +GLOBAL byte Pinceau_Forme_avant_lasso; +GLOBAL byte Cacher_pinceau; +GLOBAL short Pinceau_X; +GLOBAL short Pinceau_Y; +GLOBAL byte SPRITE_PINCEAU [NB_SPRITES_PINCEAU][HAUTEUR_PINCEAU][LARGEUR_PINCEAU]; +GLOBAL word Pinceau_predefini_Largeur[NB_SPRITES_PINCEAU]; +GLOBAL word Pinceau_predefini_Hauteur[NB_SPRITES_PINCEAU]; +GLOBAL byte Pinceau_Type[NB_SPRITES_PINCEAU]; +GLOBAL word Pinceau_predefini_Decalage_X[NB_SPRITES_PINCEAU]; +GLOBAL word Pinceau_predefini_Decalage_Y[NB_SPRITES_PINCEAU]; +GLOBAL byte * Pinceau_Sprite; +GLOBAL short Pinceau_Largeur; +GLOBAL short Pinceau_Hauteur; +GLOBAL short Pinceau_Decalage_X; +GLOBAL short Pinceau_Decalage_Y; + + // Commandes graphiques + +GLOBAL fonction_afficheur Pixel; // Affiche un point … l'écran +GLOBAL fonction_afficheur Pixel_dans_menu;// Affiche un point dans le menu (ou pas si le menu est invisible) +GLOBAL fonction_lecteur Lit_pixel; // Teste la couleur d'un pixel dans l'écran +GLOBAL fonction_effaceur Clear_screen; // Efface rapidement tout l'écran (en faisant attention de ne pas effacer le menu) +GLOBAL fonction_display Display_screen; // Affiche rapidement tout l'écran (en faisant attention de ne pas effacer le menu) +GLOBAL fonction_block Block; // Affiche rapidement un bloc … l'écran +GLOBAL fonction_afficheur Pixel_Preview_Normal; // Affiche un point de l'image … l'écran en mode normal (pas en mode loupe) +GLOBAL fonction_afficheur Pixel_Preview_Loupe; // Affiche un point de l'image … l'écran en mode loupe +GLOBAL fonction_afficheur Pixel_Preview; // Affiche un point de l'image … l'écran en fonction de l'état du mode loupe +GLOBAL fonction_Ligne_XOR Ligne_horizontale_XOR;// Affiche une ligne horizontale en XOR (pour placer la loupe) +GLOBAL fonction_Ligne_XOR Ligne_verticale_XOR; // Affiche une ligne verticale en XOR (pour placer la loupe) +GLOBAL fonction_display_brush_Color Display_brush_Color; // Affiche une partie de la brosse en couleur +GLOBAL fonction_display_brush_Mono Display_brush_Mono; // Affiche une partie de la brosse en monochrome +GLOBAL fonction_display_brush_Color Clear_brush; // Efface la partie de la brosse affichée … l'écran +GLOBAL fonction_remap Remap_screen; // Remappe une partie de l'écran avec les nouvelles couleurs du menu +GLOBAL fonction_procsline Afficher_ligne; // Afficher une ligne +GLOBAL fonction_procsline Lire_ligne; // Afficher ou lire une ligne +GLOBAL fonction_display_zoom Display_zoomed_screen; // Affiche rapidement toute la partie zoomée … l'écran (en faisant attention de ne pas effacer le menu) +GLOBAL fonction_display_brush_Color_zoom Display_brush_Color_zoom; +GLOBAL fonction_display_brush_Mono_zoom Display_brush_Mono_zoom; +GLOBAL fonction_display_brush_Color_zoom Clear_brush_zoom; + + // Données sur les dimensions de l'écran + +GLOBAL int Resolution_actuelle; // Résolution graphique courante +GLOBAL short Ecran_original_X; // |_ Dimensions de l'écran d'origine de +GLOBAL short Ecran_original_Y; // | l'image qui vient d'ˆtre chargée. +GLOBAL short Largeur_ecran; // Largeur de l'écran +GLOBAL short Hauteur_ecran; // Hauteur de l'écran +GLOBAL short Limite_Haut; // | +GLOBAL short Limite_Bas; // |_ Limites dans lesquelles +GLOBAL short Limite_Gauche; // | on peut écrire +GLOBAL short Limite_Droite; // | +GLOBAL short Limite_visible_Bas; // |_ Derniers points visibles +GLOBAL short Limite_visible_Droite; // | "… l'image" + +GLOBAL short Limite_Haut_Zoom; // | +GLOBAL short Limite_Bas_Zoom; // |_ Limites dans lesquelles on peut +GLOBAL short Limite_Gauche_Zoom; // | écrire dans la partie zoomée +GLOBAL short Limite_Droite_Zoom; // | +GLOBAL short Limite_visible_Bas_Zoom; // |_ Derniers points visibles "… +GLOBAL short Limite_visible_Droite_Zoom; // | l'image" dans la partie zoomée + +GLOBAL byte * Buffer_de_ligne_horizontale; // Buffer d'affichage de lignes + + // Données sur l'image actuelle: + +GLOBAL byte * Principal_Ecran; // Ecran virtuel courant +GLOBAL T_Palette Principal_Palette; // Palette de l'écran en cours + +GLOBAL byte Principal_Image_modifiee; // L'image courante a été modifiée +GLOBAL short Principal_Largeur_image; // Largeur de l'image dans laquelle l'utilisateur désire travailler +GLOBAL short Principal_Hauteur_image; // Hauteur de l'image dans laquelle l'utilisateur désire travailler +GLOBAL short Principal_Decalage_X; // Décalage en X de l'écran par rapport au début de l'image +GLOBAL short Principal_Decalage_Y; // Décalage en Y de l'écran par rapport au début de l'image +GLOBAL short Ancien_Principal_Decalage_X; +GLOBAL short Ancien_Principal_Decalage_Y; + +GLOBAL char Principal_Repertoire_fichier[256]; // |_ Nom complet = +GLOBAL char Principal_Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier +GLOBAL byte Principal_Format_fichier; // Format auquel il faut lire et écrire le fichier +GLOBAL byte Principal_Format; // Format du fileselect +GLOBAL short Principal_File_list_Position; // Début de la partie affichée dans la liste de fichiers +GLOBAL short Principal_File_list_Decalage; // Décalage de la barre de sélection dans le fileselector +GLOBAL char Principal_Repertoire_courant[256]; // Répertoire actuel sur disque +GLOBAL char Principal_Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image + +GLOBAL short Principal_Split; // Position en X du bord gauche du split de la loupe +GLOBAL short Principal_X_Zoom; // (Menu_Facteur_X) + Position en X du bord droit du split de la loupe +GLOBAL float Principal_Proportion_split; // Proportion de la zone non-zoomée par rapport … l'écran + + // Données sur le brouillon: + +GLOBAL byte * Brouillon_Ecran; // Ecran virtuel brouillon +GLOBAL T_Palette Brouillon_Palette; // Palette de l'écran de brouillon + +GLOBAL byte Brouillon_Image_modifiee; // Le brouillon a été modifié +GLOBAL short Brouillon_Largeur_image; // Largeur du brouillon dans laquelle l'utilisateur désire travailler +GLOBAL short Brouillon_Hauteur_image; // Hauteur du brouillon dans laquelle l'utilisateur désire travailler +GLOBAL short Brouillon_Decalage_X; // Décalage en X du brouillon par rapport au début de l'image +GLOBAL short Brouillon_Decalage_Y; // Décalage en Y du brouillon par rapport au début de l'image +GLOBAL short Ancien_Brouillon_Decalage_X; +GLOBAL short Ancien_Brouillon_Decalage_Y; + +GLOBAL char Brouillon_Repertoire_fichier[256]; // |_ Nom complet = +GLOBAL char Brouillon_Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier +GLOBAL byte Brouillon_Format_fichier; // Format auquel il faut lire et écrire le fichier +GLOBAL byte Brouillon_Format; // Format du fileselect +GLOBAL short Brouillon_File_list_Position; // Début de la partie affichée dans la liste de fichiers +GLOBAL short Brouillon_File_list_Decalage; // Décalage de la barre de sélection dans le fileselector +GLOBAL char Brouillon_Repertoire_courant[256]; // Répertoire actuel sur disque +GLOBAL char Brouillon_Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image + +GLOBAL short Brouillon_Split; // Position en X du bord gauche du split de la loupe +GLOBAL short Brouillon_X_Zoom; // (Menu_Facteur_X) + Position en X du bord droit du split de la loupe +GLOBAL float Brouillon_Proportion_split; // Proportion de la zone non-zoomée par rapport … l'écran + +GLOBAL byte Brouillon_Loupe_Mode; // On est en mode loupe dans le brouillon +GLOBAL word Brouillon_Loupe_Facteur; // Facteur de zoom dans le brouillon +GLOBAL word Brouillon_Loupe_Hauteur; // Largeur de la fenˆtre de zoom dans le brouillon +GLOBAL word Brouillon_Loupe_Largeur; // Hauteur de la fenˆtre de zoom dans le brouillon +GLOBAL short Brouillon_Loupe_Decalage_X;// Decalage horizontal de la fenˆtre de zoom dans le brouillon +GLOBAL short Brouillon_Loupe_Decalage_Y;// Decalage vertical de la fenˆtre de zoom dans le brouillon + +GLOBAL byte Masque_copie_couleurs[256]; // Tableau des couleurs … copier vers le brouillon + + // Sauvegarde de l'image: + +GLOBAL byte * Ecran_backup; // Sauvegarde de l'écran virtuel courant +GLOBAL S_Liste_de_pages * Principal_Backups; // Liste des pages de backup de la page principale +GLOBAL S_Liste_de_pages * Brouillon_Backups; // Liste des pages de backup de la page de brouillon + + + // Données sur la brosse: + +GLOBAL byte * Brosse; // Sprite de la brosse +GLOBAL word Brosse_Decalage_X; // Centre horizontal de la brosse +GLOBAL word Brosse_Decalage_Y; // Centre vertical de la brosse +GLOBAL word Brosse_Largeur; // Largeur de la brosse +GLOBAL word Brosse_Hauteur; // Hauteur de la brosse + +GLOBAL char Brosse_Repertoire_fichier[256]; // | +GLOBAL char Brosse_Nom_fichier[13]; // | +GLOBAL byte Brosse_Format_fichier; // | Infos sur le +GLOBAL byte Brosse_Format; // |_ sélecteur de +GLOBAL short Brosse_File_list_Position; // | fichiers de la +GLOBAL short Brosse_File_list_Decalage; // | brosse. +GLOBAL char Brosse_Repertoire_courant[256]; // | +GLOBAL char Brosse_Commentaire[TAILLE_COMMENTAIRE+1]; // | + +GLOBAL byte Brosse_Centre_rotation_defini; // | Infos sur le +GLOBAL short Brosse_Centre_rotation_X; // |- centre de rotation +GLOBAL short Brosse_Centre_rotation_Y; // | de la brosse + + // Données sur le menu + +GLOBAL byte Menu_visible; // Le menu est actif … l'écran +GLOBAL word Menu_Ordonnee; // Ordonnée o— commence le menu +GLOBAL word Menu_Ordonnee_Texte; // Ordonnée o— commence le texte dans le menu +GLOBAL word Menu_Facteur_X; // Facteur de grossissement du menu en X +GLOBAL word Menu_Facteur_Y; // Facteur de grossissement du menu en Y +GLOBAL word Menu_Taille_couleur; // Taille d'une couleur de la palette du menu + + + // Données sur la fenˆtre de menu + +GLOBAL byte Une_fenetre_est_ouverte; + +GLOBAL word Fenetre_Pos_X; // Position du bord gauche de la fenˆtre dans l'écran +GLOBAL word Fenetre_Pos_Y; // Position du bord haut de la fenˆtre dans l'écran +GLOBAL word Fenetre_Largeur; // Largeur de la fenˆtre +GLOBAL word Fenetre_Hauteur; // Hauteur de la fenˆtre + +GLOBAL byte Menu_visible_avant_fenetre; // Le menu était visible avant d'ouvir une fenˆtre +GLOBAL word Menu_Ordonnee_avant_fenetre; // Ordonnée du menu avant d'ouvrir une fenˆtre +GLOBAL byte Cacher_pinceau_avant_fenetre;// Le pinceau étatit déj… caché avant l'ouverture de la fenetre? + +GLOBAL word Nb_boutons_fenetre; +GLOBAL struct Fenetre_Bouton_normal * Fenetre_Liste_boutons_normal; +GLOBAL struct Fenetre_Bouton_palette * Fenetre_Liste_boutons_palette; +GLOBAL struct Fenetre_Bouton_scroller * Fenetre_Liste_boutons_scroller; +GLOBAL struct Fenetre_Bouton_special * Fenetre_Liste_boutons_special; +GLOBAL int Fenetre_Attribut1; +GLOBAL int Fenetre_Attribut2; + + + + +// Définition des boutons //////////////////////////////////////////////////// + +GLOBAL struct +{ + // Informations sur l'aspect du bouton (graphisme): + word Decalage_X; // Décalage par rapport … la gauche du menu + word Decalage_Y; // Décalage par rapport au haut du menu + word Largeur; // Largeur du bouton + word Hauteur; // Hauteur du bouton + byte Enfonce; // Le bouton est enfoncé + byte Forme; // Forme du bouton + + // Information sur les clicks de la souris: + fonction_action Gauche; // Action déclenchée par un click gauche sur le bouton + fonction_action Droite; // Action déclenchée par un click droit sur le bouton + word Raccourci_gauche; // Raccourci clavier équivalent … un click gauche sur le bouton + word Raccourci_droite; // Raccourci clavier équivalent … un click droit sur le bouton + + // Informations sur le désenclenchement du bouton géré par le moteur: + fonction_action Desenclencher; // Action appelée lors du désenclenchement du bouton + byte Famille; // Ensemble de boutons auquel celui-ci appartient + +} Bouton[NB_BOUTONS]; + + + +// Informations sur les différents modes de dessin + +GLOBAL fonction_effet Fonction_effet; + +GLOBAL byte * FX_Feedback_Ecran; + +GLOBAL byte Exclude_color[256]; // Couleurs … exclure pour Meilleure_couleur + + // Mode smear: + +GLOBAL byte Smear_Mode; // Le mode smear est enclenché +GLOBAL byte Smear_Debut; // On vient juste de commencer une opération en Smear +GLOBAL byte * Smear_Brosse; // Sprite de la brosse de Smear +GLOBAL word Smear_Brosse_Largeur; // Largeur de la brosse de Smear +GLOBAL word Smear_Brosse_Hauteur; // Hauteur de la brosse de Smear +GLOBAL short Smear_Min_X,Smear_Max_X,Smear_Min_Y,Smear_Max_Y; // Bornes de la Brosse du smear + + // Mode shade: + +GLOBAL struct T_Shade Shade_Liste[8]; // Listes de shade +GLOBAL byte Shade_Actuel; // Numéro du shade en cours +GLOBAL byte * Shade_Table; // Table de conversion de shade en cours +GLOBAL byte Shade_Table_gauche[256]; // Table de conversion de shade pour un clic gauche +GLOBAL byte Shade_Table_droite[256]; // Table de conversion de shade pour un clic droit +GLOBAL byte Shade_Mode; // Le mode shade est enclenché + +GLOBAL byte Quick_shade_Mode; // Le mode quick-shade est enclenché +GLOBAL byte Quick_shade_Step; // Pas du mode quick-shade +GLOBAL byte Quick_shade_Loop; // Normal / Loop / No sat. + + // Mode stencil: + +GLOBAL byte Stencil_Mode; // Le mode stencil est enclenché +GLOBAL byte Stencil[256]; // Tableau des couleurs protégées + + // Mode grille: + +GLOBAL byte Snap_Mode; // Le mode grille est enclenché +GLOBAL short Snap_Largeur; // Largeur entre 2 points de la grille +GLOBAL short Snap_Hauteur; // Hauteur entre 2 points de la grille +GLOBAL short Snap_Decalage_X; // Position en X du point le + … gauche +GLOBAL short Snap_Decalage_Y; // Position en Y du point le + en haut + + // Mode trame: + +GLOBAL byte Trame_Mode; // Le mode Trame est enclenché +GLOBAL byte Trame[16][16]; // Sprite de la trame +GLOBAL word TRAME_PREDEFINIE[12][16]; // Trames préséfinies (compactées sur 16*16 bits) +GLOBAL short Trame_Largeur; // Largeur de la trame +GLOBAL short Trame_Hauteur; // Hauteur de la trame + + // Mode colorize: + +GLOBAL byte Colorize_Mode; // Le mode Colorize est enclenché +GLOBAL byte Colorize_Opacite; // Intensité du Colorize +GLOBAL byte Colorize_Mode_en_cours; // Le type de Colorize en cours (0-2) +GLOBAL word Table_de_multiplication_par_Facteur_A[64]; +GLOBAL word Table_de_multiplication_par_Facteur_B[64]; + + // Mode smooth: + +GLOBAL byte Smooth_Mode; // Le mode Smooth est enclenché +GLOBAL byte Smooth_Matrice[3][3]; // La matrice du Smooth actuel + + // Mode Tiling: + +GLOBAL byte Tiling_Mode; // Le mode Tiling est enclenché +GLOBAL short Tiling_Decalage_X; // Décalage du tiling en X +GLOBAL short Tiling_Decalage_Y; // Décalage du tiling en Y + + // Mode Mask + +GLOBAL byte Mask_Mode; // Le mode Masque est enclenché +GLOBAL byte Mask[256]; // Tableau des couleurs constituant le masque + + // Mode loupe: + +GLOBAL byte Loupe_Mode; +GLOBAL word Loupe_Facteur; +GLOBAL word Loupe_Hauteur; +GLOBAL word Loupe_Largeur; +GLOBAL short Loupe_Decalage_X; +GLOBAL short Loupe_Decalage_Y; +GLOBAL word * Table_mul_facteur_zoom; +GLOBAL word TABLE_ZOOM[NB_FACTEURS_DE_ZOOM][512]; + +#ifdef VARIABLES_GLOBALES + word FACTEUR_ZOOM[NB_FACTEURS_DE_ZOOM]={2,3,4,5,6,8,10,12,14,16,18,20}; +#else + extern word FACTEUR_ZOOM[NB_FACTEURS_DE_ZOOM]; +#endif + + // Données sur les ellipses et les cercles: + +GLOBAL dword Table_des_carres[1025]; +GLOBAL long Ellipse_Curseur_X; +GLOBAL long Ellipse_Curseur_Y; +GLOBAL long Ellipse_Rayon_vertical_au_carre; +GLOBAL long Ellipse_Rayon_horizontal_au_carre; +GLOBAL long Ellipse_Limite_High; +GLOBAL long Ellipse_Limite_Low; +GLOBAL long Cercle_Curseur_X; +GLOBAL long Cercle_Curseur_Y; +GLOBAL long Cercle_Limite; + + // Données sur les dégradés: + +GLOBAL short Degrade_Borne_Inferieure; // Plus petite couleur englobée par le dégradé +GLOBAL short Degrade_Borne_Superieure; // Plus grande couleur englobée par le dégradé +GLOBAL int Degrade_Inverse; // Booléen "Le dégradé est en réalité inversé" +GLOBAL long Degrade_Intervalle_bornes; // = Abs(Degrade_Borne_Inferieure-Degrade_Borne_Superieure)+1 +GLOBAL long Degrade_Intervalle_total; // Valeur maximum des indices passés … la fonction de dégradé (!!! >0 !!!) +GLOBAL long Degrade_Melange_aleatoire; // Facteur de mélange (1-256+) du dégradé +GLOBAL fonction_degrade Traiter_degrade; // Fonction de traitement du dégradé, varie selon la méthode choisie par l'utilisateur. +GLOBAL fonction_afficheur Traiter_pixel_de_degrade; // Redirection de l'affichage + +GLOBAL struct T_Degrade_Tableau Degrade_Tableau[16]; // Données de tous les dégradés +GLOBAL int Degrade_Courant; // Indice du tableau correspondant au dégradé courant + + + + // Données sur le Spray: + +GLOBAL byte Spray_Mode; // Mode Mono(1) ou Multicolore(0) +GLOBAL short Spray_Size; // DiamŠtre du spray en pixels +GLOBAL byte Spray_Delay; // Délai en VBLs entre 2 "pschiitt" +GLOBAL byte Spray_Mono_flow; // Nombre de pixels qui sortent en mˆme temps en mono +GLOBAL byte Spray_Multi_flow[256]; // Idem pour chaque couleur + + + // Données diverses sur le programme: + +GLOBAL byte Sortir_du_programme; +GLOBAL char Repertoire_du_programme[256]; // Répertoire dans lequel se trouve le programme +GLOBAL char Repertoire_initial[256]; // Répertoire … partir duquel … été lancé le programme +GLOBAL byte Fore_color; +GLOBAL byte Back_color; +GLOBAL byte Mode_de_dessin_en_cours; +GLOBAL byte Courbe_en_cours; +GLOBAL byte Ligne_en_cours; +GLOBAL byte Couleur_debut_palette; +GLOBAL byte Un_fichier_a_ete_passe_en_parametre; +GLOBAL byte Une_resolution_a_ete_passee_en_parametre; // utilisée uniquement si la variable précédente est … 1 + + // Variables concernant l'OBJ DIVERS + +GLOBAL word INPUT_Nouveau_Mouse_X; +GLOBAL word INPUT_Nouveau_Mouse_Y; +GLOBAL byte INPUT_Nouveau_Mouse_K; +GLOBAL byte INPUT_Keyb_mode; + +GLOBAL int MC_Indice; +GLOBAL int MC_DR; +GLOBAL int MC_DV; +GLOBAL int MC_DB; +GLOBAL int * MC_Table_differences; + + // Variables concernant l'OBJ VIDEO + + // Partie concernant le mode X: +GLOBAL dword MODE_X_Decalage_synchro; +GLOBAL word MODE_X_Largeur_de_ligne; +GLOBAL dword MODE_X_Valeur_initiale_de_esi; +GLOBAL dword MODE_X_Valeur_initiale_de_edi; + // Partie concernant le VESA: +GLOBAL byte Granularite; // Facteur de gestion de la granularité de la carte +GLOBAL byte VESA_Erreur; +GLOBAL byte * VESA_WinFuncPtr; // Handler software de changement de banque +GLOBAL word * VESA_Liste_des_modes; +GLOBAL dword VESA_Decalage_synchro; +GLOBAL word VESA_Largeur_ecran_en_dword; +GLOBAL byte VESA_Banque_en_cours; // Variable normalement locale … VIDEO.ASM +GLOBAL byte VESA_Derniere_banque_Fenetre_A_utilisee; +GLOBAL byte VESA_Derniere_banque_Fenetre_B_utilisee; +GLOBAL fonction_action VESA_Change_banque_lecture; +GLOBAL fonction_action VESA_Change_banque_ecriture; +GLOBAL fonction_action VESA_Change_banque_lect_ecr; +GLOBAL byte VESA_Version_Unite; +GLOBAL byte VESA_Version_Decimale; +GLOBAL char VESA_Constructeur[TAILLE_NOM_CONSTRUCTEUR+1]; +GLOBAL word VESA_Taille_memoire; + + // Les différents sprites: + +GLOBAL byte BLOCK_MENU[HAUTEUR_MENU][LARGEUR_MENU]; +GLOBAL byte SPRITE_MENU[NB_SPRITES_MENU][HAUTEUR_SPRITE_MENU][LARGEUR_SPRITE_MENU]; +GLOBAL byte SPRITE_EFFET[NB_SPRITES_EFFETS][HAUTEUR_SPRITE_MENU][LARGEUR_SPRITE_MENU]; + +GLOBAL byte * Logo_GrafX2; + +GLOBAL byte Fonte_systeme[256*8*8]; +GLOBAL byte Fonte_fun [256*8*8]; +GLOBAL byte Fonte_help [315][6][8]; +GLOBAL byte * Fonte; + + // Les données de l'aide: + +GLOBAL struct Section_d_aide Table_d_aide[NB_SECTIONS_AIDE]; +GLOBAL byte Section_d_aide_en_cours; // Indice de la table d'aide en cours de consultation +GLOBAL word Position_d_aide_en_cours; // Numéro de la ligne d'aide en cours de consultation + + // Données sur les opérations + +GLOBAL word Operation_avant_interruption; // Nø de l'opération en cours avant l'utilisation d'une interruption +GLOBAL word Operation_en_cours; // Nø de l'opération en cours +GLOBAL word Operation_Pile[TAILLE_PILE_OPERATIONS]; // Pile simplifiée +GLOBAL byte Operation_Taille_pile; // Taille effective de la pile (0=vide) +GLOBAL byte Operation_dans_loupe; // Indique si l'opération a commencé dans la partie Zoomée ou non + +GLOBAL short Pipette_Couleur; +GLOBAL short Pipette_X; +GLOBAL short Pipette_Y; + + +#ifdef VARIABLES_GLOBALES + byte CURSEUR_D_OPERATION[NB_OPERATIONS]= + { + FORME_CURSEUR_CIBLE , // Dessin … la main continu + FORME_CURSEUR_CIBLE , // Dessin … la main discontinu + FORME_CURSEUR_CIBLE , // Dessin … la main point par point + FORME_CURSEUR_CIBLE , // Lignes + FORME_CURSEUR_CIBLE , // Lignes reliées + FORME_CURSEUR_CIBLE , // Lignes centrées + FORME_CURSEUR_CIBLE_XOR , // Rectangle vide + FORME_CURSEUR_CIBLE_XOR , // Rectangle plein + FORME_CURSEUR_CIBLE , // Cercles vides + FORME_CURSEUR_CIBLE , // Cercles pleins + FORME_CURSEUR_CIBLE , // Ellipses vides + FORME_CURSEUR_CIBLE , // Ellipses pleines + FORME_CURSEUR_CIBLE , // Fill + FORME_CURSEUR_CIBLE , // Remplacer + FORME_CURSEUR_CIBLE_XOR , // Prise de brosse rectangulaire + FORME_CURSEUR_CIBLE , // Prise d'une brosse multiforme + FORME_CURSEUR_CIBLE_PIPETTE , // Récupération d'une couleur + FORME_CURSEUR_RECTANGLE_XOR , // Positionnement de la fenˆtre de loupe + FORME_CURSEUR_CIBLE , // Courbe … 3 points + FORME_CURSEUR_CIBLE , // Courbe … 4 points + FORME_CURSEUR_CIBLE , // Spray + FORME_CURSEUR_CIBLE , // Polygone + FORME_CURSEUR_CIBLE , // Polyforme + FORME_CURSEUR_CIBLE , // Polyfill + FORME_CURSEUR_CIBLE , // Polyforme rempli + FORME_CURSEUR_MULTIDIRECTIONNEL, // Scroll + FORME_CURSEUR_CIBLE , // Cercles dégradés + FORME_CURSEUR_CIBLE , // Ellipses dégradées + FORME_CURSEUR_ROTATE_XOR , // Faire tourner brosse + FORME_CURSEUR_CIBLE_XOR , // Etirer brosse + FORME_CURSEUR_CIBLE // Deformer brosse + }; +#else + extern byte CURSEUR_D_OPERATION[NB_OPERATIONS]; +#endif + + + // Procédures … appeler: Opération,Mouse_K,Etat de la pile + +GLOBAL struct +{ + byte Effacer_curseur; // Booléen "il faut effacer le curseur pour l'opéra." + fonction_action Action; // Action appelée +} Operation[NB_OPERATIONS][3][TAILLE_PILE_OPERATIONS]; + + + +// Informations sur les lecteurs + +GLOBAL byte Nb_drives; +GLOBAL struct T_Drive Drive[26]; +GLOBAL byte SPRITE_DRIVE[NB_SPRITES_DRIVES][HAUTEUR_SPRITE_DRIVE][LARGEUR_SPRITE_DRIVE]; + + +// -- Section des informations sur les formats de fichiers ------------------ + + // Comptage du nb d'éléments dans la liste: +GLOBAL short Liste_Nb_elements; +GLOBAL short Liste_Nb_fichiers; +GLOBAL short Liste_Nb_repertoires; + // Tˆte de la liste chaŒnée: +GLOBAL struct Element_de_liste_de_fileselect * Liste_du_fileselect; + +// ------------------- Inititialisation des formats connus ------------------- + +#include "loadsave.h" +void Rien_du_tout(void); + +#ifdef VARIABLES_GLOBALES + // Extension du format + char Format_Extension[NB_FORMATS_CONNUS][4]= + { + "PKM", // PKM + "LBM", // LBM + "GIF", // GIF + "BMP", // BMP + "PCX", // PCX + "IMG", // IMG + "SC?", // SCx + "PI1", // PI1 + "PC1", // PC1 + "CEL", // CEL + "KCF", // KCF + "PAL" // PAL + }; + + // Fonction … appeler pour vérifier la signature du fichier + fonction_action Format_Test[NB_FORMATS_LOAD]= + { + Test_PKM, // PKM + Test_LBM, // LBM + Test_GIF, // GIF + Test_BMP, // BMP + Test_PCX, // PCX + Test_IMG, // IMG + Test_SCx, // SCx + Test_PI1, // PI1 + Test_PC1, // PC1 + Test_CEL, // CEL + Test_KCF, // KCF + Test_PAL // PAL + }; + + // Fonction … appeler pour charger l'image + fonction_action Format_Load[NB_FORMATS_LOAD]= + { + Load_PKM, // PKM + Load_LBM, // LBM + Load_GIF, // GIF + Load_BMP, // BMP + Load_PCX, // PCX + Load_IMG, // IMG + Load_SCx, // SCx + Load_PI1, // PI1 + Load_PC1, // PC1 + Load_CEL, // CEL + Load_KCF, // KCF + Load_PAL // PAL + }; + + // Fonction … appeler pour sauvegarder l'image + fonction_action Format_Save[NB_FORMATS_SAVE]= + { + Save_PKM, // PKM + Save_LBM, // LBM + Save_GIF, // GIF + Save_BMP, // BMP + Save_PCX, // PCX + Save_IMG, // IMG + Save_SCx, // SCx + Save_PI1, // PI1 + Save_PC1, // PC1 + Save_CEL, // CEL + Save_KCF, // KCF + Save_PAL // PAL + }; + + // indique si l'on doit considérer que l'image n'est plus modifiée + byte Format_Backup_done[NB_FORMATS_CONNUS]= + { + 1, // PKM + 1, // LBM + 1, // GIF + 1, // BMP + 1, // PCX + 1, // IMG + 1, // SCx + 1, // PI1 + 1, // PC1 + 1, // CEL + 0, // KCF + 0 // PAL + }; + + // Le format de fichier autorise un commentaire + byte Format_Commentaire[NB_FORMATS_CONNUS]= + { + 1, // PKM + 0, // LBM + 0, // GIF + 0, // BMP + 0, // PCX + 0, // IMG + 0, // SCx + 0, // PI1 + 0, // PC1 + 0, // CEL + 0, // KCF + 0 // PAL + }; +#else + extern char Format_Extension[NB_FORMATS_CONNUS][4]; + extern fonction_action Format_Load[NB_FORMATS_LOAD]; + extern fonction_action Format_Save[NB_FORMATS_SAVE]; + extern fonction_action Format_Test[NB_FORMATS_LOAD]; + extern byte Format_Backup_done[NB_FORMATS_CONNUS]; + extern byte Format_Commentaire[NB_FORMATS_CONNUS]; +#endif + +GLOBAL signed char Erreur_fichier; // 0: opération I/O OK + // 1: Erreur dŠs le début de l'opération + // 2: Erreur durant l'opération => données modifiées + //-1: Interruption du chargement d'une preview + +GLOBAL int Ligne_INI; + +GLOBAL fonction_afficheur Pixel_de_chargement; +GLOBAL fonction_lecteur Lit_pixel_de_sauvegarde; + +/******************** + * Spécifique à SDL * + ********************/ +GLOBAL SDL_Surface * Ecran_SDL; #endif diff --git a/graph.c b/graph.c index 2be3f348..185165a7 100644 --- a/graph.c +++ b/graph.c @@ -1328,6 +1328,7 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur for (Repeat_Menu_Facteur_Y=0;Repeat_Menu_Facteur_Y +#include "global.h" #include "sdlscreen.h" void Pixel_SDL (word X,word Y,byte Couleur) { - puts("Pixel_SDL non implémenté!\n"); + *(((Uint8 *)Ecran_SDL->pixels) + Y * Ecran_SDL->pitch + X)=Couleur; +// SDL_UpdateRect(Ecran_SDL,X,Y,0,0); +} + +static inline void Pixel_SDL_Fast(word X, word Y,byte Couleur) +{ + *(((byte *)Ecran_SDL->pixels) + Y * Ecran_SDL->pitch +X)=Couleur; } byte Lit_Pixel_SDL (word X,word Y) { - puts("Lit_Pixel_SDL non implémenté!\n"); - return 0; + Uint8 * p = ((Uint8 *)Ecran_SDL->pixels) + Y * Ecran_SDL -> pitch + X * Ecran_SDL -> format -> BytesPerPixel; + return *p; } void Effacer_Tout_l_Ecran_SDL (byte Couleur) @@ -23,7 +31,13 @@ void Afficher_partie_de_l_ecran_SDL (word Largeur,word Hauteur,word Largeu void Block_SDL (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur) { - puts("Block_SDL non implémenté!\n"); + SDL_Rect rectangle; + rectangle.x=Debut_X; + rectangle.y=Debut_Y; + rectangle.w=Largeur; + rectangle.h=Hauteur; + SDL_FillRect(Ecran_SDL,&rectangle,Couleur); + SDL_UpdateRect(Ecran_SDL,Debut_X,Debut_Y,Largeur,Hauteur); } void Pixel_Preview_Normal_SDL (word X,word Y,byte Couleur) @@ -53,7 +67,16 @@ void Display_brush_Color_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decala void Display_brush_Mono_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse) { - puts("Display_brush_Mono_SDL non implémenté!\n"); + int i,j; + for(i=0;i