lib/image_optim/worker/pngquant.rb
# frozen_string_literal: true
require 'image_optim/worker'
require 'image_optim/option_helpers'
require 'image_optim/non_negative_integer_range'
class ImageOptim
class Worker
# http://pngquant.org/
class Pngquant < Worker
ALLOW_LOSSY_OPTION =
option(:allow_lossy, false, 'Allow quality option'){ |v| !!v }
MAX_COLORS_OPTION =
option(:max_colors, 256, 'Maximum number of colors to use') do |v|
OptionHelpers.limit_with_range(v.to_i, 2..256)
end
QUALITY_OPTION =
option(:quality, '`100..100`, `0..100` in lossy mode',
NonNegativeIntegerRange, 'min..max - don\'t ' \
'save below min, use less colors below max (both in range `0..100`; ' \
'in yaml - `!ruby/range 0..100`), ignored in default/lossless ' \
'mode') do |v, opt_def|
if allow_lossy
if v == opt_def.default
0..100
else
min = OptionHelpers.limit_with_range(v.begin, 0..100)
min..OptionHelpers.limit_with_range(v.end, min..100)
end
else
if v != opt_def.default
warn "#{self.class.bin_sym} #{opt_def.name} #{v} ignored " \
'in lossless mode'
end
100..100
end
end
SPEED_OPTION =
option(:speed, 3, 'speed/quality trade-off: ' \
'`1` - slow, ' \
'`3` - default, ' \
'`11` - fast & rough') do |v|
OptionHelpers.limit_with_range(v.to_i, 1..11)
end
def run_order
-2
end
def optimize(src, dst, options = {})
args = %W[
--quality=#{quality.begin}-#{quality.end}
--speed=#{speed}
--output=#{dst}
--skip-if-larger
--force
#{max_colors}
--
#{src}
]
execute(:pngquant, args, options) && optimized?(src, dst)
end
end
end
end