Краткий ответ: браузеры еще недостаточно хороши, чтобы позволить нам проверять наличие «загруженных и готовых к использованию» без фактического использования шрифта и его проверки.
Длинный ответ: Pjs поставляется со встроенным средством проверки шрифтов для предварительной загрузки шрифта (относится к https://github.com/pomax/font.js), но, как вы заметили, это не будет работать с правилами @ font-face, которые используют data-uri. A Обходной путь, который я бы предложил (хотя я еще не пробовал этого. Я просто предполагаю, что он будет работать на основе моей работы над Processing.js и загрузкой шрифтов в браузерах), заключается в использовании двух буферов PGraphic за пределами экрана. Сделайте их белыми фон с черной заливкой текста, сделайте текст ("X", 0,0) в первом буфере, а затем после загрузки шрифта используйте второй буфер для выполнения того же текста ("X", 0,0 "). Возьмите пиксель [] для каждого буфера и проведите параллельное сравнение:
boolean verifyFontLoad() {
buffer1.loadPixels();
buffer2.loadPixels();
for (int i=0; i<buffer1.pixels.length; i++) {
if (buffer1.pixels[i] != buffer2.pixels[i]) {
return false; }}
return true;
}
когда вы загружаете свой шрифт, где-то должно быть отслеживающее логическое значение, которое указывает состояние загрузки шрифта, устанавливается на «false» и после загрузки вашего шрифта в начале вызова draw () вызывается
void draw() {
// code that does not rely on your font
[...]
// check state
if(!fontLoaded) { fontLoaded = verifyFontLoaded(); }
// not ready? "stop" drawing.
if(!fontLoaded) { return; }
// font ready. run code that relies on the font being ready
else {
// code that depends on your font being available goes here.
}
}
Теперь, по крайней мере, вы можете избежать первых нескольких кадров, когда браузер завершил распаковку шрифта data-uri и загрузил его как ресурс @ font-face, но не успел передать его в систему рендеринга Canvas2D еще.
(стилизация элемента DOM на этом этапе с помощью шрифта на самом деле будет работать нормально, фактически его передают Canvas2D, что приводит к невозможности его использования одним или несколькими кадрами)