ol 10.5.1-dev.1747647746066 → 10.5.1-dev.1747831869658

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ol",
3
- "version": "10.5.1-dev.1747647746066",
3
+ "version": "10.5.1-dev.1747831869658",
4
4
  "description": "OpenLayers mapping library",
5
5
  "keywords": [
6
6
  "map",
@@ -188,7 +188,7 @@ export const checkedFonts: BaseObject;
188
188
  export const textHeights: {
189
189
  [x: string]: number;
190
190
  };
191
- export function registerFont(fontSpec: any): void;
191
+ export function registerFont(fontSpec: any): Promise<void>;
192
192
  export function measureTextHeight(fontSpec: any): number;
193
193
  export type BuilderType = "Circle" | "Image" | "LineString" | "Polygon" | "Text" | "Default";
194
194
  export type FillState = {
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["canvas.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["canvas.js"],"names":[],"mappings":"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"}
package/render/canvas.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @module ol/render/canvas
3
3
  */
4
4
  import BaseObject from '../Object.js';
5
- import {getFontParameters} from '../css.js';
5
+ import {fontWeights, getFontParameters} from '../css.js';
6
6
  import {createCanvasContext2D} from '../dom.js';
7
7
  import {WORKER_OFFSCREEN_CANVAS} from '../has.js';
8
8
  import {clear} from '../obj.js';
@@ -178,98 +178,123 @@ let measureFont;
178
178
  */
179
179
  export const textHeights = {};
180
180
 
181
+ const genericFontFamilies = new Set([
182
+ 'serif',
183
+ 'sans-serif',
184
+ 'monospace',
185
+ 'cursive',
186
+ 'fantasy',
187
+ 'system-ui',
188
+ 'ui-serif',
189
+ 'ui-sans-serif',
190
+ 'ui-monospace',
191
+ 'ui-rounded',
192
+ 'emoji',
193
+ 'math',
194
+ 'fangsong',
195
+ ]);
196
+
197
+ /**
198
+ * @param {string} style Css font-style
199
+ * @param {string} weight Css font-weight
200
+ * @param {string} family Css font-family
201
+ * @return {string} Font key.
202
+ */
203
+ function getFontKey(style, weight, family) {
204
+ return `${style} ${weight} 16px "${family}"`;
205
+ }
206
+
181
207
  /**
182
208
  * Clears the label cache when a font becomes available.
183
209
  * @param {string} fontSpec CSS font spec.
184
210
  */
185
211
  export const registerFont = (function () {
186
212
  const retries = 100;
187
- const size = '32px ';
188
- const referenceFonts = ['monospace', 'serif'];
189
- const len = referenceFonts.length;
190
- const text = 'wmytzilWMYTZIL@#/&?$%10\uF013';
191
- let interval, referenceWidth;
213
+ let timeout, fontFaceSet;
192
214
 
193
215
  /**
194
- * @param {string} fontStyle Css font-style
195
- * @param {string} fontWeight Css font-weight
196
- * @param {*} fontFamily Css font-family
197
- * @return {boolean} Font with style and weight is available
216
+ * @param {string} fontSpec Css font spec
217
+ * @return {Promise<boolean>} Font with style and weight is available
198
218
  */
199
- function isAvailable(fontStyle, fontWeight, fontFamily) {
200
- let available = true;
201
- for (let i = 0; i < len; ++i) {
202
- const referenceFont = referenceFonts[i];
203
- referenceWidth = measureTextWidth(
204
- fontStyle + ' ' + fontWeight + ' ' + size + referenceFont,
205
- text,
206
- );
207
- if (fontFamily != referenceFont) {
208
- const width = measureTextWidth(
209
- fontStyle +
210
- ' ' +
211
- fontWeight +
212
- ' ' +
213
- size +
214
- fontFamily +
215
- ',' +
216
- referenceFont,
217
- text,
218
- );
219
- // If width and referenceWidth are the same, then the fallback was used
220
- // instead of the font we wanted, so the font is not available.
221
- available = available && width != referenceWidth;
222
- }
219
+ async function isAvailable(fontSpec) {
220
+ await fontFaceSet.ready;
221
+ const fontFaces = await fontFaceSet.load(fontSpec);
222
+ if (fontFaces.length === 0) {
223
+ return false;
223
224
  }
224
- if (available) {
225
- return true;
226
- }
227
- return false;
225
+ const font = getFontParameters(fontSpec);
226
+ const checkFamily = font.families[0].toLowerCase();
227
+ const checkWeight = font.weight;
228
+ return fontFaces.some(
229
+ /**
230
+ * @param {import('../css.js').FontParameters} f Font.
231
+ * @return {boolean} Font matches.
232
+ */
233
+ (f) => {
234
+ const family = f.family.replace(/^['"]|['"]$/g, '').toLowerCase();
235
+ const weight = fontWeights[f.weight] || f.weight;
236
+ return (
237
+ family === checkFamily &&
238
+ f.style === font.style &&
239
+ weight == checkWeight
240
+ );
241
+ },
242
+ );
228
243
  }
229
244
 
230
- function check() {
245
+ async function check() {
246
+ await fontFaceSet.ready;
231
247
  let done = true;
232
- const fonts = checkedFonts.getKeys();
233
- for (let i = 0, ii = fonts.length; i < ii; ++i) {
248
+ const checkedFontsProperties = checkedFonts.getProperties();
249
+ const fonts = Object.keys(checkedFontsProperties).filter(
250
+ (key) => checkedFontsProperties[key] < retries,
251
+ );
252
+ for (let i = fonts.length - 1; i >= 0; --i) {
234
253
  const font = fonts[i];
235
- if (checkedFonts.get(font) < retries) {
236
- const [style, weight, family] = font.split('\n');
237
- if (isAvailable(style, weight, family)) {
254
+ let currentRetries = checkedFontsProperties[font];
255
+ if (currentRetries < retries) {
256
+ if (await isAvailable(font)) {
238
257
  clear(textHeights);
239
- // Make sure that loaded fonts are picked up by Safari
240
- measureContext = null;
241
- measureFont = undefined;
242
258
  checkedFonts.set(font, retries);
243
259
  } else {
244
- checkedFonts.set(font, checkedFonts.get(font) + 1, true);
245
- done = false;
260
+ currentRetries += 10;
261
+ checkedFonts.set(font, currentRetries, true);
262
+ if (currentRetries < retries) {
263
+ done = false;
264
+ }
246
265
  }
247
266
  }
248
267
  }
249
- if (done) {
250
- clearInterval(interval);
251
- interval = undefined;
268
+ timeout = undefined;
269
+ if (!done) {
270
+ timeout = setTimeout(check, 100);
252
271
  }
253
272
  }
254
273
 
255
- return function (fontSpec) {
274
+ return async function (fontSpec) {
275
+ if (!fontFaceSet) {
276
+ fontFaceSet = WORKER_OFFSCREEN_CANVAS ? self.fonts : document.fonts;
277
+ }
256
278
  const font = getFontParameters(fontSpec);
257
279
  if (!font) {
258
280
  return;
259
281
  }
260
282
  const families = font.families;
261
- for (let i = 0, ii = families.length; i < ii; ++i) {
262
- const family = families[i];
263
- const key = font.style + '\n' + font.weight + '\n' + family;
264
- if (checkedFonts.get(key) === undefined) {
265
- checkedFonts.set(key, retries, true);
266
- if (!isAvailable(font.style, font.weight, family)) {
267
- checkedFonts.set(key, 0, true);
268
- if (interval === undefined) {
269
- interval = setInterval(check, 32);
270
- }
271
- }
283
+ let needCheck = false;
284
+ for (const family of families) {
285
+ if (genericFontFamilies.has(family)) {
286
+ continue;
272
287
  }
288
+ const key = getFontKey(font.style, font.weight, family);
289
+ if (checkedFonts.get(key) !== undefined) {
290
+ continue;
291
+ }
292
+ checkedFonts.set(key, 0, true);
293
+ needCheck = true;
294
+ }
295
+ if (needCheck) {
296
+ clearTimeout(timeout);
297
+ timeout = setTimeout(check, 100);
273
298
  }
274
299
  };
275
300
  })();
package/util.js CHANGED
@@ -33,4 +33,4 @@ export function getUid(obj) {
33
33
  * OpenLayers version.
34
34
  * @type {string}
35
35
  */
36
- export const VERSION = '10.5.1-dev.1747647746066';
36
+ export const VERSION = '10.5.1-dev.1747831869658';