Module: ChunkyPNG::Canvas::Adam7Interlacing

Included in:
ChunkyPNG::Canvas
Defined in:
lib/chunky_png/canvas/adam7_interlacing.rb

Overview

Methods for decoding and encoding adam7 interlacing

Instance Method Summary collapse

Instance Method Details

#adam7_extract_pass(pass, canvas) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/chunky_png/canvas/adam7_interlacing.rb', line 39

def adam7_extract_pass(pass, canvas)
  m_o = adam7_multiplier_offset(pass)
  sm_pixels = []
  m_o[:y_offset].step(canvas.height - 1, m_o[:y_multiplier]) do |y|
    m_o[:x_offset].step(canvas.width - 1, m_o[:x_multiplier]) do |x|
      sm_pixels << canvas[x, y]
    end
  end
  
  new_canvas_args = adam7_pass_size(pass, canvas.width, canvas.height) + [sm_pixels]
  ChunkyPNG::Canvas.new(*new_canvas_args)
end

#adam7_merge_pass(pass, canvas, subcanvas) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/chunky_png/canvas/adam7_interlacing.rb', line 27

def adam7_merge_pass(pass, canvas, subcanvas)
  m_o = adam7_multiplier_offset(pass)
  0.upto(subcanvas.height - 1) do |y|
    0.upto(subcanvas.width - 1) do |x|
      new_x = x * m_o[:x_multiplier] + m_o[:x_offset]
      new_y = y * m_o[:y_multiplier] + m_o[:y_offset]
      canvas[new_x, new_y] = subcanvas[x, y]
    end
  end
  canvas
end

#adam7_multiplier_offset(pass) ⇒ Object



8
9
10
11
12
13
14
15
# File 'lib/chunky_png/canvas/adam7_interlacing.rb', line 8

def adam7_multiplier_offset(pass)
  {
    :x_multiplier => 8 >> (pass >> 1),
    :x_offset     => (pass & 1 == 0) ? 0 : 8 >> ((pass + 1) >> 1),
    :y_multiplier => pass == 0 ? 8 : 8 >> ((pass - 1) >> 1),
    :y_offset     => (pass == 0 || pass & 1 == 1) ? 0 : 8 >> (pass >> 1)
  }
end

#adam7_pass_size(pass, original_width, original_height) ⇒ Object



17
18
19
20
21
# File 'lib/chunky_png/canvas/adam7_interlacing.rb', line 17

def adam7_pass_size(pass, original_width, original_height)
  m_o = adam7_multiplier_offset(pass)
  [ ((original_width  - m_o[:x_offset] ) / m_o[:x_multiplier].to_f).ceil,
    ((original_height - m_o[:y_offset] ) / m_o[:y_multiplier].to_f).ceil]
end

#adam7_pass_sizes(original_width, original_height) ⇒ Object



23
24
25
# File 'lib/chunky_png/canvas/adam7_interlacing.rb', line 23

def adam7_pass_sizes(original_width, original_height)
  (0...7).map { |pass| adam7_pass_size(pass, original_width, original_height) }
end