2006-01-07

PngOptimizer 1.53

Et hop, chose promise, chose due ^^

J'ai de nouveau trouvé un crash gênant dans la version 1.52 à la lecture de certaines images BMP, problème qui m'a d'ailleurs été remonté également par Xavier Robin (merci !). Je n'ai pas bien compris comment cette régression était apparue, je pensais que mon code de décodage BMP était stable depuis pas mal de temps.

Toujours est-il que pour lutter contre ces régressions d'origine extra-terrestre, j'ai mis en place un jeu d'essai d'une quarantaine d'images pour tester et valider tous les chemins de code possibles de la routine de lecture de BMP. J'en ai aussi profité pour ajouter le support des BMP 16 bits au format 1555 : 1 bit qui ne sert à rien, et 5 bits pour le rouge, le vert et le bleu ; c'est le format qu'enregistre Photoshop. Il paraitrait que certains logiciels font du 565, mais je ne gère pas ce format, n'ayant pas trouvé beaucoup de documentation sur les BMP 16 bits.

Concernant le PNG, je n'ai pas noté de problème, j'utilisais déjà l'excellent jeu d'essai PNG Suite de Willem van Schaik.

J'ai aussi corrigé un bug qui m'avait été indiqué une fois mais sans que la personne en question puisse m'en dire davantage. Ça concerne le positionnement de la fenêtre après fermeture dans l'état icônifié. Je remercie Constance qui m'a apporté de précieuses informations. À présent le code qui gère la position initiale de la fenêtre est un peu plus évolué (davantage d'info dans le « readme »).

À part ça j'ai ajouté de quoi effacer la liste via le menu contextuel, ou via un raccourci clavier : Ctrl+Shift+Suppr, comme pour effacer la playlist dans Winamp ^^ Par sécurité j'ai de ce fait ajouté un mécanisme de section critique, si jamais l'utilisateur demande d'effacer la liste alors qu'au même moment le thread de travail souhaite écrire dedans.

J'ai par ailleurs enfin compris la différence entre une « section critique » et une « exclusion mutuelle » sous Windows (CriticalSection & Mutex). Les deux offrent le même mécanisme à la base : protéger un bout de code pour qu'un seul thread à la fois l'exécute, mais une CriticalSection est locale à un processus et mange moins de temps machine qu'un Mutex. Le Mutex est global au système (il a d'ailleurs un nom sous forme d'une chaine) et son utilisation est plus gourmande en ressources.

Il y a quand même un Mutex dans PngOptimizer, mais il ne sert qu'à savoir si une instance tourne déjà (il ne peut y avoir qu'un seul Mutex avec un nom donné dans le système, ici en l'occurrence il s'appelle « PngOptimizer mutex »). Si une instance tourne déjà, la nouvelle fenêtre sera légèrement décalée par rapport à la précédente. C'est un article de Raymond Chen qui m'a inspiré :)