_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E B A S E D ' E D I T I O N D E S I M A G E S */
/* S U R L E B I T - M A P N O I R E T B L A N C R I D G E : */
/* */
/* */
/* Definition : */
/* */
/* Ce fichier contient toutes les fonctions */
/* de base d'edition graphique des images raster, */
/* quelle que soit la definition. */
/* */
/* */
/* Author of '$xiidr/fonction$FON' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19870000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* O P P O R T U N I T E D E C O M P I L E R C E M O D U L E : */
/* */
/*************************************************************************************************************************************/
#ifdef __VERSION__COMPILER_LE_GRAPHIQUE_ROS /* Common,DEFV(Fonction,) : indicateur de VERSION. */
DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LE_GRAPHIQUE_ROS));
#Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_ROS /* Common,DEFV(Fonction,) : indicateur de VERSION. */
#Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_ROS /* Common,DEFV(Fonction,) : indicateur de VERSION. */
#ifdef __VERSION__COMPILER_LE_GRAPHIQUE_ROS /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M I S E E N M O D E G R A P H I Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,DEFV(FonctionI,IRopen()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
/*..............................................................................................................................*/
EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH("settek");
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M I S E E N M O D E A L P H A _ N U M E R I Q U E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
DEFV(Common,DEFV(FonctionI,IRclose()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
/*..............................................................................................................................*/
EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH("setx3.64");
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I S P L A Y G R A P H I Q U E D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
# define FACTEUR_GRAPHIQUE \
QUATRE \
/* Facteur d'echelle pour passer des coordonnees d'image aux */ \
/* coordonnees graphiques. */
DEFV(Common,DEFV(FonctionI,IRdisplay(imageA,seuil)))
DEFV(Argument,DEFV(image,imageA));
/* Image Argument que l'on veut visualiser sur le bit-map noir et blanc. */
DEFV(Argument,DEFV(genere_p,seuil));
/* Le bit-map etant noir et blanc, il faut decreter a l'aide de ce "seuil" */
/* quels sont les point "noirs" (point < seuil) et les points "blancs" */
/* (point >= seuil). */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(STRU(Rectangle),window_coordonnees);
/* Definition des coordonnees {X,Y} du coin superieur gauche de la */
/* fenetre courante, et des longueurs (Dx,Dy) de celle-ci. */
DEFV(STRU(Form),window_dimensions);
/* (re-)definition des longueurs (Dx,Dy)=(width,height) de la fenetre courante. */
DEFV(Int,INIT(window_identificator,UNDEF));
/* Identificateur de la fenetre courante. */
DEFV(genere_p,point);
/* Point imageA[X][Y] courant. */
DEFV(STRU(Point),origine);
/* Coordonnees de l'origine du vecteur courant. */
DEFV(STRU(Point),extremite);
/* Coordonnees de l'extremite du vecteur courant. */
DEFV(Logical,INIT(trace_segment,LUNDEF));
/* Indique si un trace de segment est en cours ("VRAI") ou pas ("FAUX"). */
/*..............................................................................................................................*/
EGAL(window_identificator,GetWindowNumber(STANDARD_ERREUR));
CALS(GetWindowFrame(window_identificator,ADRESSE(window_coordonnees)));
/* Recuperation de la definition geometrique de la fenetre courante. */
EGAL(ASD1(window_dimensions,width),ASD2(window_coordonnees,extent,x));
EGAL(ASD1(window_dimensions,height),ASD2(window_coordonnees,extent,y));
CALS(DrawInit(ADRESSE(window_dimensions)));
/* Pour initialiser le trace graphique (definition geometrique de la fenetre). */
CALS(ClearScreen());
/* Nettoyage de l'ecran. */
CALS(ClearBitmap());
/* Nettoyage du bit-map. */
begin_colonne
Bblock
EGAL(trace_segment,FAUX);
begin_ligne
Bblock
EGAL(point,load_point(imageA,X,Y));
/* Recuperation du point courant. */
Test(IFLE(point,seuil))
Bblock
/* Cas ou le point courant doit etre "noir". */
Test(IL_NE_FAUT_PAS(trace_segment))
Bblock
EGAL(trace_segment,VRAI);
INITIALISATION_POINT_2D(origine
,MUL2(FACTEUR_GRAPHIQUE,X)
,MUL2(FACTEUR_GRAPHIQUE,Y)
);
/* Definition de l'origine du segment courant. */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IFOU(IFGT(point,seuil),IFEQ(X,Xmax)))
Bblock
/* Cas ou le point courant doit etre "blanc" ou bien c'est le bout de ligne. */
Test(IL_FAUT(trace_segment))
Bblock
INITIALISATION_POINT_2D(extremite
,MUL2(FACTEUR_GRAPHIQUE,X)
,MUL2(FACTEUR_GRAPHIQUE,Y)
);
DrawLine(ASD1(origine,x),ASD1(origine,y),ASD1(extremite,x),ASD1(extremite,y));
EGAL(trace_segment,FAUX);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
end_ligne
Eblock
end_colonne
WriteScreen();
/* Et on force l'ecriture de l'image sur le bit-map. */
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V I S U A L I S A T I O N D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
BFonctionI
# define FACTEUR_VISUALISATION \
FACTEUR_GRAPHIQUE \
/* Pour passer des coordonnees de l'image a celles de l'ecran. */
# define Xmin_bit_map \
ZERO
# define Xmax_bit_map \
PARE(4000)
# define Ymin_bit_map \
ZERO
# define Ymax_bit_map \
PARE(4000)
# define TAILLE_PAVE_X \
DIVI(SEIZE,HUIT) \
/* Taille horizontale d'un pave de tramage d'un "pixel" en nombre de points, */
# define TAILLE_PAVE_Y \
DIVI(SEIZE,HUIT) \
/* Taille verticale d'un pave de tramage d'un "pixel" en nombre de points. */
# define TAILLE_PAVE \
TAILLE_PAVE_X \
/* Taille horizontale d'un pave de tramage ; cette constante est utilisee dans */
/* la formule 'index_random(x,y)' et lors de son inversion... */
# define sous_Xmin \
ZERO \
/* Abscisse minimale de sous-echantillonnage d'un pave. */
# define sous_Xmax \
TRMU(TAILLE_PAVE_X) \
/* Abscisse maximale de sous-echantillonnage d'un pave. */
# define sous_Ymin \
ZERO \
/* Ordonnee minimale de sous-echantillonnage d'un pave. */
# define sous_Ymax \
TRMU(TAILLE_PAVE_Y) \
/* Ordonnee maximale de sous-echantillonnage d'un pave. */
# define pas_sous_X \
pasX \
/* Pas de parcours horizontal des paves, */
# define pas_sous_Y \
pasY \
/* Pas de parcours vertical des paves. */
# define index_random(x,y) \
ADD2(INDEX0 \
,ADD2(SOUS(x,sous_Xmin) \
,MUL2(SOUS(y,sous_Ymin),TAILLE_PAVE) \
) \
)
# define min_index_random \
index_random(sous_Xmin,sous_Ymin)
# define max_index_random \
index_random(sous_Xmax,sous_Ymax)
# define taille_index_random \
NBRE(min_index_random,max_index_random)
# define graine1 2413 \
/* Parametres arbitraires et aleatoires, */
# define graine2 31415 \
/* Parametres arbitraires et aleatoires, */
# define graine3 7687 \
/* Parametres arbitraires et aleatoires, */
# define graine4 791 \
/* Parametres arbitraires et aleatoires, */
# define decalage1 9 \
/* Parametres arbitraires et aleatoires. */
# define translation1 \
PARE(23)
# define rdn_shuffle(x) \
ADD2(SARS(ABSO(MUL2(MAGIK \
,OUEX(ADD2(MUL2(graine1,EXP2(x)) \
,MUL2(graine2,EXP3(x)) \
) \
,ADD2(MUL2(graine3,EXP2(x)) \
,MUL2(graine4,EXP3(x)) \
) \
) \
) \
) \
,decalage1 \
) \
,translation1 \
)
# define shuffle_index \
ITb1(shuffle \
,ADD2(min_index_random \
,REST(ADD2(rdn_shuffle(OUEX(index_shuffle,graine)) \
,increment_shuffle \
) \
,taille_index_random \
) \
) \
)
DEFV(Common,DEFV(FonctionI,IRvisualisation(imageA)))
DEFV(Argument,DEFV(image,imageA));
/* Image Argument que l'on veut visualiser sur le bit-map noir et blanc. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(STRU(Rectangle),window_coordonnees);
/* Definition des coordonnees {X,Y} du coin superieur gauche de la */
/* fenetre courante, et des longueurs (Dx,Dy) de celle-ci. */
DEFV(STRU(Form),window_dimensions);
/* (re-)definition des longueurs (Dx,Dy)=(width,height) de la fenetre courante. */
DEFV(Int,INIT(window_identificator,UNDEF));
/* Identificateur de la fenetre courante. */
DEFV(genere_p,point);
/* Point imageA[X][Y] courant. */
DEFV(STRU(Point),origine);
/* Coordonnees de l'origine du vecteur courant. */
DEFV(STRU(Point),extremite);
/* Coordonnees de l'extremite du vecteur courant. */
DEFV(Int,INIT(sous_X,UNDEF));
/* Pour echantillonner horizontalement un pave. */
DEFV(Int,INIT(sous_Y,UNDEF));
/* Pour echantillonner verticalement un pave. */
DEFV(Int,INIT(numero,UNDEF));
/* Numero du sous-point courant. */
DEFV(Int,DTb1(shuffle,taille_index_random));
/* Vecteur contenant pour chaque couple de coordonnees (sous_X,sous_Y) donnees comme */
/* un index un nouveau couple de coordonnees (rdn_X,rdn_Y) tranformees aleatoirement */
/* et biunivoquement. */
DEFV(Int,INIT(index_shuffle,UNDEF));
/* Index du tableau de "shuffle"... */
DEFV(Int,INIT(increment_shuffle,UNDEF));
/* Afin de trouver une place libre dans le tableau de "shuffle". */
DEFV(Int,INIT(rdn_X,UNDEF));
/* Pour "shuffliser" horizontalement un pave. */
DEFV(Int,INIT(rdn_Y,UNDEF));
/* Pour "shuffliser" verticalement un pave. */
DEFV(Int,INIT(compteur,UNDEF));
/* Compteur pour "shuffliser" les coordonnees. */
DEFV(Int,INIT(graine,UNDEF));
/* Contient la valeur d'une fonction de 'X' et de 'Y' pour faire que */
/* la "shufflisation" depende de la localisation... */
/*..............................................................................................................................*/
EGAL(window_identificator,GetWindowNumber(STANDARD_ERREUR));
GetWindowFrame(window_identificator,ADRESSE(window_coordonnees));
/* Recuperation de la definition geometrique de la fenetre courante. */
EGAL(ASD1(window_dimensions,width),ASD2(window_coordonnees,extent,x));
EGAL(ASD1(window_dimensions,height),ASD2(window_coordonnees,extent,y));
DrawInit(ADRESSE(window_dimensions));
/* Pour initialiser le trace graphique (definition geometrique de la fenetre). */
ClearScreen();
/* Nettoyage de l'ecran. */
ClearBitmap();
/* Nettoyage du bit-map. */
begin_image
Bblock
EGAL(increment_shuffle,W);
EGAL(graine
,MUL2(MAGIK
,ADD2(COXR(X)
,MUL2(dimX
,COYR(Y)
)
)
)
);
EGAL(graine,rdn_shuffle(graine));
/* Ainsi la "graine" depend de la localisation... */
DoIn(index_shuffle,min_index_random,max_index_random,I)
Bblock
EGAL(ITb1(shuffle,index_shuffle),UNDEF);
/* On initialise de facon indefinie... */
Eblock
EDoI
DoIn(index_shuffle,min_index_random,max_index_random,I)
Bblock
Test(IFEQ(index_shuffle,UNDEF))
Bblock
PRINT_ERREUR("l'index de 'shuffle' prend la valeur 'UNDEF'");
Eblock
ATes
Bblock
Eblock
ETes
Tant(IFNE(shuffle_index,UNDEF))
Bblock
INCR(increment_shuffle,I);
Eblock
ETan
EGAL(shuffle_index,index_shuffle);
/* Dans la premiere entree libre, on memorise l'index courant ; ulterieurement, */
/* un couple (sous_X,sous_Y) donnera un index dans le tableau "shuffle", */
/* l'entree correspondante donnant le couple (rdn_X,rdn_Y). */
Eblock
EDoI
EGAL(point
,DIVI(MUL2(load_point(imageA,X,Y)
,MUL2(TAILLE_PAVE_X,TAILLE_PAVE_Y)
)
,BLANC
)
);
/* Recuperation du point courant. */
CLIR(numero);
/* On initialise le numero du sous-point courant. */
DoIn(sous_X,sous_Xmin,sous_Xmax,pas_sous_X)
Bblock
DoIn(sous_Y,sous_Ymin,sous_Ymax,pas_sous_Y)
Bblock
INCR(numero,I);
/* On ne traite pas tous les points du pave courant ; seuls seront */
/* marques ceux qui permettront de traduire le niveau du point courant */
/* par une trame noir-blanc de dosage adequat... */
Test(IFGT(numero,point))
Bblock
EGAL(index_shuffle,ITb1(shuffle,REST(index_random(sous_X,sous_Y),taille_index_random)));
EGAL(rdn_X
,ADD2(sous_Xmin
,REST(SOUS(index_shuffle,min_index_random),TAILLE_PAVE)
)
);
EGAL(rdn_Y
,ADD2(sous_Ymin
,QUOD(SOUS(index_shuffle,min_index_random),TAILLE_PAVE)
)
);
/* ATTENTION : pour calculer 'rdn_X' et 'rdn_Y', on utilise le meme */
/* diviseur 'TAILLE_PAVE' : en effet, il suffit de regarder la formule */
/* donnant 'index_random(x,y)' pour s'en convaincre... */
INITIALISATION_POINT_2D(origine
,MUL2(FACTEUR_VISUALISATION
,ADD2(MUL2(TAILLE_PAVE_X,X)
,rdn_X
)
)
,MUL2(FACTEUR_VISUALISATION
,ADD2(MUL2(TAILLE_PAVE_Y,Y)
,rdn_Y
)
)
);
Test(IFET(INCLff(ASD1(origine,x),Xmin_bit_map,Xmax_bit_map)
,INCLff(ASD1(origine,y),Ymin_bit_map,Ymax_bit_map)
)
)
Bblock
TRANSFERT_POINT_2D(extremite,origine);
DrawLine(ASD1(origine,x),ASD1(origine,y),ASD1(extremite,x),ASD1(extremite,y));
/* Trace du sous-point courant. */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
Eblock
EDoI
Eblock
end_image
WriteScreen();
/* Et on force l'ecriture de l'image sur le bit-map. */
RETU_ERROR;
Eblock
EFonctionI
# undef TAILLE_PAVE_X
# undef TAILLE_PAVE_Y
# undef TAILLE_PAVE
# undef sous_Xmin
# undef sous_Xmax
# undef sous_Ymin
# undef sous_Ymax
# undef pas_sous_X
# undef pas_sous_Y
# undef index_random
# undef taille_index_random
# undef max_index_random
# undef min_index_random
# undef graine1
# undef graine2
# undef graine3
# undef graine4
# undef decalage1
# undef translation1
# undef rdn_shuffle
# undef shuffle_index
# undef Xmin_bit_map
# undef Xmax_bit_map
# undef Ymin_bit_map
# undef Ymax_bit_map
# undef FACTEUR_GRAPHIQUE
# undef FACTEUR_VISUALISATION
#Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_ROS /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle. */
#Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_ROS /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle. */
_______________________________________________________________________________________________________________________________________