def gradient.build

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

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-css-style@0.1.0.1/css.bend as CSS

2403def gradient.build(e: XML.Element, +box: Bounds, +w: F32, +h: F32, opacity: F32) -> Brush:
2404  XML.Element{n, attrs, kids, txt} = e
2405  +as = CSS.properties(attrs)
2406  +user = U.string.equal(XML.attr.get(as, "gradientUnits", "objectBoundingBox"), "userSpaceOnUse")
2407  +vw = U.choose(F32, user, w, 1.0)
2408  +vh = U.choose(F32, user, h, 1.0)
2409  +linear = U.string.equal(XML.attr.get(as, "color-interpolation", "sRGB"), "linearRGB")
2410  +radial = U.string.equal(n, "radialGradient")
2411  +cx = dimension(as, "cx", vw, "50%")
2412  +cy = dimension(as, "cy", vh, "50%")
2413  +radiusRef = F32.sqrt(((vw * vw + vh * vh) / 2.0 : F32))
2414  Gradient{matrix.inverse(matrix.mul(U.choose(Matrix, user, identity(), gradient.box(box)),
2415    transform(XML.attr.get(as, "gradientTransform", ""), identity()))), radial,
2416    U.choose(Point, radial, Point{dimension(as, "fx", vw, F32.show(cx)), dimension(as, "fy", vh, F32.show(cy))},
2417      Point{dimension(as, "x1", vw, "0%"), dimension(as, "y1", vh, "0%")}),
2418    U.choose(Point, radial, Point{cx, cy}, Point{dimension(as, "x2", vw, "100%"), dimension(as, "y2", vh, "0%")}),
2419    dimension(as, "r", radiusRef, "50%"), dimension(as, "fr", radiusRef, "0%"),
2420    gradient.stops(kids, as, 0.0, linear),
2421    U.choose(U32, U.string.equal(XML.attr.get(as, "spreadMethod", "pad"), "repeat"), 1,
2422      U.choose(U32, U.string.equal(XML.attr.get(as, "spreadMethod", "pad"), "reflect"), 2, 0)), opacity, linear}

Uses (23)

Used by (1)