/*************************************************************************************************************************************/
/* */
/* 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". */