Method: PSD::Renderer::Blender#compose!

Defined in:
lib/psd/renderer/blender.rb

#compose!Object

Composes the foreground Canvas onto the background Canvas using the blending mode specified by the foreground.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/psd/renderer/blender.rb', line 18

def compose!
  PSD.logger.debug "#{fg.node.debug_name} -> #{bg.node.debug_name}: #{fg.node.blending_mode} blending"
  PSD.logger.debug "fg: (#{fg.left}, #{fg.top}) #{fg.width}x#{fg.height}; bg: (#{bg.left}, #{bg.top}) #{bg.width}x#{bg.height}"

  offset_x = fg.left - bg.left
  offset_y = fg.top - bg.top

  fg.height.times do |y|
    fg.width.times do |x|
      base_x = x + offset_x
      base_y = y + offset_y

      next if base_x < 0 || base_y < 0 || base_x >= bg.width || base_y >= bg.height

      color = Compose.send(
        fg.node.blending_mode,
        fg.get_pixel(x, y),
        bg.get_pixel(base_x, base_y),
        calculated_opacity
      )

      bg.set_pixel base_x, base_y, color
    end
  end
end