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