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;
+};