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}