]> git.sesse.net Git - pr0n/commitdiff
Do dcraw delegation stuff ourselves, which should hopefully finally fix the
authorSteinar H. Gunderson <sesse@debian.org>
Mon, 23 Jul 2007 09:23:05 +0000 (11:23 +0200)
committerSteinar H. Gunderson <sesse@debian.org>
Mon, 23 Jul 2007 09:23:05 +0000 (11:23 +0200)
NEF-and-threading bugs.

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);
                # 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+)/;
                if ($err) {
                        $r->log->warn("$fname: $err");
                        $err =~ /(\d+)/;