/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U F O R M A T D E S I M A G E S E T D E S P I X E L S : */
/* */
/* */
/* Author of '$xiiD/definit.1$DEF' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 19870000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O R M A T D E S I M A G E S ( ' X ' ) : */
/* */
/*************************************************************************************************************************************/
#define k___Xmin \
COORDONNEE_MINIMALE \
/* Definition de l'abscisse minimale. */ \
/* */ \
/* ATTENTION : la constante 'Xmin' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Xmax \
COORDONNEE_MAXIMALE(logX) \
/* Definition de l'abscisse maximale. */ \
/* */ \
/* ATTENTION : la constante 'Xmax' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimX \
DIMENSION(k___Xmin,k___Xmax) \
/* Definition de la longueur de l'axe horizontal. */ \
/* */ \
/* ATTENTION : la constante 'dimX' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___PasX \
PAS_COORDONNEE \
/* Definition du pas de parcours de l'axe horizontal. */ \
/* */ \
/* ATTENTION : la constante 'PasX' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimX2 \
MOIT(k___dimX) \
/* Definition de la longueur de la moitie de l'axe horizontal. */ \
/* */ \
/* ATTENTION : la constante 'dimX2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Xmin2 \
ADD2(k___Xmin,k___dimX2) \
/* Definition de l'abscisse minimale de [Xmax/2,Xmax]. */ \
/* */ \
/* ATTENTION : la constante 'Xmin2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Xmax2 \
PRED(k___Xmin2) \
/* Definition de l'abscisse maximale de [Xmin,Xmax/2]. */ \
/* */ \
/* ATTENTION : la constante 'Xmax2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Xcentre \
k___Xmin2 \
/* Centre "approximatif" de [Xmin,Xmax]. */ \
/* */ \
/* ATTENTION : la constante 'Xcentre' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O R M A T D E S I M A G E S ( ' Y ' ) : */
/* */
/*************************************************************************************************************************************/
#define k___Ymin \
COORDONNEE_MINIMALE \
/* Definition de l'ordonnee minimale. */ \
/* */ \
/* ATTENTION : la constante 'Ymin' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Ymax \
COORDONNEE_MAXIMALE(logY) \
/* Definition de l'ordonnee maximale. */ \
/* */ \
/* ATTENTION : la constante 'Ymax' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimY \
DIMENSION(k___Ymin,k___Ymax) \
/* Definition de la longueur de l'axe vertical. */ \
/* */ \
/* ATTENTION : la constante 'dimY' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___PasY \
PAS_COORDONNEE \
/* Definition du pas de parcours de l'axe vertical. */ \
/* */ \
/* ATTENTION : la constante 'PasY' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimY2 \
MOIT(k___dimY) \
/* Definition de la longueur de la moitie de l'axe vertical. */ \
/* */ \
/* ATTENTION : la constante 'dimY2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Ymin2 \
ADD2(k___Ymin,k___dimY2) \
/* Definition de l'ordonnee minimale de [Ymax/2,Ymax]. */ \
/* */ \
/* ATTENTION : la constante 'Ymin2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Ymax2 \
PRED(k___Ymin2) \
/* Definition de l'ordonnee maximale de [Ymin,Ymax/2]. */ \
/* */ \
/* ATTENTION : la constante 'Ymax2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Ycentre \
k___Ymin2 \
/* Centre "approximatif" de [Ymin,Ymax]. */ \
/* */ \
/* ATTENTION : la constante 'Ycentre' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O R M A T D E S I M A G E S ( ' Z ' ) : */
/* */
/*************************************************************************************************************************************/
#define k___Zmin \
MOYE(k___Xmin,k___Ymin) \
/* Definition du 'Z' "minimal", */ \
/* */ \
/* ATTENTION : la constante 'Zmin' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Zmax \
MOYE(k___Xmax,k___Ymax) \
/* Definition du 'Z' "maximal" par raisons de "symetrie"... */ \
/* */ \
/* ATTENTION : la constante 'Zmax' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimZ \
DIMENSION(k___Zmin,k___Zmax) \
/* Dimension de l'axe 'OZ' (pour le systeme graphique). */ \
/* */ \
/* ATTENTION : la constante 'dimZ' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___PasZ \
PAS_COORDONNEE \
/* Definition du pas de parcours de l'axe 'OZ'. */ \
/* */ \
/* ATTENTION : la constante 'PasZ' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimZ2 \
MOIT(k___dimZ) \
/* Definition de la longueur de la moitie de l'axe de profondeur. */ \
/* */ \
/* ATTENTION : la constante 'dimZ2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Zmin2 \
ADD2(k___Zmin,k___dimZ2) \
/* Definition de la coordonnee minimale de [Zmax/2,Zmax]. */ \
/* */ \
/* ATTENTION : la constante 'Zmin2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Zmax2 \
PRED(k___Zmin2) \
/* Definition de la coordonnee maximale de [Zmin,Zmax/2]. */ \
/* */ \
/* ATTENTION : la constante 'Zmax2' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___Zcentre \
k___Zmin2 \
/* Centre "approximatif" de [Zmin,Zmax]. */ \
/* */ \
/* ATTENTION : la constante 'Zcentre' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O R M A T D E S I M A G E S ( ' T ' ) : */
/* */
/*************************************************************************************************************************************/
/* Definitions introduites le 20171219105340... */
#define k___Tmin \
NEUT(COORDONNEE_MINIMALE) \
/* Definition de l'abscisse minimale. */
#define k___Tmax \
SUCC(COORDONNEE_MINIMALE) \
/* Definition de l'abscisse maximale. */
#define k___dimT \
DIMENSION(k___Tmin,k___Tmax) \
/* Definition de la longueur de l'axe temporel. */
#define k___PasT \
PAS_COORDONNEE \
/* Definition du pas de parcours de l'axe temporel. */
#define k___dimT2 \
MOIT(k___dimT) \
/* Definition de la longueur de la moitie de l'axe temporel. */
#define k___Tmin2 \
ADD2(k___Tmin,k___dimT2) \
/* Definition de l'abscisse minimale de [Tmax/2,Tmax]. */
#define k___Tmax2 \
PRED(k___Tmin2) \
/* Definition de l'abscisse maximale de [Tmin,Tmax/2]. */
#define k___Tcentre \
k___Tmin2 \
/* Centre "approximatif" de [Tmin,Tmax]. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O R M A T D E S I M A G E S : */
/* */
/*************************************************************************************************************************************/
#define k___MdimXY \
MAX2(k___dimX,k___dimY) \
/* Plus grande dimension dans l'espace a deux dimensions. */ \
/* */ \
/* ATTENTION : la constante 'MdimXY' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___MdimXYZ \
MAX2(k___MdimXY,k___dimZ) \
/* Plus grande dimension dans l'espace a trois dimensions. */ \
/* */ \
/* ATTENTION : la constante 'MdimXYZ' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___MdimXYZT \
MAX2(k___MdimXYZ,k___dimT) \
/* Plus grande dimension dans l'espace a quatre dimensions. */
#define k___dimXY \
MUL2(k___dimX,k___dimY) \
/* Dimension bi-dimensionnelle du carre (OX,OY), */ \
/* */ \
/* ATTENTION : la constante 'dimXY' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimXYZ \
MUL2(k___dimXY,k___dimZ) \
/* Dimension tri-dimensionnelle du cube (OX,OY,OZ). */ \
/* */ \
/* ATTENTION : la constante 'dimXYZ' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___dimXYZT \
MUL2(k___dimXYZ,k___dimT) \
/* Dimension quadri-dimensionnelle de l'hyper-cube (OX,OY,OZ,OT). */
#define k___PLUS_GRANDE_IMAGE_CARREE_INSCRITE \
MIN2(k___dimX,k___dimY) \
/* Definition des dimensions de la plus grande image carree que l'on peut "inscrire" */ \
/* dans une image "standard" [dimX,dimY]. */ \
/* */ \
/* ATTENTION : la constante 'PLUS_GRANDE_IMAGE_CARREE_INSCRITE' est pre-generee dans */ \
/* '$xcp/Konstantes$K' dans le cas de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
#define k___PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE \
MAX2(k___dimX,k___dimY) \
/* Definition des dimensions de la plus petite image carree que l'on peut "circonscrire" */ \
/* autour d'une image "standard" [dimX,dimY]. */ \
/* */ \
/* ATTENTION : la constante 'PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE' est pre-generee dans */ \
/* '$xcp/Konstantes$K' dans le cas de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* " 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 : */
/* */
/*************************************************************************************************************************************/
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
# TestADef Xmin \
k___Xmin
# TestADef Xmax \
k___Xmax
# TestADef dimX \
k___dimX
# TestADef dimX2 \
k___dimX2
# TestADef Xmin2 \
k___Xmin2
# TestADef Xmax2 \
k___Xmax2
# TestADef Xcentre \
k___Xcentre
# TestADef Ymin \
k___Ymin
# TestADef Ymax \
k___Ymax
# TestADef dimY \
k___dimY
# TestADef dimY2 \
k___dimY2
# TestADef Ymin2 \
k___Ymin2
# TestADef Ymax2 \
k___Ymax2
# TestADef Ycentre \
k___Ycentre
# TestADef Zmin \
k___Zmin
# TestADef Zmax \
k___Zmax
# TestADef dimZ \
k___dimZ
# TestADef dimZ2 \
k___dimZ2
# TestADef Zmin2 \
k___Zmin2
# TestADef Zmax2 \
k___Zmax2
# TestADef Zcentre \
k___Zcentre
# TestADef Tmin \
k___Tmin
# TestADef Tmax \
k___Tmax
# TestADef dimT \
k___dimT
# TestADef dimT2 \
k___dimT2
# TestADef Tmin2 \
k___Tmin2
# TestADef Tmax2 \
k___Tmax2
# TestADef Tcentre \
k___Tcentre
# TestADef MdimXY \
k___MdimXY
# TestADef MdimXYZ \
k___MdimXYZ
# TestADef MdimXYZT \
k___MdimXYZT
# TestADef dimXY \
k___dimXY
# TestADef dimXYZ \
k___dimXYZ
# TestADef dimXYZT \
k___dimXYZT
# TestADef PLUS_GRANDE_IMAGE_CARREE_INSCRITE \
k___PLUS_GRANDE_IMAGE_CARREE_INSCRITE
# TestADef PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE \
k___PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
/* Les variables 'dimX', 'dimY' et 'dimZ' seront definies en 'PASSE_1' dans les fichiers */
/* '$xiii/Images$STR', '$xiii/Imagess$STR', '$ximt/fourier$FON' et '$ximt/ondelettes$FON' */
/* afin de traiter le cas des images "statiques... */
= define dimX \
DIMENSION(Xmin,Xmax)
/* Definition de la longueur de l'axe horizontal. */
= define dimXN \
LONGUEUR(dimX)
/* Definition de la longueur de l'axe horizontal compatible '_____?NORMALISE_OX(...)'. */
/* */
/* ATTENTION, suite a 'v $xiiD/definit.1$DEF 20090928173316' ce qui precede est obsolete... */
= define dimX2 \
MOIT(dimX)
/* Definition de la longueur de la moitie de l'axe horizontal. */
= define Xmin2 \
ADD2(Xmin,dimX2)
/* Definition de l'abscisse minimale de [Xmax/2,Xmax]. */
= define Xmax2 \
PRED(Xmin2)
/* Definition de l'abscisse maximale de [Xmin,Xmax/2]. */
= define Xcentre \
Xmin2
/* Centre "approximatif" de [Xmin,Xmax]. */
= define dimY \
DIMENSION(Ymin,Ymax)
/* Definition de la longueur de l'axe vertical. */
= define dimYN \
LONGUEUR(dimY)
/* Definition de la longueur de l'axe vertical compatible '_____?NORMALISE_OY(...)'. */
/* */
/* ATTENTION, suite a 'v $xiiD/definit.1$DEF 20090928173316' ce qui precede est obsolete... */
= define dimY2 \
MOIT(dimY)
/* Definition de la longueur de la moitie de l'axe vertical. */
= define Ymin2 \
ADD2(Ymin,dimY2)
/* Definition de l'ordonnee minimale de [Ymax/2,Ymax]. */
= define Ymax2 \
PRED(Ymin2)
/* Definition de l'ordonnee maximale de [Ymin,Ymax/2]. */
= define Ycentre \
Ymin2
/* Centre "approximatif" de [Ymin,Ymax]. */
= define dimZ \
DIMENSION(Zmin,Zmax)
/* Dimension de l'axe 'OZ' (pour le systeme graphique). */
= define dimZN \
LONGUEUR(dimZ)
/* Definition de la longueur de l'axe de profondeur compatible '_____?NORMALISE_OZ(...)'. */
/* */
/* ATTENTION, suite a 'v $xiiD/definit.1$DEF 20090928173316' ce qui precede est obsolete... */
= define dimZ2 \
MOIT(dimZ)
/* Definition de la longueur de la moitie de l'axe de profondeur. */
= define Zmin2 \
ADD2(Zmin,dimZ2)
/* Definition de la coordonnee minimale de [Zmax/2,Zmax]. */
= define Zmax2 \
PRED(Zmin2)
/* Definition de la coordonnee maximale de [Zmin,Zmax/2]. */
= define Zcentre \
Zmin2
/* Centre "approximatif" de [Zmin,Zmax]. */
= define dimT \
DIMENSION(Tmin,Tmax)
/* Dimension de l'axe 'OT' (pour le systeme graphique). */
= define dimTN \
LONGUEUR(dimT)
/* Definition de la longueur de l'axe de profondeur... */
= define dimT2 \
MOIT(dimT)
/* Definition de la longueur de la moitie de l'axe de profondeur. */
= define Tmin2 \
ADD2(Tmin,dimT2)
/* Definition de la coordonnee minimale de [Tmax/2,Tmax]. */
= define Tmax2 \
PRED(Tmin2)
/* Definition de la coordonnee maximale de [Tmin,Tmax/2]. */
= define Tcentre \
Tmin2
/* Centre "approximatif" de [Tmin,Tmax]. */
= define MdimXY \
MAX2(dimX,dimY)
/* Plus grande dimension dans l'espace a deux dimensions. */
= define MdimXYZ \
MAX2(MdimXY,dimZ)
/* Plus grande dimension dans l'espace a trois dimensions. */
= define MdimXYZT \
MAX2(MdimXYZ,dimT)
/* Plus grande dimension dans l'espace a quatre dimensions. */
= define dimXY \
MUL2(dimX,dimY)
/* Dimension bi-dimensionnelle du carre (OX,OY), */
= define dimXYZ \
MUL2(dimXY,dimZ)
/* Dimension tri-dimensionnelle du cube (OX,OY,OZ). */
= define dimXYZT \
MUL2(dimXYZ,dimT)
/* Dimension quadri-dimensionnelle de l'hyper-cube (OX,OY,OZ,OT). */
= define PLUS_GRANDE_IMAGE_CARREE_INSCRITE \
MIN2(dimX,dimY)
/* Definition des dimensions de la plus grande image carree que l'on peut "inscrire" */
/* dans une image "standard" [dimX,dimY]. */
= define PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE \
MAX2(dimX,dimY)
/* Definition des dimensions de la plus petite image carree que l'on peut "circonscrire" */
/* autour d'une image "standard" [dimX,dimY]. */
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#TestADef PasX \
k___PasX
#TestADef PasY \
k___PasY
#TestADef PasZ \
k___PasZ
#TestADef PasT \
k___PasT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N T I O N D E S M I N I M A F L O T T A N T S ( E T A U T R E S ) : */
/* */
/*************************************************************************************************************************************/
#define FXmin \
FZERO
#define FYmin \
FZERO
#define FZmin \
FZERO
#define FTmin \
FZERO
/* 'FZmin' fut introduit pour 'v $xiipf/fonction.2$FON FFload_point_coordonnees_01_____Zf' */
/* le 20080918211437 ; 'FXmin' et 'FYmin' le furent par symetrie avec 'FZmin'. On notera */
/* qu'il ne faut pas confondre {FXmin,FYmin,FZmin} avec {FLOT(Xmin),FLOT(Ymin),FLOT(Zmin)} */
/* (c'est-a-dire a {FXorigine,FYorigine,FZorigine}) qui eux, sont variables et sont egaux */
/* a {Xmin,Ymin,Zmin}, alors que {FXmin,FYmin,FZmin} sont toujours nuls... */
#define FXmax \
FU
#define FYmax \
FU
#define FZmax \
FU
#define FTmax \
FU
/* Introduits le 20171212154647 et complete le 20171219112546 avec 'FTmax'... */
#define FXmilieu \
MOYE(FXmin,FXmax)
#define FYmilieu \
MOYE(FYmin,FYmax)
#define FZmilieu \
MOYE(FZmin,FZmax)
#define FTmilieu \
MOYE(FTmin,FTmax)
/* Introduits le 20171212154647 et complete le 20171219112546 avec 'FTmilieu'... */
/* */
/* ATTENTION : ne pas confondre {FXcentre_____,FYcentre_____,FZcentre_____} et */
/* {FXmilieu,FYmilieu,FZmilieu}, le premier triplet etant dynamique et lie aux */
/* definitions {Xcentre,Ycentre,Zcentre}... */
#define FXcentre_____ \
FLOT(Xcentre)
#define FYcentre_____ \
FLOT(Ycentre)
#define FZcentre_____ \
FLOT(Zcentre)
#define FTcentre_____ \
FLOT(Tcentre)
/* Introduits le 20120607085854 en notant que la longueur de ces symboles est egale a */
/* celle de ce qu'ils definissent afin de simplifier leur introduction... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N T I O N D U F O R M A T " E X T R E M E " D E S I M A G E S " S T A T I Q U E S " : */
/* */
/* */
/* Nota : */
/* */
/* Dans tous les cas (c'est-a-dire, quel que */
/* soit 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_??' */
/* et 'GESTION_DES_IMAGES_STATIQUES_VERSION_??') */
/* les symboles "KK___..." designent des tailles */
/* constantes (c'est-a-dire qui ne ne peuvent pas */
/* changer a l'execution), alors que les symboles */
/* "K___..." peuvent representer aussi bien des */
/* tailles constantes que des tailles variables */
/* (cas de 'GESTION_DES_IMAGES_STATIQUES_VERSION_02'). */
/* */
/*************************************************************************************************************************************/
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
/* "K___..." et "KK___..." ont la meme valeur constante et donnent la taille effective des */
/* axes des objets de type 'S___<type>' et 'E___S___<type>' pour "K___...", et de type */
/* 'F___<type>' pour "KK___...". */
# define K___dimX \
k___dimX \
/* Extension maximale de l'axe 'OX', */
# define K___dimY \
k___dimY \
/* Extension maximale de l'axe 'OY', */
# define K___dimZ \
k___dimZ \
/* Extension maximale de l'axe 'OZ'. */
# define KK___dimX \
k___dimX \
/* Extension maximale de l'axe 'OX' (a cause de 'GESTION_DES_IMAGES_STATIQUES_VERSION_02'), */
# define KK___dimY \
k___dimY \
/* Extension maximale de l'axe 'OY' (a cause de 'GESTION_DES_IMAGES_STATIQUES_VERSION_02'), */
# define KK___dimZ \
k___dimZ \
/* Extension maximale de l'axe 'OZ' (a cause de 'GESTION_DES_IMAGES_STATIQUES_VERSION_02'). */
# define KK___dimT \
k___dimT \
/* Extension maximale de l'axe 'OT' (a cause de 'GESTION_DES_IMAGES_STATIQUES_VERSION_02'). */
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# if ( (defined(SYSTEME_NWS3000_NEWSOS)))
# if ( (defined(LACT23)) \
|| (defined(EDFR11)) \
|| (defined(HOME11)) \
)
/* Nota : rappelons que les noms '$LACT23', '$EDFR11' et '$HOME11' sont synonymes et */
/* designent la station UNIX "portable" en fonction de sa situation geographique... */
# nTestADef BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1 \
/* ATTENTION : sur 'SYSTEME_NWS3000_NEWSOS' il y a pre-allocation de la zone de swap */ \
/* necessaire a chaque process, il est necessaire de reduire au minimum l'extension */ \
/* des dimensions. On prendra donc ce qui suffit pour le Pal, a savoir : */ \
/* */ \
/* sur 'OX' : 0819 (pour 0780), */ \
/* sur 'OY' : 0576 (pour 0575), */ \
/* sur 'OZ' : 1024 (valeur indefinie pour le Pal...). */ \
/* */ \
/* En fait, j'ai regenere le systeme, et aggrandi la zone de swap... */ \
/* */ \
/* ATTENTION : Cette variable est liee obligatoirement a la definition 'BUG_NWS3000_Sdu_1' */ \
/* qui est faite dans le fichier '$FbugsG'... */
# TestADef BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1 \
/* ATTENTION : sur 'SYSTEME_NWS3000_NEWSOS' il y a (provisoirement ?) un probleme : la */ \
/* taille d'un programme ne peut exceder (a epsilon pres...) la taille de la memoire */ \
/* physique. Il est donc necessaire de reduire au minimum l'extension des dimensions. */ \
/* On prendra donc ce qui suffit pour le Pal, a savoir : */ \
/* */ \
/* sur 'OX' : 0819 (pour 0780), */ \
/* sur 'OY' : 0576 (pour 0575), */ \
/* sur 'OZ' : 1024 (valeur indefinie pour le Pal...). */ \
/* */ \
/* Ceci est un probleme, par exemple, pour '$xci/filtre.01$K'. */ \
/* */ \
/* ATTENTION : Cette variable est liee obligatoirement a la definition 'BUG_NWS3000_Sdu_1' */ \
/* qui est faite dans le fichier '$FbugsG'... */
# Aif ( (defined(LACT23)) \
|| (defined(EDFR11)) \
|| (defined(HOME11)) \
)
# Eif ( (defined(LACT23)) \
|| (defined(EDFR11)) \
|| (defined(HOME11)) \
)
# Aif ( (defined(SYSTEME_NWS3000_NEWSOS)))
# Eif ( (defined(SYSTEME_NWS3000_NEWSOS)))
# if ( (defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1)) \
)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OX(dimension) \
ADD2(dimension,GRO6(FRA10(dimension)))
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OY(dimension) \
ADD2(dimension,GRO1(FRA8(dimension)))
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OZ(dimension) \
ADD2(dimension,GRO1(FRA1(dimension)))
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OT(dimension) \
ADD2(dimension,GRO1(FRA1(dimension)))
/* Les images "statiques" (celles qui sont definies une fois pour toute dans les fichiers */
/* '$xiii/Images$STR' et '$xiii/Imagess$STR') posent un probleme particulier, car en effet */
/* il est impossible d'initialier leur pointeur en fonction de 'dimX' et 'dimY' (les */
/* compilateurs le refusent), et d'autre part a l'execution, leur type est perdu, et donc */
/* leur longueur (en nombre d'octets) est inconnue. La seule solution est donc de prevoir */
/* a priori une zone suffisamment grande pour satisfaire tous les besoins, c'est ce que */
/* l'on definit ici, en prenant en compte un bug relatif a la pre-allocation de la zone de */
/* swap necessaire a chaque process, il est necessaire de reduire au minimum l'extension */
/* des dimensions. On prend donc ce qui suffit pour le Pal, a savoir : */
/* */
/* sur 'OX' : 0819 (pour 0780), */
/* sur 'OY' : 0576 (pour 0575), */
/* sur 'OZ' : 1024. */
/* */
# Aif ( (defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1)) \
)
# if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OXYZT(dimension) \
GRO2(dimension)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OX(dimension) \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OXYZT(dimension)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OY(dimension) \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OXYZT(dimension)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OZ(dimension) \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OXYZT(dimension)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OT(dimension) \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OXYZT(dimension)
/* Cas des images "statiques" (voir les commentaires ci-dessus a leur sujet...). */
# Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
# Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
# if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OX(dimension) \
ADD2(GRO3(dimension),GRO2(FRA10(dimension)))
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OY(dimension) \
ADD2(GRO3(dimension),GRO2(FRA10(dimension)))
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OZ(dimension) \
GRO1(FRA16(dimension))
# define EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OT(dimension) \
GRO1(FRA16(dimension))
# Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
/* Les images "statiques" (celles qui sont definies une fois pour toute dans les fichiers */
/* '$xiii/Images$STR' et '$xiii/Imagess$STR') posent un probleme particulier, car en effet */
/* il est impossible d'initialier leur pointeur en fonction de 'dimX' et 'dimY' (les */
/* compilateurs le refusent), et d'autre part a l'execution, leur type est perdu, et donc */
/* leur longueur (en nombre d'octets) est inconnue. La seule solution est donc de prevoir */
/* a priori une zone suffisamment grande pour satisfaire tous les besoins, c'est ce que */
/* l'on definit ici. On notera le passage de 'GRO2(...)' a 'GRO4(...)' utile en fait avec */
/* 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_03' qui permet de manipuler des images au format */
/* double du format 'Pal' sans probleme ; ceci a ete introduit le 19970220161259. */
/* De plus, le 19970224145047 afin de ne pas avoir des "album"s de taille delirantes, j'ai */
/* et contraint de reduire 'EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OZ(...)'. */
# Eif ( (defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_ZONE_DE_SWAP_1)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_LACT23_EDFR11_HOME11_LIMIT_MEMORY_1)) \
)
/* Ces tests de pre-existence de 'K___dimX', 'K___dimY' et 'K___dimZ' sont en fait destines */
/* a discriminer la compilation de la commande '$xcp/Konstantes$K' elle-meme des autres */
/* compilations... */
# define k___K___dimX \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OX(k___dimX) \
/* Extension maximale de l'axe 'OX', */ \
/* */ \
/* ATTENTION : la constante 'K___dimX' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'. */
# define k___K___dimY \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OY(k___dimY) \
/* Extension maximale de l'axe 'OY', */ \
/* */ \
/* ATTENTION : la constante 'K___dimY' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'. */
# define k___K___dimZ \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OZ(k___dimZ) \
/* Extension maximale de l'axe 'OZ'. */ \
/* */ \
/* ATTENTION : la constante 'K___dimZ' est pre-generee dans '$xcp/Konstantes$K' dans le cas */ \
/* de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'. */
# define k___K___dimT \
EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OT(k___dimT) \
/* Extension maximale de l'axe 'OT'. */
# ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01
/* "K___..." et "KK___..." ont la meme valeur constante et donnent la taille maximale des */
/* axes des objets de type 'S___<type>' et 'E___S___<type>' pour "K___...", et de type */
/* 'F___<type>' pour "KK___...". */
# TestADef K___dimX \
k___K___dimX
# TestADef K___dimY \
k___K___dimY
# TestADef K___dimZ \
k___K___dimZ
# TestADef K___dimT \
k___K___dimT
/* Ces tests de pre-existence de 'K___dimX', 'K___dimY' et 'K___dimZ' sont en fait destines */
/* a discriminer la compilation de la commande '$xcp/Konstantes$K' elle-meme des autres */
/* compilations ('K___dimT' a ete introduit le 20171219112728). */
# TestADef KK___dimX \
k___K___dimX
# TestADef KK___dimY \
k___K___dimY
# TestADef KK___dimZ \
k___K___dimZ
# TestADef KK___dimT \
k___K___dimT
/* Ces tests de pre-existence de 'K___dimX', 'K___dimY' et 'K___dimZ' sont en fait destines */
/* a discriminer la compilation de la commande '$xcp/Konstantes$K' elle-meme des autres */
/* compilations ('KK___dimT' a ete introduit le 20171219112728). */
# Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01
# Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01
# ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02
/* "K___..." est variable et donne la taille effective des objets de type 'S___<type>' et */
/* 'E___S___<type>', alors que "KK___..." est constante et donne la taille des objets de */
/* type 'F___<type>'. */
# ifdef K___dimX
# undef K___dimX
# Aifdef K___dimX
# Eifdef K___dimX
# ifdef K___dimY
# undef K___dimY
# Aifdef K___dimY
# Eifdef K___dimY
# ifdef K___dimZ
# undef K___dimZ
# Aifdef K___dimZ
# Eifdef K___dimZ
# ifdef K___dimT
# undef K___dimT
# Aifdef K___dimT
# Eifdef K___dimT
/* Ces tests de pre-existence de 'K___dimX', 'K___dimY' et 'K___dimZ' sont en fait destines */
/* a assurer la compatibilite avec la commande '$xcp/Konstantes$K' tant qu'elle n'a pas ete */
/* recompilee (elle est alors equivalente a 'GESTION_DES_IMAGES_STATIQUES_VERSION_01'...). */
# define K___dimX \
dimX
# define K___dimY \
dimY
# define K___dimZ \
dimZ
# define K___dimT \
dimT
# TestADef KK___dimX \
k___dimX
# TestADef KK___dimY \
k___dimY
# TestADef KK___dimZ \
k___dimZ
# TestADef KK___dimT \
k___dimT
/* Ces tests de pre-existence de 'K___dimX', 'K___dimY' et 'K___dimZ' sont en fait destines */
/* a discriminer la compilation de la commande '$xcp/Konstantes$K' elle-meme des autres */
/* compilations... */
# Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02
# Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02
# define KK___MdimXY \
MAX2(KK___dimX,KK___dimY) \
/* "Longueur" maximale d'une image. */
# define KK___dimXY \
MUL2(KK___dimX,KK___dimY) \
/* "Surface" maximale d'une image. */
# define KK___dimXYZ \
MUL2(KK___dimXY,KK___dimZ) \
/* "Volume" maximale d'un album. */
# define KK___dimXYZT \
MUL2(KK___dimXYZ,KK___dimT) \
/* "Volume" maximale d'un hyper-album. */
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N T I O N D E S C O M P O S A N T E S C H R O M A T I Q U E S E L E M E N T A I R E S : */
/* */
/*************************************************************************************************************************************/
#define COMPOSANTE_CHROMATIQUE_FIRST \
INDEX0 \
/* Definition de la premiere composante chromatique. */
Denumer04(INIS(_COMPOSANTE_CHROMATIQUE_ROUGE,COMPOSANTE_CHROMATIQUE_FIRST)
,_COMPOSANTE_CHROMATIQUE_VERTE
,_COMPOSANTE_CHROMATIQUE_BLEUE
,_COMPOSANTE_CHROMATIQUE_INEXISTANTE
,liste_des_IDENTIFICATEURS_DE_COMPOSANTE_CHROMATIQUE
);
#define COMPOSANTE_CHROMATIQUE_ROUGE \
ENUM(_COMPOSANTE_CHROMATIQUE_ROUGE)
#define COMPOSANTE_CHROMATIQUE_VERTE \
ENUM(_COMPOSANTE_CHROMATIQUE_VERTE)
#define COMPOSANTE_CHROMATIQUE_BLEUE \
ENUM(_COMPOSANTE_CHROMATIQUE_BLEUE)
/* Definition des specificateurs des identites des composantes chromatiques. */
#define k___NOMBRE_DE_COMPOSANTES_CHROMATIQUES \
LENG(COMPOSANTE_CHROMATIQUE_FIRST,PRED(ENUM(_COMPOSANTE_CHROMATIQUE_INEXISTANTE))) \
/* Nombre de composantes chromatiques elementaires dans le systeme 'RVB'. */
#TestADef NOMBRE_DE_COMPOSANTES_CHROMATIQUES \
k___NOMBRE_DE_COMPOSANTES_CHROMATIQUES \
/* "Pre-generation" des constantes fondamentales. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E M U L T I P L E X A G E D E S */
/* T R O I S C O M P O S A N T E S C H R O M A T I Q U E S : */
/* */
/*************************************************************************************************************************************/
#define Bsize_p \
MUL2(size_p,NBITOC) \
/* Nombre de bits necessaires a coder un niveau... */
#define k___PRECISION_MINIMALE_DU_ROUGE \
QUOD(Bsize_p,NOMBRE_DE_COMPOSANTES_CHROMATIQUES) \
/* ATTENTION : la constante 'PRECISION_MINIMALE_DU_ROUGE' est pre-generee dans */ \
/* '$xcp/Konstantes$K'. */
#define k___PRECISION_MINIMALE_DU_VERTE \
QUOD(Bsize_p,NOMBRE_DE_COMPOSANTES_CHROMATIQUES) \
/* ATTENTION : la constante 'PRECISION_MINIMALE_DU_VERTE' est pre-generee dans */ \
/* '$xcp/Konstantes$K'. */
#define k___PRECISION_MINIMALE_DU_BLEUE \
QUOD(Bsize_p,NOMBRE_DE_COMPOSANTES_CHROMATIQUES) \
/* ATTENTION : la constante 'PRECISION_MINIMALE_DU_BLEUE' est pre-generee dans */ \
/* '$xcp/Konstantes$K'. */
/* Nombre de bits minimal necessaire a chaque composante chromatique... */
#define k___PRECISION_MAXIMALE_DU_ROUGE \
QUOE(Bsize_p,NOMBRE_DE_COMPOSANTES_CHROMATIQUES) \
/* ATTENTION : la constante 'PRECISION_MAXIMALE_DU_ROUGE' est pre-generee dans */ \
/* '$xcp/Konstantes$K'. */
#define k___PRECISION_MAXIMALE_DU_VERTE \
QUOE(Bsize_p,NOMBRE_DE_COMPOSANTES_CHROMATIQUES) \
/* ATTENTION : la constante 'PRECISION_MAXIMALE_DU_VERTE' est pre-generee dans */ \
/* '$xcp/Konstantes$K'. */
#define k___PRECISION_MAXIMALE_DU_BLEUE \
QUOE(Bsize_p,NOMBRE_DE_COMPOSANTES_CHROMATIQUES) \
/* ATTENTION : la constante 'PRECISION_MAXIMALE_DU_BLEUE' est pre-generee dans */ \
/* '$xcp/Konstantes$K'. */
/* Nombre de bits maximal occupes par les trois composantes chromatiques ; on notera */
/* que ces trois precisions sont incompatibles, puisque leur somme est superieure */
/* a 'Bsize_p' (malheureusement...). */
#nodefine SLRS_RVB_VERSION_01 \
/* Avec cette version, on teste les faibles niveaux afin de les conserver. */
#define SLRS_RVB_VERSION_02 \
/* Avec cette version, les faibles niveaux ne sont pas testes... */
#ifdef SLRS_RVB_VERSION_01
# define SLRS_RVB(niveau,amplitude) \
COND(IFEQ(niveau,NOIR) \
,NOIR \
,MAX2(SLRS(niveau,amplitude),NOIR_PLANCHER) \
) \
/* Procedure destinee a decaler les niveaux en eveitant la disparition des niveaux faibles. */
#Aifdef SLRS_RVB_VERSION_01
#Eifdef SLRS_RVB_VERSION_01
#ifdef SLRS_RVB_VERSION_02
# define SLRS_RVB(niveau,amplitude) \
SLRS(niveau,amplitude) \
/* Procedure destinee a decaler les niveaux sans tester l'amplitude des niveaux. Ceci a */ \
/* ete introduit le 20010715175157 parce que c'est finalement plus logique, meme si cela ne */ \
/* permet pas de reproduire correctement une image grise (c'est-a_dire dont, pour chaque */ \
/* point, les niveaux {ROUGE,VERTE,BLEUE} sont egaux) avec 'v $xci/multiplex$K', puis la */ \
/* palette '$xiP/universel.11'. Cela peut se comprendre en faisant les maniuplations */ \
/* suivantes : */ \
/* */ \
/* Std */ \
/* */ \
/* $xci/vraies_C$X A=$xiio/MIRE p=$xiP/gris.01 \ */ \
/* RVB=VRAI R=$xTG/IMAGE.1 $formatI */ \
/* */ \
/* $xci/multiplex$X AR=$xTG/IMAGE.1$ROUGE \ */ \
/* AV=$xTG/IMAGE.1$VERTE \ */ \
/* AB=$xTG/IMAGE.1$BLEUE \ */ \
/* R=$xTG/IMAGE.2 $formatI */ \
/* */ \
/* $xci/vraies_C$X A=$xTG/IMAGE.2 p=$xiP/universel.11 \ */ \
/* RVB=VRAI R=$xTG/IMAGE.3 $formatI */ \
/* */ \
/* Le dump hexa-decimal des 3 composantes de '$xTG/IMAGE.3' donne : */ \
/* */ \
/* $ROUGE 0000 2424 4848 6c6c 9090 b4b4 d8d8 ffff */ \
/* $VERTE 0000 2424 4848 6c6c 9090 b4b4 d8d8 ffff */ \
/* $BLEUE 0000 0000 5555 5555 aaaa aaaa ffff ffff */ \
/* */ \
/* (pour chaque ligne). On voit bien que seules les composantes '$ROUGE' et '$VERTE' sont */ \
/* egales, et differentes de '$BLEUE' ce qui vient evidemment du multiplexage 3+3+2. */
#Aifdef SLRS_RVB_VERSION_02
#Eifdef SLRS_RVB_VERSION_02
#define MULTIPLEXAGE_RVB(coul1,nivo_ROUGE,precision_ROUGE,coul2,nivo_VERTE,precision_VERTE,coul3,nivo_BLEUE,precision_BLEUE,slrs,dg) \
SLLS(OUI03(SLLS(slrs(coul1(nivo_ROUGE,nivo_VERTE,nivo_BLEUE) \
,SOUS(Bsize_p \
,coul1(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
,ADD2(coul2(precision_ROUGE,precision_VERTE,precision_BLEUE) \
,coul3(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
,SLLS(slrs(coul2(nivo_ROUGE,nivo_VERTE,nivo_BLEUE) \
,SOUS(Bsize_p \
,coul2(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
,coul3(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
,SLLS(slrs(coul3(nivo_ROUGE,nivo_VERTE,nivo_BLEUE) \
,SOUS(Bsize_p \
,coul3(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
,ZERO \
) \
) \
,dg \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe de format quelconque definit */ \
/* par le nombre de bits (precision_ROUGE,precision_VERTE,precision_BLEUE) de */ \
/* chaque composante. */
#define CADRAGE_A_DROITE_DES_TRIPLETS_RVB \
ZERO \
/* Afin de cadrer a droite un triplet de type {R,V,B} (quel que soit l'ordre...). */
#define CADRAGE_A_GAUCHE_DES_TRIPLETS_RVB \
Bsize_p \
/* Afin de cadrer a gauche un triplet de type {R,V,B} (quel que soit l'ordre...). */
#define MULTIPLEXAGE_RVB_222(niveau_ROUGE,niveau_VERTE,niveau_BLEUE) \
MULTIPLEXAGE_RVB(SE13,niveau_ROUGE,PRECISION_MINIMALE_DU_ROUGE \
,SE23,niveau_VERTE,PRECISION_MINIMALE_DU_VERTE \
,SE33,niveau_BLEUE,PRECISION_MINIMALE_DU_BLEUE \
,SLRS_RVB \
,CADRAGE_A_DROITE_DES_TRIPLETS_RVB \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe compatible avec la palette */ \
/* '$xiP/universel.31', et dans le format {R,V,B} = (2,2,2) pour des niveaux en 'genere_p'. */
#define MULTIPLEXAGE_RVB_223(niveau_ROUGE,niveau_VERTE,niveau_BLEUE) \
MULTIPLEXAGE_RVB(SE13,niveau_ROUGE,PRECISION_MINIMALE_DU_ROUGE \
,SE23,niveau_VERTE,PRECISION_MINIMALE_DU_VERTE \
,SE33,niveau_BLEUE,PRECISION_MAXIMALE_DU_BLEUE \
,SLRS_RVB \
,CADRAGE_A_DROITE_DES_TRIPLETS_RVB \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe compatible avec la palette */ \
/* '$xiP/universel.21', et dans le format {R,V,B} = (2,2,3) pour des niveaux en 'genere_p'. */
#define MULTIPLEXAGE_RVB_332(niveau_ROUGE,niveau_VERTE,niveau_BLEUE) \
MULTIPLEXAGE_RVB(SE13,niveau_ROUGE,PRECISION_MAXIMALE_DU_ROUGE \
,SE23,niveau_VERTE,PRECISION_MAXIMALE_DU_VERTE \
,SE33,niveau_BLEUE,PRECISION_MINIMALE_DU_BLEUE \
,SLRS_RVB \
,CADRAGE_A_DROITE_DES_TRIPLETS_RVB \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe compatible avec la palette */ \
/* '$xiP/universel.11', et dans le format {R,V,B} = (3,3,2) pour des niveaux en 'genere_p'. */
#define MULTIPLEXAGE_RVBg_888(niveau_ROUGE,niveau_VERTE,niveau_BLEUE) \
MULTIPLEXAGE_RVB(SE13,niveau_ROUGE,Bsize_p \
,SE23,niveau_VERTE,Bsize_p \
,SE33,niveau_BLEUE,Bsize_p \
,SLRS \
,CADRAGE_A_GAUCHE_DES_TRIPLETS_RVB \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe dans le format {R,V,B} = (8,8,8) */ \
/* pour des niveaux en 'genere_p', mais avec un cadrage a gauche (d'ou le "g" de "RVBg"). */
#define MULTIPLEXAGE_RVB_888(niveau_ROUGE,niveau_VERTE,niveau_BLEUE) \
MULTIPLEXAGE_RVB(SE13,niveau_ROUGE,Bsize_p \
,SE23,niveau_VERTE,Bsize_p \
,SE33,niveau_BLEUE,Bsize_p \
,SLRS \
,CADRAGE_A_DROITE_DES_TRIPLETS_RVB \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe dans le format {R,V,B} = (8,8,8) */ \
/* pour des niveaux en 'genere_p', avec un cadrage a droite standard... */
#define MULTIPLEXAGE_BVR_888(niveau_ROUGE,niveau_VERTE,niveau_BLEUE) \
MULTIPLEXAGE_RVB(SE33,niveau_ROUGE,Bsize_p \
,SE23,niveau_VERTE,Bsize_p \
,SE13,niveau_BLEUE,Bsize_p \
,SLRS \
,CADRAGE_A_DROITE_DES_TRIPLETS_RVB \
) \
/* Pour passer d'un triplet {R,V,B} a un niveau multiplexe dans le format (B,V,R) = (8,8,8) */ \
/* pour des niveaux en 'genere_p', mais ATTENTION, c'est (B,V,R) et non pas {R,V,B}... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E D E M U L T I P L E X A G E D E S */
/* T R O I S C O M P O S A N T E S C H R O M A T I Q U E S : */
/* */
/*************************************************************************************************************************************/
#define DEMULTIPLEXAGE_RVB_1(niveau,coul1,precision_ROUGE,coul2,precision_VERTE,coul3,precision_BLEUE,slls,dg) \
slls(REST(SLRS(SLRS(niveau,dg) \
,ADD2(coul2(precision_ROUGE,precision_VERTE,precision_BLEUE) \
,coul3(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
,MASK_TO_P2(gMASQUE(coul1(precision_ROUGE,precision_VERTE,precision_BLEUE))) \
) \
,SOUS(Bsize_p \
,coul1(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
/* Pour demultiplexer la couleur 'coul1'. */
#define DEMULTIPLEXAGE_RVB_2(niveau,coul1,precision_ROUGE,coul2,precision_VERTE,coul3,precision_BLEUE,slls,dg) \
slls(REST(SLRS(SLRS(niveau,dg) \
,coul3(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
,MASK_TO_P2(gMASQUE(coul2(precision_ROUGE,precision_VERTE,precision_BLEUE))) \
) \
,SOUS(Bsize_p \
,coul2(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
/* Pour demultiplexer la couleur 'coul2'. */
#define DEMULTIPLEXAGE_RVB_3(niveau,coul1,precision_ROUGE,coul2,precision_VERTE,coul3,precision_BLEUE,slls,dg) \
slls(REST(SLRS(SLRS(niveau,dg) \
,ZERO \
) \
,MASK_TO_P2(gMASQUE(coul3(precision_ROUGE,precision_VERTE,precision_BLEUE))) \
) \
,SOUS(Bsize_p \
,coul3(precision_ROUGE,precision_VERTE,precision_BLEUE) \
) \
) \
/* Pour demultiplexer la couleur 'coul3'. */
#define DEMULTIPLEXAGE_RVBg_888(niveau,coul) \
coul(DEMULTIPLEXAGE_RVB_1(niveau,SE33,Bsize_p,SE23,Bsize_p,SE13,Bsize_p,SLLS,CADRAGE_A_GAUCHE_DES_TRIPLETS_RVB) \
,DEMULTIPLEXAGE_RVB_2(niveau,SE33,Bsize_p,SE23,Bsize_p,SE13,Bsize_p,SLLS,CADRAGE_A_GAUCHE_DES_TRIPLETS_RVB) \
,DEMULTIPLEXAGE_RVB_3(niveau,SE33,Bsize_p,SE23,Bsize_p,SE13,Bsize_p,SLLS,CADRAGE_A_GAUCHE_DES_TRIPLETS_RVB) \
) \
/* Pour passer d'un niveau multiplexe dans le format {R,V,B} = (8,8,8) a l'un des trois */ \
/* niveau d'un triplet {R,V,B} pour des niveaux en 'genere_p', et cadres a gauche... */
#define DEMULTIPLEXAGE_RVBg_888_ROUGE(niveau) \
DEMULTIPLEXAGE_RVBg_888(niveau,SE13) \
/* Pour recuperer le ROUGE dans un niveau multiplexe dans le format {R,V,B} = (8,8,8)... */
#define DEMULTIPLEXAGE_RVBg_888_VERTE(niveau) \
DEMULTIPLEXAGE_RVBg_888(niveau,SE23) \
/* Pour recuperer le VERTE dans un niveau multiplexe dans le format {R,V,B} = (8,8,8)... */
#define DEMULTIPLEXAGE_RVBg_888_BLEUE(niveau) \
DEMULTIPLEXAGE_RVBg_888(niveau,SE33) \
/* Pour recuperer le BLEUE dans un niveau multiplexe dans le format {R,V,B} = (8,8,8)... */
#define DEMULTIPLEXAGE_BVR_888(niveau,coul) \
coul(DEMULTIPLEXAGE_RVB_1(niveau,SE33,Bsize_p,SE23,Bsize_p,SE13,Bsize_p,SLLS,CADRAGE_A_DROITE_DES_TRIPLETS_RVB) \
,DEMULTIPLEXAGE_RVB_2(niveau,SE33,Bsize_p,SE23,Bsize_p,SE13,Bsize_p,SLLS,CADRAGE_A_DROITE_DES_TRIPLETS_RVB) \
,DEMULTIPLEXAGE_RVB_3(niveau,SE33,Bsize_p,SE23,Bsize_p,SE13,Bsize_p,SLLS,CADRAGE_A_DROITE_DES_TRIPLETS_RVB) \
) \
/* Pour passer d'un niveau multiplexe dans le format (B,V,R) = (8,8,8) a l'un des trois */ \
/* niveau d'un triplet {R,V,B} pour des niveaux en 'genere_p', mais ATTENTION, c'est (B,V,R) */ \
/* et non pas {R,V,B}... */
#define DEMULTIPLEXAGE_BVR_888_ROUGE(niveau) \
DEMULTIPLEXAGE_BVR_888(niveau,SE33) \
/* Pour recuperer le ROUGE dans un niveau multiplexe dans le format (B,V,R) = (8,8,8)... */
#define DEMULTIPLEXAGE_BVR_888_VERTE(niveau) \
DEMULTIPLEXAGE_BVR_888(niveau,SE23) \
/* Pour recuperer le VERTE dans un niveau multiplexe dans le format (B,V,R) = (8,8,8)... */
#define DEMULTIPLEXAGE_BVR_888_BLEUE(niveau) \
DEMULTIPLEXAGE_BVR_888(niveau,SE13) \
/* Pour recuperer le BLEUE dans un niveau multiplexe dans le format (B,V,R) = (8,8,8)... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* " 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 PRECISION_MINIMALE_DU_ROUGE \
k___PRECISION_MINIMALE_DU_ROUGE
#TestADef PRECISION_MINIMALE_DU_VERTE \
k___PRECISION_MINIMALE_DU_VERTE
#TestADef PRECISION_MINIMALE_DU_BLEUE \
k___PRECISION_MINIMALE_DU_BLEUE
#TestADef PRECISION_MAXIMALE_DU_ROUGE \
k___PRECISION_MAXIMALE_DU_ROUGE
#TestADef PRECISION_MAXIMALE_DU_VERTE \
k___PRECISION_MAXIMALE_DU_VERTE
#TestADef PRECISION_MAXIMALE_DU_BLEUE \
k___PRECISION_MAXIMALE_DU_BLEUE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I M E N S I O N D E S " E S P A C E S " S T A N D A R D S : */
/* */
/*************************************************************************************************************************************/
#define MONO_DIMENSIONNEL \
UN \
/* Dimension des objets "mono-dimensionnels", */
#define BI_DIMENSIONNEL \
SUCC(MONO_DIMENSIONNEL) \
/* Dimension des objets "bi-dimensionnels", */
#define TRI_DIMENSIONNEL \
SUCC(BI_DIMENSIONNEL) \
/* Dimension des objets "tri-dimensionnels". */
#define QUADRI_DIMENSIONNEL \
SUCC(TRI_DIMENSIONNEL) \
/* Dimension des objets "quadri-dimensionnels". */
#define PUId(x,d) \
PUIX(x,NEUT(FLOT(d)))
#define PUI1(x) \
PUId(x,MONO_DIMENSIONNEL)
#define PUI2(x) \
PUId(x,BI_DIMENSIONNEL)
#define PUI3(x) \
PUId(x,TRI_DIMENSIONNEL)
#define PUI4(x) \
PUId(x,QUADRI_DIMENSIONNEL)
/* Calcul d'un "volume" a partir d'une dimension (introduit le 20070227134635). */
#define RACd(x,d) \
PUIX(x,INVE(FLOT(d)))
#define RAC1(x) \
RACd(x,MONO_DIMENSIONNEL)
#define RAC2(x) \
RACd(x,BI_DIMENSIONNEL)
#define RAC3(x) \
RACd(x,TRI_DIMENSIONNEL)
#define RAC4(x) \
RACd(x,QUADRI_DIMENSIONNEL)
/* Calcul d'une dimension a partir d'un "volume" (introduit le 20070227134635). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V A L I D A T I O N D E S C O O R D O N N E E S : */
/* */
/*************************************************************************************************************************************/
/* ATTENTION, les coordonnees {x,y[,z]} qui suivent ne doivent pas etre typees afin que les */
/* procedures du type 'TEST_HORS_IMAGE(...)' puissent etre utilisees avec des coordonnees */
/* flottantes. Cela est tres utile au cas ou elles devraient atteindre des valeurs tres */
/* grandes (par exemple, pour 'new_X' et 'new_Y' dans 'UN_SUR_Z_DANS_LE_PLAN_COMPLEXE(...)' */
/* dans '$ximcf/conformes$FON', bien que cela n'y soit pas utilise, car, en effet, un */
/* probleme de ce type a ete regle en remplacant les 'INTE(...)' par des 'VINTE(...)'). */
#define TEST_HORS_IMAGE(x,y) \
IFOU(IFEXff(x,Xmin,Xmax) \
,IFEXff(y,Ymin,Ymax) \
) \
/* Test de positionnement des coordonnees hors de l'image, en faisant les hypotheses */ \
/* realistes suivantes : */ \
/* */ \
/* Xmin < Xmax, */ \
/* Ymin < Ymax, */ \
/* */ \
/* ce qui permet de remplacer 'NINCff(...)' par 'IFEXff(...)'... */
#define TEST_DANS_L_IMAGE(x,y) \
IFET(IFINff(x,Xmin,Xmax) \
,IFINff(y,Ymin,Ymax) \
) \
/* Test de positionnement des coordonnees dans l'image, en faisant les hypotheses */ \
/* realistes suivantes : */ \
/* */ \
/* Xmin < Xmax, */ \
/* Ymin < Ymax, */ \
/* */ \
/* ce qui permet de remplacer 'INCLff(...)' par 'IFINff(...)'... */
#define TEST_HORS_ALBUM(x,y,z) \
I3OU(IFEXff(x,Xmin,Xmax) \
,IFEXff(y,Ymin,Ymax) \
,IFEXff(z,Zmin,Zmax) \
) \
/* Test de positionnement des coordonnees hors de l'image volumique, en faisant les */ \
/* hypotheses realistes suivantes : */ \
/* */ \
/* Xmin < Xmax, */ \
/* Ymin < Ymax, */ \
/* Zmin < Zmax, */ \
/* */ \
/* ce qui permet de remplacer 'NINCff(...)' par 'IFEXff(...)'... */
#define TEST_DANS_L_ALBUM(x,y,z) \
I3ET(IFINff(x,Xmin,Xmax) \
,IFINff(y,Ymin,Ymax) \
,IFINff(z,Zmin,Zmax) \
) \
/* Test de positionnement des coordonnees dans l'image volumique, en faisant les */ \
/* hypotheses realistes suivantes : */ \
/* */ \
/* Xmin < Xmax, */ \
/* Ymin < Ymax, */ \
/* Zmin < Zmax, */ \
/* */ \
/* ce qui permet de remplacer 'INCLff(...)' par 'IFINff(...)'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E N O R M A L I S A T I O N D E S A X E S : */
/* */
/*************************************************************************************************************************************/
#define COOA(longueur,coordonnee_minimale) \
ADD2(coordonnee_minimale,longueur) \
/* Avant le 20190726101713 cette definition etait dans 'v $xiii/Images$DEF 20190726105745'. */
/* Or 'v $xiii/Images$DEF' est inclus apres 'v $xiiD/definit.1$DEF' ce qui posait alors un */
/* probleme pour les definitions '_cDENORMALISE_O?(...)' passee de '$PASSE_1' a '$PASSE_2' */
/* a cette date, d'ou la necessite de ce deplacement... */
#define F__cDENORMALISE_OX(coordonnee) \
F__cDENORMALISE_AXES(Xmin,dimX,coordonnee)
=define _cDENORMALISE_OX(coordonnee) \
_cDENORMALISE_AXES(Xmin,dimX,coordonnee)
#define V_cDENORMALISE_OX(coordonnee) \
V_cDENORMALISE_AXES(Xmin,dimX,coordonnee)
/* Le 20190726101713 '_cDENORMALISE_OX(...)' est passe de '$PASSE_1' a '$PASSE_2' pour */
/* 'v $xiii/pent_image$FON TRANSFORMATION_DE_TROIS_NIVEAUX_RVB_EN_UNE_COORDONNEE'... */
#define F__lDENORMALISE_OX(longueur) \
F__lDENORMALISE_AXES(dimX,longueur)
#define _lDENORMALISE_OX(longueur) \
_lDENORMALISE_AXES(dimX,longueur)
#define V_lDENORMALISE_OX(longueur) \
V_lDENORMALISE_AXES(dimX,longueur)
/* Denormalisation d'une longueur sur l'axe OX ; l'unite represente [Xmin,Xmax] */
/* (en flottant puis en entier). On verifiera que : */
/* */
/* F__cDENORMALISE_OX(0.0) = Xmin */
/* F__cDENORMALISE_OX(1.0) = Xmax */
/* */
/* et que : */
/* */
/* _cDENORMALISE_OX(0.0) = Xmin */
/* _cDENORMALISE_OX(1.0) = Xmax */
/* */
/* Les "double" versions '*_cDENORMALISE_O?(...)' et '*_lDENORMALISE_O?(...)' ont ete */
/* introduites le 20010223094543 car effectivement une coordonnee et une longueur ne */
/* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre */
/* "relativisee"...). */
#define F__cDENORMALISE_OY(coordonnee) \
F__cDENORMALISE_AXES(Ymin,dimY,coordonnee)
=define _cDENORMALISE_OY(coordonnee) \
_cDENORMALISE_AXES(Ymin,dimY,coordonnee)
#define V_cDENORMALISE_OY(coordonnee) \
V_cDENORMALISE_AXES(Ymin,dimY,coordonnee)
/* Le 20190726101713 '_cDENORMALISE_OY(...)' est passe de '$PASSE_1' a '$PASSE_2' pour */
/* 'v $xiii/pent_image$FON TRANSFORMATION_DE_TROIS_NIVEAUX_RVB_EN_UNE_COORDONNEE'... */
#define F__lDENORMALISE_OY(longueur) \
F__lDENORMALISE_AXES(dimY,longueur)
#define _lDENORMALISE_OY(longueur) \
_lDENORMALISE_AXES(dimY,longueur)
#define V_lDENORMALISE_OY(longueur) \
V_lDENORMALISE_AXES(dimY,longueur)
/* Denormalisation d'une longueur sur l'axe OY ; l'unite represente [Ymin,Ymax] */
/* (en flottant puis en entier). On verifiera que : */
/* */
/* F__cDENORMALISE_OY(0.0) = Ymin */
/* F__cDENORMALISE_OY(1.0) = Ymax+1 */
/* */
/* et que : */
/* */
/* _cDENORMALISE_OY(0.0) = Ymin */
/* _cDENORMALISE_OY(1.0) = Ymax+1 */
/* */
/* Les "double" versions '*_cDENORMALISE_O?(...)' et '*_lDENORMALISE_O?(...)' ont ete */
/* introduites le 20010223094543 car effectivement une coordonnee et une longueur ne */
/* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre */
/* "relativisee"...). */
#define F__cDENORMALISE_OZ(coordonnee) \
F__cDENORMALISE_AXES(Zmin,dimZ,coordonnee)
=define _cDENORMALISE_OZ(coordonnee) \
_cDENORMALISE_AXES(Zmin,dimZ,coordonnee)
#define V_cDENORMALISE_OZ(coordonnee) \
V_cDENORMALISE_AXES(Zmin,dimZ,coordonnee)
/* Le 20190726101713 '_cDENORMALISE_OZ(...)' est passe de '$PASSE_1' a '$PASSE_2' par */
/* "symetrie" avec '_cDENORMALISE_OX(...)' et '_cDENORMALISE_OY(...)'... */
#define F__lDENORMALISE_OZ(longueur) \
F__lDENORMALISE_AXES(dimZ,longueur)
#define _lDENORMALISE_OZ(longueur) \
_lDENORMALISE_AXES(dimZ,longueur)
#define V_lDENORMALISE_OZ(longueur) \
V_lDENORMALISE_AXES(dimZ,longueur)
/* Denormalisation d'une longueur sur l'axe OZ (en flottant puis en entier). */
/* */
/* Les "double" versions '*_cDENORMALISE_O?(...)' et '*_lDENORMALISE_O?(...)' ont ete */
/* introduites le 20010223094543 car effectivement une coordonnee et une longueur ne */
/* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre */
/* "relativisee"...). */
#define F__cDENORMALISE_OT(coordonnee) \
F__cDENORMALISE_AXES(Tmin,dimT,coordonnee)
#define _cDENORMALISE_OT(coordonnee) \
_cDENORMALISE_AXES(Tmin,dimT,coordonnee)
#define V_cDENORMALISE_OT(coordonnee) \
V_cDENORMALISE_AXES(Tmin,dimT,coordonnee)
#define F__lDENORMALISE_OT(longueur) \
F__lDENORMALISE_AXES(dimT,longueur)
#define _lDENORMALISE_OT(longueur) \
_lDENORMALISE_AXES(dimT,longueur)
#define V_lDENORMALISE_OT(longueur) \
V_lDENORMALISE_AXES(dimT,longueur)
/* Denormalisation d'une longueur sur l'axe OT (en flottant puis en entier). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* H O M O T H E T I E S L I E E S A U X D I F F E R E N T S F O R M A T S D ' I M A G E : */
/* */
/*************************************************************************************************************************************/
/* Ces definitions furent introduites le 20120210180521 pour permettre a certains */
/* programmes d'etre vraiment independants du format des images. C'est, par exemple, le */
/* cas de 'v $xci/fract_2D.01$K MAILLE_X' ou la valeur par defaut ('MAILLE_X') de l'argument */
/* 'maille_OX' est definie en entier dans [k___Xmin,k___Xmax] et non pas dans [0,1]... */
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# define F_cHOMOTHETIE_Std_AXES(k___dimension,dimension,coordonnee,CoordonneeA,CoordonneeR) \
COND(IL_FAUT(cHOMOTHETIE_Std_AXES_____compatibilite_20120210) \
,coordonnee \
,CoordonneeA(SCAL(CoordonneeR(coordonnee),FLOT(k___dimension),FLOT(dimension))) \
)
# define F_cHOMOTHETIE_Std_OX(coordonnee) \
F_cHOMOTHETIE_Std_AXES(k___dimX,dimX,coordonnee,COXA,COXR)
# define F_cHOMOTHETIE_Std_OY(coordonnee) \
F_cHOMOTHETIE_Std_AXES(k___dimY,dimY,coordonnee,COYA,COYR)
# define F_cHOMOTHETIE_Std_OZ(coordonnee) \
F_cHOMOTHETIE_Std_AXES(k___dimZ,dimZ,coordonnee,COZA,COZR)
# define I_cHOMOTHETIE_Std_OX(coordonnee) \
INTE(F_cHOMOTHETIE_Std_OX(coordonnee))
# define I_cHOMOTHETIE_Std_OY(coordonnee) \
INTE(F_cHOMOTHETIE_Std_OY(coordonnee))
# define I_cHOMOTHETIE_Std_OZ(coordonnee) \
INTE(F_cHOMOTHETIE_Std_OZ(coordonnee))
/* On notera le 20190321134912 qu'il est a priori stupide d'utiliser ces procedures */
/* sur des coordonees dependants de '$formatI'. Cela s'est vu a cette date, par exemple, */
/* avec 'v $xrc/julia.42$K C_DEPART_X' ou l'on avait, avant le 20190321131310 : */
/* */
/* _____cNORMALISE_OX(I_cHOMOTHETIE_Std_OX(Xcentre)) */
/* */
/* or 'Xcentre' a deja une valeur correcte (au centre) pour le '$formatI' courant et donc */
/* 'I_cHOMOTHETIE_Std_OX(Xcentre)' n'etait evidemment pas au centre de l'image... */
/* */
/* Il semblerait meme que d'une facon generale, ces procedures soient inutiles et qu'il */
/* serait logique de les remplacer par : */
/* */
/* # define I_cHOMOTHETIE_Std_OX(coordonnee) \ */
/* INTE(NEUT(coordonnee)) */
/* */
# define F_lHOMOTHETIE_Std_AXES(k___dimension,dimension,longueur) \
COND(IL_FAUT(lHOMOTHETIE_Std_AXES_____compatibilite_20120210) \
,longueur \
,SCAL(longueur,FLOT(k___dimension),FLOT(dimension)) \
)
# define F_lHOMOTHETIE_Std_OX(longueur) \
F_lHOMOTHETIE_Std_AXES(k___dimX,dimX,longueur)
# define F_lHOMOTHETIE_Std_OY(longueur) \
F_lHOMOTHETIE_Std_AXES(k___dimY,dimY,longueur)
# define F_lHOMOTHETIE_Std_OZ(longueur) \
F_lHOMOTHETIE_Std_AXES(k___dimZ,dimZ,longueur)
# define I_lHOMOTHETIE_Std_OX(longueur) \
INTE(F_lHOMOTHETIE_Std_OX(longueur))
# define I_lHOMOTHETIE_Std_OY(longueur) \
INTE(F_lHOMOTHETIE_Std_OY(longueur))
# define I_lHOMOTHETIE_Std_OZ(longueur) \
INTE(F_lHOMOTHETIE_Std_OZ(longueur))
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
/* Ces definitions furent introduites le 20120210180521 pour permettre a certains */
/* programmes d'etre vraiment independants du format des images. C'est, par exemple, le */
/* cas de 'v $xci/fract_2D.01$K MAILLE_X' ou la valeur par defaut ('MAILLE_X') de l'argument */
/* 'maille_OX' est definie en entier dans [k___Xmin,k___Xmax] et non pas dans [0,1]... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C E N T R A G E D E S A X E S : */
/* */
/*************************************************************************************************************************************/
#define CENTRAGE_OX(coordonnee) \
COXA(SOUS(coordonnee,Xcentre)) \
/* Centrage d'une coordonnee sur l'axe OX. */
#define CENTRAGE_OY(coordonnee) \
COYA(SOUS(coordonnee,Ycentre)) \
/* Centrage d'une coordonnee sur l'axe OY. */
#define CENTRAGE_OZ(coordonnee) \
COZA(SOUS(coordonnee,Zcentre)) \
/* Centrage d'une coordonnee sur l'axe OZ. */
#define CENTRAGE_OT(coordonnee) \
COTA(SOUS(coordonnee,Tcentre)) \
/* Centrage d'une coordonnee sur l'axe OT. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P R I M I T I V E S D ' I N T E R F A C E I N T E R - M O D U L E S : */
/* */
/*************************************************************************************************************************************/
#define ______NORMALISE_AXES(minimum,dimension,longueur,modificateur) \
fDIVZ(COOR(FLOT(longueur) \
,FLOT(minimum) \
) \
,FLOT(modificateur(dimension)) \
)
#define _____cNORMALISE_AXES(minimum,dimension,coordonnee) \
______NORMALISE_AXES(minimum,dimension,coordonnee,AXES_COORDONNEES_FERMES_OUVERTS)
#define _____lNORMALISE_AXES(dimension,longueur) \
______NORMALISE_AXES(ZERO,dimension,longueur,NEUT)
/* Operation inverse de _?DENORMALISE_AXES(minimum,dimension,longueur), elle */
/* fait passer de [min,max] a [0,1[. */
/* */
/* On notera qu'autrefois on utilisait la dimension au sens "nombre d'elements" : */
/* */
/* ...FLOT(dimension)... */
/* */
/* mais qu'il est beaucoup plus logique d'utiliser la dimension au sens "longueur", d'ou */
/* l'ecriture : */
/* */
/* ...FLOT(LONGUEUR(dimension))... */
/* */
/* Le 20041111165615, je suis revenu en arriere pour '_____lNORMALISE_AXES(...)', d'ou */
/* l'introduction de l'argument 'modificateur' pour '______NORMALISE_AXES(...)'. */
/* Mais ATTENTION, cet "aller-retour" ne fut pas neutre en particulier en ce qui concerne */
/* la generation de champs via 'v $xiii/mono_image$DEF ACCES_A_UN_CHAMP_3D' qui reference */
/* de facon indirecte les deux procedures 'v $xiiD/definit.1$DEF _____cNORMALISE_AXES' */
/* et 'v $xiif/format$DEF F__lDENORMALISE_AXES'. Ainsi, suivant la date, il peut etre */
/* impossible de regenerer exactement certaines images. Cela s'est vu vers le 200604281457 */
/* ou, par exemple, le calcul de 'v $xiaf/COT2.Q1$R16' sur '$CMAP28' a differe quelque peu */
/* de la version precedente 'v $xiaf/COT2.D1$R16' sur '$LACT14' a cause des conditions */
/* initiales ('v $xiirf/.COT2.D1.0.2.$U .xci.gauss.X') generees a partir de filtres */
/* utilisant donc 'v $xiii/mono_image$DEF ACCES_A_UN_CHAMP_3D' via la commande */
/* 'v $xci/gauss$K Fgaussien'... */
/* */
/* Le 20001223232351, 'DIVI(...)' fut remplace par 'fDIVZ(...)', lors de la mise au point */
/* de 'v $xiii/di_album$FON AFdensite' dans le cas ou l'un des axes est reduit a un point */
/* (par exemple 'OZ', lorsque l'on souhaite qu'un album soit equivalent a une image en */
/* faisant Zmin=Zmax). */
/* */
/* Les "double" versions '_____cNORMALISE_AXES(...)' et '_____lNORMALISE_AXES(...)' ont ete */
/* introduites le 20010223094543 car effectivement une coordonnee et une longueur ne */
/* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre */
/* "relativisee"...). */
/* */
/* La procedure 'COOR(...)' a ete introduite le 20040907164041. */
/* */
/* Le 20090928173316, la procedure 'LONGUEUR(...)' a ete remplacee par 'NEUT(...)' dans */
/* '_____cNORMALISE_AXES(...)' a cause du probleme 'v $xtc/NormDenorm.02$c TRMU' issu */
/* lui meme d'un probleme lors d'un redimensionnement d'un zoom dans 'v $xiirk/DIFF.11' */
/* ou les carres materialisant les particules n'etaient pas tous carres. Cela venait d'un */
/* "aller-retour" du type : */
/* */
/* X/Y denormalisees au format 'F1' */
/* --> X/Y normalisees */
/* X/Y denormalisees au format 'F2' (F2 # F1) */
/* */
/* Par exemple, examinons le passage de [0,15] a [0,3] avec 'LONGUEUR(...)' : */
/* */
/* | | | */
/* 00 01 02 03 | 04 05 06 07 | 08 09 10 11 | 12 13 14 15 */
/* | | | */
/* 00 00 00 00 | 00 01 01 01 | 01 01 02 02 | 02 02 02 03 */
/* | __ | __ __ | __ __ __ */
/* */
/* (ou les elements incorrects sont soulignes par "__"), l'"aller-retour" etant ici */
/* equivalent a : */
/* */
/* (coordonnee/15)*3 */
/* */
/* L'utilisation de 'NEUT(...)' equivaut a : */
/* */
/* (coordonnee/16)*4 */
/* */
/* ce qui donne : */
/* */
/* | | | */
/* 00 01 02 03 | 04 05 06 07 | 08 09 10 11 | 12 13 14 15 */
/* | | | */
/* 00 00 00 00 | 01 01 01 01 | 02 02 02 02 | 03 03 03 03 */
/* | | | */
/* */
/* qui est correct... */
/* */
/* Le 20190620125144, je note l'inconvenient d'utiliser 'NEUT(...)' (et non LONGUEUR(...)') */
/* car en effet, a cause de cela, par exemple, la coordonnee 'X' denormalisee dans [0,511], */
/* lorsqu'elle est normalisee (avec une translation de 0.5 dans cet exemple) se trouve */
/* alors dans [-0.5,+0.498046875] ce qui fait que l'origine n'est pas au milieu du segment */
/* de definition de 'X' ('v $xiii/mono_image$FON 20190620110245' a ce propos...). Cela */
/* s'est vu lors de la mise au point de l'image 'v $xiia/VASA.24.256' qui a demande une */
/* modification des arguments 'v $xiia/$Fnota COORDONNEES_____compatibilite_20090929'... */
#define _____cNORMALISE_OX(coordonnee) \
_____cNORMALISE_AXES(Xmin,dimX,coordonnee)
#define _____cNORMALISE_OY(coordonnee) \
_____cNORMALISE_AXES(Ymin,dimY,coordonnee)
#define _____cNORMALISE_OZ(coordonnee) \
_____cNORMALISE_AXES(Zmin,dimZ,coordonnee)
#define _____cNORMALISE_OT(coordonnee) \
_____cNORMALISE_AXES(Tmin,dimT,coordonnee)
#define _____lNORMALISE_OX(longueur) \
_____lNORMALISE_AXES(dimX,longueur)
#define _____lNORMALISE_OY(longueur) \
_____lNORMALISE_AXES(dimY,longueur)
#define _____lNORMALISE_OZ(longueur) \
_____lNORMALISE_AXES(dimZ,longueur)
#define _____lNORMALISE_OT(longueur) \
_____lNORMALISE_AXES(dimT,longueur)
/* Ces fonctions sont destinees a faciliter l'interfacage du systeme graphique */
/* ou les coordonnees correspondent finalement au maillage de l'ecran, alors */
/* que les autres systemes considerent qu'en general une image est un pave */
/* du type [0,1[x[0,1[. */
/* */
/* On verifiera que : */
/* */
/* _____cNORMALISE_OX(Xmin) = FXorigine = 0.0 */
/* _____cNORMALISE_OX(Xmax+1) = 1.0 */
/* */
/* et que : */
/* */
/* _____cNORMALISE_OY(Ymin) = FYorigine = 0.0 */
/* _____cNORMALISE_OY(Ymax+1) = 1.0 */
/* */
/* Les "double" versions '_____cNORMALISE_O?(...)' et '_____lNORMALISE_O?(...)' ont ete */
/* introduites le 20010223094543 car effectivement une coordonnee et une longueur ne */
/* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre */
/* "relativisee"...). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I L A T A T I O N D E S A X E S D E S T I N E E A G A R A N T I R L A */
/* C O M P A R A B I L I T E D E S L O N G U E U R S S U R L E S D E U X A X E S */
/* L O R S D ' O P E R A T I O N S D E T Y P E ' _____?NORMALISE_O?(...) ' : */
/* */
/*************************************************************************************************************************************/
#define CARRE_OX_PAR_RAPPORT_A_OY(longueur) \
SCAL(longueur \
,dimY \
,dimX \
) \
/* Modification d'une longueur sur l'axe 'OX' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OY'. */
#define CARRE_OY_PAR_RAPPORT_A_OY(longueur) \
NEUT(longueur) \
/* Modification d'une longueur sur l'axe 'OY' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OY'. Bien entendu cette primitive n'est la que par symetrie */ \
/* avec 'CARRE_OX_PAR_RAPPORT_A_OY(...)'. */
#define CARRE_OX_PAR_RAPPORT_A_OX(longueur) \
NEUT(longueur) \
/* Modification d'une longueur sur l'axe 'OX' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OX'. Bien entendu cette primitive n'est la que par symetrie */ \
/* avec 'CARRE_OY_PAR_RAPPORT_A_OX(...)'. */
#define CARRE_OY_PAR_RAPPORT_A_OX(longueur) \
SCAL(longueur \
,dimX \
,dimY \
) \
/* Modification d'une longueur sur l'axe 'OY' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OX'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I L A T A T I O N D E S A X E S D E S T I N E E A G A R A N T I R L A */
/* C O M P A R A B I L I T E D E S L O N G U E U R S S U R L E S D E U X A X E S */
/* L O R S D ' O P E R A T I O N S D E T Y P E ' _?DENORMALISE_O?(...) ' : */
/* */
/*************************************************************************************************************************************/
#define RECTANGLE_OX_PAR_RAPPORT_A_OY(longueur) \
SCAL(longueur \
,dimX \
,dimY \
) \
/* Modification d'une longueur sur l'axe 'OX' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OY'. */
#define RECTANGLE_OY_PAR_RAPPORT_A_OY(longueur) \
NEUT(longueur) \
/* Modification d'une longueur sur l'axe 'OY' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OY'. Bien entendu cette primitive n'est la que par symetrie */ \
/* avec 'RECTANGLE_OX_PAR_RAPPORT_A_OY(...)'. */
#define RECTANGLE_OX_PAR_RAPPORT_A_OX(longueur) \
NEUT(longueur) \
/* Modification d'une longueur sur l'axe 'OX' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OX'. Bien entendu cette primitive n'est la que par symetrie */ \
/* avec 'RECTANGLE_OY_PAR_RAPPORT_A_OX(...)'. */
#define RECTANGLE_OY_PAR_RAPPORT_A_OX(longueur) \
SCAL(longueur \
,dimY \
,dimX \
) \
/* Modification d'une longueur sur l'axe 'OY' de facon a ce qu'elle soit comparable a une */ \
/* longueur mesuree sur l'axe 'OX'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O R M A T D E S P I X E L S : */
/* */
/*************************************************************************************************************************************/
TypedefS(genere_CHAR,CHAR)
TypedefS(A___genere_CHAR,genere_CHAR)
TypedefS(E___genere_CHAR,genere_CHAR)
/* Pour definir le format "CHAR", */
TypedefS(genere_vrai_Int_de_base,vrai_Int_de_base PGPD)
TypedefS(A___genere_vrai_Int_de_base,genere_vrai_Int_de_base)
TypedefS(E___genere_vrai_Int_de_base,genere_vrai_Int_de_base)
/* Pour definir le format "vrai_Int_de_base" (introduit le 20100326175628), */
TypedefS(genere_Int,Int PGPD)
TypedefS(A___genere_Int,genere_Int)
TypedefS(E___genere_Int,genere_Int)
/* Pour definir le format "Int", */
TypedefS(genere_vrai_Positive_de_base,vrai_Positive_de_base PGPD)
TypedefS(A___genere_vrai_Positive_de_base,genere_vrai_Positive_de_base)
TypedefS(E___genere_vrai_Positive_de_base,genere_vrai_Positive_de_base)
/* Pour definir le format "vrai_Positive_de_base" (introduit le 20100326175628), */
TypedefS(genere_LPositive,LPositive PGPD)
TypedefS(A___genere_LPositive,genere_LPositive)
TypedefS(E___genere_LPositive,genere_LPositive)
/* Pour definir le format "Positive". On notera qu'il est defini a l'aide de 'LPositive' */
/* (et non pas de 'Positive') afin de simplifier la fonction 'IGdisplay(...)' dans le */
/* fichier '$xiidG/fonction$FON', en ce qui concerne le type 'imageU' de l'image argument */
/* de facon a ce qu'il soit compatible avec ce qui est attendu par la fonction */
/* 'lrectwrite(...)' ; le type 'LPositive' doit donc etre un entier non signe long... */
TypedefS(genere_vrai_float_de_base,vrai_Float_de_base PGPD)
TypedefS(A___genere_vrai_float_de_base,genere_vrai_float_de_base)
TypedefS(E___genere_vrai_float_de_base,genere_vrai_float_de_base)
/* Pour definir le format "vrai_float_de_base" (introduit le 20170406095425...). */
/* */
/* ATTENTION : c'est bien 'vrai_Float_de_base' et non pas 'vrai_float_de_base'... */
TypedefS(genere_Float,Float PGPD)
TypedefS(A___genere_Float,genere_Float)
TypedefS(E___genere_Float,genere_Float)
/* Pour definir le format "Float". */
TypedefS(genere_Double,Double PGPD)
TypedefS(A___genere_Double,genere_Double)
TypedefS(E___genere_Double,genere_Double)
/* Pour definir le format "Double". */
TypedefS(genere_complexe,complexe PGPD)
TypedefS(A___genere_complexe,genere_complexe)
TypedefS(E___genere_complexe,genere_complexe)
/* Pour definir le format "complexe". */
TypedefS(genere_hyper_complexe,hyper_complexe PGPD)
TypedefS(A___genere_hyper_complexe,genere_hyper_complexe)
TypedefS(E___genere_hyper_complexe,genere_hyper_complexe)
/* Pour definir le format "hyper_complexe". */
TypedefS(genere_hyper_hyper_complexe,hyper_hyper_complexe PGPD)
TypedefS(A___genere_hyper_hyper_complexe,genere_hyper_hyper_complexe)
TypedefS(E___genere_hyper_hyper_complexe,genere_hyper_hyper_complexe)
/* Pour definir le format "hyper_hyper_complexe" (introduit le 20150227095843). */
#if (Format_p==Format_char)
# define size_p \
size_CHAR \
/* Le format "CHAR" demande un octet par pixel. */
#Aif (Format_p==Format_char)
#Eif (Format_p==Format_char)
#if (Format_p==Format_int)
# define size_p \
size_Int \
/* Le format "Int" ("Unsigned") demande quatre octets par pixel. */
#Aif (Format_p==Format_int)
#Eif (Format_p==Format_int)
#if (Format_p==Format_float)
# define size_p \
size_Float \
/* Le format "Float" demande quatre octets par pixel. */
#Aif (Format_p==Format_float)
#Eif (Format_p==Format_float)
#if (Format_p==Format_double)
# define size_p \
size_Double \
/* Le format "Double" demande huit octets par pixel. */
#Aif (Format_p==Format_double)
#Eif (Format_p==Format_double)
#if (Format_p==Format_complexe)
# define size_p \
size_complexe \
/* Le format "complexe" demande huit octets par pixel. */
#Aif (Format_p==Format_complexe)
#Eif (Format_p==Format_complexe)
#if (Format_p==Format_hyper_complexe)
# define size_p \
size_hyper_complexe \
/* Le format "hyper-complexe" demande seize octets par pixel. */
#Aif (Format_p==Format_hyper_complexe)
#Eif (Format_p==Format_hyper_complexe)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U N O I R : */
/* */
/*************************************************************************************************************************************/
#define k___NOIR \
GENP(ZERO) \
/* Definition du niveau de noir standard. */ \
/* */ \
/* ATTENTION : la constante 'NOIR' est pre-generee dans '$xcp/Konstantes$K'. */
#define FLOT__NOIR \
FLOT(NOIR)
#define NOIR_char \
CAST_CHAR(NOIR) \
/* La procedure 'CAST_CHAR(...)' a remplace un 'CAST(genere_CHAR,...)' le 20090331101931. */
#define NOIR_int \
CASP_Int(NOIR)
#define NOIR_positive \
CASP_LPositive(NOIR)
#define NOIR_float \
CASP_Float(NOIR) \
/* ATTENTION a ne pas confondre 'NOIR_float' et 'FLOT__NOIR', le premier donnant le */ \
/* 'NOIR' en format 'genere_Float' et le second en format 'genere_p'... */ \
/* */ \
/* ATTENTION, voir la remarque 'v $xiiD/definit.2$DEF BLANC_float' qui, malgre la nullite */ \
/* (en general...) de 'FLOT__NOIR' et de 'NOIR_float' (et donc leur egalite), il conviendra */ \
/* de les considerer comme deux valeurs differentes... */
#define NOIR_double \
CASP_Double(NOIR)
/* Les procedures 'CASP...(...)' ont remplace les 'CASP(genere_...,...)' le 20090331104330. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* N O T I O N D E P L A N C H E R : */
/* */
/* */
/* Definition : */
/* */
/* Nous allons definir la notion de */
/* "plancher" ; en effet, lorsque l'on */
/* marque un point dans une image a fond */
/* NOIR, si ce point est lui-meme NOIR, il */
/* n'apparaitra pas. D'ou ici cette definition */
/* d'un NOIR_PLANCHER utilise pour le marquage */
/* des points. Celui-ci est variable, et fonction */
/* des listes de SUBSTITUTION utilisees... */
/* */
/* */
/* Utilisation : */
/* */
/* SET_NOIR_PLANCHER(niveau); */
/* */
/* permettent de positionner le NOIR_PLANCHER */
/* courant... */
/* */
/*************************************************************************************************************************************/
/* Le 20050111155800 a cause de la modification 'v $xig/edite$vv$FON 20050111154812', les */
/* definitions suivantes sont passees de 'define' a 'TestADef' : */
#TestADef NOIR_PLANCHER \
SUCN(NOIR) \
/* Plancher a ne pas franchir bien souvent... */
#TestADef NOIR_PLANCHER_0 \
DOUB(NOIR_PLANCHER) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_0n' et '..._FF'. */
#TestADef NOIR_PLANCHER_1 \
DOUB(NOIR_PLANCHER_0) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_1n' et '..._FE'. */
#TestADef NOIR_PLANCHER_2 \
DOUB(NOIR_PLANCHER_1) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_2n' et '..._FC'. */
#TestADef NOIR_PLANCHER_3 \
DOUB(NOIR_PLANCHER_2) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_3n' et '..._F8'. */
#TestADef NOIR_PLANCHER_4 \
DOUB(NOIR_PLANCHER_3) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_F0'. */
#TestADef NOIR_PLANCHER_5 \
DOUB(NOIR_PLANCHER_4) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_E0'. */
#TestADef NOIR_PLANCHER_6 \
DOUB(NOIR_PLANCHER_5) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_C0'. */
#TestADef NOIR_PLANCHER_7 \
NEUT(NOIR_PLANCHER_6) \
/* Plancher a ne pas franchir bien souvent pour les listes 'L_SUBSTITUTION_80'. ATTENTION, */ \
/* on notera la presence de 'NEUT(...)', et non pas de 'DOUB(...)', afin de ne pas definir */ \
/* un niveau superieur a 'BLANC'... */
/* ATTENTION : au cas ou de nouvelles listes du type 'L_SUBSTITUTION_Xn' (avec X=4,5,...) */
/* seraient ajoutees, il conviendrait de creer de nouveaux 'NOIR_PLANCHER_X'... */
/* Le 20050111155800 a cause de la modification 'v $xig/edite$vv$FON 20050111154812', les */
/* definitions precedentes sont passees de 'define' a 'TestADef'... */
#define NOIR_PLANCHER_SUBSTITUTION \
noir_plancher_substitution \
/* Plancher courant a ne pas franchir pour les listes 'L_SUBSTITUTION_Xn'... */
#define SET_NOIR_PLANCHER(niveau) \
Bblock \
VALIDATION_NIVEAU(niveau \
,BLOC(EGAL(noir_plancher_substitution,niveau); \
/* Mise a jour du "plancher" courant... */ \
) \
,BLOC(PRINT_ERREUR("le 'plancher' demande est inexistant"); \
CAL1(Prer1(" ce NIVEAU est %08X",niveau)); \
CAL1(Prer2(" - [Noir,Blanc] = [%08X,%08X]\n",NOIR,BLANC)); \
) \
); \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* " 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 NOIR \
k___NOIR
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D ' U N E S P A C E " T O R I Q U E " : */
/* */
/*************************************************************************************************************************************/
/* ATTENTION, a cause de l'usage qui est fait de ces procedures dans d'autre procedures */
/* definies en '$PASSE_3', ces definitions ont ete mises ici le 1995110700 depuis le fichier */
/* '$xiii/Images$DEF'. */
#define MODX(x) \
MODU(x,Xmin,Xmax)
#define MODY(y) \
MODU(y,Ymin,Ymax)
#define MODZ(z) \
MODU(z,Zmin,Zmax)
#define MODT(t) \
MODU(t,Tmin,Tmax)
/* Axe 'OX', 'OY' et 'OZ' toriques (versions "entieres" : en effet, il fut decouvert le */
/* 20090128163159 qu'a cause du 'MODG(...)' utilise dans le 'MODU(...)' il etait imperatif */
/* que les coordonnees {x,y,z} soient entieres, d'ou la seconde version ci-apres...). */
#define MOFX(x) \
MODF(x,FLOT(Xmin),FLOT(Xmax))
#define MOFY(y) \
MODF(y,FLOT(Ymin),FLOT(Ymax))
#define MOFZ(z) \
MODF(z,FLOT(Zmin),FLOT(Zmax))
#define MOFT(t) \
MODF(t,FLOT(Tmin),FLOT(Tmax))
/* Axe 'OX', 'OY' et 'OZ' toriques (version "flottante" introduites le 20090128163159...). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D ' U N E S P A C E " S Y M E T R I Q U E " : */
/* */
/*************************************************************************************************************************************/
/* Ces definitions ont ete introduites le 20050720131731... */
#define SYM_XYZT(coordonnee,minimum,centre,maximum) \
COND(IFLT(coordonnee,centre) \
,DIVI(AXPB(SOUS(maximum,minimum),coordonnee,SOUS(MUL2(minimum,centre),MUL2(minimum,maximum))) \
,SOUS(centre,minimum) \
) \
,DIVI(AXPB(SOUS(maximum,minimum),coordonnee,SOUS(MUL2(minimum,centre),MUL2(maximum,maximum))) \
,SOUS(centre,maximum) \
) \
) \
/* Formule generale de symetrisation suivant le graphe : */ \
/* */ \
/* ^ */ \
/* | */ \
/* M | /\ */ \
/* | / \ */ \
/* | / \ */ \
/* | / \ */ \
/* | / \ */ \
/* | / \ */ \
/* | / \ */ \
/* m |/ \ */ \
/* ------------------------------> */ \
/* m C M */ \
/* */ \
/* ou {m,C,M} designent respectivement {minimum,centre,maximum}... */ \
/* */ \
/* Voir 'v $xcg/SYM_XYZT.01$K' le 20201114105133 pour comprendre ce calcul... */
#define SYMX(x) \
SYM_XYZT(x,Xmin,Xcentre,Xmax) \
/* Axe 'OX' symetrique, */
#define SYMY(y) \
SYM_XYZT(y,Ymin,Ycentre,Ymax) \
/* Axe 'OY' symetrique, */
#define SYMZ(z) \
SYM_XYZT(z,Zmin,Zcentre,Zmax) \
/* Axe 'OZ' symetrique. */
#define SYMT(t) \
SYM_XYZT(t,Tmin,Tcentre,Tmax) \
/* Axe 'OT' symetrique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D ' U N E S P A C E " P R O L O N G E " : */
/* A l ' E X T E R I E U R C O M M E I L E S T A U B O R D : */
/* */
/*************************************************************************************************************************************/
/* ATTENTION, a cause de l'usage qui est fait de ces procedures dans d'autre procedures */
/* definies en '$PASSE_3', ces definitions ont ete mises ici le 1995110700 depuis le fichier */
/* '$xiii/Images$DEF'. */
#define TROX(x) \
TRON(x,Xmin,Xmax) \
/* Axe 'OX' "prolonge", */
#define TROY(y) \
TRON(y,Ymin,Ymax) \
/* Axe 'OY' "prolonge", */
#define TROZ(z) \
TRON(z,Zmin,Zmax) \
/* Axe 'OZ' "prolonge". */
#define TROT(t) \
TRON(t,Tmin,Tmax) \
/* Axe 'OT' "prolonge". */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* E X T E N S I O N S D E S C O O R D O N N E S L O R S Q U ' E L L E S " D E B O R D E N T " : */
/* */
/*************************************************************************************************************************************/
/* Les definitions 'HORS_?_SYMETRIQUE(...)' ont ete introduites le 20050720133226... */
%define HORS_X_FORCER(X) \
NEUT(X)
%define HORS_X_PERIODIQUE(X) \
MODX(X)
%define HORS_X_SYMETRIQUE(X) \
SYMX(MODX(X))
%define HORS_X_PROLONGEMENT(X) \
TROX(X)
/* Extensions possibles de la coordonnee 'X'. */
%define HORS_Y_FORCER(Y) \
NEUT(Y)
%define HORS_Y_PERIODIQUE(Y) \
MODY(Y)
%define HORS_Y_SYMETRIQUE(Y) \
SYMY(MODY(Y))
%define HORS_Y_PROLONGEMENT(Y) \
TROY(Y)
/* Extensions possibles de la coordonnee 'Y'. */
%define HORS_Z_FORCER(Z) \
NEUT(Z)
%define HORS_Z_PERIODIQUE(Z) \
MODZ(Z)
%define HORS_Z_SYMETRIQUE(Z) \
SYMZ(MODZ(Z))
%define HORS_Z_PROLONGEMENT(Z) \
TROZ(Z)
/* Extensions possibles de la coordonnee 'Z'. */
%define HORS_T_FORCER(T) \
NEUT(T)
%define HORS_T_PERIODIQUE(T) \
MODT(T)
%define HORS_T_SYMETRIQUE(T) \
SYMT(MODT(T))
%define HORS_T_PROLONGEMENT(T) \
TROT(T)
/* Extensions possibles de la coordonnee 'T'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S N I V E A U X I N E X I S T A N T S : */
/* */
/*************************************************************************************************************************************/
#define NIVEAU_UNDEF \
NOIR \
/* Niveau indefini ; on n'utilise pas 'UNDEF', car pour les images */ \
/* de type "CHAR", 'UNDEF' ne tient pas sur un octet... */
#define FLOT__NIVEAU_UNDEF \
FLOT__UNDEF \
/* Niveau indefini en flottant... */ \
/* */ \
/* Le remplacement de 'FLOT(NIVEAU_UNDEF)' par 'FLOT__UNDEF' le 20101025114454 est */ \
/* justifie par le commentaire 'v $xig/fonct$vv$DEF 20101020105725'... */
#define NIVEAU_HORS_ECRAN \
NIVEAU_UNDEF \
/* Niveau attribue a un point {X,Y} situe hors de l'ecran. */
#define NIVEAU_HORS_IMAGE(imageA,X,Y) \
Niveau____hors_image
#define NIVEAU_HORS_ALBUM(albumA,X,Y,Z) \
Niveau____hors_album
/* Procedures generales de traitement des niveaux hors de l'ecran. */
/* */
/* Le 20070213145059 il y eut passage de 'NIVEAU_HORS_ECRAN' a quelque chose de parametrable */
/* dynamiquement {Niveau____hors_image,Niveau____hors_album}... */
#define NIVEAU_MASQUE \
NIVEAU_UNDEF \
/* Niveau attribue a un point qui est masque par le "masque". */