Check fonts against two reference fonts

In rare cases, the previous font check returned false negatives when
checking against monospace only. By checking against another font, this
can be avoided.
This commit is contained in:
Andreas Hocevar
2018-01-03 10:34:18 +01:00
parent 4fc8eff921
commit e2af5f6be3
+15 -11
View File
@@ -125,22 +125,26 @@ _ol_render_canvas_.checkFont = (function() {
var retries = 60; var retries = 60;
var checked = _ol_render_canvas_.checkedFonts_; var checked = _ol_render_canvas_.checkedFonts_;
var labelCache = _ol_render_canvas_.labelCache; var labelCache = _ol_render_canvas_.labelCache;
var font = '32px monospace'; var size = '32px ';
var referenceFonts = ['monospace', 'serif'];
var len = referenceFonts.length;
var text = 'wmytzilWMYTZIL@#/&?$%10'; var text = 'wmytzilWMYTZIL@#/&?$%10';
var interval, referenceWidth; var interval, referenceWidth;
function isAvailable(fontFamily) { function isAvailable(font) {
var context = _ol_render_canvas_.getMeasureContext(); var context = _ol_render_canvas_.getMeasureContext();
context.font = font;
referenceWidth = context.measureText(text).width;
var available = true; var available = true;
if (fontFamily != 'monospace') { for (var i = 0; i < len; ++i) {
context.font = '32px ' + fontFamily + ',monospace'; var referenceFont = referenceFonts[i];
var width = context.measureText(text).width; context.font = size + referenceFont;
// If width and referenceWidth are the same, then the 'monospace' referenceWidth = context.measureText(text).width;
// fallback was used instead of the font we wanted, so the font is not if (font != referenceFont) {
// available. context.font = size + font + ',' + referenceFont;
available = width != referenceWidth; var width = context.measureText(text).width;
// If width and referenceWidth are the same, then the fallback was used
// instead of the font we wanted, so the font is not available.
available = available && width != referenceWidth;
}
} }
return available; return available;
} }