]> git.sesse.net Git - pr0n/blobdiff - perl/Sesse/pr0n/Common.pm
Do dcraw delegation stuff ourselves, which should hopefully finally fix the
[pr0n] / perl / Sesse / pr0n / Common.pm
index 6fb5536f5911e312034042b57a1f73f379bef3b3..d7a081d1f8241bc6e7e6805b63a13906461d7c3b 100644 (file)
@@ -314,11 +314,23 @@ sub ensure_cached {
                # Need to generate the cache; read in the image
                my $magick = new Image::Magick;
                my $info = Image::ExifTool::ImageInfo($fname);
-
-               # NEF files aren't autodetected
-               $fname = "NEF:$fname" if ($filename =~ /\.nef$/i);
+               my $err;
+
+               # ImageMagick can handle NEF files, but it does it by calling dcraw as a delegate.
+               # The delegate support is rather broken and causes very odd stuff to happen when
+               # more than one thread does this at the same time. Thus, we simply do it ourselves.
+               if ($filename =~ /\.nef$/) {
+                       # this would suffice if ImageMagick gets to fix their handling
+                       # $fname = "NEF:$fname";
+                       
+                       open DCRAW, "-|", "dcraw", "-w", "-c", $fname
+                               or error("dcraw: $!");
+                       $err = $magick->Read(file => \*DCRAW);
+                       close(DCRAW);
+               } else {
+                       $err = $magick->Read($fname);
+               }
                
-               my $err = $magick->Read($fname);
                if ($err) {
                        $r->log->warn("$fname: $err");
                        $err =~ /(\d+)/;