forked from toy/image_optim
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Based on toy#167 Oxipng is a multi-threaded rust implementation of Optipng. https://github.com/shssoichiro/oxipng
- Loading branch information
1 parent
9d76c16
commit 3ed04a0
Showing
5 changed files
with
145 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'image_optim/worker' | ||
require 'image_optim/option_helpers' | ||
require 'image_optim/true_false_nil' | ||
|
||
class ImageOptim | ||
class Worker | ||
# https://github.com/shssoichiro/oxipng | ||
class Oxipng < Worker | ||
LEVEL_OPTION = | ||
option(:level, 3, 'Optimization level preset: '\ | ||
'`0` is least, '\ | ||
'`6` is best') do |v| | ||
OptionHelpers.limit_with_range(v.to_i, 0..6) | ||
end | ||
|
||
INTERLACE_OPTION = | ||
option(:interlace, false, TrueFalseNil, 'Interlace: '\ | ||
'`true` - interlace on, '\ | ||
'`false` - interlace off, '\ | ||
'`nil` - as is in original image') do |v| | ||
TrueFalseNil.convert(v) | ||
end | ||
|
||
STRIP_OPTION = | ||
option(:strip, true, 'Remove all auxiliary chunks'){ |v| !!v } | ||
|
||
def run_order | ||
-4 | ||
end | ||
|
||
def optimize(src, dst) | ||
src.copy(dst) | ||
args = %W[ | ||
-o #{level} | ||
--quiet | ||
#{dst} | ||
] | ||
args.unshift "-i#{interlace ? 1 : 0}" unless interlace.nil? | ||
if strip | ||
args.unshift '--strip', 'all' | ||
end | ||
execute(:oxipng, *args) && optimized?(src, dst) | ||
end | ||
|
||
def optimized?(src, dst) | ||
interlace ? dst.size? : super | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper' | ||
require 'image_optim/worker/oxipng' | ||
require 'image_optim/path' | ||
|
||
describe ImageOptim::Worker::Oxipng do | ||
describe 'strip option' do | ||
subject{ described_class.new(ImageOptim.new, options) } | ||
|
||
let(:options){ {} } | ||
let(:src){ instance_double(ImageOptim::Path, :copy => nil) } | ||
let(:dst){ instance_double(ImageOptim::Path) } | ||
|
||
before do | ||
oxipng_bin = instance_double(ImageOptim::BinResolver::Bin) | ||
allow(subject).to receive(:resolve_bin!). | ||
with(:oxipng).and_return(oxipng_bin) | ||
|
||
allow(subject).to receive(:optimized?) | ||
end | ||
|
||
context 'by default' do | ||
it 'should add --strip all to arguments' do | ||
expect(subject).to receive(:execute) do |_bin, *args| | ||
expect(args.join(' ')).to match(/(^| )--strip all($| )/) | ||
end | ||
|
||
subject.optimize(src, dst) | ||
end | ||
end | ||
|
||
context 'when strip is disabled' do | ||
let(:options){ {:strip => false} } | ||
|
||
it 'should not add --strip all to arguments' do | ||
expect(subject).to receive(:execute) do |_bin, *args| | ||
expect(args.join(' ')).not_to match(/(^| )--strip all($| )/) | ||
end | ||
|
||
subject.optimize(src, dst) | ||
end | ||
end | ||
end | ||
|
||
describe '#optimized?' do | ||
let(:src){ instance_double(ImageOptim::Path, src_options) } | ||
let(:dst){ instance_double(ImageOptim::Path, dst_options) } | ||
let(:src_options){ {:size => 10} } | ||
let(:dst_options){ {:size? => 9} } | ||
let(:instance){ described_class.new(ImageOptim.new, instance_options) } | ||
let(:instance_options){ {} } | ||
|
||
subject{ instance.optimized?(src, dst) } | ||
|
||
context 'when interlace option is enabled' do | ||
let(:instance_options){ {:interlace => true} } | ||
|
||
context 'when dst is empty' do | ||
let(:dst_options){ {:size? => nil} } | ||
it{ is_expected.to be_falsy } | ||
end | ||
|
||
context 'when dst is not empty' do | ||
let(:dst_options){ {:size? => 20} } | ||
it{ is_expected.to be_truthy } | ||
end | ||
end | ||
|
||
context 'when interlace option is disabled' do | ||
let(:instance_options){ {:interlace => false} } | ||
|
||
context 'when dst is empty' do | ||
let(:dst_options){ {:size? => nil} } | ||
it{ is_expected.to be_falsy } | ||
end | ||
|
||
context 'when dst is greater than or equal to src' do | ||
let(:dst_options){ {:size? => 10} } | ||
it{ is_expected.to be_falsy } | ||
end | ||
|
||
context 'when dst is less than src' do | ||
let(:dst_options){ {:size? => 9} } | ||
it{ is_expected.to be_truthy } | ||
end | ||
end | ||
end | ||
end |