libimage: les listes de points

dernière mise à jour: 15 octobre 2013

L'origine de ce concept se perd dans la nuit des temps, probablement aux alentours de 1998... Je n'ai pas le moindre souvenir de pourquoi j'ai commencé à imaginer ça. Mais il y a déja un peu de code écrit, autant que ça serve à quelque chose. Commençons par les concepts de base.

Un point et une liste de points, c'est quoi ?

Comme un point se réfère à une image, il va forcément avoir les coordonnées d'un pixel, donc un tuple x,y. Ensuite, nous avons deux attributs: le premier est assimilable à la "hauteur" de ce point dans le champ virtuel du monde pixelisé, et le second est laissé à l'imagination du codeur (pourquoi pas un index dans une LUT de couleurs ?) qui veut utiliser le kluge. Pour des raisons historiques d'occupation mémoire, toutes ces coordonnées sont stockées sur 16 bits. Désolé.

typedef struct
	{
	short		x, y;			/* pixel position */
	short		h;			/* pixel value */
	short		c;			/* color index ? */
	} Image_Point;

Ensuite, pour manipuler des ensembles de points, nous les regrouperons dans des listes de, justement, points. A priori, le descripteur d'une liste de points n'est pas une structure publique, du moins, tant qu'elle n'est pas à peu près figée.

Fonctions de bases

Image_PtList * Image_ptl_alloc(int nbre, char *name);
Allocation d'une liste de points. nbre étant le nombre de points initialement alloués et name un texte arbitraire d'une taille limitée. La taille est dynamique, c'est à dire qu'une liste de points peut grossir à la demande.
int Image_ptl_kill(Image_PtList *ptl, char *msg);
Destruction d'une liste et probable récupération de la mémoire utilisée. Si NULL != msg, un message est éventuellement affiché sur stderr.
int Image_ptl_get_size(Image_PtList *ptl, int *nbre, int *alloc);
Récupère le nombre de points effectif dans la liste, et la place disponible actuelle. On peut passer NULL si on ne veut pas récupérer une des valeurs.
int Image_ptl_add(Image_PtList *ptl, int x, int y, int h, int c);
Ajout d'un point à une liste, en augmentant éventuellement la taille de celle-ci, la taille de la liste étant limité par la mémoire disponible, au bon vouloir du OOMK farceur. Il n'est actuellement pas possible d'enlever un point de la liste.
int Image_ptl_get(Image_PtList *ptl, Image_Point *pt, int idx);
Lecture d'un point depuis une liste. Coredumpe peut-être, mais pas trop souvent.
int Image_ptl_boundingbox(Image_PtList *ptl, Image_Rect *box);
Calcul de la boite qui englobe en x/y tous les points d'une liste. Il traine probablement une off-by-one erreur dans le code. Utilisez Image_dump_rect pour afficher le résultat.

On peut, bien entendu, mettre ces listes de points dans des fichiers.

haut de page