_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S P O U R L E S T R A C E S G R A P H I Q U E S */ /* S U I V A N T L A B I B L I O T H E Q U E ' S I L I C O N - G R A P H I C S ' : */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les fonctions */ /* de base de traces graphiques suivant la */ /* bibliotheque 'Silicon-Graphics'. */ /* */ /* */ /* Author of '$xiidG/fonction.2$FON' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19920000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_SILICON_GRAPHICS /* Common,DEFV(Fonction,) : compiler sur 'SiliG'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N C L U D E S S P E C I F I Q U E S D E ' S I L I C O N - G R A P H I C S ' : */ /* */ /*************************************************************************************************************************************/ @ include <gl/\\\\\\\\\image.h> /* Dans ces fichier se trouvent la plupart des definitions de type '#define' ainsi que */ /* les references externes. */ /* */ /* ATTENTION, il est necessaire de bloquer temporairement la definition de : */ /* */ /* = define image(...) \ */ /* */ /* faite dans '$xiii/Images$DEF' afin de ne pas entrer en conflit avec le nom du fichier */ /* d'include "<gl/image.h>", d'ou le "\\\\\\\\\image.h"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S T Y P E S N E C E S S A I R E S : */ /* */ /*************************************************************************************************************************************/ TypedefS(G_ELEMENT,CONC(Unsigned,ShortInt)) /* Definition du type d'un element d'une ligne... */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) TypedefD1(G_LIGNE,dimX,G_ELEMENT) /* Definition d'une ligne d'image... */ #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)) \ ) TypedefI1(G_LIGNE,dimX,G_ELEMENT) /* Definition d'une ligne d'image... */ #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)) \ ) TypedefD1(G_LIGNE,KK___dimX,G_ELEMENT) /* Definition d'une ligne d'image... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) TypedefP(G_IMAGE,\\\\\\\\\IMAGE) /* Structure definissant la description d'une image dite "au format SGI". */ /* */ /* ATTENTION, il est necessaire de bloquer temporairement la definition de : */ /* */ /* # define IMAGE(image,x,y) \ */ /* */ /* faite dans '$xiii/Images$DEF' afin de ne pas entrer en conflit avec le type 'IMAGE' */ /* dans l'include "<gl/image.h>", d'ou le "\\\\\\\\\IMAGE"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E F E R E N C E S E X T E R N E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, la definition : */ /* */ /* DEFV(Extern,DEFV(G_IMAGE,POINTERs(iopen()))); */ /* */ /* est faite dans l'include "<gl/image.h>"... */ DEFV(Extern,DEFV(Void,putrow())); /* Rangement d'une ligne d'image dans une structure de type 'G_IMAGE'. */ DEFV(Extern,DEFV(Void,getrow())); /* Recuperation d'une ligne d'image dans une structure de type 'G_IMAGE'. */ DEFV(Extern,DEFV(Void,iclose())); /* Fermeture d'une structure de type 'G_IMAGE'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S L O C A L E S : */ /* */ /*************************************************************************************************************************************/ # define G_IL_Y_A_ERREUR(f) \ IZEQ(f) \ /* Test d'un retour en erreur d'une fonction 'f' ; on notera les conventions inversees */ \ /* pour ce module, puisqu'on teste la nullite (et non pas la non-nullite)... */ # define TYPE_DE_LA_COMPRESSION_EFFECTUEE \ RLE(UN) \ /* Plusieurs modes de compression sont disponibles, mais ils ne sont malheureusement pas */ \ /* documentes... On notera que l'on peut trouver quelques informations dans le manuel */ \ /* 'rgb(4)'. Il y apparait que 'RLE(DEUX)' est une autre valeur possible, mais que celle */ \ /* que j'ai choisie ('RLE(UN)') est celle qui est recommandee pour les images en vraies */ \ /* couleurs... */ # define TYPE_DE_L_IMAGE_A_COMPRESSER \ TROIS \ /* Type de l'image a compresser, et la aussi, ce parametre n'est pas documente... Toujours */ \ /* d'apres le manuel 'rgb(4)', il y a trois valeurs possibles : */ \ /* */ \ /* 1 : une simple rangee ("vecteur") va etre manipulee, */ \ /* 2 : un simple tableau ("matrice") va etre manipule, */ \ /* 3 : plusieurs tableaux ("matrice") vont etre manipules simultanement. */ \ /* */ \ /* Ce 'TROIS' n'a donc rien a voir avec 'NOMBRE_DE_COMPOSANTES_CHROMATIQUES'... */ # define NOMBRE_DE_COMPOSANTES_CHROMATIQUES_DE_L_IMAGE_A_COMPRESSER \ NOMBRE_DE_COMPOSANTES_CHROMATIQUES \ /* Argument dit 'zsize' qui donne le nombre de composantes de l'image... */ Denumer03(INIS(_LIGNE_ROUGE,ZERO) ,_LIGNE_VERTE ,_LIGNE_BLEUE ,liste_des_IDENTIFICATEURS_DE_LIGNE ); # define LIGNE_ROUGE \ ENUM(_LIGNE_ROUGE) # define LIGNE_VERTE \ ENUM(_LIGNE_VERTE) # define LIGNE_BLEUE \ ENUM(_LIGNE_BLEUE) /* Definition des specificateurs des identites des lignes... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R A N G E M E N T D ' U N E I M A G E V R A I E S C O U L E U R A U F O R M A T ' SGI ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IGstore_image_au_format_SGI(nom_de_l_image,imageA_ROUGE,imageA_VERTE,imageA_BLEUE))) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_image))); /* Nom de l'image a ranger. On notera qu'il s'agit en fait de l'image au format "SGI" ; sa */ /* taille est donc a priori imprevisible puiqu'il y a compression... */ DEFV(Argument,DEFV(image,imageA_ROUGE)); /* Premiere image Argument (representant la composante ROUGE), */ DEFV(Argument,DEFV(image,imageA_VERTE)); /* Seconde image Argument (representant la composante VERTE), */ DEFV(Argument,DEFV(image,imageA_BLEUE)); /* Troisieme image Argument (representant la composante BLEUE). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(G_LIGNE,ligne_ROUGE); DEFV(G_LIGNE,ligne_VERTE); DEFV(G_LIGNE,ligne_BLEUE); /* Definition des lignes courantes des trois composantes... */ DEFV(G_IMAGE,INIT(POINTERs(image_SGI),ADRESSE_NON_ENCORE_DEFINIE)); /* Definition de la structure definissant l'image dite "au format SGI". */ /*..............................................................................................................................*/ EGAL(image_SGI ,iopen(nom_de_l_image ,file_Wmode ,TYPE_DE_LA_COMPRESSION_EFFECTUEE ,TYPE_DE_L_IMAGE_A_COMPRESSER ,dimX ,dimY ,NOMBRE_DE_COMPOSANTES_CHROMATIQUES_DE_L_IMAGE_A_COMPRESSER ) ); /* Ouverture de la structure dite "au format SGI". */ Test(G_IL_Y_A_ERREUR(image_SGI)) Bblock /* ATTENTION, cette sequence est la par symetrie avec 'IGload_image_au_format_SGI(...)' et */ /* donc pour faire jolie, car en effet : */ /* */ /* 1-si le fichier 'nom_de_l_image' existe deja et est en mode 'rw', il est ecrase par la */ /* nouvelle version. */ /* */ /* 2-si le fichier 'nom_de_l_image' existe deja et est en mode 'ro', le process est aborte */ /* directement par 'iopen(...)' avec le message : */ /* */ /* iopen: can't open output file ... */ /* */ /* ce qui est un peu brutal... */ PRINT_ERREUR("l'image compressee a creer existe deja"); CAL1(Prer1("nom = '%s'\n",nom_de_l_image)); CODE_ERROR(ERREUR20); Eblock ATes Bblock begin_colonne Bblock begin_ligne Bblock EGAL(LIGNE(ligne_ROUGE,X,Ymin),load_point(imageA_ROUGE,X,Y)); EGAL(LIGNE(ligne_VERTE,X,Ymin),load_point(imageA_VERTE,X,Y)); EGAL(LIGNE(ligne_BLEUE,X,Ymin),load_point(imageA_BLEUE,X,Y)); /* Recuperation de la ligne courante 'Y' de chacune des trois composantes de l'image. */ Eblock end_ligne CALS(putrow(image_SGI,ligne_ROUGE,Y,LIGNE_ROUGE)); CALS(putrow(image_SGI,ligne_VERTE,Y,LIGNE_VERTE)); CALS(putrow(image_SGI,ligne_BLEUE,Y,LIGNE_BLEUE)); /* Compression de la ligne courante 'Y' de chacune des trois composantes de l'image. */ Eblock end_colonne CALS(iclose(image_SGI)); /* Et enfin, fermeture de la structure de type "SGI"... */ Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N E I M A G E V R A I E S C O U L E U R A U F O R M A T ' SGI ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IGload_image_au_format_SGI(nom_de_l_image,imageR_ROUGE,imageR_VERTE,imageR_BLEUE))) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_image))); /* Nom de l'image a recuperer... */ DEFV(Argument,DEFV(image,imageR_ROUGE)); /* Premiere image Resultat (representant la composante ROUGE), */ DEFV(Argument,DEFV(image,imageR_VERTE)); /* Seconde image Resultat (representant la composante VERTE), */ DEFV(Argument,DEFV(image,imageR_BLEUE)); /* Troisieme image Resultat (representant la composante BLEUE). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(G_LIGNE,ligne_ROUGE); DEFV(G_LIGNE,ligne_VERTE); DEFV(G_LIGNE,ligne_BLEUE); /* Definition des lignes courantes des trois composantes... */ DEFV(G_IMAGE,INIT(POINTERs(image_SGI),ADRESSE_NON_ENCORE_DEFINIE)); /* Definition de la structure definissant l'image dite "au format SGI". */ /*..............................................................................................................................*/ EGAL(image_SGI ,iopen(nom_de_l_image ,file_Rmode ,TYPE_DE_LA_COMPRESSION_EFFECTUEE ,TYPE_DE_L_IMAGE_A_COMPRESSER ,dimX ,dimY ,NOMBRE_DE_COMPOSANTES_CHROMATIQUES_DE_L_IMAGE_A_COMPRESSER ) ); /* Ouverture de la structure dite "au format SGI". On notera que d'apres le manuel */ /* 'rgb(4)', seuls les deux premiers arguments de 'iopen(...)' sont necessaires lorsque */ /* l'on est en mode 'file_Rmode'... */ Test(G_IL_Y_A_ERREUR(image_SGI)) Bblock PRINT_ERREUR("l'image compressee demandee n'existe pas"); CAL1(Prer1("nom = '%s'\n",nom_de_l_image)); CODE_ERROR(ERREUR20); Eblock ATes Bblock Test(IFOU(IFNE(ASI1(image_SGI,xsize),dimX),IFNE(ASI1(image_SGI,ysize),dimY))) Bblock PRINT_ATTENTION("la dimension de l'image decompressee ne correspond pas a ce qui est attendu"); CAL1(Prer2("dimension attendue = (%d,%d)\n",dimX,dimY)); CAL1(Prer2("dimension recuperee = (%d,%d)\n",ASI1(image_SGI,xsize),ASI1(image_SGI,ysize))); CAL1(Prer0("\n")); CAL1(Prer4("XYmaxNe %d %d %d %d\n" ,Xmin,XYZmax(Xmin,ASI1(image_SGI,xsize)) ,Ymin,XYZmax(Ymin,ASI1(image_SGI,ysize)) ) ); CODE_ERROR(ERREUR27); CALS(Inoir(imageR_ROUGE)); CALS(Inoir(imageR_VERTE)); CALS(Inoir(imageR_BLEUE)); /* C'est plus propre et plus prudent... */ Eblock ATes Bblock /* A compter du 20020909093225, la conversion n'a lieu que si les dimensions sont correctes. */ begin_colonne Bblock CALS(getrow(image_SGI,ligne_ROUGE,Y,LIGNE_ROUGE)); CALS(getrow(image_SGI,ligne_VERTE,Y,LIGNE_VERTE)); CALS(getrow(image_SGI,ligne_BLEUE,Y,LIGNE_BLEUE)); /* Decompression de la ligne courante 'Y' de chacune des trois composantes de l'image. */ begin_ligne Bblock store_point(LIGNE(ligne_ROUGE,X,Ymin),imageR_ROUGE,X,Y,FVARIABLE); store_point(LIGNE(ligne_VERTE,X,Ymin),imageR_VERTE,X,Y,FVARIABLE); store_point(LIGNE(ligne_BLEUE,X,Ymin),imageR_BLEUE,X,Y,FVARIABLE); /* Rangement de la ligne courante 'Y' de chacune des trois composantes de l'image. */ Eblock end_ligne Eblock end_colonne Eblock ETes CALS(iclose(image_SGI)); /* Et enfin, fermeture de la structure de type "SGI"... */ Eblock ETes RETU_ERROR; Eblock EFonctionI # undef LIGNE_BLEUE # undef LIGNE_VERTE # undef LIGNE_ROUGE # undef NOMBRE_DE_COMPOSANTES_CHROMATIQUES_DE_L_IMAGE_A_COMPRESSER # undef TYPE_DE_L_IMAGE_A_COMPRESSER # undef TYPE_DE_LA_COMPRESSION_EFFECTUEE # undef G_IL_Y_A_ERREUR #Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_SILICON_GRAPHICS /* Common,DEFV(Fonction,) : compiler sur 'SiliG'. */ #Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_SILICON_GRAPHICS /* Common,DEFV(Fonction,) : compiler sur 'SiliG'. */ _______________________________________________________________________________________________________________________________________