fixed documentation
This commit is contained in:
parent
ea6e190ecd
commit
ae74134064
@ -1997,7 +1997,7 @@ PERLMOD_MAKEVAR_PREFIX =
|
|||||||
# C-preprocessor directives found in the sources and include files.
|
# C-preprocessor directives found in the sources and include files.
|
||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
|
|
||||||
ENABLE_PREPROCESSING = NO
|
ENABLE_PREPROCESSING = YES
|
||||||
|
|
||||||
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
|
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
|
||||||
# in the source code. If set to NO, only conditional compilation will be
|
# in the source code. If set to NO, only conditional compilation will be
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* \file common.c
|
* \file compress.c
|
||||||
* \brief Implémentation de la (dé)compression d’images
|
* \brief Implémentation de la (dé)compression d’images
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ void addPixelToSelectedZone(Image *t_img, int64_t t_idx, Zone *t_zone) {
|
|||||||
* \param[in] t_idx Index du pixel à tester
|
* \param[in] t_idx Index du pixel à tester
|
||||||
* \param[out] t_zones Liste des zones de l’image
|
* \param[out] t_zones Liste des zones de l’image
|
||||||
*/
|
*/
|
||||||
void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *zones) {
|
void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *t_zones) {
|
||||||
Zone *current_zone;
|
Zone *current_zone;
|
||||||
Pixel *pixel;
|
Pixel *pixel;
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -91,8 +91,8 @@ void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *zones) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* for each known zone, see if it matches the current pixel's color */
|
/* for each known zone, see if it matches the current pixel's color */
|
||||||
for (i = 0; i < darraySize(zones); ++i) {
|
for (i = 0; i < darraySize(t_zones); ++i) {
|
||||||
current_zone = darrayGet(zones, i);
|
current_zone = darrayGet(t_zones, i);
|
||||||
/* if it does, add selected pixel and its neighbouring pixels of the same
|
/* if it does, add selected pixel and its neighbouring pixels of the same
|
||||||
* color */
|
* color */
|
||||||
if (sameColor(pixel, current_zone)) {
|
if (sameColor(pixel, current_zone)) {
|
||||||
@ -104,7 +104,7 @@ void chooseZoneForPixel(Image *t_img, int64_t t_idx, darray *zones) {
|
|||||||
* and add the selected pixel and its neighbours of the same color to the zone
|
* and add the selected pixel and its neighbours of the same color to the zone
|
||||||
*/
|
*/
|
||||||
current_zone = newZone(pixel->r, pixel->g, pixel->b);
|
current_zone = newZone(pixel->r, pixel->g, pixel->b);
|
||||||
darrayPushBack(zones, current_zone);
|
darrayPushBack(t_zones, current_zone);
|
||||||
addPixelToSelectedZone(t_img, t_idx, current_zone);
|
addPixelToSelectedZone(t_img, t_idx, current_zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* \file common.h
|
* \file compress.h
|
||||||
* \brief Déclaration pour la (dé)compression d’images
|
* \brief Déclaration pour la (dé)compression d’images
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
30
src/darray.c
30
src/darray.c
@ -14,7 +14,7 @@
|
|||||||
* tableau. Cela implique qu’un objet \ref darray ne peut contenir que des
|
* tableau. Cela implique qu’un objet \ref darray ne peut contenir que des
|
||||||
* éléments du même type.
|
* éléments du même type.
|
||||||
*
|
*
|
||||||
* \param[in] element_size Taille des objets stockés
|
* \param[in] t_element_size Taille des objets stockés
|
||||||
* \return Pointeur sur le nouvel objet \ref darray
|
* \return Pointeur sur le nouvel objet \ref darray
|
||||||
*/
|
*/
|
||||||
darray *darrayNew(size_t t_element_size) {
|
darray *darrayNew(size_t t_element_size) {
|
||||||
@ -34,10 +34,10 @@ darray *darrayNew(size_t t_element_size) {
|
|||||||
* élément. Cette fonction modifie les membres `begin` et `end` et
|
* élément. Cette fonction modifie les membres `begin` et `end` et
|
||||||
* potentiellement `capacity` de `self`.
|
* potentiellement `capacity` de `self`.
|
||||||
*
|
*
|
||||||
* \param[in] self Objet \ref darray dans lequel on souhaite insérer un nouvel
|
* \param[in] t_self Objet \ref darray dans lequel on souhaite insérer un nouvel
|
||||||
* élément
|
* élément
|
||||||
* \param[in] pos Position à laquelle on souhaite insérer un nouvel élément
|
* \param[in] t_pos Position à laquelle on souhaite insérer un nouvel élément
|
||||||
* \param[in] elem Élément que l’on souhaite insérer
|
* \param[in] t_elem Élément que l’on souhaite insérer
|
||||||
*/
|
*/
|
||||||
void darrayInsert(darray *t_self, void *t_pos, void *t_elem) {
|
void darrayInsert(darray *t_self, void *t_pos, void *t_elem) {
|
||||||
char *itr;
|
char *itr;
|
||||||
@ -57,7 +57,7 @@ void darrayInsert(darray *t_self, void *t_pos, void *t_elem) {
|
|||||||
* sa capacité par deux. Si la réallocation mémoire ne réussit pas, le
|
* sa capacité par deux. Si la réallocation mémoire ne réussit pas, le
|
||||||
* programme s’arrête immédiatement, renvoyant la valeur de \ref PTR_ERROR
|
* programme s’arrête immédiatement, renvoyant la valeur de \ref PTR_ERROR
|
||||||
*
|
*
|
||||||
* \param[in] self L'objet darray à étendre
|
* \param[in] t_self L'objet darray à étendre
|
||||||
*/
|
*/
|
||||||
void darrayExtend(darray *t_self) {
|
void darrayExtend(darray *t_self) {
|
||||||
void *new_array;
|
void *new_array;
|
||||||
@ -82,8 +82,8 @@ void darrayExtend(darray *t_self) {
|
|||||||
* entre les membres `begin` et `end` de `self`. Par ailleurs, le membre `end`
|
* entre les membres `begin` et `end` de `self`. Par ailleurs, le membre `end`
|
||||||
* de `self` se retrouve modifié par la fonction.
|
* de `self` se retrouve modifié par la fonction.
|
||||||
*
|
*
|
||||||
* \param[out] self Objet \ref `darray` dont on souhaite supprimer un élément
|
* \param[out] t_self Objet \ref darray dont on souhaite supprimer un élément
|
||||||
* \param[in] pos Élément de `self` que l’on souhaite supprimer
|
* \param[in] t_pos Élément de `self` que l’on souhaite supprimer
|
||||||
*/
|
*/
|
||||||
void darrayErase(darray *t_self, void *t_pos) {
|
void darrayErase(darray *t_self, void *t_pos) {
|
||||||
memmove(t_pos, (char *)t_pos + t_self->element_size,
|
memmove(t_pos, (char *)t_pos + t_self->element_size,
|
||||||
@ -95,9 +95,9 @@ void darrayErase(darray *t_self, void *t_pos) {
|
|||||||
* `darrayPushBack` ajoute un nouvel élément `elem` à l’objet `self` à la fin du
|
* `darrayPushBack` ajoute un nouvel élément `elem` à l’objet `self` à la fin du
|
||||||
* tableau de ce dernier. Cette fonction modifie le membre `end` de `self`.
|
* tableau de ce dernier. Cette fonction modifie le membre `end` de `self`.
|
||||||
*
|
*
|
||||||
* \param[out] self Objet \ref darray à la fin duquel on souhaite ajouter un
|
* \param[out] t_self Objet \ref darray à la fin duquel on souhaite ajouter un
|
||||||
* nouvel élément
|
* nouvel élément
|
||||||
* \param[in] elem Élément que l’on souhaite ajouter à la fin de `self`
|
* \param[in] t_elem Élément que l’on souhaite ajouter à la fin de `self`
|
||||||
*/
|
*/
|
||||||
void darrayPushBack(darray *t_self, void *t_elem) {
|
void darrayPushBack(darray *t_self, void *t_elem) {
|
||||||
darrayInsert(t_self, t_self->end, t_elem);
|
darrayInsert(t_self, t_self->end, t_elem);
|
||||||
@ -108,7 +108,7 @@ void darrayPushBack(darray *t_self, void *t_elem) {
|
|||||||
* darray passé en argument. Cette fonction modifie le membre `end` de ce
|
* darray passé en argument. Cette fonction modifie le membre `end` de ce
|
||||||
* dernier objet.
|
* dernier objet.
|
||||||
*
|
*
|
||||||
* \param[out] self Objet dont on souhaite supprimer le dernier élément
|
* \param[out] t_self Objet dont on souhaite supprimer le dernier élément
|
||||||
*/
|
*/
|
||||||
void darrayPopBack(darray *t_self) {
|
void darrayPopBack(darray *t_self) {
|
||||||
darrayErase(t_self, (char *)t_self->end - t_self->element_size);
|
darrayErase(t_self, (char *)t_self->end - t_self->element_size);
|
||||||
@ -120,7 +120,7 @@ void darrayPopBack(darray *t_self) {
|
|||||||
* L’objet passé en argument ne sera plus utilisable après utilisation de cette
|
* L’objet passé en argument ne sera plus utilisable après utilisation de cette
|
||||||
* fonction.
|
* fonction.
|
||||||
*
|
*
|
||||||
* \param[out] self Objet \ref darray à supprimer
|
* \param[out] t_self Objet \ref darray à supprimer
|
||||||
*/
|
*/
|
||||||
void darrayDelete(darray *t_self) {
|
void darrayDelete(darray *t_self) {
|
||||||
free(t_self->begin);
|
free(t_self->begin);
|
||||||
@ -132,7 +132,7 @@ void darrayDelete(darray *t_self) {
|
|||||||
* `self` passé en arguments. Cette fonction ne modifie pas l’élément passé en
|
* `self` passé en arguments. Cette fonction ne modifie pas l’élément passé en
|
||||||
* argument.
|
* argument.
|
||||||
*
|
*
|
||||||
* \param[out] self Objet \ref darray dont on souhaite connaître le nombre
|
* \param[out] t_self Objet \ref darray dont on souhaite connaître le nombre
|
||||||
* d’éléments
|
* d’éléments
|
||||||
* \return Nombre d’éléments contenus dans `self`
|
* \return Nombre d’éléments contenus dans `self`
|
||||||
*/
|
*/
|
||||||
@ -147,9 +147,9 @@ size_t darraySize(darray *t_self) {
|
|||||||
* le pointeur `NULL` sera renvoyé, sinon un pointeur de type `void*` pointant
|
* le pointeur `NULL` sera renvoyé, sinon un pointeur de type `void*` pointant
|
||||||
* sur l’élément correspondant sera renvoyé. Cette fonction ne modifie pas
|
* sur l’élément correspondant sera renvoyé. Cette fonction ne modifie pas
|
||||||
* l’objet `self`.
|
* l’objet `self`.
|
||||||
* \param[out] self Objet \ref darray duquel on souhaite obtenir un pointeur sur
|
* \param[out] t_self Objet \ref darray duquel on souhaite obtenir un pointeur
|
||||||
* l’élément à l’index `idx`
|
* sur l’élément à l’index `idx`
|
||||||
* \param[in] idx Index de l’élément que l’on souhaite récupérer
|
* \param[in] t_idx Index de l’élément que l’on souhaite récupérer
|
||||||
* \return Pointeur de type `void*` pointant sur l’élément si l’index est
|
* \return Pointeur de type `void*` pointant sur l’élément si l’index est
|
||||||
* valide, sur NULL sinon.
|
* valide, sur NULL sinon.
|
||||||
*/
|
*/
|
||||||
|
@ -11,13 +11,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \struct darray_s
|
* \struct darray
|
||||||
* \brief Tableau dynamique
|
* \brief Tableau dynamique
|
||||||
*
|
*
|
||||||
* Les objets `darray_s` offrent la possibilité d’avoir des tableaux à taille
|
* Les objets `darray` offrent la possibilité d’avoir des tableaux à taille
|
||||||
* variable en C, similairement aux objets `vector` en C++.
|
* variable en C, similairement aux objets `vector` en C++.
|
||||||
*/
|
*/
|
||||||
typedef struct darray_s {
|
typedef struct {
|
||||||
void *begin; /*!< Pointeur sur le premier élément du tableau */
|
void *begin; /*!< Pointeur sur le premier élément du tableau */
|
||||||
void *end; /*!< Pointeur sur l’élément situé immédiatement après le dernier
|
void *end; /*!< Pointeur sur l’élément situé immédiatement après le dernier
|
||||||
élément du tableau */
|
élément du tableau */
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* \file errorcodes.h
|
* \file errorcodes.h
|
||||||
* \brief Definition of error codes
|
* \brief Definition of error codes
|
||||||
*
|
*
|
||||||
* Dans ce fichier sont définis les codes d’erreur pouvant interrompre le
|
* Dans ce fichier sont définis les codes d’erreur pouvant interrompre le
|
||||||
* programme.
|
* programme.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SRC_ERRORCODES_H_
|
#ifndef SRC_ERRORCODES_H_
|
||||||
|
90
src/ppm.c
90
src/ppm.c
@ -19,8 +19,8 @@
|
|||||||
* `1`. En cas de succès, la fonction renverra un pointeur de fichier vers le
|
* `1`. En cas de succès, la fonction renverra un pointeur de fichier vers le
|
||||||
* fichier ouvert.
|
* fichier ouvert.
|
||||||
*
|
*
|
||||||
* \param[in] filename Nom du fichier à ouvrir
|
* \param[in] t_filename Nom du fichier à ouvrir
|
||||||
* \param[in] mode Mode du fichier à ouvrir
|
* \param[in] t_mode Mode du fichier à ouvrir
|
||||||
* \return Pointeur de fichier
|
* \return Pointeur de fichier
|
||||||
*/
|
*/
|
||||||
FILE *get_file(const char *t_filename, const char *t_mode) {
|
FILE *get_file(const char *t_filename, const char *t_mode) {
|
||||||
@ -36,8 +36,8 @@ FILE *get_file(const char *t_filename, const char *t_mode) {
|
|||||||
* Lit et vérifie le format du fichier passé en argument. Si le format n’est
|
* Lit et vérifie le format du fichier passé en argument. Si le format n’est
|
||||||
* pas correct, la fonction arrête le processus qui renverra la valeur `1`.
|
* pas correct, la fonction arrête le processus qui renverra la valeur `1`.
|
||||||
*
|
*
|
||||||
* \param[in] fb Fichier ppm où lire les données
|
* \param[in] t_fp Fichier ppm où lire les données
|
||||||
* \param[in] filename Nom du fichier ouvert
|
* \param[in] t_filename Nom du fichier ouvert
|
||||||
*/
|
*/
|
||||||
void read_file_format(FILE *t_fp, const char *t_filename) {
|
void read_file_format(FILE *t_fp, const char *t_filename) {
|
||||||
char buff[16];
|
char buff[16];
|
||||||
@ -55,7 +55,7 @@ void read_file_format(FILE *t_fp, const char *t_filename) {
|
|||||||
/**
|
/**
|
||||||
* Vérifie si le header contient des commentaires et les ignore le cas échéant.
|
* Vérifie si le header contient des commentaires et les ignore le cas échéant.
|
||||||
*
|
*
|
||||||
* \param[in] fp Fichier ppm où lire les données
|
* \param[in] t_fp Fichier ppm où lire les données
|
||||||
*/
|
*/
|
||||||
void check_for_comments(FILE *t_fp) {
|
void check_for_comments(FILE *t_fp) {
|
||||||
char c;
|
char c;
|
||||||
@ -72,9 +72,9 @@ void check_for_comments(FILE *t_fp) {
|
|||||||
* Lit la taille des données image et les écrit dans le conteneur d’images
|
* Lit la taille des données image et les écrit dans le conteneur d’images
|
||||||
* passé en argument.
|
* passé en argument.
|
||||||
*
|
*
|
||||||
* \param[in] fp Fichier ppm où lire les données
|
* \param[in] t_fp Fichier ppm où lire les données
|
||||||
* \param[out] img Conteneur d’image où écrire les résultats
|
* \param[out] t_img Conteneur d’image où écrire les résultats
|
||||||
* \param[in] filename Nom du fichier ouvert
|
* \param[in] t_filename Nom du fichier ouvert
|
||||||
*/
|
*/
|
||||||
void read_file_size(FILE *t_fp, Image *t_img, const char *t_filename) {
|
void read_file_size(FILE *t_fp, Image *t_img, const char *t_filename) {
|
||||||
if (fscanf(t_fp, "%lu %lu", &t_img->x, &t_img->y) != 2) {
|
if (fscanf(t_fp, "%lu %lu", &t_img->x, &t_img->y) != 2) {
|
||||||
@ -87,8 +87,8 @@ void read_file_size(FILE *t_fp, Image *t_img, const char *t_filename) {
|
|||||||
* Vérifie le format RGB de l’image ppm. Si le format n’est pas correct, la
|
* Vérifie le format RGB de l’image ppm. Si le format n’est pas correct, la
|
||||||
* fonction arrête le processus qui renverra la valeur `1`.
|
* fonction arrête le processus qui renverra la valeur `1`.
|
||||||
*
|
*
|
||||||
* \param[in] fp Fichier ppm où lire les données
|
* \param[in] t_fp Fichier ppm où lire les données
|
||||||
* \param[in] filename Nom du fichier ouvert
|
* \param[in] t_filename Nom du fichier ouvert
|
||||||
*/
|
*/
|
||||||
void read_rgb(FILE *t_fp, const char *t_filename) {
|
void read_rgb(FILE *t_fp, const char *t_filename) {
|
||||||
char d;
|
char d;
|
||||||
@ -106,24 +106,28 @@ void read_rgb(FILE *t_fp, const char *t_filename) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long read_data(FILE *t_fp, Image *t_img, unsigned char **t_data,
|
/**
|
||||||
const char *t_filename) {
|
* \brief function description
|
||||||
unsigned long size;
|
*
|
||||||
/* allocation memoire */
|
* Lit les données images brutes du fichier ppm ouvert et les stocke dans \p
|
||||||
size = t_img->x * t_img->y * 3;
|
* t_data.
|
||||||
DEBUG {
|
*
|
||||||
printf("Size image %lu %lu => %lu\n", t_img->x, t_img->y,
|
* \param[in] t_fp Fichier ppm ouvert source
|
||||||
t_img->x * t_img->y);
|
* \param[in] t_size Taille des données brutes
|
||||||
}
|
* \param[out] t_data Pointeur vers le tableau de sortie des données brutes
|
||||||
*t_data = (unsigned char *)malloc((size_t)size * sizeof(unsigned char));
|
* \param[in] t_filename Nom du fichier d’entrée
|
||||||
|
* \return Taille du tableau de données obtenu
|
||||||
|
*/
|
||||||
|
void read_data(FILE *t_fp, uint64_t t_size, unsigned char **t_data,
|
||||||
|
const char *t_filename) {
|
||||||
|
*t_data = (unsigned char *)malloc(t_size * sizeof(unsigned char));
|
||||||
assert(*t_data);
|
assert(*t_data);
|
||||||
/* read pixel data from file */
|
/* read pixel data from file */
|
||||||
if (!fread(*t_data, (size_t)1, (size_t)size, t_fp)) {
|
if (!fread(*t_data, (size_t)1, t_size, t_fp)) {
|
||||||
fprintf(stderr, "Error loading image '%s'\n", t_filename);
|
fprintf(stderr, "Error loading image '%s'\n", t_filename);
|
||||||
free(*t_data);
|
free(*t_data);
|
||||||
exit(FILE_IO_ERROR);
|
exit(FILE_IO_ERROR);
|
||||||
}
|
}
|
||||||
return size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,12 +136,11 @@ unsigned long read_data(FILE *t_fp, Image *t_img, unsigned char **t_data,
|
|||||||
* tableau de pixels multipliée par trois du fait des trois emplacements séparés
|
* tableau de pixels multipliée par trois du fait des trois emplacements séparés
|
||||||
* par couleur.
|
* par couleur.
|
||||||
*
|
*
|
||||||
* \param[out] img Image dont les pixels doivent être convertis
|
* \param[out] t_img Image dont les pixels doivent être convertis
|
||||||
* \param[in] data Données à convertir en structures \ref Pixel
|
* \param[in] t_data Données à convertir en structures \ref Pixel
|
||||||
* \param[in] size Taille du tableau de `unsigned char`
|
* \param[in] t_size Taille du tableau de `unsigned char`
|
||||||
* \return return type
|
|
||||||
*/
|
*/
|
||||||
void dataToImage(Image *t_img, unsigned char *t_data, unsigned long t_size) {
|
void dataToImage(Image *t_img, uint8_t *t_data, uint64_t t_size) {
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
t_img->pixels = darrayNew(sizeof(Pixel));
|
t_img->pixels = darrayNew(sizeof(Pixel));
|
||||||
printf("Size of data: %lu\n", t_size);
|
printf("Size of data: %lu\n", t_size);
|
||||||
@ -149,18 +152,18 @@ void dataToImage(Image *t_img, unsigned char *t_data, unsigned long t_size) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Convertit le vecteur de pixels d’un conteneur d’image en un tableau de
|
* Convertit le vecteur de pixels d’un conteneur d’image en un tableau de
|
||||||
* valeurs de type `GLuint` afin de permettre l’écriture d’une image dans un
|
* valeurs de type `uint8_t` afin de permettre l’écriture d’une image dans un
|
||||||
* fichier.
|
* fichier.
|
||||||
*
|
*
|
||||||
* \param[in] img Conteneur d’image contenant les pixels à convertir
|
* \param[in] t_img Conteneur d’image contenant les pixels à convertir
|
||||||
* \return Tableau de pointeurs de `GLuint`
|
* \return Tableau de pointeurs de `uint8_t`
|
||||||
*/
|
*/
|
||||||
unsigned char *imageToData(Image *t_img) {
|
uint8_t *imageToData(Image *t_img) {
|
||||||
Pixel *pixel;
|
Pixel *pixel;
|
||||||
unsigned char *data, size;
|
uint8_t *data, size;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
size = (unsigned char)darraySize(t_img->pixels);
|
size = (uint8_t)darraySize(t_img->pixels);
|
||||||
data = (unsigned char *)malloc(3 * sizeof(unsigned char) * size);
|
data = (uint8_t *)malloc(3 * sizeof(uint8_t) * size);
|
||||||
for (i = 0; i < size; i += 3) {
|
for (i = 0; i < size; i += 3) {
|
||||||
pixel = darrayGet(t_img->pixels, i / 3);
|
pixel = darrayGet(t_img->pixels, i / 3);
|
||||||
data[i] = pixel->r;
|
data[i] = pixel->r;
|
||||||
@ -176,20 +179,25 @@ unsigned char *imageToData(Image *t_img) {
|
|||||||
* lequel les données et l'image seront manipulables. Retourne la valeur 1 en
|
* lequel les données et l'image seront manipulables. Retourne la valeur 1 en
|
||||||
* cas de succès.
|
* cas de succès.
|
||||||
*
|
*
|
||||||
* \param[in] filename Nom du fichier image à ouvrir
|
* \param[in] t_filename Nom du fichier image à ouvrir
|
||||||
* \param[out] img Objet \ref Image manipulable
|
* \param[out] t_img Objet \ref Image manipulable
|
||||||
* \return Retourne 1 en cas de succès
|
* \return Retourne 1 en cas de succès
|
||||||
*/
|
*/
|
||||||
int imageLoadPPM(const char *t_filename, Image *t_img) {
|
int imageLoadPPM(const char *t_filename, Image *t_img) {
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
unsigned long size;
|
uint64_t size;
|
||||||
unsigned char *data = NULL;
|
unsigned char *data = NULL;
|
||||||
fp = get_file(t_filename, "rb"); /* open PPM file for reading */
|
fp = get_file(t_filename, "rb"); /* open PPM file for reading */
|
||||||
read_file_format(fp, t_filename); /* read image format */
|
read_file_format(fp, t_filename); /* read image format */
|
||||||
check_for_comments(fp); /* check for comments */
|
check_for_comments(fp); /* check for comments */
|
||||||
read_file_size(fp, t_img, t_filename); /* read image size information */
|
read_file_size(fp, t_img, t_filename); /* read image size information */
|
||||||
read_rgb(fp, t_filename); /* read rgb component */
|
read_rgb(fp, t_filename); /* read rgb component */
|
||||||
size = read_data(fp, t_img, &data, t_filename); /* read data from file */
|
DEBUG {
|
||||||
|
printf("Size image %lu %lu => %lu\n", t_img->x, t_img->y,
|
||||||
|
t_img->x * t_img->y);
|
||||||
|
}
|
||||||
|
size = t_img->x * t_img->y * 3;
|
||||||
|
read_data(fp, size, &data, t_filename); /* read data from file */
|
||||||
dataToImage(t_img, data, size);
|
dataToImage(t_img, data, size);
|
||||||
free(data);
|
free(data);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -200,12 +208,12 @@ int imageLoadPPM(const char *t_filename, Image *t_img) {
|
|||||||
() * Ouvre le fichier image avec son nom de fichier passé par le paramètre
|
() * Ouvre le fichier image avec son nom de fichier passé par le paramètre
|
||||||
* `filename` et y écrit les informations trouvées dans l’objet `img`.
|
* `filename` et y écrit les informations trouvées dans l’objet `img`.
|
||||||
*
|
*
|
||||||
* \param[in] filename Nom du fichier image à ouvrir
|
* \param[in] t_filename Nom du fichier image à ouvrir
|
||||||
* \param[in] img Objet \ref Image à écrire
|
* \param[in] t_img Objet \ref Image à écrire
|
||||||
*/
|
*/
|
||||||
void imageSavePPM(char *t_filename, Image *t_img) {
|
void imageSavePPM(char *t_filename, Image *t_img) {
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
unsigned char *data;
|
uint8_t *data;
|
||||||
fp = get_file(t_filename, "wb"); /* open file for output */
|
fp = get_file(t_filename, "wb"); /* open file for output */
|
||||||
/* write the header file */
|
/* write the header file */
|
||||||
fprintf(fp, "P6\n"); /* image format */
|
fprintf(fp, "P6\n"); /* image format */
|
||||||
|
22
src/ppm.h
22
src/ppm.h
@ -13,25 +13,25 @@
|
|||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
/// \brief Ouvre un fichier avec les autorisations demandées
|
/// \brief Ouvre un fichier avec les autorisations demandées
|
||||||
FILE *get_file(const char *filename, const char *mode);
|
FILE *get_file(const char *t_filename, const char *t_mode);
|
||||||
/// \brief Lit le format d’un fichier ppm ouvert
|
/// \brief Lit le format d’un fichier ppm ouvert
|
||||||
void read_file_format(FILE *fp, const char *filename);
|
void read_file_format(FILE *t_fp, const char *t_filename);
|
||||||
/// \brief Vérifie et ignore d’éventuels commentaires du header d’un fichier
|
/// \brief Vérifie et ignore d’éventuels commentaires du header d’un fichier
|
||||||
void check_for_comments(FILE *fp);
|
void check_for_comments(FILE *t_fp);
|
||||||
/// \brief Lit les dimensions du fichier ppm ouvert
|
/// \brief Lit les dimensions du fichier ppm ouvert
|
||||||
void read_file_size(FILE *fp, Image *img, const char *filename);
|
void read_file_size(FILE *t_fp, Image *t_img, const char *t_filename);
|
||||||
/// \brief Lit et vérifie le format RGB du fichier ppm
|
/// \brief Lit et vérifie le format RGB du fichier ppm
|
||||||
void read_rgb(FILE *fp, const char *filename);
|
void read_rgb(FILE *t_fp, const char *t_filename);
|
||||||
/// \brief Lit dans le conteneur les données images du fichier ppm
|
/// \brief Lit dans le conteneur les données images du fichier ppm
|
||||||
unsigned long read_data(FILE *fp, Image *img, unsigned char **data,
|
void read_data(FILE *t_fp, uint64_t t_size, uint8_t **t_data,
|
||||||
const char *filename);
|
const char *t_filename);
|
||||||
/// \brief Convertit les données brutes de fichier vers des conteneurs de pixels
|
/// \brief Convertit les données brutes de fichier vers des conteneurs de pixels
|
||||||
void dataToImage(Image *img, unsigned char *data, unsigned long size);
|
void dataToImage(Image *t_img, uint8_t *t_data, uint64_t t_size);
|
||||||
/// \brief Convertit les pixels d’une image en tableau natif OpenGL
|
/// \brief Convertit les pixels d’une image en tableau natif OpenGL
|
||||||
unsigned char *imageToData(Image *img);
|
unsigned char *imageToData(Image *t_img);
|
||||||
/// \brief Ouverture et lecture de l’image d’entrée
|
/// \brief Ouverture et lecture de l’image d’entrée
|
||||||
int imageLoadPPM(const char *filename, Image *img);
|
int imageLoadPPM(const char *t_filename, Image *t_img);
|
||||||
/// \brief Ouverture et écriture de l'image de sortie
|
/// \brief Ouverture et écriture de l'image de sortie
|
||||||
void imageSavePPM(char *filename, Image *img);
|
void imageSavePPM(char *t_filename, Image *t_img);
|
||||||
|
|
||||||
#endif /* SRC_PPM_H_ */
|
#endif /* SRC_PPM_H_ */
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
* Créé un nouveau pixel initialisé avec les arguments `r`, `g` et `b` et
|
* Créé un nouveau pixel initialisé avec les arguments `r`, `g` et `b` et
|
||||||
* renvoie un pointeur vers ce pixel créé.
|
* renvoie un pointeur vers ce pixel créé.
|
||||||
*
|
*
|
||||||
* \param[in] r Valeur rouge du pixel
|
* \param[in] t_r Valeur rouge du pixel
|
||||||
* \param[in] g Valeur verte du pixel
|
* \param[in] t_g Valeur verte du pixel
|
||||||
* \param[in] b Valeur bleue du pixel
|
* \param[in] t_b Valeur bleue du pixel
|
||||||
* \return Pointeur sur une structure de type \ref Pixel
|
* \return Pointeur sur une structure de type \ref Pixel
|
||||||
*/
|
*/
|
||||||
Pixel *newPixel(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
|
Pixel *newPixel(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
|
||||||
@ -50,7 +50,7 @@ Image *newImage() {
|
|||||||
* destructeur libérera la structure \ref Image pointée par le pointeur passé
|
* destructeur libérera la structure \ref Image pointée par le pointeur passé
|
||||||
* en argument.
|
* en argument.
|
||||||
*
|
*
|
||||||
* \param[in] self Conteneur d’image à détruire
|
* \param[in] t_self Conteneur d’image à détruire
|
||||||
*/
|
*/
|
||||||
void deleteImage(Image *t_self) {
|
void deleteImage(Image *t_self) {
|
||||||
DEBUG { printf("deleted all pixels\n"); }
|
DEBUG { printf("deleted all pixels\n"); }
|
||||||
@ -63,15 +63,14 @@ void deleteImage(Image *t_self) {
|
|||||||
* valeurs qu’il contiendra avec les arguments qui lui seront passés lors de
|
* valeurs qu’il contiendra avec les arguments qui lui seront passés lors de
|
||||||
* l’appel de la fonction.
|
* l’appel de la fonction.
|
||||||
*
|
*
|
||||||
* \param[in] y Ordonnée à laquelle le segment réside
|
* \param[in] t_right_limit Abscisse extrême droite du segment
|
||||||
* \param[in] xd Abscisse extrême droite du segment
|
* \param[in] t_left_limit Abscisse extrême gauche du segment
|
||||||
* \param[in] xg Abscisse extrême gauche du segment
|
|
||||||
* \return Pointeur sur un conteneur de segment
|
* \return Pointeur sur un conteneur de segment
|
||||||
*/
|
*/
|
||||||
Segment *newSegment(uint32_t t_xd, uint32_t t_xg) {
|
Segment *newSegment(uint32_t t_right_limit, uint32_t t_left_limit) {
|
||||||
Segment *res = (Segment *)malloc(sizeof(Segment));
|
Segment *res = (Segment *)malloc(sizeof(Segment));
|
||||||
res->xd = t_xd;
|
res->right_limit = t_right_limit;
|
||||||
res->xg = t_xg;
|
res->left_limit = t_left_limit;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,9 +81,9 @@ Segment *newSegment(uint32_t t_xd, uint32_t t_xg) {
|
|||||||
* de la zone et initialise un tableau dynamique vide de \ref Segment. Renvoie
|
* de la zone et initialise un tableau dynamique vide de \ref Segment. Renvoie
|
||||||
* un pointeur vers la structure nouvellement créée.
|
* un pointeur vers la structure nouvellement créée.
|
||||||
*
|
*
|
||||||
* \param[in] r Valeur rouge de la couleur de la zone
|
* \param[in] t_r Valeur rouge de la couleur de la zone
|
||||||
* \param[in] g Valeur verte de la couleur de la zone
|
* \param[in] t_g Valeur verte de la couleur de la zone
|
||||||
* \param[in] b Valeur bleue de la couleur de la zone
|
* \param[in] t_b Valeur bleue de la couleur de la zone
|
||||||
* \return Pointeur vers la structure créée
|
* \return Pointeur vers la structure créée
|
||||||
*/
|
*/
|
||||||
Zone *newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
|
Zone *newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
|
||||||
@ -100,6 +99,6 @@ Zone *newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
|
|||||||
* Destructeur de zone, libère la zone mémoire utilisée pour stocker les
|
* Destructeur de zone, libère la zone mémoire utilisée pour stocker les
|
||||||
* segments. Ne libère pas \p t_self lui-même mais son membre `segments`.
|
* segments. Ne libère pas \p t_self lui-même mais son membre `segments`.
|
||||||
*
|
*
|
||||||
* \param[in] self Conteneur de zone à détruire
|
* \param[in] t_self Conteneur de zone à détruire
|
||||||
*/
|
*/
|
||||||
void deleteZoneContent(Zone *t_self) { darrayDelete(t_self->segments); }
|
void deleteZoneContent(Zone *t_self) { darrayDelete(t_self->segments); }
|
||||||
|
@ -67,7 +67,7 @@ struct Pixel {
|
|||||||
uint8_t r; /*!< Couleur rouge du pixel */
|
uint8_t r; /*!< Couleur rouge du pixel */
|
||||||
uint8_t g; /*!< Couleur verte du pixel */
|
uint8_t g; /*!< Couleur verte du pixel */
|
||||||
uint8_t b; /*!< Couleur bleue du pixel */
|
uint8_t b; /*!< Couleur bleue du pixel */
|
||||||
unsigned char visited; /*!< Le pixel a-t-il été visité avant */
|
uint8_t visited; /*!< Le pixel a-t-il été visité avant */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,8 +91,8 @@ struct Zone {
|
|||||||
* à son extrême droite et à son extrême gauche.
|
* à son extrême droite et à son extrême gauche.
|
||||||
*/
|
*/
|
||||||
struct Segment {
|
struct Segment {
|
||||||
uint32_t xd; /*!< extrême droit du segment */
|
uint32_t right_limit; /*!< extrême droit du segment */
|
||||||
uint32_t xg; /*!< extrême gauche du segment */
|
uint32_t left_limit; /*!< extrême gauche du segment */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -106,7 +106,7 @@ Image *newImage();
|
|||||||
/// \brief Destructeur d’une image
|
/// \brief Destructeur d’une image
|
||||||
void deleteImage(Image *t_self);
|
void deleteImage(Image *t_self);
|
||||||
/// \brief Constructeur d’un segment de couleur unie
|
/// \brief Constructeur d’un segment de couleur unie
|
||||||
Segment *newSegment(uint32_t t_xd, uint32_t t_xg);
|
Segment *newSegment(uint32_t t_right_limit, uint32_t t_left_limit);
|
||||||
/// \brief Constructeur de conteneur de zone
|
/// \brief Constructeur de conteneur de zone
|
||||||
Zone *newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b);
|
Zone *newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b);
|
||||||
/// \brief Destructeur de conteneur de zone
|
/// \brief Destructeur de conteneur de zone
|
||||||
|
Loading…
Reference in New Issue
Block a user