dimanche 4 janvier 2009

mlres - Un aggrégateur de ressources C/C++

N'est-ce pas particulièrement ennuyeux d'avoir à fournir avec son programme quantité de petits fichiers image et son? D'abord parce que l'installation en est rendue plus complexe et le nombre de bugs potentiels dus à une mauvaise version / absence du fichier est augmentée d'autant, et ensuite parce que l'utilisateur peut aller tripatouiller de ses doigts sales (l'utilisateur a les doigts sales par définition) dans les entrailles multimédia de votre chef-d'œuvre.

Windows l'avait fait via les fichiers de ressources.

Mais wxWidgets l'avait également fait avec un petit programme répondant au doux nom de wxrc, qui empaquette les ressources dans un fichier source, que l'on peut compiler avec son programme.

C'est à une version simplifiée, et surtout indépendante du framework, que je me suis attaqué ces derniers jours. Une version très beta a vu le jour, dont vous pourrez trouver le code source sur sourceforge (le paquet verra le jour quand je serai plus confiant en la stabilité du bazar).

mlres est donc un petit programme ocaml (mon langage préféré pour écrire de petits utilitaires en ligne de commande) qui lit les fichiers passés en argument, et créé un fichier source avec les données binaires.

Démonstration.


./mlres.opt -help
mlres [options] [files list]
-output Output file base name (out)
-hext Header extension (h)
-sext Source extension (cpp)
-help Display this list of options
--help Display this list of options

Allons-y donc gaiement, et essayons d'empaqueter quelques images.

./mlres.run -output resources book16.png book24.png book36.png coin32.png

Et voyons ce qu'il y a dans resources.h

extern unsigned char coin32[1992];
extern unsigned char book36[1170];
extern unsigned char book24[812];
extern unsigned char book16[516];

et resources.cpp

#include "resources.h"

unsigned char coin32[1992] = {137,80,78,71,13,10,26,10,0,0,0,13,7,[...]};
unsigned char book36[1170] = {137,80,78,71,13,10,26,10,0,0,0,13,7,[...]};
...

Le fichier compile sans soucis, et l'on peut ensuite directement charger ses ressources à partir de leur emplacement mémoire!

Bien sûr, ce genre de manœuvre est réservée à des programmes petits, qui n'ont tout au plus que quelques mégaoctets de données. Pour quoi que ce soit de plus gros, il faudra penser soit à vivre avec un répertoire contenant les données, soit à écrire son propre format de fichiers de ressources et à charger le bon bout à la volée (voir ce très bon tutoriel).

Aucun commentaire: