Я пытаюсь собрать инструмент, который проверяет, отображается ли данный символ шрифтом указанного стиля или системным шрифтом по умолчанию.Моя конечная цель - проверить, по крайней мере, в современных браузерах (читай: IE8 +), поддерживается ли лигатура заданным шрифтом.
У меня есть два полотна с одинаковой лигатурой (в этомдело, ст).Я превращаю эти холсты в данные и сравниваю их, чтобы увидеть, совпадают ли символы.
Arial (как и большинство шрифтов) не имеет лигатуры st, поэтому он возвращается к шрифту с засечками по умолчанию.Вот где это становится странным: хотя они отображают один и тот же шрифт, два полотна не имеют одинаковых данных .
Почему?Потому что их позиции на холсте не совпадают.Я предполагаю, что это как-то связано с разной относительной высотой шрифтов (один немного выше другого, хотя от шрифта к шрифту меняется).Разница, кажется, составляет один или два пикселя, и она меняется шрифтом за шрифтом.
Как можно решить эту проблему?Моя единственная текущая идея - найти способ измерить высоту шрифта и соответственно отрегулировать его положение, но я, к сожалению, понятия не имею, как это сделать.Могу ли я использовать другие подходы, чтобы сделать два идентичных изображения одинаковыми?
Вы можете увидеть код ниже.Оба полотна успешно инициализированы и добавлены в тело элемента, так что я могу видеть, что происходит визуально (хотя в реальном сценарии, над которым я работаю, это не обязательно).Я отбросил инициализацию и контекст, так как все они работают просто отлично.
function checkLig() {
lig = 'fb06' // this is the unicode for the st ligature
canvas0.width = 250;
canvas0.height = 50;
context0.fillStyle = 'rgb(0, 0, 0)';
context0.textBaseline = 'top';
context0.font = 'normal normal normal 40px Arial';
context0.fillText(String.fromCharCode(parseInt(lig, 16)), 0, 0);
var print0 = context0.getImageData(0, 0, 720, 50).data;
canvas1.width = 250;
canvas1.height = 50;
context1.fillStyle = 'rgb(0, 0, 0)';
context1.textBaseline = 'top';
context1.font = 'normal normal normal 40px serif';
context1.fillText(String.fromCharCode(parseInt(lig, 16)), 0, 0);
var print1 = context1.getImageData(0, 0, 720, 50).data;
var i = 0, same = true, len = 720 * 50 * 4;
while (i < len && same === true) {
if (print0[i] !== print1[i]) {
same = false;
}
else {
i++;
}
}
return same;
}