library(minisvg)

Example images

Using the example image from the MDN site. For these vignettes, I’m going to use an inline version of the image for future-proofing.

inline_img <- paste0("data:image/png;base64,", base64enc::base64encode("./images/mdn_logo.png"))

feBlend

The <feBlend> SVG filter primitive composes two objects together ruled by a certain blending mode. This is similar to what is known from image editing software when blending two layers. The mode is defined by the mode attribute.

Example from MDN docs.

doc <- svg_doc(
  width = 200, height = 200,
  stag$defs(
    stag$filter(
      id="spotlight",
      stag$feFlood(
        x=0, y=0,
        result        = "floodFill",
        width         = "100%",
        height        = "100%",
        flood_color   = "green",
        flood_opacity = "1"
      ),
      stag$feBlend(
        in_ = "SourceGraphic", in2="floodFill", mode="multiply"
      )
    )
  ),

  stag$image(
    xlink_href = inline_img,
    x="10%", y="10%", width="80%", height="80%",
    style="filter:url(#spotlight);"
  )
)

Show SVG text (click to open)

#> <?xml version="1.0" encoding="UTF-8"?>
#> <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
#>   <defs>
#>     <filter id="spotlight">
#>       <feFlood flood-color="green" flood-opacity="1" result="floodFill" x="0" y="0" width="100%" height="100%" />
#>       <feBlend in="SourceGraphic" in2="floodFill" mode="multiply" />
#>     </filter>
#>   </defs>
#>   <image x="10%" y="10%" width="80%" height="80%" xlink:href="data:image/png;base64,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" style="filter:url(#spotlight);" />
#> </svg>


feColorMatrix

The <feColorMatrix> SVG filter element changes colors based on a transformation matrix. Every pixel’s color value (represented by an [R,G,B,A] vector) is matrix multiplied to create a new color.

Example from MDN docs.

doc <- svg_doc(
  width="40%", height="40%", viewBox="0 0 150 250",
  preserveAspectRatio = "xMidYMid meet",

  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # 3 overlapping circles
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  stag$defs(
    stag$g(
      id="circles",
      stag$circle(cx=30, cy=30, r=20, fill="blue" , fill_opacity="0.5"),
      stag$circle(cx=20, cy=50, r=20, fill="green", fill_opacity="0.5"),
      stag$circle(cx=40, cy=50, r=20, fill="red"  , fill_opacity="0.5")
    )
  ),

  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Reference rendering of the circles
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  stag$use(href='#circles'),
  stag$text(x=70, y=50, "Reference"),


  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Applying a colour transformation matrix to these circles
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  stag$filter(
    id="colorMeMatrix",
    stag$feColorMatrix(
      in_    = "SourceGraphic",
      type   = "matrix",         # matrix | saturate | hueRotate | luminanceToAlpha
      values = "0 0 0 0 0   1 1 1 1 0   0 0 0 0 0   0 0 0 1 0"
    )
  ),
  stag$use(href='#circles', transform="translate(0 70)", filter="url(#colorMeMatrix)"),
  stag$text(x=70, y=120, "Matrix"),

  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Desaturate the colour of the circles
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  stag$filter(
    id = "colorMeSaturate",
    stag$feColorMatrix(
      in_    = "SourceGraphic",
      type   = "saturate",
      values = "0.2"
    )
  ),
  stag$use(href='#circles', transform="translate(0 140)", filter="url(#colorMeSaturate)"),
  stag$text(x=70, y=190, "Saturate")
)

Show SVG text (click to open)

#> <?xml version="1.0" encoding="UTF-8"?>
#> <svg width="40%" height="40%" viewBox="0 0 150 250" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
#>   <defs>
#>     <g id="circles">
#>       <circle cx="30" cy="30" r="20" fill="blue" fill-opacity="0.5" />
#>       <circle cx="20" cy="50" r="20" fill="green" fill-opacity="0.5" />
#>       <circle cx="40" cy="50" r="20" fill="red" fill-opacity="0.5" />
#>     </g>
#>   </defs>
#>   <use href="#circles" />
#>   <text x="70" y="50">
#>     Reference
#>   </text>
#>   <filter id="colorMeMatrix">
#>     <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 0   1 1 1 1 0   0 0 0 0 0   0 0 0 1 0" />
#>   </filter>
#>   <use href="#circles" filter="url(#colorMeMatrix)" transform="translate(0 70)" />
#>   <text x="70" y="120">
#>     Matrix
#>   </text>
#>   <filter id="colorMeSaturate">
#>     <feColorMatrix in="SourceGraphic" type="saturate" values="0.2" />
#>   </filter>
#>   <use href="#circles" filter="url(#colorMeSaturate)" transform="translate(0 140)" />
#>   <text x="70" y="190">
#>     Saturate
#>   </text>
#> </svg>


Reference Matrix Saturate

feTurbulence

The <feTurbulence> SVG filter primitive creates an image using the Perlin turbulence function. It allows the synthesis of artificial textures like clouds or marble. The resulting image will fill the entire filter primitive subregion.

Example from MDN docs.

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Define filter with turbulence driving the displacmenet
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
my_filter <- stag$filter(
  id = "displacementFilter",
  stag$feTurbulence(
    type          = "turbulence",
    baseFrequency = 0.05,
    numOctaves    = 2,
    result        = "turbulence"),
  stag$feDisplacementMap(
    in_   = "SourceGraphic",
    in2   = "turbulence",
    scale = 50,
    xChannelSelector = 'R',
    yChannelSelector = 'G')
)


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Apply this displacement filter to a circle
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
doc <- svg_doc(
  width = 200, height = 200,
  my_filter,
  stag$circle(cx=100, cy=100, r=80, filter = my_filter)
)

Show SVG text (click to open)

#> <?xml version="1.0" encoding="UTF-8"?>
#> <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
#>   <filter id="displacementFilter">
#>     <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2" result="turbulence" />
#>     <feDisplacementMap in="SourceGraphic" in2="turbulence" scale="50" xChannelSelector="R" yChannelSelector="G" />
#>   </filter>
#>   <circle cx="100" cy="100" r="80" filter="url(#displacementFilter)" />
#> </svg>


feTurbulence - simple example

doc <- svg_doc(
  width = 250, height = 250,
  stag$filter(
    id = "noise",
    stag$feTurbulence(baseFrequency = 0.05)
  ),

  stag$rect(
    x      = 0,
    y      = 0,
    height = 250,
    width  = 250,
    filter = "url(#noise)",
    fill   = 'none')
)

Show SVG text (click to open)

#> <?xml version="1.0" encoding="UTF-8"?>
#> <svg width="250" height="250" viewBox="0 0 250 250" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
#>   <filter id="noise">
#>     <feTurbulence baseFrequency="0.05" />
#>   </filter>
#>   <rect x="0" y="0" width="250" height="250" filter="url(#noise)" fill="none" />
#> </svg>