/*************************************************************************************************************************************/
/* */
/* C O M P R E S S I O N / D E C O M P R E S S I O N " R U N - L E N G T H E N C O D I N G 12 " */
/* E N L O N G U E U R V A R I A B L E : */
/* */
/* */
/* Nota : */
/* */
/* Ce programme est inspire de 'v $xtc/CompressionDecompression_RLE_1D.01$c'. */
/* Il y a une petite difference au sujet du compte des repetitions : */
/* */
/* */
/* $xtc/CompressionDecompression_RLE_1D.01$c */
/* */
/* Kc --> K */
/* - */
/* */
/* KKc --> KK */
/* -- */
/* */
/* KKKc --> KKK */
/* --- */
/* */
/* KKKKc --> KKKK[4] */
/* ---- */
/* */
/* KKKKKc --> KKKK[5] */
/* ---- */
/* */
/* KKKKKKc --> KKKK[6] */
/* ---- */
/* */
/* (...) */
/* */
/* KKKKK(...)K --> KKKK[255] */
/* ---- */
/* ----------- */
/* /|\ */
/* | */
/* | */
/* ------------- il n'y a que 255 caracteres 'K'. */
/* */
/* */
/* alors que : */
/* */
/* $KrC/CompressionDeCompressionRunLengthEncoding.11$vv$I */
/* */
/* Kc --> K */
/* - */
/* */
/* KKc --> KK */
/* -- */
/* */
/* KKKc --> KKK */
/* --- */
/* */
/* KKKKc --> KKKK[0] */
/* ---- */
/* */
/* KKKKKc --> KKKK[1] */
/* ---- */
/* */
/* KKKKKKc --> KKKK[2] */
/* */
/* (...) */
/* */
/* KKKKK(...)K --> KKKK[255] */
/* ---- */
/* ----------- */
/* /|\ */
/* | */
/* | */
/* ------------- il y a au total 4+255=259 caracteres 'K'. */
/* */
/* */
/* (ou [n] represente un octet contenant en binaire */
/* la valeur n comprise entre 0 et 255) ce qui est donc */
/* plus optimise. Enfin, 'c' represente un caractere */
/* different de 'K' (on notera au passage que ce caractere */
/* 'c' n'apparait pas apres une chaine de 'K's de longueur */
/* maximale car, en effet, le caractere suivant le dernier */
/* 'K' peut etre un autre caractere 'K'...). */
/* */
/* */
/* Author of '$xrC/CompressionDeCompressionRunLengthEncoding.12$vv$I' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 20151119073056). */
/* */
/*************************************************************************************************************************************/
#include "CompressionDeCompressionRunLengthEncoding.11.vv.I"
#include "OperateursComptage.vv.I"
#define COMPRESSION_RUN_LENGTH_ENCODING_12_DU_FICHIER_R \
/* Procedure introduite le 20151118104757... */ \
{ \
COMPRESSION_RUN_LENGTH_ENCODING_11_DU_FICHIER_R; \
}
#define PROGRESSION_DES_COORDONNEES_12 \
{ \
Test(IFLT(x,Xmax)) \
{ \
mINCR(&x); \
} \
ATes \
{ \
x=Xmin; \
\
Test(IFLT(y,Ymax)) \
{ \
mINCR(&y); \
} \
ATes \
{ \
} \
ETes \
} \
ETes \
}
#ifndef define_dimX_dimY
/* Introduit le 20141024150620 pour accelerer la decompression utilisant le programme */
/* 'v .xrC.EffectuerCompilations.01.vv.Z DeCompressionRunLengthEncoding.02$vv'... */
#else
# if (dimX == 1)
# undef PROGRESSION_DES_COORDONNEES_12
# define PROGRESSION_DES_COORDONNEES_12 \
{ \
mINCR(&y); \
}
# else
# if (dimY == 1)
# undef PROGRESSION_DES_COORDONNEES_12
# define PROGRESSION_DES_COORDONNEES_12 \
{ \
mINCR(&x); \
}
# else
# endif
# endif
#endif
#define STORE_DECOMPRESSION_12(valeur) \
/* Procedure introduite le 20151118104757... */ \
{ \
mgSTORE_IMAGE_PLAN(ImageDecompactee,x,y,valeur); \
\
mINCR(&DimensionImageEffective); \
\
PROGRESSION_DES_COORDONNEES_12; \
}
#define GET_REPETITION_12(NombreDeCaracteres) \
/* Procedure introduite le 20151118104757... */ \
{ \
LongInt compteur; \
LongInt facteur; \
\
mEGALs(facteur,1); \
mEGALs(NombreDeCaracteres,0); \
\
DoIn(compteur,1,NOMBRE_D_OCTETS_POUR_LES_NOMBRES_DE_REPETITIONS) \
{ \
TypeImage caractere; \
mEGALv(caractere,mINDXi(ImageCompactee,JImageADeCompacter)); \
mEGALs(NombreDeCaracteres,ADD2(NombreDeCaracteres,MUL2(caractere,facteur))); \
mEGALs(facteur,MUL2(BASE_DE_NUMERATION_DES_NOMBRES_DE_REPETITIONS,facteur)); \
\
Test(mIFLT(compteur,NOMBRE_D_OCTETS_POUR_LES_NOMBRES_DE_REPETITIONS)) \
{ \
mINCR(&JImageADeCompacter); \
} \
ATes \
{ \
} \
ETes \
} \
EDoI \
\
mEGALs(NombreDeCaracteres,NombreDeCaracteres); \
}
#define REPEAT_STORE_DECOMPRESSION_12(valeur) \
/* Procedure introduite le 20151118104757... */ \
{ \
LongInt nombre; \
\
LongInt NombreDeCaracteres_ADupliquer; \
GET_REPETITION_12(NombreDeCaracteres_ADupliquer); \
\
DoIn(nombre,1,NombreDeCaracteres_ADupliquer) \
{ \
STORE_DECOMPRESSION_12(valeur); \
} \
EDoI \
}
#define DECOMPRESSION_RUN_LENGTH_ENCODING_12_DU_FICHIER_R \
/* Procedure introduite le 20151118104757... */ \
{ \
TypeImage *ImageCompactee=malloc(longueur); \
TypeImage DEFINITION_IMAGE(ImageDecompactee,dimY,dimX); \
\
LongInt x,y; \
/* En fait {x,y} sont deja definis dans 'v $xrC/images.01$vv$I int.................x,y.', */ \
/* mais avec le type 'int... */ \
\
LongInt iterer; \
LongInt CaracterePrecedent; \
/* ATTENTION : doit etre un 'int' et non pas un 'CHAR' a cause de la valeur 'INFINI'... */ \
LongInt CompteurDeRepetitions; \
LongInt DimensionImageEffective; \
LongInt JImageADeCompacter; \
\
mEGALs(iterer,VRAI); \
mEGALs(CaracterePrecedent,CARACTERE_PRECEDENT_INDEFINI); \
\
mEGALs(CompteurDeRepetitions,1); \
mEGALs(DimensionImageEffective,0); \
mEGALs(JImageADeCompacter,0); \
\
LECTURE_FICHIER(ImageCompactee,longueur); \
\
mEGALs(x,Xmin); \
mEGALs(y,Ymin); \
\
mEGALs(JImageADeCompacter,INDEX0); \
Tant(mIFEQ(iterer,VRAI)) \
{ \
TypeImage CaractereCourant; \
mEGALv(CaractereCourant,mINDXi(ImageCompactee,JImageADeCompacter)); \
\
Test(mIFLE(CompteurDeRepetitions,BORNE_INFERIEURE_DE_REPETITIONS)) \
{ \
Test(mIFEQ(CompteurDeRepetitions,BORNE_INFERIEURE_DE_REPETITIONS)) \
{ \
REPEAT_STORE_DECOMPRESSION_12(CaracterePrecedent); \
mEGALs(CaracterePrecedent,CARACTERE_PRECEDENT_INDEFINI); \
mEGALs(CompteurDeRepetitions,1); \
} \
ATes \
{ \
Test(mIFEQ(CaractereCourant,CaracterePrecedent)) \
{ \
mINCR(&CompteurDeRepetitions); \
} \
ATes \
{ \
mEGALs(CaracterePrecedent,CaractereCourant); \
mEGALs(CompteurDeRepetitions,1); \
} \
ETes \
\
STORE_DECOMPRESSION_12(CaractereCourant); \
} \
ETes \
} \
ATes \
{ \
fprintf(stderr,"Erreur de decompression -1-\n"); \
} \
ETes \
\
mINCR(&JImageADeCompacter); \
Test(mIFLE(JImageADeCompacter,NombreVersIndex(NombreOctetsLus))) \
{ \
} \
ATes \
{ \
mEGALs(iterer,FAUX); \
} \
ETes \
} \
ETan \
\
ECRITURE_FICHIER(ImageDecompactee,DimensionImageEffective); \
\
free(ImageCompactee); \
\
EDITION_DES_COMPTEURS; \
}