/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S G E N E R A L E S : */ /* */ /* */ /* Author of '$xiiD/definit.2$DEF' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I N D E X A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ /* Ce qui suit a ete deplace depuis 'v $xiii/Images$DEF 20170712133515' le 20170712133515 */ /* afin que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' puisse etre utilisable quasiment */ /* partout... */ #if ( (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_VCC)) \ ) # ifndef NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI # TestADef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI \ /* Cette "option" etait dans 'v $xcc/cpp$D/cpp$Y INDEXATION_SIMPLIFIEE_A_PRIORI' avant le */ \ /* 20000328161359. Il est en fait de loin preferable qu'elle soit ici car, en effet, placee */ \ /* dans le symbole '$Includes' utilise dans tous les appels a '$xcp/cpp$X' faisait qu'il */ \ /* etait impossible d'annuler cette definition dans un source particulier. Ceci est possible */ \ /* dorenavant en utilisant 'NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI'. Mais ATTENTION, */ \ /* cela n'est pas aussi simple que cela, car l'indexation dont il s'agit ici se retrouve */ \ /* evidemment dans de nombreux modules '$FON' de '$xi' qui doivent alors a etre recompiles. */ \ /* */ \ /* Le 20030316120258, 'INDEXATION_SIMPLIFIEE_A_PRIORI' a ete remplace par */ \ /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' pour 'v $xcc/cpp$Z _VERSION_'. */ # Aifndef NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI # Eifndef NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI #Aif ( (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_VCC)) \ ) #Eif ( (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_VCC)) \ ) /* Ce qui precede a ete deplace depuis 'v $xiii/Images$DEF 20170712133515' le 20170712133515 */ /* afin que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' puisse etre utilisable quasiment */ /* partout... */ #define __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI \ /* Le 20170712142708, a des fins de tests de performances, je generalise l'indexation */ \ /* simplifiee, en conservant malgre tout ce qui precede (on ne sait jamais...). */ \ /* */ \ /* On notera le 20170712143531, qu'ainsi, le test : */ \ /* */ \ /* Std */ \ /* time $xci/convol.01$X A=$xiio/MIRE points=500 ... */ \ /* */ \ /* est passe de : */ \ /* */ \ /* 3.150u 0.020s 0:03.24 97.8% 0+0k 2072+512io 5pf+0w */ \ /* */ \ /* a (apres 'v $xb/GENERE$Z'...) : */ \ /* */ \ /* 2.900u 0.000s 0:02.89 100.3% 0+0k 0+512io 0pf+0w */ \ /* */ \ /* sur '$LACT19', ce qui n'est pas negligeable... */ \ /* */ \ /* */ \ /* Mais a cause de 'v $xiirv/.CARB.61.1.$U t.=.calcul' (et d'autres peut-etre...), je fais */ \ /* marche arriere le 20170712172532... */ \ /* */ \ /* Le 20170713133909, je note qu'activer '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' peut */ \ /* etre en fait tres dangereux. En effet, si elle est activee, les procedures d'indexation */ \ /* se reduisent a : */ \ /* */ \ /* INDEXATION_OX(...) = IND?(?,?min) */ \ /* */ \ /* ce qui ne teste pas la presence des coordonnees '?' dans [?min,?max]. Alors que si elle */ \ /* n'est pas activee et si 'IL_FAUT(echantillonnage), alors les procedures d'indexation */ \ /* sont en fait : */ \ /* */ \ /* INDEXATION_OX(...) = IND?(Findice_?(...),?min) */ \ /* */ \ /* les fonctions 'Findice_?(...)' faisant un 'v $xiipf/fonction.3$FON MODU' dans [?min,?max] */ \ /* ce qui est securisant... */ \ /* */ \ /* Le 20170715111607, apres avoir corrige 'v $xiirv/.CARB.61.1.$U 20170715101236' je */ \ /* reactive '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', on verra bien... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U B L A N C : */ /* */ /*************************************************************************************************************************************/ #define BITS_SUPPRIMES_OCTET \ ZERO \ /* Nombre de bits a supprimer pour les points tenant sur un octet. */ #define BITS_SUPPRIMES_MOT \ DEUX \ /* Nombre de bits a supprimer pour les points tenant sur un mot. */ #define NOMBRE_DE_BITS_POUR_LE_BLANC(taille_p) \ SOUS(MUL2(NBITOC,taille_p),COND(IFEQ(taille_p,NOCMO),BITS_SUPPRIMES_MOT,BITS_SUPPRIMES_OCTET)) \ /* Nombre de bits utilises pour le niveau de blanc ; lorsque un point */ \ /* occupe un mot entier, on evite d'utiliser le bit de signe, ainsi, */ \ /* 'BLANC' reste positif ; de plus, afin que 'COULEURS' soit elle aussi */ \ /* une constante positive, on enleve encore un bit, d'ou le 'DEUX'... */ #define GENERE_BLANC(taille_p) \ gMASQUE(NOMBRE_DE_BITS_POUR_LE_BLANC(taille_p)) \ /* Definition du niveau de blanc. */ #define k___BLANC \ GENP(GENERE_BLANC(size_p)) \ /* Definition du niveau de blanc standard. */ \ /* */ \ /* ATTENTION : la constante 'BLANC' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___GRIS \ GENP(NIVA(MOYD(NIVR(NOIR),NIVR(BLANC)))) \ /* Definition de l'intermediaire entre le NOIR et le BLANC. */ /* */ /* ATTENTION : la constante 'GRIS' est pre-generee dans '$xcp/Konstantes$K'. */ #TestADef GRIS_0 \ NOIR #TestADef GRIS_1 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FU,FLOT(HUIT))))) #TestADef GRIS_2 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FDEUX,FLOT(HUIT))))) #TestADef GRIS_3 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(TROIS),FLOT(HUIT))))) #TestADef GRIS_4 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(QUATRE),FLOT(HUIT))))) #TestADef GRIS_5 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(CINQ),FLOT(HUIT))))) #TestADef GRIS_6 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(SIX),FLOT(HUIT))))) #TestADef GRIS_7 \ GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(SEPT),FLOT(HUIT))))) #TestADef GRIS_8 \ BLANC /* ATTENTION, j'ai decouvert le 20000202134317 que : */ /* */ /* GRIS_7=+223 : $xiiD/definit.2$DEF */ /* GRIS_7=+224 : $Fimages */ /* */ /* ces differences se retrouvent aussi pour : */ /* */ /* {GRIS_1,GRIS_2,GRIS_3,GRIS_4,GRIS_5,GRIS_6,GRIS_7} */ /* */ /* Malgre les problemes de compatibilite que cela pose, je corrige cela dans '$Fimages'. */ /* */ /* Le 20050111155519 a cause de la modification 'v $xig/edite$vv$FON 20050111154812', ces */ /* definitions sont passees de 'define' a 'TestADef'... */ #define FLOT__BLANC \ FLOT(BLANC) #define BLANC_char \ CAST_CHAR(GENERE_BLANC(size_CHAR)) \ /* La procedure 'CAST_CHAR(...)' a remplace un 'CAST(genere_CHAR,...)' le 20090331102045. */ #define BLANC_int \ CASP_Int(GENERE_BLANC(size_Int)) #define BLANC_float \ CASP_Float(GENERE_BLANC(size_Int)) \ /* ATTENTION : on utilise 'size_Int' pour simplifier les problemes dus a la definition */ \ /* de 'Float' qui peut etre soit simple, soit double precision... */ \ /* */ \ /* ATTENTION a ne pas confondre 'BLANC_float' et 'FLOT__BLANC', le premier donnant le */ \ /* 'BLANC' en format 'genere_Float' et le second en format 'genere_p'. Ils n'ont donc */ \ /* pas du tout la meme valeur (par exemple le premier sera fait de 31 bits a 1, alors que */ \ /* le second sera fait de 8 bits a 1)... */ /* Les procedures 'CASP...(...)' ont remplace les 'CASP(genere_...,...)' le 20090331104611. */ #define BLANC_double \ BLANC_float \ /* ATTENTION : on ne peut generer 'BLANC_double' par des decalages... */ #define k___COULEURS \ LENG(NOIR,BLANC) \ /* Nombre de niveaux du noir au blanc. */ \ /* */ \ /* ATTENTION : la constante 'COULEURS' est pre-generee dans '$xcp/Konstantes$K'. */ #define PAS_COULEURS \ I \ /* Pas de passage d'une couleur a la suivante... */ /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu */ /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple, */ /* en l'absence de ceci, on a : */ /* */ /* SUCK(BLANC) = NOIR */ /* PREK(NOIR) = BLANC */ /* */ /* ceci ayant ete mis en place le 19970505091407. */ #define nPREK(x,N) \ SOUS(FLOT(x),nPAS(N,PAS_COULEURS)) \ /* Fonction N-ieme 'PREDecesseur Kouleur'. */ #define nSUCK(x,N) \ ADD2(FLOT(x),nPAS(N,PAS_COULEURS)) \ /* Fonction N-ieme 'SUCCesseur Kouleur'. */ /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu */ /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple, */ /* en l'absence de ceci, on a : */ /* */ /* SUCK(BLANC) = NOIR */ /* PREK(NOIR) = BLANC */ /* */ /* ceci ayant ete mis en place le 19970505091407. */ #define nPREK_TRON(x,N) \ TRNP(nPREK(x,N)) \ /* Fonction N-ieme 'PREDecesseur Kouleur' avec validation de ce predecesseur... */ #define nSUCK_TRON(x,N) \ TRNP(nSUCK(x,N)) \ /* Fonction N-ieme 'SUCCesseur Kouleur' avec validation de ce successeur... */ /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu */ /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple, */ /* en l'absence de ceci, on a : */ /* */ /* SUCK(BLANC) = NOIR */ /* PREK(NOIR) = BLANC */ /* */ /* ceci ayant ete mis en place le 19970505091407. */ #define PREK(x) \ nPREK(x,UN) \ /* Fonction 'PREDecesseur Kouleur'. */ #define SUCK(x) \ nSUCK(x,UN) \ /* Fonction 'SUCCesseur Kouleur'. */ /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu */ /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple, */ /* en l'absence de ceci, on a : */ /* */ /* SUCK(BLANC) = NOIR */ /* PREK(NOIR) = BLANC */ /* */ /* ceci ayant ete mis en place le 19970505091407. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef GRIS \ k___GRIS #TestADef BLANC \ k___BLANC #TestADef COULEURS \ k___COULEURS /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " A R R O N D I " D ' U N N I V E A U F L O T T A N T : */ /* */ /*************************************************************************************************************************************/ #if (PRECISION_DU_Float==SIMPLE_PRECISION) # define nEPSILON_GENP \ PARE(1.0E-2) \ /* Petite constante destinee a corriger les defauts d'arrondi mis en evidence le */ \ /* 19961202142828 dans 'v $xci/format.01$K' avec le "mode=1". */ #Aif (PRECISION_DU_Float==SIMPLE_PRECISION) #Eif (PRECISION_DU_Float==SIMPLE_PRECISION) #if (PRECISION_DU_Float==DOUBLE_PRECISION) # define nEPSILON_GENP \ PARE(1.0E-10) \ /* Petite constante destinee a corriger les defauts d'arrondi mis en evidence le */ \ /* 19961202142828 dans 'v $xci/format.01$K' avec le "mode=1". */ #Aif (PRECISION_DU_Float==DOUBLE_PRECISION) #Eif (PRECISION_DU_Float==DOUBLE_PRECISION) #define gGENP(x) \ GENP(FLIN(x,GENP_____epsilon_des_fonctions_de_ce_type)) \ /* Partie entiere avec prise en compte des erreurs d'arrondi (voir les commentaires relatifs */ \ /* a la definition de 'nEPSILON_GENP'). */ #define gVGENP(x) \ GENP(VFLIN(x,GENP_____epsilon_des_fonctions_de_ce_type)) \ /* Partie entiere avec prise en compte des erreurs d'arrondi (voir les commentaires relatifs */ \ /* a la definition de 'nEPSILON_GENP') et validation de non debordement... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X E N T R E U N A X E D E S N I V E A U X */ /* " F E R M E S " O U " O U V E R T S A D R O I T E " : */ /* */ /*************************************************************************************************************************************/ #define AXE_NIVEAUX_OUVERT_FERME(maximum_ouvert,maximum_ferme) \ COND(IL_FAUT(AXE_NIVEAUX_OUVERT_FERME_____compatibilite_19951221) \ ,maximum_ouvert \ ,maximum_ferme \ ) \ /* Introduit le 20091015112207, on ne sait jamais : l'axe est ferme a droite par */ \ /* defaut (soit [0,1]). On notera que cela fut fait par analogie avec ce qui avait ete */ \ /* fait quelques temps avant pour les coordonnees ('v $xiif/format$DEF 20090929093052'). */ \ /* */ \ /* ATTENTION : le 20091015114101 je note que l'usage de 'COULEURS' par defaut peut etre */ \ /* en quelque sorte "masque" (et faire utiliser en fait 'BLANC') a cause des procedures */ \ /* 'TRNP(...)' et 'TRNF(...)' qui font des troncations en utilisant 'BLANC' explicitement. */ \ /* C'est pourquoi, a cette date, il est conseille (provisoirement ?) d'utiliser un axe */ \ /* ferme a droite. On notera que pour simplifier les choses, dans les procedures 'TRNP(...)' */ \ /* et 'TRNF(...)', on utilise simplement 'AXE_NIVEAUX_OUVERT_FERME(BLANC,BLANC)' afin */ \ /* d'utiliser 'BLANC' dans les deux cas... */ \ /* */ \ /* Le 20091015174146, "compatibilite_20091015" a ete change en "compatibilite_19951221" */ \ /* la date "19951221" etant approximative et resultat d'un 'retrouva $xiiD/definit.2$DEF' */ \ /* en choisissant la plus ancienne archive utilisant 'BLANC' et non plus 'COULEURS', */ \ /* c'est-a-dire finalement la premiere... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A I N T I E N D ' U N N I V E A U D A N S [ N O I R , B L A N C ] : */ /* */ /*************************************************************************************************************************************/ #define gTRNP(niveau,maximum_ouvert,maximum_ferme) \ TRON(niveau \ ,NOIR \ ,AXE_NIVEAUX_OUVERT_FERME(maximum_ouvert,maximum_ferme) \ ) #define TRNP(niveau) \ gTRNP(niveau,BLANC,BLANC) /* Maintien d'un niveau de type 'genere_p' dans [NOIR,BLANC]. On notera que l'utilisation */ /* courante sera du type : */ /* */ /* GENP(TRNP(NIVA(...FLOT(NIVR(...))))) */ /* */ /* en notant bien l'importance de l'ordre des operations ; en particulier 'TRNP(...)' */ /* qui fait un 'TRON(...)' dans [NOIR,BLANC] doit preceder imperativement 'GENP(...)' qui */ /* ferait une troncation automatique... */ /* */ /* Le 20190124112346 fut introduit 'gTRNP(...)' pour 'v $xiii/aleat.1$FON gTRNP' et ce */ /* afin que 'Irandom_niveaux(...)' puisse donner une equirepartition des niveaux y compris */ /* aux deux extremites ('NOIR' et 'BLANC'), niveaux pour lesquels il y avait deux fois */ /* moins de points presents que pour les autres niveaux... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A I N T I E N D ' U N N I V E A U F L O T T A N T D A N S [ N O I R , B L A N C ] : */ /* */ /*************************************************************************************************************************************/ #define TRNF(niveau_flottant) \ NIVA(TRON(niveau_flottant \ ,FLOT(NIVR(NOIR)) \ ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(BLANC,BLANC))) \ ) \ ) \ /* Maintien d'un niveau de type 'genere_p', mais exprime actuellement sous une forme */ \ /* flottante, dans [NOIR,BLANC] avec troncation. */ #define MONF(niveau_flottant) \ NIVA(MODF(niveau_flottant \ ,FLOT(NIVR(NOIR)) \ ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(BLANC,BLANC))) \ ) \ ) \ /* Maintien d'un niveau de type 'genere_p', mais exprime actuellement sous une forme */ \ /* flottante, dans [NOIR,BLANC] avec modulo (introduit le 20131205160605). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E N O R M A L I S A T I O N D ' U N N I V E A U : */ /* */ /*************************************************************************************************************************************/ #define F___DENORMALISE_NIVEAU(niveau) \ MUL2(FLOT(niveau) \ ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(COULEURS,BLANC))) \ ) \ /* Afin de passer un niveau de [0,1] a [NOIR,BLANC] en restant en flottant et en debordant */ \ /* eventuellement de [NOIR,BLANC]. ATTENTION, il y a eu pendant longtemps (par erreur ?) la */ \ /* constante 'COULEURS' a la place de 'BLANC'. En fait le 20091015112207 cela fut restaure */ \ /* potentiellement (via "compatibilite_19951221") et ce par symetrie avec les axes de */ \ /* coordonnees ('v $xiif/format$DEF 20090929093052'). */ #define __gDENORMALISE_NIVEAU(niveau,reduction) \ GENP(reduction(F___DENORMALISE_NIVEAU(niveau))) #define __DENORMALISE_NIVEAU_TEL_QUEL_______(niveau) \ __gDENORMALISE_NIVEAU(niveau,NEUT) #define __DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau) \ __gDENORMALISE_NIVEAU(niveau,TRNF) #define __DENORMALISE_NIVEAU_AVEC_MODULO____(niveau) \ __gDENORMALISE_NIVEAU(niveau,MONF) /* Le 20190724142350 fut introduit '__DENORMALISE_NIVEAU_TEL_QUEL_______(...)', on ne sait */ /* jamais... */ #define __DENORMALISE_NIVEAU(niveau) \ __DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau) /* Afin de passer un niveau de [0,1] a [NOIR,BLANC] (introduit le 20131205160838 sous cette */ /* forme...). */ #define a__gDENORMALISE_NIVEAU(niveau,epsilon,reduction) \ GENP(reduction(F___DENORMALISE_NIVEAU(fFLIN(niveau,epsilon)))) #define a__DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau,epsilon) \ a__gDENORMALISE_NIVEAU(niveau,epsilon,TRNF) #define a__DENORMALISE_NIVEAU_AVEC_MODULO____(niveau,epsilon) \ a__gDENORMALISE_NIVEAU(niveau,epsilon,MONF) #define a__DENORMALISE_NIVEAU(niveau,epsilon) \ a__DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau,epsilon) /* Afin de passer un niveau de [0,1] a [NOIR,BLANC] avec gestion eventuelle (suivant la */ /* valeur de 'epsilon') des problemes d'arrondi. Ceci a ete introduit le 20040910141428 */ /* pour 'v $xiii/Images$DEF 20040910134825' et ameliore le 20131205160838... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O R M A L I S A T I O N D ' U N N I V E A U : */ /* */ /*************************************************************************************************************************************/ #define ______NORMALISE_NIVEAU(niveau) \ DIVI(FLOT(NIVR(niveau)) \ ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(COULEURS,BLANC))) \ ) \ /* Afin de passer un niveau de [NOIR,BLANC] a [0,1]. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U ' NOIR ' E T D U ' BLANC ' D E S ' imageF ' : */ /* */ /*************************************************************************************************************************************/ #define ______________NOIR_NORMALISE \ ______NORMALISE_NIVEAU(NOIR) \ /* Definition du 'NOIR' normalise... */ #define ______________BLANC_NORMALISE \ ______NORMALISE_NIVEAU(BLANC) \ /* Definition du 'BLANC' normalise... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L I D A T I O N D ' U N N I V E A U : */ /* */ /*************************************************************************************************************************************/ #define VALIDATION_NIVEAU(niveau,action_si_valide,action_si_invalide) \ Bblock \ Test(INCLff(niveau,NOIR,BLANC)) \ Bblock \ BLOC(action_si_valide); \ Eblock \ ATes \ Bblock \ BLOC(action_si_invalide); \ Eblock \ ETes \ Eblock \ /* ATTENTION : le test suivant : */ \ /* */ \ /* Test(INCLff(niveau,NOIR,BLANC)) */ \ /* */ \ /* implique l'evaluation des expressions 'MINI(NOIR,BLANC)' et 'MAXI(NOIR,BLANC)', et alors */ \ /* le compilateur de 'SYSTEME_ES9000_AIX_CC' sort le message de warning suivant : */ \ /* */ \ /* w "..."....: Unsigned compare with zero always true. */ \ /* */ \ /* ce qui est intolerable. Plutot que de passer de 'INCLff(...)' a 'IFINff(...)', et parce */ \ /* qu'il est des cas ou je n'ai pu faire disparaitre ce message, j'ai introduit dans */ \ /* 'v $xcc/cb$Z' le fichier '$xcc/cb$D/sup.Mwarning$sed' qui elimine ces messages... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " R O T A T I O N " D ' U N N I V E A U O U " A N I M A T I O N " D E S P A L E T T E S : */ /* */ /*************************************************************************************************************************************/ #define LE_NOIR_EST_TRANSLATABLE \ VRAI #define LE_NOIR_N_EST_PAS_TRANSLATABLE \ NOTL(LE_NOIR_EST_TRANSLATABLE) /* Indique si le niveau 'NOIR' est translatable... */ #define ROTATION_NIVEAU(niveau,increment_du_niveau,translater_le_NOIR) \ GENP(NIVA(MODS(NIVR(ADD2(niveau \ ,COND(IFET(IFEQ(niveau,NOIR) \ ,IL_NE_FAUT_PAS(translater_le_NOIR) \ ) \ ,ZERO \ ,increment_des_niveaux \ ) \ ) \ ) \ ,NIVR(NOIR) \ ,NIVR(BLANC) \ ) \ ) \ ) \ /* "Rotation" d'un niveau utilise par exemple pour la rotation des palettes de couleurs dans */ \ /* 'IXpalette(...)' ('v $xiidX/fonct$vv$FON IXpalette'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A T A I L L E D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define TAILLE_D_UN_FICHIER_IMAGE(nombre_de_points_de_l_image,type_de_l_image) \ MUL2(nombre_de_points_de_l_image,type_de_l_image) \ /* Definition de la taille en octets d'une image de type donne. */ #define size_i \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_p) \ /* Definition de la taille en octets d'une image "standard". */ #define size_iC \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_CHAR) \ /* Definition de la taille en octets d'une image "CHAR". */ #define size_iIB \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_vrai_Int_de_base) \ /* Definition de la taille en octets d'une image "vrai_Int_de_base" (introduit le */ \ /* 20100326190221). */ #define size_iI \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Int) \ /* Definition de la taille en octets d'une image "Int". */ #define size_iUB \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_vrai_Positive_de_base) \ /* Definition de la taille en octets d'une image "vrai_Positive_de_base" (introduit le */ \ /* 20100326190221). */ #define size_iU \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_LPositive) \ /* Definition de la taille en octets d'une image "Positive". */ #define size_iF \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Float) \ /* Definition de la taille en octets d'une image "Float". */ #define size_iFB \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_vrai_float_de_base) #define size_i_vrai_float_de_base \ size_iFB /* Definition de la taille en octets d'une image "vrai_float_de_base" (introduite le */ /* 20170406105903). */ #define size_iD \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Double) \ /* Definition de la taille en octets d'une image "Double". */ #define size_iJ \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_complexe) \ /* Definition de la taille en octets d'une image "complexe". */ #define size_iHJ \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_hyper_complexe) \ /* Definition de la taille en octets d'une image "hyper-complexe". */ #define size_iHHJ \ TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_hyper_hyper_complexe) \ /* Definition de la taille en octets d'une image "hyper-hyper-complexe" (introduit */ \ /* le 20150227112922). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A T A I L L E D E S A L B U M S : */ /* */ /*************************************************************************************************************************************/ #define TAILLE_D_UN_FICHIER_ALBUM(nombre_de_points_de_l_album,type_de_l_album) \ TAILLE_D_UN_FICHIER_IMAGE(nombre_de_points_de_l_album,type_de_l_album) \ /* Definition de la taille en octets d'un album de type donne. */ #define size_a \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_p) \ /* Definition de la taille en octets d'un album "standard". */ #define size_aC \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_CHAR) \ /* Definition de la taille en octets d'un album "CHAR". */ #define size_aI \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_Int) \ /* Definition de la taille en octets d'un album "Int". */ #define size_aU \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_LPositive) \ /* Definition de la taille en octets d'un album "Positive". */ #define size_aF \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_Float) \ /* Definition de la taille en octets d'un album "Float". */ #define size_aD \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_Double) \ /* Definition de la taille en octets d'un album "Double". */ #define size_aJ \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_complexe) \ /* Definition de la taille en octets d'un album "complexe". */ #define size_aHJ \ TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_hyper_complexe) \ /* Definition de la taille en octets d'un album "hyper-complexe". */