_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   D E   C O M P R E S S I O N   ' $JPEG '  :                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base de compression '$JPEG'.                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiidC/jpeg$FON' :                                                                                              */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19970000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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_LA_COMPRESSION_JPEG                               /* Common,DEFV(Fonction,) : indicateur de VERSION.   */
DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LA_COMPRESSION_JPEG));
#Aifdef   __VERSION__COMPILER_LA_COMPRESSION_JPEG                               /* Common,DEFV(Fonction,) : indicateur de VERSION.   */
#Eifdef   __VERSION__COMPILER_LA_COMPRESSION_JPEG                               /* Common,DEFV(Fonction,) : indicateur de VERSION.   */

#ifdef    __VERSION__COMPILER_LA_COMPRESSION_JPEG                               /* Common,DEFV(Fonction,) : compiler sur 'Compr'.    */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N C L U D E S   S P E C I F I Q U E S   D E   C O M P R E S S I O N   ' $JPEG '  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@    define    __STDLIB_H__
                                        /* En effet, <dmedia/cl.h> fait appel a '<dmedia/dm_audio.h>', '<dmedia/dm_image.h>' et      */
                                        /* '<dmedia/dm_params.h> qui eux-memes font appel a '<stdlib.h>', et ce uniquement pour      */
                                        /* definir 'size_t' (apparemment) en fait deja defini dans '<stdio.h>'. Or '<stdlib.h>'      */
                                        /* declare 'malloc(...)', 'exit(...)' et 'getenv(...)' ce qui rentre en conflit avec des     */
                                        /* des definitions anterieures. D'ou ceci ('__STDLIB_H__') qui permet de ne pas inclure      */
                                        /* '<stdlib.h>' ci-apres...                                                                  */
@    include   <dmedia/cl.h>
                                        /* L'utilisation de '$PASSE_5' et non de '$PASSE_1' pour '<dmedia/cl.h>' vient du fait       */
                                        /* qu'il y a pour les symboles :                                                             */
                                        /*                                                                                           */
                                        /*                  TRUE                                                                     */
                                        /*                  FALSE                                                                    */
                                        /*                  SUCCESS                                                                  */
                                        /*                  FAILURE                                                                  */
                                        /*                  ON                                                                       */
                                        /*                  OFF                                                                      */
                                        /*                                                                                           */
                                        /* une difference de comportement entre '$xcp/cpp$X' et '/usr/lip/cpp' (qui pourrait etre    */
                                        /* redhibitoire) et qui concerne les ecritures du type :                                     */
                                        /*                                                                                           */
                                        /*                  #if       !defined(SYMBOLE) || ((SYMBOLE) != VALEUR)                     */
                                        /*                                                                                           */
                                        /* lorsque le symbole 'SYMBOLE' n'existe pas : '/usr/lip/cpp' accepte cela, alors que        */
                                        /* '$xcp/cpp$X' proteste lorsque la valeur de 'SYMBOLE' est comparee a 'VALEUR'...           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
TypedefP(G_CL_Handle,CL_Handle)
                                        /* "Poignee" d'acces au compresseur '$JPEG' demande.                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E F E R E N C E S   E X T E R N E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   L O C A L E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D O N N E S   D E   C O N T R O L E   E T   D ' I N F O R M A T I O N   G L O B A L E S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(Logical,INIT(il_y_a_une_compression_JPEG_en_cours,FAUX)));
                                        /* Indique en permanence si une compression a ete initialisee...                             */
                                        /* a pu etre etablie ('VRAI') ou pas ('FAUX').                                               */
DEFV(Local,DEFV(G_CL_Handle,INIT(compresseur_JPEG_utilise,ADRESSE_NON_ENCORE_DEFINIE)));
                                        /* "Poignee" d'acces au compresseur '$JPEG'.                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O U V E R T U R E   D ' U N E   C O M P R E S S I O N   ' $JPEG '  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

Denumer02(INIS(_NOM_DU_PARAMETRE,INDEX0)
              ,_VALEUR_DU_PARAMETRE
         ,liste_des_ORDRE_DES_ROTATIONS
          );
#    define    NOM_DU_PARAMETRE                                                                                                         \
                         ENUM(_NOM_DU_PARAMETRE)
#    define    VALEUR_DU_PARAMETRE                                                                                                      \
                         ENUM(_VALEUR_DU_PARAMETRE)
#    define    LONGUEUR_DE_LA_ZONE_DE_PARAMETRAGE                                                                                       \
                         NBRE(NOM_DU_PARAMETRE,VALEUR_DU_PARAMETRE)
DEFV(Local,DEFV(vrai_Int_de_base,DTb1(zone_de_parametrage_du_compresseur_JPEG,LONGUEUR_DE_LA_ZONE_DE_PARAMETRAGE)));
                                        /* Definition de la zone de parametrage.                                                     */

#    define    TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(parametre,valeur)                                                           \
                         Bblock                                                                                                         \
                         EGAL(ITb1(zone_de_parametrage_du_compresseur_JPEG,NOM_DU_PARAMETRE),parametre);                                \
                         EGAL(ITb1(zone_de_parametrage_du_compresseur_JPEG,VALEUR_DU_PARAMETRE),valeur);                                \
                                        /* Choix du parametre a initialiser.                                                         */ \
                         Test(IFEQ(clSetParams(compresseur_JPEG_utilise                                                                 \
                                              ,zone_de_parametrage_du_compresseur_JPEG                                                  \
                                              ,LONGUEUR_DE_LA_ZONE_DE_PARAMETRAGE                                                       \
                                               )                                                                                        \
                                  ,SUCCESS                                                                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("la parametrage du compresseur '$JPEG' se passe mal (1)");                                   \
                              CAL1(Prer1(" identite du parametre = %d\n",parametre));                                                   \
                              CAL1(Prer1(" valeur du parametre   = %d\n",parametre));                                                   \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Transfert de la valeur d'un parametre au compresseur '$JPEG'.                             */
#    define    RECUPERATION_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(parametre,valeur)                                                        \
                         Bblock                                                                                                         \
                         EGAL(ITb1(zone_de_parametrage_du_compresseur_JPEG,NOM_DU_PARAMETRE),parametre);                                \
                                        /* Choix du parametre a recuperer.                                                           */ \
                         Test(IFEQ(clGetParams(compresseur_JPEG_utilise                                                                 \
                                              ,zone_de_parametrage_du_compresseur_JPEG                                                  \
                                              ,LONGUEUR_DE_LA_ZONE_DE_PARAMETRAGE                                                       \
                                               )                                                                                        \
                                  ,SUCCESS                                                                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              EGAL(valeur,ITb1(zone_de_parametrage_du_compresseur_JPEG,VALEUR_DU_PARAMETRE));                           \
                                        /* Recuperation de la valeur du parametre choisi...                                          */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("la parametrage du compresseur '$JPEG' se passe mal (2)");                                   \
                              CAL1(Prer1(" identite du parametre = %d\n",parametre));                                                   \
                              CAL1(Prer1(" valeur du parametre.. = %d\n",parametre));                                                   \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Transfert de la valeur d'un parametre au compresseur '$JPEG'.                             */

DEFV(Common,DEFV(FonctionI,ICopen_JPEG(facteur_de_compression_demande)))
DEFV(Argument,DEFV(Float,facteur_de_compression_demande));
                                        /* Facteur de compression demande.                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(vrai_Int_de_base,INIT(longueur_au_plus_necessaire_pour_la_zone_de_compression,UNDEF));
                                        /* Longueur en octets du resultat a venir de la compression.                                 */
     /*..............................................................................................................................*/
     Test(EST_FAUX(il_y_a_une_compression_JPEG_en_cours))
          Bblock
          Test(IFEQ(clOpenCompressor(CL_JPEG_SOFTWARE,ADRESSE(compresseur_JPEG_utilise)),SUCCESS))
               Bblock
               DEFV(vrai_Float_de_base,INIT(facteur_de_compression_utilise,facteur_de_compression_demande));
                                        /* Pour eviter les problemes avec 'CL_COMPRESSION_RATIO'...                                  */

               TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(CL_IMAGE_WIDTH
                                                           ,dimX
                                                            );
               TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(CL_IMAGE_HEIGHT
                                                           ,dimY
                                                            );
                                        /* Parametrage du compresseur '$JPEG' : dimensions de l'image.                               */
               TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(CL_ORIENTATION
                                                           ,CL_BOTTOM_UP
                                                            );
                                        /* Parametrage du compresseur '$JPEG' : orientation de l'axe 'OY' (vers le haut...).         */
               TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(CL_FORMAT
                                                           ,CL_FORMAT_XBGR
                                                            );
                                        /* Parametrage du compresseur '$JPEG' : format de l'image.                                   */
               TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(CL_COMPRESSION_RATIO
                                                           ,CL_TypeIsInt(facteur_de_compression_utilise)
                                                            );
                                        /* Parametrage du compresseur '$JPEG' : facteur de compression demande.                      */
               RECUPERATION_D_UN_PARAMETRE_DE_COMPRESSION_JPEG(CL_COMPRESSED_BUFFER_SIZE
                                                              ,longueur_au_plus_necessaire_pour_la_zone_de_compression
                                                               );
                                        /* Recuperation de la longueur du buffer necessaire a la compression...                      */

               EGAL(il_y_a_une_compression_JPEG_en_cours,VRAI);
                                        /* Ainsi, on sait qu'il y a une compression en cours...                                      */
               Eblock
          ATes
               Bblock
               PRINT_ERREUR("le compresseur '$JPEG' ne peut etre ouvert");
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("il y a deja une conversion '$JPEG' en cours");
          Eblock
     ETes

     RETU(INTE(longueur_au_plus_necessaire_pour_la_zone_de_compression));
                                        /* Renvoi de la longueur au plus necessaire pour faire la compression.                       */
     Eblock

#    undef     RECUPERATION_D_UN_PARAMETRE_DE_COMPRESSION_JPEG
#    undef     TRANSFERT_D_UN_PARAMETRE_DE_COMPRESSION_JPEG
#    undef     LONGUEUR_DE_LA_ZONE_DE_PARAMETRAGE
#    undef     VALEUR_DU_PARAMETRE
#    undef     NOM_DU_PARAMETRE

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P R E S S I O N   ' $JPEG '  :                                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,ICcompression_JPEG(imageR,longueur_au_plus_necessaire_pour_la_zone_de_compression,imageA)))
DEFV(Argument,DEFV(CHAR,DTb0(imageR)));
                                        /* Image Resultat (compressee). .                                                            */
DEFV(Argument,DEFV(Int,longueur_au_plus_necessaire_pour_la_zone_de_compression));
                                        /* Longueur necessaire (deja connue via 'ICopen_JPEG(...)' pour obtenir le 'imageR'.         */
DEFV(Argument,DEFV(imageU,imageA));
                                        /* Image Argument (a compresser).                                                            */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(vrai_Int_de_base,INIT(longueur_effective_de_l_image_compressee,longueur_au_plus_necessaire_pour_la_zone_de_compression));
                                        /* Pour eviter des problemes...                                                              */
     /*..............................................................................................................................*/
     Test(EST_VRAI(il_y_a_une_compression_JPEG_en_cours))
          Bblock
          DEFV(Int,INIT(nombre_d_images_a_compresser,UN));
          DEFV(Int,INIT(nombre_d_images_compressees,UNDEF));
                                        /* Nombre d'images a compresser et compressees...                                            */

          EGAL(nombre_d_images_compressees
              ,clCompress(compresseur_JPEG_utilise
                         ,nombre_d_images_a_compresser
                         ,imageA
                         ,ADRESSE(longueur_effective_de_l_image_compressee)
                         ,imageR
                          )
               );
                                        /* Compression effective de l'image.                                                         */

          Test(IFNE(nombre_d_images_compressees,nombre_d_images_a_compresser))
               Bblock
               PRINT_ERREUR("le compresseur '$JPEG' n'a pu effectuer la compression");
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFGE(INTE(longueur_effective_de_l_image_compressee),MUL2(NOMBRE_DE_COMPOSANTES_CHROMATIQUES,size_i)))
               Bblock
               PRINT_ERREUR("le compresseur '$JPEG' n'a pas effectue une compression economique");
               CAL1(Prer1(" nombre d'octets de l'image non compressee..................... = %d"
                         ,MUL2(NOMBRE_DE_COMPOSANTES_CHROMATIQUES,size_i)
                          )
                    );
               CAL1(Prer1(" nombre d'octets au plus necessaires pour l'image compressee... = %d"
                         ,longueur_au_plus_necessaire_pour_la_zone_de_compression
                          )
                    );
               CAL1(Prer1(" nombre d'octets effectif pour l'image compressee.............. = %d"
                         ,INTE(longueur_effective_de_l_image_compressee)
                          )
                    );
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("la conversion '$JPEG' n'a pas ete ouverte, il n'est donc pas possible de compresser");
          Eblock
     ETes

     RETU(INTE(longueur_effective_de_l_image_compressee));
                                        /* Renvoi de la longueur effective de l'image apres compression.                             */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F E R M E T U R E   D ' U N E   C O M P R E S S I O N   ' $JPEG '  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,ICclose_JPEG()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
                                        /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples      */
                                        /* ('BDEFV','EDEFV') suivraient...                                                           */
     /*..............................................................................................................................*/
     Test(EST_VRAI(il_y_a_une_compression_JPEG_en_cours))
          Bblock
          Test(IFEQ(clCloseCompressor(compresseur_JPEG_utilise),SUCCESS))
               Bblock
               Eblock
          ATes
               Bblock
               PRINT_ERREUR("la fermeture du compresseur '$JPEG' se passe mal");
               Eblock
          ETes

          EGAL(il_y_a_une_compression_JPEG_en_cours,FAUX);
                                        /* Ainsi, on sait qu'il n'y a plus de compression en cours...                                */
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("la conversion '$JPEG' n'a pas ete ouverte, il n'est donc pas possible de la fermer");
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

#Aifdef   __VERSION__COMPILER_LA_COMPRESSION_JPEG                               /* Common,DEFV(Fonction,) : compiler sur 'Compr'.    */
#Eifdef   __VERSION__COMPILER_LA_COMPRESSION_JPEG                               /* Common,DEFV(Fonction,) : compiler sur 'Compr'.    */

_______________________________________________________________________________________________________________________________________



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.