]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/signature.c
(no commit message)
[imagemagick] / MagickCore / signature.c
index 97bdd6d67cfa0aee3e6f414efade9d00a6cd9f97..31ddd1c5bbed3f0a98f72f3f32517421dbf1e4e8 100644 (file)
@@ -16,7 +16,7 @@
 %                              December 1992                                  %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -46,6 +46,7 @@
 #include "MagickCore/property.h"
 #include "MagickCore/image.h"
 #include "MagickCore/memory_.h"
+#include "MagickCore/pixel-accessor.h"
 #include "MagickCore/quantum.h"
 #include "MagickCore/quantum-private.h"
 #include "MagickCore/signature.h"
@@ -476,11 +477,8 @@ MagickExport MagickBooleanType SignatureImage(Image *image,
   char
     *hex_signature;
 
-  QuantumInfo
-    *quantum_info;
-
-  QuantumType
-    quantum_type;
+  double
+    pixel;
 
   register const Quantum
     *p;
@@ -488,9 +486,6 @@ MagickExport MagickBooleanType SignatureImage(Image *image,
   SignatureInfo
     *signature_info;
 
-  size_t
-    length;
-
   ssize_t
     y;
 
@@ -507,40 +502,62 @@ MagickExport MagickBooleanType SignatureImage(Image *image,
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
-  if (quantum_info == (QuantumInfo *) NULL)
-    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
-      image->filename);
-  quantum_type=RGBQuantum;
-  if (image->matte != MagickFalse)
-    quantum_type=RGBAQuantum;
-  if (image->colorspace == CMYKColorspace)
-    {
-      quantum_type=CMYKQuantum;
-      if (image->matte != MagickFalse)
-        quantum_type=CMYKAQuantum;
-    }
   signature_info=AcquireSignatureInfo();
-  signature=AcquireStringInfo(quantum_info->extent);
-  pixels=GetQuantumPixels(quantum_info);
-  image_view=AcquireCacheView(image);
+  signature=AcquireStringInfo(image->columns*GetPixelChannels(image)*
+    sizeof(pixel));
+  pixels=GetStringInfoDatum(signature);
+  image_view=AcquireVirtualCacheView(image,exception);
   for (y=0; y < (ssize_t) image->rows; y++)
   {
+    register ssize_t
+      x;
+
+    register unsigned char
+      *q;
+
     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
     if (p == (const Quantum *) NULL)
       break;
-    length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type,
-      pixels,&image->exception);
-    SetStringInfoLength(signature,length);
-    SetStringInfoDatum(signature,pixels);
+    q=pixels;
+    for (x=0; x < (ssize_t) image->columns; x++)
+    {
+      register ssize_t
+        i;
+
+      if (GetPixelMask(image,p) != 0)
+        {
+          p+=GetPixelChannels(image);
+          continue;
+        }
+      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+      {
+        PixelChannel
+          channel;
+
+        PixelTrait
+          traits;
+
+        register ssize_t
+          j;
+
+        channel=GetPixelChannelMapChannel(image,i);
+        traits=GetPixelChannelMapTraits(image,channel);
+        if (traits == UndefinedPixelTrait)
+          continue;
+        pixel=QuantumScale*p[i];
+        for (j=0; j < (ssize_t) sizeof(pixel); j++)
+          *q++=(unsigned char) (&pixel)[j];
+      }
+      p+=GetPixelChannels(image);
+    }
+    SetStringInfoLength(signature,(size_t) (q-pixels));
     UpdateSignature(signature_info,signature);
   }
   image_view=DestroyCacheView(image_view);
-  quantum_info=DestroyQuantumInfo(quantum_info);
   FinalizeSignature(signature_info);
   hex_signature=StringInfoToHexString(GetSignatureDigest(signature_info));
   (void) DeleteImageProperty(image,"signature");
-  (void) SetImageProperty(image,"signature",hex_signature);
+  (void) SetImageProperty(image,"signature",hex_signature,exception);
   /*
     Free resources.
   */