2012-06-09

PngOptimizer 2.1

Une nouvelle version de PngOptimizer. Pas de gros chamboulements cette année : côté moteur d'optimisation, ce dernier sait désormais gérer les informations de résolution de pixel. Le reste des modifications concerne des améliorations d'IHM. Voici le changelog en français :

  • nouveau : option pour garder ou forcer les dimensions physiques des pixels (chunk pHYs)

Plus d'info : la difficulté ici consiste à stocker des mesures en pixels par mètre (PPM), imposé par le format PNG, alors que l'usage des pixels par pouce (PPI) est beaucoup plus courante. Dans l'IHM de PngOptimizer, je propose de saisir les deux unités. Mais alors, comment restituer des PPI exacts à partir de PPM, sachant qu'il y a de la perte d'information lors de la conversion de l'un en l'autre ?

Ma première approche a constitué à partir de l'hypothèse suivante : les logiciels d'affichage ou de dessin convertissent les PPM en tronquant le résultat de la conversion, il faut donc stocker un PPM légèrement sur-évalué pour que le retour aux PPI tombe juste.

Mettons que l'on souhaite stocker 300 PPI (les opérations se font sur des entiers) :

(300 × 10000) ÷ 254 = 11811

Opération inverse :

(11811 × 254) ÷ 10000 = 299 <- Perte d'information !

Mais avec 11812 :

(11812 × 254) ÷ 10000 = 300

Cependant, après avoir préparé une image en 11812 PPM, je me suis rendu compte que les logiciels dans lesquels je l'ouvrais m'indiquait du 300.02 PPI. En utilisant 11811 PPM en revanche, j'obtenais un beau 300.00 PPI, et non 299.99 comme je m'y attendais. Les logiciels que j'ai testés sont Paint.net, TweakPNG et XnView.

Je suis donc tombé sur une convention pour laquelle je n'ai pas trouvé de règle écrite : la conversion PPM vers PPI doit se faire avec un arrondi, et pas une troncature. Par conséquent j'ai changé ma formule pour prendre en compte cela :

 (11811 × 254 + 5000) ÷ 10000 = 300 <- On retrouve nos 300 PPI
  • nouveau : meilleure compatibilité avec les anciennes versions de Windows (uniquement les Windows à noyau NT)

Plus d'info : bien que PngOptimizer dépende très peu de la libc fournie avec tout compilateur C++, j'ai découvert que depuis certaines versions de Visual C++, la libc fournie utilise une fonction présente uniquement à partir de Windows XP SP3. Sans que je m'en aperçoive, je me suis retrouvé avec un PngOptimizer 2.0 incompatible avec les précédentes versions de Windows.

J'ai trouvé une astuce pour dérouter la fonction en question vers du code embarqué par PngOptimizer, afin de garantir à nouveau la compatibilité. Il s'agit de la fonction EncodePointer (et sa fonction symétrique DecodePointer) qui permet de camoufler la valeur d'un pointeur dans l'objectif d'augmenter la sécurité au sein d'un programme. À noter que pour la version x64 de PngOptimizer, j'ai conservé la fonction d'origine, puisque dans ce cas je ne cible que Vista et Seven, donc pas de problème de compatibilité.

  • nouveau : l'icône de la barre des tâches sous Windows Seven indique qu'une optimisation est en cours

Plus d'info : l'indicateur sur l'icône n'est pas une barre de progression, juste un effet d'activité. En effet, il est difficile de connaitre à l'avance les différentes chemins d'optimisation que prendront les images, et donc d'évaluer un total de progression. Il doit exister une solution mais pour ça, je dois remettre plus profondément le nez dans les stratégies d'optimisation. J'espère faire d'une pierre deux coups quand je passerai à de l'optimisation multi-threadée, puisque il faut dans ce cas pouvoir affecter les différents chemins parmi tous les threads.

  • nouveau : meilleur positionnement des boites de dialogue, notamment avec deux écrans

Plus d'info : il s'agit d'un vrai casse-tête sous Windows. En effet, le positionnement optimal d'une fenêtre doit être fait à la main par l'application. De plus, les fonctions de positionnement de fenêtre ont des bugs dans certaines circonstances, comme l'utilisation de coordonnées à 0 sur un 2e moniteur. Et pour couronner le tout, les fonctions retournant la taille d'une fenêtre ont des comportements différents selon la version de Windows, notamment concernant le rebord des fenêtres Aero sous Seven qui n'est pas pris en compte.

  • nouveau : on peut faire défiler la liste au clavier
  • nouveau : à la fin de l'optimisation de deux fichiers ou plus, « Done » est écrit dans la fenêtre
  • nouveau : on peut redimensionner la fenêtre de choix du dossier des captures d'écran

Bonnes optimisations :)