XDanger : c'est rassurant pour mon GX
En effet. Ta routine est bien écrite. Elle tire parti du fait que ta police est de taille fixe, ce qui n'est pas le cas de celle d'AMS.
J'ai désassemblé ta routine pour la première fois hier: je me suis rendu compte qu'elle écrivait en mode A_REPLACE, pas en mode A_NORMAL. C'est peut-être écrit dans la doc, mais je ne l'avais pas vu... Donc, en plus, je faisais un bench GX_DrawStr (A_REPLACE) / FS_DrawString (A_NORMAL)... Utilisant le même algorithme, la fonction FS_ReplaceString est plus lente car il faut utiliser un masque. Donc GX_DrawStr est (était ?, cf plus bas) plus rapide que FS_ReplaceString.
Mais j'ai changé un peu l'algorithme (mettant en application un truc que j'avais vu il y a un certain temps). J'ai gagné environ 20% par rapport à l'algorithme précédent si je ne ré-enroule pas les boucles, 10% en ré-enroulant la boucle. Cependant, même en laissant les boucles déroulées et en comptant la taille des routines de startup et de cleanup, la taille reste inférieure à celle de GX_DrawStr...
Quand j'aurai modifié toutes les routines génériques gérant les 3 polices (FS_DrawString, FS_InvertString, FS_ReplaceString, FS_ReverseString, FS_DrawString et FS_InvertString étant très proches), je ferai les routines gérant une seule police. Je m'occuperai en premier de FS_DrawLittleString et FS_ReplaceLittleString. C'est seulement à ce moment-là qu'on pourra faire un vrai bench GX_DrawStr (F_4x6_like) / FS_ReplaceLittleString (F_4x6).
Je sais que tout cela est de ma faute...