2018-10-21 19:42:58 +00:00
|
|
|
|
/**
|
|
|
|
|
* \file utilities.h
|
|
|
|
|
* \brief Déclaraction des structures de données et fonctions utilitaires.
|
|
|
|
|
*
|
|
|
|
|
* Dans ce fichier sont déclarées et implémentées les structures qui serviront
|
|
|
|
|
* de conteneurs aux données manipulées. Sont également déclarées les fonctions
|
|
|
|
|
* utilitaires pour la manipulation de ces structures.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef UTILITIES_H
|
|
|
|
|
#define UTILITIES_H
|
|
|
|
|
|
|
|
|
|
#include "darray.h"
|
2018-11-12 13:25:06 +00:00
|
|
|
|
/* #include <GL/gl.h> */
|
2018-10-21 19:42:58 +00:00
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* DEFINE DIRECTIVES */
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#ifdef Debug
|
|
|
|
|
#define DEBUG if (1)
|
|
|
|
|
#define PDEB \
|
|
|
|
|
if (1) \
|
|
|
|
|
printf
|
|
|
|
|
#else
|
|
|
|
|
#define DEBUG if (0)
|
|
|
|
|
#define PDBEF \
|
|
|
|
|
if (0) \
|
|
|
|
|
printf
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* STRUCT DECLARATION */
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
struct Image;
|
|
|
|
|
typedef struct Image Image;
|
|
|
|
|
struct Pixel;
|
|
|
|
|
typedef struct Pixel Pixel;
|
|
|
|
|
struct Zone;
|
|
|
|
|
typedef struct Zone Zone;
|
|
|
|
|
struct Segment;
|
|
|
|
|
typedef struct Segment Segment;
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* STRUCT IMPLEMENTATION */
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Conteneur d’une image
|
|
|
|
|
*
|
|
|
|
|
* Une image est une structure définie par ses dimensions verticales et
|
|
|
|
|
* horizontales x et y, et contenant pour chacune des coordonnées possibles
|
|
|
|
|
* selon ses dimensions un pixel de type \ref Pixel. Ces pixels sont stockés
|
2018-11-21 09:46:01 +00:00
|
|
|
|
* dans un tableau dynamique \ref darray.
|
2018-10-21 19:42:58 +00:00
|
|
|
|
*/
|
|
|
|
|
struct Image {
|
2018-11-06 15:08:20 +00:00
|
|
|
|
uint64_t x; /*!< Largeur de l’image */
|
|
|
|
|
uint64_t y; /*!< Hauteur de l’image */
|
2018-11-21 09:46:01 +00:00
|
|
|
|
darray *pixels; /*!< Vecteur à une dimention de pixels */
|
2018-10-21 19:42:58 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Conteneur d’un pixel
|
|
|
|
|
*
|
|
|
|
|
* Un pixel est défini par sa couleur représenté en RGB (rouge, vert, bleu).
|
|
|
|
|
* Il contient également une valeur booléenne afin de savoir si le Pixel fut
|
|
|
|
|
* visité précédemment par l’algorithme de compression.
|
|
|
|
|
*/
|
|
|
|
|
struct Pixel {
|
|
|
|
|
uint8_t r; /*!< Couleur rouge du pixel */
|
|
|
|
|
uint8_t g; /*!< Couleur verte du pixel */
|
|
|
|
|
uint8_t b; /*!< Couleur bleue du pixel */
|
|
|
|
|
bool visited; /*!< Le pixel a-t-il été visité avant */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Conteneur de zone de couleur unie
|
|
|
|
|
*
|
|
|
|
|
* Une zone est un ensemble de pixels de même couleur ou de couleur similaire
|
|
|
|
|
* dont on conserve uniquement les marges dans le tableau dynamique.
|
|
|
|
|
*/
|
|
|
|
|
struct Zone {
|
|
|
|
|
uint8_t r; /*!< Couleur rouge de la zone */
|
|
|
|
|
uint8_t g; /*!< Couleur verte de la zone */
|
|
|
|
|
uint8_t b; /*!< Couleur bleue de la zone */
|
2018-11-21 09:46:01 +00:00
|
|
|
|
darray *segments; /*!< Vecteur de segments */
|
2018-10-21 19:42:58 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Conteneur de segment de couleur unie
|
|
|
|
|
*
|
|
|
|
|
* Un segment est un ensemble de pixels de même ordonnée et de couleur unie ou
|
|
|
|
|
* similaire. Il se définit par son ordonnée y et de ses deux pixels de bordure
|
|
|
|
|
* à son extrême droite et à son extrême gauche.
|
|
|
|
|
*/
|
|
|
|
|
struct Segment {
|
|
|
|
|
uint16_t xd; /*!< extrême droit du segment */
|
|
|
|
|
uint16_t xg; /*!< extrême gauche du segment */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* Utility functions declaration */
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
/// \brief Création d’un nouveau pixel
|
2018-11-21 09:46:01 +00:00
|
|
|
|
Pixel *newPixel(uint8_t t_r, uint8_t t_g, uint8_t t_b);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Destruction d’un pointeur de pixel
|
2018-11-21 09:46:01 +00:00
|
|
|
|
void deletePixel(Pixel *t_self);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Création d’une nouvelle image
|
2018-11-21 09:46:01 +00:00
|
|
|
|
Image *newImage();
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Destructeur d’une image
|
2018-11-21 09:46:01 +00:00
|
|
|
|
void deleteImage(Image *t_self);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Constructeur d’un segment de couleur unie
|
2018-11-23 09:32:49 +00:00
|
|
|
|
Segment *newSegment(uint16_t t_xd, uint16_t t_xg);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Destructeur d’un segment de couleur unie
|
2018-11-21 09:46:01 +00:00
|
|
|
|
void deleteSegment(Segment *t_self);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Constructeur de conteneur de zone
|
2018-11-21 09:46:01 +00:00
|
|
|
|
Zone* newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
/// \brief Destructeur de conteneur de zone
|
2018-11-21 09:46:01 +00:00
|
|
|
|
void deleteZone(Zone *t_self);
|
2018-11-06 15:08:20 +00:00
|
|
|
|
/// \brief Renvoie un pixel aux coordonnées `(x, y)` dans une image
|
2018-11-21 09:46:01 +00:00
|
|
|
|
Pixel *imgAt(Image *t_img, int t_x, int t_y);
|
2018-10-21 19:42:58 +00:00
|
|
|
|
|
|
|
|
|
#endif /* UTILITIES_H */
|