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