From 948bc22ae40527153b8b2abefd74e7da9901e0c0 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Fri, 1 Sep 2017 19:16:27 +0000 Subject: [PATCH 1/2] t/img.t: test determinism of PNG resizing. --- t/img.t | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/t/img.t b/t/img.t index 20c960500..6049042c2 100755 --- a/t/img.t +++ b/t/img.t @@ -155,6 +155,19 @@ ok(! -e "$outpath/666x-really-pdf.jpg"); like($outhtml, qr/${quot}really-pdf\.png${quot} does not seem to be a valid png file/); ok(! -e "$outpath/666x-really-pdf.png"); +# resize is deterministic when deterministic=1 +ok(utime(333333333, 333333333, "t/tmp/in/redsquare.png")); +ok(! system("rm $outpath/10x-redsquare.png")); +ok(! system(@command, '--set-yaml', 'img_allowed_formats=[JPEG, PNG, svg, pdf]', '--set', 'deterministic=1', "--rebuild")); +ok(! system("cp $outpath/10x-redsquare.png $outpath/10x-redsquare.png.orig")); +ok(utime(444444444, 444444444, "t/tmp/in/redsquare.png")); +ok(! system("rm $outpath/10x-redsquare.png")); +ok(! system(@command, '--set-yaml', 'img_allowed_formats=[JPEG, PNG, svg, pdf]', '--set', 'deterministic=1', "--rebuild")); +ok( + ! system("cmp $outpath/10x-redsquare.png $outpath/10x-redsquare.png.orig"), + "resize is deterministic when configured with deterministic=1" +); + # disable support for uncommon formats and try again ok(! system(@command, "--rebuild")); ok(! -e "$outpath/10x-bluesquare.png"); From 146f1d9ab546ffc4aebef79340c6691720513f46 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Fri, 1 Sep 2017 19:26:26 +0000 Subject: [PATCH 2/2] img: resize images in a deterministic manner. --- IkiWiki/Plugin/img.pm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm index 740c44f96..79cfba20f 100644 --- a/IkiWiki/Plugin/img.pm +++ b/IkiWiki/Plugin/img.pm @@ -174,6 +174,12 @@ sub preprocess (@) { my $r = $im->Read("$format:$srcfile\[$pagenumber]"); error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r; + if ($config{deterministic}) { + $im->Set('date:create' => 0); + $im->Set('date:modify' => 0); + $im->Set('option' => 'png:exclude-chunk=time'); + } + if (! defined $im->Get("width") || ! defined $im->Get("height")) { error sprintf(gettext("failed to get dimensions of %s"), $file); }