lib/image_optim/worker/gifsicle.rb
# frozen_string_literal: true
require 'image_optim/worker'
class ImageOptim
class Worker
# http://www.lcdf.org/gifsicle/
class Gifsicle < Worker
# If interlace specified initialize one instance
# Otherwise initialize two, one with interlace off and one with on
def self.init(image_optim, options = {})
return super if options.key?(:interlace)
[false, true].map do |interlace|
new(image_optim, options.merge(interlace: interlace))
end
end
INTERLACE_OPTION =
option(:interlace, false, TrueFalseNil, 'Interlace: ' \
'`true` - interlace on, ' \
'`false` - interlace off, ' \
'`nil` - as is in original image ' \
'(defaults to running two instances, one with interlace off and ' \
'one with on)') do |v|
TrueFalseNil.convert(v)
end
LEVEL_OPTION =
option(:level, 3, 'Compression level: ' \
'`1` - light and fast, ' \
'`2` - normal, ' \
'`3` - heavy (slower)') do |v|
OptionHelpers.limit_with_range(v.to_i, 1..3)
end
CAREFUL_OPTION =
option(:careful, false, 'Avoid bugs with some software'){ |v| !!v }
def optimize(src, dst, options = {})
args = %W[
--output=#{dst}
--no-comments
--no-names
--same-delay
--same-loopcount
--no-warnings
--
#{src}
]
if resolve_bin!(:gifsicle).version >= '1.85'
args.unshift '--no-extensions', '--no-app-extensions'
end
unless interlace.nil?
args.unshift interlace ? '--interlace' : '--no-interlace'
end
args.unshift '--careful' if careful
args.unshift "--optimize=#{level}" if level
execute(:gifsicle, args, options) && optimized?(src, dst)
end
end
end
end