diff options
author | Yorhel <git@yorhel.nl> | 2016-01-03 20:43:54 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2016-01-10 09:21:29 +0100 |
commit | 2a62230db34e26ea8c4182754470252b872131bd (patch) | |
tree | 39ad6a707a8d9afa50d63032ba5b9467975f6371 /util | |
parent | 3fa146962f64c2a12235ca9fc08b249b2bfc29ac (diff) |
Support zopfli/zopflipng for all static asset generators
Compresses a little better. I reduced the number of iterations required
to find the optimal image size in spritegen.pl, but generating the
icons.png is *incredibly slow* when combining zopflipng with the 'slow'
option. It's possible to parallelize the calculation and use multiple
cores to speed it up, but that seems overkill.
Some icons.png compression stats:
METHOD SIZE RUNTIME
default 18103 <1sec
slow 17941 few secs
pngcrush 15385 <1sec
pngcrush+slow 15148 few mins
zopflipng 14986 few secs
zopflipng+slow 14898 ~1 hour
Diffstat (limited to 'util')
-rwxr-xr-x | util/jsgen.pl | 2 | ||||
-rwxr-xr-x | util/skingen.pl | 8 | ||||
-rwxr-xr-x | util/spritegen.pl | 37 |
3 files changed, 25 insertions, 22 deletions
diff --git a/util/jsgen.pl b/util/jsgen.pl index 72c78d9f..c677d791 100755 --- a/util/jsgen.pl +++ b/util/jsgen.pl @@ -183,6 +183,8 @@ sub save { } rename "$f~", $f or die $!; + + `$VNDB::JSGEN{gzip} -c '$f' >'$f.gz'` if $VNDB::JSGEN{gzip}; } sub jsgen { diff --git a/util/skingen.pl b/util/skingen.pl index 834578cb..aa5db2d5 100755 --- a/util/skingen.pl +++ b/util/skingen.pl @@ -72,9 +72,15 @@ sub writeskin { # $name my $css = join '', <$CSS>; close $CSS; $css =~ s/\$$_\$/$o{$_}/g for (keys %o); - open my $SKIN, '>', "$ROOT/static/s/$name/style.css" or die $!; + + my $f = "$ROOT/static/s/$name/style.css"; + open my $SKIN, '>', "$f~" or die $!; print $SKIN $CSS::Minifier::XS::VERSION ? CSS::Minifier::XS::minify($css) : $css; close $SKIN; + + rename "$f~", $f; + + `$VNDB::SKINGEN{gzip} -c '$f' >'$f.gz'` if $VNDB::SKINGEN{gzip}; } diff --git a/util/spritegen.pl b/util/spritegen.pl index 3b3c88c3..e8b60017 100755 --- a/util/spritegen.pl +++ b/util/spritegen.pl @@ -60,7 +60,11 @@ sub genstrip { $i->{y} = $h; $h += $i->{h}; } - return $h; + + # Recalculate the (actually used) width + $w = 0; + $w < $_->{x}+$_->{w} && ($w = $_->{x}+$_->{w}) for (@img); + ($w, $h); } @@ -78,33 +82,25 @@ sub minstrip { $minwidth = $_->{w} if $_->{w} > $minwidth; $maxwidth += $_->{w}; } - my $optw; - my $optsize = 1e10; - for my $w ($minwidth..$maxwidth) { - my $size = genstrip($w)*$w; + + my($optsize, $w, $h, $optw, $opth) = (1e9, $maxwidth); + while($w >= $minwidth) { + ($w, $h) = genstrip($w); # Optimize for file size rather than pixel count if slow is set - $size = img() if $VNDB::SPRITEGEN{slow}; + my $size = $VNDB::SPRITEGEN{slow} ? img($w, $h) : $w*$h; if($size < $optsize) { $optw = $w; + $opth = $h; $optsize = $size; } + $w--; } genstrip($optw); } -sub calcdim { - my($w, $h) = (0,0); - for (@img) { - $w = $_->{x}+$_->{w} if $w < $_->{x}+$_->{w}; - $h = $_->{y}+$_->{h} if $h < $_->{y}+$_->{h}; - } - ($w, $h) -} - - sub img { - my($w, $h) = calcdim; + my($w, $h) = @_; my $img = Image::Magick->new; print $img->Set(size => "${w}x$h"); print $img->ReadImage('canvas:rgba(0,0,0,0)'); @@ -115,8 +111,8 @@ sub img { print $img->Write("png32:$ticons"); undef $img; - if($VNDB::SPRITEGEN{pngcrush}) { - `$VNDB::SPRITEGEN{pngcrush} -q "$ticons" "$ticons~"`; + if($VNDB::SPRITEGEN{crush}) { + `$VNDB::SPRITEGEN{crush} "$ticons" "$ticons~"`; rename "$ticons~", $ticons or die $!; } @@ -144,7 +140,6 @@ sub css { } -minstrip; -img; +img minstrip; css; rename $ticons, $icons or die $!; |