'use strict'; const defaultValue = require("default-value"); const findEdge = require("./find-edge"); const drawCharacter = require("./draw-character"); const resetCanvas = require("./reset-canvas"); const createCanvas = require("./create-canvas"); module.exports = function measureFont(fontFamily, options = {}) { let fontSize = defaultValue(options.fontSize, 20); let canvasSize = defaultValue(options.tolerance, 6) * fontSize; let descenderCharacters = ["g", "j", "p", "q", "y"]; let ascenderCharacters = ["h", "d", "t", "l"]; let capHeightCharacters = ["H", "I", "T"]; let medianCharacters = ["x", "v", "w", "z"]; let topBoundingCharacters = ["O", "A", "8", "#", "%", "^", "!", "/", "|", "]"]; let testingCanvas = createCanvas(canvasSize); function getLowest(characters) { resetCanvas(testingCanvas); characters.forEach((character) => { drawCharacter(testingCanvas, character, fontFamily, fontSize); }); return findEdge.lowest(testingCanvas); } function getHighest(characters) { resetCanvas(testingCanvas); characters.forEach((character) => { drawCharacter(testingCanvas, character, fontFamily, fontSize); }); return findEdge.highest(testingCanvas); } let lowestDescenderPoint = getLowest(descenderCharacters) - (testingCanvas.height / 2); let highestAscenderPoint = (testingCanvas.height / 2) - getHighest(ascenderCharacters); let highestCapHeightPoint = (testingCanvas.height / 2) - getHighest(capHeightCharacters); let highestMedianPoint = (testingCanvas.height / 2) - getHighest(medianCharacters); let highestTopBoundingPoint = (testingCanvas.height / 2) - getHighest(topBoundingCharacters); return { descender: lowestDescenderPoint / fontSize, ascender: -highestAscenderPoint / fontSize, capHeight: -highestCapHeightPoint / fontSize, median: -highestMedianPoint / fontSize, topBounding: -highestTopBoundingPoint / fontSize } }