_______________________________________________________________________________________________________________________________________ /* ATTENTION : a cause des references en avant 'Iload_fichier', 'Iload_fichier_and_delete' */ /* et 'Istore_fichier', le fichier $xiii/files$FON' doit etre constitue d'un seul bloc... */ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E B A S E D E G E S T I O N D E S F I C H I E R S " I M A G E S " : */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les fonctions */ /* de base de gestion des fichiers de type */ /* images raster, quelle que soit la definition. */ /* */ /* */ /* Author of '$xiii/files$FON' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U D I R E C T O R Y " images " E T A U D I R E C T O R Y " palettes " : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(files_____faciliter_l_acces_au_directory_images,VRAI))); /* Afin de pouvoir inhiber le dispositif introduit le 20020512101004 (ceci ayant ete */ /* introduit le 20020514152338). */ #define ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE \ FAUX #define NOM_FICHIER_DESIGNE_UNE_PALETTE \ NOTL(ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE) DEFV(Local,DEFV(Logical,INIT(NOM_FICHIER_designe_une_palette,ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE))); /* Afin d'etendre la "puissance" de la definition de 'NOM_FICHIER', ce dispositif ayant ete */ /* introduit le 20020512101004. Ce dispositif peut etre inhibe grace a l'indicateur */ /* precedent 'files_____faciliter_l_acces_au_directory_images'... */ #define ENTREE_DANS_UNE_SECTION_OU_ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE \ Bblock \ EGAL(NOM_FICHIER_designe_une_palette,ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE); \ Eblock #define ENTREE_DANS_UNE_SECTION_OU_NOM_FICHIER_DESIGNE_UNE_PALETTE \ Bblock \ EGAL(NOM_FICHIER_designe_une_palette,NOM_FICHIER_DESIGNE_UNE_PALETTE); \ Eblock /* Procedures destinees a positionner 'NOM_FICHIER_designe_une_palette'... */ #define NOM_FICHIER \ COND(IFEQ(PREMIER_CARACTERE_ITb0(nom_fichier),RACINE_DU_SYSTEME) \ ,nom_fichier \ ,EGAs(chain_Aconcaten2(COND(IL_FAUT(files_____faciliter_l_acces_au_directory_images) \ ,COND(EST_FAUX(NOM_FICHIER_designe_une_palette),directory_images,directory_palettes) \ ,directory_images \ ) \ ,nom_fichier \ ) \ ) \ ) \ /* Generation du nom absolu d'un fichier de type "image", lorsqu'il ne l'est pas deja ; ce */ \ /* test est fait simplement en regardant le premier caractere du nom... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X E C U T I O N E V E N T U E L L E D E P L U S I E U R S F O N C T I O N S : */ /* */ /*************************************************************************************************************************************/ #define EXECUTE_PLUSIEURS_FONCTIONS(Fonction1,Fonction2) \ Bblock \ Test(IL_Y_A_ERREUR(CODE_ERROR(Fonction1))) \ /* Tentative d'execution de la premiere fonction 'Fonction1'. */ \ Bblock \ CODE_ERROR(Fonction2); \ /* En cas d'erreur dans 'Fonction1', on tente la deuxieme fonction 'Fonction2'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Execution de 'Fonction1' puis eventuellement de 'Fonction2' si 'Fonction1' a echoue... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T D E L ' E S P A C E - D I S Q U E L I B R E : */ /* */ /*************************************************************************************************************************************/ #ifndef BUG_SYSTEME_COMMANDE_SYSTEM_1 /* Common,DEFV(Fonction,) : commande 'SYSTEM(...)' utilise 'sh' et non pas 'csh'. */ BFonctionI # define NOM_DE_LA_COMMANDE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES \ "quid" \ /* Nom de la commande 'C-Shell' donnant le nombre d'images libres... */ # define NOM_DE_LA_VARIABLE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES \ "iFREE" \ /* Nom de la variable 'C-Shell' donnant le nombre d'images libres... */ # define TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE \ DEUX \ /* Lorsqu'il n'y a pas suffisamment d'espace-disque de libre, on attend un certain temps */ \ /* avant de renouveler le test... */ DEFV(Common,DEFV(FonctionI,Itest_espace_disque_libre(nombre_d_images_libres))) DEFV(Argument,DEFV(Positive,nombre_d_images_libres)); /* Nombre d'images libres qui sont necessaires... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; DEFV(Logical,INIT(attendre_de_la_place,VRAI)); /* Indicateur qui lorsqu'il est 'VRAI' signifie qu'il faut boucler jusqu'a ce que le */ /* nombre d'images demande soit libre... */ DEFV(CHAR,INIT(POINTERc(commande_quid),COMMANDE_UNDEF)); /* Afin d'envoyer une commande donnant l'espace-disque libre... */ DEFV(Int,INIT(compte_rendu,UNDEF)); /* Compte_rendu de 'NOM_DE_LA_COMMANDE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES'... */ /*..............................................................................................................................*/ EGAp(commande_quid ,chain_Aconcaten3(NOM_DE_LA_COMMANDE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES ,C_SH__REDIRECTION_FICHIER ,PAS_D_ENTREES_SORTIES ) ); /* Generation de la commande donnant l'espace-disque libre... */ /* */ /* Passage de 'C_REDIRECTION_FICHIER' a 'C_SH__REDIRECTION_FICHIER' le 20111117081100... */ Tant(IL_FAUT(attendre_de_la_place)) Bblock EGAL(compte_rendu,SYSTEM(commande_quid)); /* Execution de la commande donnant l'espace disque encore libre... */ Test(PAS_D_ERREUR(compte_rendu)) Bblock Test(IFGE(Gval(NOM_DE_LA_VARIABLE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES) ,nombre_d_images_libres ) ) Bblock EGAL(attendre_de_la_place,FAUX); /* Des qu'il y a assez de place, on arrete d'attendre... */ Eblock ATes Bblock DODO(TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE); /* S'il n'y a pas assez de place, on attend un peu avant de renouveler le test... */ Eblock ETes Eblock ATes Bblock PRINT_ERREUR("la commande 'quid' n'a pas ete executee"); Eblock ETes Eblock ETan CALZ_FreCC(commande_quid); RETU_ERROR; Eblock # undef TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE # undef NOM_DE_LA_VARIABLE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES # undef NOM_DE_LA_COMMANDE_DU_C_SHELL_DONNANT_LE_NOMBRE_D_IMAGES_LIBRES EFonctionI #Aifndef BUG_SYSTEME_COMMANDE_SYSTEM_1 /* Common,DEFV(Fonction,) : commande 'SYSTEM(...)' utilise 'sh' et non pas 'csh'. */ #Eifndef BUG_SYSTEME_COMMANDE_SYSTEM_1 /* Common,DEFV(Fonction,) : commande 'SYSTEM(...)' utilise 'sh' et non pas 'csh'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T D E L ' E X I S T E N C E D ' U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Itest_fichier(nom_fichier))) DEFV(Argument,DEFV(CHAR,DTb0(nom_fichier))); /* Nom du fichier a tester. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(I3ET(IFNE_chaine(nom_fichier,C_VIDE) ,IFNE_chaine(nom_fichier,NOM_PIPE) ,IFNE_chaine(nom_fichier,NOM_PIPE_Local) ) ) Bblock CODE_ERROR(Ftest_fichier(NOM_FICHIER,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS)); /* Test de l'existence du fichier uniquement dans le directory "images"... */ Eblock ATes Bblock Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A L A T A I L L E D ' U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #define TAILLE_RENVOYEE_POUR_UN_PIPE \ PRED(ZERO) \ /* Taille renvoyee dans le cas d'un "pipe". ATTENTION, a cause de cela, une taille de */ \ /* fichier ne peut etre range dans un 'Positive', il lui faut uniquement dans un 'Int'... */ BFonctionI DEFV(Common,DEFV(FonctionI,Isize_fichier(nom_fichier,ARGUMENT_POINTEUR(size_image)))) DEFV(Argument,DEFV(CHAR,DTb0(nom_fichier))); /* Nom du fichier dont on veut la taille. */ DEFV(Argument,DEFV(Int,POINTEUR(size_image))); /* Et pointeur ('ADRESSE') sur la taille en octets. */ /* */ /* ATTENTION, a cause de 'TAILLE_RENVOYEE_POUR_UN_PIPE', la taille ne peut etre un */ /* 'Positive' et donc doit etre obligatoirement un 'Int'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(I3ET(IFNE_chaine(nom_fichier,C_VIDE) ,IFNE_chaine(nom_fichier,NOM_PIPE) ,IFNE_chaine(nom_fichier,NOM_PIPE_Local) ) ) Bblock EXECUTE_PLUSIEURS_FONCTIONS(Fsize_fichier(NOM_FICHIER,size_image,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS) ,Fsize_fichier(nom_fichier,size_image,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS) ); /* Tentative de recuperation de la taille d'un fichier d'abord dans le directory "images", */ /* lorsque le nom n'est pas vide ; en cas d'erreur dans le directory "images", */ /* on consulte le directory courant. */ Eblock ATes Bblock EGAL(INDIRECT(size_image),TAILLE_RENVOYEE_POUR_UN_PIPE); /* Dans le cas d'un "pipe", on renvoie une valeur particuliere... */ Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A L A T A I L L E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Isize_image(nom_image))) /* Fonction introduite le 20060308101621... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom du fichier dont on veut la taille. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(taille_de_l_image,TAILLE_D_UNE_IMAGE_UNDEF)); /* Taille de l'image en octets. La valeur par defaut est passee le 20060908185742 de 'UNDEF' */ /* a 'TAILLE_D_UNE_IMAGE_UNDEF' pour 'v $xiii/files$DEF LES_IMAGES_SONT_ELLES_STANDARDS' */ /* afin de pouvoir ainsi distinguer les images inexistantes, en particulier lors de la */ /* detection automatique des images standards... */ /* */ /* ATTENTION : a cause de la definition de 'v $xiii/files$DEF TAILLE_D_UNE_IMAGE_UNDEF' */ /* (qui contient un 'NEGA(...)'), la variable 'taille_de_l_image' doit imperativement etre */ /* un 'Int' et non pas un 'Positive'... */ /*..............................................................................................................................*/ CALS(Isize_fichier(nom_image,ADRESSE(taille_de_l_image))); RETU(taille_de_l_image); Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E S T R U C T I O N D ' U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Idelete_fichier(nom_fichier))) DEFV(Argument,DEFV(CHAR,DTb0(nom_fichier))); /* Nom du fichier a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(I3ET(IFNE_chaine(nom_fichier,C_VIDE) ,IFNE_chaine(nom_fichier,NOM_PIPE) ,IFNE_chaine(nom_fichier,NOM_PIPE_Local) ) ) Bblock EXECUTE_PLUSIEURS_FONCTIONS(Fdelete_fichier(NOM_FICHIER,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS) ,Fdelete_fichier(nom_fichier,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS) ); /* Tentative de destruction d'un fichier d'abord dans le directory "images", */ /* lorsque le nom n'est pas vide ; en cas d'erreur dans le directory "images", */ /* on consulte le directory courant. */ Eblock ATes Bblock Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A N I P U L A T I O N D ' U N O B J E T E N C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ #define MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_l_objet,type_de_la_composante,espace_de_couleurs,manipulateur,manipuler) \ Bblock \ Test(IL_FAUT(manipuler)) \ Bblock \ DEFV(Int,INIT(code_d_erreur_anterieur,CODE_ERREUR)); \ /* Sauvegarde du code d'erreur avant la sequence 'manipulateur'. */ \ DEFV(CHAR,INIT(POINTERc(nom_composante_objet) \ ,chain_Aconcaten2_sauf_nom_pipe(nom_de_l_objet,c`type_de_la_composante(espace_de_couleurs)) \ ) \ ); \ /* Generation du nom de la composante. */ \ BLOC(manipulateur); \ /* Manipulation arbitraire de la composante courante d'un objet en couleurs... */ \ CALZ_FreCC(nom_composante_objet); \ /* Puis enfin, liberation du nom de la composante... */ \ CODE_ERROR(COND(IL_Y_A_ERREUR(CODE_ERREUR),CODE_ERREUR,code_d_erreur_anterieur)); \ /* S'il y a eu erreur dans la sequence 'manipulateur', c'est ce dernier code d'erreur qui */ \ /* est renvoye, sinon, c'est le code d'erreur anterieur (c'est-a-dire tel qu'il etait avant */ \ /* la sequence 'manipulateur') qui l'est... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Manipulation arbitraire d'une composante d'un objet en couleurs... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A N I P U L A T I O N D ' U N E I M A G E E N C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ #define nom_composante_image \ nom_composante_objet \ /* Pour ameliorer la lisibilite... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E " C O M M A N D E - F I C H I E R " : */ /* */ /* */ /* Definition : */ /* */ /* Lorsqu'un nom de fichier commencera par */ /* le caractere ":", on considerera que la */ /* chaine de caractere qui suit est en fait */ /* le nom d'une commande a executer ; celle-ci */ /* creera un fichier temporaire qui sera donc */ /* ensuite utilise comme s'il avait pre-existe... */ /* */ /* En general, il conviendra d'encadrer la */ /* chaine argument entre des double-quotes '"', */ /* afin de permettre a la commande d'avoir elle- */ /* meme des arguments 'Arg1',...,'ArgN'. Ainsi, */ /* 'csh' etant en general obligatoire afin de */ /* beneficier des variables-shell, on ecrira : */ /* */ /* A=":$CSH commande Arg1 Arg2...ArgN" */ /* */ /* 'A' designant l'introducteur d'un argument */ /* d'une commande (par exemple de $xci). */ /* */ /*************************************************************************************************************************************/ #define INTRODUCTION_D_UNE_COMMANDE_FICHIER \ K_DEUX_POINTS \ /* Caractere introduisant une "commande-fichier". */ #define NOM_DU_FICHIER_D_UNE_COMMANDE_FICHIER \ generation_d_un_nom_absolu_dans_xT_temporaire(C_VIDE) \ /* Nom du fichier temporaire cree lors de l'execution d'une "commande-fichier" ; le */ \ /* nom '.remote' est choisi parce qu'en general, c'est une image recuperee a distance... */ \ /* */ \ /* Jusqu'au 20090418125422, il y avait ici : */ \ /* */ \ /* #define NOM_DU_FICHIER_D_UNE_COMMANDE_FICHIER \ */ \ /* directory_images_manoeuvre/.remote" */ \ /* */ \ /* meme si cela ne sert plus a rien depuis des lustres, cela fut "modernise" a cette date... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' E Q U I V A L E N C E S P O U R L E S */ /* E N T R E E S - S O R T I E S D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ Dunion_13(EQUIVALENCE_DES_FICHIERS_IMAGES ,DEFV(CHAR,POINTEUR(fichier_non_type)); ,DEFV(genere_p,POINTEUR(fichier_type_image)); ,DEFV(genere_CHAR,POINTEUR(fichier_type_imageC)); ,DEFV(genere_vrai_Int_de_base,POINTEUR(fichier_type_imageIB)); ,DEFV(genere_Int,POINTEUR(fichier_type_imageI)); ,DEFV(genere_vrai_Positive_de_base,POINTEUR(fichier_type_imageUB)); ,DEFV(genere_LPositive,POINTEUR(fichier_type_imageU)); ,DEFV(genere_Float,POINTEUR(fichier_type_imageF)); ,DEFV(genere_Double,POINTEUR(fichier_type_imageD)); ,DEFV(genere_complexe,POINTEUR(fichier_type_imageJ)); ,DEFV(genere_hyper_complexe,POINTEUR(fichier_type_imageHJ)); ,DEFV(genere_hyper_hyper_complexe,POINTEUR(fichier_type_imageHHJ)); ,DEFV(genere_p,POINTEUR(fichier_type_liste_de_substitution)); ,NOM_VIDE ); /* Le type 'genere_hyper_hyper_complexe' a ete introduit le 20150227110432... */ Typedef(equivalence_des_fichiers_images,UNIO(EQUIVALENCE_DES_FICHIERS_IMAGES)) /* Definition d'une equivalence entre tous les fichiers de type 'liste_de_substitution' et */ /* 'image' destinee a permettre leur acces via les seules fonctions 'Iload_fichier(...)' et */ /* 'Istore_fichier(...)' quel qu'en soit le type reel... Ceci a ete introduit a cause des */ /* SYSTEMEs 'SYSTEME_SGIND?GA_IRIX_CC' ce qui simultanement a permis de traiter le cas de */ /* 'SYSTEME_ES9000_AIX_CC' qui avait ete resolu incompletement en son temps en deplacant */ /* les sequences relatives aux fonctions 'Iload_fichier(...)' et 'Istore_fichier(...)', ce */ /* etait, on en conviendra aisement, pas tres elegant... */ #define EQUIVALENCE_FICHIER(fichier,type_fichier) \ DEFV(equivalence_des_fichiers_images,fichier_equivalent); \ EGAL(ASD1(fichier_equivalent,type_fichier),fichier); \ /* Definition de l'equivalence d'un fichier de type donne avec un fichier "general"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R D A N S L E P I P E S I L E N O M E S T V I D E */ /* S I N O N */ /* D A N S L E D I R E C T O R Y " i m a g e s " */ /* P U I S */ /* D A N S L E D I R E C T O R Y C O U R A N T */ /* S I E R R E U R : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS ) ) ); /* Cet indicateur indique si les messages d'erreur de 'Fload_fichier_non_formatte(...)' */ /* doivent apparaitre ou pas. En temps normal, ils apparaitront, mais de temps en temps, */ /* lorsque par exemple une image sert de synchronisateur entre deux programmes, on pourra */ /* les inhiber par 'NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS'... */ #define ILOAD_FICHIER(nom_fichier,fichier,size_fichier,unite_fichier,type_fichier) \ Bblock \ EQUIVALENCE_FICHIER(fichier,type_fichier); \ CODE_ERROR(Iload_fichier(nom_fichier \ ,ASD1(fichier_equivalent,fichier_non_type) \ ,INTE(size_fichier) \ ,INTE(unite_fichier) \ ) \ ); \ Eblock \ /* Acces a un fichier de type donne. On notera l'introduction de : */ \ /* */ \ /* INTE(size_fichier) */ \ /* */ \ /* rendu obligatoire sur 'SYSTEME_SGPCM801_IRIX_CC' apres l'introduction de la version */ \ /* '600020000' de '$nC_RELEASE' qui, apparemment "caste" les 'size_fichier' a cause de */ \ /* l'utilisation de 'sizeof(...)' dans 'SIZE_GENERAL', ce "cast" etant apparemment */ \ /* incompatible avec le type attendu pour 'size_fichier' (soit 'Int'). */ #define ILOAD_FICHIER_AVEC_CONVERSION(No,file,size_file,unite_file,type_file,tenter,type,f_conv,Finit,initErr,val_error,errNo_absent) \ /* L'argument logique 'initErr' a ete introduit le 20101118103438 afin de pouvoir bloquer, */ \ /* si besoin est, l'initialisation du fichier par 'Finit(...)' en cas d'erreur et cela pour */ \ /* principalement 'v $xci/sequence$K Iload_image_____initialiser_en_cas_d_erreur_fichier' */ \ /* et donc permettre un reaffichage correct de l'image precedente dans le cas ou l'image */ \ /* courante n'existe pas (ou pas encore...). */ \ Bblock \ Test(IFET(EST_FAUX(errNo_absent) \ ,I3OU(IFEQ_chaine(No,C_VIDE) \ ,IFEQ_chaine(No,NOM_PIPE) \ ,IFEQ_chaine(No,NOM_PIPE_Local) \ ) \ ) \ ) \ /* Test introduit le 20080212093518... */ \ Bblock \ DEFV(type,INIT(valeur_des_elements_du_fichier_lorsque_son_nom_est_absent,val_error)); \ /* Variable introduite le 20080212145410 uniquement afin de faire la difference entre */ \ /* les differents usages qui sont faits de 'val_error'... */ \ \ CALS(Finit(file,valeur_des_elements_du_fichier_lorsque_son_nom_est_absent)); \ /* Lorsque le nom est vide, cela ne constitue plus necessairement une erreur a compter du */ \ /* 20080212093518, a condition evidemment que cela soit autorise (via 'errNo_absent'...). */ \ Eblock \ ATes \ Bblock \ DEFV(Logical,INIT(le_nom_du_fichier_a_ete_converti_en_une_valeur_numerique,FAUX)); \ /* Indicateur precisant si le nom du fichier a ete converti en une valeur numerique ou pas. */ \ \ gLOAD_FICHIER_AVEC_CONVERSION(No \ ,tenter \ ,type \ ,f_conv \ ,BLOC(Bblock \ CALS(Finit(file,valeur_du_nom)); \ /* Initialisation du fichier sans lecture... */ \ Eblock \ ) \ ,le_nom_du_fichier_a_ete_converti_en_une_valeur_numerique \ ); \ \ Test(EST_FAUX(le_nom_du_fichier_a_ete_converti_en_une_valeur_numerique)) \ /* Cas ou il faut lire le fichier de nom 'No' : */ \ Bblock \ ILOAD_FICHIER(No,file,size_file,unite_file,type_file); \ \ Test(IL_Y_A_ERREUR(CODE_ERREUR)) \ Bblock \ DEFV(type,INIT(valeur_des_elements_du_fichier_lorsque_son_acces_est_impossible,val_error)); \ /* Variable introduite le 20080212145410 uniquement afin de faire la difference entre */ \ /* les differents usages qui sont faits de 'val_error'... */ \ \ Test(IL_FAUT(initErr)) \ /* Test introduit le 20101118103438... */ \ Bblock \ CALS(Finit(file,valeur_des_elements_du_fichier_lorsque_son_acces_est_impossible)); \ /* Lorsqu'il y a erreur, on renvoie l'image initialisee avec une valeur par defaut (ce */ \ /* dispositif a ete introduit le 20021004150125 ; avant cette date, seule la fonction */ \ /* 'Iacces_image(...)' procedait explicitement a une initialisation a 'NOIR' en cas de */ \ /* probleme...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ /* Cas ou le nom 'No' du fichier argument etait une bonne valeur numerique... */ \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Acces a un fichier de type donne avec generation si le nom est une valeur numerique. */ BFonctionI DEFV(Common,DEFV(Logical,SINT(Iload_fichier_____tester_le_debordement_du_pipe,TESTER_LE_DEBORDEMENT_DU_PIPE_DANS_Iload_fichier))); /* Cet indicateur introduit le 19980520185424 permet de ne pas tester s'il reste des octets */ /* residuels apres une lecture dans 'Iload_fichier(...)'. Cela a ete introduit, par exemple, */ /* a cause de l'alias 'videoF' ('v $Fdivers videoF') qui echange entre '$xci/vraies_C$X' et */ /* '$xci/Sdisplay_RVB$X' des triplets d'image {$ROUGE,$VERTE,$BLEUE}. Ainsi, apres la */ /* premiere image, par exemple, il en reste deux dans le pipe. On notera au passage qu'il */ /* serait tres utile de pouvoir connaitre le dernier 'Iload_fichier(...)' d'un programme */ /* car c'est en fait sur lui que ce test de debordement serait utile ; malheureusement, il */ /* est trivial de connaitre le premier 'Iload_fichier(...)', par contre, en ce qui concerne */ /* le dernier... */ DEFV(Common,DEFV(FonctionI,Iload_fichier(nom_fichier,fichier,size_fichier,unite_fichier))) DEFV(Argument,DEFV(CHAR,DTb0(nom_fichier))); /* Nom du fichier a lire (lorsque le nom est vide ("") on utilise un pipe), */ DEFV(Argument,DEFV(CHAR,DTb0(fichier))); /* Ou le mettre en memoire, */ DEFV(Argument,DEFV(Int,size_fichier)); /* Et taille en octets. */ DEFV(Argument,DEFV(Int,unite_fichier)); /* Nombre d'octets dans l'unite du fichier. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; DEFV(Int,INIT(nombre_total_d_octets_recuperes,FICHIER_VIDE)); /* Lors de l'entree standard, on recupere le nombre total d'octets recuperes */ /* et ce afin de detecter la fin du flot. L'initialisation est faite avec 'FICHIER_VIDE' */ /* au cas ou le test 'Fflags(...)' serait negatif... */ /*..............................................................................................................................*/ INITIALISATION_D_UNE_IMAGE_ET_VALIDATION_DES_IMAGES_STATIQUES(fichier ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Introduit le 20090317091517 car, en effet, cette validation avant cette date n'etait */ /* faite que dans 'v $xiii/mono_image$FON INITIALISATION_D_UNE_IMAGE_ET_VALIDATION_DES_...' */ /* ce qui etait insuffisant... */ Test(I3OU(IFEQ_chaine(nom_fichier,C_VIDE) ,IFEQ_chaine(nom_fichier,NOM_PIPE) ,IFEQ_chaine(nom_fichier,NOM_PIPE_Local) ) ) Bblock Test(EST_VRAI(STANDARD_IN_EST_UN_PIPE)) Bblock /* Cas ou une entree "pipe" a ete demandee, alors qu'il semble y avoir un "pipe" en entree */ /* (voir le fichier 'v $xtc/files.11$c' en ce qui concerne ce test...). */ /* */ /* ATTENTION, il est impossible d'utiliser ici le test suivant : */ /* */ /* IZNE(ETLO(Fflags(STANDARD_IN),OPEN_READ)) */ /* */ /* comme cela a etait fait le 20040914090620 dans 'Istore_fichier(...)' car, en effet, */ /* la valeur 'OPEN_READ' est nulle et donc le 'IZNE(...)' serait toujours faux... */ /* */ /* L'appel a 'STANDARD_IN_EST_UN_PIPE' a ete introduit le 20051117102806... */ DEFV(Int,INIT(nombre_d_octets_restant_a_lire,size_fichier)); /* Au cas ou la lecture se ferait en plusieurs 'Read'... */ DEFV(Int,INIT(nombre_d_octets_recuperes,UNDEF)); /* Lors de l'entree standard, on recupere le nombre d'octets recuperes par 'Read'. */ DEFV(CHAR,INIT(POINTERc(buffer_courant),fichier)); /* On utilise un pointeur courant dans le buffer, au cas ou la lecture par 'Read' */ /* se ferait en plusieurs fois... */ DEFV(CHAR,INIT(reste_t_il_des_octets,K_UNDEF)); /* Pour voir si par hasard il n'y aurait pas d'autres octets derriere ceux que l'on vient */ /* de recuperer dans fichier'... */ Tant(IFET(IFLT(nombre_total_d_octets_recuperes,size_fichier) ,IFNE(EGAL(nombre_d_octets_recuperes,Read(STANDARD_IN,buffer_courant,nombre_d_octets_restant_a_lire)) ,FICHIER_VIDE ) ) ) Bblock /* Acces a l'entree standard lorsque le nom demande est vide ("") ; on pourra */ /* "piper" plusieurs programmes entre-eux ; on notera que si le fichier est */ /* bien de type "image", 'CODE_ERREUR' est deja 'OK' par initialisation... */ DECR(nombre_d_octets_restant_a_lire,nombre_d_octets_recuperes); /* Au cas ou la lecture se ferait en plusieurs 'Read'... */ INCR(nombre_total_d_octets_recuperes,nombre_d_octets_recuperes); /* Cumul des octets recuperes, */ INCR(buffer_courant,nombre_d_octets_recuperes); /* Et de l'adresse du buffer courant... */ Eblock ETan Test(IL_FAUT(Iload_fichier_____tester_le_debordement_du_pipe)) /* On notera qu'il serait tres utile de pouvoir connaitre le dernier 'Iload_fichier(...)' */ /* d'un programme car c'est en fait sur lui que ce test de debordement serait utile ; */ /* malheureusement, il est trivial de connaitre le premier 'Iload_fichier(...)', par contre, */ /* en ce qui concerne le dernier... */ Bblock Test(IFNE(Read(STANDARD_IN,ADRESSE(reste_t_il_des_octets),SIZE_GENERAL(reste_t_il_des_octets)),FICHIER_VIDE)) Bblock PRINT_ERREUR("il semble qu'il reste des octets dans le 'pipe'"); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas ou une entree "pipe" a ete demandee, alors qu'il ne semble pas y avoir de "pipe" en */ /* entree, mais uniquement la "vraie" entree standard... */ begin_nouveau_block Bblock DEFV(CHAR,INIC(POINTERc(format_EGAq____Iload_fichier) ,chain_Aconcaten2("un (le ","?) 'pipe' d'entree semble absent") ) ); PRINT_ERREUR(format_EGAq____Iload_fichier); /* La presence de 'chain_Aconcaten2(...)' est rendue necessaire par la presence d'un espace */ /* devant le caractere "?", espace qui disparait alors dans 'v $xcc/cpp$D/compacte.1$sed'... */ CALZ_FreCC(format_EGAq____Iload_fichier); Eblock end_nouveau_block CODE_ERROR(ERREUR31); /* Introduit le 20110224094715... */ Eblock ETes Test(IFNE(nombre_total_d_octets_recuperes,size_fichier)) Bblock Test(IFEQ(nombre_total_d_octets_recuperes,FICHIER_VIDE)) Bblock CODE_ERROR(ERREUR07); /* Cas des fins de flot... */ Eblock ATes Bblock CODE_ERROR(ERREUR13); /* Cas des vraies erreurs... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test(IFEQ(PREMIER_CARACTERE_ITb0(nom_fichier),INTRODUCTION_D_UNE_COMMANDE_FICHIER)) Bblock CALS(Idelete_fichier(NOM_DU_FICHIER_D_UNE_COMMANDE_FICHIER)); /* Petit nettoyage preliminaire... */ Test(PAS_D_ERREUR(SYSTEM(SUCC(nom_fichier)))) Bblock /* On execute la commande qui suit le caractere d'introduction ; on fait l'hypothese */ /* qu'elle va generer une image temporaire la ou on va la recuperer ensuite... */ Test(IL_Y_A_ERREUR(Iload_fichier(NOM_DU_FICHIER_D_UNE_COMMANDE_FICHIER,fichier,size_fichier,unite_fichier))) /* Et on essaye de la recuperer... */ Bblock PRINT_ERREUR("lors d'une 'commande-fichier', le fichier-image de manoeuvre n'existe pas"); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ERREUR("lors d'une 'commande-fichier' il y a eu un probleme"); Eblock ETes CALS(Idelete_fichier(NOM_DU_FICHIER_D_UNE_COMMANDE_FICHIER)); /* Petit nettoyage a la fin dans tous les cas... */ Eblock ATes Bblock EXECUTE_PLUSIEURS_FONCTIONS(Fload_fichier_non_formatte(NOM_FICHIER ,fichier ,size_fichier ,unite_fichier ,COND(IL_FAUT(attendre_un_fichier_inexistant_ou_non_conforme) ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS ) ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ) ,Fload_fichier_non_formatte(nom_fichier ,fichier ,size_fichier ,unite_fichier ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ) ); /* Tentative d'ouverture d'un fichier d'abord dans le directory "images", */ /* lorsque le nom n'est pas vide ; en cas d'erreur dans le directory "images", */ /* on consulte le directory courant. On notera la modification apportee le 20020626102936 */ /* relative a 'files_____editer_les_messages_d_erreur_de_lecture_des_fichiers' et qui est */ /* decrite dans 'v $xig/fonct$vv$FON 20020626101948'. */ Eblock ETes Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R D A N S L E P I P E S I L E N O M E S T V I D E */ /* S I N O N */ /* D A N S L E D I R E C T O R Y " i m a g e s " */ /* P U I S */ /* D A N S L E D I R E C T O R Y C O U R A N T */ /* S I E R R E U R P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ #define ILOAD_FICHIER_AND_DELETE(nom_fichier,fichier,size_fichier,unite_fichier,type_fichier) \ Bblock \ EQUIVALENCE_FICHIER(fichier,type_fichier); \ CODE_ERROR(Iload_fichier_and_delete(nom_fichier \ ,ASD1(fichier_equivalent,fichier_non_type) \ ,INTE(size_fichier) \ ,INTE(unite_fichier) \ ) \ ); \ Eblock \ /* Acces a un fichier de type donne et destruction. On notera l'introduction de : */ \ /* */ \ /* INTE(size_fichier) */ \ /* */ \ /* rendu obligatoire sur 'SYSTEME_SGPCM801_IRIX_CC' apres l'introduction de la version */ \ /* '600020000' de '$nC_RELEASE' qui, apparemment "caste" les 'size_fichier' a cause de */ \ /* l'utilisation de 'sizeof(...)' dans 'SIZE_GENERAL', ce "cast" etant apparemment */ \ /* incompatible avec le type attendu pour 'size_fichier' (soit 'Int'). */ BFonctionI DEFV(Common,DEFV(FonctionI,Iload_fichier_and_delete(nom_fichier,fichier,size_fichier,unite_fichier))) DEFV(Argument,DEFV(CHAR,DTb0(nom_fichier))); /* Nom du fichier a lire (lorsque le nom est vide ("") on utilise un pipe), */ DEFV(Argument,DEFV(CHAR,DTb0(fichier))); /* Ou le mettre en memoire, */ DEFV(Argument,DEFV(Int,size_fichier)); /* Et taille en octets. */ DEFV(Argument,DEFV(Int,unite_fichier)); /* Nombre d'octets dans l'unite du fichier. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(PAS_D_ERREUR(Iload_fichier(nom_fichier,fichier,size_fichier,unite_fichier))) /* On essaye de la recuperer, */ Bblock CALS(Idelete_fichier(nom_fichier)); /* Et lorsque l'operation est couronnee de succes, on le detruit ensuite... */ Eblock ATes Bblock Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R D A N S L E P I P E S I L E N O M E S T */ /* V I D E O U S I N O N D A N S L E D I R E C T O R Y " i m a g e s " : */ /* */ /*************************************************************************************************************************************/ #define ISTORE_FICHIER(fichier,nom_fichier,size_fichier,unite_fichier,type_fichier) \ Bblock \ EQUIVALENCE_FICHIER(fichier,type_fichier); \ CODE_ERROR(Istore_fichier(ASD1(fichier_equivalent,fichier_non_type) \ ,nom_fichier \ ,INTE(size_fichier) \ ,INTE(unite_fichier) \ ) \ ); \ Eblock \ /* Archivage d'un fichier de type donne. On notera l'introduction de : */ \ /* */ \ /* INTE(size_fichier) */ \ /* */ \ /* rendu obligatoire sur 'SYSTEME_SGPCM801_IRIX_CC' apres l'introduction de la version */ \ /* '600020000' de '$nC_RELEASE' qui, apparemment "caste" les 'size_fichier' a cause de */ \ /* l'utilisation de 'sizeof(...)' dans 'SIZE_GENERAL', ce "cast" etant apparemment */ \ /* incompatible avec le type attendu pour 'size_fichier' (soit 'Int'). */ BFonctionI DEFV(Common,DEFV(FonctionI,Istore_fichier(fichier,nom_fichier,size_fichier,unite_fichier))) DEFV(Argument,DEFV(CHAR,DTb0(fichier))); /* Ou le prendre en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_fichier))); /* Nom du fichier a ecrire (lorsque le nom est vide ("") on utilise un pipe), */ DEFV(Argument,DEFV(Int,size_fichier)); /* Et sa taille en octets. */ DEFV(Argument,DEFV(Int,unite_fichier)); /* Nombre d'octets dans l'unite du fichier. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(I3OU(IFEQ_chaine(nom_fichier,C_VIDE) ,IFEQ_chaine(nom_fichier,NOM_PIPE) ,IFEQ_chaine(nom_fichier,NOM_PIPE_Local) ) ) Bblock Test(IZEQ(OPEN_WRITE)) Bblock PRINT_ERREUR("le test qui va suivre ne peut pas fonctionner correctement"); /* En effet le 'IZNE(ETLO(...,OPEN_WRITE))' qui va suivre sera toujours FAUX si */ /* 'OPEN_WRITE' est nul... */ Eblock ATes Bblock Eblock ETes Test(IZNE(ETLO(Fflags(STANDARD_OUT),OPEN_WRITE))) /* Ce test a ete introduit le 20040913152923 car il manquait douloureusement. En effet, a */ /* cette date, il y a eu telle fausse manipulation faite sur '$LACT16' via la commande */ /* '$xci/passe_bande$X' a laquelle il manquait l'option "R=" ou un "pipe" ; cela a provoque */ /* l'envoi au '$CSH' de tres nombreuses commandes "esoteriques" (retrouvees dans l'history) */ /* et ce par un mecanisme qui m'echappe largement... */ /* */ /* Avant le 20040914090620, le test qui etait fait ici etait : */ /* */ /* IFEQ(Fflags(STANDARD_OUT),OPEN_WRITE) */ /* */ /* or sur des SYSTEMEs 'SYSTEME_APC_Linux', la reponse de 'Fflags(...)' peut eventuellement */ /* inclure plusieurs autres bits (c'est le cas ici en cas de redirection vers un fichier) ; */ /* d'ou cette nouvelle solution qui teste la presence du bit 'OPEN_WRITE' independamment des */ /* autres bits eventuels... */ Bblock /* Cas ou une sortie "pipe" a ete demandee, alors qu'il semble y avoir un "pipe" en sortie */ /* (voir le fichier 'v $xtc/files.12$c' en ce qui concerne ce test...). */ CALS(Writ(STANDARD_OUT,fichier,size_fichier)); /* Ecriture sur la sortie standard lorsque le nom demande est vide ("") ; on pourra */ /* "piper" plusieurs programmes entre-eux. */ Eblock ATes Bblock /* Cas ou une sortie "pipe" a ete demandee, alors qu'il ne semble pas y avoir de "pipe" en */ /* sortie, mais uniquement la "vraie" sortie standard... */ PRINT_ERREUR("le 'pipe' de sortie semble absent"); CODE_ERROR(ERREUR32); /* Introduit le 20110224094715... */ Eblock ETes Eblock ATes Bblock Test(IFEQ(PREMIER_CARACTERE_ITb0(nom_fichier) ,RACINE_DU_SYSTEME ) ) /* Avant le 20060104171454, le test precedent etait : */ /* */ /* Test(IMEQ(PREMIER_CARACTERE_ITb0(nom_fichier) */ /* ,RACINE_DU_SYSTEME */ /* ,DIRECTORY_COURANT */ /* ) */ /* ) */ /* */ /* mais cela etait stupide car, en effet, des noms d'image ou de directory peuvent */ /* commencer par le caractere 'DIRECTORY_COURANT' (soit "."). Cela s'est vu lors d'un */ /* appel a 'v $xci/multi_02.04$K' avec un nom "R=" vide ; cela a alors cree trois */ /* images nom {$ROUGE,$VERTE,$BLEUE} dans le directory courant qui etait alors '$xci' */ /* ('v $Dhistory/LACT16$D/20060104172327 20060104130731')... */ Bblock CODE_ERROR(Fstore_fichier_non_formatte(fichier ,nom_fichier ,size_fichier ,unite_fichier ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS ) ); /* Tentative d'ouverture d'un fichier a l'aide d'un nom "absolu", lorsque */ /* le nom demande n'est pas vide et debute par le nom de la racine du systeme, */ /* ou par un nom "relatif" au directory courant si le nom debute par l'indicateur */ /* de directory courant... */ Eblock ATes Bblock CODE_ERROR(Fstore_fichier_non_formatte(fichier ,NOM_FICHIER ,size_fichier ,unite_fichier ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS ) ); /* Tentative d'ouverture d'un fichier a l'aide d'un nom "relatif" au directory "images" */ /* lorsque le nom demande n'est pas vide et ne debute pas par le nom de la racine */ /* du systeme. */ Eblock ETes Eblock ETes RETU_ERROR; Eblock EFonctionI #undef NOM_DU_FICHIER_D_UNE_COMMANDE_FICHIER #undef INTRODUCTION_D_UNE_COMMANDE_FICHIER /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T D E L ' E X I S T E N C E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Itest_image(nom_image))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image a tester. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CODE_ERROR(Itest_fichier(nom_image)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E S T R U C T I O N D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Idelete_image(nom_image))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CODE_ERROR(Idelete_fichier(nom_image)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N H I B I T I O N E V E N T U E L L E D E L A M A N I P U L A T I O N */ /* D E S C O M P O S A N T E S D ' U N E I M A G E E N C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(files_____manipuler_la_composante_COMP1_d_une_image_en_couleurs ,MANIPULER_UNE_COMPOSANTE_OBJET_COULEURS ) ) ); DEFV(Common,DEFV(Logical,ZINT(files_____manipuler_la_composante_COMP2_d_une_image_en_couleurs ,MANIPULER_UNE_COMPOSANTE_OBJET_COULEURS ) ) ); DEFV(Common,DEFV(Logical,ZINT(files_____manipuler_la_composante_COMP3_d_une_image_en_couleurs ,MANIPULER_UNE_COMPOSANTE_OBJET_COULEURS ) ) ); /* Afin d'inhiber, eventuellement, 'MANIPULATION_COMPOSANTE_OBJET_COULEURS(...)' pour un */ /* fichier de type "image". */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E S T R U C T I O N D ' U N E I M A G E E N C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_de_l_image,type_de_la_composante,espace_de_couleurs,detruire) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_l_image \ ,type_de_la_composante \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Idelete_image(nom_composante_image));) \ ,detruire \ ); \ Eblock \ /* Tentative de destruction de la composante courante... */ DEFV(Common,DEFV(FonctionI,Idelete_image_en_couleurs(nom_image,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image a detruire. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_image_en_couleurs ); DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_image_en_couleurs ); DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_image_en_couleurs ); RETU_ERROR; Eblock #undef DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E N T A T I V E D E R E D I M E N S I O N N E M E N T : */ /* */ /*************************************************************************************************************************************/ #define BLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS(tenter_un_redimensionnement_en_cas_d_erreur) \ Bblock \ BSaveVariable(Logical,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers); \ /* Mis sous cette forme le 20101115154103... */ \ \ Test(I3OU(IFEQ_chaine(nom_image,C_VIDE) \ ,IFEQ_chaine(nom_image,NOM_PIPE) \ ,IFEQ_chaine(nom_image,NOM_PIPE_Local) \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ Test(IL_FAUT(tenter_un_redimensionnement_en_cas_d_erreur)) \ Bblock \ EGAL(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers,FAUX); \ /* Afin de bloquer les messages d'erreur du premier 'ILOAD_FICHIER_AVEC_CONVERSION(...)' */ \ /* ci-apres car, en effet, ils peuvent disparaitre avec le redimensionnement. Dans le */ \ /* cas ou ces messages ne seraient pas lies a la taille (par exemple : fichier inexistant), */ \ /* ils apparaitront lors du second 'ILOAD_FICHIER_AVEC_CONVERSION(...)' qui est effectue */ \ /* dans 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' (introduit le 20090422094437). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ /* Le 'Eblock' absent est dans 'DEBLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS' et */ \ /* ce a cause de 'BSaveVariable(...)'. */ \ /* */ \ /* Cette procedure a ete introduite le 20090422094437... */ #define DEBLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS \ /* Le 'Bblock' absent est dans 'BLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS(...)' et */ \ /* ce a cause de 'ESaveVariable(...)'. */ \ ESaveVariable(Logical,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers); \ /* Mis sous cette forme le 20101115154103... */ \ Eblock \ /* Introduit le 20090422094437... */ #define SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(type_image,taille_element) \ CAse(SCAL(GvalDefaut("taille_ ## type_image",TAILLE_D_UN_FICHIER_IMAGE(dimXY,taille_element)) \ ,size_p \ ,taille_element \ ) \ ) \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_reconnu),"type_image")); \ EGAp(format_de_imageR,chain_Acopie(format_reconnu)); \ /* Introduit le 20090422104212... */ \ \ EGAL(le_redimensionnement_est_possible,VRAI); \ /* Le redimensionnement est possible (introduit le 20090420083748). */ \ \ SET_DIMENSIONS_2D_SANS_VALIDATION(GvalDefaut("Xmin ## type_image",Xmin) \ ,GvalDefaut("Xmax ## type_image",Xmax) \ ,GvalDefaut("Ymin ## type_image",Ymin) \ ,GvalDefaut("Ymax ## type_image",Ymax) \ ); \ /* On fait l'hypothese d'une image de type 'type_image'... */ \ Eblock \ ECAs \ /* Introduit le 20090419081339 pour simplifier 'TENTATIVE_DE_REDIMENSIONNEMENT(...)'. */ #define TENTATIVE_DE_REDIMENSIONNEMENT(forcer,tenter,methode_de_redimensionnement,sequence,taille_element,avertir) \ Bblock \ Test(IFOU(IL_FAUT(forcer) \ ,IL_FAUT(tenter) \ ) \ ) \ /* Cette possibilite fut introduite le 20080916174109 et ce test mis a l'entree de la */ \ /* procedure 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' au lieu de l'exterieur le 20090502100857. */ \ /* */ \ /* Le forcage de redimensionnement a ete introduit le 20090502093317 pour prendre en */ \ /* compte le cas des formats qui sont differents (au niveau 'dimX' et 'dimY') mais qui */ \ /* correspondent a des 'dimXY' identiques (et donc a des tailles de fichiers identiques). */ \ /* C'est par exemple le cas des "anti-formats"s : ainsi une image 575x780 ('anti-Pal') */ \ /* a meme taille (448500) qu'une image 780x575 ('Pal'), les dimensions en 'X' et en 'Y' */ \ /* etant permutees. Dans un tel cas la taille 'taille_de_imageR' est de 448500 dans les */ \ /* deux cas. Lors du chargement d'une image au format 'anti-Pal', il n'y a pas d'erreur dans */ \ /* 'ILOAD_FICHIER_AVEC_CONVERSION(...)' et le test 'IL_Y_A_ERREUR(CODE_ERREUR)' qui suit */ \ /* est 'FAUX' : la procedure 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' n'est donc pas appelee. */ \ /* Il faut donc pouvoir dans de tels cas forcer le redimensionnement... */ \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_de_imageR),CHAINE_UNDEF)); \ /* Afin de pouvoir editer 'type_image' s'il est reconnu... */ \ DEFV(Logical,INIT(le_redimensionnement_est_possible,LUNDEF)); \ /* Afin de controler le redimensionnement... */ \ DEFV(Int,INIT(taille_de_imageR,Isize_image(nom_image))); \ /* La taille de 'imageR' va permettre de selectionner, si possible, un format d'image */ \ /* de base... */ \ /* */ \ /* On rappelle le 20090420172620 que si 'nom_image' est {C_VIDE,NOM_PIPE,NOM_PIPE_Local} */ \ /* alors 'Isize_image(...)' renvoie la valeur 'TAILLE_RENVOYEE_POUR_UN_PIPE' (soit -1), */ \ /* mais que cela ne peut jamais se rencontrer ici puisque les cas precedents sont testes */ \ /* et elimines avant chaque appel a 'TENTATIVE_DE_REDIMENSIONNEMENT(...)'. */ \ \ DEFV(Int,INIT(CODE_ERREUR_avant_la_tentative_de_redimensionnement,CODE_ERREUR)); \ /* Sauvegarde du code d'erreur precedent... */ \ /* */ \ /* On notera le 20101115154103 que l'on ne peut pas utiliser 'BSaveModifyVariable(..)' */ \ /* car le 'ESaveModifyVariable(...)' ne serait pas au meme niveau {Bblock,...,Eblock}... */ \ EGAL(CODE_ERREUR,OK); \ /* A priori... */ \ \ PUSH_DIMENSIONS_2D; \ \ CHoi(taille_de_imageR) \ Bblock \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT1,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT2,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT3,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT4,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT5,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT6,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT7,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT8,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(FIT9,taille_element); \ /* A compter du 20090501102312 on teste d'abord quelques "Formats d'Image Temporaires" */ \ /* ('v $Fimages gFITn' en ce qui concerne leur definition...). */ \ /* */ \ /* On notera au passage qu'a cette date j'ai fait des experiences pour voir s'il etait */ \ /* possible de factoriser 'taille_de_imageR' ('v $xtc/f_tailleI.02$c') sous la forme */ \ /* 'dimX.dimY'. Malheureusement, il y a en general ambiguite, d'ou la non implementation */ \ /* de ce dispositif. Malgre tout, le 20090503100611 j'ai introduit dans le programme de */ \ /* test 'v $xtc/f_tailleI.02$c 20090503100611' un dispositif de rapport 'dimX/dimY' le */ \ /* plus proche recherche ("Best"). Du coup, une implementation devient envisageable, */ \ /* mais est-ce d'une quelconque utilite (surtout depuis l'introduction des 'FITn's...) ? */ \ /* Le 20090504100401 fut introduit la commande 'v $xcg/dimX_dimY$vv$K' qui permet de lister */ \ /* les meilleurs factorisation, au cas ou... */ \ /* */ \ /* Le 20090502093745 le test des "Formats d'Image Temporaires" a ete place avant celui */ \ /* des formats de base afin de pouvoir traiter des cas tels celui du format 'anti-Pal' */ \ /* (448500=575x780) qui ressemble au 'Pal' (448500=780x575) mais qui ne doit pas etre */ \ /* confondu avec ce dernier, evidemment ! On n'oubliera pas alors, qu'etant donne que */ \ /* la discrimination des formats se fait uniquement par la taille des fichiers, il est */ \ /* imperatif de forcer le redimensionnement... */ \ \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Sus,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Pus,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Suh,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Puh,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Suq,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Puq,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Sud,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Pud,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Std,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Pal,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Sdu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Pdu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Squ,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Pqu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Shu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Phu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Ssu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Psu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Stu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(Ptu,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(TvA,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(TvB,taille_element); \ SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT(TvC,taille_element); \ /* Puis, on fait l'hypothese de l'un des formats de base (classes ci-dessus par ordre de */ \ /* '$taille_???' croissantes). */ \ /* */ \ /* Les formats {Ssu,Psu,Stu,Ptu} ont ete introduits le 20150213114602... */ \ /* */ \ /* Les formats {Sus,Pus} ont ete introduits le 20150929105940... */ \ /* */ \ /* Les formats {TvA,TvB,TvC} ont ete introduits le 20240608141156... */ \ \ DEfo \ Bblock \ EGAL(le_redimensionnement_est_possible,FAUX); \ /* Aucun format d'image n'a ete trouve : le redimensionnement est donc impossible... */ \ Eblock \ EDEf \ Eblock \ ECHo \ \ Test(EST_VRAI(le_redimensionnement_est_possible)) \ Bblock \ Test(IFOU(IFOU(IFNE(Xmin,EnTete_de_sauvegardM ## Xmin) \ ,IFNE(Xmax,EnTete_de_sauvegardM ## Xmax) \ ) \ ,IFOU(IFNE(Ymin,EnTete_de_sauvegardM ## Ymin) \ ,IFNE(Ymax,EnTete_de_sauvegardM ## Ymax) \ ) \ ) \ ) \ Bblock \ /* Ce test a ete introduit le 20090502093745 lors de l'introduction du forcage de */ \ /* redimensionnement. En effet ce forcage est necessaire dans le cas, par exemple, d'une */ \ /* image au format 'anti-Pal' (448500=575x780) qui ressemble au 'Pal' (448500=780x575). */ \ /* Par contre une image au format 'Pal' n'aura pas a etre redimensionnee... */ \ Test(IL_FAUT(avertir)) \ Bblock \ /* Test introduit le 20090422092530... */ \ MESSAGES_DES_FICHIERS(Prer3("Redimensionnement (methode '%d') de l'image '%s' (format '%s').\n" \ ,methode_de_redimensionnement \ ,nom_image \ ,format_de_imageR \ ) \ ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ BLOC(sequence); \ /* Le redimensionnement peut etre tente... */ \ Eblock \ ATes \ Bblock \ /* Evidemment, lorsque les axes en 'X' et 'Y' n'ont pas change, il est inutile d'executer */ \ /* la sequence 'sequence' de redimensionnement... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ MESSAGES_DES_FICHIERS(Prer2("Le redimensionnement a echoue (taille (%d) du fichier '%s' non reconnue).\n" \ ,taille_de_imageR \ ,nom_image \ ) \ ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers \ ); \ /* L'edition de 'nom_image' a ete introduite le 20090511181911... */ \ EGAL(CODE_ERREUR,CODE_ERREUR_avant_la_tentative_de_redimensionnement); \ /* Restauration du code d'erreur precedent... */ \ /* */ \ /* On notera le 20101115154103 que l'on ne peut pas utiliser 'ESaveModifyVariable(..)' */ \ /* car le 'BSaveModifyVariable(...)' ne serait pas au meme niveau {Bblock,...,Eblock}... */ \ Eblock \ ETes \ \ PULL_DIMENSIONS_2D; \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Tentative de redimensionnement d'une image (introduite le 20090418182008). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " S T A N D A R D " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(Logical,SINT(Iload_image_____permuter_les_bits_de_l_image,FAUX))); DEFV(Common,DEFV(Positive,SINT(Iload_image_____taille_des_paquets_de_bits,TAILLE_PAR_DEFAUT_DES_PAQUETS_DE_PERMUTATION_DES_BITS))); DEFV(Common,DEFV(Int,SINT(Iload_image_____translation_des_index_de_bits,TRANSLATION_PAR_DEFAUT_DES_INDEX_DE_BITS))); /* Parametrage de 'Iload_image(...)' introduit le 20130707181804... */ DEFV(Common,DEFV(Logical,SINT(Iload_image_____un_nom_absent_est_une_erreur,VRAI))); /* Cet indicateur indique si un nom vide est une erreur (introduit le 20080212093518), */ /* dans le cas contraire 'Iload_image_____valeur_initiale_si_erreur' est la valeur donnee */ /* a chaque element du fichier... */ DEFV(Common,DEFV(Logical,SINT(Iload_image_____tenter_une_conversion_standard_en_cas_d_erreur,FAUX))); /* En cas d'erreur de lecture en mode 'fichier_type_image', cet indicateur permet */ /* d'autoriser une tentative de lecture en mode 'fichier_type_imageF'. Cette possibilite */ /* fut introduite le 20080916174109... */ DEFV(Common,DEFV(Logical,SINT(Iload_image_____faire_la_conversion_standard_avec_renormalisation,VRAI))); /* Losrqu'il y a conversion, elle peut se faire avec renormalisation ('VRAI') ou bien */ /* brutalement ('FAUX'). Cette possibilite fut introduite le 20080917104205... */ DEFV(Common,DEFV(Logical,SINT(Iload_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur,FAUX))); DEFV(Common,DEFV(Logical,SINT(Iload_image_____tenter_un_redimensionnement_en_cas_d_erreur,FAUX))); DEFV(Common,DEFV(Int,SINT(Iload_image_____methode_de_redimensionnement_a_utiliser,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE))); DEFV(Common,DEFV(Logical,SINT(Iload_image_____avertir_s_il_y_a_redimensionnement_en_cas_d_erreur,FAUX))); /* En cas d'erreur de lecture en mode 'fichier_type_image', cet indicateur permet de */ /* tenter un redimensionnement suivant une certaine methode (introduit le 20090418182008 */ /* et complete le 20090422092530). */ /* */ /* Le forcage de redimensionnement a ete introduit le 20090502093317 pour prendre en */ /* compte le cas des formats qui sont differents (au niveau 'dimX' et 'dimY') mais qui */ /* correspondent a des 'dimXY' identiques (et donc a des tailles de fichiers identiques). */ /* C'est par exemple le cas des "anti-formats"s : ainsi une image 575x780 ('anti-Pal') */ /* a meme taille (448500) qu'une image 780x575 ('Pal'), les dimensions en 'X' et en 'Y' */ /* etant permutees. Dans un tel cas la taille 'taille_de_imageR' est de 448500 dans les */ /* deux cas. Lors du chargement d'une image au format 'anti-Pal', il n'y a pas d'erreur dans */ /* 'ILOAD_FICHIER_AVEC_CONVERSION(...)' et le test 'IL_Y_A_ERREUR(CODE_ERREUR)' qui suit */ /* est 'FAUX' : la procedure 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' n'est donc pas appelee. */ /* Il faut donc pouvoir dans de tels cas forcer le redimensionnement... */ /* */ /* En ce qui concerne la methode de redimensionnement a utiliser, toutes celles qui sont */ /* disponibles dans 'v $xiii/di_image$DEF types_de_methode_de_redimensionnement' sont */ /* utilisables ici... */ DEFV(Common,DEFV(Logical,SINT(Iload_image_____tenter_les_conversions_de_nom,TENTER_LES_CONVERSIONS_DANS_Iload_image))); /* Cet indicateur indique si les noms qui ressemblent a des valeurs numeriques peuvent etre */ /* utilises comme valeur de tous les points de l'image... */ DEFV(Common,DEFV(genere_p,SINT(Iload_image_____valeur_initiale_si_erreur,NOIR))); /* Valeur a donner a 'imageR' si l'image 'nom_image' n'existe pas (parametre introduit */ /* le 20021004150125) ou si le nom est absent sans que cela soit une erreur... */ DEFV(Common,DEFV(Logical,SINT(Iload_image_____initialiser_en_cas_d_erreur_fichier,VRAI))); /* Introduit le 20101118103438 pour controler l'initialisation de 'imageR' s'il y a un */ /* probleme avec le fichier 'nom_image'. Cela est tres utile dans le programme */ /* 'v $xci/sequence$K Iload_image_____initialiser_en_cas_d_erreur_fichier' pour */ /* permettre un reaffichage correct de l'image precedente dans le cas ou l'image */ /* courante n'existe pas (ou pas encore...). */ DEFV(Common,DEFV(FonctionI,Iload_image(imageR,nom_image))) DEFV(Argument,DEFV(image,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "standard" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ BLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS(Iload_image_____tenter_un_redimensionnement_en_cas_d_erreur); /* Introduit le 20090422094437... */ ILOAD_FICHIER_AVEC_CONVERSION(nom_image,imageR,size_i,size_p,fichier_type_image ,Iload_image_____tenter_les_conversions_de_nom,genere_p,genp ,Iinitialisation ,Iload_image_____initialiser_en_cas_d_erreur_fichier ,Iload_image_____valeur_initiale_si_erreur ,Iload_image_____un_nom_absent_est_une_erreur ); /* Tentative de chargement "simple" de l'image a priori... */ /* */ /* On notera que l'on ne place pas ce 'ILOAD_FICHIER_AVEC_CONVERSION(...)' apres le 'ATes' */ /* du 'Test(IL_FAUT(Iload_image_____tenter_un_redimensionnement_en_cas_d_erreur)' (en */ /* supprimant le 'Test(IL_Y_A_ERREUR(CODE_ERREUR))' suivant evidemment...) afin de */ /* simplifier 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' et faire ainsi en sorte qu'il n'y */ /* ait pas de 'Iredimensionnement(...)' s'il n'est pas utile (lorsque 'taille_de_imageR' */ /* est egal a 'TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_p)'). */ DEBLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS; /* Introduit le 20090422094437... */ Test(I3OU(IFEQ_chaine(nom_image,C_VIDE) ,IFEQ_chaine(nom_image,NOM_PIPE) ,IFEQ_chaine(nom_image,NOM_PIPE_Local) ) ) Bblock /* Lorsque 'nom_image' est {C_VIDE,NOM_PIPE,NOM_PIPE_Local}, il est impossible de refaire */ /* des 'ILOAD_FICHIER_AVEC_CONVERSION(...)'s car, en effet, 'Iload_fichier(...)' a deja */ /* "epuise" le "pipe" d'entree dans le 'ILOAD_FICHIER_AVEC_CONVERSION(...)' qui precede... */ /* Ce test a donc ete introduit le 20090420172620 car il manquait... */ Eblock ATes Bblock Test(IFOU(IL_Y_A_ERREUR(CODE_ERREUR) ,IL_FAUT(Iload_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur) ) ) Bblock #define METHODE_DE_REDIMENSIONNEMENT_A_UTILISER \ Iload_image_____methode_de_redimensionnement_a_utiliser \ /* Pour raccourcir une des lignes suivantes... */ TENTATIVE_DE_REDIMENSIONNEMENT(Iload_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur ,Iload_image_____tenter_un_redimensionnement_en_cas_d_erreur ,METHODE_DE_REDIMENSIONNEMENT_A_UTILISER ,BLOC( Bblock BDEFV(image,imageR_mal_dimensionnee); ILOAD_FICHIER_AVEC_CONVERSION(nom_image ,imageR_mal_dimensionnee ,size_i ,size_p ,fichier_type_image ,Iload_image_____tenter_les_conversions_de_nom ,genere_p ,genp ,Iinitialisation ,Iload_image_____initialiser_en_cas_d_erreur_fichier ,Iload_image_____valeur_initiale_si_erreur ,Iload_image_____un_nom_absent_est_une_erreur ); /* Tentative de rechargement de l'image 'nom_image', mais en ayant mis en place ses */ /* possibles dimensions {{Xmin,Xmax},{Ymin,Ymax}}. */ CALS(Iredimensionnement(imageR ,EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax ,imageR_mal_dimensionnee ,Xmin,Xmax,Ymin,Ymax ,METHODE_DE_REDIMENSIONNEMENT_A_UTILISER ) ); /* Redimensionnement... */ EDEFV(image,imageR_mal_dimensionnee); Eblock ) ,size_p ,Iload_image_____avertir_s_il_y_a_redimensionnement_en_cas_d_erreur ); #undef METHODE_DE_REDIMENSIONNEMENT_A_UTILISER Test(IL_Y_A_ERREUR(CODE_ERREUR)) Bblock Test(IL_FAUT(Iload_image_____tenter_une_conversion_standard_en_cas_d_erreur)) /* Cette possibilite fut introduite le 20080916174109... */ Bblock BDEFV(imageF,imageR_flottante); /* Image de type 'genere_Float' que l'on va tenter de lire, puis convertir... */ EGAL(CODE_ERREUR,OK); /* A priori... */ MESSAGES_DES_FICHIERS(Prer2("Une lecture 'standard=%s' et une conversion 'standard=%s' vont etre tentees.\n" ,C_FAUX____ ,C_VRAI____ ) ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ); ILOAD_FICHIER_AVEC_CONVERSION(nom_image ,imageR_flottante ,size_iF ,size_Float ,fichier_type_imageF ,Iload_image_____tenter_les_conversions_de_nom ,genere_Float ,flot ,IFinitialisation ,Iload_image_____initialiser_en_cas_d_erreur_fichier ,FLOT(Iload_image_____valeur_initiale_si_erreur) ,Iload_image_____un_nom_absent_est_une_erreur ); /* Tentative de lecture de 'imageR' en mode "flottant"... */ Test(IL_FAUT(Iload_image_____faire_la_conversion_standard_avec_renormalisation)) Bblock CALS(Ifloat_std_avec_renormalisation(imageR,imageR_flottante)); Eblock ATes Bblock CALS(Ifloat_std_brutal(imageR,imageR_flottante)); Eblock ETes /* Et conversion qu'il n'y ait pas eu d'erreur ou qu'il y en ait eu une. En effet, dans ce */ /* dernier cas 'ILOAD_FICHIER_AVEC_CONVERSION(...)' procede a une initialisation... */ /* */ /* Le 20080917104205, la fonction 'Ifloat_std(...)' a ete remplacee par un choix entre */ /* 'Ifloat_std_avec_renormalisation(...)' et 'Ifloat_std_brutal(...)' qui sont plus souples */ /* et plus simples a utiliser (les extrema de 'imageR_flottante' ne sont pas a connaitre). */ EDEFV(imageF,imageR_flottante); /* Image de type 'genere_Float' que l'on va tenter de lire, puis convertir... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes Test(IL_FAUT(Iload_image_____permuter_les_bits_de_l_image)) /* Possibilite introduite le 20130707181804... */ /* */ /* Cela permet de "mimer" la gestion d'images de type "bits" (et non plus d'"octets"). En */ /* effet, on vient de ci-dessus de recuperer une image, mais dont les bits sont "classes" */ /* plan par plan. Si '..._____translation_des_index_de_bits' est nul, alors on trouve en */ /* tete du fichier les bits de poids le plus fort (2^7), puis 2^6,..., jusqu'a 2^0. En */ /* donnant a '..._____translation_des_index_de_bits' une valeur differente, on peut */ /* ainsi selectionner le plan de bit qui se trouve en tete... */ Bblock BDEFV(image,imageR_permutee); BSaveModifyVariable(Int ,Ipermutation_inverse_de_regroupement_des_bits_de_meme_poids_____taille_des_paquets_de_bits ,Iload_image_____taille_des_paquets_de_bits ); BSaveModifyVariable(Int ,Ipermutation_inverse_de_regroupement_des_bits_de_meme_poids_____translation_des_index_de_bits ,Iload_image_____translation_des_index_de_bits ); /* Parametrage de la permutation inverse... */ CALi(Imove(imageR_permutee,imageR)); CALi(Ipermutation_inverse_de_regroupement_des_bits_de_meme_poids(imageR,imageR_permutee)); /* Permutation inverse... */ ESaveModifyVariable(Int ,Ipermutation_inverse_de_regroupement_des_bits_de_meme_poids_____translation_des_index_de_bits ); ESaveModifyVariable(Int ,Ipermutation_inverse_de_regroupement_des_bits_de_meme_poids_____taille_des_paquets_de_bits ); EDEFV(image,imageR_permutee); Eblock ATes Bblock Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " S T A N D A R D " S I P R E S E N T : */ /* */ /*************************************************************************************************************************************/ #define ILOAD_IMAGE_SI_PRESENT(imageR,nom_image,nom_image_absent,valeur_par_defaut,fonction_load,fonction_initialisation) \ Bblock \ Test(IFNE_chaine(nom_image,nom_image_absent)) \ Bblock \ CODE_ERROR(fonction_load(imageR,nom_image)); \ /* Cas ou 'nom_image' est significatif... */ \ Eblock \ ATes \ Bblock \ CALS(fonction_initialisation(imageR,valeur_par_defaut)); \ /* Cas ou 'nom_image' est absent, on initialise avec la valeur par defaut... */ \ Eblock \ ETes \ Eblock \ /* Chargement ou initialisation d'une image (introduit le 20041230221011)... */ BFonctionI DEFV(Common,DEFV(FonctionI,Iload_image_si_present(imageR,nom_image,nom_image_absent,valeur_par_defaut))) /* Fonction introduite le 20041230213528... */ DEFV(Argument,DEFV(image,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); DEFV(Argument,DEFV(CHAR,DTb0(nom_image_absent))); /* Nom de l'image "standard" a lire et nom au cas ou il n'y a pas de nom... */ DEFV(Argument,DEFV(genere_p,valeur_par_defaut)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_IMAGE_SI_PRESENT(imageR,nom_image,nom_image_absent,valeur_par_defaut,Iload_image,Iinitialisation); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " S T A N D A R D " */ /* A V E C R E D I M E N S I O N N E M E N T E V E N T U E L : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Dans l'etat actuel, cette fonction est */ /* d'une realisation tres delicate. En effet, */ /* lors de l'entree dans le programme 'Main(...)' */ /* toutes les variables sont initialisees, soit */ /* dans des declarations du type : */ /* */ /* DEFV(...,INIT(...,...)); */ /* */ /* soit dans des initialisation du type : */ /* */ /* INITIALISATION_...(...); */ /* */ /* Ainsi, a chaque "rerentree," il est essentiel que */ /* toutes ne reprennent pas leurs valeurs implicites */ /* (ou "par defaut"). Un indicateur est introduit */ /* ('Iload_image_avec_redimensionnement_eventuel_____le_redimensionnement_est_activable') */ /* afin de pouvoir inhiber ce dispositif sans modifier */ /* les commandes qui le reference deja... */ /* */ /* */ /* Nota : */ /* */ /* Suite a l'introduction de la procedure */ /* 'v $xiii/files$FON TENTATIVE_DE_REDIMENSIONNEMENT', */ /* la fonction 'Iload_image_avec_redimensionnement_eventuel(...)' */ /* n'a en fait plus aucun interet, mais on la laisse, on ne sait */ /* jamais... */ /* */ /* En fait, je note le 20130909110821 que cette fonction est utilisee */ /* dans 'v $xci/display$K Iload_image_avec_redimensionnement_eventuel' */ /* et dans 'v $xci/animation$K Iload_image_avec_redimensionnement_eventuel' */ /* et n'est donc pas si inutile que cela... */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(Logical,SINT(Iload_image_avec_redimensionnement_eventuel_____le_redimensionnement_est_activable,FAUX))); /* Afin d'inhiber brutalement ce dispositif. ATTENTION, jusqu'au 20000801110904, cet */ /* indicateur etait 'Local', mais il semble qu'il doive etre 'Common' afin de pouvoir */ /* etre manipule depuis n'importe quel programme '$K'... */ /* */ /* Suite a l'introduction de 'v $xiii/files$FON TENTATIVE_DE_REDIMENSIONNEMENT', le */ /* 20080916174109, cet indicateur est passe de 'VRAI' a 'FAUX' le 20090604090257, etant */ /* devenu en fait inutile, mais etant conserve car, en effet, on ne sait jamais... */ DEFV(Ailleurs,DEFV(FonctionI,Main())); /* Point de rerentree dans la commande courante... */ DEFV(Common,DEFV(FonctionI,Iload_image_avec_redimensionnement_eventuel(imageR,nom_image ,tenter_un_redimensionnement ,nombre_d_arguments,arguments ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "standard" a lire. */ DEFV(Argument,DEFV(Logical,tenter_un_redimensionnement)); /* Indique s'il faut ('VRAI') ou pas ('FAUX') tenter le redimensionnement... */ DEFV(Argument,DEFV(Int,nombre_d_arguments)); /* Nombre d'arguments recus par la commande courante, y compris son nom. */ DEFV(Argument,DEFV(CHAR,POINTERc(DTb0(arguments)))); /* Liste des arguments recus par la commande courante, y compris son nom. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(IFET(EST_VRAI(Iload_image_avec_redimensionnement_eventuel_____le_redimensionnement_est_activable) ,IL_FAUT(tenter_un_redimensionnement) ) ) Bblock DEFV(Int,INIT(taille_reelle_de_l_image,UNDEF)); /* Taille reelle de l'image en octets... */ /* */ /* ATTENTION, a cause de 'TAILLE_RENVOYEE_POUR_UN_PIPE', la taille ne peut etre un */ /* 'Positive' et donc doit etre obligatoirement un 'Int'. Une autre raison (introduite */ /* le 20060910101623) est que 'Isize_fichier(...)' utilise 'TAILLE_D_UNE_IMAGE_UNDEF' qui */ /* est defini via un 'NEGA(...)' ('v $xiii/files$DEF TAILLE_D_UNE_IMAGE_UNDEF'). */ CALS(Isize_fichier(nom_image,ADRESSE(taille_reelle_de_l_image))); /* Taille reelle de l'image en octets... */ Test(IFNE(taille_reelle_de_l_image,TAILLE_RENVOYEE_POUR_UN_PIPE)) Bblock Test(IFNE(taille_reelle_de_l_image,size_i)) Bblock /* Cas ou le fichier n'a pas la taille attendu : */ DEFV(Logical,INIT(le_redimensionnement_peut_etre_tente,FAUX)); /* Indicateur precisant si le redimensionnement peut etre tente ('VRAI') ou pas ('FAUX'), */ /* le choix dependant de la taille reelle... */ CHoi(taille_reelle_de_l_image) /* En executant le programme 'v $xtc/factorise.01$c' (ou 'v $xcg/factorise.01$X'), on verra */ /* que malheureusement, en ce qui concerne, par exemple, les images 'Pal', il existe */ /* plusieurs factorisations de la taille qui sont raisonnables (c'est-a-dire en excluant */ /* par exemple 1x448500) : */ /* */ /* 448500 = 650x690 */ /* 448500 = 598x750 */ /* 448500 = 575x780 */ /* 448500 = 500x897 */ /* 448500 = 460x975 */ /* */ /* cela empeche donc de faire une factorisation automatique du type 'dimX*dimY'... */ /* */ /* ATTENTION, on notera que l'on n'utilise pas : */ /* */ /* Choi(...) */ /* Bblock */ /* Ca1e(...) */ /* Bblock */ /* Eblock */ /* ECa1 */ /* */ /* Defo(...) */ /* Bblock */ /* Eblock */ /* EDef */ /* Eblock */ /* ECho */ /* */ /* car, en effet, la constante 'TAILLE_D_UNE_IMAGE_STANDARD_Pal' peut, suivant la MACHINE */ /* sur laquelle on se trouve, faire appel a la fonction 'Gval(...)' via les definitions */ /* de 'dimXPali' et 'dimYPali'... */ Bblock CAse(TAILLE_D_UNE_IMAGE_STANDARD_Std) Bblock Test(IL_FAUT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers)) Bblock PRINT_ATTENTION("le format courant est incompatible avec l'image, qui est au format 'Std'"); Eblock ATes Bblock Eblock ETes SET_DIMENSIONS_2D_SANS_VALIDATION(k___Xmin,k___Xmax,k___Ymin,k___Ymax); /* Et tentative de forcage du format 'Std'. On notera l'utilisation de la procedure */ /* 'SET_DIMENSIONS_2D_SANS_VALIDATION(...)' et non pas 'SET_DIMENSIONS_2D(...)', et ce */ /* afin de ne pas avoir 'AVERTISSEMENT_SUR_LE_NON_REDIMENSIONNEMENT_DE_CERTAINES_IMAGES'... */ EGAL(le_redimensionnement_peut_etre_tente,VRAI); /* Le redimensionnement peut etre tente... */ Eblock ECAs #ifdef TAILLE_D_UNE_IMAGE_STANDARD_Pal /* ATTENTION, 'TAILLE_D_UNE_IMAGE_STANDARD_Pal' n'est defini que si 'dimXYPali' est lui-meme */ /* defini ('v $xiidG/fonction.1$DEF TAILLE_D_UNE_IMAGE_STANDARD_Pal'), or 'dimXYPali' n'est */ /* lui-meme defini ('v $xiidG/fonction.1$DEF dimXYPali') que si l'option de compilation */ /* '__VERSION__COMPILER_LE_GRAPHIQUE_SILICON_GRAPHICS' l'est ; ce n'est, par exemple, pas */ /* le cas sur '$LACT29'... */ CAse(TAILLE_D_UNE_IMAGE_STANDARD_Pal) Bblock Test(IL_FAUT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers)) Bblock PRINT_ATTENTION("le format courant est incompatible avec l'image, qui est au format 'Pal'"); Eblock ATes Bblock Eblock ETes SET_DIMENSIONS_2D_SANS_VALIDATION(XminPali,XmaxPali,YminPali,YmaxPali); /* Et tentative de forcage du format 'Pal'. On notera l'utilisation de la procedure */ /* 'SET_DIMENSIONS_2D_SANS_VALIDATION(...)' et non pas 'SET_DIMENSIONS_2D(...)', et ce */ /* afin de ne pas avoir 'AVERTISSEMENT_SUR_LE_NON_REDIMENSIONNEMENT_DE_CERTAINES_IMAGES'... */ EGAL(le_redimensionnement_peut_etre_tente,VRAI); /* Le redimensionnement peut etre tente... */ Eblock ECAs #Aifdef TAILLE_D_UNE_IMAGE_STANDARD_Pal #Eifdef TAILLE_D_UNE_IMAGE_STANDARD_Pal DEfo Bblock /* Pour les autres formats, on ne fait rien... */ Test(IL_FAUT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers)) Bblock PRINT_ATTENTION("le format courant est incompatible avec l'image, et n'est pas reconnu"); /* ATTENTION, voir le commentaire relatif a 'TAILLE_D_UNE_IMAGE_STANDARD_Pal' ci-dessus... */ Eblock ATes Bblock Eblock ETes Eblock EDEf Eblock ECHo Test(EST_VRAI(le_redimensionnement_peut_etre_tente)) Bblock /* La sequence qui suit est inspiree du programme 'v $xtc/goto.01$c'. */ INCR(programme_principal_____indicateur_de_rerentree,I); /* Mise a jour de l'indicateur de "rerentree" dans le programme principal... */ CODE_ERROR(Main(nombre_d_arguments,arguments)); /* Lorsque le redimensionnement peut etre tente, on rerentre dans le programme principal. */ /* On notera que tous les arguments ne seront pas reinterpretes malgre ce que laisserait */ /* supposer l'appel ci-dessus (voir 'v $xig/fonct$vv$DEF'). */ Exit(CODE_ERREUR); /* Et on sort ; en effet, sinon, l'execution de la fonction courante reprendrait, et on */ /* reviendrait dans le programme principal que l'on vient donc d'executer... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas ou le fichier a bien la taille attendue... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes CODE_ERROR(Iload_image(imageR,nom_image)); /* Et enfin, realisation de la lecture effective... */ RETU_ERROR; Eblock EFonctionI #undef TAILLE_RENVOYEE_POUR_UN_PIPE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N E I M A G E E N C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define ACCES_A_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(imageR,nom_de_l_image,type_de_la_composante,espace_de_couleurs,acceder) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_l_image \ ,type_de_la_composante \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Iload_image(imageR \ ,nom_composante_image \ ) \ ); \ ) \ ,acceder \ ); \ Eblock \ /* Tentative d'acces a la composante courante... */ DEFV(Common,DEFV(FonctionI,Iload_image_en_couleurs(imageR_COMP1,imageR_COMP2,imageR_COMP3,nom_image,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(image,imageR_COMP1)); DEFV(Argument,DEFV(image,imageR_COMP2)); DEFV(Argument,DEFV(image,imageR_COMP3)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image a acceder. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ACCES_A_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(imageR_COMP1 ,nom_image ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_image_en_couleurs ); ACCES_A_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(imageR_COMP2 ,nom_image ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_image_en_couleurs ); ACCES_A_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(imageR_COMP3 ,nom_image ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_image_en_couleurs ); RETU_ERROR; Eblock #undef ACCES_A_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " S T A N D A R D " */ /* S O U S L A F O R M E D ' U N P O I N T E U R : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Iacces_image_____un_nom_absent_est_une_erreur,VRAI))); /* Cet indicateur indique si un nom vide est une erreur (introduit le 20080212093518), */ /* dans le cas contraire 'Iacces_image_____valeur_initiale_si_erreur' est la valeur donnee */ /* a chaque element du fichier... */ DEFV(Common,DEFV(Logical,SINT(Iacces_image_____tenter_les_conversions_de_nom,TENTER_LES_CONVERSIONS_DANS_Iacces_image))); /* Cet indicateur indique si les noms qui ressemblent a des valeurs numeriques peuvent etre */ /* utilises comme valeur de tous les points de l'image... */ DEFV(Common,DEFV(genere_p,SINT(Iacces_image_____valeur_initiale_si_erreur,NOIR))); /* Valeur a donner a 'imageR' si l'image 'nom_image' n'existe pas (parametre introduit */ /* le 20021004150125) ou si le nom est absent sans que cela soit une erreur... */ DEFV(Common,DEFV(Logical,SINT(Iacces_image_____initialiser_en_cas_d_erreur_fichier,VRAI))); /* Introduit le 20101118103438 pour controler l'initialisation de 'imageR' s'il y a un */ /* probleme avec le fichier 'nom_image'... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iacces_image(imageR,nom_image)))) DEFV(Argument,DEFV(image,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "standard" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AVEC_CONVERSION(nom_image,imageR,size_i,size_p,fichier_type_image ,Iacces_image_____tenter_les_conversions_de_nom,genere_p,genp ,Iinitialisation ,Iacces_image_____initialiser_en_cas_d_erreur_fichier ,Iacces_image_____valeur_initiale_si_erreur ,Iacces_image_____un_nom_absent_est_une_erreur ); /* On notera le 20090423145235 que la fonction 'Iacces_image(...)' est beaucoup moins */ /* "puissante" que la fonction 'Iload_image(...)' car, en effet, contrairement a cette */ /* derniere, elle ne permet pas le redimensionnement. De plus, il n'est pas possible de */ /* definir simplement 'Iacces_image(...)' avec 'Iload_image(...)' a cause des nombreuses */ /* variables de controle 'Iacces_image_____...' et 'Iload_image_____...'. */ RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " C H A R " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadC_image(imageR,nom_image))) DEFV(Argument,DEFV(imageC,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "CHAR" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iC,size_CHAR,fichier_type_imageC); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " I N T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadIB_image(imageR,nom_image))) /* Fonction introduite le 20100326190221... */ DEFV(Argument,DEFV(imageIB,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iIB,size_vrai_Int_de_base,fichier_type_imageIB); RETU_ERROR; Eblock EFonctionI BFonctionI DEFV(Common,DEFV(FonctionI,IloadI_image(imageR,nom_image))) DEFV(Argument,DEFV(imageI,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iI,size_Int,fichier_type_imageI); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " P O S I T I V E - I N T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadUB_image(imageR,nom_image))) /* Fonction introduite le 20100326190221... */ DEFV(Argument,DEFV(imageUB,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iUB,size_vrai_Positive_de_base,fichier_type_imageUB); RETU_ERROR; Eblock EFonctionI BFonctionI DEFV(Common,DEFV(FonctionI,IloadU_image(imageR,nom_image))) DEFV(Argument,DEFV(imageU,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iU,size_LPositive,fichier_type_imageU); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E N T A T I V E D E V E R I F I C A T I O N H E U R I S T I Q U E */ /* D E S N O M B R E S F L O T T A N T S : */ /* */ /*************************************************************************************************************************************/ #define VERIFICATION_HEURISTIQUE_DES_genere_Float(valider,imageR,F_calcul_extrema,F_verification,seuil_inf,epsi,seuil_sup,editer) \ /* ATTENTION : il a fallu paser de 'epsilon' a 'epsi' le 20031001085104 afin de ne pas */ \ /* perturber le format du 'CAL1(Prer1(...))' qui l'utilise ci-apres... */ \ Bblock \ Test(IL_FAUT(valider)) \ Bblock \ DEFV(genere_Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF)); \ DEFV(genere_Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF)); \ /* Extrema de l'image courante. */ \ \ Test(IFGE(seuil_inf,seuil_sup)) \ Bblock \ PRINT_ATTENTION("les seuils de validation heuristiques des 'genere_Float's sont incorrects"); \ CAL1(Prer2("ils valent respectivement : %g et %g\n",seuil_inf,seuil_sup)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEXff(Z_Buffer_____valeur_initiale,seuil_inf,seuil_sup)) \ PRINT_ATTENTION("seuils de validation heuristiques des 'genere_Float's incompatibles avec 'Z-Buffer'"); \ CAL1(Prer2("ils valent respectivement : %g et %g\n",seuil_inf,seuil_sup)); \ CAL1(Prer1("et la valeur initiale du 'Z-Buffer' vaut : %g\n",Z_Buffer_____valeur_initiale)); \ Bblock \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALi(F_calcul_extrema(imageR,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum))); \ /* Recherche des extrema de l'image courante. */ \ \ Test(IFOU(IFOU(IFLT(F_calcul_extrema`____niveau_minimum,seuil_inf) \ ,IFGT(F_calcul_extrema`____niveau_maximum,seuil_sup) \ ) \ ,IFET(IZGT(F_calcul_extrema`____niveau_minimum_en_valeur_absolue) \ ,IFLT(F_calcul_extrema`____niveau_minimum_en_valeur_absolue,epsi) \ ) \ ) \ ) \ /* Le test sur 'epsi' a ete introduit le 20030930153617 afin de tester des valeurs */ \ /* non nulles et trop petites en valeur absolue... */ \ /* */ \ /* ATTENTION : je note le 20061109090936 que '____niveau_minimum_en_valeur_absolue' est */ \ /* bien present deux fois et que 'niveau_maximum_en_valeur_absolue' est absent ci-dessus... */ \ Bblock \ PRINT_ATTENTION("une image de type 'genere_Float' est peut-etre incompatible avec cette MACHINE (1)"); \ CAL1(Prer2("ses extrema valent respectivement : %g et %g\n",nivo_minimum,nivo_maximum)); \ CAL1(Prer2("alors que les extrema de validation valent respectivement : %g et %g\n" \ ,seuil_inf \ ,seuil_sup \ ) \ ); \ CAL1(Prer1("de meme que l'epsilon de validation vaut : %g\n" \ ,epsi \ ) \ ); \ /* Ces editions 'Prer2(...)' ont ete introduites le 20030301091755. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_VRAI(F_verification(imageR,editer))) \ /* Ce dispositif a ete introduit le 20030213093658. */ \ Bblock \ PRINT_ATTENTION("une image de type 'genere_Float' est peut-etre incompatible avec cette MACHINE (2)"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Verification heuristique des 'genere_Float' liee au fait que les representations */ \ /* internes de ces nombres ne sont pas les memes sur 'SYSTEME_APC' et sur les autres */ \ /* SYSTEMEs. Cette procedure a ete introduite le 20030211085553. Il est, par exemple, */ \ /* possible de tester cela avec le fichier '$xie/LACT11.MORL.120615$TF' sur une MACHINE */ \ /* de type 'SYSTEME_APC_Linux' et par exemple sur '$LACT15'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " F L O A T " : */ /* */ /*************************************************************************************************************************************/ #define TRAITEMENT_SPECIFIQUE_DES_FICHIERS_DE_TYPE_Z_Buffer \ Bblock \ Test(PAS_D_ERREUR(CODE_ERREUR)) \ Bblock \ TRAITEMENT_SPECIFIQUE_DES_IMAGES_DE_TYPE_Z_Buffer(imageR); \ /* ATTENTION : le code de 'TRAITEMENT_SPECIFIQUE_DES_IMAGES_DE_TYPE_Z_Buffer' etait */ \ /* implemente explicitement ici avant le 20050418102107 avec une difference importante : la */ \ /* fonction'IFnivo_extrema(...)' etait utilisee alors que dorenavant c'est la fonction */ \ /* 'IFnivo_extrema_avec_exclusion(...)' qui est utilisee a compter donc du 20050418102107. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Traitement specifique des fichiers de type 'Z-Buffer' (chargement, puis validation...). */ BFonctionI DEFV(Common,DEFV(Logical,SINT(IloadF_image_____un_nom_absent_est_une_erreur,VRAI))); /* Cet indicateur indique si un nom vide est une erreur (introduit le 20080212093518), */ /* dans le cas contraire 'IloadF_image_____valeur_initiale_si_erreur' est la valeur donnee */ /* a chaque element du fichier. Tout ce qui fut introduit le 20080212093518, le fut */ /* principalement pour 'v $xci/somExt_02.01$K IloadF_image' qui recoit de tres nombreuses */ /* 'imageF' comme Arguments... */ DEFV(Common,DEFV(Logical,SINT(IloadF_image_____tenter_une_conversion_standard_en_cas_d_erreur,FAUX))); /* En cas d'erreur de lecture en mode 'fichier_type_imageF', cet indicateur permet */ /* d'autoriser une tentative de lecture en mode 'fichier_type_image'. Cette possibilite */ /* fut introduite le 20080916132645... */ DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_____niveau_minimal_lors_d_une_conversion_standard,FLOT__NOIR))); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_____niveau_maximal_lors_d_une_conversion_standard,FLOT__BLANC))); /* Si 'IL_FAUT(IloadF_image_____tenter_une_conversion_standard_en_cas_d_erreur)' definissent */ /* les extrema des niveaux a forcer lors du 'Istd_float(...)' qui a alors lieu (introduits */ /* le 20080916132645). */ DEFV(Common,DEFV(Logical,SINT(IloadF_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur,FAUX))); DEFV(Common,DEFV(Logical,SINT(IloadF_image_____tenter_un_redimensionnement_en_cas_d_erreur,FAUX))); DEFV(Common,DEFV(Int,SINT(IloadF_image_____methode_de_redimensionnement_a_utiliser,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE))); DEFV(Common,DEFV(Logical,SINT(IloadF_image_____avertir_s_il_y_a_redimensionnement_en_cas_d_erreur,FAUX))); /* En cas d'erreur de lecture en mode 'fichier_type_image', cet indicateur permet de */ /* tenter un redimensionnement suivant une certaine methode (introduit le 20090418182008 */ /* et complete le 20090422092530). */ /* */ /* Le forcage de redimensionnement a ete introduit le 20090502093317 pour prendre en */ /* compte le cas des formats qui sont differents (au niveau 'dimX' et 'dimY') mais qui */ /* correspondent a des 'dimXY' identiques (et donc a des tailles de fichiers identiques). */ /* C'est par exemple le cas des "anti-formats"s : ainsi une image 575x780 ('anti-Pal') */ /* a meme taille (448500) qu'une image 780x575 ('Pal'), les dimensions en 'X' et en 'Y' */ /* etant permutees. Dans un tel cas la taille 'taille_de_imageR' est de 448500 dans les */ /* deux cas. Lors du chargement d'une image au format 'anti-Pal', il n'y a pas d'erreur dans */ /* 'ILOAD_FICHIER_AVEC_CONVERSION(...)' et le test 'IL_Y_A_ERREUR(CODE_ERREUR)' qui suit */ /* est 'FAUX' : la procedure 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' n'est donc pas appelee. */ /* Il faut donc pouvoir dans de tels cas forcer le redimensionnement... */ /* */ /* En ce qui concerne la methode de redimensionnement a utiliser, toutes celles qui sont */ /* disponibles dans 'v $xiii/di_image$DEF types_de_methode_de_redimensionnement' sont */ /* utilisables ici... */ DEFV(Common,DEFV(Logical,SINT(IloadF_image_____tenter_les_conversions_de_nom,TENTER_LES_CONVERSIONS_DANS_IloadF_image))); /* Cet indicateur indique si les noms qui ressemblent a des valeurs numeriques peuvent etre */ /* utilises comme valeur de tous les points de l'image... */ DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_____valeur_initiale_si_erreur,FZERO))); /* Valeur a donner a 'imageR' si l'image 'nom_image' n'existe pas (parametre introduit */ /* le 20021004150125) ou si le nom est absent sans que cela soit une erreur... */ DEFV(Common,DEFV(Logical,SINT(IloadF_image_____initialiser_en_cas_d_erreur_fichier,VRAI))); /* Introduit le 20101118103438 pour controler l'initialisation de 'imageR' s'il y a un */ /* probleme avec le fichier 'nom_image'... */ DEFV(Common,DEFV(Logical,SINT(IloadF_image_____valider_les_genere_Float,VRAI))); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_____seuil_inferieur_de_validation_des_genere_Float,F_MOINS_LE_PETIT_INFINI))); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_____seuil_epsilon___de_validation_des_genere_Float,F_EPSILON))); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_____seuil_superieur_de_validation_des_genere_Float,F_PETIT_INFINI))); DEFV(Common,DEFV(Logical,SINT(IloadF_image_____editer_les_niveaux_invalides,FAUX))); /* Donnees de validation heuristique (et eventuelle) des 'genere_Float's dans la fonction */ /* 'IloadF_image(...)'. */ /* */ /* Le 20030212091505 la validation est passee de 'FAUX' a 'VRAI', c'est plus prudent... */ /* */ /* Le 20030301093054 fut introduite la possibilite d'editer les anomalies... */ /* */ /* Le 20030930153617 fut introduit le test de petitesse en valeur absolue... */ DEFV(Common,DEFV(FonctionI,IloadF_image(imageR,nom_image))) DEFV(Argument,DEFV(imageF,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Float" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ BLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS(IloadF_image_____tenter_un_redimensionnement_en_cas_d_erreur); /* Introduit le 20090422094437... */ ILOAD_FICHIER_AVEC_CONVERSION(nom_image,imageR,size_iF,size_Float,fichier_type_imageF ,IloadF_image_____tenter_les_conversions_de_nom,genere_Float,flot ,IFinitialisation ,IloadF_image_____initialiser_en_cas_d_erreur_fichier ,IloadF_image_____valeur_initiale_si_erreur ,IloadF_image_____un_nom_absent_est_une_erreur ); /* Tentative de chargement "simple" de l'image a priori... */ /* */ /* On notera que l'on ne place pas ce 'ILOAD_FICHIER_AVEC_CONVERSION(...)' apres le 'ATes' */ /* du 'Test(IL_FAUT(Iload_image_____tenter_un_redimensionnement_en_cas_d_erreur)' (en */ /* supprimant le 'Test(IL_Y_A_ERREUR(CODE_ERREUR))' suivant evidemment...) afin de */ /* simplifier 'TENTATIVE_DE_REDIMENSIONNEMENT(...)' et faire ainsi en sorte qu'il n'y */ /* ait pas de 'IFredimensionnement(...)' s'il n'est pas utile (lorsque 'taille_de_imageR' */ /* est egal a 'TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Float)'). */ DEBLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS; /* Introduit le 20090422094437... */ Test(I3OU(IFEQ_chaine(nom_image,C_VIDE) ,IFEQ_chaine(nom_image,NOM_PIPE) ,IFEQ_chaine(nom_image,NOM_PIPE_Local) ) ) Bblock /* Lorsque 'nom_image' est {C_VIDE,NOM_PIPE,NOM_PIPE_Local}, il est impossible de refaire */ /* des 'ILOAD_FICHIER_AVEC_CONVERSION(...)'s car, en effet, 'Iload_fichier(...)' a deja */ /* "epuise" le "pipe" d'entree dans le 'ILOAD_FICHIER_AVEC_CONVERSION(...)' qui precede... */ /* Ce test a donc ete introduit le 20090420172620 car il manquait... */ Eblock ATes Bblock Test(IFOU(IL_Y_A_ERREUR(CODE_ERREUR) ,IL_FAUT(IloadF_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur) ) ) Bblock #define METHODE_DE_REDIMENSIONNEMENT_A_UTILISER \ IloadF_image_____methode_de_redimensionnement_a_utiliser \ /* Pour raccourcir une des lignes suivantes... */ TENTATIVE_DE_REDIMENSIONNEMENT(IloadF_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur ,IloadF_image_____tenter_un_redimensionnement_en_cas_d_erreur ,METHODE_DE_REDIMENSIONNEMENT_A_UTILISER ,BLOC( Bblock BDEFV(imageF,imageR_mal_dimensionnee); ILOAD_FICHIER_AVEC_CONVERSION(nom_image ,imageR_mal_dimensionnee ,size_iF ,size_Float ,fichier_type_imageF ,IloadF_image_____tenter_les_conversions_de_nom ,genere_Float ,flot ,IFinitialisation ,IloadF_image_____initialiser_en_cas_d_erreur_fichier ,IloadF_image_____valeur_initiale_si_erreur ,IloadF_image_____un_nom_absent_est_une_erreur ); /* Tentative de rechargement de l'image 'nom_image', mais en ayant mis en place ses */ /* possibles dimensions {{Xmin,Xmax},{Ymin,Ymax}}. */ CALS(IFredimensionnement(imageR ,EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax ,imageR_mal_dimensionnee ,Xmin,Xmax,Ymin,Ymax ,METHODE_DE_REDIMENSIONNEMENT_A_UTILISER ) ); /* Redimensionnement... */ EDEFV(imageF,imageR_mal_dimensionnee); Eblock ) ,size_Float ,IloadF_image_____avertir_s_il_y_a_redimensionnement_en_cas_d_erreur ); #undef METHODE_DE_REDIMENSIONNEMENT_A_UTILISER Test(IL_Y_A_ERREUR(CODE_ERREUR)) Bblock Test(IL_FAUT(IloadF_image_____tenter_une_conversion_standard_en_cas_d_erreur)) /* Cette possibilite fut introduite le 20080916132645... */ Bblock BDEFV(image,imageR_standard); /* Image "standard" que l'on va tenter de lire, puis convertir... */ EGAL(CODE_ERREUR,OK); /* A priori... */ MESSAGES_DES_FICHIERS(Prer2("Une lecture 'standard=%s' et une conversion 'standard=%s' vont etre tentees.\n" ,C_VRAI____ ,C_FAUX____ ) ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers ); ILOAD_FICHIER_AVEC_CONVERSION(nom_image ,imageR_standard ,size_i ,size_p ,fichier_type_image ,IloadF_image_____tenter_les_conversions_de_nom ,genere_p ,genp ,Iinitialisation ,IloadF_image_____initialiser_en_cas_d_erreur_fichier ,GENP(IloadF_image_____valeur_initiale_si_erreur) ,IloadF_image_____un_nom_absent_est_une_erreur ); /* Tentative de lecture de 'imageR' en mode "standard"... */ CALS(Istd_float(imageR ,IloadF_image_____niveau_minimal_lors_d_une_conversion_standard ,IloadF_image_____niveau_maximal_lors_d_une_conversion_standard ,imageR_standard ) ); /* Et conversion qu'il n'y ait pas eu d'erreur ou qu'il y en ait eu une. En effet, dans ce */ /* dernier cas 'ILOAD_FICHIER_AVEC_CONVERSION(...)' procede a une initialisation... */ EDEFV(image,imageR_standard); /* Image "standard" que l'on va tenter de lire, puis convertir... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes TRAITEMENT_SPECIFIQUE_DES_FICHIERS_DE_TYPE_Z_Buffer; VERIFICATION_HEURISTIQUE_DES_genere_Float(IloadF_image_____valider_les_genere_Float ,imageR ,__IFnivo_extrema ,IFau_moins_un_niveau_est_incorrect ,IloadF_image_____seuil_inferieur_de_validation_des_genere_Float ,IloadF_image_____seuil_epsilon___de_validation_des_genere_Float ,IloadF_image_____seuil_superieur_de_validation_des_genere_Float ,IloadF_image_____editer_les_niveaux_invalides ); /* L'utilisation du nom '__IFnivo_extrema' (et non pas de 'IFnivo_extrema') est due a */ /* l'utilisation dans la procedure 'VERIFICATION_HEURISTIQUE_DES_genere_Float(...)' de */ /* l'operateur de concatenation "`"... */ RETU_ERROR; Eblock EFonctionI #undef TENTATIVE_DE_REDIMENSIONNEMENT #undef SELECTION_DU_FORMAT_DE_REDIMENSIONNEMENT #undef DEBLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS #undef BLOCAGE_EVENTUEL_DES_MESSAGES_D_ERREUR_DES_FICHIERS #undef ILOAD_FICHIER_AVEC_CONVERSION /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " F L O A T " S I P R E S E N T : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadF_image_si_present(imageR,nom_image,nom_image_absent,valeur_par_defaut))) /* Fonction introduite le 20041230213528... */ DEFV(Argument,DEFV(imageF,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); DEFV(Argument,DEFV(CHAR,DTb0(nom_image_absent))); /* Nom de l'image "standard" a lire et nom au cas ou il n'y a pas de nom... */ DEFV(Argument,DEFV(genere_Float,valeur_par_defaut)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_IMAGE_SI_PRESENT(imageR,nom_image,nom_image_absent,valeur_par_defaut,IloadF_image,IFinitialisation); RETU_ERROR; Eblock EFonctionI #undef ILOAD_IMAGE_SI_PRESENT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " D O U B L E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadD_image(imageR,nom_image))) DEFV(Argument,DEFV(imageD,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Double" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iD,size_Double,fichier_type_imageD); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(Logical,SINT(IloadJ_image_____valider_les_genere_Float,VRAI))); DEFV(Common,DEFV(genere_Float,SINT(IloadJ_image_____seuil_inferieur_de_validation_des_genere_Float,F_MOINS_LE_PETIT_INFINI))); DEFV(Common,DEFV(genere_Float,SINT(IloadJ_image_____seuil_epsilon___de_validation_des_genere_Float,F_EPSILON))); DEFV(Common,DEFV(genere_Float,SINT(IloadJ_image_____seuil_superieur_de_validation_des_genere_Float,F_PETIT_INFINI))); DEFV(Common,DEFV(Logical,SINT(IloadJ_image_____editer_les_niveaux_invalides,FAUX))); /* Donnees de validation heuristique (et eventuelle) des 'genere_Float's dans la fonction */ /* 'IloadJ_image(...)'. */ /* */ /* Le 20030212091505 la validation est passee de 'FAUX' a 'VRAI', c'est plus prudent... */ /* */ /* Le 20030301093054 fut introduite la possibilite d'editer les anomalies... */ /* */ /* Le 20030930153617 fut introduit le test de petitesse en valeur absolue... */ DEFV(Common,DEFV(FonctionI,IloadJ_image(imageR,nom_image))) DEFV(Argument,DEFV(imageJ,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "complexe" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iJ,size_complexe,fichier_type_imageJ); VERIFICATION_HEURISTIQUE_DES_genere_Float(IloadJ_image_____valider_les_genere_Float ,imageR ,__IJnivo_extrema ,IJau_moins_un_niveau_est_incorrect ,IloadJ_image_____seuil_inferieur_de_validation_des_genere_Float ,IloadJ_image_____seuil_epsilon___de_validation_des_genere_Float ,IloadJ_image_____seuil_superieur_de_validation_des_genere_Float ,IloadJ_image_____editer_les_niveaux_invalides ); /* L'utilisation du nom '__IJnivo_extrema' (et non pas de 'IJnivo_extrema') est due a */ /* l'utilisation dans la procedure 'VERIFICATION_HEURISTIQUE_DES_genere_Float(...)' de */ /* l'operateur de concatenation "`"... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " H Y P E R - C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadHJ_image(imageR,nom_image))) DEFV(Argument,DEFV(imageHJ,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-complexe" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iHJ,size_hyper_complexe,fichier_type_imageHJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " H Y P E R - H Y P E R - C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadHHJ_image(imageR,nom_image))) /* Fonction introduite le 20150227110432... */ DEFV(Argument,DEFV(imageHHJ,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-hyper-complexe" a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER(nom_image,imageR,size_iHHJ,size_hyper_hyper_complexe,fichier_type_imageHHJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " S T A N D A R D " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Iload_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(image,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "standard" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_i,size_p,fichier_type_image); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " C H A R " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadC_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageC,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "CHAR" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iC,size_CHAR,fichier_type_imageC); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " I N T " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadI_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageI,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iI,size_Int,fichier_type_imageI); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " P O S I T I V E - I N T " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadU_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageU,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iU,size_LPositive,fichier_type_imageU); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " F L O A T " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(Logical,SINT(IloadF_image_and_delete_____valider_les_genere_Float,VRAI))); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float ,F_MOINS_LE_PETIT_INFINI ) ) ); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float ,F_EPSILON ) ) ); DEFV(Common,DEFV(genere_Float,SINT(IloadF_image_and_delete_____seuil_superieur_de_validation_des_genere_Float ,F_PETIT_INFINI ) ) ); DEFV(Common,DEFV(Logical,SINT(IloadF_image_and_delete_____editer_les_niveaux_invalides,FAUX))); /* Donnees de validation heuristique (et eventuelle) des 'genere_Float's dans la fonction */ /* 'IloadF_image_and_delete(...)'. */ /* */ /* Le 20030212091505 la validation est passee de 'FAUX' a 'VRAI', c'est plus prudent... */ /* */ /* Le 20030301093054 fut introduite la possibilite d'editer les anomalies... */ /* */ /* Le 20030930153617 fut introduit le test de petitesse en valeur absolue... */ DEFV(Common,DEFV(FonctionI,IloadF_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageF,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Float" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iF,size_Float,fichier_type_imageF); TRAITEMENT_SPECIFIQUE_DES_FICHIERS_DE_TYPE_Z_Buffer; VERIFICATION_HEURISTIQUE_DES_genere_Float(IloadF_image_and_delete_____valider_les_genere_Float ,imageR ,__IFnivo_extrema ,IFau_moins_un_niveau_est_incorrect ,IloadF_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float ,IloadF_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float ,IloadF_image_and_delete_____seuil_superieur_de_validation_des_genere_Float ,IloadF_image_and_delete_____editer_les_niveaux_invalides ); /* L'utilisation du nom '__IFnivo_extrema' (et non pas de 'IFnivo_extrema') est due a */ /* l'utilisation dans la procedure 'VERIFICATION_HEURISTIQUE_DES_genere_Float(...)' de */ /* l'operateur de concatenation "`"... */ RETU_ERROR; Eblock EFonctionI #undef TRAITEMENT_SPECIFIQUE_DES_FICHIERS_DE_TYPE_Z_Buffer /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " D O U B L E " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadD_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageD,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Double" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iD,size_Double,fichier_type_imageD); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " C O M P L E X E " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(Logical,SINT(IloadJ_image_and_delete_____valider_les_genere_Float,VRAI))); DEFV(Common,DEFV(genere_Float,SINT(IloadJ_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float ,F_MOINS_LE_PETIT_INFINI ) ) ); DEFV(Common,DEFV(genere_Float,SINT(IloadJ_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float ,F_EPSILON ) ) ); DEFV(Common,DEFV(genere_Float,SINT(IloadJ_image_and_delete_____seuil_superieur_de_validation_des_genere_Float ,F_PETIT_INFINI ) ) ); DEFV(Common,DEFV(Logical,SINT(IloadJ_image_and_delete_____editer_les_niveaux_invalides,FAUX))); /* Donnees de validation heuristique (et eventuelle) des 'genere_Float's dans la fonction */ /* 'IloadJ_image_and_delete(...)'. */ /* */ /* Le 20030212091505 la validation est passee de 'FAUX' a 'VRAI', c'est plus prudent... */ /* */ /* Le 20030301093054 fut introduite la possibilite d'editer les anomalies... */ /* */ /* Le 20030930153617 fut introduit le test de petitesse en valeur absolue... */ DEFV(Common,DEFV(FonctionI,IloadJ_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageJ,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "complexe" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iJ,size_complexe,fichier_type_imageJ); VERIFICATION_HEURISTIQUE_DES_genere_Float(IloadJ_image_and_delete_____valider_les_genere_Float ,imageR ,__IJnivo_extrema ,IJau_moins_un_niveau_est_incorrect ,IloadJ_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float ,IloadJ_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float ,IloadJ_image_and_delete_____seuil_superieur_de_validation_des_genere_Float ,IloadJ_image_and_delete_____editer_les_niveaux_invalides ); /* L'utilisation du nom '__IJnivo_extrema' (et non pas de 'IJnivo_extrema') est due a */ /* l'utilisation dans la procedure 'VERIFICATION_HEURISTIQUE_DES_genere_Float(...)' de */ /* l'operateur de concatenation "`"... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " H Y P E R - C O M P L E X E " P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadHJ_image_and_delete(imageR,nom_image))) DEFV(Argument,DEFV(imageHJ,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-complexe" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iHJ,size_hyper_complexe,fichier_type_imageHJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - I M A G E " H Y P E R - H Y P E R - C O M P L E X E " */ /* P U I S D E S T R U C T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IloadHHJ_image_and_delete(imageR,nom_image))) /* Fonction introduite le 20150227110432... */ DEFV(Argument,DEFV(imageHHJ,imageR)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-hyper-complexe" a lire puis a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ILOAD_FICHIER_AND_DELETE(nom_image,imageR,size_iHHJ,size_hyper_hyper_complexe,fichier_type_imageHHJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " S T A N D A R D " */ /* A V E C D ' E V E N T U E L S P O S T - T R A I T E M E N T S : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define COMPTER_LES_OPTIONS_DE_Istore_image(option) \ COND(IL_FAUT(option),UN,ZERO) DEFV(Common,DEFV(Logical,SINT(Istore_image_____permuter_les_bits_de_l_image,FAUX))); DEFV(Common,DEFV(Positive,SINT(Istore_image_____taille_des_paquets_de_bits,TAILLE_PAR_DEFAUT_DES_PAQUETS_DE_PERMUTATION_DES_BITS))); DEFV(Common,DEFV(Int,SINT(Istore_image_____translation_des_index_de_bits,TRANSLATION_PAR_DEFAUT_DES_INDEX_DE_BITS))); /* Parametrage de 'Istore_image(...)' introduit le 20161128145425... */ DEFV(Common,DEFV(Logical,SINT(Istore_image_____renormaliser_l_image,FAUX))); DEFV(Common,DEFV(genere_p,SINT(Istore_image_____niveau_minimal_de_renormalisation,NOIR))); DEFV(Common,DEFV(genere_p,SINT(Istore_image_____niveau_maximal_de_renormalisation,BLANC))); /* Parametrage de 'Istore_image(...)' introduit le 20130707181804... */ DEFV(Common,DEFV(Logical,SINT(Istore_image_____complementer_l_image,FAUX))); /* Parametrage de 'Istore_image(...)' introduit le 20161129100713... */ DEFV(Common,DEFV(FonctionI,Istore_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "standard" a ecrire. */ DEFV(Argument,DEFV(image,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(IFGT(ADD3(COMPTER_LES_OPTIONS_DE_Istore_image(Istore_image_____permuter_les_bits_de_l_image) ,COMPTER_LES_OPTIONS_DE_Istore_image(Istore_image_____renormaliser_l_image) ,COMPTER_LES_OPTIONS_DE_Istore_image(Istore_image_____complementer_l_image) ) ,UN ) ) /* Test introduit le 20161129100713... */ Bblock PRINT_ATTENTION("plusieurs options sont demandees, mais seule la premiere sera utilisee, les suivantes etant ignorees"); Eblock ATes Bblock Eblock ETes TestU /* En consequence de 'TestU' (introduit le 20161128144206), les options : */ /* */ /* Istore_image_____complementer_l_image */ /* Istore_image_____permuter_les_bits_de_l_image */ /* Istore_image_____renormaliser_l_image */ /* */ /* s'excluent mutuellement... */ Bblock UCAse(IL_FAUT(Istore_image_____permuter_les_bits_de_l_image)) /* Permutation des bits de l'image (possibilite introduite le 20130707181804...). */ /* */ /* Cela permet de "mimer" la gestion d'images de type "bits" (et non plus d'"octets"). En */ /* effet, on va ci-dessous archiver une image, mais dont les bits seront "classes" */ /* plan par plan. Si '..._____translation_des_index_de_bits' est nul, alors on trouvera en */ /* tete du fichier les bits de poids le plus fort (2^7), puis 2^6,..., jusqu'a 2^0. En */ /* donnant a '..._____translation_des_index_de_bits' une valeur differente, on pourra */ /* ainsi selectionner le plan de bit qui se trouvera en tete... */ /* */ /* La mise sous la forme 'UCAse(...)' a ete faite le 20161128144206... */ Bblock BDEFV(image,imageA_permutee); BSaveModifyVariable(Int ,Ipermutation_directe_de_regroupement_des_bits_de_meme_poids_____taille_des_paquets_de_bits ,Istore_image_____taille_des_paquets_de_bits ); BSaveModifyVariable(Int ,Ipermutation_directe_de_regroupement_des_bits_de_meme_poids_____translation_des_index_de_bits ,Istore_image_____translation_des_index_de_bits ); /* Parametrage de la permutation directe... */ CALi(Ipermutation_directe_de_regroupement_des_bits_de_meme_poids(imageA_permutee,imageA)); /* Permutation directe... */ ISTORE_FICHIER(imageA_permutee,nom_image,size_i,size_p,fichier_type_image); /* Archivage du fichier permute... */ ESaveModifyVariable(Int ,Ipermutation_directe_de_regroupement_des_bits_de_meme_poids_____translation_des_index_de_bits ); ESaveModifyVariable(Int ,Ipermutation_directe_de_regroupement_des_bits_de_meme_poids_____taille_des_paquets_de_bits ); EDEFV(image,imageA_permutee); Eblock EUCAs UCAse(IL_FAUT(Istore_image_____renormaliser_l_image)) /* Renormalisation de l'image (possibilite introduite le 20161128145425...). */ Bblock BDEFV(imageF,image_flottante_de_renormalisation); BDEFV(image,image_renormalisee); BSaveModifyVariable(genere_p ,Ifloat_std_____niveau_NOIR ,Istore_image_____niveau_minimal_de_renormalisation ); BSaveModifyVariable(genere_p ,Ifloat_std_____niveau_BLANC ,Istore_image_____niveau_maximal_de_renormalisation ); CALS(Istd_float(image_flottante_de_renormalisation ,FLOT__NOIR ,FLOT__BLANC ,imageA ) ); CALS(Ifloat_std_avec_renormalisation(image_renormalisee,image_flottante_de_renormalisation)); /* Lorsqu'il faut renormaliser, on passe par une representation flottante intermediaire... */ ESaveModifyVariable(genere_p ,Ifloat_std_____niveau_BLANC ); ESaveModifyVariable(genere_p ,Ifloat_std_____niveau_NOIR ); ISTORE_FICHIER(image_renormalisee,nom_image,size_i,size_p,fichier_type_image); /* Archivage du fichier renormalise... */ EDEFV(image,image_renormalisee); EDEFV(imageF,image_flottante_de_renormalisation); Eblock EUCAs UCAse(IL_FAUT(Istore_image_____complementer_l_image)) /* Complementation de l'image (possibilite introduite le 20161129100713...). */ Bblock BDEFV(image,image_complementee); CALS(Icomplementation(image_complementee,imageA)); ISTORE_FICHIER(image_complementee,nom_image,size_i,size_p,fichier_type_image); /* Archivage du fichier renormalise... */ EDEFV(image,image_complementee); Eblock EUCAs UDEfo Bblock ISTORE_FICHIER(imageA,nom_image,size_i,size_p,fichier_type_image); /* Cas le plus frequent ou 'imageA' n'est l'objet d'aucun post-traitement... */ Eblock EUDEf Eblock ETestU RETU_ERROR; Eblock #undef COMPTER_LES_OPTIONS_DE_Istore_image EFonctionI #undef VERIFICATION_HEURISTIQUE_DES_genere_Float /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N E I M A G E E N C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_de_l_image,imageA,type_de_la_composante,espace_de_couleurs,archiver) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_l_image \ ,type_de_la_composante \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Istore_image(nom_composante_image \ ,imageA \ ) \ ); \ ) \ ,archiver \ ); \ Eblock \ /* Tentative de d'archivage de la composante courante... */ DEFV(Common,DEFV(FonctionI,Istore_image_en_couleurs(nom_image,imageA_COMP1,imageA_COMP2,imageA_COMP3,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image a archiver. */ DEFV(Argument,DEFV(image,imageA_COMP1)); DEFV(Argument,DEFV(image,imageA_COMP2)); DEFV(Argument,DEFV(image,imageA_COMP3)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,imageA_COMP1 ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_image_en_couleurs ); ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,imageA_COMP2 ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_image_en_couleurs ); ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,imageA_COMP3 ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_image_en_couleurs ); RETU_ERROR; Eblock #undef ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " S T A N D A R D " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Iupdate_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "standard" a mettre a jour. */ DEFV(Argument,DEFV(image,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(Istore_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N E I M A G E E N C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define UPDATE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_de_l_image,imageA,type_de_la_composante,espace_de_couleurs,updater) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_l_image \ ,type_de_la_composante \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Iupdate_image(nom_composante_image \ ,imageA \ ) \ ); \ ) \ ,updater \ ); \ Eblock \ /* Tentative d'update de la composante courante... */ DEFV(Common,DEFV(FonctionI,Iupdate_image_en_couleurs(nom_image,imageA_COMP1,imageA_COMP2,imageA_COMP3,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image a mettre a jour. */ DEFV(Argument,DEFV(image,imageA_COMP1)); DEFV(Argument,DEFV(image,imageA_COMP2)); DEFV(Argument,DEFV(image,imageA_COMP3)); /* Adresse de l'image en memoire, */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ UPDATE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,imageA_COMP1 ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_image_en_couleurs ); UPDATE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,imageA_COMP2 ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_image_en_couleurs ); UPDATE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS(nom_image ,imageA_COMP3 ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_image_en_couleurs ); RETU_ERROR; Eblock #undef UPDATE_D_UNE_COMPOSANTE_D_UNE_IMAGE_EN_COULEURS EFonctionI #undef nom_composante_image /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " C H A R " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreC_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "CHAR" a ecrire. */ DEFV(Argument,DEFV(imageC,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iC,size_CHAR,fichier_type_imageC); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " C H A R " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateC_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "CHAR" a mettre a jour. */ DEFV(Argument,DEFV(imageC,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreC_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " I N T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreIB_image(nom_image,imageA))) /* Fonction introduite le 20100326190221... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a ecrire. */ DEFV(Argument,DEFV(imageIB,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iIB,size_vrai_Int_de_base,fichier_type_imageIB); RETU_ERROR; Eblock EFonctionI BFonctionI DEFV(Common,DEFV(FonctionI,IstoreI_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a ecrire. */ DEFV(Argument,DEFV(imageI,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iI,size_Int,fichier_type_imageI); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " I N T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateIB_image(nom_image,imageA))) /* Fonction introduite le 20100326190221... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a mettre a jour. */ DEFV(Argument,DEFV(imageIB,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreIB_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI BFonctionI DEFV(Common,DEFV(FonctionI,IupdateI_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Int" a mettre a jour. */ DEFV(Argument,DEFV(imageI,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreI_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " P O S I T I V E - I N T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreUB_image(nom_image,imageA))) /* Fonction introduite le 20100326190221... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a ecrire. */ DEFV(Argument,DEFV(imageUB,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iUB,size_vrai_Positive_de_base,fichier_type_imageUB); RETU_ERROR; Eblock EFonctionI BFonctionI DEFV(Common,DEFV(FonctionI,IstoreU_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a ecrire. */ DEFV(Argument,DEFV(imageU,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iU,size_LPositive,fichier_type_imageU); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " P O S I T I V E - I N T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateUB_image(nom_image,imageA))) /* Fonction introduite le 20100326190221... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a mettre a jour. */ DEFV(Argument,DEFV(imageUB,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreUB_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI BFonctionI DEFV(Common,DEFV(FonctionI,IupdateU_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Positive" a mettre a jour. */ DEFV(Argument,DEFV(imageU,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreU_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " F L O A T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreF_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Float" a ecrire. */ DEFV(Argument,DEFV(imageF,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iF,size_Float,fichier_type_imageF); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " F L O A T " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateF_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Float" a mettre a jour. */ DEFV(Argument,DEFV(imageF,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreF_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " D O U B L E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreD_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Double" a ecrire. */ DEFV(Argument,DEFV(imageD,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iD,size_Double,fichier_type_imageD); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " D O U B L E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateD_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "Double" a mettre a jour. */ DEFV(Argument,DEFV(imageD,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreD_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreJ_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "complexe" a ecrire. */ DEFV(Argument,DEFV(imageJ,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iJ,size_complexe,fichier_type_imageJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateJ_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "complexe" a mettre a jour. */ DEFV(Argument,DEFV(imageJ,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreJ_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " H Y P E R - C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreHJ_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-complexe" a ecrire. */ DEFV(Argument,DEFV(imageHJ,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iHJ,size_hyper_complexe,fichier_type_imageHJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " H Y P E R - C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateHJ_image(nom_image,imageA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-complexe" a mettre a jour. */ DEFV(Argument,DEFV(imageHJ,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreHJ_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - I M A G E " H Y P E R - H Y P E R - C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IstoreHHJ_image(nom_image,imageA))) /* Fonction introduite le 20150227110432... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-hyper-complexe" a ecrire. */ DEFV(Argument,DEFV(imageHHJ,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ISTORE_FICHIER(imageA,nom_image,size_iHHJ,size_hyper_hyper_complexe,fichier_type_imageHHJ); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - I M A G E " H Y P E R - H Y P E R - C O M P L E X E " : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IupdateHHJ_image(nom_image,imageA))) /* Fonction introduite le 20150227110432... */ DEFV(Argument,DEFV(CHAR,DTb0(nom_image))); /* Nom de l'image "hyper-hyper-complexe" a mettre a jour. */ DEFV(Argument,DEFV(imageHHJ,imageA)); /* Adresse de l'image en memoire, */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_image(nom_image)); CODE_ERROR(IstoreHHJ_image(nom_image,imageA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T D E L ' E X I S T E N C E D ' U N E L I S T E D E S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Itest_liste_de_substitution(nom_liste_de_substitution))) DEFV(Argument,DEFV(CHAR,DTb0(nom_liste_de_substitution))); /* Nom de la liste_de_substitution a tester. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ENTREE_DANS_UNE_SECTION_OU_NOM_FICHIER_DESIGNE_UNE_PALETTE; CODE_ERROR(Itest_fichier(nom_liste_de_substitution)); ENTREE_DANS_UNE_SECTION_OU_ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE; RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A N I P U L A T I O N D ' U N E P A L E T T E D E C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ #define nom_composante_palette \ nom_composante_objet \ /* Pour ameliorer la lisibilite... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E S T R U C T I O N D ' U N E L I S T E D E S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Idelete_liste_de_substitution(nom_liste_de_substitution))) DEFV(Argument,DEFV(CHAR,DTb0(nom_liste_de_substitution))); /* Nom de la liste_de_substitution a detruire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ENTREE_DANS_UNE_SECTION_OU_NOM_FICHIER_DESIGNE_UNE_PALETTE; CODE_ERROR(Idelete_fichier(nom_liste_de_substitution)); ENTREE_DANS_UNE_SECTION_OU_ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE; RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N H I B I T I O N E V E N T U E L L E D E L A M A N I P U L A T I O N */ /* D E S C O M P O S A N T E S D ' U N E P A L E T T E D E C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(files_____manipuler_la_composante_COMP1_d_une_palette_de_couleurs ,MANIPULER_UNE_COMPOSANTE_OBJET_COULEURS ) ) ); DEFV(Common,DEFV(Logical,ZINT(files_____manipuler_la_composante_COMP2_d_une_palette_de_couleurs ,MANIPULER_UNE_COMPOSANTE_OBJET_COULEURS ) ) ); DEFV(Common,DEFV(Logical,ZINT(files_____manipuler_la_composante_COMP3_d_une_palette_de_couleurs ,MANIPULER_UNE_COMPOSANTE_OBJET_COULEURS ) ) ); /* Afin d'inhiber, eventuellement, 'MANIPULATION_COMPOSANTE_OBJET_COULEURS(...)' pour un */ /* fichier de type "palette". */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E S T R U C T I O N D ' U N E P A L E T T E D E C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_de_la_palette,type_compos,espace_de_couleurs,detruire) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_la_palette \ ,type_compos \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Idelete_liste_de_substitution(nom_composante_palette \ ) \ ); \ ) \ ,detruire \ ); \ Eblock \ /* Tentative de destruction de la composante courante... */ DEFV(Common,DEFV(FonctionI,Idelete_palette_de_couleurs(nom_palette,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_palette))); /* Nom de la palette a detruire. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_palette_de_couleurs ); DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_palette_de_couleurs ); DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_palette_de_couleurs ); RETU_ERROR; Eblock #undef DESTRUCTION_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R - L I S T E D E S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ #define LOAD_FICHIER_DE_SUBSTITUTION(fichier_de_substitution) \ CAse(fichier_de_substitution) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque la liste de substitution n'a pas ete encore initialisee, */ \ /* on le fait avant la lecture du fichier... */ \ ILOAD_FICHIER(nom_liste_de_substitution \ ,ITb0(listes_de_substitution \ ,INDX(fichier_de_substitution \ ,L_SUBSTITUTION_FIRST \ ) \ ) \ ,MUL2(COULEURS,size_p) \ ,size_p \ ,fichier_type_liste_de_substitution \ ); \ CLEAR_LISTE_INVERSE_DE_SUBSTITUTION(fichier_de_substitution) \ /* Initialisation preliminaire a 'NIVEAU_UNDEF' des listes "inverses". */ \ BoIn(index,NOIR,BLANC,PAS_COULEURS) \ Bblock \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(fichier_de_substitution,index); \ Eblock \ EBoI \ /* Puis calcul de la liste "inverse". */ \ Eblock \ ECAs BFonctionI DEFV(Common,DEFV(FonctionI,Iload_liste_de_substitution(num_liste_de_substitutionR,nom_liste_de_substitution))) DEFV(Argument,DEFV(Int,num_liste_de_substitutionR)); /* Identification de la liste de substitution a lire. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_liste_de_substitution))); /* Nom de la liste_de_substitution a lire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ENTREE_DANS_UNE_SECTION_OU_NOM_FICHIER_DESIGNE_UNE_PALETTE; CHoi(num_liste_de_substitutionR) Bblock LOAD_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE) LOAD_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_ROUGE) LOAD_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_VERTE) LOAD_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_BLEUE) DEfo Bblock PRINT_ERREUR("la liste de substitution demandee est inaccessible"); CODE_ERROR(ERREUR14); Eblock EDEf Eblock ECHo ENTREE_DANS_UNE_SECTION_OU_ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE; RETU_ERROR; Eblock EFonctionI #undef LOAD_FICHIER_DE_SUBSTITUTION #undef ILOAD_FICHIER /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N E P A L E T T E D E C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define NOM_DE_LA_PALETTE_PAR_DEFAUT \ "NomPaletteParDefaut" \ /* Nom de la palette par defaut (introduit le 20150518144431). */ #define ACCES_A_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_de_la_palette,type_compos,espace_de_couleurs,acceder) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_la_palette \ ,type_compos \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Iload_liste_de_substitution(L_SUBSTITUTION`type_compos \ ,nom_composante_palette \ ) \ ); \ ) \ ,acceder \ ); \ Eblock \ /* Tentative d'acces a la composante courante... */ DEFV(Common,DEFV(Logical,SINT(Iload_palette_de_couleurs_____forcer_un_niveau,FAUX))); DEFV(Common,DEFV(genere_p,SINT(Iload_palette_de_couleurs_____niveau_a_forcer,NOIR))); DEFV(Common,DEFV(genere_p,SINT(Iload_palette_de_couleurs_____composante_ROUGE_du_niveau_a_forcer,NOIR))); DEFV(Common,DEFV(genere_p,SINT(Iload_palette_de_couleurs_____composante_VERTE_du_niveau_a_forcer,NOIR))); DEFV(Common,DEFV(genere_p,SINT(Iload_palette_de_couleurs_____composante_BLEUE_du_niveau_a_forcer,NOIR))); /* Afin de permettre en particulier de forcer au NOIR le premier niveau de chaque */ /* palette dans 'v $xci/display$X Iload_palette_de_couleurs_____forcer_un_niveau' */ /* (introduit le 20231128130908). */ DEFV(Common,DEFV(FonctionI,Iload_palette_de_couleurs(nom_palette,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_palette))); /* Nom de la palette a charger. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIT(POINTERc(nom_palette_effective),CHAINE_UNDEF)); DEFV(CHAR,INIT(POINTERc(nom_palette_par_defaut),Gvar(NOM_DE_LA_PALETTE_PAR_DEFAUT))); /* Nom de la palette effectivement utilisee et nom de l'eventuelle palette par defaut */ /* au cas ou... */ INIT_ERROR; /*..............................................................................................................................*/ Test(IFET(IFEQ_chaine(nom_palette,NOM_PIPE) ,IFNE_chaine(nom_palette_par_defaut,VALEUR_D_UNE_VARIABLE_UNDEF) ) ) Bblock EGAL(nom_palette_effective,nom_palette_par_defaut); /* Possibilite introduite le 20150518144431. Dans ce cas, il existe une palette par */ /* defaut dont le nom est donne par la variable d'environnement '$NomPaletteParDefaut'... */ Eblock ATes Bblock EGAp(nom_palette_effective,chain_Acopie(nom_palette)); Eblock ETes ACCES_A_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette_effective ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_palette_de_couleurs ); ACCES_A_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette_effective ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_palette_de_couleurs ); ACCES_A_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette_effective ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_palette_de_couleurs ); Test(IL_FAUT(Iload_palette_de_couleurs_____forcer_un_niveau)) Bblock EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_ROUGE,Iload_palette_de_couleurs_____niveau_a_forcer) ,Iload_palette_de_couleurs_____composante_ROUGE_du_niveau_a_forcer ); EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_VERTE,Iload_palette_de_couleurs_____niveau_a_forcer) ,Iload_palette_de_couleurs_____composante_VERTE_du_niveau_a_forcer ); EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_BLEUE,Iload_palette_de_couleurs_____niveau_a_forcer) ,Iload_palette_de_couleurs_____composante_BLEUE_du_niveau_a_forcer ); /* Afin de permettre en particulier de forcer au NOIR le premier niveau de chaque */ /* palette dans 'v $xci/display$X Iload_palette_de_couleurs_____forcer_un_niveau' */ /* (introduit le 20231128130908). */ Eblock ATes Bblock Eblock ETes RETU_ERROR; Eblock #undef NOM_DE_LA_PALETTE_PAR_DEFAUT #undef ACCES_A_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R - L I S T E D E S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define STORE_FICHIER_DE_SUBSTITUTION(fichier_de_substitution) \ CAse(fichier_de_substitution) \ Bblock \ ISTORE_FICHIER(ITb0(listes_de_substitution \ ,INDX(num_liste_de_substitutionA \ ,L_SUBSTITUTION_NEUTRE \ ) \ ) \ ,nom_liste_de_substitution \ ,MUL2(COULEURS,size_p) \ ,size_p \ ,fichier_type_liste_de_substitution \ ); \ Eblock \ ECAs DEFV(Common,DEFV(FonctionI,Istore_liste_de_substitution(nom_liste_de_substitution,num_liste_de_substitutionA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_liste_de_substitution))); /* Nom de la liste_de_substitution a ecrire. */ DEFV(Argument,DEFV(Int,num_liste_de_substitutionA)); /* Identification de la liste de substitution a ecrire. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ENTREE_DANS_UNE_SECTION_OU_NOM_FICHIER_DESIGNE_UNE_PALETTE; CHoi(num_liste_de_substitutionA) Bblock STORE_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE) STORE_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_ROUGE) STORE_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_VERTE) STORE_FICHIER_DE_SUBSTITUTION(L_SUBSTITUTION_BLEUE) DEfo Bblock PRINT_ERREUR("la liste de substitution demandee est inaccessible"); CODE_ERROR(ERREUR14); Eblock EDEf Eblock ECHo ENTREE_DANS_UNE_SECTION_OU_ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE; RETU_ERROR; Eblock #undef STORE_FICHIER_DE_SUBSTITUTION EFonctionI #undef ENTREE_DANS_UNE_SECTION_OU_NOM_FICHIER_DESIGNE_UNE_PALETTE #undef ENTREE_DANS_UNE_SECTION_OU_ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N E P A L E T T E D E C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_de_la_palette,type_compos,espace_de_couleurs,archiver) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_la_palette \ ,type_compos \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Istore_liste_de_substitution(nom_composante_palette \ ,L_SUBSTITUTION`type_compos \ ) \ ); \ ) \ ,archiver \ ); \ Eblock \ /* Tentative d'archivage de la composante courante... */ DEFV(Common,DEFV(FonctionI,Istore_palette_de_couleurs(nom_palette,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_palette))); /* Nom de la palette a archiver. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_palette_de_couleurs ); ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_palette_de_couleurs ); ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_palette_de_couleurs ); RETU_ERROR; Eblock #undef ARCHIVAGE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N F I C H I E R - L I S T E D E S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,Iupdate_liste_de_substitution(nom_liste_de_substitution,num_liste_de_substitutionA))) DEFV(Argument,DEFV(CHAR,DTb0(nom_liste_de_substitution))); /* Nom de la liste_de_substitution a mettre a jour. */ DEFV(Argument,DEFV(Int,num_liste_de_substitutionA)); /* Identification de la liste de substitution a mettre a jour. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ CALS(Idelete_liste_de_substitution(nom_liste_de_substitution)); CODE_ERROR(Istore_liste_de_substitution(nom_liste_de_substitution,num_liste_de_substitutionA)); RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U P D A T E D ' U N E P A L E T T E D E C O U L E U R S ( ' R V B ' O U ' H L S ' ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define UPDATE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_de_la_palette,type_compos,espace_de_couleurs,updater) \ Bblock \ MANIPULATION_COMPOSANTE_OBJET_COULEURS(nom_de_la_palette \ ,type_compos \ ,espace_de_couleurs \ ,BLOC(CODE_ERROR(Iupdate_liste_de_substitution(nom_composante_palette \ ,L_SUBSTITUTION`type_compos \ ) \ ); \ ) \ ,updater \ ); \ Eblock \ /* Tentative de mise a jour de la composante courante... */ DEFV(Common,DEFV(FonctionI,Iupdate_palette_de_couleurs(nom_palette,nom_de_l_espace_de_couleurs))) DEFV(Argument,DEFV(CHAR,DTb0(nom_palette))); /* Nom de la palette a mettre a jour. */ DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_espace_de_couleurs))); /* Nom de l'espace de couleurs a choisir parmi : */ /* */ /* ESPACE_DE_COULEURS_RVB */ /* ESPACE_DE_COULEURS_HLS */ /* */ /* voir a ce propos 'v $xiii/quad_image$DEF'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ UPDATE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP1 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP1_d_une_palette_de_couleurs ); UPDATE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP2 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP2_d_une_palette_de_couleurs ); UPDATE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS(nom_palette ,COMP3 ,nom_de_l_espace_de_couleurs ,files_____manipuler_la_composante_COMP3_d_une_palette_de_couleurs ); RETU_ERROR; Eblock #undef UPDATE_D_UNE_COMPOSANTE_D_UNE_PALETTES_DE_COULEURS EFonctionI #undef nom_composante_palette #undef MANIPULATION_COMPOSANTE_OBJET_COULEURS #undef ISTORE_FICHIER #undef ILOAD_FICHIER_AND_DELETE #undef EQUIVALENCE_FICHIER /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E " C O M M A N D E - F I C H I E R " : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : voir les commentaires suivants et relatifs a 'Iload_fichier(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R D A N S L E P I P E S I L E N O M E S T V I D E */ /* S I N O N */ /* D A N S L E D I R E C T O R Y " i m a g e s " */ /* P U I S */ /* D A N S L E D I R E C T O R Y C O U R A N T */ /* S I E R R E U R : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : autrefois, la fonction 'Iload_fichier(...)' etait situee ici a cause de */ /* 'SYSTEME_ES9000_AIX_CC'. En effet, la compilation donnait un certain nombre de messages */ /* de warning du type : */ /* */ /* Passing an argument of type "int*" where "unsigned char[]" is expected. */ /* Passing an argument of type "double*" where "unsigned char[]"... */ /* Passing an argument of type "struct nombre_complexe*" where "unsigned char[]"... */ /* */ /* La seule solution simple (en l'absence de l'utilisation de pointeurs) est donc de mettre */ /* la definition de la fonction 'Iload_fichier(...)' a la fin, ce qui ne permet plus au */ /* compilateur de tester le type des arguments lors des appels a 'Iload_fichier(...)'... */ /* */ /* Puis l'arrivee de 'SYSTEME_SGIND?GA_IRIX_CC' a contraint de la remettre en tete ; en */ /* effet, rencontrer une fonction qui n'a pas encore ete definie lui donne implicitement */ /* le type 'int'. Or la fonction 'Iload_fichier(...)' a le type 'Int', d'ou les messages */ /* d'erreur du compilateur : */ /* */ /* cfe: Error: ...: redeclaration of 'Iload_fichier'; previous declaration at ... */ /* cfe: Error: ...: Incompatible function return type for this function. */ /* */ /* dont on ne peut se debarasser, meme avec des "cast"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C H I V A G E D ' U N F I C H I E R D A N S L E P I P E S I L E N O M E S T */ /* V I D E O U S I N O N D A N S L E D I R E C T O R Y " i m a g e s " : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : autrefois, la fonction 'Istore_fichier(...)' etait situee ici a cause de */ /* 'SYSTEME_ES9000_AIX_CC'. En effet, la compilation donnait un certain nombre de messages */ /* de warning du type : */ /* */ /* Passing an argument of type "int*" where "unsigned char[]" is expected. */ /* Passing an argument of type "double*" where "unsigned char[]"... */ /* Passing an argument of type "struct nombre_complexe*" where "unsigned char[]"... */ /* */ /* La seule solution simple (en l'absence de l'utilisation de pointeurs) est donc de mettre */ /* la definition de la fonction 'Istore_fichier(...)' a la fin, ce qui ne permet plus au */ /* compilateur de tester le type des arguments lors des appels a 'Istore_fichier(...)'... */ /* */ /* Puis l'arrivee de 'SYSTEME_SGIND?GA_IRIX_CC' a contraint de la remettre en tete ; en */ /* effet, rencontrer une fonction qui n'a pas encore ete definie lui donne implicitement */ /* le type 'int'. Or la fonction 'Istore_fichier(...)' a le type 'Int', d'ou les messages */ /* d'erreur du compilateur : */ /* */ /* cfe: Error: ...: redeclaration of 'Istore_fichier'; previous declaration at ... */ /* cfe: Error: ...: Incompatible function return type for this function. */ /* */ /* dont on ne peut se debarasser, meme avec des "cast"... */ #undef EXECUTE_PLUSIEURS_FONCTIONS #undef NOM_FICHIER #undef ON_NE_SAIT_PAS_SI_NOM_FICHIER_DESIGNE_UNE_PALETTE_OU_UNE_IMAGE #undef NOM_FICHIER_DESIGNE_UNE_PALETTE _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S A L B U M S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(GdAload_album_____inverser_numeros,FAUX))); DEFV(Common,DEFV(Logical,ZINT(GdAupdate_album_____inverser_numeros,FAUX))); /* Introduits le 20181101120955 pour permettre l'inversion de l'ordre des images d'un */ /* album lors d'un 'GdAload_album(...)' et d'un 'GdAupdate_album(..)'... */ _______________________________________________________________________________________________________________________________________