@thi.ng/text-canvas
Version:
Text based canvas, drawing, plotting, tables with arbitrary formatting (incl. ANSI/HTML)
70 lines (69 loc) • 1.42 kB
JavaScript
import { peek } from "@thi.ng/arrays/peek";
import { charCode } from "./utils.js";
const hline = (canvas, x, y, len, s, e, m, format = canvas.format) => {
const { x1, y1, x2, y2 } = peek(canvas.clipRects);
if (len < 1 || y < y1 || y >= y2 || x >= x2) return;
_hvline(
canvas.data,
x,
y,
1,
canvas.width,
x1,
x2,
len,
format,
peek(canvas.styles).hl,
s,
e,
m
);
};
const vline = (canvas, x, y, len, s, e, m, format = canvas.format) => {
const { x1, x2, y1, y2 } = peek(canvas.clipRects);
if (len < 1 || x < x1 || x >= x2 || y >= y2) return;
_hvline(
canvas.data,
y,
x,
canvas.width,
1,
y1,
y2,
len,
format,
peek(canvas.styles).vl,
s,
e,
m
);
};
const _hvline = (buf, a, b, astride, bstride, amin, amax, len, format, style, s, e, m) => {
a |= 0;
b |= 0;
len |= 0;
let idx;
if (a < amin) {
len += a - amin;
a = amin;
idx = a * astride + b * bstride;
} else {
idx = a * astride + b * bstride;
buf[idx] = charCode(s !== void 0 && len > 1 ? s : style, format);
idx += astride;
a++;
len--;
}
len--;
m = charCode(m != void 0 ? m : style, format);
for (let i = 0; i < len && a < amax; i++, a++, idx += astride) {
buf[idx] = m;
}
if (len >= 0 && a < amax) {
buf[idx] = charCode(e !== void 0 ? e : style, format);
}
};
export {
hline,
vline
};