if (tmp_image->depth > 8)
tmp_image->depth=16;
- else
- tmp_image->depth=8;
packet_size=tmp_image->depth > 8UL ? 2UL : 1UL;
quantum_info=AcquireQuantumInfo(image_info,image);
for (y=0; y < (long) tmp_image->rows; y++)
int
y;
+ MagickBooleanType
+ monochrome;
+
QuantumInfo
*quantum_info;
register const PixelPacket
*p;
+ register long
+ i;
+
size_t
length,
packet_size;
(void) WriteBlobMSBShort(image,0);
if (tmp_image->depth > 8)
tmp_image->depth=16;
- else
- tmp_image->depth=8;
+ monochrome=IsMonochromeImage(image,&image->exception);
packet_size=tmp_image->depth > 8UL ? 2UL : 1UL;
quantum_info=AcquireQuantumInfo(image_info,image);
for (y=0; y < (long) tmp_image->rows; y++)
break;
length=ExportQuantumPixels(tmp_image,(CacheView *) NULL,quantum_info,
quantum_type,pixels,&image->exception);
+ if (monochrome != MagickFalse)
+ for (i=0; i < length; i++)
+ pixels[i]=(~pixels[i]);
if (tmp_image->compression != RLECompression)
(void) WriteBlob(image,length,pixels);
else
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
}
i=0;
- if (tmp_image->storage_class == PseudoClass)
+ if (IsMonochromeImage(tmp_image,&tmp_image->exception) != MagickFalse)
{
- if (tmp_image->compression == RLECompression)
- {
- /*
- Packbits compression.
- */
- (void) WriteBlobMSBShort(image,1);
- if (tmp_image->matte == MagickFalse)
- WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,IndexQuantum);
- else
- WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,IndexAlphaQuantum);
- }
- if (tmp_image->matte == MagickFalse)
- WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,IndexQuantum,(i++ == 0) ||
- (separate != MagickFalse) ? MagickTrue : MagickFalse);
- else
- WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,IndexAlphaQuantum,(i++ == 0) ||
- (separate != MagickFalse) ? MagickTrue : MagickFalse);
- (void) SetImageProgress(image,SaveImagesTag,0,1);
- }
- else
- {
- if (tmp_image->colorspace == CMYKColorspace)
- (void) NegateImage(image,MagickFalse);
if (tmp_image->compression == RLECompression)
{
/*
WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compact_pixels,AlphaQuantum);
WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,RedQuantum);
- WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,GreenQuantum);
- WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,BlueQuantum);
- if (tmp_image->colorspace == CMYKColorspace)
- WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,BlackQuantum);
+ compact_pixels,GrayQuantum);
}
- (void) SetImageProgress(image,SaveImagesTag,0,6);
- if (tmp_image->matte != MagickFalse)
- WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,AlphaQuantum,(i++ == 0) ||
- (separate != MagickFalse) ? MagickTrue : MagickFalse);
- (void) SetImageProgress(image,SaveImagesTag,1,6);
WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,RedQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ compact_pixels,GrayQuantum,(i++ == 0) || (separate != MagickFalse) ?
MagickTrue : MagickFalse);
- (void) SetImageProgress(image,SaveImagesTag,2,6);
- WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,GreenQuantum,(i++ == 0) || (separate != MagickFalse) ?
- MagickTrue : MagickFalse);
- (void) SetImageProgress(image,SaveImagesTag,3,6);
- WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,BlueQuantum,(i++ == 0) || (separate != MagickFalse) ?
- MagickTrue : MagickFalse);
- (void) SetImageProgress(image,SaveImagesTag,4,6);
- if (tmp_image->colorspace == CMYKColorspace)
- {
+ }
+ else
+ if (tmp_image->storage_class == PseudoClass)
+ {
+ if (tmp_image->compression == RLECompression)
+ {
+ /*
+ Packbits compression.
+ */
+ (void) WriteBlobMSBShort(image,1);
+ if (tmp_image->matte == MagickFalse)
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,IndexQuantum);
+ else
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,IndexAlphaQuantum);
+ }
+ if (tmp_image->matte == MagickFalse)
WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
- compact_pixels,BlackQuantum,(i++ == 0) ||
+ compact_pixels,IndexQuantum,(i++ == 0) ||
(separate != MagickFalse) ? MagickTrue : MagickFalse);
+ else
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,IndexAlphaQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
+ (void) SetImageProgress(image,SaveImagesTag,0,1);
+ }
+ else
+ {
+ if (tmp_image->colorspace == CMYKColorspace)
(void) NegateImage(image,MagickFalse);
- }
- (void) SetImageProgress(image,SaveImagesTag,5,6);
- }
+ if (tmp_image->compression == RLECompression)
+ {
+ /*
+ Packbits compression.
+ */
+ (void) WriteBlobMSBShort(image,1);
+ if (tmp_image->matte != MagickFalse)
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,AlphaQuantum);
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,RedQuantum);
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,GreenQuantum);
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,BlueQuantum);
+ if (tmp_image->colorspace == CMYKColorspace)
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,BlackQuantum);
+ }
+ (void) SetImageProgress(image,SaveImagesTag,0,6);
+ if (tmp_image->matte != MagickFalse)
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,AlphaQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
+ (void) SetImageProgress(image,SaveImagesTag,1,6);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,RedQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ MagickTrue : MagickFalse);
+ (void) SetImageProgress(image,SaveImagesTag,2,6);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,GreenQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ MagickTrue : MagickFalse);
+ (void) SetImageProgress(image,SaveImagesTag,3,6);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,BlueQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ MagickTrue : MagickFalse);
+ (void) SetImageProgress(image,SaveImagesTag,4,6);
+ if (tmp_image->colorspace == CMYKColorspace)
+ {
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compact_pixels,BlackQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
+ (void) NegateImage(image,MagickFalse);
+ }
+ (void) SetImageProgress(image,SaveImagesTag,5,6);
+ }
pixels=(unsigned char *) RelinquishMagickMemory(pixels);
return(MagickTrue);
}
(void) WriteBlobMSBShort(image,psd_info.version); /* version */
for (i=1; i <= 6; i++)
(void) WriteBlobByte(image, 0); /* 6 bytes of reserved */
- if (image->storage_class == PseudoClass)
- num_channels=(image->matte ? 2UL : 1UL);
+ if (IsMonochromeImage(image,&image->exception) != MagickFalse)
+ num_channels=1;
else
- {
- if (image->colorspace != CMYKColorspace)
- num_channels=(image->matte ? 4UL : 3UL);
- else
- num_channels=(image->matte ? 5UL : 4UL);
- }
+ if (image->storage_class == PseudoClass)
+ num_channels=(image->matte ? 2UL : 1UL);
+ else
+ {
+ if (image->colorspace != CMYKColorspace)
+ num_channels=(image->matte ? 4UL : 3UL);
+ else
+ num_channels=(image->matte ? 5UL : 4UL);
+ }
(void) WriteBlobMSBShort(image,(unsigned short) num_channels);
(void) WriteBlobMSBLong(image,(unsigned int) image->rows);
(void) WriteBlobMSBLong(image,(unsigned int) image->columns);
- (void) WriteBlobMSBShort(image,(unsigned short)
- (image->storage_class == PseudoClass ? 8 : image->depth > 8 ? 16 : 8));
- if (((image->colorspace != UndefinedColorspace) ||
- (image->colorspace != CMYKColorspace)) &&
- (image->colorspace != CMYKColorspace))
+ if (IsMonochromeImage(image,&image->exception) != MagickFalse)
{
- if (image->colorspace != RGBColorspace)
- (void) TransformImageColorspace(image,RGBColorspace);
- (void) WriteBlobMSBShort(image,(unsigned short)
- (image->storage_class == PseudoClass ? 2 : 3));
+ /*
+ Write depth & mode.
+ */
+ (void) WriteBlobMSBShort(image,1);
+ (void) WriteBlobMSBShort(image,0);
}
else
{
- if (image->colorspace != RGBColorspace)
- (void) TransformImageColorspace(image,CMYKColorspace);
- (void) WriteBlobMSBShort(image,4);
+ (void) WriteBlobMSBShort(image,(unsigned short)
+ (image->storage_class == PseudoClass ? 8 : image->depth > 8 ? 16 : 8));
+ if (((image->colorspace != UndefinedColorspace) ||
+ (image->colorspace != CMYKColorspace)) &&
+ (image->colorspace != CMYKColorspace))
+ {
+ if (image->colorspace != RGBColorspace)
+ (void) TransformImageColorspace(image,RGBColorspace);
+ (void) WriteBlobMSBShort(image,(unsigned short)
+ (image->storage_class == PseudoClass ? 2 : 3));
+ }
+ else
+ {
+ if (image->colorspace != RGBColorspace)
+ (void) TransformImageColorspace(image,CMYKColorspace);
+ (void) WriteBlobMSBShort(image,4);
+ }
}
if ((image->storage_class == DirectClass) || (image->colors > 256))
(void) WriteBlobMSBLong(image,0);
MagickExport MagickBooleanType IsGrayImage(const Image *image,
ExceptionInfo *exception)
{
+ CacheView
+ *image_view;
+
ImageType
type;
+ long
+ y;
+
register const PixelPacket
*p;
+ register long
+ x;
+
assert(image != (Image *) NULL);
assert(image->signature == MagickSignature);
if (image->debug != MagickFalse)
if (image->colorspace == CMYKColorspace)
return(MagickFalse);
type=BilevelType;
- switch (image->storage_class)
+ image_view=AcquireCacheView(image);
+ for (y=0; y < (long) image->rows; y++)
{
- case DirectClass:
- case UndefinedClass:
+ p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ for (x=0; x < (long) image->columns; x++)
{
- long
- y;
-
- register long
- x;
-
- CacheView
- *image_view;
-
- image_view=AcquireCacheView(image);
- for (y=0; y < (long) image->rows; y++)
- {
- p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
- if (p == (const PixelPacket *) NULL)
- break;
- for (x=0; x < (long) image->columns; x++)
+ if (IsGrayPixel(p) == MagickFalse)
{
- if (IsGrayPixel(p) == MagickFalse)
- {
- type=UndefinedType;
- break;
- }
- if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
- type=GrayscaleType;
- p++;
- }
- if (type == UndefinedType)
+ type=UndefinedType;
break;
- }
- image_view=DestroyCacheView(image_view);
- break;
+ }
+ if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
+ type=GrayscaleType;
+ p++;
}
- case PseudoClass:
- {
- register long
- i;
-
- p=image->colormap;
- for (i=0; i < (long) image->colors; i++)
- {
- if (IsGrayPixel(p) == MagickFalse)
- {
- type=UndefinedType;
- break;
- }
- if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
- type=GrayscaleType;
- p++;
- }
+ if (type == UndefinedType)
break;
- }
}
+ image_view=DestroyCacheView(image_view);
if (type == UndefinedType)
return(MagickFalse);
((Image *) image)->type=type;
MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
ExceptionInfo *exception)
{
+ CacheView
+ *image_view;
+
ImageType
type;
+ long
+ y;
+
+ register long
+ x;
+
register const PixelPacket
*p;
if (image->colorspace == CMYKColorspace)
return(MagickFalse);
type=BilevelType;
- switch (image->storage_class)
+ image_view=AcquireCacheView(image);
+ for (y=0; y < (long) image->rows; y++)
{
- case DirectClass:
- case UndefinedClass:
+ p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ for (x=0; x < (long) image->columns; x++)
{
- long
- y;
-
- register long
- x;
-
- CacheView
- *image_view;
-
- image_view=AcquireCacheView(image);
- for (y=0; y < (long) image->rows; y++)
- {
- p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
- if (p == (const PixelPacket *) NULL)
- break;
- for (x=0; x < (long) image->columns; x++)
+ if (IsMonochromePixel(p) == MagickFalse)
{
- if (IsMonochromePixel(p) == MagickFalse)
- {
- type=UndefinedType;
- break;
- }
- p++;
- }
- if (type == UndefinedType)
+ type=UndefinedType;
break;
- }
- image_view=DestroyCacheView(image_view);
- break;
+ }
+ p++;
}
- case PseudoClass:
- {
- register long
- i;
-
- p=image->colormap;
- for (i=0; i < (long) image->colors; i++)
- {
- if (IsMonochromePixel(p) == MagickFalse)
- {
- type=UndefinedType;
- break;
- }
- p++;
- }
+ if (type == UndefinedType)
break;
- }
}
+ image_view=DestroyCacheView(image_view);
if (type == UndefinedType)
return(MagickFalse);
((Image *) image)->type=type;