def text.font.inherit

gralha-svg-render@0.1.0.1 · svg.bend:3190

import gralha-svg-render@0.1.0.1/svg.bend as Svg
import Base
import gralha-text-scan@0.1.0.1/scan.bend as U
import gralha-xml-doc@0.1.0.1/xml.bend as XML
import gralha-truetype@0.1.0.1/font.bend as Font

3190def text.font.inherit(+font: TextFont, +as: List<&2, XML.Attr>) -> TextFont:
3191  TextFont{size, face, weight, slant, anchor, letter, word, shift, baseline, kern, preserve, book} = font
3192  +sz = text.font.size(style.value(as, "font-size", F32.show(size), "16", True{}), size)
3193  +wt = style.value(as, "font-weight", weight, "normal", True{})
3194  +it = style.value(as, "font-style", slant, "normal", True{})
3195  +bold = U.string.equal(wt, "bold") || U.string.equal(wt, "bolder") || F32.is_ge(U.scalar(wt, 400.0), 600.0)
3196  +italic = U.string.equal(it, "italic") || U.prefix(it, "oblique")
3197  +selectedFace = (U.choose(U32, bold, 1, 0) + U.choose(U32, italic, 2, 0) : U32)
3198  +bs = XML.attr.get(as, "baseline-shift", "0")
3199  +ws = style.value(as, "white-space", U.choose(String, preserve, "pre", "normal"), "normal", True{})
3200  +xml = XML.attr.get(as, "xml:space", "")
3201  TextFont{sz, selectedFace, wt, it,
3202    style.value(as, "text-anchor", anchor, "start", True{}),
3203    text.measure(U.number(style.value(as, "letter-spacing", F32.show(letter), "0", True{})), sz, sz),
3204    text.measure(U.number(style.value(as, "word-spacing", F32.show(word), "0", True{})), sz, sz),
3205    (shift + U.choose(F32, U.string.equal(bs, "super"), (Font.font.metric(book, selectedFace, "superscript", 0.4) * sz : F32), U.choose(F32, U.string.equal(bs, "sub"), (F32.neg(Font.font.metric(book, selectedFace, "subscript", 0.2)) * sz : F32), text.measure(U.number(bs), sz, sz))) : F32),
3206    style.value(as, "dominant-baseline", baseline, "alphabetic", True{}),
3207    Bool.not(U.string.equal(style.value(as, "font-kerning", U.choose(String, kern, "auto", "none"), "auto", True{}), "none")),
3208    U.choose(Bool, U.string.equal(xml, "preserve"), True{}, U.choose(Bool, U.string.equal(xml, "default"), False{}, U.prefix(ws, "pre") || U.string.equal(ws, "break-spaces"))), book}

Uses (25)

Used by (2)