surfaces-unies/src/utilities.h
2018-11-06 16:08:20 +01:00

134 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* \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"
#include <GL/gl.h>
#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;
typedef Image *Image_t;
struct Pixel;
typedef struct Pixel Pixel;
typedef Pixel *Pixel_t;
struct Zone;
typedef struct Zone Zone;
typedef Zone *Zone_t;
struct Segment;
typedef struct Segment Segment;
typedef Segment *Segment_t;
/*****************************************************************************/
/* STRUCT IMPLEMENTATION */
/*****************************************************************************/
/**
* \brief Conteneur dune 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
* dans un tableau dynamique \ref darray_t.
*/
struct Image {
uint64_t x; /*!< Largeur de limage */
uint64_t y; /*!< Hauteur de limage */
darray_t pixels; /*!< Vecteur à une dimention de pixels */
};
/**
* \brief Conteneur dun 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 lalgorithme 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 */
darray_t segments; /*!< Vecteur de segments */
};
/**
* \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 y; /*!< ligne du segment */
uint16_t xd; /*!< extrême droit du segment */
uint16_t xg; /*!< extrême gauche du segment */
};
/*****************************************************************************/
/* Utility functions declaration */
/*****************************************************************************/
/// \brief Création dun nouveau pixel
Pixel_t newPixel(uint8_t t_r, uint8_t t_g, uint8_t t_b);
/// \brief Destruction dun pointeur de pixel
void deletePixel(Pixel_t t_self);
/// \brief Création dune nouvelle image
Image_t newImage();
/// \brief Destructeur dune image
void deleteImage(Image_t t_self);
/// \brief Constructeur dun segment de couleur unie
Segment_t newSegment(uint16_t t_y, uint16_t t_xd, uint16_t t_xg);
/// \brief Destructeur dun segment de couleur unie
void deleteSegment(Segment_t t_self);
/// \brief Constructeur de conteneur de zone
Zone_t newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b);
/// \brief Destructeur de conteneur de zone
void deleteZone(Zone_t t_self);
/// \brief Renvoie un pixel aux coordonnées `(x, y)` dans une image
Pixel_t imgAt(Image_t t_img, int t_x, int t_y);
#endif /* UTILITIES_H */