UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

165 lines (164 loc) 4.68 kB
import BoundingRect from "../core/BoundingRect.mjs"; import LRUCache from "../core/LRU.mjs"; import { platformApi, DEFAULT_FONT } from "../core/platform.mjs"; var textWidthCache = {}; function getWidth(text, font) { font = font || DEFAULT_FONT; var cacheOfFont = textWidthCache[font]; if (!cacheOfFont) { cacheOfFont = textWidthCache[font] = new LRUCache(500); } var width = cacheOfFont.get(text); if (width == null) { width = platformApi.measureText(text, font).width; cacheOfFont.put(text, width); } return width; } function innerGetBoundingRect(text, font, textAlign, textBaseline) { var width = getWidth(text, font); var height = getLineHeight(font); var x = adjustTextX(0, width, textAlign); var y = adjustTextY(0, height, textBaseline); var rect = new BoundingRect(x, y, width, height); return rect; } function getBoundingRect(text, font, textAlign, textBaseline) { var textLines = ((text || "") + "").split("\n"); var len = textLines.length; if (len === 1) { return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline); } else { var uniondRect = new BoundingRect(0, 0, 0, 0); for (var i = 0; i < textLines.length; i++) { var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline); i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect); } return uniondRect; } } function adjustTextX(x, width, textAlign) { if (textAlign === "right") { x -= width; } else if (textAlign === "center") { x -= width / 2; } return x; } function adjustTextY(y, height, verticalAlign) { if (verticalAlign === "middle") { y -= height / 2; } else if (verticalAlign === "bottom") { y -= height; } return y; } function getLineHeight(font) { return getWidth("\u56FD", font); } function parsePercent(value, maxValue) { if (typeof value === "string") { if (value.lastIndexOf("%") >= 0) { return parseFloat(value) / 100 * maxValue; } return parseFloat(value); } return value; } function calculateTextPosition(out, opts, rect) { var textPosition = opts.position || "inside"; var distance = opts.distance != null ? opts.distance : 5; var height = rect.height; var width = rect.width; var halfHeight = height / 2; var x = rect.x; var y = rect.y; var textAlign = "left"; var textVerticalAlign = "top"; if (textPosition instanceof Array) { x += parsePercent(textPosition[0], rect.width); y += parsePercent(textPosition[1], rect.height); textAlign = null; textVerticalAlign = null; } else { switch (textPosition) { case "left": x -= distance; y += halfHeight; textAlign = "right"; textVerticalAlign = "middle"; break; case "right": x += distance + width; y += halfHeight; textVerticalAlign = "middle"; break; case "top": x += width / 2; y -= distance; textAlign = "center"; textVerticalAlign = "bottom"; break; case "bottom": x += width / 2; y += height + distance; textAlign = "center"; break; case "inside": x += width / 2; y += halfHeight; textAlign = "center"; textVerticalAlign = "middle"; break; case "insideLeft": x += distance; y += halfHeight; textVerticalAlign = "middle"; break; case "insideRight": x += width - distance; y += halfHeight; textAlign = "right"; textVerticalAlign = "middle"; break; case "insideTop": x += width / 2; y += distance; textAlign = "center"; break; case "insideBottom": x += width / 2; y += height - distance; textAlign = "center"; textVerticalAlign = "bottom"; break; case "insideTopLeft": x += distance; y += distance; break; case "insideTopRight": x += width - distance; y += distance; textAlign = "right"; break; case "insideBottomLeft": x += distance; y += height - distance; textVerticalAlign = "bottom"; break; case "insideBottomRight": x += width - distance; y += height - distance; textAlign = "right"; textVerticalAlign = "bottom"; break; } } out = out || {}; out.x = x; out.y = y; out.align = textAlign; out.verticalAlign = textVerticalAlign; return out; } export { adjustTextX, adjustTextY, calculateTextPosition, getBoundingRect, getLineHeight, getWidth, innerGetBoundingRect, parsePercent };