From e2af5f6be301d959a55365624ca5d421eec73696 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 3 Jan 2018 10:34:18 +0100 Subject: [PATCH] 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. --- src/ol/render/canvas.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index d77cd71f3f..2448e127b2 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -125,22 +125,26 @@ _ol_render_canvas_.checkFont = (function() { var retries = 60; var checked = _ol_render_canvas_.checkedFonts_; 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 interval, referenceWidth; - function isAvailable(fontFamily) { + function isAvailable(font) { var context = _ol_render_canvas_.getMeasureContext(); - context.font = font; - referenceWidth = context.measureText(text).width; var available = true; - if (fontFamily != 'monospace') { - context.font = '32px ' + fontFamily + ',monospace'; - var width = context.measureText(text).width; - // If width and referenceWidth are the same, then the 'monospace' - // fallback was used instead of the font we wanted, so the font is not - // available. - available = width != referenceWidth; + for (var i = 0; i < len; ++i) { + var referenceFont = referenceFonts[i]; + context.font = size + referenceFont; + referenceWidth = context.measureText(text).width; + if (font != referenceFont) { + context.font = size + font + ',' + referenceFont; + 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; }