% July 1992 %
% %
% %
-% Copyright 1999-2009 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 declarations.
*/
-#include "magick/studio.h"
-#include "magick/property.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/cache.h"
-#include "magick/color.h"
-#include "magick/color-private.h"
-#include "magick/colorspace.h"
-#include "magick/constitute.h"
-#include "magick/delegate.h"
-#include "magick/draw.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/geometry.h"
-#include "magick/image.h"
-#include "magick/image-private.h"
-#include "magick/list.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/monitor.h"
-#include "magick/monitor-private.h"
-#include "magick/profile.h"
-#include "magick/resource_.h"
-#include "magick/quantum-private.h"
-#include "magick/static.h"
-#include "magick/string_.h"
-#include "magick/module.h"
-#include "magick/token.h"
-#include "magick/transform.h"
-#include "magick/utility.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/attribute.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/cache.h"
+#include "MagickCore/color.h"
+#include "MagickCore/color-private.h"
+#include "MagickCore/colorspace.h"
+#include "MagickCore/colorspace-private.h"
+#include "MagickCore/constitute.h"
+#include "MagickCore/delegate.h"
+#include "MagickCore/draw.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/geometry.h"
+#include "MagickCore/image.h"
+#include "MagickCore/image-private.h"
+#include "MagickCore/list.h"
+#include "MagickCore/magick.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/monitor.h"
+#include "MagickCore/monitor-private.h"
+#include "MagickCore/option.h"
+#include "MagickCore/pixel-accessor.h"
+#include "MagickCore/profile.h"
+#include "MagickCore/property.h"
+#include "MagickCore/resource_.h"
+#include "MagickCore/quantum-private.h"
+#include "MagickCore/static.h"
+#include "MagickCore/string_.h"
+#include "MagickCore/module.h"
+#include "MagickCore/token.h"
+#include "MagickCore/transform.h"
+#include "MagickCore/utility.h"
\f
/*
Forward declarations.
*/
static MagickBooleanType
- WritePCLImage(const ImageInfo *,Image *);
+ WritePCLImage(const ImageInfo *,Image *,ExceptionInfo *);
\f
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
if (length < 4)
return(MagickFalse);
- if (memcmp(magick,"\033E\033",3) == 0)
- return(MagickTrue);
if (memcmp(magick,"\033E\033&",4) == 0)
return(MagickFalse);
+ if (memcmp(magick,"\033E\033",3) == 0)
+ return(MagickTrue);
return(MagickFalse);
}
\f
options[MaxTextExtent],
input_filename[MaxTextExtent];
+ const char
+ *option;
+
const DelegateInfo
*delegate_info;
register char
*p;
- register long
+ register ssize_t
c;
SegmentInfo
bounds;
- ssize_t
- count;
-
- unsigned long
+ size_t
height,
width;
+ ssize_t
+ count;
+
assert(image_info != (const ImageInfo *) NULL);
assert(image_info->signature == MagickSignature);
if (image_info->debug != MagickFalse)
/*
Open image file.
*/
- image=AcquireImage(image_info);
+ image=AcquireImage(image_info,exception);
status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
if (status == MagickFalse)
{
*/
delta.x=DefaultResolution;
delta.y=DefaultResolution;
- if ((image->x_resolution == 0.0) || (image->y_resolution == 0.0))
+ if ((image->resolution.x == 0.0) || (image->resolution.y == 0.0))
{
GeometryInfo
geometry_info;
flags;
flags=ParseGeometry(PSDensityGeometry,&geometry_info);
- image->x_resolution=geometry_info.rho;
- image->y_resolution=geometry_info.sigma;
+ image->resolution.x=geometry_info.rho;
+ image->resolution.y=geometry_info.sigma;
if ((flags & SigmaValue) == 0)
- image->y_resolution=image->x_resolution;
+ image->resolution.y=image->resolution.x;
}
/*
Determine page geometry from the PCL media box.
/*
Set PCL render geometry.
*/
- width=(unsigned long) (bounds.x2-bounds.x1+0.5);
- height=(unsigned long) (bounds.y2-bounds.y1+0.5);
+ width=(size_t) floor(bounds.x2-bounds.x1+0.5);
+ height=(size_t) floor(bounds.y2-bounds.y1+0.5);
if (width > page.width)
page.width=width;
if (height > page.height)
(void) ParseAbsoluteGeometry(PSPageGeometry,&page);
if (image_info->page != (char *) NULL)
(void) ParseAbsoluteGeometry(image_info->page,&page);
- (void) FormatMagickString(geometry,MaxTextExtent,"%lux%lu",
- page.width,page.height);
+ (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g",(double)
+ page.width,(double) page.height);
if (image_info->monochrome != MagickFalse)
delegate_info=GetDelegateInfo("pcl:mono",(char *) NULL,exception);
else
(void) ParseAbsoluteGeometry(PSPageGeometry,&page);
if (image_info->page != (char *) NULL)
(void) ParseAbsoluteGeometry(image_info->page,&page);
- (void) FormatMagickString(density,MaxTextExtent,"%gx%g",
- image->x_resolution,image->y_resolution);
- page.width=(unsigned long) (page.width*image->x_resolution/delta.x+0.5);
- page.height=(unsigned long) (page.height*image->y_resolution/delta.y+0.5);
- (void) FormatMagickString(options,MaxTextExtent,"-g%lux%lu ",
- page.width,page.height);
+ (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",
+ image->resolution.x,image->resolution.y);
+ page.width=(size_t) floor(page.width*image->resolution.x/delta.x+0.5);
+ page.height=(size_t) floor(page.height*image->resolution.y/delta.y+
+ 0.5);
+ (void) FormatLocaleString(options,MaxTextExtent,"-g%.20gx%.20g ",(double)
+ page.width,(double) page.height);
image=DestroyImage(image);
read_info=CloneImageInfo(image_info);
*read_info->magick='\0';
if (read_info->number_scenes != 0)
{
if (read_info->number_scenes != 1)
- (void) FormatMagickString(options,MaxTextExtent,"-dLastPage=%lu",
- read_info->scene+read_info->number_scenes);
+ (void) FormatLocaleString(options,MaxTextExtent,"-dLastPage=%.20g",
+ (double) (read_info->scene+read_info->number_scenes));
else
- (void) FormatMagickString(options,MaxTextExtent,
- "-dFirstPage=%lu -dLastPage=%lu",read_info->scene+1,read_info->scene+
- read_info->number_scenes);
+ (void) FormatLocaleString(options,MaxTextExtent,
+ "-dFirstPage=%.20g -dLastPage=%.20g",(double) read_info->scene+1,
+ (double) (read_info->scene+read_info->number_scenes));
read_info->number_scenes=0;
if (read_info->scenes != (char *) NULL)
*read_info->scenes='\0';
}
- if (read_info->authenticate != (char *) NULL)
- (void) FormatMagickString(options+strlen(options),MaxTextExtent,
- " -sPCLPassword=%s",read_info->authenticate);
+ option=GetImageOption(read_info,"authenticate");
+ if (option != (const char *) NULL)
+ (void) FormatLocaleString(options+strlen(options),MaxTextExtent,
+ " -sPCLPassword=%s",option);
(void) CopyMagickString(filename,read_info->filename,MaxTextExtent);
(void) AcquireUniqueFilename(read_info->filename);
- (void) FormatMagickString(command,MaxTextExtent,
+ (void) FormatLocaleString(command,MaxTextExtent,
GetDelegateCommands(delegate_info),
read_info->antialias != MagickFalse ? 4 : 1,
read_info->antialias != MagickFalse ? 4 : 1,density,options,
read_info->filename,input_filename);
- status=SystemCommand(read_info->verbose,command,exception) != 0 ? MagickTrue :
- MagickFalse;
+ status=SystemCommand(MagickFalse,read_info->verbose,command,exception) != 0 ?
+ MagickTrue : MagickFalse;
image=ReadImage(read_info,exception);
(void) RelinquishUniqueFileResource(read_info->filename);
(void) RelinquishUniqueFileResource(input_filename);
Image
*cmyk_image;
- cmyk_image=ConsolidateCMYKImages(image,&image->exception);
+ cmyk_image=ConsolidateCMYKImages(image,exception);
if (cmyk_image != (Image *) NULL)
{
image=DestroyImageList(image);
%
% The format of the RegisterPCLImage method is:
%
-% unsigned long RegisterPCLImage(void)
+% size_t RegisterPCLImage(void)
%
*/
-ModuleExport unsigned long RegisterPCLImage(void)
+ModuleExport size_t RegisterPCLImage(void)
{
MagickInfo
*entry;
%
% The format of the WritePCLImage method is:
%
-% MagickBooleanType WritePCLImage(const ImageInfo *image_info,Image *image)
+% MagickBooleanType WritePCLImage(const ImageInfo *image_info,
+% Image *image,ExceptionInfo *exception)
%
% A description of each parameter follows.
%
%
% o image: The image.
%
+% o exception: return any errors or warnings in this structure.
+%
*/
static size_t PCLDeltaCompressImage(const size_t length,
j,
replacement;
- register long
+ register ssize_t
i,
x;
*q;
q=compress_pixels;
- for (x=0; x < (long) length; )
+ for (x=0; x < (ssize_t) length; )
{
j=0;
- for (i=0; x < (long) length; x++)
+ for (i=0; x < (ssize_t) length; x++)
{
if (*pixels++ != *previous_pixels++)
{
}
j++;
}
- for ( ; x < (long) length; x++)
+ while (x < (ssize_t) length)
{
+ x++;
if (*pixels == *previous_pixels)
break;
i++;
int
count;
- long
- j;
-
- register long
+ register ssize_t
x;
register unsigned char
*q;
+ ssize_t
+ j;
+
unsigned char
packbits[128];
Compress pixels with Packbits encoding.
*/
q=compress_pixels;
- for (x=(long) length; x != 0; )
+ for (x=(ssize_t) length; x != 0; )
{
switch (x)
{
Packed run.
*/
count=3;
- while (((long) count < x) && (*pixels == *(pixels+count)))
+ while (((ssize_t) count < x) && (*pixels == *(pixels+count)))
{
count++;
if (count >= 127)
{
packbits[count+1]=pixels[count];
count++;
- if (((long) count >= (x-3)) || (count >= 127))
+ if (((ssize_t) count >= (x-3)) || (count >= 127))
break;
}
x-=count;
*packbits=(unsigned char) (count-1);
- for (j=0; j <= (long) count; j++)
+ for (j=0; j <= (ssize_t) count; j++)
*q++=packbits[j];
pixels+=count;
break;
return((size_t) (q-compress_pixels));
}
-static MagickBooleanType WritePCLImage(const ImageInfo *image_info,Image *image)
+static MagickBooleanType WritePCLImage(const ImageInfo *image_info,Image *image,
+ ExceptionInfo *exception)
{
char
buffer[MaxTextExtent];
- long
- y;
+ const char
+ *option;
MagickBooleanType
status;
MagickOffsetType
scene;
- register const IndexPacket
- *indexes;
-
- register const PixelPacket
- *p;
+ register const Quantum *p;
- register long
- i,
- x;
+ register ssize_t i, x;
- register unsigned char
- *q;
+ register unsigned char *q;
size_t
+ density,
length,
+ one,
packets;
+ ssize_t
+ y;
+
unsigned char
bits_per_pixel,
*compress_pixels,
*pixels,
*previous_pixels;
- unsigned long
- density;
-
/*
Open output image file.
*/
assert(image->signature == MagickSignature);
if (image->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
- status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+ assert(exception != (ExceptionInfo *) NULL);
+ assert(exception->signature == MagickSignature);
+ status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
if (status == MagickFalse)
return(status);
density=75;
geometry;
(void) ParseGeometry(image_info->density,&geometry);
- density=(unsigned long) geometry.rho;
+ density=(size_t) geometry.rho;
}
scene=0;
+ one=1;
do
{
- if (image->colorspace != RGBColorspace)
- (void) TransformImageColorspace(image,RGBColorspace);
+ if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
+ (void) TransformImageColorspace(image,sRGBColorspace,exception);
/*
Initialize the printer.
*/
(void) WriteBlobString(image,"\033E"); /* printer reset */
(void) WriteBlobString(image,"\033*r3F"); /* set presentation mode */
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*r%lus%luT",
- image->columns,image->rows);
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*r%.20gs%.20gT",
+ (double) image->columns,(double) image->rows);
(void) WriteBlobString(image,buffer);
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*t%ldR",density);
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*t%.20gR",(double)
+ density);
(void) WriteBlobString(image,buffer);
(void) WriteBlobString(image,"\033&l0E"); /* top margin 0 */
- if (IsMonochromeImage(image,&image->exception) != MagickFalse)
+ if (IsImageMonochrome(image,exception) != MagickFalse)
{
/*
- Monochrome image.
+ Monochrome image: use default printer monochrome setup.
*/
bits_per_pixel=1;
- (void) WriteBlobString(image,"\033*v6W"); /* set color mode... */
- (void) WriteBlobByte(image,0); /* RGB */
- (void) WriteBlobByte(image,1); /* indexed by pixel */
- (void) WriteBlobByte(image,bits_per_pixel); /* bits per index */
- (void) WriteBlobByte(image,8); /* bits per red component */
- (void) WriteBlobByte(image,8); /* bits per green component */
- (void) WriteBlobByte(image,8); /* bits per blue component */
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*v0a0b0c0I");
- (void) WriteBlobString(image,buffer);
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*v1a1b1c1I");
- (void) WriteBlobString(image,buffer);
}
else
if (image->storage_class == DirectClass)
(void) WriteBlobByte(image,8); /* bits per red component */
(void) WriteBlobByte(image,8); /* bits per green component */
(void) WriteBlobByte(image,8); /* bits per blue component */
- for (i=0; i < (long) image->colors; i++)
+ for (i=0; i < (ssize_t) image->colors; i++)
{
- (void) FormatMagickString(buffer,MaxTextExtent,
- "\033*v%da%db%dc%ldI",ScaleQuantumToChar(image->colormap[i].red),
+ (void) FormatLocaleString(buffer,MaxTextExtent,
+ "\033*v%da%db%dc%.20gI",
+ ScaleQuantumToChar(image->colormap[i].red),
ScaleQuantumToChar(image->colormap[i].green),
- ScaleQuantumToChar(image->colormap[i].blue),i);
+ ScaleQuantumToChar(image->colormap[i].blue),(double) i);
(void) WriteBlobString(image,buffer);
}
- for ( ; i < (1L << bits_per_pixel); i++)
+ for (one=1; i < (ssize_t) (one << bits_per_pixel); i++)
{
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*v%luI",i);
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*v%.20gI",
+ (double) i);
(void) WriteBlobString(image,buffer);
}
}
- (void) WriteBlobString(image,"\033*r1A"); /* start raster graphics */
+ option=GetImageOption(image_info,"pcl:fit-to-page");
+ if (IfMagickTrue(IsStringTrue(option)))
+ (void) WriteBlobString(image,"\033*r3A");
+ else
+ (void) WriteBlobString(image,"\033*r1A"); /* start raster graphics */
(void) WriteBlobString(image,"\033*b0Y"); /* set y offset */
length=(image->columns*bits_per_pixel+7)/8;
- pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels));
+ pixels=(unsigned char *) AcquireQuantumMemory(length+1,sizeof(*pixels));
if (pixels == (unsigned char *) NULL)
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
+ (void) ResetMagickMemory(pixels,0,(length+1)*sizeof(*pixels));
compress_pixels=(unsigned char *) NULL;
previous_pixels=(unsigned char *) NULL;
switch (image->compression)
{
case NoCompression:
{
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*b0M");
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b0M");
(void) WriteBlobString(image,buffer);
break;
}
pixels=(unsigned char *) RelinquishMagickMemory(pixels);
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
}
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*b2M");
+ (void) ResetMagickMemory(compress_pixels,0,(length+256)*
+ sizeof(*compress_pixels));
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b2M");
(void) WriteBlobString(image,buffer);
break;
}
default:
{
- compress_pixels=(unsigned char *) AcquireQuantumMemory(length+
- (length >> 3),sizeof(*compress_pixels));
+ compress_pixels=(unsigned char *) AcquireQuantumMemory(3*length+256,
+ sizeof(*compress_pixels));
if (compress_pixels == (unsigned char *) NULL)
{
pixels=(unsigned char *) RelinquishMagickMemory(pixels);
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
}
- previous_pixels=(unsigned char *) AcquireQuantumMemory(length,
+ (void) ResetMagickMemory(compress_pixels,0,(3*length+256)*
+ sizeof(*compress_pixels));
+ previous_pixels=(unsigned char *) AcquireQuantumMemory(length+1,
sizeof(*previous_pixels));
if (previous_pixels == (unsigned char *) NULL)
{
pixels=(unsigned char *) RelinquishMagickMemory(pixels);
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
}
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*b3M");
+ (void) ResetMagickMemory(previous_pixels,0,(length+1)*
+ sizeof(*previous_pixels));
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b3M");
(void) WriteBlobString(image,buffer);
break;
}
}
- for (y=0; y < (long) image->rows; y++)
+ for (y=0; y < (ssize_t) image->rows; y++)
{
- p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
- if (p == (const PixelPacket *) NULL)
+ p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+ if (p == (const Quantum *) NULL)
break;
- indexes=GetAuthenticIndexQueue(image);
q=pixels;
switch (bits_per_pixel)
{
*/
bit=0;
byte=0;
- for (x=0; x < (long) image->columns; x++)
+ for (x=0; x < (ssize_t) image->columns; x++)
{
byte<<=1;
- if (PixelIntensity(p) >= ((MagickRealType) QuantumRange/2.0))
+ if (GetPixelIntensity(image,p) < ((MagickRealType) QuantumRange/2.0))
byte|=0x01;
bit++;
if (bit == 8)
bit=0;
byte=0;
}
- p++;
+ p+=GetPixelChannels(image);
}
if (bit != 0)
*q++=byte << (8-bit);
/*
Colormapped image.
*/
- for (x=0; x < (long) image->columns; x++)
- *q++=(unsigned char) indexes[x];
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ *q++=(unsigned char) GetPixelIndex(image,p);
+ p+=GetPixelChannels(image);
+ }
break;
}
case 24:
/*
Truecolor image.
*/
- for (x=0; x < (long) image->columns; x++)
+ for (x=0; x < (ssize_t) image->columns; x++)
{
- *q++=ScaleQuantumToChar(p->red);
- *q++=ScaleQuantumToChar(p->green);
- *q++=ScaleQuantumToChar(p->blue);
- p++;
+ *q++=ScaleQuantumToChar(GetPixelRed(image,p));
+ *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
+ *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
+ p+=GetPixelChannels(image);
}
break;
}
{
case NoCompression:
{
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*b%luW",
- (unsigned long) length);
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b%.20gW",
+ (double) length);
(void) WriteBlobString(image,buffer);
(void) WriteBlob(image,length,pixels);
break;
}
case RLECompression:
{
- packets=PCLPackbitsCompressImage(length,pixels,
- compress_pixels);
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*b%luW",
- (unsigned long) packets);
+ packets=PCLPackbitsCompressImage(length,pixels,compress_pixels);
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b%.20gW",
+ (double) packets);
(void) WriteBlobString(image,buffer);
(void) WriteBlob(image,packets,compress_pixels);
break;
default:
{
if (y == 0)
- for (i=0; i < (long) length; i++)
+ for (i=0; i < (ssize_t) length; i++)
previous_pixels[i]=(~pixels[i]);
packets=PCLDeltaCompressImage(length,previous_pixels,pixels,
compress_pixels);
- (void) FormatMagickString(buffer,MaxTextExtent,"\033*b%luW",
- (unsigned long) packets);
+ (void) FormatLocaleString(buffer,MaxTextExtent,"\033*b%.20gW",
+ (double) packets);
(void) WriteBlobString(image,buffer);
(void) WriteBlob(image,packets,compress_pixels);
(void) CopyMagickMemory(previous_pixels,pixels,length*