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