diff --git a/src/common.c b/src/compress.c similarity index 77% rename from src/common.c rename to src/compress.c index ad9cc4d..b442d49 100644 --- a/src/common.c +++ b/src/compress.c @@ -3,7 +3,7 @@ * \brief Implémentation de la (dé)compression d’images */ -#include "common.h" +#include "compress.h" /** * Cette fonction permet d’évaluer si le pixel passé en argument est éligible à @@ -34,14 +34,14 @@ bool sameColor(Pixel* t_pixel, Zone* t_zone) { void addPixelToSelectedZone(Image* t_img, int t_idx, Zone* t_zone) { Pixel *current_pixel = darrayGet(t_img->pixels, t_idx); int xd, xg, y = t_idx / (int)t_img->x; - if (current_pixel->visited || t_idx >= (int)darraySize(t_img->pixels) || + if (t_idx >= (int)darraySize(t_img->pixels) || t_idx < 0 || !sameColor(current_pixel, t_zone)) { return; } (*current_pixel).visited = true; for(xd = t_idx; xd % (int)t_img->x != 0; ++xd) { /* fetch right limit of segment */ current_pixel = darrayGet(t_img->pixels, xd); - if(current_pixel->visited || !sameColor(current_pixel, t_zone)) { + if(!sameColor(current_pixel, t_zone)) { break; } (*current_pixel).visited = true; @@ -60,8 +60,15 @@ void addPixelToSelectedZone(Image* t_img, int t_idx, Zone* t_zone) { } } -/* Selects the zone related to the pixel, skip tests if pixel has already been - * visited */ +/** + * Sélectionne la zone correspondant à la couleur du pixel. Si aucune zone + * existante ne correspond, une nouvelle est créée et est ajoutée à l'image. + * Chaque pixel est itéré, et ignoré si le pixel a déjà été visité auparavant. + * + * \param[out] t_img L’image contenant les pixels à tester + * \param[in] t_idx Index du pixel à tester + * \param[out] t_zones Liste des zones de l’image + */ void chooseZoneForPixel(Image* t_img, int t_idx, darray *zones) { Zone* current_zone; Pixel* pixel; @@ -90,7 +97,12 @@ void chooseZoneForPixel(Image* t_img, int t_idx, darray *zones) { addPixelToSelectedZone(t_img, t_idx, current_zone); } -/* converts an image to zones */ +/** + * Génère les zones de l’image en titérant chaque pixel de l’image. + * + * \param t_img Image à convertir en zones + * \return Pointeur vers un \ref darray de structures \ref Zone + */ darray* imgToZones(Image* t_img) { darray *zones; const size_t nb_pixels = darraySize(t_img->pixels); @@ -104,17 +116,24 @@ darray* imgToZones(Image* t_img) { return zones; } -void compress(const char *input_file) { +/** + * Convertit une image en zones puis écrit ces zones dans un fichier, + * compressant ainsi l'image passée en argument. + * + * \param[in] t_input_file Nom/chemin du fichier ppm d'entrée + */ +void compress(const char *t_input_file) { Image *img; darray *zones; + size_t i; img = newImage(); - imageLoadPPM(input_file, img); + imageLoadPPM(t_input_file, img); zones = imgToZones(img); /* print segments for debug ************************************************/ DEBUG { printf("Detected %zu zones\n", darraySize(zones)); - for (size_t i = 0; i < darraySize(zones); ++i) { + for (i = 0; i < darraySize(zones); ++i) { Zone *zone = darrayGet(zones, i); printf("\n=== Zone %zu (%d %d %d) ===\n", i, zone->r, zone->g, zone->b); for (size_t j = 0; j < darraySize(zone->segments); ++j) { @@ -126,4 +145,8 @@ void compress(const char *input_file) { } deleteImage(img); + for(i = 0; i < darraySize(zones); ++i) { + deleteZoneContent(darrayGet(zones, i)); + } + darrayDelete(zones); } diff --git a/src/common.h b/src/compress.h similarity index 58% rename from src/common.h rename to src/compress.h index 75f2cf4..465e133 100644 --- a/src/common.h +++ b/src/compress.h @@ -3,17 +3,20 @@ * \brief Déclaration pour la (dé)compression d’images */ -#ifndef COMMON_H -#define COMMON_H +#ifndef COMPRESS_H +#define COMPRESS_H #include "ppm.h" /// Teste l’éligibilité d’un pixel à une zone -bool sameColor(Pixel *, Zone *); +bool sameColor(Pixel *t_pixel, Zone *t_zone); /// Ajoute un pixel et ses pixels connexes à une zone void addPixelToSelectedZone(Image *t_img, int t_idx, Zone *t_zone); +/// Sélectionne la zone correspondant à la couleur d'un pixel void chooseZoneForPixel(Image *t_img, int t_idx, darray *zones); +/// Créé les zones d'une image darray *imgToZones(Image *t_img); -void compress(const char *); +/// Compresse l'image d'entrée +void compress(const char *t_input_file); -#endif /* COMMON_H */ +#endif /* COMPRESS_H */