return(q-compressed_pixels);
}
-static void WritePackbitsLength(const ImageInfo *image_info,Image *image,
- Image *tmp_image,unsigned char *pixels,unsigned char *compressed_pixels,
+static void WritePackbitsLength(const PSDInfo *psd_info,
+ const ImageInfo *image_info,Image *image,Image *tmp_image,
+ unsigned char *pixels,unsigned char *compressed_pixels,
const QuantumType quantum_type)
{
int
length=ExportQuantumPixels(tmp_image,(CacheView *) NULL,quantum_info,
quantum_type,pixels,&image->exception);
length=PSDPackbitsEncodeImage(image,length,pixels,compressed_pixels);
- (void) WriteBlobMSBShort(image,length);
+ (void) SetPSDOffset(psd_info,image,length);
}
quantum_info=DestroyQuantumInfo(quantum_info);
}
-static void WriteOneChannel(const ImageInfo *image_info,Image *image,
- Image *tmp_image,unsigned char *pixels,unsigned char *compressed_pixels,
- const QuantumType quantum_type,const MagickBooleanType compression_flag)
+static void WriteOneChannel(const PSDInfo *psd_info,const ImageInfo *image_info,
+ Image *image,Image *tmp_image,unsigned char *pixels,
+ unsigned char *compressed_pixels,const QuantumType quantum_type,
+ const MagickBooleanType compression_flag)
{
int
y;
quantum_info=DestroyQuantumInfo(quantum_info);
}
-static MagickBooleanType WriteImageChannels(const ImageInfo *image_info,
- Image *image,Image *tmp_image,const MagickBooleanType separate)
+static MagickBooleanType WriteImageChannels(const PSDInfo *psd_info,
+ const ImageInfo *image_info,Image *image,Image *tmp_image,
+ const MagickBooleanType separate)
{
int
i;
*pixels;
/*
- Write uncompressed pixel datas separate planes.
+ Write uncompressed pixels as separate planes.
*/
channels=1;
if ((tmp_image->storage_class == PseudoClass) &&
*/
(void) WriteBlobMSBShort(image,1);
if (tmp_image->matte == MagickFalse)
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,IndexQuantum);
else
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,IndexAlphaQuantum);
}
if (tmp_image->matte == MagickFalse)
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- IndexQuantum,(i++ == 0) || (separate != MagickFalse) ?
- MagickTrue : MagickFalse);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,IndexQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
else
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- IndexAlphaQuantum,(i++ == 0) || (separate != MagickFalse) ?
- MagickTrue : MagickFalse);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,IndexAlphaQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
(void) SetImageProgress(image,SaveImagesTag,0,1);
}
else
*/
(void) WriteBlobMSBShort(image,1);
if (tmp_image->matte != MagickFalse)
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,AlphaQuantum);
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,RedQuantum);
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,GreenQuantum);
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,BlueQuantum);
if (tmp_image->colorspace == CMYKColorspace)
- WritePackbitsLength(image_info,image,tmp_image,pixels,
+ WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
compressed_pixels,BlackQuantum);
}
(void) SetImageProgress(image,SaveImagesTag,0,6);
if (tmp_image->matte != MagickFalse)
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- AlphaQuantum,(i++ == 0) || (separate != MagickFalse) ?
- MagickTrue : MagickFalse);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,AlphaQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
(void) SetImageProgress(image,SaveImagesTag,1,6);
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- RedQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,RedQuantum,(i++ == 0) || (separate != MagickFalse) ?
MagickTrue : MagickFalse);
(void) SetImageProgress(image,SaveImagesTag,2,6);
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- GreenQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,GreenQuantum,(i++ == 0) || (separate != MagickFalse) ?
MagickTrue : MagickFalse);
(void) SetImageProgress(image,SaveImagesTag,3,6);
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- BlueQuantum,(i++ == 0) || (separate != MagickFalse) ?
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,BlueQuantum,(i++ == 0) || (separate != MagickFalse) ?
MagickTrue : MagickFalse);
(void) SetImageProgress(image,SaveImagesTag,4,6);
if (tmp_image->colorspace == CMYKColorspace)
{
- WriteOneChannel(image_info,image,tmp_image,pixels,compressed_pixels,
- BlackQuantum,(i++ == 0) || (separate != MagickFalse) ?
- MagickTrue : MagickFalse);
+ WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+ compressed_pixels,BlackQuantum,(i++ == 0) ||
+ (separate != MagickFalse) ? MagickTrue : MagickFalse);
(void) NegateImage(image,MagickFalse);
}
(void) SetImageProgress(image,SaveImagesTag,5,6);
invert_layer_count = MagickFalse,
status;
+ PSDInfo
+ psd_info;
+
register long
i;
packet_size=(size_t) (image->depth > 8 ? 6 : 3);
if (image->matte != MagickFalse)
packet_size+=image->depth > 8 ? 2 : 1;
- (void) WriteBlob(image,4,(const unsigned char *) "8BPS");
- (void) WriteBlobMSBShort(image,1); /* version */
- for ( i=1; i<=6; i++)
- (void) WriteBlobByte(image, 0); /* 6 bytes of reserved */
+ psd_info.version=1;
+ if ((LocaleCompare(image_info->magick,"PSB") == 0) ||
+ (image->columns > 30000) || (image->rows > 30000))
+ psd_info.version=2;
+ (void) WriteBlob(image,4,(const unsigned char *) (psd_info.version == 1 ?
+ "8BPS" : "8BPB"));
+ (void) WriteBlobMSBShort(image,psd_info.version); /* version */
+ for (i=1; i <= 6; i++)
+ (void) WriteBlobByte(image, 0); /* 6 bytes of reserved */
if ( force_white_background )
num_channels = 3;
else
}
if ( layer_count == 0 )
- (void) WriteBlobMSBLong(image, 0);
+ (void) SetPSDSize(&psd_info,image,0);
else
{
(void) WriteBlobMSBLong(image,layer_info_size+4+4);
/* now the image data! */
tmp_image = base_image;
while ( tmp_image != NULL ) {
- status=WriteImageChannels(image_info,image,tmp_image,MagickTrue);
+ status=WriteImageChannels(&psd_info,image_info,image,tmp_image,MagickTrue);
/* add in the pad! */
if ( rounded_layer_info_size != layer_info_size )
if (force_white_background != MagickFalse)
WriteWhiteBackground(image);
else
- status=WriteImageChannels(image_info,image,image,MagickFalse);
+ status=WriteImageChannels(&psd_info,image_info,image,image,MagickFalse);
(void) CloseBlob(image);
return(status);