nehan
Version:
Html layout engine for paged-media written in Typescript
83 lines • 2.61 kB
JavaScript
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