surfaces-unies/src/utilities.h

132 lines
4.6 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 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 r, uint8_t g, uint8_t b);
/// \brief Destruction dun pointeur de pixel
void deletePixel(Pixel_t self);
/// \brief Création dune nouvelle image
Image_t newImage();
/// \brief Destructeur dune image
void deleteImage(Image_t self);
/// \brief Constructeur dun segment de couleur unie
Segment_t newSegment(uint64_t y, uint64_t xd, uint64_t xg);
/// \brief Destructeur dun segment de couleur unie
void deleteSegment(Segment_t self);
/// \brief Constructeur de conteneur de zone
Zone_t newZone(uint8_t r, uint8_t g, uint8_t b);
/// \brief Destructeur de conteneur de zone
void deleteZone(Zone_t self);
#endif /* UTILITIES_H */