% Read/Write ZSoft IBM PC Paintbrush Image Format %
% %
% Software Design %
-% John Cristy %
+% Cristy %
% July 1992 %
% %
% %
-% Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2014 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 %
offset,
*page_table;
+ MemoryInfo
+ *pixel_info;
+
PCXInfo
pcx_info;
unsigned char
packet,
*pcx_colormap,
- *pcx_pixels,
+ *pixels,
*scanline;
/*
/*
Read image data.
*/
- pcx_packets=(size_t) image->rows*pcx_info.bytes_per_line*
- pcx_info.planes;
- pcx_pixels=(unsigned char *) AcquireQuantumMemory(pcx_packets,
- sizeof(*pcx_pixels));
+ pcx_packets=(size_t) image->rows*pcx_info.bytes_per_line*pcx_info.planes;
scanline=(unsigned char *) AcquireQuantumMemory(MagickMax(image->columns,
pcx_info.bytes_per_line),MagickMax(8,pcx_info.planes)*sizeof(*scanline));
- if ((pcx_pixels == (unsigned char *) NULL) ||
- (scanline == (unsigned char *) NULL))
- ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+ pixel_info=AcquireVirtualMemory(pcx_packets,sizeof(*pixels));
+ if ((scanline == (unsigned char *) NULL) ||
+ (pixel_info == (MemoryInfo *) NULL))
+ {
+ if (scanline != (unsigned char *) NULL)
+ scanline=(unsigned char *) RelinquishMagickMemory(scanline);
+ if (pixel_info != (MemoryInfo *) NULL)
+ pixel_info=RelinquishVirtualMemory(pixel_info);
+ ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+ }
+ pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
/*
Uncompress image data.
*/
- p=pcx_pixels;
+ p=pixels;
if (pcx_info.encoding == 0)
while (pcx_packets != 0)
{
*/
for (y=0; y < (ssize_t) image->rows; y++)
{
- p=pcx_pixels+(y*pcx_info.bytes_per_line*pcx_info.planes);
+ p=pixels+(y*pcx_info.bytes_per_line*pcx_info.planes);
q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
break;
}
if (image->storage_class == PseudoClass)
(void) SyncImage(image,exception);
- scanline=(unsigned char *) RelinquishMagickMemory(scanline);
if (pcx_colormap != (unsigned char *) NULL)
pcx_colormap=(unsigned char *) RelinquishMagickMemory(pcx_colormap);
- pcx_pixels=(unsigned char *) RelinquishMagickMemory(pcx_pixels);
+ scanline=(unsigned char *) RelinquishMagickMemory(scanline);
+ pixel_info=RelinquishVirtualMemory(pixel_info);
if (EOFBlob(image) != MagickFalse)
{
ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
*page_table,
scene;
+ MemoryInfo
+ *pixel_info;
+
PCXInfo
pcx_info;
unsigned char
*pcx_colormap,
- *pcx_pixels;
+ *pixels;
/*
Open output image file.
status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
if (status == MagickFalse)
return(status);
- if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
- (void) TransformImageColorspace(image,sRGBColorspace,exception);
+ (void) TransformImageColorspace(image,sRGBColorspace,exception);
page_table=(MagickOffsetType *) NULL;
if ((LocaleCompare(image_info->magick,"DCX") == 0) ||
((GetNextImageInList(image) != (Image *) NULL) &&
for (i=0; i < 58; i++)
(void) WriteBlobByte(image,'\0');
length=(size_t) pcx_info.bytes_per_line;
- pcx_pixels=(unsigned char *) AcquireQuantumMemory(length,pcx_info.planes*
- sizeof(*pcx_pixels));
- if (pcx_pixels == (unsigned char *) NULL)
+ pixel_info=AcquireVirtualMemory(length,pcx_info.planes*sizeof(*pixels));
+ if (pixel_info == (MemoryInfo *) NULL)
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
- q=pcx_pixels;
+ pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
+ q=pixels;
if ((image->storage_class == DirectClass) || (image->colors > 256))
{
- const Quantum
- *pixels;
-
/*
Convert DirectClass image to PCX raster pixels.
*/
for (y=0; y < (ssize_t) image->rows; y++)
{
- pixels=GetVirtualPixels(image,0,y,image->columns,1,exception);
- if (pixels == (const Quantum *) NULL)
- break;
- q=pcx_pixels;
+ q=pixels;
for (i=0; i < pcx_info.planes; i++)
{
- p=pixels;
+ p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+ if (p == (const Quantum *) NULL)
+ break;
switch ((int) i)
{
case 0:
}
}
}
- if (PCXWritePixels(&pcx_info,pcx_pixels,image) == MagickFalse)
+ if (PCXWritePixels(&pcx_info,pixels,image) == MagickFalse)
break;
if (image->previous == (Image *) NULL)
{
p=GetVirtualPixels(image,0,y,image->columns,1,exception);
if (p == (const Quantum *) NULL)
break;
- q=pcx_pixels;
+ q=pixels;
for (x=0; x < (ssize_t) image->columns; x++)
{
*q++=(unsigned char) GetPixelIndex(image,p);
p+=GetPixelChannels(image);
}
- if (PCXWritePixels(&pcx_info,pcx_pixels,image) == MagickFalse)
+ if (PCXWritePixels(&pcx_info,pixels,image) == MagickFalse)
break;
if (image->previous == (Image *) NULL)
{
}
else
{
- Quantum
- polarity;
-
register unsigned char
bit,
byte;
/*
Convert PseudoClass image to a PCX monochrome image.
*/
- polarity=(Quantum) (GetPixelInfoIntensity(
- &image->colormap[0]) < (QuantumRange/2) ? 1 : 0);
- if (image->colors == 2)
- polarity=(Quantum) (GetPixelInfoIntensity(&image->colormap[0]) <
- GetPixelInfoIntensity(&image->colormap[1]) ? 1 : 0);
for (y=0; y < (ssize_t) image->rows; y++)
{
p=GetVirtualPixels(image,0,y,image->columns,1,exception);
break;
bit=0;
byte=0;
- q=pcx_pixels;
+ q=pixels;
for (x=0; x < (ssize_t) image->columns; x++)
{
byte<<=1;
- if (GetPixelIndex(image,p) == polarity)
+ if (GetPixelLuma(image,p) >= (QuantumRange/2.0))
byte|=0x01;
bit++;
if (bit == 8)
}
if (bit != 0)
*q++=byte << (8-bit);
- if (PCXWritePixels(&pcx_info,pcx_pixels,image) == MagickFalse)
+ if (PCXWritePixels(&pcx_info,pixels,image) == MagickFalse)
break;
if (image->previous == (Image *) NULL)
{
(void) WriteBlobByte(image,pcx_info.colormap_signature);
(void) WriteBlob(image,3*256,pcx_colormap);
}
- pcx_pixels=(unsigned char *) RelinquishMagickMemory(pcx_pixels);
+ pixel_info=RelinquishVirtualMemory(pixel_info);
pcx_colormap=(unsigned char *) RelinquishMagickMemory(pcx_colormap);
if (page_table == (MagickOffsetType *) NULL)
break;