root/ImageMagick/trunk/coders/art.c

Revision 1, 13.0 KB (checked in by cristy, 3 months ago)


Line 
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
6%                             AAA   RRRR   TTTTT                              %
7%                            A   A  R   R    T                                %
8%                            AAAAA  RRRR     T                                %
9%                            A   A  R R      T                                %
10%                            A   A  R  R     T                                %
11%                                                                             %
12%                                                                             %
13%                 Support PFS: 1st Publisher Clip Art Format                  %
14%                                                                             %
15%                              Software Design                                %
16%                                John Cristy                                  %
17%                                 July 1992                                   %
18%                                                                             %
19%                                                                             %
20%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
21%  dedicated to making software imaging solutions freely available.           %
22%                                                                             %
23%  You may not use this file except in compliance with the License.  You may  %
24%  obtain a copy of the License at                                            %
25%                                                                             %
26%    http://www.imagemagick.org/script/license.php                            %
27%                                                                             %
28%  Unless required by applicable law or agreed to in writing, software        %
29%  distributed under the License is distributed on an "AS IS" BASIS,          %
30%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31%  See the License for the specific language governing permissions and        %
32%  limitations under the License.                                             %
33%                                                                             %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%
37*/
38
39/*
40  Include declarations.
41*/
42#include "magick/studio.h"
43#include "magick/blob.h"
44#include "magick/blob-private.h"
45#include "magick/cache.h"
46#include "magick/color-private.h"
47#include "magick/colorspace.h"
48#include "magick/exception.h"
49#include "magick/exception-private.h"
50#include "magick/image.h"
51#include "magick/image-private.h"
52#include "magick/list.h"
53#include "magick/magick.h"
54#include "magick/memory_.h"
55#include "magick/monitor.h"
56#include "magick/monitor-private.h"
57#include "magick/quantum-private.h"
58#include "magick/static.h"
59#include "magick/string_.h"
60#include "magick/module.h"
61
62/*
63  Forward declarations.
64*/
65static MagickBooleanType
66  WriteARTImage(const ImageInfo *,Image *);
67
68/*
69%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
70%                                                                             %
71%                                                                             %
72%                                                                             %
73%   R e a d A R T I m a g e                                                   %
74%                                                                             %
75%                                                                             %
76%                                                                             %
77%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
78%
79%  ReadARTImage() reads an image of raw bits in LSB order and returns it.
80%  It allocates the memory necessary for the new Image structure and returns
81%  a pointer to the new image.
82%
83%  The format of the ReadARTImage method is:
84%
85%      Image *ReadARTImage(const ImageInfo *image_info,
86%        ExceptionInfo *exception)
87%
88%  A description of each parameter follows:
89%
90%    o image_info: the image info.
91%
92%    o exception: return any errors or warnings in this structure.
93%
94*/
95static Image *ReadARTImage(const ImageInfo *image_info,ExceptionInfo *exception)
96{
97  Image
98    *image;
99
100  long
101    y;
102
103  QuantumInfo
104    *quantum_info;
105
106  QuantumType
107    quantum_type;
108
109  MagickBooleanType
110    status;
111
112  ssize_t
113    count;
114
115  size_t
116    length;
117
118  unsigned char
119    *pixels;
120
121  /*
122    Open image file.
123  */
124  assert(image_info != (const ImageInfo *) NULL);
125  assert(image_info->signature == MagickSignature);
126  if (image_info->debug != MagickFalse)
127    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
128      image_info->filename);
129  assert(exception != (ExceptionInfo *) NULL);
130  assert(exception->signature == MagickSignature);
131  image=AcquireImage(image_info);
132  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
133  if (status == MagickFalse)
134    {
135      image=DestroyImageList(image);
136      return((Image *) NULL);
137    }
138  image->depth=1;
139  image->endian=MSBEndian;
140  (void) ReadBlobLSBShort(image);
141  image->columns=(unsigned long) ReadBlobLSBShort(image);
142  (void) ReadBlobLSBShort(image);
143  image->rows=(unsigned long) ReadBlobLSBShort(image);
144  /*
145    Initialize image colormap.
146  */
147  if (AcquireImageColormap(image,2) == MagickFalse)
148    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
149  if (image_info->ping != MagickFalse)
150    {
151      (void) CloseBlob(image);
152      return(GetFirstImageInList(image));
153    }
154  /*
155    Convert bi-level image to pixel packets.
156  */
157  quantum_type=IndexQuantum;
158  quantum_info=AcquireQuantumInfo(image_info,image);
159  if (quantum_info == (QuantumInfo *) NULL)
160    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
161  pixels=GetQuantumPixels(quantum_info);
162  length=GetQuantumExtent(image,quantum_info,quantum_type);
163  for (y=0; y < (long) image->rows; y++)
164  {
165    register PixelPacket
166      *__restrict q;
167
168    q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
169    if (q == (PixelPacket *) NULL)
170      break;
171    count=ReadBlob(image,length,pixels);
172    if (count != (ssize_t) length)
173      ThrowReaderException(CorruptImageError,"UnableToReadImageData");
174    (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
175      quantum_type,pixels,exception);
176    count=ReadBlob(image,(size_t) (-(ssize_t) length) & 0x01,pixels);
177    if (SyncAuthenticPixels(image,exception) == MagickFalse)
178      break;
179    if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse)
180      break;
181  }
182  SetQuantumImageType(image,quantum_type);
183  quantum_info=DestroyQuantumInfo(quantum_info);
184  if (EOFBlob(image) != MagickFalse)
185    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
186      image->filename);
187  (void) CloseBlob(image);
188  return(GetFirstImageInList(image));
189}
190
191/*
192%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
193%                                                                             %
194%                                                                             %
195%                                                                             %
196%   R e g i s t e r A R T I m a g e                                           %
197%                                                                             %
198%                                                                             %
199%                                                                             %
200%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
201%
202%  RegisterARTImage() adds attributes for the ART image format to
203%  the list of supported formats.  The attributes include the image format
204%  tag, a method to read and/or write the format, whether the format
205%  supports the saving of more than one frame to the same file or blob,
206%  whether the format supports native in-memory I/O, and a brief
207%  description of the format.
208%
209%  The format of the RegisterARTImage method is:
210%
211%      unsigned long RegisterARTImage(void)
212%
213*/
214ModuleExport unsigned long RegisterARTImage(void)
215{
216  MagickInfo
217    *entry;
218
219  entry=SetMagickInfo("ART");
220  entry->decoder=(DecodeImageHandler *) ReadARTImage;
221  entry->encoder=(EncodeImageHandler *) WriteARTImage;
222  entry->raw=MagickTrue;
223  entry->adjoin=MagickFalse;
224  entry->description=ConstantString("PFS: 1st Publisher Clip Art");
225  entry->module=ConstantString("ART");
226  (void) RegisterMagickInfo(entry);
227  return(MagickImageCoderSignature);
228}
229
230/*
231%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232%                                                                             %
233%                                                                             %
234%                                                                             %
235%   U n r e g i s t e r A R T I m a g e                                       %
236%                                                                             %
237%                                                                             %
238%                                                                             %
239%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
240%
241%  UnregisterARTImage() removes format registrations made by the
242%  ART module from the list of supported formats.
243%
244%  The format of the UnregisterARTImage method is:
245%
246%      UnregisterARTImage(void)
247%
248*/
249ModuleExport void UnregisterARTImage(void)
250{
251  (void) UnregisterMagickInfo("ART");
252}
253
254/*
255%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
256%                                                                             %
257%                                                                             %
258%                                                                             %
259%   W r i t e A R T I m a g e                                                 %
260%                                                                             %
261%                                                                             %
262%                                                                             %
263%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
264%
265%  WriteARTImage() writes an image of raw bits in LSB order to a file.
266%
267%  The format of the WriteARTImage method is:
268%
269%      MagickBooleanType WriteARTImage(const ImageInfo *image_info,Image *image)
270%
271%  A description of each parameter follows.
272%
273%    o image_info: the image info.
274%
275%    o image:  The image.
276%
277*/
278static MagickBooleanType WriteARTImage(const ImageInfo *image_info,Image *image)
279{
280  long
281    y;
282
283  MagickBooleanType
284    status;
285
286  QuantumInfo
287    *quantum_info;
288
289  register const PixelPacket
290    *p;
291
292  ssize_t
293    count;
294
295  size_t
296    length;
297
298  unsigned char
299    *pixels;
300
301  /*
302    Open output image file.
303  */
304  assert(image_info != (const ImageInfo *) NULL);
305  assert(image_info->signature == MagickSignature);
306  assert(image != (Image *) NULL);
307  assert(image->signature == MagickSignature);
308  if (image->debug != MagickFalse)
309    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
310  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
311  if (status == MagickFalse)
312    return(status);
313  if ((image->columns > 65535UL) || (image->rows > 65535UL))
314    ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit");
315  image->endian=MSBEndian;
316  image->depth=1;
317  (void) WriteBlobLSBShort(image,0);
318  (void) WriteBlobLSBShort(image,(unsigned short) image->columns);
319  (void) WriteBlobLSBShort(image,0);
320  (void) WriteBlobLSBShort(image,(unsigned short) image->rows);
321  if (image->colorspace != RGBColorspace)
322    (void) TransformImageColorspace(image,RGBColorspace);
323  length=(image->columns+7)/8;
324  pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels));
325  if (pixels == (unsigned char *) NULL)
326    ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
327  /*
328    Convert image to a bi-level image.
329  */
330  (void) SetImageType(image,BilevelType);
331  quantum_info=AcquireQuantumInfo(image_info,image);
332  for (y=0; y < (long) image->rows; y++)
333  {
334    p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
335    if (p == (const PixelPacket *) NULL)
336      break;
337    (void) ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
338      GrayQuantum,pixels,&image->exception);
339    count=WriteBlob(image,length,pixels);
340    if (count != (ssize_t) length)
341      ThrowWriterException(CorruptImageError,"UnableToWriteImageData");
342    count=WriteBlob(image,(size_t) (-(ssize_t) length) & 0x01,pixels);
343    if (SetImageProgress(image,SaveImageTag,y,image->rows) == MagickFalse)
344      break;
345  }
346  quantum_info=DestroyQuantumInfo(quantum_info);
347  pixels=(unsigned char *) RelinquishMagickMemory(pixels);
348  (void) CloseBlob(image);
349  return(MagickTrue);
350}
Note: See TracBrowser for help on using the browser.