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