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