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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# File 'lib/pixelart/sample.rb', line 5
def self.calc_sample_steps( width, new_width,
center: true,
debug: false )
if debug
puts
puts "==> from: #{width}px to: #{new_width}px"
end
indexes = []
base_step = width / new_width
err_step = (width % new_width) * 2
denominator = new_width * 2
overflow = err_step*new_width/denominator
if debug
puts
puts "base_step (pixels per pixel):"
puts " #{base_step} - #{base_step} * #{new_width}px = #{base_step*new_width}px"
puts "err_step (in 1/#{width}*2):"
puts " #{err_step} / #{denominator} - #{err_step*new_width} / #{denominator} = +#{err_step*new_width/denominator}px overflow"
puts
end
index = 0
err = err_step/2
index += if center.is_a?( Integer )
center
elsif center
base_step/2
else
0
end
new_width.times do |i|
if err >= denominator
puts " -- overflow #{err}/#{denominator} - add +1 pixel offset to #{i}" if debug
index += 1
err -= denominator
end
puts " #{i} => #{index} -- #{err} / #{denominator}" if debug
indexes[i] = index
index += base_step
err += err_step
end
indexes
end
|