Module: Flipbook::Timing

Defined in:
lib/flipbook/timing.rb,
sig/flipbook.rbs

Class Method Summary collapse

Class Method Details

.centiseconds(delays) ⇒ Array[Integer]

Parameters:

  • delays (Array[Numeric])

Returns:

  • (Array[Integer])


30
31
32
33
34
35
36
37
38
39
40
# File 'lib/flipbook/timing.rb', line 30

def centiseconds(delays)
  elapsed = Rational(0)
  rounded = 0
  delays.map do |delay|
    elapsed += rational(delay)
    target = (elapsed * 100).floor
    current = target - rounded
    rounded = target
    current
  end
end

.delays(count, fps: nil, delay: nil, warn_short: true) ⇒ Array[Rational]

Parameters:

  • count (Integer)
  • fps: (Numeric, nil) (defaults to: nil)
  • delay: (Numeric, Array[Numeric], nil) (defaults to: nil)
  • warn_short: (Boolean) (defaults to: true)

Returns:

  • (Array[Rational])

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/flipbook/timing.rb', line 7

def delays(count, fps: nil, delay: nil, warn_short: true)
  raise ArgumentError, "frame count must be a positive integer" unless count.is_a?(Integer) && count.positive?
  raise ArgumentError, "provide fps or delay, not both" if !fps.nil? && !delay.nil?
  raise ArgumentError, "fps or delay is required" if fps.nil? && delay.nil?

  values = if fps
    rate = rational(fps)
    raise ArgumentError, "fps must be positive" unless rate.positive?
    Array.new(count, 1 / rate)
  elsif delay.is_a?(Array)
    raise ArgumentError, "delay count must match frame count" unless delay.length == count
    delay.map { |value| positive_delay(value) }
  else
    Array.new(count) { positive_delay(delay) }
  end
  warn("Flipbook: delays below 1/50 second may be clamped by GIF viewers") if warn_short && values.any? { |value| value < Rational(1, 50) }
  values
end

.duration(value) ⇒ Object



26
27
28
# File 'lib/flipbook/timing.rb', line 26

def duration(value)
  positive_delay(value)
end