painbrush
1.0.21.1.0
src/layer/make-text.js+
src/layer/make-text.jsNew file+67
Index: package/src/layer/make-text.js
===================================================================
--- package/src/layer/make-text.js
+++ package/src/layer/make-text.js
@@ -0,0 +1,67 @@
+import { punchLayerOver, inflateLayer, overlayLayerOver, } from "./transform.js";
+import { overlayLayersOver } from "./transform.js";
+import { solidFillBrush, alphaBrush, } from "../color/brush.js";
+import { makeRectangleLayer } from "./make-rectangle.js";
+/**
+ * Writes the text
+ */
+export const makeTextLayer = (text, font, brush = solidFillBrush([255, 255, 255]), { letterPlateBrush = alphaBrush(), bgPlateBrush = alphaBrush(), maxLengthPx = Infinity, breakLinesOn = " ", } = {}) => {
+ const { getCharacter } = font;
+ const lineHeight = getCharacter("X").height;
+ let charLayers = [];
+ const words = text
+ .split(breakLinesOn)
+ .map((word, idx, arr) => arr.length === idx + 1 ? word : word + breakLinesOn)
+ .map((word) => word
+ .split("\n")
+ .map((word, idx, arr) => arr.length === idx + 1 ? word : [word, "\n"]))
+ .flat(2);
+ let lineOffset = 0;
+ let maxWidth = 0;
+ let lines = 1;
+ for (let word of words) {
+ const newline = () => {
+ maxWidth = Math.max(lineOffset, maxWidth);
+ lineOffset = 0;
+ lines++;
+ };
+ let wordLayers = [];
+ let wordOffset = 0;
+ for (let character of word) {
+ if (character === "\n") {
+ newline();
+ continue;
+ }
+ const char = inflateLayer(getCharacter(character), brush, letterPlateBrush);
+ wordLayers.push([
+ char,
+ wordOffset,
+ ]);
+ wordOffset += char.width;
+ }
+ const prevLineOffset = lineOffset;
+ const verticalOffset = lineHeight * (lines - 1);
+ lineOffset = lineOffset + wordOffset;
+ if (lineOffset > maxLengthPx) {
+ newline();
+ }
+ charLayers.push(...wordLayers.map((layer) => [
+ layer[0],
+ {
+ skipBlending: true,
+ offset: {
+ x: prevLineOffset + layer[1],
+ y: verticalOffset,
+ },
+ },
+ ]));
+ }
+ let textLayer = makeRectangleLayer({
+ x: (maxWidth = Math.max(lineOffset, maxWidth)),
+ y: lineHeight * lines,
+ }, bgPlateBrush);
+ for (let layer of charLayers) {
+ punchLayerOver(textLayer, layer[0], layer[1]);
+ }
+ return textLayer;
+};