Module: NSWTopo::MaskRender

Included in:
ColourMask, Relief, Vegetation
Defined in:
lib/nswtopo/layer/mask_render.rb

Instance Method Summary collapse

Instance Method Details

#render(cutouts:, &block) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/nswtopo/layer/mask_render.rb', line 3

def render(cutouts:, **, &block)
  colour, shade, gamma = @params.values_at "colour", "shade", "gamma"
  raise "can't specify both colour and shade values" if colour && shade

  REXML::Element.new("defs").tap do |defs|
    defs.add_attributes("id" => "#{@name}.defs")
    defs.add_element(image_element).add_attributes("id" => "#{@name}.content")

    filter = defs.add_element("filter", "id" => "#{@name}.filter") if shade || gamma
    filter.add_element("feColorMatrix", "values" => "-1 0 0 0 1  -1 0 0 0 1  -1 0 0 0 1  0 0 0 1 0", "color-interpolation-filters" => "sRGB") if shade
    filter.add_element("feComponentTransfer", "color-interpolation-filters" => "sRGB").tap do |transfer|
      gamma, clip = [*gamma, 0]
      amplitude, offset = 1 / (1 - clip), clip / (clip - 1)
      transfer.add_element("feFuncR", "type" => "gamma", "exponent" => gamma, "amplitude" => amplitude, "offset" => offset)
      transfer.add_element("feFuncG", "type" => "gamma", "exponent" => gamma, "amplitude" => amplitude, "offset" => offset)
      transfer.add_element("feFuncB", "type" => "gamma", "exponent" => gamma, "amplitude" => amplitude, "offset" => offset)
    end if gamma

    defs.add_element("mask", "id" => "#{@name}.mask").tap do |mask|
      use = mask.add_element("use", "href" => "##{@name}.content")
      use.add_attributes("filter" => "url(##{@name}.filter)") if filter

      cutouts.each.with_object mask.add_element("g", "filter" => "url(#map.filter.cutout)") do |cutout, group|
        group.add_element cutout.use
      end if cutouts.any?
    end
  end.tap(&block)

  REXML::Element.new("use").tap do |use|
    use.add_attributes "id" => @name, "mask" => "url(##{@name}.mask)", "href" => "#map.neatline", "fill" => shade || colour
    use.add_attributes @params.slice("opacity")
  end.tap(&block)
end