_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/* */
/* 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'. */
_______________________________________________________________________________________________________________________________________
Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.