UNPKG

nehan

Version:

Html layout engine for paged-media written in Typescript

83 lines 2.61 kB
import { LogicalSize, } from './public-api'; function createOffscreenCanvasContext2d() { if (typeof OffscreenCanvas === "undefined") { return null; } return new OffscreenCanvas(0, 0).getContext("2d"); } function createCanvasContext2d() { const canvas = document.createElement("canvas"); canvas.style.display = "hidden"; canvas.style.width = canvas.style.height = "0"; if (document.body) { document.body.appendChild(canvas); } return canvas.getContext("2d"); } function createDomContextElement() { const dom = document.createElement("span"); const style = dom.style; style.display = "inline"; style.margin = "0"; style.padding = "0"; style.borderWidth = "0"; style.lineHeight = "1"; style.width = "auto"; style.height = "auto"; style.visibility = "hidden"; return dom; } ; class OffCanvasTextMetricsMeasure { static isEnabled() { return this.offCanvasCtx !== null; } getMeasure(text, font) { const ctx = OffCanvasTextMetricsMeasure.offCanvasCtx; if (!ctx) { return 0; } ctx.font = font.css; return ctx.measureText(text).width; } } OffCanvasTextMetricsMeasure.offCanvasCtx = createOffscreenCanvasContext2d(); class CanvasTextMetricsMeasure { static isEnabled() { return this.canvasCtx !== null; } getMeasure(text, font) { const ctx = CanvasTextMetricsMeasure.canvasCtx; if (!ctx) { return 0; } ctx.font = font.css; return ctx.measureText(text).width; } } CanvasTextMetricsMeasure.canvasCtx = createCanvasContext2d(); class DomNodeTextMetricsMeasure { getMeasure(text, font) { const node = DomNodeTextMetricsMeasure.node; if (!node) { return 0; } node.style.font = font.css; node.innerHTML = text; document.body.appendChild(node); const rect = node.getBoundingClientRect(); document.body.removeChild(node); return rect.width; } } DomNodeTextMetricsMeasure.node = createDomContextElement(); const textMetricsMeasure = OffCanvasTextMetricsMeasure.isEnabled() ? new OffCanvasTextMetricsMeasure() : CanvasTextMetricsMeasure.isEnabled() ? new CanvasTextMetricsMeasure() : new DomNodeTextMetricsMeasure(); export class TextMeasure { static getWordSize(font, word) { const measure = textMetricsMeasure.getMeasure(word, font); const extent = font.size; return new LogicalSize({ measure, extent }); } } //# sourceMappingURL=text-measure.js.map