blob: 2d15985938d3255c279ff75b72173de91723b18e [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% CCCC M M Y Y K K %
7% C MM MM Y Y K K %
8% C M M M Y KKK %
9% C M M Y K K %
10% CCCC M M Y K K %
11% %
12% %
13% Read/Write RAW CMYK Image Format %
14% %
15% Software Design %
16% John Cristy %
17% July 1992 %
18% %
19% %
cristy7e41fe82010-12-04 23:12:08 +000020% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000021% 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*/
cristy4c08aed2011-07-01 19:47:50 +000042#include "MagickCore/studio.h"
43#include "MagickCore/blob.h"
44#include "MagickCore/blob-private.h"
45#include "MagickCore/cache.h"
46#include "MagickCore/colorspace.h"
47#include "MagickCore/constitute.h"
48#include "MagickCore/exception.h"
49#include "MagickCore/exception-private.h"
50#include "MagickCore/image.h"
51#include "MagickCore/image-private.h"
52#include "MagickCore/list.h"
53#include "MagickCore/magick.h"
54#include "MagickCore/memory_.h"
55#include "MagickCore/monitor.h"
56#include "MagickCore/monitor-private.h"
57#include "MagickCore/pixel-accessor.h"
58#include "MagickCore/quantum-private.h"
59#include "MagickCore/static.h"
60#include "MagickCore/statistic.h"
61#include "MagickCore/string_.h"
62#include "MagickCore/module.h"
63#include "MagickCore/utility.h"
cristy3ed852e2009-09-05 21:47:34 +000064
65/*
66 Forward declarations.
67*/
68static MagickBooleanType
69 WriteCMYKImage(const ImageInfo *,Image *);
70
71/*
72%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73% %
74% %
75% %
76% R e a d C M Y K I m a g e %
77% %
78% %
79% %
80%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
81%
82% ReadCMYKImage() reads an image of raw CMYK or CMYKA samples and returns it.
83% It allocates the memory necessary for the new Image structure and returns a
84% pointer to the new image.
85%
86% The format of the ReadCMYKImage method is:
87%
88% Image *ReadCMYKImage(const ImageInfo *image_info,
89% ExceptionInfo *exception)
90%
91% A description of each parameter follows:
92%
93% o image_info: the image info.
94%
95% o exception: return any errors or warnings in this structure.
96%
97*/
98static Image *ReadCMYKImage(const ImageInfo *image_info,
99 ExceptionInfo *exception)
100{
101 Image
102 *canvas_image,
103 *image;
104
cristy3ed852e2009-09-05 21:47:34 +0000105 MagickBooleanType
106 status;
107
108 MagickOffsetType
109 scene;
110
111 QuantumInfo
112 *quantum_info;
113
114 QuantumType
115 quantum_type;
116
cristybb503372010-05-27 20:51:26 +0000117 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000118 i;
119
cristy4e82e512011-04-24 01:33:42 +0000120 size_t
121 length;
122
cristy3ed852e2009-09-05 21:47:34 +0000123 ssize_t
cristy90dbac72010-08-22 15:08:40 +0000124 count,
125 y;
cristy3ed852e2009-09-05 21:47:34 +0000126
cristy3ed852e2009-09-05 21:47:34 +0000127 unsigned char
128 *pixels;
129
130 /*
131 Open image file.
132 */
133 assert(image_info != (const ImageInfo *) NULL);
134 assert(image_info->signature == MagickSignature);
135 if (image_info->debug != MagickFalse)
136 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
137 image_info->filename);
138 assert(exception != (ExceptionInfo *) NULL);
139 assert(exception->signature == MagickSignature);
140 image=AcquireImage(image_info);
141 if ((image->columns == 0) || (image->rows == 0))
142 ThrowReaderException(OptionError,"MustSpecifyImageSize");
143 image->colorspace=CMYKColorspace;
144 if (image_info->interlace != PartitionInterlace)
145 {
146 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
147 if (status == MagickFalse)
148 {
149 image=DestroyImageList(image);
150 return((Image *) NULL);
151 }
cristyd4297022010-09-16 22:59:09 +0000152 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
153 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
154 image->filename);
cristy3ed852e2009-09-05 21:47:34 +0000155 }
156 /*
157 Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
158 */
159 canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse,
160 exception);
161 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod);
162 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
163 if (quantum_info == (QuantumInfo *) NULL)
164 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
165 pixels=GetQuantumPixels(quantum_info);
166 quantum_type=CMYKQuantum;
167 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
168 {
169 quantum_type=CMYKAQuantum;
170 image->matte=MagickTrue;
171 }
172 if (image_info->number_scenes != 0)
173 while (image->scene < image_info->scene)
174 {
175 /*
176 Skip to next image.
177 */
178 image->scene++;
179 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
cristybb503372010-05-27 20:51:26 +0000180 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +0000181 {
182 count=ReadBlob(image,length,pixels);
183 if (count != (ssize_t) length)
184 break;
185 }
186 }
187 count=0;
188 length=0;
189 scene=0;
190 do
191 {
192 /*
193 Read pixels to virtual canvas image then push to image.
194 */
195 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
196 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
197 break;
198 image->colorspace=CMYKColorspace;
199 switch (image_info->interlace)
200 {
201 case NoInterlace:
202 default:
203 {
204 /*
205 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
206 */
207 if (scene == 0)
208 {
209 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
210 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000211 }
cristybb503372010-05-27 20:51:26 +0000212 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000213 {
cristy4c08aed2011-07-01 19:47:50 +0000214 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000215 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000216
cristy4c08aed2011-07-01 19:47:50 +0000217 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000218 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000219
cristy90dbac72010-08-22 15:08:40 +0000220 register ssize_t
221 x;
222
cristy21da32d2009-09-12 14:56:09 +0000223 if (count != (ssize_t) length)
224 {
225 ThrowFileException(exception,CorruptImageError,
226 "UnexpectedEndOfFile",image->filename);
227 break;
228 }
cristy3ed852e2009-09-05 21:47:34 +0000229 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
230 exception);
cristy4c08aed2011-07-01 19:47:50 +0000231 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000232 break;
233 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
234 quantum_info,quantum_type,pixels,exception);
235 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
236 break;
237 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000238 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000239 {
240 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
241 canvas_image->columns,1,exception);
242 q=QueueAuthenticPixels(image,0,y-image->extract_info.y,
243 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000244 if ((p == (const Quantum *) NULL) ||
245 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000246 break;
cristybb503372010-05-27 20:51:26 +0000247 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000248 {
cristy4c08aed2011-07-01 19:47:50 +0000249 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
250 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
251 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
252 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
253 SetPixelAlpha(image,OpaqueAlpha,q);
cristy3ed852e2009-09-05 21:47:34 +0000254 if (image->matte != MagickFalse)
cristy4c08aed2011-07-01 19:47:50 +0000255 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000256 p+=GetPixelChannels(canvas_image);
257 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000258 }
259 if (SyncAuthenticPixels(image,exception) == MagickFalse)
260 break;
261 }
262 if (image->previous == (Image *) NULL)
263 {
cristycee97112010-05-28 00:44:52 +0000264 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
265 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000266 if (status == MagickFalse)
267 break;
268 }
269 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000270 }
271 break;
272 }
273 case LineInterlace:
274 {
275 static QuantumType
276 quantum_types[5] =
277 {
278 CyanQuantum,
279 MagentaQuantum,
280 YellowQuantum,
281 BlackQuantum,
282 OpacityQuantum
283 };
284
285 /*
286 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
287 */
288 if (scene == 0)
289 {
290 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
291 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000292 }
cristybb503372010-05-27 20:51:26 +0000293 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000294 {
cristy4c08aed2011-07-01 19:47:50 +0000295 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000296 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000297
cristy4c08aed2011-07-01 19:47:50 +0000298 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000299 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000300
cristy90dbac72010-08-22 15:08:40 +0000301 register ssize_t
302 x;
303
cristy21da32d2009-09-12 14:56:09 +0000304 if (count != (ssize_t) length)
305 {
306 ThrowFileException(exception,CorruptImageError,
307 "UnexpectedEndOfFile",image->filename);
308 break;
309 }
cristy3ed852e2009-09-05 21:47:34 +0000310 for (i=0; i < (image->matte != MagickFalse ? 5 : 4); i++)
311 {
312 quantum_type=quantum_types[i];
313 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
314 exception);
cristy4c08aed2011-07-01 19:47:50 +0000315 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000316 break;
317 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
318 quantum_info,quantum_type,pixels,exception);
319 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
320 break;
321 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000322 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000323 {
324 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
325 0,canvas_image->columns,1,exception);
326 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
327 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000328 if ((p == (const Quantum *) NULL) ||
329 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000330 break;
cristybb503372010-05-27 20:51:26 +0000331 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000332 {
333 switch (quantum_type)
334 {
cristydd5f5912010-07-31 23:37:23 +0000335 case CyanQuantum:
336 {
cristy4c08aed2011-07-01 19:47:50 +0000337 SetPixelCyan(image,GetPixelCyan(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000338 break;
339 }
340 case MagentaQuantum:
341 {
cristy4c08aed2011-07-01 19:47:50 +0000342 SetPixelMagenta(image,GetPixelMagenta(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000343 break;
344 }
345 case YellowQuantum:
346 {
cristy4c08aed2011-07-01 19:47:50 +0000347 SetPixelYellow(image,GetPixelYellow(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000348 break;
349 }
350 case BlackQuantum:
351 {
cristy4c08aed2011-07-01 19:47:50 +0000352 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000353 break;
354 }
355 case OpacityQuantum:
356 {
cristy4c08aed2011-07-01 19:47:50 +0000357 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000358 break;
359 }
360 default:
361 break;
cristy3ed852e2009-09-05 21:47:34 +0000362 }
cristyed231572011-07-14 02:18:59 +0000363 p+=GetPixelChannels(canvas_image);
364 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000365 }
366 if (SyncAuthenticPixels(image,exception) == MagickFalse)
367 break;
368 }
369 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000370 }
371 if (image->previous == (Image *) NULL)
372 {
cristycee97112010-05-28 00:44:52 +0000373 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
374 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000375 if (status == MagickFalse)
376 break;
377 }
378 }
379 break;
380 }
381 case PlaneInterlace:
382 {
383 /*
384 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
385 */
386 if (scene == 0)
387 {
388 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
389 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000390 }
cristybb503372010-05-27 20:51:26 +0000391 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000392 {
cristy4c08aed2011-07-01 19:47:50 +0000393 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000394 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000395
cristy4c08aed2011-07-01 19:47:50 +0000396 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000397 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000398
cristy90dbac72010-08-22 15:08:40 +0000399 register ssize_t
400 x;
401
cristy21da32d2009-09-12 14:56:09 +0000402 if (count != (ssize_t) length)
403 {
404 ThrowFileException(exception,CorruptImageError,
405 "UnexpectedEndOfFile",image->filename);
406 break;
407 }
cristy3ed852e2009-09-05 21:47:34 +0000408 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
409 exception);
cristy4c08aed2011-07-01 19:47:50 +0000410 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000411 break;
412 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
413 quantum_info,CyanQuantum,pixels,exception);
414 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
415 break;
416 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000417 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000418 {
419 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
420 canvas_image->columns,1,exception);
421 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
422 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000423 if ((p == (const Quantum *) NULL) ||
424 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000425 break;
cristybb503372010-05-27 20:51:26 +0000426 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000427 {
cristy4c08aed2011-07-01 19:47:50 +0000428 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000429 p+=GetPixelChannels(canvas_image);
430 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000431 }
432 if (SyncAuthenticPixels(image,exception) == MagickFalse)
433 break;
434 }
435 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000436 }
437 if (image->previous == (Image *) NULL)
438 {
439 status=SetImageProgress(image,LoadImageTag,1,6);
440 if (status == MagickFalse)
441 break;
442 }
cristybb503372010-05-27 20:51:26 +0000443 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000444 {
cristy4c08aed2011-07-01 19:47:50 +0000445 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000446 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000447
cristy4c08aed2011-07-01 19:47:50 +0000448 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000449 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000450
cristy90dbac72010-08-22 15:08:40 +0000451 register ssize_t
452 x;
453
cristy21da32d2009-09-12 14:56:09 +0000454 if (count != (ssize_t) length)
455 {
456 ThrowFileException(exception,CorruptImageError,
457 "UnexpectedEndOfFile",image->filename);
458 break;
459 }
cristy3ed852e2009-09-05 21:47:34 +0000460 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
461 exception);
cristy4c08aed2011-07-01 19:47:50 +0000462 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000463 break;
464 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
465 quantum_info,MagentaQuantum,pixels,exception);
466 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
467 break;
468 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000469 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000470 {
471 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
472 canvas_image->columns,1,exception);
473 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
474 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000475 if ((p == (const Quantum *) NULL) ||
476 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000477 break;
cristybb503372010-05-27 20:51:26 +0000478 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000479 {
cristy4c08aed2011-07-01 19:47:50 +0000480 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000481 p+=GetPixelChannels(canvas_image);
482 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000483 }
484 if (SyncAuthenticPixels(image,exception) == MagickFalse)
485 break;
486 }
487 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000488 }
489 if (image->previous == (Image *) NULL)
490 {
491 status=SetImageProgress(image,LoadImageTag,2,6);
492 if (status == MagickFalse)
493 break;
494 }
cristybb503372010-05-27 20:51:26 +0000495 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000496 {
cristy4c08aed2011-07-01 19:47:50 +0000497 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000498 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000499
cristy4c08aed2011-07-01 19:47:50 +0000500 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000501 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000502
cristy90dbac72010-08-22 15:08:40 +0000503 register ssize_t
504 x;
505
cristy21da32d2009-09-12 14:56:09 +0000506 if (count != (ssize_t) length)
507 {
508 ThrowFileException(exception,CorruptImageError,
509 "UnexpectedEndOfFile",image->filename);
510 break;
511 }
cristy3ed852e2009-09-05 21:47:34 +0000512 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
513 exception);
cristy4c08aed2011-07-01 19:47:50 +0000514 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000515 break;
516 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
517 quantum_info,YellowQuantum,pixels,exception);
518 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
519 break;
520 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000521 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000522 {
523 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
524 canvas_image->columns,1,exception);
525 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
526 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000527 if ((p == (const Quantum *) NULL) ||
528 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000529 break;
cristybb503372010-05-27 20:51:26 +0000530 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000531 {
cristy4c08aed2011-07-01 19:47:50 +0000532 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000533 p+=GetPixelChannels(canvas_image);
534 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000535 }
536 if (SyncAuthenticPixels(image,exception) == MagickFalse)
537 break;
538 }
539 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000540 }
541 if (image->previous == (Image *) NULL)
542 {
543 status=SetImageProgress(image,LoadImageTag,3,6);
544 if (status == MagickFalse)
545 break;
546 }
cristybb503372010-05-27 20:51:26 +0000547 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000548 {
cristy4c08aed2011-07-01 19:47:50 +0000549 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000550 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000551
cristy4c08aed2011-07-01 19:47:50 +0000552 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000553 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000554
cristy90dbac72010-08-22 15:08:40 +0000555 register ssize_t
556 x;
557
cristy21da32d2009-09-12 14:56:09 +0000558 if (count != (ssize_t) length)
559 {
560 ThrowFileException(exception,CorruptImageError,
561 "UnexpectedEndOfFile",image->filename);
562 break;
563 }
cristy3ed852e2009-09-05 21:47:34 +0000564 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
565 exception);
cristy4c08aed2011-07-01 19:47:50 +0000566 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000567 break;
568 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
569 quantum_info,BlackQuantum,pixels,exception);
570 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
571 break;
572 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000573 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000574 {
575 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
576 canvas_image->columns,1,exception);
577 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
578 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000579 if ((p == (const Quantum *) NULL) ||
580 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000581 break;
cristybb503372010-05-27 20:51:26 +0000582 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000583 {
cristy4c08aed2011-07-01 19:47:50 +0000584 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000585 p+=GetPixelChannels(canvas_image);
586 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000587 }
588 if (SyncAuthenticPixels(image,exception) == MagickFalse)
589 break;
590 }
591 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000592 }
593 if (image->previous == (Image *) NULL)
594 {
595 status=SetImageProgress(image,LoadImageTag,4,6);
596 if (status == MagickFalse)
597 break;
598 }
599 if (image->matte != MagickFalse)
600 {
cristybb503372010-05-27 20:51:26 +0000601 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000602 {
cristy4c08aed2011-07-01 19:47:50 +0000603 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000604 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000605
cristy4c08aed2011-07-01 19:47:50 +0000606 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000607 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000608
cristy90dbac72010-08-22 15:08:40 +0000609 register ssize_t
610 x;
611
cristy21da32d2009-09-12 14:56:09 +0000612 if (count != (ssize_t) length)
613 {
614 ThrowFileException(exception,CorruptImageError,
615 "UnexpectedEndOfFile",image->filename);
616 break;
617 }
cristy3ed852e2009-09-05 21:47:34 +0000618 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
619 exception);
cristy4c08aed2011-07-01 19:47:50 +0000620 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000621 break;
622 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
623 quantum_info,AlphaQuantum,pixels,exception);
624 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
625 break;
626 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000627 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000628 {
629 p=GetVirtualPixels(canvas_image,
630 canvas_image->extract_info.x,0,canvas_image->columns,1,
631 exception);
632 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
633 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000634 if ((p == (const Quantum *) NULL) ||
635 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000636 break;
cristybb503372010-05-27 20:51:26 +0000637 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000638 {
cristy4c08aed2011-07-01 19:47:50 +0000639 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000640 p+=GetPixelChannels(canvas_image);
641 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000642 }
643 if (SyncAuthenticPixels(image,exception) == MagickFalse)
644 break;
645 }
646 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000647 }
648 if (image->previous == (Image *) NULL)
649 {
650 status=SetImageProgress(image,LoadImageTag,5,6);
651 if (status == MagickFalse)
652 break;
653 }
654 }
655 if (image->previous == (Image *) NULL)
656 {
657 status=SetImageProgress(image,LoadImageTag,6,6);
658 if (status == MagickFalse)
659 break;
660 }
661 break;
662 }
663 case PartitionInterlace:
664 {
665 /*
666 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
667 */
668 AppendImageFormat("C",image->filename);
669 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
670 if (status == MagickFalse)
671 {
672 canvas_image=DestroyImageList(canvas_image);
673 image=DestroyImageList(image);
674 return((Image *) NULL);
675 }
cristyd4297022010-09-16 22:59:09 +0000676 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
677 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
678 image->filename);
cristy3ed852e2009-09-05 21:47:34 +0000679 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
cristybb503372010-05-27 20:51:26 +0000680 for (i=0; i < (ssize_t) scene; i++)
681 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000682 if (ReadBlob(image,length,pixels) != (ssize_t) length)
683 {
684 ThrowFileException(exception,CorruptImageError,
685 "UnexpectedEndOfFile",image->filename);
686 break;
687 }
688 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000689 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000690 {
cristy4c08aed2011-07-01 19:47:50 +0000691 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000692 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000693
cristy4c08aed2011-07-01 19:47:50 +0000694 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000695 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000696
cristy90dbac72010-08-22 15:08:40 +0000697 register ssize_t
698 x;
699
cristy21da32d2009-09-12 14:56:09 +0000700 if (count != (ssize_t) length)
701 {
702 ThrowFileException(exception,CorruptImageError,
703 "UnexpectedEndOfFile",image->filename);
704 break;
705 }
cristy3ed852e2009-09-05 21:47:34 +0000706 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
707 exception);
cristy4c08aed2011-07-01 19:47:50 +0000708 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000709 break;
710 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
711 quantum_info,CyanQuantum,pixels,exception);
712 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
713 break;
714 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000715 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000716 {
717 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
718 canvas_image->columns,1,exception);
719 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
720 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000721 if ((p == (const Quantum *) NULL) ||
722 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000723 break;
cristybb503372010-05-27 20:51:26 +0000724 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000725 {
cristy4c08aed2011-07-01 19:47:50 +0000726 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000727 p+=GetPixelChannels(canvas_image);
728 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000729 }
730 if (SyncAuthenticPixels(image,exception) == MagickFalse)
731 break;
732 }
733 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000734 }
735 if (image->previous == (Image *) NULL)
736 {
737 status=SetImageProgress(image,LoadImageTag,1,5);
738 if (status == MagickFalse)
739 break;
740 }
741 (void) CloseBlob(image);
742 AppendImageFormat("M",image->filename);
743 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
744 if (status == MagickFalse)
745 {
746 canvas_image=DestroyImageList(canvas_image);
747 image=DestroyImageList(image);
748 return((Image *) NULL);
749 }
750 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
cristybb503372010-05-27 20:51:26 +0000751 for (i=0; i < (ssize_t) scene; i++)
752 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000753 if (ReadBlob(image,length,pixels) != (ssize_t) length)
754 {
755 ThrowFileException(exception,CorruptImageError,
756 "UnexpectedEndOfFile",image->filename);
757 break;
758 }
759 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000760 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000761 {
cristy4c08aed2011-07-01 19:47:50 +0000762 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000763 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000764
cristy4c08aed2011-07-01 19:47:50 +0000765 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000766 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000767
cristy90dbac72010-08-22 15:08:40 +0000768 register ssize_t
769 x;
770
cristy21da32d2009-09-12 14:56:09 +0000771 if (count != (ssize_t) length)
772 {
773 ThrowFileException(exception,CorruptImageError,
774 "UnexpectedEndOfFile",image->filename);
775 break;
776 }
cristy3ed852e2009-09-05 21:47:34 +0000777 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
778 exception);
cristy4c08aed2011-07-01 19:47:50 +0000779 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000780 break;
781 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
782 quantum_info,MagentaQuantum,pixels,exception);
783 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
784 break;
785 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000786 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000787 {
788 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
789 canvas_image->columns,1,exception);
790 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
791 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000792 if ((p == (const Quantum *) NULL) ||
793 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000794 break;
cristybb503372010-05-27 20:51:26 +0000795 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000796 {
cristy4c08aed2011-07-01 19:47:50 +0000797 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000798 p+=GetPixelChannels(canvas_image);
799 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000800 }
801 if (SyncAuthenticPixels(image,exception) == MagickFalse)
802 break;
803 }
804 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000805 }
806 if (image->previous == (Image *) NULL)
807 {
808 status=SetImageProgress(image,LoadImageTag,2,5);
809 if (status == MagickFalse)
810 break;
811 }
812 (void) CloseBlob(image);
813 AppendImageFormat("Y",image->filename);
814 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
815 if (status == MagickFalse)
816 {
817 canvas_image=DestroyImageList(canvas_image);
818 image=DestroyImageList(image);
819 return((Image *) NULL);
820 }
821 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
cristybb503372010-05-27 20:51:26 +0000822 for (i=0; i < (ssize_t) scene; i++)
823 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000824 if (ReadBlob(image,length,pixels) != (ssize_t) length)
825 {
826 ThrowFileException(exception,CorruptImageError,
827 "UnexpectedEndOfFile",image->filename);
828 break;
829 }
830 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000831 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000832 {
cristy4c08aed2011-07-01 19:47:50 +0000833 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000834 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000835
cristy4c08aed2011-07-01 19:47:50 +0000836 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000837 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000838
cristy90dbac72010-08-22 15:08:40 +0000839 register ssize_t
840 x;
841
cristy21da32d2009-09-12 14:56:09 +0000842 if (count != (ssize_t) length)
843 {
844 ThrowFileException(exception,CorruptImageError,
845 "UnexpectedEndOfFile",image->filename);
846 break;
847 }
cristy3ed852e2009-09-05 21:47:34 +0000848 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
849 exception);
cristy4c08aed2011-07-01 19:47:50 +0000850 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000851 break;
852 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
853 quantum_info,YellowQuantum,pixels,exception);
854 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
855 break;
856 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000857 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000858 {
859 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
860 canvas_image->columns,1,exception);
861 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
862 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000863 if ((p == (const Quantum *) NULL) ||
864 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000865 break;
cristybb503372010-05-27 20:51:26 +0000866 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000867 {
cristy4c08aed2011-07-01 19:47:50 +0000868 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000869 p+=GetPixelChannels(canvas_image);
870 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000871 }
872 if (SyncAuthenticPixels(image,exception) == MagickFalse)
873 break;
874 }
875 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000876 }
877 if (image->previous == (Image *) NULL)
878 {
879 status=SetImageProgress(image,LoadImageTag,3,5);
880 if (status == MagickFalse)
881 break;
882 }
883 (void) CloseBlob(image);
884 AppendImageFormat("K",image->filename);
885 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
886 if (status == MagickFalse)
887 {
888 canvas_image=DestroyImageList(canvas_image);
889 image=DestroyImageList(image);
890 return((Image *) NULL);
891 }
892 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
cristybb503372010-05-27 20:51:26 +0000893 for (i=0; i < (ssize_t) scene; i++)
894 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000895 if (ReadBlob(image,length,pixels) != (ssize_t) length)
896 {
897 ThrowFileException(exception,CorruptImageError,
898 "UnexpectedEndOfFile",image->filename);
899 break;
900 }
901 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000902 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000903 {
cristy4c08aed2011-07-01 19:47:50 +0000904 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000905 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000906
cristy4c08aed2011-07-01 19:47:50 +0000907 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000908 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000909
cristy90dbac72010-08-22 15:08:40 +0000910 register ssize_t
911 x;
912
cristy21da32d2009-09-12 14:56:09 +0000913 if (count != (ssize_t) length)
914 {
915 ThrowFileException(exception,CorruptImageError,
916 "UnexpectedEndOfFile",image->filename);
917 break;
918 }
cristy3ed852e2009-09-05 21:47:34 +0000919 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
920 exception);
cristy4c08aed2011-07-01 19:47:50 +0000921 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000922 break;
923 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
924 quantum_info,BlackQuantum,pixels,exception);
925 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
926 break;
927 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000928 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000929 {
930 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
931 canvas_image->columns,1,exception);
932 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
933 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000934 if ((p == (const Quantum *) NULL) ||
935 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000936 break;
cristybb503372010-05-27 20:51:26 +0000937 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000938 {
cristy4c08aed2011-07-01 19:47:50 +0000939 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000940 p+=GetPixelChannels(canvas_image);
941 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000942 }
943 if (SyncAuthenticPixels(image,exception) == MagickFalse)
944 break;
945 }
946 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000947 }
948 if (image->previous == (Image *) NULL)
949 {
950 status=SetImageProgress(image,LoadImageTag,3,5);
951 if (status == MagickFalse)
952 break;
953 }
954 if (image->matte != MagickFalse)
955 {
956 (void) CloseBlob(image);
957 AppendImageFormat("A",image->filename);
958 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
959 if (status == MagickFalse)
960 {
961 canvas_image=DestroyImageList(canvas_image);
962 image=DestroyImageList(image);
963 return((Image *) NULL);
964 }
965 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
cristybb503372010-05-27 20:51:26 +0000966 for (i=0; i < (ssize_t) scene; i++)
967 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000968 if (ReadBlob(image,length,pixels) != (ssize_t) length)
969 {
970 ThrowFileException(exception,CorruptImageError,
971 "UnexpectedEndOfFile",image->filename);
972 break;
973 }
974 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000975 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000976 {
cristy4c08aed2011-07-01 19:47:50 +0000977 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000978 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000979
cristy4c08aed2011-07-01 19:47:50 +0000980 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000981 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000982
cristy90dbac72010-08-22 15:08:40 +0000983 register ssize_t
984 x;
985
cristy21da32d2009-09-12 14:56:09 +0000986 if (count != (ssize_t) length)
987 {
988 ThrowFileException(exception,CorruptImageError,
989 "UnexpectedEndOfFile",image->filename);
990 break;
991 }
cristy3ed852e2009-09-05 21:47:34 +0000992 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
993 exception);
cristy4c08aed2011-07-01 19:47:50 +0000994 if (q == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000995 break;
996 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
997 quantum_info,YellowQuantum,pixels,exception);
998 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
999 break;
1000 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +00001001 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +00001002 {
1003 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1004 0,canvas_image->columns,1,exception);
1005 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1006 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001007 if ((p == (const Quantum *) NULL) ||
1008 (q == (const Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +00001009 break;
cristybb503372010-05-27 20:51:26 +00001010 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +00001011 {
cristy4c08aed2011-07-01 19:47:50 +00001012 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +00001013 p+=GetPixelChannels(canvas_image);
1014 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +00001015 }
1016 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1017 break;
1018 }
1019 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +00001020 }
1021 if (image->previous == (Image *) NULL)
1022 {
1023 status=SetImageProgress(image,LoadImageTag,4,5);
1024 if (status == MagickFalse)
1025 break;
1026 }
1027 }
1028 if (image->previous == (Image *) NULL)
1029 {
1030 status=SetImageProgress(image,LoadImageTag,5,5);
1031 if (status == MagickFalse)
1032 break;
1033 }
1034 break;
1035 }
1036 }
1037 SetQuantumImageType(image,quantum_type);
1038 /*
1039 Proceed to next image.
1040 */
1041 if (image_info->number_scenes != 0)
1042 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1043 break;
1044 if (count == (ssize_t) length)
1045 {
1046 /*
1047 Allocate next image structure.
1048 */
1049 AcquireNextImage(image_info,image);
1050 if (GetNextImageInList(image) == (Image *) NULL)
1051 {
1052 image=DestroyImageList(image);
1053 return((Image *) NULL);
1054 }
1055 image=SyncNextImageInList(image);
1056 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1057 GetBlobSize(image));
1058 if (status == MagickFalse)
1059 break;
1060 }
1061 scene++;
1062 } while (count == (ssize_t) length);
cristy3ed852e2009-09-05 21:47:34 +00001063 quantum_info=DestroyQuantumInfo(quantum_info);
cristy01a3f332009-10-27 14:17:37 +00001064 InheritException(&image->exception,&canvas_image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001065 canvas_image=DestroyImage(canvas_image);
1066 (void) CloseBlob(image);
1067 return(GetFirstImageInList(image));
1068}
1069
1070/*
1071%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1072% %
1073% %
1074% %
1075% R e g i s t e r C M Y K I m a g e %
1076% %
1077% %
1078% %
1079%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1080%
1081% RegisterCMYKImage() adds attributes for the CMYK image format to
1082% the list of supported formats. The attributes include the image format
1083% tag, a method to read and/or write the format, whether the format
1084% supports the saving of more than one frame to the same file or blob,
1085% whether the format supports native in-memory I/O, and a brief
1086% description of the format.
1087%
1088% The format of the RegisterCMYKImage method is:
1089%
cristybb503372010-05-27 20:51:26 +00001090% size_t RegisterCMYKImage(void)
cristy3ed852e2009-09-05 21:47:34 +00001091%
1092*/
cristybb503372010-05-27 20:51:26 +00001093ModuleExport size_t RegisterCMYKImage(void)
cristy3ed852e2009-09-05 21:47:34 +00001094{
1095 MagickInfo
1096 *entry;
1097
1098 entry=SetMagickInfo("CMYK");
1099 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1100 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1101 entry->raw=MagickTrue;
1102 entry->endian_support=MagickTrue;
cristy3ed852e2009-09-05 21:47:34 +00001103 entry->description=ConstantString("Raw cyan, magenta, yellow, and black "
1104 "samples");
1105 entry->module=ConstantString("CMYK");
1106 (void) RegisterMagickInfo(entry);
1107 entry=SetMagickInfo("CMYKA");
1108 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1109 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1110 entry->raw=MagickTrue;
1111 entry->endian_support=MagickTrue;
cristy3ed852e2009-09-05 21:47:34 +00001112 entry->description=ConstantString("Raw cyan, magenta, yellow, black, and "
1113 "alpha samples");
1114 entry->module=ConstantString("CMYK");
1115 (void) RegisterMagickInfo(entry);
1116 return(MagickImageCoderSignature);
1117}
1118
1119/*
1120%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1121% %
1122% %
1123% %
1124% U n r e g i s t e r C M Y K I m a g e %
1125% %
1126% %
1127% %
1128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1129%
1130% UnregisterCMYKImage() removes format registrations made by the
1131% CMYK module from the list of supported formats.
1132%
1133% The format of the UnregisterCMYKImage method is:
1134%
1135% UnregisterCMYKImage(void)
1136%
1137*/
1138ModuleExport void UnregisterCMYKImage(void)
1139{
1140 (void) UnregisterMagickInfo("CMYK");
1141 (void) UnregisterMagickInfo("CMYKA");
1142}
1143
1144/*
1145%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1146% %
1147% %
1148% %
1149% W r i t e C M Y K I m a g e %
1150% %
1151% %
1152% %
1153%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1154%
1155% WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and
1156% black,rasterfile format.
1157%
1158% The format of the WriteCMYKImage method is:
1159%
1160% MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1161% Image *image)
1162%
1163% A description of each parameter follows.
1164%
1165% o image_info: the image info.
1166%
1167% o image: The image.
1168%
1169*/
1170static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1171 Image *image)
1172{
cristy3ed852e2009-09-05 21:47:34 +00001173 MagickBooleanType
1174 status;
1175
1176 MagickOffsetType
1177 scene;
1178
1179 QuantumInfo
1180 *quantum_info;
1181
1182 QuantumType
1183 quantum_type;
1184
1185 ssize_t
cristy90dbac72010-08-22 15:08:40 +00001186 count,
1187 y;
cristy3ed852e2009-09-05 21:47:34 +00001188
1189 size_t
1190 length;
1191
1192 unsigned char
1193 *pixels;
1194
1195 /*
1196 Allocate memory for pixels.
1197 */
1198 assert(image_info != (const ImageInfo *) NULL);
1199 assert(image_info->signature == MagickSignature);
1200 assert(image != (Image *) NULL);
1201 assert(image->signature == MagickSignature);
1202 if (image->debug != MagickFalse)
1203 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1204 if (image_info->interlace != PartitionInterlace)
1205 {
1206 /*
1207 Open output image file.
1208 */
1209 status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
1210 if (status == MagickFalse)
1211 return(status);
1212 }
1213 quantum_type=CMYKQuantum;
1214 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1215 {
1216 quantum_type=CMYKAQuantum;
1217 image->matte=MagickTrue;
1218 }
1219 scene=0;
1220 do
1221 {
1222 /*
1223 Convert MIFF to CMYK raster pixels.
1224 */
1225 if (image->colorspace != CMYKColorspace)
1226 (void) TransformImageColorspace(image,CMYKColorspace);
1227 if ((LocaleCompare(image_info->magick,"CMYKA") == 0) &&
1228 (image->matte == MagickFalse))
cristy63240882011-08-05 19:05:27 +00001229 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001230 quantum_info=AcquireQuantumInfo(image_info,image);
1231 if (quantum_info == (QuantumInfo *) NULL)
1232 ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
1233 pixels=GetQuantumPixels(quantum_info);
1234 switch (image_info->interlace)
1235 {
1236 case NoInterlace:
1237 default:
1238 {
1239 /*
1240 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
1241 */
cristybb503372010-05-27 20:51:26 +00001242 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001243 {
cristy4c08aed2011-07-01 19:47:50 +00001244 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001245 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001246
1247 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001248 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001249 break;
cristy4c08aed2011-07-01 19:47:50 +00001250 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1251 quantum_type,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001252 count=WriteBlob(image,length,pixels);
1253 if (count != (ssize_t) length)
1254 break;
1255 if (image->previous == (Image *) NULL)
1256 {
cristycee97112010-05-28 00:44:52 +00001257 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1258 image->rows);
cristy3ed852e2009-09-05 21:47:34 +00001259 if (status == MagickFalse)
1260 break;
1261 }
1262 }
1263 break;
1264 }
1265 case LineInterlace:
1266 {
1267 /*
1268 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
1269 */
cristybb503372010-05-27 20:51:26 +00001270 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001271 {
cristy4c08aed2011-07-01 19:47:50 +00001272 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001273 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001274
1275 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001276 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001277 break;
cristy4c08aed2011-07-01 19:47:50 +00001278 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1279 CyanQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001280 count=WriteBlob(image,length,pixels);
1281 if (count != (ssize_t) length)
1282 break;
cristy4c08aed2011-07-01 19:47:50 +00001283 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1284 MagentaQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001285 count=WriteBlob(image,length,pixels);
1286 if (count != (ssize_t) length)
1287 break;
cristy4c08aed2011-07-01 19:47:50 +00001288 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1289 YellowQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001290 count=WriteBlob(image,length,pixels);
1291 if (count != (ssize_t) length)
1292 break;
cristy4c08aed2011-07-01 19:47:50 +00001293 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1294 BlackQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001295 count=WriteBlob(image,length,pixels);
1296 if (count != (ssize_t) length)
1297 break;
1298 if (quantum_type == CMYKAQuantum)
1299 {
cristy4c08aed2011-07-01 19:47:50 +00001300 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1301 AlphaQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001302 count=WriteBlob(image,length,pixels);
1303 if (count != (ssize_t) length)
1304 break;
1305 }
1306 if (image->previous == (Image *) NULL)
1307 {
cristycee97112010-05-28 00:44:52 +00001308 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1309 image->rows);
cristy3ed852e2009-09-05 21:47:34 +00001310 if (status == MagickFalse)
1311 break;
1312 }
1313 }
1314 break;
1315 }
1316 case PlaneInterlace:
1317 {
1318 /*
1319 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
1320 */
cristybb503372010-05-27 20:51:26 +00001321 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001322 {
cristy4c08aed2011-07-01 19:47:50 +00001323 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001324 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001325
1326 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001327 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001328 break;
cristy4c08aed2011-07-01 19:47:50 +00001329 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1330 CyanQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001331 count=WriteBlob(image,length,pixels);
1332 if (count != (ssize_t) length)
1333 break;
1334 }
1335 if (image->previous == (Image *) NULL)
1336 {
1337 status=SetImageProgress(image,SaveImageTag,1,6);
1338 if (status == MagickFalse)
1339 break;
1340 }
cristybb503372010-05-27 20:51:26 +00001341 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001342 {
cristy4c08aed2011-07-01 19:47:50 +00001343 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001344 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001345
1346 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001347 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001348 break;
cristy4c08aed2011-07-01 19:47:50 +00001349 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1350 MagentaQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001351 count=WriteBlob(image,length,pixels);
1352 if (count != (ssize_t) length)
1353 break;
1354 }
1355 if (image->previous == (Image *) NULL)
1356 {
1357 status=SetImageProgress(image,SaveImageTag,2,6);
1358 if (status == MagickFalse)
1359 break;
1360 }
cristybb503372010-05-27 20:51:26 +00001361 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001362 {
cristy4c08aed2011-07-01 19:47:50 +00001363 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001364 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001365
1366 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001367 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001368 break;
cristy4c08aed2011-07-01 19:47:50 +00001369 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1370 YellowQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001371 count=WriteBlob(image,length,pixels);
1372 if (count != (ssize_t) length)
1373 break;
1374 }
1375 if (image->previous == (Image *) NULL)
1376 {
1377 status=SetImageProgress(image,SaveImageTag,3,6);
1378 if (status == MagickFalse)
1379 break;
1380 }
cristybb503372010-05-27 20:51:26 +00001381 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001382 {
cristy4c08aed2011-07-01 19:47:50 +00001383 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001384 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001385
1386 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001387 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001388 break;
cristy4c08aed2011-07-01 19:47:50 +00001389 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1390 BlackQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001391 count=WriteBlob(image,length,pixels);
1392 if (count != (ssize_t) length)
1393 break;
1394 }
1395 if (image->previous == (Image *) NULL)
1396 {
1397 status=SetImageProgress(image,SaveImageTag,4,6);
1398 if (status == MagickFalse)
1399 break;
1400 }
1401 if (quantum_type == CMYKAQuantum)
1402 {
cristybb503372010-05-27 20:51:26 +00001403 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001404 {
cristy4c08aed2011-07-01 19:47:50 +00001405 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001406 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001407
cristy90dbac72010-08-22 15:08:40 +00001408 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001409 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001410 break;
cristy4c08aed2011-07-01 19:47:50 +00001411 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1412 AlphaQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001413 count=WriteBlob(image,length,pixels);
1414 if (count != (ssize_t) length)
1415 break;
1416 }
1417 if (image->previous == (Image *) NULL)
1418 {
1419 status=SetImageProgress(image,SaveImageTag,5,6);
1420 if (status == MagickFalse)
1421 break;
1422 }
1423 }
1424 if (image_info->interlace == PartitionInterlace)
1425 (void) CopyMagickString(image->filename,image_info->filename,
1426 MaxTextExtent);
1427 if (image->previous == (Image *) NULL)
1428 {
1429 status=SetImageProgress(image,SaveImageTag,6,6);
1430 if (status == MagickFalse)
1431 break;
1432 }
1433 break;
1434 }
1435 case PartitionInterlace:
1436 {
1437 /*
1438 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
1439 */
1440 AppendImageFormat("C",image->filename);
1441 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1442 AppendBinaryBlobMode,&image->exception);
1443 if (status == MagickFalse)
1444 return(status);
cristybb503372010-05-27 20:51:26 +00001445 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001446 {
cristy4c08aed2011-07-01 19:47:50 +00001447 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001448 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001449
1450 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001451 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001452 break;
cristy4c08aed2011-07-01 19:47:50 +00001453 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1454 CyanQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001455 count=WriteBlob(image,length,pixels);
1456 if (count != (ssize_t) length)
1457 break;
1458 }
1459 if (image->previous == (Image *) NULL)
1460 {
1461 status=SetImageProgress(image,SaveImageTag,1,6);
1462 if (status == MagickFalse)
1463 break;
1464 }
1465 (void) CloseBlob(image);
1466 AppendImageFormat("M",image->filename);
1467 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1468 AppendBinaryBlobMode,&image->exception);
1469 if (status == MagickFalse)
1470 return(status);
cristybb503372010-05-27 20:51:26 +00001471 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001472 {
cristy4c08aed2011-07-01 19:47:50 +00001473 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001474 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001475
1476 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001477 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001478 break;
cristy4c08aed2011-07-01 19:47:50 +00001479 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1480 MagentaQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001481 count=WriteBlob(image,length,pixels);
1482 if (count != (ssize_t) length)
1483 break;
1484 }
1485 if (image->previous == (Image *) NULL)
1486 {
1487 status=SetImageProgress(image,SaveImageTag,2,6);
1488 if (status == MagickFalse)
1489 break;
1490 }
1491 (void) CloseBlob(image);
1492 AppendImageFormat("Y",image->filename);
1493 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1494 AppendBinaryBlobMode,&image->exception);
1495 if (status == MagickFalse)
1496 return(status);
cristybb503372010-05-27 20:51:26 +00001497 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001498 {
cristy4c08aed2011-07-01 19:47:50 +00001499 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001500 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001501
1502 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001503 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001504 break;
cristy4c08aed2011-07-01 19:47:50 +00001505 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1506 YellowQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001507 count=WriteBlob(image,length,pixels);
1508 if (count != (ssize_t) length)
1509 break;
1510 }
1511 if (image->previous == (Image *) NULL)
1512 {
1513 status=SetImageProgress(image,SaveImageTag,3,6);
1514 if (status == MagickFalse)
1515 break;
1516 }
1517 (void) CloseBlob(image);
1518 AppendImageFormat("K",image->filename);
1519 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1520 AppendBinaryBlobMode,&image->exception);
1521 if (status == MagickFalse)
1522 return(status);
cristybb503372010-05-27 20:51:26 +00001523 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001524 {
cristy4c08aed2011-07-01 19:47:50 +00001525 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001526 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001527
1528 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001529 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001530 break;
cristy4c08aed2011-07-01 19:47:50 +00001531 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1532 BlackQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001533 count=WriteBlob(image,length,pixels);
1534 if (count != (ssize_t) length)
1535 break;
1536 }
1537 if (image->previous == (Image *) NULL)
1538 {
1539 status=SetImageProgress(image,SaveImageTag,4,6);
1540 if (status == MagickFalse)
1541 break;
1542 }
1543 if (quantum_type == CMYKAQuantum)
1544 {
1545 (void) CloseBlob(image);
1546 AppendImageFormat("A",image->filename);
1547 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1548 AppendBinaryBlobMode,&image->exception);
1549 if (status == MagickFalse)
1550 return(status);
cristybb503372010-05-27 20:51:26 +00001551 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001552 {
cristy4c08aed2011-07-01 19:47:50 +00001553 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +00001554 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001555
1556 p=GetVirtualPixels(image,0,y,image->columns,1,
1557 &image->exception);
cristy4c08aed2011-07-01 19:47:50 +00001558 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001559 break;
cristy4c08aed2011-07-01 19:47:50 +00001560 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1561 AlphaQuantum,pixels,&image->exception);
cristy3ed852e2009-09-05 21:47:34 +00001562 count=WriteBlob(image,length,pixels);
1563 if (count != (ssize_t) length)
1564 break;
1565 }
1566 if (image->previous == (Image *) NULL)
1567 {
1568 status=SetImageProgress(image,SaveImageTag,5,6);
1569 if (status == MagickFalse)
1570 break;
1571 }
1572 }
1573 (void) CloseBlob(image);
1574 (void) CopyMagickString(image->filename,image_info->filename,
1575 MaxTextExtent);
1576 if (image->previous == (Image *) NULL)
1577 {
1578 status=SetImageProgress(image,SaveImageTag,6,6);
1579 if (status == MagickFalse)
1580 break;
1581 }
1582 break;
1583 }
1584 }
1585 quantum_info=DestroyQuantumInfo(quantum_info);
1586 if (GetNextImageInList(image) == (Image *) NULL)
1587 break;
1588 image=SyncNextImageInList(image);
1589 status=SetImageProgress(image,SaveImagesTag,scene++,
1590 GetImageListLength(image));
1591 if (status == MagickFalse)
1592 break;
1593 } while (image_info->adjoin != MagickFalse);
1594 (void) CloseBlob(image);
1595 return(MagickTrue);
1596}