showbits/showbits-thermal-printer/src/documents/lib.typ
2025-03-01 20:14:08 +01:00

59 lines
1.1 KiB
Typst

#let width = 384pt
#let init(it) = {
set page(
width: width,
height: auto,
margin: (x: 0pt, y: 4pt),
)
set text(
font: ("Unifont", "Unifont-JP", "Unifont Upper"),
size: 16pt,
fallback: false,
)
set par(
leading: 8pt, // Between lines
spacing: 26pt, // Between paragraphs
)
it
}
// Determined by experiments so that the top and bottom white border are roughly
// the same size after tearing off the paper.
#let feed = v(64pt + 32pt)
////////////
// Plugin //
////////////
#import plugin("plugin.wasm") as p
#let _number_to_bytes(n) = int(n).to-bytes(size: 8)
#let _bool_to_bytes(b) = _number_to_bytes(if b { 1 } else { 0 })
#let _str_to_bytes(s) = {
bytes(s)
}
#let _length_to_bytes(l) = {
let l = l.pt()
let n = if l > 10000 { -1 } else { int(l) }
_number_to_bytes(n)
}
#let dither(
path,
bright: true,
algorithm: "floyd-steinberg",
) = layout(size => {
let data = read(path, encoding: none)
let dithered = p.dither(
data,
_length_to_bytes(size.width),
_length_to_bytes(size.height),
_bool_to_bytes(bright),
_str_to_bytes(algorithm),
)
image(dithered)
})