summaryrefslogtreecommitdiff
path: root/util/spritegen.pl
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2016-01-03 20:43:54 +0100
committerYorhel <git@yorhel.nl>2016-01-10 09:21:29 +0100
commit2a62230db34e26ea8c4182754470252b872131bd (patch)
tree39ad6a707a8d9afa50d63032ba5b9467975f6371 /util/spritegen.pl
parent3fa146962f64c2a12235ca9fc08b249b2bfc29ac (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/spritegen.pl')
-rwxr-xr-xutil/spritegen.pl37
1 files changed, 16 insertions, 21 deletions
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 $!;