Я думал это дело пяти минут, просто убрал в одном месте функцию upperCase(), запустил и...
Буквы взбунтовались и вышли из шеренги! Это бесячий баг, потому что на первый взгляд вроде все почти нормально, почти... но что-то сразу ощущается не так (и выравнивание поехало)
Исходные данные:
- шрифт растровый, то есть все буквы заранее отрендерены как картинки в некотором, заведомо большем, разрешении
- все тексты в игре выводились этим шрифтом в разных масштабах и все было хорошо
Поиск:
Потратил два чаcа... Ну, полтора. Пробовал и так, и этак, видел разные интересные эффекты (при выравнивании слов относительно иконки и масштабировании эффект наиболее заметен, если убрать хоть одну операцию - эффект исчезал).
Наконец, понял - я пал жертвой сэмплирования. Другими словами, если мы уменьшаем растровую картинку - неизбежны потери. Эти потери минимальны, когда коэффициент масштабирования близок к двум. Не хочу тут еще картинку впихивать, на пальцах объясню:
Шесть пикселей OOOOOO пропорционально делятся только на два - OOO | OOO --> OOO
Если я хочу уменьшить картинку в N, где N - не степень двойки, возможны искажения. Вступает в силу эффект "неделимой единицы", OOOO | OO -> три или два пикселя, мы не можем получить дробное число пикселей. При округлении до ближайшего целого мы получаем погрешность, которая обычно незаметна в большинстве случаев.
Движок, конечно, очень старается компенсировать все работы с растром, поэтому к примеру, вместо двух пикселей будет два пикселя черного цвета и один полупрозрачный. Но потери пикселей неизбежны - и это очень сильно заметно на буквах в нижнем регистре, которые более изящны и тонки, чем в верхнем регистре.
Буквы d и i в слове disease - уходят вверх как раз на 1 пиксель от своего законного места.
Решение
Пришлось для фишек сделать дополнительный растровый шрифт, сразу выведя буквы в нужном размере - и в самом игровом движке задавать только этот размер. Я не хотел этого, это дополнительный ресурсный файл. Да и когда все буквы были в верхнем регистре - все масштабировалось нормально. Но маленькие буквы нижнего регистра оказались слишком нежными.
Нежные картинки лучше не растягивать и не сжимать )