X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=coders%2Fps2.c;h=83351d0c62f9f62f71ba47943c41aa3859f9b804;hb=2ea2cbfa1006eeda0d230955f9933062065b6aa1;hp=7c2c5a6cba10aea2bd123dc90a669967a8c40c51;hpb=3ed852eea50f9d4cd633efb8c2b054b8e33c2530;p=imagemagick diff --git a/coders/ps2.c b/coders/ps2.c index 7c2c5a6cb..83351d0c6 100644 --- a/coders/ps2.c +++ b/coders/ps2.c @@ -17,7 +17,7 @@ % July 1992 % % % % % -% Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization % +% Copyright 1999-2010 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 % @@ -59,6 +59,7 @@ #include "magick/monitor.h" #include "magick/monitor-private.h" #include "magick/monitor-private.h" +#include "magick/option.h" #include "magick/resource_.h" #include "magick/property.h" #include "magick/quantum-private.h" @@ -66,6 +67,10 @@ #include "magick/string_.h" #include "magick/module.h" #include "magick/utility.h" + +/* + Define declarations. +*/ #if defined(MAGICKCORE_TIFF_DELEGATE) #define CCITTParam "-1" #else @@ -98,10 +103,10 @@ static MagickBooleanType % % The format of the RegisterPS2Image method is: % -% unsigned long RegisterPS2Image(void) +% size_t RegisterPS2Image(void) % */ -ModuleExport unsigned long RegisterPS2Image(void) +ModuleExport size_t RegisterPS2Image(void) { MagickInfo *entry; @@ -174,6 +179,44 @@ ModuleExport void UnregisterPS2Image(void) % o image: the image. % */ + +static MagickBooleanType Huffman2DEncodeImage(const ImageInfo *image_info, + Image *image,Image *inject_image) +{ + Image + *group4_image; + + ImageInfo + *write_info; + + MagickBooleanType + status; + + size_t + length; + + unsigned char + *group4; + + status=MagickTrue; + write_info=CloneImageInfo(image_info); + (void) CopyMagickString(write_info->filename,"GROUP4:",MaxTextExtent); + (void) CopyMagickString(write_info->magick,"GROUP4",MaxTextExtent); + group4_image=CloneImage(inject_image,0,0,MagickTrue,&image->exception); + if (group4_image == (Image *) NULL) + return(MagickFalse); + group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length, + &image->exception); + group4_image=DestroyImage(group4_image); + if (group4 == (unsigned char *) NULL) + return(MagickFalse); + write_info=DestroyImageInfo(write_info); + if (WriteBlob(image,length,group4) != (ssize_t) length) + status=MagickFalse; + group4=(unsigned char *) RelinquishMagickMemory(group4); + return(status); +} + static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) { static const char @@ -201,8 +244,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) " /Decode [0 1 0 1 0 1]", " /ImageMatrix [columns 0 0 rows neg 0 rows]", " compression 0 gt", - " { /DataSource pixel_stream /%s filter }", - " { /DataSource pixel_stream /%s filter } ifelse", + " { /DataSource pixel_stream %s }", + " { /DataSource pixel_stream %s } ifelse", " >> image", " }", " {", @@ -215,8 +258,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) " /Decode [1 0 1 0 1 0 1 0]", " /ImageMatrix [columns 0 0 rows neg 0 rows]", " compression 0 gt", - " { /DataSource pixel_stream /%s filter }", - " { /DataSource pixel_stream /%s filter } ifelse", + " { /DataSource pixel_stream %s }", + " { /DataSource pixel_stream %s } ifelse", " >> image", " } ifelse", "} bind def", @@ -247,9 +290,9 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) " /Decode [0 1]", " /ImageMatrix [columns 0 0 rows neg 0 rows]", " compression 0 gt", - " { /DataSource pixel_stream /%s filter }", + " { /DataSource pixel_stream %s }", " {", - " /DataSource pixel_stream /%s filter", + " /DataSource pixel_stream %s", " <<", " /K "CCITTParam, " /Columns columns", @@ -275,8 +318,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) " /Decode [0 255]", " /ImageMatrix [columns 0 0 rows neg 0 rows]", " compression 0 gt", - " { /DataSource pixel_stream /%s filter }", - " { /DataSource pixel_stream /%s filter } ifelse", + " { /DataSource pixel_stream %s }", + " { /DataSource pixel_stream %s } ifelse", " >> image", " } ifelse", "} bind def", @@ -348,7 +391,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) GeometryInfo geometry_info; - long + ssize_t j, y; @@ -386,10 +429,10 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) register const PixelPacket *p; - register long + register ssize_t x; - register long + register ssize_t i; SegmentInfo @@ -404,7 +447,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) unsigned char *pixels; - unsigned long + size_t page, text_size; @@ -468,18 +511,19 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) } if (image->units == PixelsPerCentimeterResolution) { - resolution.x*=2.54; - resolution.y*=2.54; + resolution.x=(size_t) (100.0*2.54*resolution.x+0.5)/100.0; + resolution.y=(size_t) (100.0*2.54*resolution.y+0.5)/100.0; } SetGeometry(image,&geometry); - (void) FormatMagickString(page_geometry,MaxTextExtent,"%lux%lu", - image->columns,image->rows); + (void) FormatMagickString(page_geometry,MaxTextExtent,"%.20gx%.20g", + (double) image->columns,(double) image->rows); if (image_info->page != (char *) NULL) (void) CopyMagickString(page_geometry,image_info->page,MaxTextExtent); else if ((image->page.width != 0) && (image->page.height != 0)) - (void) FormatMagickString(page_geometry,MaxTextExtent,"%lux%lu%+ld%+ld", - image->page.width,image->page.height,image->page.x,image->page.y); + (void) FormatMagickString(page_geometry,MaxTextExtent, + "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double) + image->page.height,(double) image->page.x,(double) image->page.y); else if ((image->gravity != UndefinedGravity) && (LocaleCompare(image_info->magick,"PS") == 0)) @@ -488,16 +532,16 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y, &geometry.width,&geometry.height); scale.x=(double) (geometry.width*delta.x)/resolution.x; - geometry.width=(unsigned long) (scale.x+0.5); + geometry.width=(size_t) floor(scale.x+0.5); scale.y=(double) (geometry.height*delta.y)/resolution.y; - geometry.height=(unsigned long) (scale.y+0.5); + geometry.height=(size_t) floor(scale.y+0.5); (void) ParseAbsoluteGeometry(page_geometry,&media_info); (void) ParseGravityGeometry(image,page_geometry,&page_info, &image->exception); if (image->gravity != UndefinedGravity) { geometry.x=(-page_info.x); - geometry.y=(long) (media_info.height+page_info.y-image->rows); + geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows); } pointsize=12.0; if (image_info->pointsize != 0.0) @@ -505,7 +549,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) text_size=0; value=GetImageProperty(image,"label"); if (value != (const char *) NULL) - text_size=(unsigned long) (MultilineCensus(value)*pointsize+12); + text_size=(size_t) (MultilineCensus(value)*pointsize+12); if (page == 1) { /* @@ -537,13 +581,12 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) else { (void) FormatMagickString(buffer,MaxTextExtent, - "%%%%BoundingBox: %ld %ld %ld %ld\n",(long) (bounds.x1+0.5), - (long) (bounds.y1+0.5), - (long) (bounds.x2+0.5),(long) (bounds.y2+0.5)); + "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); (void) WriteBlobString(image,buffer); (void) FormatMagickString(buffer,MaxTextExtent, - "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1, - bounds.x2,bounds.y2); + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1, + bounds.y1,bounds.x2,bounds.y2); } (void) WriteBlobString(image,buffer); value=GetImageProperty(image,"label"); @@ -560,8 +603,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) if (image_info->adjoin == MagickFalse) (void) CopyMagickString(buffer,"%%Pages: 1\n",MaxTextExtent); else - (void) FormatMagickString(buffer,MaxTextExtent,"%%%%Pages: %lu\n", - (unsigned long) GetImageListLength(image)); + (void) FormatMagickString(buffer,MaxTextExtent, + "%%%%Pages: %.20g\n",(double) GetImageListLength(image)); (void) WriteBlobString(image,buffer); } (void) WriteBlobString(image,"%%EndComments\n"); @@ -577,30 +620,31 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) case NoCompression: { (void) FormatMagickString(buffer,MaxTextExtent,*q, - "ASCII85Decode"); + "/ASCII85Decode filter"); break; } case JPEGCompression: { - (void) FormatMagickString(buffer,MaxTextExtent,*q,"DCTDecode"); + (void) FormatMagickString(buffer,MaxTextExtent,*q, + "/DCTDecode filter"); break; } case LZWCompression: { - (void) FormatMagickString(buffer,MaxTextExtent,*q,"LZWDecode"); + (void) FormatMagickString(buffer,MaxTextExtent,*q, + "/LZWDecode filter"); break; } case FaxCompression: case Group4Compression: { - (void) FormatMagickString(buffer,MaxTextExtent,*q, - "ASCII85Decode"); + (void) FormatMagickString(buffer,MaxTextExtent,*q," "); break; } default: { (void) FormatMagickString(buffer,MaxTextExtent,*q, - "RunLengthDecode"); + "/RunLengthDecode filter"); break; } } @@ -609,7 +653,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) } value=GetImageProperty(image,"label"); if (value != (const char *) NULL) - for (j=(long) MultilineCensus(value)-1; j >= 0; j--) + for (j=(ssize_t) MultilineCensus(value)-1; j >= 0; j--) { (void) WriteBlobString(image," /label 512 string def\n"); (void) WriteBlobString(image," currentfile label readline pop\n"); @@ -627,11 +671,12 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) (void) WriteBlobString(image,"} bind def\n"); (void) WriteBlobString(image,"%%EndProlog\n"); } - (void) FormatMagickString(buffer,MaxTextExtent,"%%%%Page: 1 %lu\n",page++); + (void) FormatMagickString(buffer,MaxTextExtent,"%%%%Page: 1 %.20g\n", + (double) page++); (void) WriteBlobString(image,buffer); (void) FormatMagickString(buffer,MaxTextExtent, - "%%%%PageBoundingBox: %ld %ld %ld %ld\n",geometry.x,geometry.y, - geometry.x+(long) geometry.width,geometry.y+(long) + "%%%%PageBoundingBox: %.20g %.20g %.20g %.20g\n",(double) geometry.x, + (double) geometry.y,geometry.x+(double) geometry.width,geometry.y+(double) (geometry.height+text_size)); (void) WriteBlobString(image,buffer); if ((double) geometry.x < bounds.x1) @@ -657,8 +702,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) /* Output image data. */ - (void) FormatMagickString(buffer,MaxTextExtent,"%ld %ld\n%g %g\n%f\n", - geometry.x,geometry.y,scale.x,scale.y,pointsize); + (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n%g %g\n%g\n", + (double) geometry.x,(double) geometry.y,scale.x,scale.y,pointsize); (void) WriteBlobString(image,buffer); labels=(char **) NULL; value=GetImageProperty(image,"label"); @@ -682,8 +727,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) ((image_info->type != TrueColorType) && (IsGrayImage(image,&image->exception) != MagickFalse))) { - (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n1\n%d\n", - image->columns,image->rows,(int) + (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n1\n%d\n", + (double) image->columns,(double) image->rows,(int) (image->colorspace == CMYKColorspace)); (void) WriteBlobString(image,buffer); (void) FormatMagickString(buffer,MaxTextExtent,"%d\n", @@ -705,9 +750,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) (void) HuffmanEncodeImage(image_info,image,image); break; } -#if defined(MAGICKCORE_TIFF_DELEGATE) (void) Huffman2DEncodeImage(image_info,image,image); -#endif break; } case JPEGCompression: @@ -736,18 +779,18 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) Dump Runlength encoded pixels. */ q=pixels; - 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) break; - for (x=0; x < (long) image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) { *q++=ScaleQuantumToChar(PixelIntensityToQuantum(p)); p++; } - progress=SetImageProgress(image,SaveImageTag,y,image->rows); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows); if (progress == MagickFalse) break; } @@ -770,19 +813,20 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) Dump uncompressed PseudoColor packets. */ Ascii85Initialize(image); - 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) break; - for (x=0; x < (long) image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) { Ascii85Encode(image, ScaleQuantumToChar(PixelIntensityToQuantum(p))); p++; } - progress=SetImageProgress(image,SaveImageTag,y,image->rows); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) + y,image->rows); if (progress == MagickFalse) break; } @@ -795,8 +839,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) if ((image->storage_class == DirectClass) || (image->colors > 256) || (compression == JPEGCompression) || (image->matte != MagickFalse)) { - (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n0\n%d\n", - image->columns,image->rows,(int) + (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n0\n%d\n", + (double) image->columns,(double) image->rows,(int) (image->colorspace == CMYKColorspace)); (void) WriteBlobString(image,buffer); (void) FormatMagickString(buffer,MaxTextExtent,"%d\n", @@ -831,14 +875,14 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) Dump Packbit encoded pixels. */ q=pixels; - 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) break; indexes=GetVirtualIndexQueue(image); - for (x=0; x < (long) image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) { if ((image->matte != MagickFalse) && (p->opacity == (Quantum) TransparentOpacity)) @@ -850,20 +894,20 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) else if (image->colorspace != CMYKColorspace) { - *q++=ScaleQuantumToChar(p->red); - *q++=ScaleQuantumToChar(p->green); - *q++=ScaleQuantumToChar(p->blue); + *q++=ScaleQuantumToChar(GetRedPixelComponent(p)); + *q++=ScaleQuantumToChar(GetGreenPixelComponent(p)); + *q++=ScaleQuantumToChar(GetBluePixelComponent(p)); } else { - *q++=ScaleQuantumToChar(p->red); - *q++=ScaleQuantumToChar(p->green); - *q++=ScaleQuantumToChar(p->blue); + *q++=ScaleQuantumToChar(GetRedPixelComponent(p)); + *q++=ScaleQuantumToChar(GetGreenPixelComponent(p)); + *q++=ScaleQuantumToChar(GetBluePixelComponent(p)); *q++=ScaleQuantumToChar(indexes[x]); } p++; } - progress=SetImageProgress(image,SaveImageTag,y,image->rows); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows); if (progress == MagickFalse) break; } @@ -886,14 +930,14 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) Dump uncompressed DirectColor packets. */ Ascii85Initialize(image); - 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) break; indexes=GetVirtualIndexQueue(image); - for (x=0; x < (long) image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) { if ((image->matte != MagickFalse) && (p->opacity == (Quantum) TransparentOpacity)) @@ -908,20 +952,20 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) else if (image->colorspace != CMYKColorspace) { - Ascii85Encode(image,ScaleQuantumToChar(p->red)); - Ascii85Encode(image,ScaleQuantumToChar(p->green)); - Ascii85Encode(image,ScaleQuantumToChar(p->blue)); + Ascii85Encode(image,ScaleQuantumToChar(GetRedPixelComponent(p))); + Ascii85Encode(image,ScaleQuantumToChar(GetGreenPixelComponent(p))); + Ascii85Encode(image,ScaleQuantumToChar(GetBluePixelComponent(p))); } else { - Ascii85Encode(image,ScaleQuantumToChar(p->red)); - Ascii85Encode(image,ScaleQuantumToChar(p->green)); - Ascii85Encode(image,ScaleQuantumToChar(p->blue)); + Ascii85Encode(image,ScaleQuantumToChar(GetRedPixelComponent(p))); + Ascii85Encode(image,ScaleQuantumToChar(GetGreenPixelComponent(p))); + Ascii85Encode(image,ScaleQuantumToChar(GetBluePixelComponent(p))); Ascii85Encode(image,ScaleQuantumToChar(indexes[x])); } p++; } - progress=SetImageProgress(image,SaveImageTag,y,image->rows); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows); if (progress == MagickFalse) break; } @@ -935,16 +979,17 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) /* Dump number of colors and colormap. */ - (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n1\n%d\n", - image->columns,image->rows,(int) + (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n1\n%d\n", + (double) image->columns,(double) image->rows,(int) (image->colorspace == CMYKColorspace)); (void) WriteBlobString(image,buffer); (void) FormatMagickString(buffer,MaxTextExtent,"%d\n", (int) (compression == NoCompression)); (void) WriteBlobString(image,buffer); - (void) FormatMagickString(buffer,MaxTextExtent,"%lu\n",image->colors); + (void) FormatMagickString(buffer,MaxTextExtent,"%.20g\n",(double) + image->colors); (void) WriteBlobString(image,buffer); - for (i=0; i < (long) image->colors; i++) + for (i=0; i < (ssize_t) image->colors; i++) { (void) FormatMagickString(buffer,MaxTextExtent,"%02X%02X%02X\n", ScaleQuantumToChar(image->colormap[i].red), @@ -973,16 +1018,16 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) Dump Runlength encoded pixels. */ q=pixels; - 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) break; indexes=GetVirtualIndexQueue(image); - for (x=0; x < (long) image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) *q++=(unsigned char) indexes[x]; - progress=SetImageProgress(image,SaveImageTag,y,image->rows); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows); if (progress == MagickFalse) break; } @@ -1005,16 +1050,16 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) Dump uncompressed PseudoColor packets. */ Ascii85Initialize(image); - 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) break; indexes=GetVirtualIndexQueue(image); - for (x=0; x < (long) image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) Ascii85Encode(image,(unsigned char) indexes[x]); - progress=SetImageProgress(image,SaveImageTag,y,image->rows); + progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows); if (progress == MagickFalse) break; } @@ -1050,12 +1095,12 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image) if (page > 1) { (void) FormatMagickString(buffer,MaxTextExtent, - "%%%%BoundingBox: %ld %ld %ld %ld\n",(long) (bounds.x1+0.5), - (long) (bounds.y1+0.5),(long) (bounds.x2+0.5),(long) (bounds.y2+0.5)); + "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5), + ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5)); (void) WriteBlobString(image,buffer); (void) FormatMagickString(buffer,MaxTextExtent, - "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1,bounds.x2, - bounds.y2); + "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1, + bounds.x2,bounds.y2); (void) WriteBlobString(image,buffer); } (void) WriteBlobString(image,"%%EOF\n");