% 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 %
#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"
char
*hex_signature;
- QuantumInfo
- *quantum_info;
-
- QuantumType
- quantum_type;
+ double
+ pixel;
register const Quantum
*p;
SignatureInfo
*signature_info;
- size_t
- length;
-
ssize_t
y;
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.
*/