LowPixels

Voici un petite bibliothèque en C, très rudimentaire qui permettra de :
- Afficher des pixels le plus rapidement possible.
- Lire les données brut du clavier et de la souris.
- C'est tout.

L'idée de cette bibliothèque est de proposer des fonctionnalités les plus élémentaires possibles, afin de permettre de partir du plus bas niveau pour réaliser des choses graphiques "from scratch" avec des bonnes performances.

Alors on peut se dire "Afficher des pixels est quand même la base du graphisme ! Donc pourquoi créer une bibliothèque pour faire ça ? ça doit être trivial non ?"
Et bien plus maintenant... Si vous souhaitez savoir pourquoi - et ce n'est pas une obligation pour continuer - je vous invite à le voir en suivant ce lien :

Histoire des pixels


Header simplifié

Vous pouvez constater que je ne fais aucun include dans ce header, et que je n'utilise que des types natifs.

Avant de détailler les structures, regardons les 3 fonctions :
- La fonction LowPixCreateWindow. Vous lui donnez un titre (par exemple "test"), une position posx,posy à l'écran, une largeur et hauteur x,y qui sera la largeur de la zone dans laquelle vous dessinerez. Et la fonction vous renvoie un pointeur vers une structure LowPixels.
- La fonction LowPixFree, elle, désalloue tout et ferme la fenêtre proprement. Elle renvoie NULL.
- La fonction LowPixFlip, elle, mettra a jour ce que vous avez rempli dans la structure. A mettre dans votre boucle principale.

La structure LowPixSurface définit une surface : une largeur x, une hauteur y, et ensuite une zone mémoire de taille 4*x*y.
Je considère en effet 4 octet par pixels, RGBA, nous verrons mieux cela avec les fonctions inline ci dessous.

Ensuite, ma structure principale LowPixels. C'est avec elle que tout va se faire. Après avoir appelé LowPixCreateWindow, vous avez accès à tout : vous pouvez modifier directement l'espace mémoire sous srf->raw pour changer un pixel.
Vous pouvez également lire à tout moment les champs d'entrée suivant :
- alive : est à 1 par défaut. Si vous fermez la fenêtre, il se met à 0, a vous de faire un LowPixFree dans ce cas.
- xmouse, ymouse : position de la souris à tout moment, relative à la fenêtre.
- mbuttons[5] : les boutons de la souris, 1 ou 0 selon qu'il est enfoncé ou pas.
- key[256] : état du clavier pour 256 touches possibles : 1 la touche est enfoncée, 0 elle ne l'est pas. Sous mon implémentation Windows, voici : la liste des codes

Fonctions inline

Voici des fonctions pour lire ou écrire un pixel. Notez que je calcule d'abord a quel offset est mon pixel, puis je le remplis dans l'ordre B,G,R,A.
Ces fonctions sont pratiques pour lire ou écrire un pixel selon leurs valeurs RGBA, mais notez que si vous voulez écrire plusieurs pixels à la suite, il est inutile de recalculer l'offset à chaque fois, puisque le pixel suivant sera immédiatement après.

Fonctions diverses

Afin d'avoir un timer précis (car celui natif de time.h ne l'est pas), ou bien pouvoir avoir un fonction "Sleep" non standard (paramétrée en millième de secondes), j'ai rajouté deux fonctions qui appellent - sous mon implémentation Windows - les fonctions timeGetTimeet Sleep, sans devoir faire de include dans mon .h

Premier exemple

Voici un exemple qui permet de faire ce qu'il y a à droite. Je crée une fenêtre l qui aura 320*200 pixels. Et tant que je n'ai pas cliqué sur la croix, je mets des pixels au hasard sur toute la surface.
Puis je Flip pour rafraîchir la fenêtre.
Notez que si vous profilez le programme, ce qui ralentit le plus ici, c'est le rand(), ainsi que le fait qu'on recalcule l'offset de chaque pixel à chaque fois dans la fonction LowPixelsSet.

Actuellement, LowPixels n'est disponible que sous Windows. Pour une explication de son implémentation, cliquez ici.
Pour utiliser LowPixels, téléchargez le .h et le .c qui va avec, mettez les dans votre projet, et vous pouvez tout de suite démarrer.

Télécharger LowPixels

Retour